神经网络要做归一化的原因
见到一个有意思的讨论,在此复述。1.数值问题。无容置疑,归一化的确可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题,因为tansig的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。这时若输入较大,就意味着权值必须较小,一个较大,一个较小,两
见到一个有意思的讨论,在此复述。
1.数值问题。
无容置疑,归一化的确可以避免一些不必要的数值问题。输入变量的数量级未致于会引起数值问题,因为tansig的非线性区间大约在[-1.7,1.7]。意味着要使神经元有效,tansig( w1x1 + w2x2 +b) 里的 w1x1 +w2x2 +b 数量级应该在 1 (1.7所在的数量级)左右。
这时若输入较大,就意味着权值必须较小,一个较大,一个较小,两者相乘,就引起数值问题了。
要知道,计算机内的计算为近似计算:如:0.001235 * 42 != 0.042 *1.235,存在误差。
2.求解需要
1、初始化
例如,某个神经元的值为tansig(w1x1+w2x2+b),由于tansig函数只有在[-1.7,1.7]的范围才有较好的非线性,所以w1x1+w2x2+b的取值范围就要与 [-1.7,1.7]有交集(实际上需要更细腻的条件),这个神经元才能利用到非线性部分。
我们希望初始化的时候,就把每个神经元初始化成有效的状态,所以,需要知道w1x1+w2x2+b的取值范围,也就需要知道输入输出数据的范围。
一般讨论初始化方法时,我们都假设它的范围就是[0,1]或者[-1,1],这样讨论起来会方便很多。若数据已经归一化的话,能给初始化模块带来更简便,清晰的处理思路。
2、梯度
以输入-隐层-输出这样的三层BP为例,我们知道对于输入-隐层权值的梯度有2ew(1-a^2)*x的形式(e是誤差,w是隐层到输出层的权重,a是隐层神经元的值,x是输入),若输出层的数量级很大,会引起e的数量级很大,同理,w为了将隐层(数量级为1)映身到输出层,w也会很大,再加上x也很大的话,从梯度公式可以看出,三者相乘,梯度就非常大了,会给梯度的更新带来数值问题。
3、学习率
由 “2、梯度” 中可知,若不做归一化,有可能梯度非常大,此时学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据归一化,这样学习率就不必再根据数据范围作调整。
4、搜索轨迹
前面已说过,输入范围不同,其对应的 w 的有效范围就不同。假设 w1 的范围在 [-10,10],而w2的范围在[-100,100],梯度每次都前进1单位,那么在w1方向上每次相当于前进了 1/20,而在w2上只相当于 1/200!**某种意义上来说,在w2上前进的步长更小一些,而w1在搜索过程中会比w2“走”得更快。这样会导致,在搜索过程中更偏向于w1的方向。**所以不归一化,拟合的时间会明显增加,甚至不收敛,归一化则能加快收敛。
源于:http://www.nnetinfo.com/nninfo/editText.jsp?id=37
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)