第五章 神经网络训练
文章目录
前言
与线性模型类似,神经网络也是可微分的参数化函数,它使用了基于梯度的优化方法来进行训练,非线性神经网络的目标函数并不是凸函数,因此使用基于梯度的优化方法,可能会陷入局部极小。但是,基于梯度的优化方法在实际应用中仍然取得了良好的效果。
梯度计算是神经网络训练的核心
5.1计算图
计算图是任意数学表达式的一种图表达结构。
它是一个有向无环图 (DAG),其中结点对
应于数学运算或者变量,边对应于结点间计算值的流。图形结构在不同的组件之间根据依赖
关系定义计算的顺序。计算图是 DAG ,而不是一棵树,一个操作的结果可以作为多个连续操作的输人。
下面我们来看一个简单的计算图例子,计算
(
a
∗
b
+
1
)
∗
(
a
∗
b
+
2
)
(a*b+1)*(a*b+2)
(a∗b+1)∗(a∗b+2)
5.1.1前向计算
前向传递计算了图中结点的输出,由于每个结点的输出只依赖于它本身和传人的边,所以容易通过遍历拓扑顺序的结点来计算所有结点的输出,并在给定前驱时,计算每个结点的输出。
5.1.2 反向计算(倒数、反向传播)
反向传播过程开始于设置一个损失结点
N
N
N ,该结点拥有
1
∗
1
1*1
1∗1的标量输出,然后进行前向传播计算直到到达结点
N
N
N,根据结点值,反向传播过程计算了该结点参数的梯度。
反向传播算法本质上是使用链式求导法则
5.2 实践经验
目标函数的非凸性意味着优化过程可能陷入局部极小或鞍点,从不同的初始点开始(比如,参数的不同随机值)可能会产生不同的结果,因此我们建议尝试几次从不同的随机初始化开始训练,选择其中 一个在开发集上最好的结果。
随机数的大小对网络训练的成功与否具有非常大的影响。
-
建议权重矩阵:
U ( a , b ) U(a,b) U(a,b)是范围 [ a , b ] [a,b] [a,b]的一个均匀采样。权重矩阵 W ∈ R d i n ∗ d o u t W\in\mathbb R^{d_{in}*d_{out}} W∈Rdin∗dout -
当使用 R e L u ReLu ReLu非线性激活函数时,应该从均值为0,方差为 ( 2 / d i n ) 1 / 2 (2/{d_{in}})^{1/2} (2/din)1/2的高斯分布采样进行权值初始化。
5.2.4 梯度消失与梯度爆炸
在深层网络中,因为梯度通过计算图反向传播回来,错误梯度是非常常见的,要么梯度消失(变得非常接近0),要么梯度爆炸(变得非常高)。
处理梯度消失是个开放性研究问题。解决方案有:让网络变浅,逐步训练。
处理梯度爆炸:简单而有效方法,如果它们的范数超过给定的阈值,就裁剪掉。
5.2.5饱和神经元与死神经元
带有 tanh与sigmoid 激活函数的网络层往往容易饱和——造成该层的输出都接近于1 ,这是激活函数的上界。
带有 ReLU 激活函数的网络层不会饱和,但是会“死掉”一一大部分甚至所有的值为负值,因此对于所有的输入来说都裁剪为0 ,从而导致该层梯度全为0 。
如果你的网络没有训练好,检查网络层的饱和神经元与死神经元是明智的,饱和神经元是由值太大的输入层造成的。这可以通过更改初始 、缩放输人值的范围或者改变学习速率来控制。死神经元是由进入网络层的负值引起的(例如,在大规模的梯度更新后可能会发生),减少学习率将减缓这种现象。
对于饱和层来说,另一种选择是归一激活函数后的饱和值。归一化是对抗饱和神经元的有效方法,但是在梯度计算过程中代价较大。
5.2.7 学习率
学习率的选择是重要的,太大的学习率会阻止网络收敛到一个有效的解,太小的学习率则需要长时间来收敛。
一个经验法则是,实验应该从范围
[
0
,
1
]
[0,1]
[0,1]内尝试初始学习率,比如 0. 001, 0. 01, 0. 1 , 观测网络的loss 值,一旦 loss 值在开发集上停止改进,则降低学习率。
一个常见的表示是将初始速率除以迭代次数。
5.2.8 minibatch
在每个训练样例( minibatch 大小为 1) 或者每k个训练样例训练结束后更新参数。