在神经网络中,权重的初始值特别重要,将介绍初始值的推荐值,并通过实验确认神经网络的学习是否会快速进行。
权值衰减就是一种以减小权重参数的值为目的的学习,抑制过拟合的发生。
这里,我们来做一个实验观察权重初始值如何影响隐藏层的激活值的分布(激活函数的输出数据),这里要做的实验是向一个五层的神经网络传入随机输入数据,用直方图绘制各层激活值的数据分布。
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.random.randn(1000,100)
node_num=100 #各隐藏层的节点数
hidden_layer_size=5 #隐藏层有5层
activations={} #激活值的结果保存在这里
for i in range(hidden_layer_size):
if i !=0
x=activations[i-1]
w=np.random.randn(node_num,node_num)*1
z=np.dot(x,w)
a=sigmoid(z)
activations[i]=a
#绘制直方图
for i,a in activations.items();
plt.subplot(1,len(activations),i+1)
plt.title(str(i+1)+"-layer")
plt.hist(a.flatten(),30,range=(0,1))
plt.show()
对比权重的标准差为1和为0.01
w=np.random.randn(node_num,node_num)*0.01
各层激活值,在权重标准差为1时,偏向0和1,可能发生梯度消失的问题;在权重标准差为0.01,偏向0.5,相当于多个神经元都输出几乎相同的值,等于只有1个神经元,出现“表现力受阻”的问题。
接下来,我们尝试使用Xavier初始值。为了使各层的激活值呈现出具有相同广度的分布,推导了合适的权重尺度。结论是,如果前一层的节点数为n,则初始值使用标准差为1/根号n的高斯分布。使用Xavier初始值后,前一层的节点数越多,要设定为目标节点的初始值的权重尺度就越小。
node_num=100 #前一层的节点数
w=np.random.randn(node_num,node_num)/np.sqrt(node_num)
Xavier初始值时以激活函数时线性函数为前提而推导出来的。因为sigmoid函数和tanh函数左右对称,且中央附近可以视作线性函数,但激活函数用ReLU时,一般推荐使用ReLU专用的初始值。也成为He初始值。
当前一层的节点数为n,He初始值使用标准差为根号(2/n)的高斯分布。可以解释为,因为ReLU的负值区域的值为0,所以为了使得它更有广度,需要2倍的系数。