简单记录学习~。在神经网络中,激活函数和批归一化(BatchNorm)的配合使用是为了解决数据分布偏移和梯度不稳定问题。以下是逐步解释:
1. 激活函数为何导致值向上下限移动?
以Sigmoid/Tanh为例:
这类饱和型激活函数(如Sigmoid、Tanh)的导数在输入绝对值较大时会趋近于0(饱和区)。
例如:Sigmoid的输出范围是 (0,1)当输入 𝑥≫0时,输出接近1;x≪0 时,输出接近0。
Tanh的输出范围是 (−1,1),当输入绝对值较大时,输出同样会饱和。
梯度消失:在反向传播时,梯度需要乘以激活函数的导数。若激活值接近饱和区(如Sigmoid输出接近1),导数 σ′(x)≈0,梯度会逐层衰减,导致底层参数难以更新。
2. 为什么下一层卷积后仍需要BatchNorm?
(1) 抵消激活函数导致的分布偏移
激活函数的非线性变换会破坏数据分布:例如,ReLU会将负值置零,导致输出的分布偏向非对称;Sigmoid/Tanh会压缩值域,导致后续层的输入范围不稳定。
卷积层的权重更新会进一步放大偏移:即使前一层通过激活函数输出了偏移的值,下一层卷积的权重矩阵(通过训练更新)可能进一步改变数据分布,导致输入到后续层的值域波动剧烈。
BatchNorm的作用:在卷积后加入BatchNorm,能对输出值进行标准化(减均值、除标准差),强制使其分布保持零均值和单位方差。这相当于对每一层的输入进行“校准”,使其更适合后续激活函数的处理。
(2) 缓解梯度问题
BatchNorm的缩放和平移参数:BatchNorm在标准化后引入了可学习的参数 γ(缩放)和 𝛽(偏移),允许网络自适应调整分布范围。例如:若激活函数为Sigmoid,网络可能通过 𝛾和 𝛽将输入调整到非饱和区(如Sigmoid的中间线性区),避免梯度消失。
梯度传播更稳定:标准化后的数据分布更平滑,激活函数的导数不会频繁接近0或过大,从而缓解梯度消失或爆炸。
(3) 协同解决协变量偏移(Covariate Shift)
内部协变量偏移(Internal Covariate Shift):在深度网络中,每一层的参数更新会改变后续层的输入分布,导致网络需要不断适应新的数据分布,降低训练效率。
BatchNorm的解决方案:通过对每一层的输出进行标准化,BatchNorm减少了层与层之间的分布依赖性,使网络更易训练。
3. 具体流程示例(以卷积网络为例)
假设网络结构为:
卷积层 → 激活函数 → 卷积层 → BatchNorm → 激活函数 → ...
第一次卷积+激活:卷积操作提取特征,激活函数(如ReLU)过滤负值,导致输出的分布偏向非负。若直接输入到下一层,可能导致后续卷积的输入分布不稳定(如全为正数)。
第二次卷积+BatchNorm:第二次卷积的权重可能进一步放大或偏移数据分布。加入BatchNorm后,强制将输出标准化为均值为0、方差为1的分布,再输入到激活函数。此时:激活函数的输入范围被限制在合理区间(如ReLU的输入接近零均值,避免大量负值被截断)。梯度计算更稳定,反向传播更有效。
4. 实验结论与设计经验
BatchNorm的位置:通常建议将BatchNorm放在卷积层/全连接层之后、激活函数之前(如 Conv → BN → ReLU),因为:激活函数(如ReLU)对标准化后的数据更敏感,能更好地区分正负值。若放在激活函数之后(如 Conv → ReLU → BN),标准化可能削弱激活函数的作用(如ReLU已将负值清零,BN的均值计算会偏向正数)。
例外情况:某些设计(如ResNet原始论文)采用 Conv → BN → ReLU 的顺序,但后续研究发现不同任务可能需要调整顺序。
5. 总结
激活函数导致值偏移:饱和型激活函数(Sigmoid/Tanh)或单边抑制型激活函数(ReLU)会破坏数据分布,导致后续层输入不稳定。
BatchNorm的必要性:即使经过卷积操作,仍需通过BatchNorm动态调整分布,确保每层输入的稳定性和梯度传播的有效性。
协同效果:BatchNorm与激活函数配合,既能缓解梯度消失/爆炸,又能加速收敛。