可能是一些深度学习的trick
是的我是深度学习笨蛋
通用
权重初始化
在初始化权重的值时不可将权重初始化为相同的常数。如果同一层所有神经元的初始权重相同,它们在计算前向传播时将输出相同的值,在反向传播时将获得完全相同的梯度更新。导致无论训练多久学到的特征都是一样的。这被称为对称性破缺失败(Symmetry Breaking Problem),故权重必须引入随机性。
但如果直接引入像是标准正态分布这样的随机初始化后,如果网络很深,会面临梯度消失或梯度爆炸。这个时候!Xavier和Kaiming出现了!
首先解释为什么正态分布会导致梯度爆炸/消失:
假设第l层的某个输出神经元为y,它由前一层的n个输入神经元与权重线性组合而成(此处忽略偏置和激活函数):
其中n为该层的输入连接数。例如在CNN中有 假设输入x和权重w是相互独立的,且初始化均值都为0,则输出y的方差为:
从标准正态分布中采样权重,即,代入公式得到。可见信号经过一层网络后其方差会被放大n倍。如果网络有L层,前向传播到底层时输出信号的方差将是初始输入的倍。
在实际应用中, 通常是一个较大的数(例如通道数为 64,卷积核为 3x3 时,)。 会在几层传播之内迅速超出浮点数上限,变成 NaN,这就是前向信号/梯度爆炸。
反之,如果为了避免爆炸,你人工指定一个极小的常量方差(例如让 ),经过 层后,方差会变成 。如果这个底数小于 ,方差会迅速衰减为 ,导致底层网络接收不到任何梯度信号,这就是梯度消失。
为了打破这个死局,我们必须让输入和输出的方差保持一致,即 。这意味着我们必须强制要求:
1. Xavier 初始化 (Glorot Initialization)
- 适用场景:激活函数为 Sigmoid 或 Tanh。
- 数学原理:它假设激活函数在其零点附近是线性的。为了使正反向传播的方差不变,权重应从方差为 的分布中采样。
- 实现:
- Xavier 正态分布:从 采样,其中
- Xavier均匀分布:从 采样,其中
2. Kaiming 初始化 (He Initialization)
- 适用场景:激活函数为 ReLU 或 LeakyReLU。
- 数学原理:ReLU 会将所有负数截断为 0,这导致每一层经过 ReLU 后,信号的方差会减半。Kaiming 初始化为了补偿这丢失的一半方差,将权重的方差放大了一倍,即 。
- 实现:
- Kaiming 正态分布:从 采样,其中
- Kaiming 均匀分布:从 采样,其中
权重和偏置
不是trick,只是我是学习算法大笨蛋所以在这里记录一下
速度学习最底层的数学本质可以被概括为一个简单的线性方程:
其中X是输入,Y是输出,而权重W和偏置b就是网络中唯一需要通过训练去学习的参数 <br>
CNN中的权重和偏置
一、 权重 :特征检测的核心
在 CNN 中,权重 即为卷积核。
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张不同的特征图堆叠在一起。
二、 偏置 :激活阈值的调节器
在 CNN 中,偏置 决定了特定特征有多容易被激活。
std::vector<float> b; // 维度:[out_c]
每一个输出通道(即每一个卷积核),独享一个标量偏置值。网络后面通常会接一个 ReLU 激活函数(只保留正数,负数置为 0)。
- 特征抑制:假设某个区域提取到的特征值是 0.5。如果 ,加完偏置后变成了 -0.5,经过 ReLU 后直接被抹杀成 0。这说明网络认为这个特征当前不够强烈,不予放行。
- 信号放大:如果 ,加完偏置后变成了 1.5,经过 ReLU 后信号被放大保留。
因此, 是网络自己学习到的一个基础偏移量,用来整体调节某一种特定特征的敏感度。
多层感知机/全连接层
一、权重 :全局映射矩阵
- 维度:
[out_features, in_features] - 物理意义:MLP的权重是全局绑定的,如果输入是一张展平的图像(比如1024个像素),W中的每一行都包含1024个参数。它暴力计算所有输入节点与目标输出之间的全局线性相关性,是一个缺乏空间几何意识的“纯数学映射器”。
二、偏置 :类别的基础概率分布
- 维度:
[out_features] - 物理意义:如果全连接层用于输出 10 个类别的分类概率, 实际上代表了这 10 个类别的先验概率。如果训练集中“狗”的照片远多于“猫”,网络会自发地把代表“狗”的那个神经元的偏置 学得非常大,即使输入完全是黑屏,它也更倾向于猜这是一只狗。
循环神经网络(RNN/LSTM)
一、权重 :时间转移矩阵
- 在RNN中,裂变成了两个核心矩阵:(输入到隐藏层)和 (隐藏层到隐藏层)
- 物理意义:依然是特征提取器,提取当前时刻输入的特征。而则是时间机器,它决定了网络如何把历史记忆映射到当前时刻。它提取的是”时间跨度上的因果规律“。
二、偏置 :遗忘/记忆的硬性开关
- 以LSTM为例,偏置的作用被放大。LSTM内部有多个门(遗忘门、输入门、输出门),每个门都有自己的b
- 在实际训练 LSTM 时,我们经常会强制把遗忘门的偏置 初始化为 1.0 甚至更大。物理意义是:在网络一无所知的初始阶段,先默认把所有的历史记忆都保留下来(让遗忘门的激活值趋近于 1),避免梯度在时间长河中过早消失,随着训练再让网络自己学会该减小哪个 来遗忘无用信息。
Transformer(自注意力机制)
一、权重 :语义角色投影仪
- 维度:每一层通常有三个核心权重矩阵 、、,均为 2D 矩阵 [d_model, d_head]。
- 物理意义:这里的 不再直接提取目标的“像素特征”,而是作为一种角色分配器。
- 当一个词向量(比如“苹果”)乘上 时,它变成了 Query(查询),物理意义是:“我在寻找一个表示颜色的形容词”。
- 乘上 时,变成了 Key(键),物理意义是:“我是一个名词,属于水果类”。
- 乘上 时,变成了 Value(值),代表它本身携带的实际语义内容。
- 相比 CNN 是死板地用模具去套数据,Transformer 是用 把数据投影成不同的身份,让数据自己去寻找相关的数据(Q 与 K 计算内积)。
二、偏置 :逐渐被抛弃的组件
在早期的 Transformer(如 BERT)中, 后面依然跟着偏置 。但最近几年的顶会论文或大模型源码(如 LLaMA, PaLM),在很多线性层中直接删除了偏置 (设置 bias=False)。因为研究人员发现,在几千个维度的高维空间中,特征通过 进行纯线性旋转缩放就已经具有极强的表达能力,强行加上一个平移向量 不仅不增加多少收益,反而会破坏高维特征空间分布的对称性,甚至拖慢多卡并行的计算速度
CNN
填充
- 物理定义与几何公式
定义: 在输入张量的边缘外侧补值(通常补 0)。
几何映射: 假设输入尺寸为 ,卷积核尺寸为 ,步幅为 ,填充圈数为 。
输出尺寸 的计算公式:
Same Padding: 调整 使得 (步幅为 1 时),保证特征图空间维度不缩小。
Valid Padding: ,即不进行任何填充,卷积后特征图会迅速变小。
2. 核心动机(为什么需要 Padding)
防止维度塌陷: 如果不填充,每一层卷积都会导致图像缩小。在深层网络中,特征图会很快缩小到 ,导致无法提取复杂的空间特征。
保持边缘信息: 卷积核在滑动时,中心像素被覆盖的次数多,而边缘像素被覆盖的次数少。Padding 让边缘像素也能作为“中心”参与计算,避免边缘特征在上采样或深层传递中丢失。
空间对齐(中心化): 为了让卷积核的“锚点”(通常是中心格)能够完美对齐原图的每一个像素。
3. 前向传播:空间放置逻辑
在实现 pad_tensor 时,原图必须放在新矩阵的正中心。
- 水平维度:新宽度 。
- 索引映射:原图坐标 映射到填充后矩阵的 。
- 补零的作用: 是卷积(乘积累加)的单位元。在边缘计算时,落在填充区的权重乘积为 ,保证了计算结果仅由原图内的真实像素贡献,不引入偏差。
- 反向传播:梯度的“非物理”处理
Padding 对反向传播的影响体现在对梯度的“裁剪”和“补零”:
- 求输入梯度 ():在前向传播中,填充的 圈像素是虚拟的(由系统生成,非网络参数)。
- 裁剪(Cropping):通过全填充卷积算出的梯度矩阵 包含了虚拟边缘的梯度。在将误差传向下一层之前,必须将外围 圈的梯度物理裁剪掉,只保留中心与原图尺寸一致的梯度块。
- 权重梯度 ():计算权重更新时,必须使用前向时的补零输入 与输出梯度 进行卷积。