1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征,建立了单个神经元的数学模型(MP模型)
实际上没啥依据
1957年,Frank Rosenblatt从纯数学的度重新考察这一模型,指出能够从一些输入输出对 中通过学习算法获得权重 w \boldsymbol{w} w和 b b b 。(这被认为是第一个机器学习算法,SVM是90年代的算法)
问题:给定一些输入输出对 ( x , y ) (\boldsymbol{x},y) (x,y),其中 y = ± 1 y=\pm 1 y=±1,求一个函数,使: f ( x ) = y f\left( \boldsymbol{x} \right) =y f(x)=y
感知机算法:设定 f ( x ) = s i g n ( w T x + b ) f\left( \boldsymbol{x} \right) =sign\left( \boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b \right) f(x)=sign(wTx+b),从一堆输入输出中自动学习,获得权重 w \boldsymbol{w} w和 b b b 。
感知器算法(Perceptron Algorithm):
对于样本数据 ( x , y ) (\boldsymbol{x},y) (x,y)
关于调整 w \boldsymbol{w} w和 b b b 的一点点直观的解释:(和梯度下降法推导出来的不同,这里是原论文的方法,比较naive)
若 w T x + b > 0 \boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b>0 wTx+b>0且 y = − 1 y=-1 y=−1,则: w = w − x , b = b − 1 \boldsymbol{w}=\boldsymbol{w}-\boldsymbol{x},b=b-1 w=w−x,b=b−1,于是有:
w 新 T x + b 新 = ( w − x ) T x + b − 1 = ( w T x + b ) − ( ∥ x ∥ 2 + 1 ) \boldsymbol{w}_{\text{新}}^{T}\boldsymbol{x}+b_{\text{新}}=\left( \boldsymbol{w}-\boldsymbol{x} \right) ^T\boldsymbol{x}+b-1=\left( \boldsymbol{w}^T\boldsymbol{x}+b \right) -\left( \lVert \boldsymbol{x} \rVert ^2+1 \right) w新Tx+b新=(w−x)Tx+b−1=(wTx+b)−(∥x∥2+1)
( ∥ x ∥ 2 + 1 ) \left( \lVert \boldsymbol{x} \rVert ^2+1 \right) (∥x∥2+1)是大于1的正数,它会把 w T x + b \boldsymbol{w}^T\boldsymbol{x}+b wTx+b往负的方向调整。
w T x + b < 0 \boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b<0 wTx+b<0时同理
Frank Rosenblatt从数学上证明了,若数据集线性可分,那么以上的算法一定会收敛,下图是感知机在二维特征空间画出的一条直线
注意,感知机画出的直线与SVM有很大不同。感知机画出的直线只是做到了划分正负样本,而没有像SVM那样有最大的margin(毕竟SVM是90年代的东西,感知机早了将近半个世纪)
刚刚我们提到了,Frank Rosenblatt从数学上证明了,若数据集线性可分,那么感知机算法一定会收敛。下面我们加以证明:
首先,为下面证明过程书写方便,
定义增广矩阵 X \boldsymbol{X} X:
定义增广矩阵 W = [ w b ] \boldsymbol{W}=\left[ \begin{array}{c} \boldsymbol{w}\\ b\\ \end{array} \right] W=[wb]
然后我们重写感知机算法:
对于样本数据 X \boldsymbol{X} X
感知机算法收敛定理:
若样本数据集 { X i } i ∼ N \left\{ \boldsymbol{X}_i \right\} _{i\sim N} {Xi}i∼N线性可分,即 ∃ W o p t \exists \boldsymbol{W}_{opt} ∃Wopt,使
W o p t T X i > 0 ( i = 1 ∼ N ) \boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i>0 \left( i=1\sim N \right) WoptTXi>0(i=1∼N)
则利用上述感知机算法,经过有限步后,得到一个 W \boldsymbol{W} W,使
W T X i > 0 ( i = 1 ∼ N ) \boldsymbol{W}^{T}\boldsymbol{X}_i>0 \left( i=1\sim N \right) WTXi>0(i=1∼N)
proof:不失一般性,设 ∥ W o p t ∥ = 1 \lVert \boldsymbol{W}_{opt} \rVert =1 ∥Wopt∥=1,假设第k步时的 W \boldsymbol{W} W是 W ( k ) \boldsymbol{W}(k) W(k),且有一个 X i \boldsymbol{X_i} Xi使得 W ( k ) T X i < 0 \boldsymbol{W}(k)^{\boldsymbol{T}}\boldsymbol{X_i}<0 W(k)TXi<0。根据感知机算法可以推导出:
W ( k + 1 ) = W ( k ) + X i → ∥ W ( k + 1 ) − a W o p t ∥ 2 = ∥ W ( k ) − a W o p t + X i ∥ 2 ∥ W ( k ) − a W o p t + X i ∥ 2 = ∥ W ( k ) − a W o p t ∥ 2 + ∥ X i ∥ 2 + 2 W ( k ) T X i − 2 a W o p t T X i \boldsymbol{W}\left( k+1 \right) =\boldsymbol{W}\left( k \right) +\boldsymbol{X}_{\boldsymbol{i}}\rightarrow \lVert \boldsymbol{W}\left( k+1 \right) -a\boldsymbol{W}_{opt} \rVert ^2=\lVert \boldsymbol{W}\left( k \right) -a\boldsymbol{W}_{opt}+\boldsymbol{X}_{\boldsymbol{i}} \rVert ^2 \\ \lVert \boldsymbol{W}\left( k \right) -a\boldsymbol{W}_{opt}+\boldsymbol{X}_{\boldsymbol{i}} \rVert ^2=\lVert \boldsymbol{W}\left( k \right) -a\boldsymbol{W}_{opt} \rVert ^2+\lVert \boldsymbol{X}_{\boldsymbol{i}} \rVert ^2+2\boldsymbol{W}\left( k \right) ^T\boldsymbol{X}_{\boldsymbol{i}}-2a\boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i W(k+1)=W(k)+Xi→∥W(k+1)−aWopt∥2=∥W(k)−aWopt+Xi∥2∥W(k)−aWopt+Xi∥2=∥W(k)−aWopt∥2+∥Xi∥2+2W(k)TXi−2aWoptTXi注意到 W ( k ) T X i < 0 \boldsymbol{W}\left( k \right)^T\boldsymbol{X}_{\boldsymbol{i}}<0 W(k)TXi<0以及 W o p t T X i > 0 \boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i>0 WoptTXi>0,则一定可以取很大的 a a a,使得
∥ W ( k + 1 ) − a W o p t ∥ 2 < ∥ W ( k ) − a W o p t ∥ 2 \lVert \boldsymbol{W}\left( k+1 \right) -a\boldsymbol{W}_{opt} \rVert ^2<\lVert \boldsymbol{W}\left( k \right) -a\boldsymbol{W}_{opt} \rVert ^2 ∥W(k+1)−aWopt∥2<∥W(k)−aWopt∥2
定义: β = max i = 1 ∼ N { ∥ X i ∥ } , γ = min i = 1 ∼ N { W o p t T X i } \beta =\underset{i=1\sim N}{\max}\left\{ \lVert \boldsymbol{X}_i \rVert \right\} , \gamma =\underset{i=1\sim N}{\min}\left\{ \boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i \right\} β=i=1∼Nmax{∥Xi∥},γ=i=1∼Nmin{WoptTXi},取 a = β 2 + 1 2 γ a=\frac{\beta ^2+1}{2\gamma} a=2γβ2+1,则
∥ W ( k + 1 ) − a W o p t ∥ 2 < ∥ W ( k ) − a W o p t ∥ 2 − 1 \lVert \boldsymbol{W}\left( k+1 \right) -a\boldsymbol{W}_{opt} \rVert ^2<\lVert \boldsymbol{W}\left( k \right) -a\boldsymbol{W}_{opt} \rVert ^2-1 ∥W(k+1)−aWopt∥2<∥W(k)−aWopt∥2−1
取 D = ∥ W ( 0 ) − a W o p t ∥ D=\lVert \boldsymbol{W}\left( 0 \right) -a\boldsymbol{W}_{opt} \rVert D=∥W(0)−aWopt∥,则至多经过 D 2 D^2 D2步, W \boldsymbol{W} W将会收敛至 a W o p t a\boldsymbol{W}_{opt} aWopt(注意是在条件 W ( k ) T X i < 0 \boldsymbol{W}(k)^{\boldsymbol{T}}\boldsymbol{X_i}<0 W(k)TXi<0下,才有 W \boldsymbol{W} W将会收敛至 a W o p t a\boldsymbol{W}_{opt} aWopt,而通常情况下这个条件很快就会消失。这个证明的意思是,若数据线性可分,并且很难线性划分, W o p t \boldsymbol{W}_{opt} Wopt几乎是唯一划分的选择,那么感知机最终也会收敛到 W o p t \boldsymbol{W}_{opt} Wopt这个决策平面)
1969年,Minsky指出了感知机没办法处理非线性可分的数据,在日常生活中很多分类问题是非线性的,人工智能进入了第一次冬天。
在80年代,人们创造了多层神经网络(Multiple Layer Neural Networks),从而可以实现对非线性可分数据集的分类,人工智能从新复苏。
下面是一个两层神经网络的例子:
若$\varphi\left( \cdot \right) $为线性函数,则多层神经网络和单层没有区别
定理:当 φ ( x ) = u ( x ) \varphi\left( x \right)=u(x) φ(x)=u(x)(即阶跃函数)时,三层网络可以模拟任意决策面
反向传播算法(Back Propogation Algorithm):从后往前计算各个参数的偏导数,然后使用梯度下降法对模型进行训练,最终达到收敛。
以上图为例:
首先定义误差函数: E = 1 2 ( y − Y ) 2 E=\frac{1}{2}\left( y-Y \right) ^2 E=21(y−Y)2,其中 y y y为前向传播计算出的模型输出, Y Y Y为数据标签,优化目标为最小化 E E E
模型中代求的偏导数为:
∂ E ∂ w 1 = d E d y ∂ y ∂ w 1 = ( y − Y ) z 1 ∂ E ∂ w 2 = d E d y ∂ y ∂ w 2 = ( y − Y ) z 2 ∂ E ∂ w 11 = d E d y ∂ y ∂ z 1 d z 1 d a 1 ∂ a 1 ∂ ω 11 = ( y − Y ) ω 1 φ ′ ( a 1 ) x 1 ∂ E ∂ w 12 = d E d y ∂ y ∂ z 1 d z 1 d a 1 ∂ a 1 ∂ ω 12 = ( y − Y ) ω 1 φ ′ ( a 1 ) x 2 ∂ E ∂ w 21 = d E d y ∂ y ∂ z 2 d z 2 d a 2 ∂ a 2 ∂ ω 21 = ( y − Y ) ω 2 φ ′ ( a 2 ) x 1 ∂ E ∂ w 22 = d E d y ∂ y ∂ z 2 d z 2 d a 2 ∂ a 2 ∂ ω 22 = ( y − Y ) ω 2 φ ′ ( a 2 ) x 2 ∂ E ∂ b 1 = d E d y ∂ y ∂ z 1 d z 1 d a 1 ∂ a 1 ∂ b 1 = ( y − Y ) ω 1 φ ′ ( a 1 ) ∂ E ∂ b 2 = d E d y ∂ y ∂ z 2 d z 2 d a 2 ∂ a 2 ∂ b 2 = ( y − Y ) ω 2 φ ′ ( a 2 ) ∂ E ∂ b 3 = d E d y ∂ y ∂ b 3 = ( y − Y ) \begin{aligned} &\frac{\partial E}{\partial w_1}=\frac{dE}{dy}\frac{\partial y}{\partial w_1}=\left( y-Y \right) z_1 \\ &\frac{\partial E}{\partial w_2}=\frac{dE}{dy}\frac{\partial y}{\partial w_2}=\left( y-Y \right) z_2 \\ &\frac{\partial E}{\partial w_{11}}=\frac{dE}{dy}\frac{\partial y}{\partial z_1}\frac{dz_1}{da_1}\frac{\partial a_1}{\partial \omega _{11}}=\left( y-Y \right) \omega _1\varphi '\left( a_1 \right) x_1 \\ &\frac{\partial E}{\partial w_{12}}=\frac{dE}{dy}\frac{\partial y}{\partial z_1}\frac{dz_1}{da_1}\frac{\partial a_1}{\partial \omega _{12}}=\left( y-Y \right) \omega _1\varphi '\left( a_1 \right) x_2 \\ &\frac{\partial E}{\partial w_{21}}=\frac{dE}{dy}\frac{\partial y}{\partial z_2}\frac{dz_2}{da_2}\frac{\partial a_2}{\partial \omega _{21}}=\left( y-Y \right) \omega _2\varphi '\left( a_2 \right) x_1 \\ &\frac{\partial E}{\partial w_{22}}=\frac{dE}{dy}\frac{\partial y}{\partial z_2}\frac{dz_2}{da_2}\frac{\partial a_2}{\partial \omega _{22}}=\left( y-Y \right) \omega _2\varphi '\left( a_2 \right) x_2 \\ &\frac{\partial E}{\partial b_1}=\frac{dE}{dy}\frac{\partial y}{\partial z_1}\frac{dz_1}{da_1}\frac{\partial a_1}{\partial b_1}=\left( y-Y \right) \omega _1\varphi '\left( a_1 \right) \\ &\frac{\partial E}{\partial b_2}=\frac{dE}{dy}\frac{\partial y}{\partial z_2}\frac{dz_2}{da_2}\frac{\partial a_2}{\partial b_2}=\left( y-Y \right) \omega _2\varphi '\left( a_2 \right) \\ &\frac{\partial E}{\partial b_3}=\frac{dE}{dy}\frac{\partial y}{\partial b_3}=\left( y-Y \right) \end{aligned} ∂w1∂E=dydE∂w1∂y=(y−Y)z1∂w2∂E=dydE∂w2∂y=(y−Y)z2∂w11∂E=dydE∂z1∂yda1dz1∂ω11∂a1=(y−Y)ω1φ′(a1)x1∂w12∂E=dydE∂z1∂yda1dz1∂ω12∂a1=(y−Y)ω1φ′(a1)x2∂w21∂E=dydE∂z2∂yda2dz2∂ω21∂a2=(y−Y)ω2φ′(a2)x1∂w22∂E=dydE∂z2∂yda2dz2∂ω22∂a2=(y−Y)ω2φ′(a2)x2∂b1∂E=dydE∂z1∂yda1dz1∂b1∂a1=(y−Y)ω1φ′(a1)∂b2∂E=dydE∂z2∂yda2dz2∂b2∂a2=(y−Y)ω2φ′(a2)∂b3∂E=dydE∂b3∂y=(y−Y)
上面是一个小例子以帮助理解。
下面我们对反向传播算法进行向量化,并得到他的一般形式:
首先给出神经网络的向量化数学表达式
这是神经网络的第一层,记输入为 x \boldsymbol{x} x, x \boldsymbol{x} x是一个 N × 1 N\times 1 N×1向量, N N N是输入特征的维数。
w ( 1 ) \boldsymbol{w}^{\left( 1 \right)} w(1)为第一层的参数矩阵:
w ( 1 ) = [ w 11 ( 1 ) w 12 ( 1 ) ⋯ w 1 N ( 1 ) w 21 ( 1 ) w 22 ( 1 ) ⋯ w 2 N ( 1 ) ⋮ ⋮ w M 1 ( 1 ) w M 2 ( 1 ) ⋯ w M N ( 1 ) ] \boldsymbol{w}^{\left( 1 \right)}=\left[ \begin{matrix} w_{11}^{\left( 1 \right)}& w_{12}^{\left( 1 \right)}& \cdots& w_{1N}^{\left( 1 \right)}\\ w_{21}^{\left( 1 \right)}& w_{22}^{\left( 1 \right)}& \cdots& w_{2N}^{\left( 1 \right)}\\ \vdots& & & \vdots\\ w_{M1}^{\left( 1 \right)}& w_{M2}^{\left( 1 \right)}& \cdots& w_{MN}^{\left( 1 \right)}\\ \end{matrix} \right] w(1)=⎣⎢⎢⎢⎢⎡w11(1)w21(1)⋮wM1(1)w12(1)w22(1)wM2(1)⋯⋯⋯w1N(1)w2N(1)⋮wMN(1)⎦⎥⎥⎥⎥⎤
则有:
x ⇒ w ( 1 ) x + b ( 1 ) = z ( 1 ) → φ a ( 1 ) = φ ( z ( 1 ) ) \boldsymbol{x}\Rightarrow \boldsymbol{w}^{\left( 1 \right)}\boldsymbol{x}+\boldsymbol{b}^{\left( 1 \right)}=\boldsymbol{z}^{\left( 1 \right)}\xrightarrow{\varphi}\boldsymbol{a}^{\left( 1 \right)}=\varphi \left( \boldsymbol{z}^{\left( 1 \right)} \right) x⇒w(1)x+b(1)=z(1)φa(1)=φ(z(1))
关于维数和上下标的说明: b \boldsymbol{b} b, z \boldsymbol{z} z和 a \boldsymbol{a} a都是列向量,维数取决于这一层的行数,比如上图第一层有M个神经元,则 b ( 1 ) \boldsymbol{b}^{(1)} b(1), z ( 1 ) \boldsymbol{z}^{(1)} z(1)和 a ( 1 ) \boldsymbol{a}^{(1)} a(1)都是M维列向量;上标表示第几层,下标表示连接关系。例如 w i j ( k ) \boldsymbol{w}^{\left( k \right)}_{ij} wij(k)表示第 ( k − 1 ) (k-1) (k−1)层的第 j j j个输出到第 ( k ) (k) (k)层的第 i i i个神经元的参数。
PS: x = a ( 0 ) \boldsymbol{x}=\boldsymbol{a}^{\left( 0 \right)} x=a(0)
那么多层神经网络就是上面的重复级联,每一层的行数不一定相等。为方便表示,我们默认一共有 l l l层,则:
x ⇒ w ( 1 ) x + b ( 1 ) = z ( 1 ) → φ a ( 1 ) ⇒ w ( 2 ) a ( 1 ) + b ( 2 ) = z ( 2 ) → φ a ( 2 ) ⇒ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ → φ a ( l − 1 ) ⇒ w ( l ) a ( l − 1 ) + b ( l ) = z ( l ) → φ a ( l ) = y \begin{aligned} \boldsymbol{x}&\Rightarrow \boldsymbol{w}^{\left( 1 \right)}\boldsymbol{x}+\boldsymbol{b}^{\left( 1 \right)}=\boldsymbol{z}^{\left( 1 \right)}\xrightarrow{\varphi}\boldsymbol{a}^{\left( 1 \right)} \\ &\Rightarrow \boldsymbol{w}^{\left( 2 \right)}\boldsymbol{a}^{\left( 1 \right)}+\boldsymbol{b}^{\left( 2 \right)}=\boldsymbol{z}^{\left( 2 \right)}\xrightarrow{\varphi}\boldsymbol{a}^{\left( 2 \right)} \\ &\Rightarrow \cdots \cdots \cdots \cdots \cdots \cdots\cdots \xrightarrow{\varphi} \boldsymbol{a}^{\left( l-1 \right)} \\ &\Rightarrow \boldsymbol{w}^{\left( l \right)}\boldsymbol{a}^{\left( l-1 \right)}+\boldsymbol{b}^{\left( l \right)}=\boldsymbol{z}^{\left( l \right)}\xrightarrow{\varphi}\boldsymbol{a}^{\left( l \right)}=\boldsymbol{y} \end{aligned} x⇒w(1)x+b(1)=z(1)φa(1)⇒w(2)a(1)+b(2)=z(2)φa(2)⇒⋯⋯⋯⋯⋯⋯⋯φa(l−1)⇒w(l)a(l−1)+b(l)=z(l)φa(l)=y
为方便计算,我们定义: δ i ( m ) = ∂ E ∂ z i ( m ) \delta _{i}^{\left( m \right)}=\frac{\partial E}{\partial z_{i}^{\left( m \right)}} δi(m)=∂zi(m)∂E
最后一层 ( m = l ) (m=l) (m=l)
δ i ( l ) = ∂ E ∂ z i ( l ) = ∂ E ∂ y i ∂ y i ∂ z i ( l ) = ( y i − Y i ) φ ′ ( z i ( l ) ) \begin{aligned} \delta _{i}^{\left( l \right)}&=\frac{\partial E}{\partial z_{i}^{\left( l \right)}}=\frac{\partial E}{\partial y_i}\frac{\partial y_i}{\partial z_{i}^{\left( l \right)}} \\ &=\left( y_i-Y_i \right) \varphi '\left( z_{i}^{\left( l \right)} \right) \end{aligned} δi(l)=∂zi(l)∂E=∂yi∂E∂zi(l)∂yi=(yi−Yi)φ′(zi(l))
非最后一层 ( m = 1 ∼ l − 1 ) (m=1\sim l-1) (m=1∼l−1)
δ i ( m ) = ∂ E ∂ z i ( m ) = ∂ E ∂ a i ( m ) ∂ a i ( m ) ∂ z i ( m ) = ( ∑ j = 1 S m + 1 ∂ E ∂ a i ( m + 1 ) ) φ ′ ( z i ( m ) ) = ( ∑ j = 1 S m + 1 w j i ( m + 1 ) δ j ( m + 1 ) ) φ ′ ( z i ( m ) ) \begin{aligned} \delta _{i}^{\left( m \right)}&=\frac{\partial E}{\partial z_{i}^{\left( m \right)}}=\frac{\partial E}{\partial a_{i}^{\left( m \right)}}\frac{\partial a_{i}^{\left( m \right)}}{\partial z_{i}^{\left( m \right)}} \\ &=\left( \sum_{j=1}^{S_{m+1}}{\frac{\partial E}{\partial a_{i}^{\left( m+1 \right)}}} \right) \varphi '\left( z_{i}^{\left( m \right)} \right) \\ &=\left( \sum_{j=1}^{S_{m+1}}{w_{ji}^{\left( m+1 \right)}\delta _{j}^{\left( m+1 \right)}} \right) \varphi '\left( z_{i}^{\left( m \right)} \right) \end{aligned} δi(m)=∂zi(m)∂E=∂ai(m)∂E∂zi(m)∂ai(m)=(j=1∑Sm+1∂ai(m+1)∂E)φ′(zi(m))=(j=1∑Sm+1wji(m+1)δj(m+1))φ′(zi(m))
这就是反向传播算法的名词由来,先计算最后的偏导数,再逐层向前推进
计算出 δ i ( m ) \delta _{i}^{\left( m \right)} δi(m)后,可以很方便计算出:
∂ E ∂ w i j ( m ) = ∂ E ∂ z i ( m ) ∂ z i ( m ) ∂ w i j ( m ) = δ i ( m ) a j ( m − 1 ) ∂ E ∂ b i ( m ) = ∂ E ∂ z i ( m ) ∂ z i ( m ) ∂ b i ( m ) = ∂ E ∂ z i ( m ) = δ i ( m ) \begin{aligned} &\frac{\partial E}{\partial w_{ij}^{\left( m \right)}}=\frac{\partial E}{\partial z_{i}^{\left( m \right)}}\frac{\partial z_{i}^{\left( m \right)}}{\partial w_{ij}^{\left( m \right)}}=\delta _{i}^{\left( m \right)}a_{j}^{\left( m-1 \right)} \\ &\frac{\partial E}{\partial b_{i}^{\left( m \right)}}=\frac{\partial E}{\partial z_{i}^{\left( m \right)}}\frac{\partial z_{i}^{\left( m \right)}}{\partial b_{i}^{\left( m \right)}}=\frac{\partial E}{\partial z_{i}^{\left( m \right)}}=\delta _{i}^{\left( m \right)} \end{aligned} ∂wij(m)∂E=∂zi(m)∂E∂wij(m)∂zi(m)=δi(m)aj(m−1)∂bi(m)∂E=∂zi(m)∂E∂bi(m)∂zi(m)=∂zi(m)∂E=δi(m)
BP算法:
随机初始化 ( w , b ) \left( \boldsymbol{w},\boldsymbol{b} \right) (w,b)
训练样本 ( x , Y ) \left( \boldsymbol{x},\boldsymbol{Y} \right) (x,Y),输入网络前向传播可求出所有的 ( z , a , y ) \left( \boldsymbol{z},\boldsymbol{a},\boldsymbol{y} \right) (z,a,y)
通过上述迭代方法计算出 ( ∂ E ∂ w i j ( m ) , ∂ E ∂ b i ( m ) ) \left( \frac{\partial E}{\partial w_{ij}^{\left( m \right)}},\frac{\partial E}{\partial b_{i}^{\left( m \right)}} \right) (∂wij(m)∂E,∂bi(m)∂E)
更新:
w ( 新 ) = w ( 旧 ) − α ∂ E ∂ w ∣ w ( 旧 ) b ( 新 ) = b ( 旧 ) − α ∂ E ∂ b ∣ b ( 旧 ) \begin{aligned} &\boldsymbol{w}^{\left( \text{新} \right)}=\boldsymbol{w}^{\left( \text{旧} \right)}-\alpha \frac{\partial E}{\partial \boldsymbol{w}}\mid_{\boldsymbol{w}^{\left( \text{旧} \right)}}^{} \\ &\boldsymbol{b}^{\left( \text{新} \right)}=\boldsymbol{b}^{\left( \text{旧} \right)}-\alpha \frac{\partial E}{\partial \boldsymbol{b}}\mid_{\boldsymbol{b}^{\left( \text{旧} \right)}} \end{aligned} w(新)=w(旧)−α∂w∂E∣w(旧)b(新)=b(旧)−α∂b∂E∣b(旧)
回到(2),跳出循环条件: ( ∂ E ∂ w i j ( m ) , ∂ E ∂ b i ( m ) ) \left( \frac{\partial E}{\partial w_{ij}^{\left( m \right)}},\frac{\partial E}{\partial b_{i}^{\left( m \right)}} \right) (∂wij(m)∂E,∂bi(m)∂E)足够小,或者 E E E足够小
这是通过反向传播算法(BP算法)训练多层神经网络的基本方法,但是训练多层神经网络特别是深层神经网络是个错综复杂的问题,下面会讨论到。
若使用感知机的激活函数 φ ( x ) = u ( x ) \varphi\left( x \right)=u(x) φ(x)=u(x),则 φ ′ ( x ) ≡ 0 \varphi '\left( x \right) \equiv 0 φ′(x)≡0(不考虑奇异函数,在x=0不可导就当x=0无定义)
由于 φ ′ ( x ) ≡ 0 \varphi '\left( x \right) \equiv 0 φ′(x)≡0导致使用反向传播算法计算出来的关于各个参数的偏导数为0,则没有办法用梯度下降法优化模型,因此必须更换激活函数 φ ( ⋅ ) \varphi\left( \cdot \right) φ(⋅)
sigmoid函数是阶跃函数的模拟,并且做到了处处可导。
φ ( x ) = 1 1 + e − x φ ′ ( x ) = φ ( x ) [ 1 − φ ( x ) ] \varphi \left( x \right) =\frac{1}{1+e^{-x}} \\ \varphi '\left( x \right) =\varphi \left( x \right) \left[ 1-\varphi \left( x \right) \right] φ(x)=1+e−x1φ′(x)=φ(x)[1−φ(x)]
tanh函数
φ ( x ) = tanh ( x ) = e x − e − x e x + e − x φ ′ ( x ) = 1 − φ 2 ( x ) \varphi \left( x \right) =\tanh \left( x \right) =\frac{e^x-e^{-x}}{e^x+e^{-x}} \\ \varphi '\left( x \right) =1-\varphi ^2\left( x \right) φ(x)=tanh(x)=ex+e−xex−e−xφ′(x)=1−φ2(x)
以上的激活函数都有一个问题,就是在x远离原点处的导数为0,这在深度网络的反向传播中通常会出现梯度消失(弥散)的现象,导致深层网络难以训练的问题。因此在深度学习出现以后,常常采用以下激活函数。
ReLU函数
修正线性单元(Rectify Linear Units)
φ ( x ) = { x , x > 0 0 , x ⩽ 0 = max { 0 , x } φ ′ ( x ) = { 1 , x > 0 0 , x < 0 \varphi \left( x \right) =\begin{cases} x, x>0\\ 0, x\leqslant 0\\ \end{cases}=\max \left\{ 0,x \right\} \\ \varphi '\left( x \right) =\begin{cases} 1, x>0\\ 0, x< 0\\ \end{cases} φ(x)={x,x>00,x⩽0=max{0,x}φ′(x)={1,x>00,x<0
在x>0时的梯度弥散现象得到解决,但x<0时仍然存在梯度弥散现象
随机梯度(Stochastic Gradient Descent, SGD)
标准差 s t d std std也可以用 ( m a x − m i n ) (max-min) (max−min)来代替
梯度消失现象:如果 w T x + b \boldsymbol{w}^T\boldsymbol{x}+b wTx+b一开始很大或很小,那么梯度将趋近于0,反向传播后前面与之相关的梯度也趋近于0,导致训练缓慢。 因此,我们要使 w T x + b \boldsymbol{w}^T\boldsymbol{x}+b wTx+b一开始在零附近。
一种比较简单有效的方法是: ( w , b ) (\boldsymbol{w},b) (w,b)初始化从区间 ( − 1 d , 1 d ) \left( -\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}} \right) (−d1,d1)均匀随机取值。其中 d d d为 ( w , b ) (\boldsymbol{w},b) (w,b)所在层的神经元个数。
可以证明,如果 x \boldsymbol{x} x服从正态分布,均值0,方差1,且各个维度无关,而 ( w , b ) (\boldsymbol{w},b) (w,b)是 ( − 1 d , 1 d ) \left( -\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}} \right) (−d1,d1)的均匀分布,则 w T x + b \boldsymbol{w}^T\boldsymbol{x}+b wTx+b是均值为0, 方差为1/3的正态分布。
参数初始化是一个研究热点领域
论文:Batch normalization accelerating deep network training by reducing internal covariate shift (2015)
基本思想:既然我们希望每一层获得的值都在0附近,从而避免梯度消失现象,那么我们为什么不直接把每一层的值做基于均值和方差的归一化呢?
对 γ \gamma γ和 β \beta β的说明:以sigmoid和tanh为例,若归一化后的样本过于聚集在0附近,则激活函数对外表现出几乎的线性,这是我们不希望看到的。因此增加了 γ \gamma γ和 β \beta β两个待学习的参数,使归一化在避免梯度消失和失去非线性中权衡。
可加正则项 (Regulation Term)
L ( w ) = F ( w ) + R ( w ) = 1 2 ( ∑ i = 1 b a t c h s i z e ∥ y i − Y i ∥ 2 + β ∑ k ∑ l w k , l 2 ) L\left( w \right) =F\left( w \right) +R\left( w \right) =\frac{1}{2}\left( \sum_{i=1}^{batchsize}{\lVert y_i-Y_i \rVert ^2+\beta \sum_k^{}{\sum_l^{}{w_{k,l}^{2}}}} \right) \\ L(w)=F(w)+R(w)=21(i=1∑batchsize∥yi−Yi∥2+βk∑l∑wk,l2)
如果是分类问题, F ( w ) F(w) F(w)可以采用Softmax函数和交叉熵的组合
(a)Softmax函数
q i = exp ( z i ) ∑ j = 1 N exp ( z j ) , ∑ i = 1 N q i = 1 q_i=\frac{\exp \left( z_i \right)}{\sum_{j=1}^N{\exp \left( z_j \right)}},\sum_{i=1}^N{q_i}=1 qi=∑j=1Nexp(zj)exp(zi),i=1∑Nqi=1
(b)交叉熵(Cross Entropy)
E = − ∑ i = 1 N Y i log ( y i ) E=-\sum_{i=1}^N{Y_i\log \left( y_i \right)} E=−i=1∑NYilog(yi)
交叉熵可以作为误差函数,上面我们使用的误差函数为MSE,即 E = 1 2 ∑ i = 1 N ∥ y i − Y i ∥ 2 E=\frac{1}{2}\sum_{i=1}^N{\lVert y_i-Y_i \rVert ^2} E=21∑i=1N∥yi−Yi∥2。对于交叉熵,当 p p p和 q q q的分布越相近时, E E E的值越小。
综上,我们可以使用Softmax函数和交叉熵的组合作为目标函数:
E = − ∑ i = 1 N p i log ( q i ) E=-\sum_{i=1}^N{p_i\log \left( q_i \right)} E=−i=1∑Npilog(qi)
并且它的求导将会有非常简单的形式: ∂ E ∂ z i = q i − p i \frac{\partial E}{\partial z_i}=q_i-p_i ∂zi∂E=qi−pi
nn.W{k} = nn.W{k} - nn.learning_rate*nn.W_grad{k};
nn.b{k} = nn.b{k} - nn.learning_rate*nn.b_grad{k};
SGD的问题:
(1) ( w , b ) (\boldsymbol{w},b) (w,b)的每一个分量获得的梯度绝对值有大有小,一些情况下,将会迫使优化路径变成Z字形状
(2)SGD求梯度的策略过于随机,由于上一次和下一次用的是完全不同的BATCH数据,将会出现优化的方向随机的情况。
基本思想是:(1)引入了累计梯度的思想,希望这个梯度可以受过去梯度的影响;(2)对每一个梯度做了均值化,原来梯度大的地方变小一些,原来梯度小的地方放大一些,避免Z字形下降。
与AdaGrad唯一的区别是 γ ← ρ γ + ( 1 − ρ ) g ⊙ g \gamma \gets \rho \gamma +\left( 1-\rho \right) g\odot g γ←ργ+(1−ρ)g⊙g,引入了一个新的参数 ρ \rho ρ用于权衡过去梯度和现在梯度的权值
nn.vW{k} = 0.5*nn.vW{k} + nn.learning_rate*nn.W_grad{k};
nn.vb{k} = 0.5*nn.vb{k} + nn.learning_rate*nn.b_grad{k};
nn.W{k} = nn.W{k} - nn.vW{k};
nn.b{k} = nn.b{k} - nn.vb{k}; %rho = 0.5;
Momentum(动量)考虑了上一个梯度的对当前梯度的影响(AdaGrad和RMSProp考虑的是累计梯度对当前梯度的影响,没有Momentum那么有“冲劲”)
r r r是累计梯度,作为$\bigtriangleup\varTheta 的 分 母 可 以 解 决 各 个 方 向 梯 度 不 一 致 ; 的分母可以解决各个方向梯度不一致; 的分母可以解决各个方向梯度不一致;s 是 动 量 梯 度 , 作 为 是动量梯度,作为 是动量梯度,作为\bigtriangleup \varTheta $的分子可以解决梯度随机性问题
(1)一般情况下,在训练集上的目标函数的平均值(cost)会随着训练的深入而不断减小,如果这个指标有增大情况,停下来。有两种情况:第一是采用的模型不够复杂,以致于不能在训练集上完全拟合;第二是已经训练很好了。
(2)分出一些验证集(Validation Set),训练的本质目标是在验证集上获取最大的识别率。因此训练一段时间后,必须在验证集上测试识别率,保存使验证集上识别率最大的模型参数,作为最后结果。
(3)注意调整学习率(Learning Rate),如果刚训练几步cost就增加,一般来说是学习率太高了;如果每次cost变化很小,说明学习率太低。
(4) Batch Normalization 比较好用,用了这个后,对学习率、参数更新策略等不敏感。建议如果用Batch Normalization, 更新策略用最简单的SGD即可,我的经验是加上其他反而不好。
(5)如果不用Batch Normalization, 我的经验是,合理变换其他参数组合,也可以达到目的。
(6)由于梯度累积效应,AdaGrad, RMSProp, Adam三种更新策略到了训练的后期会很慢,可以采用提高学习率的策略来补偿这一效应。