权重初始化(weight initialization)
/ wayt ih-nish-ul-ih-ZAY-shun /
权重初始化,是在任何学习开始之前,给网络的权重选定一组起始数值。既然训练靠的是从权重一开始所在之处一步步地轻推它们,那么起点就实实在在地要紧——就像在一片丘陵地貌上,你先落脚在哪里,再向下走、奔向最低的山谷。落在一个糟糕的位置,你可能会卡住、慢得令人煎熬地下行,或者干脆动都动不起来。初始化,就是明智地选定那个落脚点。
两种天真的选法都会失败。把每个权重都设成同一个值(比如全设为零)是致命的:相同的权重意味着一层里的每个神经元算的都是完全一样的东西、并永远收到一样的更新,于是网络再也无法打破这种对称去分化——无论它有多大,它的表现都和单个神经元无异。所以权重必须从随机且各不相同的值开始。但这种随机的尺度很微妙:太大,信号会炸开(梯度爆炸);太小,信号会衰减消失(梯度消失)。无论哪一种,学习都会停滞。
解法是把随机值缩放得恰到好处,按每个神经元有多少条连接来调,好让信号在穿过各层时保持一个健康的大小。两个著名的配方是 Xavier(又称 Glorot)初始化,为 sigmoid 和 tanh 而设计,以及 He 初始化,为 ReLU 而设计。它们并不高深——不过是些合乎情理的缩放规则——但它们带来了实实在在的不同,让深层网络得以可靠地训练,而换作草率的初始化,它们本会卡死在原地。这是一个小小的、事先要做的决定,却对训练究竟能不能成功有着超乎比例的影响。
把一个网络里的每个权重都设为零再开始训练:一层里的每个神经元会永远与它的邻居一模一样,网络什么有用的东西都学不到。改用按 He 配方(适配 ReLU)缩放的细小随机数来设权重,同一个网络便训练得顺顺当当。唯一改变的,只是那组起始数值。
全零权重会冻住一个网络;缩放得当的随机权重才让它真正学得起来。
切勿把所有权重都初始化成同一个常数——一模一样的神经元永远无法分化(即「对称性」问题)。规矩是:随机且缩放得当;缩放的尺度应与你的激活函数相匹配(sigmoid/tanh 用 Xavier,ReLU 用 He)。