神经网络

感知机

1943年,心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征,建立了单个神经元的数学模型(MP模型)

实际上没啥依据

1957年,Frank Rosenblatt从纯数学的度重新考察这一模型,指出能够从一些输入输出对 中通过学习算法获得权重w\boldsymbol{w}bb 。(这被认为是第一个机器学习算法,SVM是90年代的算法)

问题:给定一些输入输出对(x,y)(\boldsymbol{x},y),其中y=±1y=\pm 1,求一个函数,使:f(x)=yf\left( \boldsymbol{x} \right) =y

感知机算法:设定f(x)=sign(wTx+b)f\left( \boldsymbol{x} \right) =sign\left( \boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b \right),从一堆输入输出中自动学习,获得权重w\boldsymbol{w}bb

感知器算法(Perceptron Algorithm):

对于样本数据(x,y)(\boldsymbol{x},y)

  1. 随机选取w\boldsymbol{w}bb
  2. 取一个训练样本(xi,yi)\left( \boldsymbol{x_i},y_i \right)
    • wTxi+b>0\boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x_i}+b>0yi=1y_i=-1,则:w=wxi,b=b1\boldsymbol{w}=\boldsymbol{w}-\boldsymbol{x_i},b=b-1
    • wTxi+b<0\boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x_i}+b<0yi=+1y_i=+1,则:w=w+xi,b=b+1\boldsymbol{w}=\boldsymbol{w}+\boldsymbol{x_i},b=b+1
  3. 再取另外一个(xi,yi)\left( \boldsymbol{x_i},y_i \right),回到(2)
  4. 终止条件:直到所有输入和输出对都不满足(2)中的任意一条,退出循环

关于调整w\boldsymbol{w}bb 的一点点直观的解释:(和梯度下降法推导出来的不同,这里是原论文的方法,比较naive)

wTx+b>0\boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b>0y=1y=-1,则:w=wx,b=b1\boldsymbol{w}=\boldsymbol{w}-\boldsymbol{x},b=b-1,于是有:
wTx+b=(wx)Tx+b1=(wTx+b)(x2+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)
(x2+1)\left( \lVert \boldsymbol{x} \rVert ^2+1 \right)是大于1的正数,它会把wTx+b\boldsymbol{w}^T\boldsymbol{x}+b往负的方向调整。
wTx+b<0\boldsymbol{w}^{\boldsymbol{T}}\boldsymbol{x}+b<0时同理

Frank Rosenblatt从数学上证明了,若数据集线性可分,那么以上的算法一定会收敛,下图是感知机在二维特征空间画出的一条直线

注意,感知机画出的直线与SVM有很大不同。感知机画出的直线只是做到了划分正负样本,而没有像SVM那样有最大的margin(毕竟SVM是90年代的东西,感知机早了将近半个世纪)

感知机算法收敛定理

刚刚我们提到了,Frank Rosenblatt从数学上证明了,若数据集线性可分,那么感知机算法一定会收敛。下面我们加以证明:

首先,为下面证明过程书写方便,

定义增广矩阵X\boldsymbol{X}

  • y=+1y=+1,则X=[x1]\boldsymbol{X}=\left[ \begin{array}{c} \boldsymbol{x}\\ 1\\ \end{array} \right]
  • y=1y=-1,则X=[x1]\boldsymbol{X}=\left[ \begin{array}{c} -\boldsymbol{x}\\ -1\\ \end{array} \right]

定义增广矩阵W=[wb]\boldsymbol{W}=\left[ \begin{array}{c} \boldsymbol{w}\\ b\\ \end{array} \right]

然后我们重写感知机算法:

对于样本数据X\boldsymbol{X}

  1. 随机选取W\boldsymbol{W}
  2. 取一个训练样本Xi\boldsymbol{X_i}
    • WTXi<0\boldsymbol{W}^{\boldsymbol{T}}\boldsymbol{X_i}<0yi=1y_i=-1,则:W=W+Xi\boldsymbol{W}=\boldsymbol{W}+\boldsymbol{X_i}
  3. 再取另外一个Xi\boldsymbol{X_i},回到(2)
  4. 终止条件:直到所有输入和输出对都不满足(2)中的任意一条,退出循环

感知机算法收敛定理:

若样本数据集{Xi}iN\left\{ \boldsymbol{X}_i \right\} _{i\sim N}线性可分,即Wopt\exists \boldsymbol{W}_{opt},使

WoptTXi>0(i=1N)\boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i>0 \left( i=1\sim N \right)

则利用上述感知机算法,经过有限步后,得到一个W\boldsymbol{W},使

WTXi>0(i=1N)\boldsymbol{W}^{T}\boldsymbol{X}_i>0 \left( i=1\sim N \right)

proof:不失一般性,设Wopt=1\lVert \boldsymbol{W}_{opt} \rVert =1,假设第k步时的W\boldsymbol{W}W(k)\boldsymbol{W}(k),且有一个Xi\boldsymbol{X_i}使得W(k)TXi<0\boldsymbol{W}(k)^{\boldsymbol{T}}\boldsymbol{X_i}<0。根据感知机算法可以推导出:

W(k+1)=W(k)+XiW(k+1)aWopt2=W(k)aWopt+Xi2W(k)aWopt+Xi2=W(k)aWopt2+Xi2+2W(k)TXi2aWoptTXi\begin{aligned} &\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 \end{aligned}

注意到W(k)TXi<0\boldsymbol{W}\left( k \right) ^T\boldsymbol{X}_{\boldsymbol{i}}<0以及WoptTXi>0\boldsymbol{W}_{opt}^{T}\boldsymbol{X}_i>0,则一定可以取很大的aa,使得

W(k+1)aWopt2<W(k)aWopt2\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

定义:β=maxi=1N{Xi},γ=mini=1N{WoptTXi}\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\},取a=β2+12γa=\frac{\beta ^2+1}{2\gamma},则W(k+1)aWopt2<W(k)aWopt21\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

D=W(0)aWoptD=\lVert \boldsymbol{W}\left( 0 \right) -a\boldsymbol{W}_{opt} \rVert,则至多经过D2D^2步,W\boldsymbol{W}将会收敛至aWopta\boldsymbol{W}_{opt}

注意是在条件W(k)TXi<0\boldsymbol{W}(k)^{\boldsymbol{T}}\boldsymbol{X_i}<0下,才有W\boldsymbol{W}将会收敛至aWopta\boldsymbol{W}_{opt},而通常情况下这个条件很快就会消失。这个证明的意思是,若数据线性可分,并且很难线性划分,Wopt\boldsymbol{W}_{opt}几乎是唯一划分的选择,那么感知机最终也会收敛到Wopt\boldsymbol{W}_{opt}这个决策平面

多层神经网络

1969年,Minsky指出了感知机没办法处理非线性可分的数据,在日常生活中很多分类问题是非线性的,人工智能进入了第一次冬天。

在80年代,人们创造了多层神经网络(Multiple Layer Neural Networks),从而可以实现对非线性可分数据集的分类,人工智能从新复苏。

下面是一个两层神经网络的例子:

1590654191025

φ()\varphi\left( \cdot \right)为线性函数,则多层神经网络和单层没有区别

定理:当φ(x)=u(x)\varphi\left( x \right)=u(x)(即阶跃函数)时,三层网络可以模拟任意决策面

反向传播算法

反向传播算法(Back Propogation Algorithm):从后往前计算各个参数的偏导数,然后使用梯度下降法对模型进行训练,最终达到收敛。

以上图为例:

首先定义误差函数:E=12(yY)2E=\frac{1}{2}\left( y-Y \right) ^2,其中yy为前向传播计算出的模型输出,YY为数据标签,优化目标为最小化EE

模型中代求的偏导数为:

Ew1=dEdyyw1=(yY)z1Ew2=dEdyyw2=(yY)z2Ew11=dEdyyz1dz1da1a1ω11=(yY)ω1φ(a1)x1Ew12=dEdyyz1dz1da1a1ω12=(yY)ω1φ(a1)x2Ew21=dEdyyz2dz2da2a2ω21=(yY)ω2φ(a2)x1Ew22=dEdyyz2dz2da2a2ω22=(yY)ω2φ(a2)x2Eb1=dEdyyz1dz1da1a1b1=(yY)ω1φ(a1)Eb2=dEdyyz2dz2da2a2b2=(yY)ω2φ(a2)Eb3=dEdyyb3=(yY)\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}

上面是一个小例子以帮助理解。

下面我们对反向传播算法进行向量化,并得到他的一般形式:

首先给出神经网络的向量化数学表达式

1590670753678

这是神经网络的第一层,记输入为x\boldsymbol{x}x\boldsymbol{x}是一个N×1N\times 1向量,NN是输入特征的维数。

w(1)\boldsymbol{w}^{\left( 1 \right)}为第一层的参数矩阵:

w(1)=[w11(1)w12(1)w1N(1)w21(1)w22(1)w2N(1)wM1(1)wM2(1)wMN(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]

则有:

xw(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)

关于维数和上下标的说明:b\boldsymbol{b}z\boldsymbol{z}a\boldsymbol{a}都是列向量,维数取决于这一层的行数,比如上图第一层有M个神经元,则b(1)\boldsymbol{b}^{(1)}z(1)\boldsymbol{z}^{(1)}a(1)\boldsymbol{a}^{(1)}都是M维列向量;上标表示第几层,下标表示连接关系。例如wij(k)\boldsymbol{w}^{\left( k \right)}_{ij}表示第(k1)(k-1)层的第jj个输出到第(k)(k)层的第ii个神经元的参数。

PS:x=a(0)\boldsymbol{x}=\boldsymbol{a}^{\left( 0 \right)}

那么多层神经网络就是上面的重复级联,每一层的行数不一定相等。为方便表示,我们默认一共有ll层,则:

xw(1)x+b(1)=z(1)φa(1)w(2)a(1)+b(2)=z(2)φa(2)φa(l1)w(l)a(l1)+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}

为方便计算,我们定义:δi(m)=Ezi(m)\delta _{i}^{\left( m \right)}=\frac{\partial E}{\partial z_{i}^{\left( m \right)}}

  1. 最后一层(m=l)(m=l)

    δi(l)=Ezi(l)=Eyiyizi(l)=(yiYi)φ(zi(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}

  2. 非最后一层(m=1l1)(m=1\sim l-1)

    δi(m)=Ezi(m)=Eai(m)ai(m)zi(m)=(j=1Sm+1Eai(m+1))φ(zi(m))=(j=1Sm+1wji(m+1)δj(m+1))φ(zi(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)\delta _{i}^{\left( m \right)}后,可以很方便计算出:

Ewij(m)=Ezi(m)zi(m)wij(m)=δi(m)aj(m1)Ebi(m)=Ezi(m)zi(m)bi(m)=Ezi(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}

BP算法:

  1. 随机初始化(w,b)\left( \boldsymbol{w},\boldsymbol{b} \right)

  2. 训练样本(x,Y)\left( \boldsymbol{x},\boldsymbol{Y} \right),输入网络前向传播可求出所有的(z,a,y)\left( \boldsymbol{z},\boldsymbol{a},\boldsymbol{y} \right)

  3. 通过上述迭代方法计算出(Ewij(m),Ebi(m))\left( \frac{\partial E}{\partial w_{ij}^{\left( m \right)}},\frac{\partial E}{\partial b_{i}^{\left( m \right)}} \right)

  4. 更新:

    w()=w()αEww()b()=b()αEbb()\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}

  5. 回到(2),跳出循环条件:(Ewij(m),Ebi(m))\left( \frac{\partial E}{\partial w_{ij}^{\left( m \right)}},\frac{\partial E}{\partial b_{i}^{\left( m \right)}} \right)足够小,或者EE足够小

    这是通过反向传播算法(BP算法)训练多层神经网络的基本方法,但是训练多层神经网络特别是深层神经网络是个错综复杂的问题,下面会讨论到。

激活函数φ()\varphi(\cdot)的选择

若使用感知机的激活函数φ(x)=u(x)\varphi\left( x \right)=u(x),则φ(x)0\varphi '\left( x \right) \equiv 0(不考虑奇异函数,在x=0不可导就当x=0无定义)

由于φ(x)0\varphi '\left( x \right) \equiv 0导致使用反向传播算法计算出来的关于各个参数的偏导数为0,则没有办法用梯度下降法优化模型,因此必须更换激活函数φ()\varphi\left( \cdot \right)

  1. sigmoid函数

    1590668419063

    φ(x)=11+exφ(x)=φ(x)[1φ(x)]\begin{aligned} \varphi \left( x \right) &=\frac{1}{1+e^{-x}} \\ \varphi '\left( x \right) &=\varphi \left( x \right) \left[ 1-\varphi \left( x \right) \right] \end{aligned}

    sigmoid函数是阶跃函数的模拟,并且做到了处处可导。

  2. tanh函数

    1590668654666

    φ(x)=tanh(x)=exexex+exφ(x)=1φ2(x) \begin{aligned} \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) \end{aligned}

    以上的激活函数都有一个问题,就是在x远离原点处的导数为0,这在深度网络的反向传播中通常会出现梯度消失(弥散)的现象,导致深层网络难以训练的问题。因此在深度学习出现以后,常常采用以下激活函数。

  3. ReLU函数

    修正线性单元(Rectify Linear Units)

    1590669223861

    φ(x)={x,x>00,x0=max{0,x}φ(x)={1,x>00,x<0 \begin{aligned} \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} \end{aligned}

    在x>0时的梯度弥散现象得到解决,但x<0时仍然存在梯度弥散现象

  4. Leak ReLU函数

    1590669599063

    φ(x)={x,x>0βx,x0φ(x)={1,x>0β,x<0\begin{aligned} \varphi \left( x \right) &=\begin{cases} x, x>0\\ \beta x, x\leqslant 0\\ \end{cases} \\ \varphi '\left( x \right) &=\begin{cases} 1, x>0\\ \beta , x<0\\ \end{cases} \end{aligned}

神经网络参数设置方法

随机梯度下降

随机梯度(Stochastic Gradient Descent, SGD)

  1. 不用每输入一个样本就去变换参数,而是输入一批样本(叫做一个BATCH或MINI-BATCH),求出这些样本的梯度平均值后,根据这个平均值改变参数。(GD是BATCH为1的SGD)
  2. 在神经网络训练中,BATCH的样本数大致设置为50-200不等。

激活函数选择

1590739683797

训练数据初始化

1590739661702

标准差stdstd也可以用(maxmin)(max-min)来代替

(w,b)(\boldsymbol{w},b)的初始化

1590739733567

梯度消失现象:如果wTx+b\boldsymbol{w}^T\boldsymbol{x}+b一开始很大或很小,那么梯度将趋近于0,反向传播后前面与之相关的梯度也趋近于0,导致训练缓慢。 因此,我们要使wTx+b\boldsymbol{w}^T\boldsymbol{x}+b一开始在零附近。

一种比较简单有效的方法是:(w,b)(\boldsymbol{w},b)初始化从区间(1d,1d)\left( -\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}} \right)均匀随机取值。其中dd(w,b)(\boldsymbol{w},b)所在层的神经元个数。

可以证明,如果x\boldsymbol{x}服从正态分布,均值0,方差1,且各个维度无关,而(w,b)(\boldsymbol{w},b)(1d,1d)\left( -\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}} \right)的均匀分布,则wTx+b\boldsymbol{w}^T\boldsymbol{x}+b是均值为0, 方差为1/3的正态分布。

参数初始化是一个研究热点领域

Batch normalization

论文:Batch normalization accelerating deep network training by reducing internal covariate shift (2015)

基本思想:既然我们希望每一层获得的值都在0附近,从而避免梯度消失现象,那么我们为什么不直接把每一层的值做基于均值和方差的归一化呢?

1590741458551

γ\gammaβ\beta的说明:以sigmoid和tanh为例,若归一化后的样本过于聚集在0附近,则激活函数对外表现出几乎的线性,这是我们不希望看到的。因此增加了γ\gammaβ\beta两个待学习的参数,使归一化在避免梯度消失和失去非线性中权衡。

目标函数选择

  1. 可加正则项 (Regulation Term)

L(w)=F(w)+R(w)=12(i=1batchsizeyiYi2+βklwk,l2)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) \\

  1. 如果是分类问题,F(w)F(w)可以采用Softmax函数和交叉熵的组合

    (a)Softmax函数

qi=exp(zi)j=1Nexp(zj),i=1Nqi=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

(b)交叉熵(Cross Entropy)

E=i=1NYilog(yi) E=-\sum_{i=1}^N{Y_i\log \left( y_i \right)}

交叉熵可以作为误差函数,上面我们使用的误差函数为MSE,即E=12i=1NyiYi2E=\frac{1}{2}\sum_{i=1}^N{\lVert y_i-Y_i \rVert ^2}。对于交叉熵,当ppqq的分布越相近时,EE的值越小。

综上,我们可以使用Softmax函数和交叉熵的组合作为目标函数:

E=i=1Npilog(qi) E=-\sum_{i=1}^N{p_i\log \left( q_i \right)}

并且它的求导将会有非常简单的形式:Ezi=qipi\frac{\partial E}{\partial z_i}=q_i-p_i

参数更新策略

  1. 常规的更新 (Vanilla Stochastic Gradient Descent)
1
2
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)的每一个分量获得的梯度绝对值有大有小,一些情况下,将会迫使优化路径变成Z字形状

1590747272690

(2)SGD求梯度的策略过于随机,由于上一次和下一次用的是完全不同的BATCH数据,将会出现优化的方向随机的情况。

  1. AdaGrad(解决各个方向梯度不一致问题)

    1590747459994

    基本思想是:(1)引入了累计梯度的思想,希望这个梯度可以受过去梯度的影响;(2)对每一个梯度做了均值化,原来梯度大的地方变小一些,原来梯度小的地方放大一些,避免Z字形下降。

  2. RMSProp(解决各个方向梯度不一致问题)

    1590748104083

    与AdaGrad唯一的区别是γργ+(1ρ)gg\gamma \gets \rho \gamma +\left( 1-\rho \right) g\odot g,引入了一个新的参数ρ\rho用于权衡过去梯度和现在梯度的权值

  3. Momentum(解决梯度随机性问题)

    1590749107594

    1
    2
    3
    4
    5
    6
    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那么有“冲劲”)

  4. Adam(同时解决两个问题)

    1590749307479

rr是累计梯度,作为Θ\bigtriangleup\varTheta的分母可以解决各个方向梯度不一致;ss是动量梯度,作为Θ\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三种更新策略到了训练的后期会很慢,可以采用提高学习率的策略来补偿这一效应。