《动手学深度学习(PyTorch版)》笔记4.9

Chapter4 Multilayer Perceptron

4.9 Environment and Distribution Shift

4.9.1 Types of Distribution Shift

在一个经典的情景中,假设训练数据是从某个分布 p S ( x , y ) p_S(\mathbf{x},y) pS(x,y)中采样的,但是测试数据将包含从不同分布 p T ( x , y ) p_T(\mathbf{x},y) pT(x,y)中抽取的未标记样本。如果没有任何关于 p S p_S pS p T p_T pT之间相互关系的假设,学习到一个分类器是不可能的。

4.9.1.1 Covariate Shift

在不同分布偏移中,协变量偏移(covariate shift)可能是最为广泛研究的。这里我们假设:虽然输入的分布可能随时间而改变,但标签函数(即条件分布 P ( y ∣ x ) P(y \mid \mathbf{x}) P(yx))没有改变。这个问题是由于协变量(特征)分布的变化而产生的。虽然有时我们可以在不引用因果关系的情况下对分布偏移进行推断,但在我们认为 x \mathbf{x} x导致 y y y的情况下,协变量偏移是一种自然假设。假设在一个与测试集的特征有着本质不同的数据集上进行训练,如果没有方法来适应新的领域,可能会有麻烦。

4.9.1.2 Label Shift

标签偏移(label shift)指的是在目标域中的标签分布与源域中的标签分布存在差异的情况。这里我们假设标签边缘概率 P ( y ) P(y) P(y)可以改变,但是类别条件分布 P ( x ∣ y ) P(\mathbf{x} \mid y) P(xy)在不同的领域之间保持不变。当我们认为 y y y导致 x \mathbf{x} x时,标签偏移是一个合理的假设。
在一些情况下,标签偏移和协变量偏移假设可以同时成立。例如,当标签是确定的,即使 y y y导致 x \mathbf{x} x,协变量偏移假设也会得到满足。在这些情况下,使用基于标签偏移假设的方法通常是有利的,因为这些方法倾向于包含看起来像标签(通常是低维)的对象,而不是像输入(通常是高维的)对象。

4.9.1.3 Concept Shift

当标签的定义发生变化时,可能会遇到概念偏移(concept shift),例如我们要建立一个机器翻译系统, P ( y ∣ x ) P(y \mid \mathbf{x}) P(yx)的分布可能会因我们的位置不同而得到不同的翻译。

4.9.2 Distribution Shift Correction

4.9.2.1 Empirical Risk and True Risk

训练数据 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}的特征和相关的标签经过迭代,在每一个小批量之后更新模型 f f f的参数。为了简单起见,我们不考虑正则化,因此极大地降低了训练损失:

m i n i m i z e f 1 n ∑ i = 1 n l ( f ( x i ) , y i ) , \mathop{\mathrm{minimize}}_f \frac{1}{n} \sum_{i=1}^n l(f(\mathbf{x}_i), y_i), minimizefn1i=1nl(f(xi),yi),

其中 l l l是损失函数,称 1 n ∑ i = 1 n l ( f ( x i ) , y i ) \frac{1}{n} \sum_{i=1}^n l(f(\mathbf{x}_i), y_i) n1i=1nl(f(xi),yi)经验风险(empirical risk)。经验风险是为了近似 真实风险(true risk),即从其真实分布 p ( x , y ) p(\mathbf{x},y) p(x,y)中抽取的所有数据的总体损失的期望值:

E p ( x , y ) [ l ( f ( x ) , y ) ] = ∫ ∫ l ( f ( x ) , y ) p ( x , y ) d x d y . E_{p(\mathbf{x}, y)} [l(f(\mathbf{x}), y)] = \int\int l(f(\mathbf{x}), y) p(\mathbf{x}, y) \;d\mathbf{x}dy. Ep(x,y)[l(f(x),y)]=∫∫l(f(x),y)p(x,y)dxdy.

然而在实践中,我们通常无法获得总体数据,因此只需最小化经验风险,希望能近似最小化真实风险。

4.9.2.2 Covariate Shift Correction

假设对于带标签的数据 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi),我们要评估 P ( y ∣ x ) P(y \mid \mathbf{x}) P(yx)。然而观测值 x i \mathbf{x}_i xi是从某些源分布 q ( x ) q(\mathbf{x}) q(x)中得出的,而不是从目标分布 p ( x ) p(\mathbf{x}) p(x)中得出的。幸运的是,依赖性假设(如独立同分布假设)意味着条件分布保持不变,即: p ( y ∣ x ) = q ( y ∣ x ) p(y \mid \mathbf{x}) = q(y \mid \mathbf{x}) p(yx)=q(yx)。如果源分布 q ( x ) q(\mathbf{x}) q(x)是“错误的”,我们可以通过在真实风险的计算中,使用以下恒等式来进行纠正:

∫ ∫ l ( f ( x ) , y ) p ( y ∣ x ) p ( x ) d x d y = ∫ ∫ l ( f ( x ) , y ) q ( y ∣ x ) q ( x ) p ( x ) q ( x ) d x d y . \begin{aligned} \int\int l(f(\mathbf{x}), y) p(y \mid \mathbf{x})p(\mathbf{x}) \;d\mathbf{x}dy = \int\int l(f(\mathbf{x}), y) q(y \mid \mathbf{x})q(\mathbf{x})\frac{p(\mathbf{x})}{q(\mathbf{x})} \;d\mathbf{x}dy. \end{aligned} ∫∫l(f(x),y)p(yx)p(x)dxdy=∫∫l(f(x),y)q(yx)q(x)q(x)p(x)dxdy.

换句话说,我们需要根据数据来自正确分布与来自错误分布的概率之比来重新衡量每个数据样本的权重:

β i = d e f p ( x i ) q ( x i ) . \beta_i \stackrel{\mathrm{def}}{=} \frac{p(\mathbf{x}_i)}{q(\mathbf{x}_i)}. βi=defq(xi)p(xi).

将权重 β i \beta_i βi代入到每个数据样本 ( x i , y i ) (\mathbf{x}_i, y_i) (xi,yi)中,我们可以使用”加权经验风险最小化“来训练模型:

m i n i m i z e f 1 n ∑ i = 1 n β i l ( f ( x i ) , y i ) . \mathop{\mathrm{minimize}}_f \frac{1}{n} \sum_{i=1}^n \beta_i l(f(\mathbf{x}_i), y_i). minimizefn1i=1nβil(f(xi),yi).

由于不知道这个比率,我们需要估计它。对于任意一种估计的方法,我们都需要从两个分布中抽取样本:“真实”的分布 p p p,通过访问测试数据获取;训练集 q q q,通过人工合成的很容易获得。请注意,我们只需要特征 x ∼ p ( x ) \mathbf{x} \sim p(\mathbf{x}) xp(x),不需要访问标签 y ∼ p ( y ) y \sim p(y) yp(y)。在这种情况下,对数几率回归(logistic regression)可以得到几乎与原始方法一样好的结果,这是用于二元分类的softmax回归的一个特例。Logistic regression指将线性组合的结果通过sigmoid 函数(也叫logistic函数)映射到一个介于0和1之间的概率值。为了简单起见,假设我们分别从 p ( x ) p(\mathbf{x}) p(x) q ( x ) q(\mathbf{x}) q(x)两个分布中抽取相同数量的样本。现在用 z z z标签表示:从 p p p抽取的数据为 1 1 1,从 q q q抽取的数据为 − 1 -1 1。混合数据集中的概率由下式给出

P ( z = 1 ∣ x ) = p ( x ) p ( x ) + q ( x ) and hence  P ( z = 1 ∣ x ) P ( z = − 1 ∣ x ) = p ( x ) q ( x ) . P(z=1 \mid \mathbf{x}) = \frac{p(\mathbf{x})}{p(\mathbf{x})+q(\mathbf{x})} \text{ and hence } \frac{P(z=1 \mid \mathbf{x})}{P(z=-1 \mid \mathbf{x})} = \frac{p(\mathbf{x})}{q(\mathbf{x})}. P(z=1x)=p(x)+q(x)p(x) and hence P(z=1x)P(z=1x)=q(x)p(x).

因此,如果我们使用logistic regression,其中 P ( z = 1 ∣ x ) = 1 1 + exp ⁡ ( − h ( x ) ) P(z=1 \mid \mathbf{x})=\frac{1}{1+\exp(-h(\mathbf{x}))} P(z=1x)=1+exp(h(x))1 h h h是一个参数化函数),则很自然有:

β i = 1 / ( 1 + exp ⁡ ( − h ( x i ) ) ) exp ⁡ ( − h ( x i ) ) / ( 1 + exp ⁡ ( − h ( x i ) ) ) = exp ⁡ ( h ( x i ) ) . \beta_i = \frac{1/(1 + \exp(-h(\mathbf{x}_i)))}{\exp(-h(\mathbf{x}_i))/(1 + \exp(-h(\mathbf{x}_i)))} = \exp(h(\mathbf{x}_i)). βi=exp(h(xi))/(1+exp(h(xi)))1/(1+exp(h(xi)))=exp(h(xi)).

总结一下,假设有一个训练集 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}和一个未标记的测试集 { u 1 , … , u m } \{\mathbf{u}_1, \ldots, \mathbf{u}_m\} {u1,,um},对于协变量偏移,假设 1 ≤ i ≤ n 1 \leq i \leq n 1in x i \mathbf{x}_i xi来自某个源分布, u i \mathbf{u}_i ui来自目标分布,以下是纠正协变量偏移的典型算法:

  1. 生成一个二元分类训练集: { ( x 1 , − 1 ) , … , ( x n , − 1 ) , ( u 1 , 1 ) , … , ( u m , 1 ) } \{(\mathbf{x}_1, -1), \ldots, (\mathbf{x}_n, -1), (\mathbf{u}_1, 1), \ldots, (\mathbf{u}_m, 1)\} {(x1,1),,(xn,1),(u1,1),,(um,1)}
  2. 用logistic regression训练二元分类器得到函数 h h h
  3. 使用 β i = exp ⁡ ( h ( x i ) ) \beta_i = \exp(h(\mathbf{x}_i)) βi=exp(h(xi))或更好的 β i = min ⁡ ( exp ⁡ ( h ( x i ) ) , c ) \beta_i = \min(\exp(h(\mathbf{x}_i)), c) βi=min(exp(h(xi)),c) c c c为常量)对训练数据进行加权。
  4. 使用权重 β i \beta_i βi进行对 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)}的训练。

请注意,上述算法依赖于一个重要的假设:需要目标分布(例如,测试分布)中的每个数据样本在训练时出现的概率非零。如果我们找到 p ( x ) > 0 p(\mathbf{x}) > 0 p(x)>0 q ( x ) = 0 q(\mathbf{x}) = 0 q(x)=0的点,那么相应的重要性权重会是无穷大。

4.9.2.3 Label Shift Correction

假设我们处理的是 k k k个类别的分类任务。使用和上述相同符号, q q q p p p中分别是源分布(例如训练时的分布)和目标分布(例如测试时的分布)。假设标签的分布随时间变化: q ( y ) ≠ p ( y ) q(y) \neq p(y) q(y)=p(y),但类别条件分布保持不变: q ( x ∣ y ) = p ( x ∣ y ) q(\mathbf{x} \mid y)=p(\mathbf{x} \mid y) q(xy)=p(xy)。如果源分布 q ( y ) q(y) q(y)是“错误的”,
我们可以用下面的恒等式进行修正:

∫ ∫ l ( f ( x ) , y ) p ( x ∣ y ) p ( y ) d x d y = ∫ ∫ l ( f ( x ) , y ) q ( x ∣ y ) q ( y ) p ( y ) q ( y ) d x d y . \begin{aligned} \int\int l(f(\mathbf{x}), y) p(\mathbf{x} \mid y)p(y) \;d\mathbf{x}dy = \int\int l(f(\mathbf{x}), y) q(\mathbf{x} \mid y)q(y)\frac{p(y)}{q(y)} \;d\mathbf{x}dy. \end{aligned} ∫∫l(f(x),y)p(xy)p(y)dxdy=∫∫l(f(x),y)q(xy)q(y)q(y)p(y)dxdy.

这里,重要性权重将对应于标签似然比率

β i = d e f p ( y i ) q ( y i ) . \beta_i \stackrel{\mathrm{def}}{=} \frac{p(y_i)}{q(y_i)}. βi=defq(yi)p(yi).

标签偏移的一个好处是,如果我们在源分布上有一个相当好的模型,那么我们可以得到对这些权重的一致估计,而不需要处理周边的其他维度。在深度学习中,输入往往是高维对象(如图像),而标签通常是低维(如类别)。

为了估计目标标签分布,我们首先采用现成的分类器(通常基于训练数据进行训练),并使用验证集(也来自训练分布)计算其混淆矩阵。混淆矩阵 C \mathbf{C} C是一个 k × k k \times k k×k矩阵,其中每列对应于标签类别,每行对应于模型的预测类别,每个单元格的值 c i j c_{ij} cij是验证集中,真实标签为 j j j,而我们的模型预测为 i i i的样本数量所占的比例。

现在,我们不能直接计算目标数据上的混淆矩阵,因为我们无法看到真实环境下的样本的标签,我们所能做的是将所有模型在测试时的预测取平均数,得到平均模型输出 μ ( y ^ ) ∈ R k \mu(\hat{\mathbf{y}}) \in \mathbb{R}^k μ(y^)Rk,其中第 i i i个元素 μ ( y ^ i ) \mu(\hat{y}_i) μ(y^i)是我们模型预测测试集中 i i i的总预测分数。

结果表明,如果我们的分类器一开始就相当准确,并且目标数据只包含我们以前见过的类别,以及如果标签偏移假设成立(这里最强的假设),我们就可以通过求解一个简单的线性系统来估计测试集的标签分布

C p ( y ) = μ ( y ^ ) , \mathbf{C} p(\mathbf{y}) = \mu(\hat{\mathbf{y}}), Cp(y)=μ(y^),

因为作为一个估计, ∑ j = 1 k c i j p ( y j ) = μ ( y ^ i ) \sum_{j=1}^k c_{ij} p(y_j) = \mu(\hat{y}_i) j=1kcijp(yj)=μ(y^i)对所有 1 ≤ i ≤ k 1 \leq i \leq k 1ik成立,其中 p ( y j ) p(y_j) p(yj) k k k维标签分布向量 p ( y ) p(\mathbf{y}) p(y)的第 j t h j^\mathrm{th} jth元素。如果我们的分类器一开始就足够精确,那么混淆矩阵 C \mathbf{C} C将是可逆的,进而我们可以得到一个解 p ( y ) = C − 1 μ ( y ^ ) p(\mathbf{y}) = \mathbf{C}^{-1} \mu(\hat{\mathbf{y}}) p(y)=C1μ(y^)

因为我们观测源数据上的标签,所以很容易估计分布 q ( y ) q(y) q(y)。那么对于标签为 y i y_i yi的任何训练样本 i i i,我们可以使用我们估计的 p ( y i ) / q ( y i ) p(y_i)/q(y_i) p(yi)/q(yi)比率来计算权重 β i \beta_i βi,并将其代入加权经验风险最小化中。

4.9.2.4 Concept Shift Correction

概念偏移很难用原则性的方式解决,但通常情况下概念的变化总是缓慢的,我们可以使用新数据更新现有的网络权重,使其适应数据的变化。

4.9.3 Classification of Learning Problems

4.9.3.1 Batch Learning

批量学习(batch learning)中,我们可以访问一组训练特征和标签 { ( x 1 , y 1 ) , … , ( x n , y n ) } \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_n, y_n)\} {(x1,y1),,(xn,yn)},并使用这些特性和标签训练 f ( x ) f(\mathbf{x}) f(x),然后部署此模型,对来自同一分布的新数据 ( x , y ) (\mathbf{x}, y) (x,y)进行评分。例如,我们可以根据猫和狗的大量图片训练猫检测器。

4.9.3.2 Online Learning

首先观测 x i \mathbf{x}_i xi,得出一个估计值 f ( x i ) f(\mathbf{x}_i) f(xi),只有当我们做到这一点后,才能观测到 y i y_i yi,然后我们会根据我们的决定得到奖励或损失。例如,我们需要预测明天的股票价格,这样我们就可以根据这个预测进行交易。在一天结束时,我们会评估我们的预测是否盈利。换句话说,在在线学习(online learning)中,我们有以下的循环:

m o d e l f t ⟶ d a t a x t ⟶ e s t i m a t e f t ( x t ) ⟶ o b s e r v a t i o n y t ⟶ l o s s l ( y t , f t ( x t ) ) ⟶ m o d e l f t + 1 \mathrm{model} ~ f_t \longrightarrow \mathrm{data} ~ \mathbf{x}_t \longrightarrow \mathrm{estimate} ~ f_t(\mathbf{x}_t) \longrightarrow \mathrm{observation} ~ y_t \longrightarrow \mathrm{loss} ~ l(y_t, f_t(\mathbf{x}_t)) \longrightarrow \mathrm{model} ~ f_{t+1} model ftdata xtestimate ft(xt)observation ytloss l(yt,ft(xt))model ft+1

4.9.3.3 Reinforcement Learning(略)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 字符串相关题目

344. 反转字符串 - 力扣(LeetCode) 题解:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 541. 反转字符串 II - 力扣(LeetCode) 题解:https://leetcode.cn/problems/reverse-s…

Linux cat,tac,more,head,tail命令 查看文本

目录 一. cat 和 tac命令二. head 和 tail 命令三. more命令 一. cat 和 tac命令 cat:用来打开文本文件,从上到下的顺序显示文件内容。tac:用法和cat相同,只不过是从下到上逆序的方式显示文件内容。当文件的内容有很多的时候&…

《Python 简易速速上手小册》第6章:Python 文件和数据持久化(基于最新版 Python3.12 编写)

注意&#xff1a;本《Python 简易速速上手小册》 核心目的在于让零基础新手「快速构建 Python 知识体系」 文章目录 <mark >注意&#xff1a;本《Python 简易速速上手小册》<mark >核心目的在于让零基础新手「快速构建 Python 知识体系」 6.1 文件读写操作6.1.1 打…

【leetcode100-069到073】【栈】五题合集

【有效括号】 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的…

【Image captioning】论文阅读八—ClipCap: CLIP Prefix for Image Captioning_2021

中文标题&#xff1a;ClipCap: CLIP前缀用于图像描述&#xff08;ClipCap: CLIP Prefix for Image Captioning&#xff09; 文章目录 1. 介绍2. 相关工作3. 方法3.1 综述3.2 语言模型微调3.3 映射网络架构3.4 推理 4. 结果5. 结论 摘要&#xff1a;图像描述是视觉语言理解中的…

函数入门.

函数入门 1. 初识函数2. 函数的参数2.1 参数2.2 默认参数2.3 动态参数 3. 函数返回值总结作业 1. 初识函数 函数到底是个什么东西&#xff1f; 函数&#xff0c;可以当做是一大堆功能代码的集合。 def 函数名():函数内编写代码......函数名()例如&#xff1a; # 定义名字叫in…

【Axure高保真原型】可视化环形图

今天和大家可视化环形图的原型模板&#xff0c;&#xff0c;包括4种效果&#xff0c;移入变色在环形中部显示数据、移入变色在标签弹窗显示数据、移入放大在环形中部显示数据、移入放大在标签弹窗显示数据。这个原型是用Axure原生元件制作的&#xff0c;所以不需要联网或者调用…

项目中从需求分析到研发上线

一、背景 应用系统从设想到需求到研发到上线会经历一些列工程化过程。比如经典的瀑布模型工作流&#xff0c;其实就是一个经过很多经验总结下来的工程方法。本节阐述项目中从需求到研发上线的过程。但是也有些根据不同的行业&#xff0c;不同的公司&#xff0c;不同管理者的风…

Spring Boot使用AOP

一、为什么需要面向切面编程&#xff1f; 面向对象编程&#xff08;OOP&#xff09;的好处是显而易见的&#xff0c;缺点也同样明显。当需要为多个不具有继承关系的对象添加一个公共的方法的时候&#xff0c;例如日志记录、性能监控等&#xff0c;如果采用面向对象编程的方法&…

XMLHttpRequestUpload 对象

一、基本概念 XMLHttpRequestUpload 对象表示一个 XMLHttpRequest 的上传进程。它是 XMLHttpRequest 的一个属性&#xff0c;可以用来监视上传的进度。 XMLHttpRequestUpload 对象有一些事件监听器&#xff0c;可以用来处理上传过程中的各种事件&#xff1a; loadstart&#…

记录浏览器能打开github.com,android studio无法拉取github项目,并且ping github.com也拼不通的问题

问题&#xff1a; Android studio编译flutter工程突然碰上如下问题&#xff1a; 在浏览器打开该地址能正常打开&#xff0c;尝试ping&#xff1a; 解决方式 通过搜索&#xff0c;查到如下办法&#xff1a; 1、首先在ipaddress.com中查询github.com域名的固定ip地址&#xff…

LLM之RAG实战(二十一)| 使用LlamaIndex的Text2SQL和RAG的功能分析产品评论

亚马逊和沃尔玛等电子商务平台上每天都有大量的产品评论&#xff0c;这些评论是反映消费者对产品情绪的关键接触点。但是&#xff0c;企业如何从庞大的数据库获得有意义的见解&#xff1f; 我们可以使用LlamaIndex将SQL与RAG&#xff08;Retrieval Augmented Generation&#x…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态&#xff1a; channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…

【vue3源码】vue源码探索之旅:项目介绍

简言 记录下我眼中的vue源码项目。 gitHubvue3项目仓库 项目要求: vue版本 3.4.15nodeV18.12.0以上使用pnpm包管理器vitest测试框架Vue3 vue3是渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 Vue 是一个框架,也是一个生态。其功能覆盖了大部分…

QGIS编译(跨平台编译)之二十六:giflib编译(Windows、Linux、MacOS环境下编译)

文章目录 1、giflib介绍2、giflib下载3、Windows下编译4、Linux下编译5、MacOS下编译1、giflib介绍 giflib(又称为Libgif)是一个开源的C语言库,用于处理GIF图像格式。它提供了一组函数和工具,使得开发者可以读取、写入和操作GIF图像文件。 GIFlib支持GIF87a和GIF89a两种版…

Transformer模型 | Pytorch实现Transformer模型进行时间序列预测

Transformer模型最初是为了处理自然语言处理任务而设计的,但它也可以用于时间序列预测。下面是将Transformer模型应用于时间序列预测的一般步骤: 数据准备:准备时间序列数据集,包括历史观测值和目标预测值。通常,你需要将时间序列转换为固定长度的滑动窗口序列,以便输入…

计算机网络之广播风暴

广播风暴&#xff08;Broadcast Storm&#xff09;是指在计算机网络中出现大量广播帧的现象&#xff0c;这通常会导致网络性能下降&#xff0c;甚至整个网络瘫痪。在一个广播风暴中&#xff0c;网络上的每个设备都会接收并处理这些广播帧&#xff0c;这会消耗大量的带宽和处理能…

解决 github.com port 443: Timed out 的问题

国内访问github.com总是那么不竟如人意&#xff0c;时而无法加载网页&#xff0c;时而等我们抽完了一根烟后&#xff0c;它还处于转圈的状态。 虽然国内有gitee.com等诸多的代码托管平台&#xff0c;但却鲜有国人愿意去呢&#xff1f;其中的缘由&#xff0c;想必也不用我多说&a…

openssl3.2 - 测试程序的学习 - test\aesgcmtest.c

文章目录 openssl3.2 - 测试程序的学习 - test\aesgcmtest.c概述笔记能学到的流程性内容END openssl3.2 - 测试程序的学习 - test\aesgcmtest.c 概述 openssl3.2 - 测试程序的学习 aesgcmtest.c 工程搭建时, 发现没有提供 test_get_options(), cleanup_tests(), 需要自己补上…

Strassen矩阵乘法的C语言算法实现

矩阵乘法是高等代数中的重要基本运算&#xff0c;本文将介绍Strassen矩阵乘法的基本原理和用C语言进行算法实现的过程。 1. 一般矩阵乘法 首先&#xff0c;我们来看一下一般矩阵乘法的计算过程。 矩阵 A [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n … … … … a n 1 a n 2 …