SGD、Momentum和Adam等优化算法根据反向传播过程中计算的梯度,智能地更新模型权重。然而,这些算法需要一个起点。训练开始前,为神经网络的权重和偏置赋的初始值,在训练过程中有着出乎意料的深远影响。这就是参数初始化的原理。将神经网络的损失地形想象成一个包含丘陵、山谷和高原的复杂地形。优化的目标是在这片地形中穿行,以找到一个低点(一个好的方案)。你开始下降的位置,即初始权重配置,极大影响着你是否能快速找到一个好的低点,是困在高原上,甚至跌下比喻意义上的悬崖(遇到数值不稳定)。为什么初始化很重要?不当的初始化会导致几种训练难题:打破对称性: 如果连接到某一层的所有权重都被初始化为相同的值(例如零),那么在该层的所有神经元在正向传播过程中将产生相同的输出。因此,在反向传播过程中,它们都将接收到相同的梯度信号,并以完全相同的方式更新。这种对称性阻止神经元学习不同的特征,从而有效降低了该层的能力。使用小的随机值初始化权重是打破这种对称性的第一步。梯度消失: 如果权重初始化得太小,激活值和梯度在网络中传播时(特别是在梯度计算的反向传播过程中)会逐渐减小。在深层网络中,这可能导致早期层的梯度变得极其接近零。当梯度消失时,这些层的权重会停止更新,有效停止了网络很大一部分的学习。这对于像sigmoid或tanh这样的激活函数尤其成问题,它们会饱和(输出值分别趋于0或1,或-1和1,变得平坦),并在饱和区域具有很小的梯度。梯度爆炸: 相反,如果权重初始化得太大,激活值和梯度在网络中传播时会指数级增长。这会导致非常大的梯度值,引起更新不稳定,超越最佳点,甚至导致数值溢出(表现为NaN - 非数字)。梯度爆炸会使训练完全发散。考虑对激活值的影响。理想情况下,我们希望不同层中神经元输出(激活值)具有大致相似的方差。如果方差层层递增,激活值可能变得非常大,导致饱和或梯度爆炸。如果方差持续减小,激活值可能趋近于零,从而有助于梯度消失。{"layout": {"title": "激活值分布", "xaxis": {"title": "激活值"}, "yaxis": {"title": "密度"}, "barmode": "overlay", "legend": {"traceorder": "reversed"}, "shapes": [{"type": "line", "x0": 0, "y0": 0, "x1": 0, "y1": 0.55, "line": {"color": "#868e96", "width": 1, "dash": "dash"}}, {"type": "line", "x0": -1, "y0": 0, "x1": -1, "y1": 0.15, "line": {"color": "#fa5252", "width": 1, "dash": "dot"}}, {"type": "line", "x0": 1, "y0": 0, "x1": 1, "y1": 0.15, "line": {"color": "#fa5252", "width": 1, "dash": "dot"}}], "annotations": [{"x": -1, "y": 0.16, "text": "饱和", "showarrow": false, "font": {"color": "#fa5252"}}, {"x": 1, "y": 0.16, "text": "饱和", "showarrow": false, "font": {"color": "#fa5252"}}]}, "data": [{"type": "histogram", "x": [-0.2, -0.15, -0.1, -0.05, 0, 0.05, 0.1, 0.15, 0.2, -0.1, 0.1, -0.05, 0.05, 0, -0.02, 0.02, 0, 0, 0, 0.01, -0.01], "name": "消失(过小)", "marker": {"color": "#339af0"}, "opacity": 0.6, "histnorm": "probability density"}, {"type": "histogram", "x": [-1.5, -1.2, -1.1, -0.9, 0.9, 1.1, 1.2, 1.5, -1, 1, -1, 1, -1, 1, -1.1, 1.1, -0.9, 0.9], "name": "饱和(过大)", "marker": {"color": "#f06595"}, "opacity": 0.6, "histnorm": "probability density"}, {"type": "histogram", "x": [-0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, -0.5, 0.5, -0.3, 0.3, 0.1, -0.1, 0, 0.2, -0.2], "name": "良好初始化", "marker": {"color": "#51cf66"}, "opacity": 0.6, "histnorm": "probability density"}]}一层中基于初始化的激活值分布。不当的初始化可能导致激活值聚集在零附近(消失)或在tanh等激活函数的边界附近饱和(例如,-1或1)。良好初始化旨在实现更健康的分布。恰当的初始化旨在设置初始权重,使激活值和梯度在整个网络中保持在合理范围,从而促进更快收敛并避免这些问题。它有助于确保信号在正向(用于预测)和反向(用于学习)传播时都能有效流动。在接下来的章节中,我们将研究Xavier/Glorot和He初始化等具体的初始化策略,这些策略是根据数学原理设计的,旨在维持适当的激活值和梯度方差,从而显著提升深层网络的训练能力。