✅ 一、为什么不能将神经网络参数全部初始化为零?
- 对于单层神经网络,将权重
和偏置
初始化为零是可行的。
- 但对于多层神经网络 ,这样做会导致所有神经元输出完全相同,无法学习不同特征。
- 原因 :
- 每个输入
输入到第一层的所有神经元;
- 若所有
和
都为 0,则每个神经元计算结果
;
- 经过激活函数后,所有隐藏层输出
都相同;
- 导致梯度更新时所有参数变化一致,模型失去表达能力。
- 每个输入
🔴 结论:不能将参数都初始化成一样的值(如全零),否则多个神经元之间无区别。
✅ 二、如何进行随机初始化?
-
常用方法:使用
numpy.random.randn()进行标准正态分布随机初始化。 -
例如:
w[1] = numpy.random.randn(2, 2) * 0.01 -
解释:
numpy.random.randn(2,2):生成一个 2×2 的矩阵,元素服从均值为 0、标准差为 1 的正态分布;- 乘以 0.01 是为了缩小初始权重范围,避免梯度爆炸或消失。
✅ 三、randn 函数的一些语法规则
- 当括号内没有参数时,返回一个浮点数;
- 当括号内有一个参数时,返回一个秩为 1 的数组(向量);
- 当括号内有两个及以上参数时,返回对应维度的数组(可表示向量或矩阵);
np.random.standard_normal()与np.random.randn()类似,但输入参数必须是元组(tuple);np.random.randn()的输入通常为整数,若为浮点数会自动截断为整数。
✅ 四、为什么要乘以 0.01?
- 目的是让初始权重更小,从而:
- 减小激活函数的斜率(如 Sigmoid 在接近 0 处导数最大);
- 加快反向传播中的梯度下降速度(因为梯度与权重相关);
- 防止激活值过大导致饱和(如 Sigmoid 接近 0 或 1 时导数趋近于 0,梯度消失);
- 但也不能太小:
- 否则可能导致信号在多层传递中逐渐衰减至 0;
- 激活函数可能失去非线性特性(如 ReLU 变成线性)。
📌 平衡原则:权重不能太大(防爆炸),也不能太小(防消失)。
✅ 五、参数初始化的重要性
- 合适的初始化区间对训练效果至关重要;
- 应根据神经元连接数量调整初始化方差:
- 输入连接越多的神经元,其权重应越小;
- 避免输出过大或过小;
- 方法称为方差缩放(Variance Scaling),后续会详细讲解。
✅ 六、偏置
是否可以为零?
- 可以 。因为权重
已经被随机初始化;
- 每个神经元的计算内容不再相同,因此即使
也无妨。
✅ 七、本节总结
- 学习了多层神经网络参数初始化的关键问题;
- 理解了为何不能将参数初始化为全零;
- 掌握了使用
numpy.random.randn()进行随机初始化的方法; - 了解了初始化尺度对训练的影响(如乘以 0.01);
- 为下一节编写深度神经网络程序打下基础。