#机器学习

可能是一些深度学习的trick

是的我是深度学习笨蛋

通用

权重初始化

在初始化权重的值时不可将权重初始化为相同的常数。如果同一层所有神经元的初始权重相同,它们在计算前向传播时将输出相同的值,在反向传播时将获得完全相同的梯度更新。导致无论训练多久学到的特征都是一样的。这被称为对称性破缺失败(Symmetry Breaking Problem),故权重必须引入随机性。
但如果直接引入像是标准正态分布这样的随机初始化后,如果网络很深,会面临梯度消失或梯度爆炸。这个时候!Xavier和Kaiming出现了!
首先解释为什么正态分布会导致梯度爆炸/消失:
假设第l层的某个输出神经元为y,它由前一层的n个输入神经元xix_i与权重wiw_i线性组合而成(此处忽略偏置和激活函数):

y=i=1nwixiy = \sum_{i=1}^{n} w_i x_i

其中n为该层的输入连接数。例如在CNN中有n=in_channels×kernel_size×kernel_sizen = in\_channels \times kernel\_size \times kernel\_size 假设输入x和权重w是相互独立的,且初始化均值都为0,则输出y的方差为:

Var(y)=i=1nVar(wixi)=nVar(w)Var(x)Var(y) = \sum_{i=1}^{n} Var(w_i x_i) = n \cdot Var(w) \cdot Var(x)

从标准正态分布中采样权重,即Var(w)=1Var(w) = 1,代入公式得到Var(y)=nVar(x)Var(y) = n \cdot Var(x)。可见信号经过一层网络后其方差会被放大n倍。如果网络有L层,前向传播到底层时输出信号的方差将是初始输入的nLn^L倍。
在实际应用中,nn 通常是一个较大的数(例如通道数为 64,卷积核为 3x3 时,n=64×3×3=576n = 64 \times 3 \times 3 = 576)。576L576^L 会在几层传播之内迅速超出浮点数上限,变成 NaN,这就是前向信号/梯度爆炸。
反之,如果为了避免爆炸,你人工指定一个极小的常量方差(例如让 Var(w)=0.0001Var(w) = 0.0001),经过 LL 层后,方差会变成 (n×0.0001)L(n \times 0.0001)^L。如果这个底数小于 11,方差会迅速衰减为 00,导致底层网络接收不到任何梯度信号,这就是梯度消失。
为了打破这个死局,我们必须让输入和输出的方差保持一致,即 Var(y)=Var(x)Var(y) = Var(x)。这意味着我们必须强制要求:nVar(w)=1    Var(w)=1nn \cdot Var(w) = 1 \implies Var(w) = \frac{1}{n}

1. Xavier 初始化 (Glorot Initialization)

  • 适用场景:激活函数为 Sigmoid 或 Tanh。
  • 数学原理:它假设激活函数在其零点附近是线性的。为了使正反向传播的方差不变,权重应从方差为 2fanin+fanout\frac{2}{fan_{in} + fan_{out}} 的分布中采样。
  • 实现:
    • Xavier 正态分布:从 N(0,σ2)\mathcal{N}(0, \sigma^2) 采样,其中 σ=2fanin+fanout\sigma = \sqrt{\frac{2}{fan_{in} + fan_{out}}}
    • Xavier均匀分布:从 U(a,a)\mathcal{U}(-a, a) 采样,其中 a=6fanin+fanouta = \sqrt{\frac{6}{fan_{in} + fan_{out}}}

2. Kaiming 初始化 (He Initialization)

  • 适用场景:激活函数为 ReLU 或 LeakyReLU。
  • 数学原理:ReLU 会将所有负数截断为 0,这导致每一层经过 ReLU 后,信号的方差会减半。Kaiming 初始化为了补偿这丢失的一半方差,将权重的方差放大了一倍,即 2fanin\frac{2}{fan_{in}}
  • 实现:
    • Kaiming 正态分布:从 N(0,σ2)\mathcal{N}(0, \sigma^2) 采样,其中 σ=2fanin\sigma = \sqrt{\frac{2}{fan_{in}}}
    • Kaiming 均匀分布:从 U(a,a)\mathcal{U}(-a, a) 采样,其中 a=6fanina = \sqrt{\frac{6}{fan_{in}}}

权重和偏置

不是trick,只是我是学习算法大笨蛋所以在这里记录一下
速度学习最底层的数学本质可以被概括为一个简单的线性方程:

Y=WX+bY = WX + b

其中X是输入,Y是输出,而权重W和偏置b就是网络中唯一需要通过训练去学习的参数 <br>

CNN中的权重和偏置


一、 权重 WW:特征检测的核心

在 CNN 中,权重 WW 即为卷积核

Tensor4D W; // 维度: [out_c][in_c][k_h][k_w]

  • [k_h][k_w] 空间特征模板:这是卷积核的物理尺寸(例如 3x3)。矩阵里的这 9 个数字,决定了这个核能检测什么图案。如果矩阵的数字是左边全正、右边全负,它就是一个“垂直边缘检测器”。它在图像上滑动时,遇到垂直边缘就会计算出极大的内积值(激活),遇到平坦区域结果就趋近于 0。
  • [in_c] 输入通道的对齐:如果输入是一张彩色 RGB 图像,它有 3 个通道(Red, Green, Blue)。你的空间模板不能只扫一个面,它必须也是 3 层的,即厚度必须与输入保持一致。所以单个卷积核的完整形状是 [in_c][k_h][k_w](例如 3x3x3)。这三层会在各自的通道上分别做乘积累加,最后把 3 个通道的结果汇总成一个单值。
  • [out_c] 多特征并行提取:我们不能只指望一个卷积核。在一层网络中,我们希望同时检测垂直边缘、水平边缘、对角线边缘甚至是圆斑。你有多少个不同的需求,就需要定义多少个不同的卷积核。这个卷积核的总数量就是 out_c(输出通道数)。每个独立的卷积核扫过一遍原图,就会生成一张单通道的特征图。out_c 个卷积核,就会生成 out_c 张不同的特征图堆叠在一起。

二、 偏置 bb:激活阈值的调节器

在 CNN 中,偏置 bb 决定了特定特征有多容易被激活。

std::vector<float> b; // 维度:[out_c]

每一个输出通道(即每一个卷积核),独享一个标量偏置值。网络后面通常会接一个 ReLU 激活函数(只保留正数,负数置为 0)。

  • 特征抑制:假设某个区域提取到的特征值是 0.5。如果 b=1.0b = -1.0,加完偏置后变成了 -0.5,经过 ReLU 后直接被抹杀成 0。这说明网络认为这个特征当前不够强烈,不予放行。
  • 信号放大:如果 b=+1.0b = +1.0,加完偏置后变成了 1.5,经过 ReLU 后信号被放大保留。

因此,bb 是网络自己学习到的一个基础偏移量,用来整体调节某一种特定特征的敏感度。

多层感知机/全连接层


一、权重 WW:全局映射矩阵
  • 维度: [out_features, in_features]
  • 物理意义:MLP的权重是全局绑定的,如果输入是一张展平的图像(比如1024个像素),W中的每一行都包含1024个参数。它暴力计算所有输入节点与目标输出之间的全局线性相关性,是一个缺乏空间几何意识的“纯数学映射器”。

二、偏置 bb:类别的基础概率分布
  • 维度: [out_features]
  • 物理意义:如果全连接层用于输出 10 个类别的分类概率,bb 实际上代表了这 10 个类别的先验概率。如果训练集中“狗”的照片远多于“猫”,网络会自发地把代表“狗”的那个神经元的偏置 bb 学得非常大,即使输入完全是黑屏,它也更倾向于猜这是一只狗。

循环神经网络(RNN/LSTM)


一、权重 WW:时间转移矩阵
  • 在RNN中,WW裂变成了两个核心矩阵:WihW_{ih}(输入到隐藏层)和 WhhW_{hh}(隐藏层到隐藏层)
  • 物理意义:WihW_{ih}依然是特征提取器,提取当前时刻(t)(t)输入的特征。而WhhW_{hh}则是时间机器,它决定了网络如何把历史记忆映射到当前时刻。它提取的是”时间跨度上的因果规律“。

二、偏置 bb:遗忘/记忆的硬性开关
  • 以LSTM为例,偏置的作用被放大。LSTM内部有多个门(遗忘门、输入门、输出门),每个门都有自己的b
  • 在实际训练 LSTM 时,我们经常会强制把遗忘门的偏置 bfb_f 初始化为 1.0 甚至更大。物理意义是:在网络一无所知的初始阶段,先默认把所有的历史记忆都保留下来(让遗忘门的激活值趋近于 1),避免梯度在时间长河中过早消失,随着训练再让网络自己学会该减小哪个 bb 来遗忘无用信息。

Transformer(自注意力机制)


一、权重 WW:语义角色投影仪
  • 维度:每一层通常有三个核心权重矩阵 WQW^QWKW^KWVW^V,均为 2D 矩阵 [d_model, d_head]。
  • 物理意义:这里的 WW 不再直接提取目标的“像素特征”,而是作为一种角色分配器。
    • 当一个词向量(比如“苹果”)乘上 WQW^Q 时,它变成了 Query(查询),物理意义是:“我在寻找一个表示颜色的形容词”。
    • 乘上 WKW^K 时,变成了 Key(键),物理意义是:“我是一个名词,属于水果类”。
    • 乘上 WVW^V 时,变成了 Value(值),代表它本身携带的实际语义内容。
  • 相比 CNN 是死板地用模具去套数据,Transformer 是用 WW 把数据投影成不同的身份,让数据自己去寻找相关的数据(Q 与 K 计算内积)。

二、偏置 bb:逐渐被抛弃的组件

在早期的 Transformer(如 BERT)中,WQ,WK,WVW^Q, W^K, W^V 后面依然跟着偏置 bQ,bK,bVb^Q, b^K, b^V。但最近几年的顶会论文或大模型源码(如 LLaMA, PaLM),在很多线性层中直接删除了偏置 bb(设置 bias=False)。因为研究人员发现,在几千个维度的高维空间中,特征通过 WW 进行纯线性旋转缩放就已经具有极强的表达能力,强行加上一个平移向量 bb 不仅不增加多少收益,反而会破坏高维特征空间分布的对称性,甚至拖慢多卡并行的计算速度

CNN

填充

  1. 物理定义与几何公式
    定义: 在输入张量的边缘外侧补值(通常补 0)。
    几何映射: 假设输入尺寸为 II,卷积核尺寸为 KK,步幅为 SS,填充圈数为 PP
    输出尺寸 OO 的计算公式:
O=IK+2PS+1O = \lfloor \frac{I - K + 2P}{S} \rfloor + 1

Same Padding: 调整 PP 使得 O=IO=I(步幅为 1 时),保证特征图空间维度不缩小。
Valid Padding: P=0P=0,即不进行任何填充,卷积后特征图会迅速变小。
2. 核心动机(为什么需要 Padding)
防止维度塌陷: 如果不填充,每一层卷积都会导致图像缩小。在深层网络中,特征图会很快缩小到 1×11 \times 1,导致无法提取复杂的空间特征。
保持边缘信息: 卷积核在滑动时,中心像素被覆盖的次数多,而边缘像素被覆盖的次数少。Padding 让边缘像素也能作为“中心”参与计算,避免边缘特征在上采样或深层传递中丢失。
空间对齐(中心化): 为了让卷积核的“锚点”(通常是中心格)能够完美对齐原图的每一个像素。
3. 前向传播:空间放置逻辑
在实现 pad_tensor 时,原图必须放在新矩阵的正中心。

  • 水平维度:新宽度 Wnew=Wold+2×PW_{new} = W_{old} + 2 \times P
  • 索引映射:原图坐标 (j,k)(j, k) 映射到填充后矩阵的 (j+P,k+P)(j+P, k+P)
  • 补零的作用:00 是卷积(乘积累加)的单位元。在边缘计算时,落在填充区的权重乘积为 00,保证了计算结果仅由原图内的真实像素贡献,不引入偏差。
  1. 反向传播:梯度的“非物理”处理
    Padding 对反向传播的影响体现在对梯度的“裁剪”和“补零”:
  • 求输入梯度 (dXdX):在前向传播中,填充的 PP 圈像素是虚拟的(由系统生成,非网络参数)。
  • 裁剪(Cropping):通过全填充卷积算出的梯度矩阵 dXpaddX_{pad} 包含了虚拟边缘的梯度。在将误差传向下一层之前,必须将外围 PP 圈的梯度物理裁剪掉,只保留中心与原图尺寸一致的梯度块。
  • 权重梯度 (dWdW):计算权重更新时,必须使用前向时的补零输入 XpadX_{pad} 与输出梯度 dYdY 进行卷积。