什么时候可以将神经网络的参数全部初始化为0?
用SGD训练神经网络时, 怎样决定初始化参数的方式? 主要有两个考虑点: 一: 最终是否能得到想要的学习结果, 即是否能得到一个符合预期目标的分类器;二: 训练时间, 好的参数初始化可以有效缩短训练时间, 如预训练.
不加思考时, 将所有参数都初始化为0是最省力的做法. 有些情况下可行, 但大部分情况下会导致学习失败, 得不到可用的模型.
先看最简单的例子: 用逻辑回归算法识别手写数字MNIST. 逻辑回归模型可以算作为一个Single-Layer Perceptron(SLP):
- \(28\times 28 = 784\)个输入单元, 激活函数为\(identity\)
- 10个输出单元, 激活函数为\(softmax\)
它由两组参数组成: \(W\)和\(b\), 前者是一个\(10 \times 784\)维的权值矩阵, 后者是长度为\(10\)的bias 列向量.
现将它们全部初始化为0,分析一下学习过程: - 第一次forward过程中, 输出层的所有输出为0.5. 反向时, 如之前描述输出层神经元的敏感度为输出值与目标值的差值: \(\delta = a - y\). 假如\(y_i = 1\), 即输入\(x\)对应的数字为\(i\), 那么除了第\(i\)个神经元的敏感度为\(-0.5\), 其它神经元都为\(0.5\). \(w_{ij}\)的梯度值\(\Delta w_{ij} = \delta_i x_j\), 由于输入向量\(x\)的元素之间的不同, 最终得到的10个梯度值有很大概率是不同且非0的, 所以第一次BP过程可以取得成效并将一些\(w\)和所有的\(b\)变成非0值.
- 于是, 后面的训练显然也可以顺利进行.
可以看出, 没有隐层时, 可以将所有的参数初始化为0.
如果有隐层呢?
对于隐层使用了ReLU: \(f(net) = max(0, net)\)为激活函数的MLP, 除了输入层的输出值为\(x\)本身, 不为0, 其余的所有层的输出都为0. BP时所有梯度也都为0, 包括输出层. 这意味着所有的非输入神经元都是dead neurons. 学习失败.
假如为使用了sigmoid激活函数呢? 可以推测:
-
第一个BP过程
- 输出层的第\(i\)个神经元的敏感度与其他9个不同
- 隐层所有的神经元的敏感度和权值梯度都相同, 但权值梯度为0
-
然后第二次BP时:
- 隐层所有的神经元的敏感度仍然相同, 所有权值的梯度仍然相等但非0.
-
最后学习得到的模型中, 所有的隐单元都是相同的. 学习失败.
其他的激活函数如tanh应该也是类似的情况.
所以, 最后的结论是, 一般只在训练SLP/逻辑回归模型时才使用0初始化所有参数., 更实用的结论是, 深度模型都不会使用0初始化所有参数.
(END)
Daniel的学习笔记
浙江大学计算机专业15级硕士在读, 方向: Machine Learning, Deep Learning, Computer Vision.
blog内容是我个人的学习笔记, 由于个人水平限制, 肯定有不少错误或遗漏. 若发现, 欢迎留言告知, Thanks!
Daniel的学习笔记
浙江大学计算机专业15级硕士在读, 方向: Machine Learning, Deep Learning, Computer Vision.
blog内容是我个人的学习笔记, 由于个人水平限制, 肯定有不少错误或遗漏. 若发现, 欢迎留言告知, Thanks!