神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:
- 初始化参数。
- 求代价函数关于参数的梯度。
- 根据梯度更新参数的值。
- 经过迭代以后取得最佳参数,从而完成神经网络的训练。
其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。
单个神经元的训练
单个神经元的结构如下图。假设一个训练样本为(x,y)(x,y)。在下图中,xx是输入向量,通过一个激励函数hw,b(x)hw,b(x)得到一个输出aa,aa再通过代价函数得到JJ。
f(W,b,x)=a=sigmoid(∑ixiwi+b)f(W,b,x)=a=sigmoid(∑ixiwi+b) (公式1)
J(W,b,x,y)=12∥y−hw,b(x)∥2J(W,b,x,y)=12‖y−hw,b(x)‖2 (公式2)
这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为WW和bb。
通过定义变量z=∑ixiwi+bz=∑ixiwi+b可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到zz, 第二部分是通过sigmoid得到aa。
训练过程中,要求代价函数JJ关于WW和bb的偏导数。先求JJ关于中间变量aa和zz的偏导:
δ(a)=∂∂aJ(W,b,x,y)=−(y−a)δ(a)=∂∂aJ(W,b,x,y)=−(y−a) (公式3)
δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a)δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a) (公式4)
公式(4)中根据sigmoid函数的定义σ(z)=11+e−zσ(z)=11+e−z可得∂a∂z=a(1−a)∂a∂z=a(1−a)。
再根据链导法则,可以求得JJ关于WW和bb的偏导数,即得WW和bb的梯度。
∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT (公式5)
∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z)∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z) (公式6)
在这个过程中,先求∂J/∂a∂J/∂a,进一步求∂J/∂z∂J/∂z,最后求得∂J/∂W∂J/∂W和∂J/∂b∂J/∂b。结合上图及链导法则,可以看出这是一个将代价函数的增量∂J∂J自后向前传播的过程,因此称为反向传播(back propagation)。
多层神经网络的训练
多层网络的一个例子如下图。
假设第l+1l+1层的输入和输出分别是alal和al+1al+1, 参数为WlWl和blbl,仿射结果为中间变量zlzl。注意第一层的输出a1=xa1=x,为整个网络的输入,最后一层的输出aLaL是代价函数的输入。
zl+1=WlxTl+blzl+1=WlxlT+bl (公式7)
al+1=sigmoid(zl+1)al+1=sigmoid(zl+1) (公式8)
对多层网络的训练需要求代价函数JJ对每一层的参数求偏导。后向传播过程变为:
1,第一步,根据代价函数的定义,求JJ对aLaL的偏导δ(a)LδL(a)。
2,在第l+1l+1层,将误差信号从al+1al+1传递到zl+1zl+1。
∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1))∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1)) (公式9)
3,第三步,将误差信号从第l+1l+1层向第ll层传播。
∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I (公式10)
4, 对第ll层可得JJ对a(l)a(l)和z(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δl(a)=∂J∂a(l)={−(y−a(l)),if l=L∂J∂z(l+1)∂z(l+1)∂a(l)=(W(l))Tδl+1(z),otherwise (公式11)
δ(z)l=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δ(a)la(l)(1−a(l))δl(z)=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δl(a)a(l)(1−a(l)) (公式12)
5, 最后可得JJ对第ll层的参数WlWl和blbl的梯度:
∇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∇W(l)J(W,b,x,y)=∂∂W(l)J=∂J∂z(l+1)∂z(l+1)∂W(l)=δl+1(z)(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∇b(l)J(W,b,x,y)=∂∂b(l)J=∂J∂z(l+1)∂z(l+1)∂b(l)=δl+1(z) (公式14)
后向传播的一般形式
1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:
hθ(x)=(f(L+1)∘...∘f(l)θl∘...∘f(2)θ2f(1))(x)hθ(x)=(f(L+1)∘...∘fθl(l)∘...∘fθ2(2)f(1))(x) (公式15)
其中θθ是该神经网络的参数。f(1)=xf(1)=x, f(L+1)=hθ(x)f(L+1)=hθ(x),并且对任何一个ll,相邻两层间函数的导数∂f(l+1)∂f(l)∂f(l+1)∂f(l)都是已知的。
2,根据链导法则,求代价函数对任何一个ll层JJ关于f(l)f(l)的导数,即通过数值计算将误差信号后向传递到第ll层。
δl=∂∂f(l)J(θ,x,y)=∂J∂f(l+1)∂f(l+1)∂f(l)=δl+1∂f(l+1)∂f(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,在第ll层求JJ关于该层参数θ(l)θ(l)的梯度。
∇θ(l)J(θ,x,y)=∂∂θ(l)J=∂J∂f(l)∂f(l)∂θ(l)=δl∂f(l)∂θ(l)∇θ(l)J(θ,x,y)=∂∂θ(l)J=∂J∂f(l)∂f(l)∂θ(l)=δl∂f(l)∂θ(l)。(公式17)
其中第ll层对应的函数关于该层的参数的导数∂f(l)∂θ(l)∂f(l)∂θ(l)是已知的。
4,将所有样本的梯度相加得到总梯度。
∇θ(l)J(θ)=∑mi=1∇θ(l)J(θ,x(i),y(i))∇θ(l)J(θ)=∑i=1m∇θ(l)J(θ,x(i),y(i)) (公式17)
对于不同的网络结构,在第2步和第3步中根据具体的∂f(l+1)∂f(l)∂f(l+1)∂f(l)和∂f(l)∂θ(l)∂f(l)∂θ(l)就可以求得所有参数的梯度。
卷积神经网络的训练
卷积神经网络(CNN)的结构可阅读上一篇博文。CNN的基本层包括卷积层和池化层,二者通常一起使用,一个池化层紧跟一个卷积层之后。这两层包括三个级联的函数:卷积,求sigmoid函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下:
后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:
卷积函数的导数及后向传播
假设一个卷积层的输入向量是xx,输出向量是yy, 参数向量(卷积算子)是ww。从输入到输出的过程为:
y=x∗wy=x∗w(公式18)
yy的长度为|y|=|x|−|w|+1|y|=|x|−|w|+1。yy中每一个元素的计算方法为:
yn=(x∗w)[n]=∑|w|i=1xn+i−1wi=wTxn:n+|w|−1yn=(x∗w)[n]=∑i=1|w|xn+i−1wi=wTxn:n+|w|−1 (公式19)
卷积过程的示意图如下:
yy中的元素与xx中的元素有如下导数关系:
∂yn−i+1∂xn=wi∂yn−i+1∂xn=wi, ∂yn∂wi=xn−i+1,for1≤i≤|w|.∂yn∂wi=xn−i+1,for1≤i≤|w|. (公式20)
进一步可以得到JJ关于ww和xx的导数:
δ(x)n=∂J∂y∂y∂xn=∑|w|i=1∂J∂yn−i+1∂yn−i+1∂xn=∑|w|i=1δ(y)n−i+1wi=(δ(y)∗flip(w))[n]δn(x)=∂J∂y∂y∂xn=∑i=1|w|∂J∂yn−i+1∂yn−i+1∂xn=∑i=1|w|δn−i+1(y)wi=(δ(y)∗flip(w))[n] (公式21)
δ(x)=δ(y)∗flip(w)δ(x)=δ(y)∗flip(w) (公式22)
∂∂wiJ=∂J∂y∂y∂wi=∑|x|−|w|+1n=1∂J∂yn∂yn∂wi=∑|x|−|w|+1n=1δ(y)nxn+i−1=(δ(y)∗x)[i]∂∂wiJ=∂J∂y∂y∂wi=∑n=1|x|−|w|+1∂J∂yn∂yn∂wi=∑n=1|x|−|w|+1δn(y)xn+i−1=(δ(y)∗x)[i] (公式23)
∂∂wJ=δ(y)∗x∂∂wJ=δ(y)∗x (公式24)
因此,通过δ(y)δ(y)与flip(ww)的卷积就可得到JJ关于xx的导数δ(x)δ(x),通过δ(y)δ(y)与xx的卷积就可计算出ww的梯度∂∂wJ∂∂wJ。
池化函数的导数及后向传播
池化函数是一个下采样函数,对于大小为mm的池化区域,池化函数及其导数可以定义为:
均值池化: g(x)=∑mk=1xkmg(x)=∑k=1mxkm, 导数为 ∂g∂xi={10if xi=max(x)otherwise∂g∂xi={1if xi=max(x)0otherwise
p范数池化 g(x)=∥x∥p=(∑mk=1|xk|p)1/pg(x)=‖x‖p=(∑k=1m|xk|p)1/p, 导数为∂g∂xi=(∑mk=1|xk|p)1/p−1|xi|p−1∂g∂xi=(∑k=1m|xk|p)1/p−1|xi|p−1
下采样的后向传播过程为上采样,其示意图为:
该后向传播过程就是利用gg的导数将误差信号传递到gg的输入。
δ(x)(n−1)m+1:nm=∂∂x(n−1)m+1:nmJ=∂J∂yn∂yn∂x(n−1)m+1:nm=δ(y)ng′nδ(n−1)m+1:nm(x)=∂∂x(n−1)m+1:nmJ=∂J∂yn∂yn∂x(n−1)m+1:nm=δn(y)gn′ (公式25)
δ(x)=upsample(δ(y),g′)=[δ(x)(n−1)m+1:nm]δ(x)=upsample(δ(y),g′)=[δ(n−1)m+1:nm(x)]. (公式26)
有了上述求导公式,就能够将误差信号传递到每一层的输出,再通过每一层的函数对参数的导数,可求得参数的梯度。有了计算梯度的方法,再通过基于梯度的最优化,就能寻得最优值,完成训练过程。
PPT及参考资料:
1,http://www.slideshare.net/kuwajima/cnnbp
2,http://ufldl.stanford.edu/tutorial/
神经网络的训练过程,就是通过已有的样本,求取使代价函数最小化时所对应的参数。代价函数测量的是模型对样本的预测值与其真实值之间的误差,最小化的求解一般使用梯度下降法(Gradient Decent)或其他与梯度有关的方法。其中的步骤包括:
- 初始化参数。
- 求代价函数关于参数的梯度。
- 根据梯度更新参数的值。
- 经过迭代以后取得最佳参数,从而完成神经网络的训练。
其中最重要的步骤就是求梯度,这可以通过反向传播算法(back propagation)来实现。
单个神经元的训练
单个神经元的结构如下图。假设一个训练样本为(x,y)(x,y)。在下图中,xx是输入向量,通过一个激励函数hw,b(x)hw,b(x)得到一个输出aa,aa再通过代价函数得到JJ。
f(W,b,x)=a=sigmoid(∑ixiwi+b)f(W,b,x)=a=sigmoid(∑ixiwi+b) (公式1)
J(W,b,x,y)=12∥y−hw,b(x)∥2J(W,b,x,y)=12‖y−hw,b(x)‖2 (公式2)
这里激励函数以使用sigmoid为例,当然也可以使用其他的比如tanh或者rectived linear unit函数。要求的参数为WW和bb。
通过定义变量z=∑ixiwi+bz=∑ixiwi+b可以将激励函数看做是两部分,如下图右图所示。第一部分是仿射求和得到zz, 第二部分是通过sigmoid得到aa。
训练过程中,要求代价函数JJ关于WW和bb的偏导数。先求JJ关于中间变量aa和zz的偏导:
δ(a)=∂∂aJ(W,b,x,y)=−(y−a)δ(a)=∂∂aJ(W,b,x,y)=−(y−a) (公式3)
δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a)δ(z)=∂∂zJ(W,b,x,y)=∂J∂a∂a∂z=δ(a)a(1−a) (公式4)
公式(4)中根据sigmoid函数的定义σ(z)=11+e−zσ(z)=11+e−z可得∂a∂z=a(1−a)∂a∂z=a(1−a)。
再根据链导法则,可以求得JJ关于WW和bb的偏导数,即得WW和bb的梯度。
∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT∇WJ(W,b,x,y)=∂∂WJ=∂J∂z∂z∂W=δ(z)xT (公式5)
∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z)∇bJ(W,b,x,y)=∂∂bJ=∂J∂z∂z∂b=δ(z) (公式6)
在这个过程中,先求∂J/∂a∂J/∂a,进一步求∂J/∂z∂J/∂z,最后求得∂J/∂W∂J/∂W和∂J/∂b∂J/∂b。结合上图及链导法则,可以看出这是一个将代价函数的增量∂J∂J自后向前传播的过程,因此称为反向传播(back propagation)。
多层神经网络的训练
多层网络的一个例子如下图。
假设第l+1l+1层的输入和输出分别是alal和al+1al+1, 参数为WlWl和blbl,仿射结果为中间变量zlzl。注意第一层的输出a1=xa1=x,为整个网络的输入,最后一层的输出aLaL是代价函数的输入。
zl+1=WlxTl+blzl+1=WlxlT+bl (公式7)
al+1=sigmoid(zl+1)al+1=sigmoid(zl+1) (公式8)
对多层网络的训练需要求代价函数JJ对每一层的参数求偏导。后向传播过程变为:
1,第一步,根据代价函数的定义,求JJ对aLaL的偏导δ(a)LδL(a)。
2,在第l+1l+1层,将误差信号从al+1al+1传递到zl+1zl+1。
∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1))∂a(l+1)∂z(l+1)=a(l+1)(1−a(l+1)) (公式9)
3,第三步,将误差信号从第l+1l+1层向第ll层传播。
∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I∂z(l+1)∂a(l)=W(l),∂z(l+1)∂W(l)=a(l),∂z(l+1)∂b(l)=I (公式10)
4, 对第ll层可得JJ对a(l)a(l)和z(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δl(a)=∂J∂a(l)={−(y−a(l)),if l=L∂J∂z(l+1)∂z(l+1)∂a(l)=(W(l))Tδl+1(z),otherwise (公式11)
δ(z)l=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δ(a)la(l)(1−a(l))δl(z)=∂J∂z(l)=∂J∂a(l)∂a(l)∂z(l)=δl(a)a(l)(1−a(l)) (公式12)
5, 最后可得JJ对第ll层的参数WlWl和blbl的梯度:
∇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∇W(l)J(W,b,x,y)=∂∂W(l)J=∂J∂z(l+1)∂z(l+1)∂W(l)=δl+1(z)(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∇b(l)J(W,b,x,y)=∂∂b(l)J=∂J∂z(l+1)∂z(l+1)∂b(l)=δl+1(z) (公式14)
后向传播的一般形式
1,将整个神经网络加上代价函数的结构看做是一串函数(每一层对应一个函数)级联而成的一个函数,其中的每一个函数的导数都可通过数学表达式解析求得:
hθ(x)=(f(L+1)∘...∘f(l)θl∘...∘f(2)θ2f(1))(x)hθ(x)=(f(L+1)∘...∘fθl(l)∘...∘fθ2(2)f(1))(x) (公式15)
其中θθ是该神经网络的参数。f(1)=xf(1)=x, f(L+1)=hθ(x)f(L+1)=hθ(x),并且对任何一个ll,相邻两层间函数的导数∂f(l+1)∂f(l)∂f(l+1)∂f(l)都是已知的。
2,根据链导法则,求代价函数对任何一个ll层JJ关于f(l)f(l)的导数,即通过数值计算将误差信号后向传递到第ll层。
δl=∂∂f(l)J(θ,x,y)=∂J∂f(l+1)∂f(l+1)∂f(l)=δl+1∂f(l+1)∂f(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,在第ll层求JJ关于该层参数θ(l)θ(l)的梯度。
∇θ(l)J(θ,x,y)=∂∂θ(l)J=∂J∂f(l)∂f(l)∂θ(l)=δl∂f(l)∂θ(l)∇θ(l)J(θ,x,y)=∂∂θ(l)J=∂J∂f(l)∂f(l)∂θ(l)=δl∂f(l)∂θ(l)。(公式17)
其中第ll层对应的函数关于该层的参数的导数∂f(l)∂θ(l)∂f(l)∂θ(l)是已知的。
4,将所有样本的梯度相加得到总梯度。
∇θ(l)J(θ)=∑mi=1∇θ(l)J(θ,x(i),y(i))∇θ(l)J(θ)=∑i=1m∇θ(l)J(θ,x(i),y(i)) (公式17)
对于不同的网络结构,在第2步和第3步中根据具体的∂f(l+1)∂f(l)∂f(l+1)∂f(l)和∂f(l)∂θ(l)∂f(l)∂θ(l)就可以求得所有参数的梯度。
卷积神经网络的训练
卷积神经网络(CNN)的结构可阅读上一篇博文。CNN的基本层包括卷积层和池化层,二者通常一起使用,一个池化层紧跟一个卷积层之后。这两层包括三个级联的函数:卷积,求sigmoid函数(或使用其他激励函数),池化。其前向传播和后向传播的示意图如下:
后向传播需要求得这三个函数的导数。sigmoid函数前面已经讨论过,这里讲一讲其他两个函数的处理:
卷积函数的导数及后向传播
假设一个卷积层的输入向量是xx,输出向量是yy, 参数向量(卷积算子)是ww。从输入到输出的过程为:
y=x∗wy=x∗w(公式18)
yy的长度为|y|=|x|−|w|+1|y|=|x|−|w|+1。yy中每一个元素的计算方法为:
yn=(x∗w)[n]=∑|w|i=1xn+i−1wi=wTxn:n+|w|−1yn=(x∗w)[n]=∑i=1|w|xn+i−1wi=wTxn:n+|w|−1 (公式19)
卷积过程的示意图如下:
yy中的元素与xx中的元素有如下导数关系:
∂yn−i+1∂xn=wi∂yn−i+1∂xn=wi, ∂yn∂wi=xn−i+1,for1≤i≤|w|.∂yn∂wi=xn−i+1,for1≤i≤|w|. (公式20)
进一步可以得到JJ关于ww和xx的导数:
δ(x)n=∂J∂y∂y∂xn=∑|w|i=1∂J∂yn−i+1∂yn−i+1∂xn=∑|w|i=1δ(y)n−i+1wi=(δ(y)∗flip(w))[n]δn(x)=∂J∂y∂y∂xn=∑i=1|w|∂J∂yn−i+1∂yn−i+1∂xn=∑i=1|w|δn−i+1(y)wi=(δ(y)∗flip(w))[n] (公式21)
δ(x)=δ(y)∗flip(w)δ(x)=δ(y)∗flip(w) (公式22)
∂∂wiJ=∂J∂y∂y∂wi=∑|x|−|w|+1n=1∂J∂yn∂yn∂wi=∑|x|−|w|+1n=1δ(y)nxn+i−1=(δ(y)∗x)[i]∂∂wiJ=∂J∂y∂y∂wi=∑n=1|x|−|w|+1∂J∂yn∂yn∂wi=∑n=1|x|−|w|+1δn(y)xn+i−1=(δ(y)∗x)[i] (公式23)
∂∂wJ=δ(y)∗x∂∂wJ=δ(y)∗x (公式24)
因此,通过δ(y)δ(y)与flip(ww)的卷积就可得到JJ关于xx的导数δ(x)δ(x),通过δ(y)δ(y)与xx的卷积就可计算出ww的梯度∂∂wJ∂∂wJ。
池化函数的导数及后向传播
池化函数是一个下采样函数,对于大小为mm的池化区域,池化函数及其导数可以定义为:
均值池化: g(x)=∑mk=1xkmg(x)=∑k=1mxkm, 导数为 ∂g∂xi={10if xi=max(x)otherwise∂g∂xi={1if xi=max(x)0otherwise
p范数池化 g(x)=∥x∥p=(∑mk=1|xk|p)1/pg(x)=‖x‖p=(∑k=1m|xk|p)1/p, 导数为∂g∂xi=(∑mk=1|xk|p)1/p−1|xi|p−1∂g∂xi=(∑k=1m|xk|p)1/p−1|xi|p−1
下采样的后向传播过程为上采样,其示意图为:
该后向传播过程就是利用gg的导数将误差信号传递到gg的输入。
δ(x)(n−1)m+1:nm=∂∂x(n−1)m+1:nmJ=∂J∂yn∂yn∂x(n−1)m+1:nm=δ(y)ng′nδ(n−1)m+1:nm(x)=∂∂x(n−1)m+1:nmJ=∂J∂yn∂yn∂x(n−1)m+1:nm=δn(y)gn′ (公式25)
δ(x)=upsample(δ(y),g′)=[δ(x)(n−1)m+1:nm]δ(x)=upsample(δ(y),g′)=[δ(n−1)m+1:nm(x)]. (公式26)
有了上述求导公式,就能够将误差信号传递到每一层的输出,再通过每一层的函数对参数的导数,可求得参数的梯度。有了计算梯度的方法,再通过基于梯度的最优化,就能寻得最优值,完成训练过程。
PPT及参考资料:
1,http://www.slideshare.net/kuwajima/cnnbp
2,http://ufldl.stanford.edu/tutorial/
转自:http://blog.csdn.net/taigw/article/details/50612963