训练一个神经网络,第一步就是给所有连接权重赋个初始值。大多数人的第一反应是:用个很小的随机数不就行了?反正后面还有反向传播、优化器。但如果你真的只是“随便随机”了一下,网络可能从第一轮就开始崩盘,而你连为什么都找不到。权重初始化远不是调参中的一个小细节,它决定了信号能不能活着穿过网络,也决定了各神经元能不能变成真正有用的特征检测器,而不是永远一模一样的复制品。
先说几个死线,任何一个初始化方案都不能踩:
第一,权重不能太小,小到信号在传递时直接衰减成零,这就是梯度消失的前奏。但也不能大,大到激活值一过层就炸,梯度蹭蹭往上飙,直接爆掉。
第二,同一层里的神经元不能都用一个值启动。只要初始值一样,反向传播时所有神经元拿到的梯度就会一模一样,更新步调永远一致。这层就废了,永远分化不出不同的功能。
第三,方差必须适中。太小跟梯度消失一个命,太大跟梯度爆炸一个病房。这个方差到底多大合适,得看激活函数的脾气。
![]()
激活函数这家伙,决定了神经元的“开”与“关”。Sigmoid 和 Tanh 这种老牌选手,容易在两端饱和,方差稍大一点就把输出压平,梯度直接躺平。ReLU 系(包括 Leaky ReLU、ELU、PReLU 等)则会把所有负输入直接砍成零,相当于自动砍掉了大约一半的信号。这两种情况对初始方差的要求完全不同,用错初始化,训练不会直接报错,但收敛速度会被拖慢,运气不好还会一开始就撞上梯度消失或爆炸,优化器连救的机会都没有。
所以聪明人就想出了两套专配方案。
第一套叫 Xavier 初始化(也常被叫做 Glorot 初始化),专门为 Sigmoid 和 Tanh 激活函数设计。它的思路是让前向传播激活值的方差,和反向传播梯度的方差,在整个网络里保持大致稳定,既不衰减也不放大。具体怎么做?既看每个神经元接进来的输入数量,也看它射出去的输出数量。两种常见公式:
Xavier 正态初始化:从均值为 0、方差为 2/(fan_in + fan_out) 的正态分布里采样。
Xavier 均匀初始化:在一个对称区间里均匀采样,区间边界是 sqrt(6/(fan_in + fan_out))。
这里的 fan_in 是当前神经元输入连接的数量,fan_out 是输出连接的数量。把这两个数量一起算进方差,正好平衡了饱和型激活函数在前向与反向两条通道上容易压平信号的特性。用上这套,网络一出生,信号就能正常流动。
第二套叫 He 初始化,针对的是 ReLU 及其一众变体。为什么不能继续用 Xavier?因为 ReLU 会直接把一半的输入清零,信号的实际强度天然被腰斩,再用 Xavier 那种“双边平衡”的方差,残余信号就太小了。He 初始化的思路是,只以输入连接数 fan_in 为基准,用更大的初始方差来补偿 ReLU 砍掉的那一部分。两种形式:
He 正态初始化:方差取 2/fan_in。
He 均匀初始化:边界取 sqrt(6/fan_in)。
这一下,信号被砍一半后还能维持在健康的尺度,不会还没出前几层就奄奄一息。
有人可能会问:那我不小心在 ReLU 网络里用了 Xavier,或者在 Sigmoid 网络里用了 He,后果会有多严重?说实话,不会立刻死给你看,但训练会肉眼可见地被拖慢。这种慢,不是调调学习率就能完全救回来的,因为一开始的初始状态已经把梯度结构搞歪了,优化器要从一个很差的起跑线开始慢慢修正。明明选对初始化只是改一行配置的事,为什么非要在训练速度上跟自己过不去?
这就是权重初始化这件事最反直觉的地方。它看上去只是个不起眼的起始动作,却直接影响整个训练过程的稳定性与效率。一句话总结:随机数值本身没问题,有问题的是你选了什么样的随机分布。方差多大、参考哪些连接数、适配哪种激活函数,这些“随机背后”的选择,才真正决定了你的网络是从第一轮开始高效学习,还是从第一轮就默默走向崩盘。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.