神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:
- 初始化参数。
- 求代价函数关于参数的梯度。
- 根据梯度更新参数的值。
- 经过迭代以后取得最佳参数,从而完成神经网络的训练。
其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。
单个神经元的训练
单个神经元的结构如下图。假设一个训练样本为 (x,y) 。在下图中, x 是输入向量,通过一个激励函数 h w,b (x) 得到一个输出 a , a 再通过代价函数得到 J 。
f(W,b,x)=a=sigmoid(∑ i x i w i +b) (公式1)
J(W,b,x,y)= 12 ∥y−h w,b (x)∥ 2 (公式2)
这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为 W 和 b 。
通过定义变量 z=∑ i x i w i +b 可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到 z , 第二部分是通过sigmoid得到 a 。
训练过程中,要求代价函数 J 关于 W 和 b 的偏导数。先求 J 关于中间变量 a 和 z 的偏导:
δ (a) = ∂∂a J(W,b,x,y)=−(y−a) (公式3)
δ (z) = ∂∂z J(W,b,x,y)= ∂J∂a∂a∂z =δ (a) a(1−a) (公式4)
公式(4)中根据sigmoid函数的定义 σ(z)= 11+e −z 可得 ∂a∂z =a(1−a) 。
再根据链导法则,可以求得 J 关于 W 和 b 的偏导数,即得 W 和 b 的梯度。
∇ W J(W,b,x,y)= ∂∂W J= ∂J∂z∂z∂W =δ (z) x T (公式5)
∇ b J(W,b,x,y)= ∂∂b J= ∂J∂z∂z∂b =δ (z) (公式6)
在这个过程中,先求 ∂J/∂a ,进一步求 ∂J/∂z ,最后求得 ∂J/∂W 和 ∂J/∂b 。结合上图及链导法则,可以看出这是一个将代价函数的增量 ∂J 自后向前传播的过程,因此称为反向传播(back propagation)。
多层神经网络的训练
多层网络的一个例子如下图。
假设第 l+1 层的输入和输出分别是 a l 和 a l+1 , 参数为 W l 和 b l ,仿射结果为中间变量 z l 。注意第一层的输出 a 1 =x ,为整个网络的输入,最后一层的输出 a L 是代价函数的输入。
z l+1 =W l x Tl +b l (公式7)
a l+1 =sigmoid(z l+1 ) (公式8)
对多层网络的训练需要求代价函数 J 对每一层的参数求偏导。后向传播过程变为:
1,第一步,根据代价函数的定义,求a J 对 a L 的偏导 δ (a)L 。
2,在第 l+1 层,将误差信号从 a l+1 传递到 z l+1 。
∂a (l+1) ∂z (l+1) =a (l+1) (1−a (l+1) ) (公式9)
3,第三步,将误差信号从第 l+1 层向第 l 层传播。
∂z (l+1) ∂a (l) =W (l) , ∂z (l+1) ∂W (l) =a (l) , ∂z (l+1) ∂b (l) =I (公式10)
4, 对第 l 层可得 J 对 a (l) 和 z (l) 的偏导数。
δ (a)l = ∂J∂a (l) ={−(y−a (l) ), ∂J∂z (l+1) ∂z (l+1) ∂a (l) =(W (l) ) T δ (z)l+1 ,if l=Lotherwise (公式11)
δ (z)l = ∂J∂z (l) = ∂J∂a (l) ∂a (l) ∂z (l) =δ (a)l a (l) (1−a (l) ) (公式12)
5, 最后可得 J 对第 l 层的参数 W l 和 b l 的梯度:
∇ W (l) J(W,b,x,y)= ∂∂W (l) J= ∂J∂z (l+1) ∂z (l+1) ∂W (l) =δ (z)l+1 (a (l) ) T (公式13)
∇ b (l) J(W,b,x,y)= ∂∂b (l) J= ∂J∂z (l+1) ∂z (l+1) ∂b (l) =δ (z)l+1 (公式14)
后向传播的一般形式
1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:
h θ (x)=(f (L+1) ∘...∘f (l)θ l ∘...∘f (2)θ 2 f (1) )(x) (公式15)
其中 θ 是该神经网络的参数。 f (1) =x , f (L+1) =h θ (x) ,并且对任何一个 l ,相邻两层间函数的导数 ∂f (l+1) ∂f (l) 都是已知的。
2,根据链导法则,求代价函数对任何一个 l 层 J 关于 f (l) 的导数,即通过数值计算将误差信号后向传递到第 l 层。
δ l = ∂∂f (l) J(θ,x,y)= ∂J∂f (l+1) ∂f (l+1) ∂f (l) =δ l+1∂f (l+1) ∂f (l) (公式16)
3,在第 l 层求 J 关于该层参数 θ (l) 的梯度。
∇ θ (l) J(θ,x,y)= ∂∂θ (l) J= ∂J∂f (l) ∂f (l) ∂θ (l) =δ l∂f (l) ∂θ (l) 。(公式17)
其中第 l 层对应的函数关于该层的参数的导数 ∂f (l) ∂θ (l) 是已知的。
4,将所有样本的梯度相加得到总梯度。
∇ θ (l) J(θ)=∑ mi=1 ∇ θ (l) J(θ,x (i) ,y (i) ) (公式17)
对于不同的网络结构,在第2步和第3步中根据具体的 ∂f (l+1) ∂f (l) 和 ∂f (l) ∂θ (l) 就可以求得所有参数的梯度。
卷积神经网络的训练
卷积神经网络(CNN)的结构可阅读上一篇博文。CNN的基本层包括卷积层和池化层,二者通常一起使用,一个池化层紧跟一个卷积层之后。这两层包括三个级联的函数:卷积,求sigmoid函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下:
后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:
卷积函数的导数及后向传播
假设一个卷积层的输入向量是 x ,输出向量是 y , 参数向量(卷积算子)是 w 。从输入到输出的过程为:
y=x∗w (公式18)
y 的长度为 |y|=|x|−|w|+1 。 y 中每一个元素的计算方法为:
y n =(x∗w)[n]=∑ |w|i=1 x n+i−1 w i =w T x n:n+|w|−1 (公式19)
卷积过程的示意图如下:
y 中的元素与 x 中的元素有如下导数关系:
∂y n−i+1 ∂x n =w i , ∂y n ∂w i =x n−i+1 ,for1≤i≤|w|. (公式20)
进一步可以得到 J 关于 w 和 x 的导数:
δ (x)n = ∂J∂y∂y∂x n =∑ |w|i=1∂J∂y n−i+1 ∂y n−i+1 ∂x n =∑ |w|i=1 δ (y)n−i+1 w i =(δ (y) ∗flip(w))[n] (公式21)
δ (x) =δ (y) ∗flip(w) (公式22)
∂∂w i J= ∂J∂y∂y∂w i =∑ |x|−|w|+1n=1∂J∂y n ∂y n ∂w i =∑ |x|−|w|+1n=1 δ (y)n x n+i−1 =(δ (y) ∗x)[i] (公式23)
∂∂w J=δ (y) ∗x (公式24)
因此,通过 δ (y) 与flip( w )的卷积就可得到 J 关于 x 的导数 δ (x) ,通过 δ (y) 与 x 的卷积就可计算出 w 的梯度 ∂∂w J 。
池化函数的导数及后向传播
池化函数是一个下采样函数,对于大小为 m 的池化区域,池化函数及其导数可以定义为:
均值池化: g(x)= ∑ mk=1 x k m , 导数为 ∂g∂x i ={10if x i =max(x)otherwise
p范数池化 g(x)=∥x∥ p =(∑ mk=1 |x k | p ) 1/p , 导数为 ∂g∂x i =(∑ mk=1 |x k | p ) 1/p−1 |x i | p−1
下采样的后向传播过程为上采样,其示意图为:
该后向传播过程就是利用 g 的导数将误差信号传递到 g 的输入。
δ (x)(n−1)m+1:nm = ∂∂x (n−1)m+1:nm J= ∂J∂y n ∂y n ∂x (n−1)m+1:nm =δ (y)n g ′n (公式25)
δ (x) =upsample(δ (y) ,g ′ )=[δ (x)(n−1)m+1:nm ] . (公式26)
有了上述求导公式,就能够将误差信号传递到每一层的输出,再通过每一层的函数对参数的导数,可求得参数的梯度。有了计算梯度的方法,再通过基于梯度的最优化,就能寻得最优值,完成训练过程。