BP神经网络

为什么要使用神经网络?

虽然对于分类问题,可以运用Logistic回归,但是对于一些过于复杂的非线性训练集合,既分类问题,Logistic回归的决策边界可能会过于复杂,而且可能会导致过拟合的问题,如下图所示:

对于这个有两个特征变量x_{1}x_{2}的分类问题,可以用包含许多非线性项的Logistic函数,既假设函数来拟合数据集

h_{\theta }(x)=g\left ( \theta _{0}+\theta _{1}x_{1}+\theta _{2}x_{2}+\theta _{3}x_{1}x_{2}+\theta _{4}x_{1}^{2}x_{2}+\theta _{5}x_{1}x_{2}^{2}+\theta _{6}x_{1}^{3}x_{2}+\cdots \right )

当多项式足够多时,或许可以划分决策边界, 把正负样本给区分开。

但是许多分类问题中可能特征远不止两项,假设有100个特征变量

x=\begin{bmatrix} x_{1}\\ x_{2}\\ \vdots \\ x_{100} \end{bmatrix}

这样光是二次项就有5151种可能,将n=100

(n+1)+n+(n-1)+\cdots +1=\frac{(n+1)(n+2)}{2}

故二次项的数量呈O(n^{2})的复杂度递增,而三次项的数目就会更多,呈O(n^{3})的复杂度递增,故即使只是包含全部的二次项,Logistic回归也并不是一个很好的选择,最后得出的结果可能也会过拟合。

所以,当特征个数n很大时,将这些高阶多项式项数包括到特征里,会使特征空间急剧膨胀,而对于许多实际的机器学习问题,特征变量的个数n是很大的,如下例所示:

要辨别图像是否为一辆汽车,以其中的两个像素点作为输入特征可以简单地划分是正负样本,但一张图片可能包含许多像素点,假设图片都是50\times 50像素,一张图片一共有2500个像素点。因此,特征向量的元素个数n就是2500,如果我们想通过包含所有二次项特征的假设函数来学习得到的非线性假设,那总共就会包含约3\times 10^{7}个特征,特征空间过大严重影响Logistic回归算法的效率。

所以,用包含二次项和三次项的简单Logistic回归来学习当特征个数n很大时的非线性假设并不是一个很好的方法。

神经网络模型

下图是一个简单的只包含单个神经元的神经网络模型,黄色圆圈表示神经元细胞体,用于处理接收到的信息,既一个逻辑单元,通过树突或者输入通道输入特征变量x_{1}x_{2}x_{3},最后通过轴突输出计算结果,既假设函数,在神经网络里也可以称为激活函数(activation function)

h_{\theta }(x)=\frac{1}{1+e^{-\theta ^{T}x}}

其中特征向量x和参数向量\theta

x=\begin{bmatrix} x_{0}\\ x_{1}\\ x_{2}\\ x_{3} \end{bmatrix},\ \theta =\begin{bmatrix} \theta _{0}\\ \theta _{1}\\ \theta _{2}\\ \theta _{3} \end{bmatrix}

在绘制神经网络模型时,一般只绘制输入特征,而不会加上x_{0},因为x_{0} = 1。当在有必要的时候加上x_{0}时,把x_{0}称为偏置单元(bias unit)。  

但神经网络其实是一组神经元连接在一起的集合,如下图所示

把用于输入特征变量 的第一层称为输入层(input layer),最后一层用于输出假设函数的称为输出层(output layer),而中间用于处理数据的神经元都被称为隐藏层(hidden layer)。除了输出层之外的每一层都可以加入偏置单元,且都为1。

  • a_{i}^{(j)}表示第j层第i个激活项
  • \Theta ^{(j)}是权重矩阵,既参数矩阵,它控制着从第j层到第j+1层的映射,因为\Theta ^{(j)}是矩阵所以要大写

每个激活项的表达式如下

a_{1}^{(2)}=g\left ( \Theta _{10}^{(1)}x_{0}+\Theta _{11}^{(1)}x_{1}+\Theta _{12}^{(1)}x_{2}+\Theta _{13}^{(1)}x_{3} \right )

a_{2}^{(2)}=g\left ( \Theta _{20}^{(1)}x_{0}+\Theta _{21}^{(1)}x_{1}+\Theta _{22}^{(1)}x_{2}+\Theta _{23}^{(1)}x_{3} \right )

a_{3}^{(2)}=g\left ( \Theta _{30}^{(1)}x_{0}+\Theta _{31}^{(1)}x_{1}+\Theta _{32}^{(1)}x_{2}+\Theta _{33}^{(1)}x_{3} \right )

输出单元的表达如下 

a_{1}^{(3)}=h_{\Theta }(x)=g\left ( \Theta _{10}^{(2)}a_{0}^{(2)}+\Theta _{21}^{(2)}a_{1}^{(2)}+\Theta _{22}^{(2)}a_{2}^{(2)}+\Theta _{23}^{(2)}a_{3}^{(2)} \right )

因此\Theta ^{(1)}是一个3\times 4的矩阵,\Theta ^{(1)}\in \mathbb{R}^{3\times 4},它控制着第1层输入层到第2层隐藏层的映射

\Theta ^{(1)}=\begin{bmatrix} \Theta _{10}^{(1)} & \Theta _{11}^{(1)} & \Theta _{12}^{(1)} &\Theta _{13}^{(1)}\\ \Theta _{20}^{(1)}& \Theta _{21}^{(1)} & \Theta _{22}^{(1)} & \Theta _{23}^{(1)}\\ \Theta _{30}^{(1)}& \Theta _{31}^{(1)} & \Theta _{32}^{(1)} &\Theta _{33}^{(1)} \end{bmatrix}

\Theta ^{(2)}是一个1\times 3的矩阵,\Theta ^{(2)}\in \mathbb{R}^{1\times 4}, 它控制着第2层隐藏层到第3层输出层的映射

\Theta ^{(2)}=\begin{bmatrix} \Theta _{10}^{(2)} & \Theta _{11}^{(2)} & \Theta _{12}^{(2)} &\Theta _{13}^{(2)} \end{bmatrix}

由此可知\Theta ^{(j)}\in \mathbb{R}^{s_{j + 1}\times (s_{j}+1)}s_{j}+1是第j层激活项加上该层的偏置项的个数,s_{j+1}是第j+1层激活项的个数。 

1、前向传播算法

对神经网络模型进行向量化,将每个激活项进行化简

z_{1}^{(2)}= \Theta _{10}^{(1)}x_{0}+\Theta _{11}^{(1)}x_{1}+\Theta _{12}^{(1)}x_{2}+\Theta _{13}^{(1)}x_{3}

那么激活项a_{1}^{(2)}

a_{1}^{(2)}=g\left ( z_{1}^{(2)} \right )

同理可得z_{2}^{(2)}z_{3}^{(2)}a_{2}^{(2)}a_{3}^{(2)},那么

z^{(2)}=\begin{bmatrix} z_{1}^{(2)}\\ z_{2}^{(2)}\\ z_{3}^{(2)} \end{bmatrix},\ a^{(2)}=\begin{bmatrix} a_{1}^{(2)}\\ a_{2}^{(2)}\\ a_{3}^{(2)} \end{bmatrix}

 而特征变量x

x=\begin{bmatrix} x_{1}\\ x_{2}\\ x_{3}\\ \end{bmatrix}

因此z^{(2)}可以简化成权重矩阵\Theta ^{(1)}和添加进偏置项x_{0}的特征向量x相乘

z^{(2)}=\begin{bmatrix} \Theta _{10}^{(1)} & \Theta _{11}^{(1)} & \Theta _{12}^{(1)} &\Theta _{13}^{(1)} \\ \Theta _{20}^{(1)} & \Theta _{21}^{(1)} & \Theta _{22}^{(1)} &\Theta _{23}^{(1)} \\ \Theta _{30}^{(1)} & \Theta _{31}^{(1)} & \Theta _{32}^{(1)} &\Theta _{33}^{(1)} \\ \end{bmatrix}\begin{bmatrix} x_{0}\\ x_{1}\\ x_{2}\\ x_{3} \end{bmatrix}=\Theta ^{(1)}x

a^{(2)}

a^{(2)}=g\left ( z^{(2)} \right )=g\left ( \Theta ^{(1)}x \right )

把第1层输入层作为第1层激活层a^{(1)},既

a^{(2)}=g\left ( z^{(2)} \right )=g\left ( \Theta ^{(1)}a^{(1)} \right )

以此类推,将偏置项a_{0}^{(2)}=1加入a^{(2)},可得输出层a^{(3)}

h_{\Theta }(x)=a^{(3)}=g\left ( z^{(3)} \right )=g(\Theta ^{(2)}a^{(2)})

这就是前向传播算法的向量表示,我自己把它理解为,最后输出层得到的就是神经网络的模型,既假设函数。 

这是二元分类的例子,而在多元分类(multi-class classification)问题中,最后输出层输出的是一个向量,K元分类问题就是K维向量。如下图所示,要分辨出图像的类别,是轿车,行人,摩托车还是卡车,则是4元分类问题,输出的就是4维向量。

y\in \mathbb{R}^{K}, \ h_{\Theta }(x)\in \mathbb{R}^{K}

当该图像是行人时,则目标变量y和假设函数h_{\Theta }(x)分别为

y=\begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix},\ h_{\Theta }(x)\approx \begin{bmatrix} 1\\ 0\\ 0\\ 0 \end{bmatrix}

 当该图像轿车是时,则目标变量y和假设函数h_{\Theta }(x)分别为

y=\begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix},\ h_{\Theta }(x)\approx \begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix}

以此类推。

2、激活函数的选择

如果要解决回归问题,毫无疑问选择线性函数;如果我们要解决二元分类问题,隐藏层选择ReLU函数,输出层选择sigmoid函数;如果要解决多元分类问题,隐藏层依然选择ReLU函数,但是输出层选择softmax函数。选择sigmoid函数也可行,但是需要同时修改代价函数。

如果都选择用线性的激活函数,从输入层开始

a^{(1)} = x^{(1)}

a^{(2)} = g\left (\Theta ^{(1)}a^{(1)} \right )=\Theta ^{(1)}a^{(1)}

a^{(3)} = g\left (\Theta ^{(2)}a^{(2)} \right )=\Theta ^{(2)}a^{(2)}=\Theta ^{(2)}\Theta ^{(1)}a^{(1)}

\vdots

a^{(l)} = g\left (\Theta ^{(l-1)}a^{(l-1)} \right )=\Theta ^{(l-1)}a^{(l-1)}=\Theta ^{(l-1)}\Theta ^{(l-2)}a^{(l-2)}=\Theta ^{(l-1)}\Theta ^{(l-2)}\cdots \Theta ^{(1)}a^{(1)}

因此最后输出层输出的值依旧是线性的,就等同于线性回归。

3、代价函数 

假设有如图所示神经网络

训练集有m个训练样本

\left \{ \left ( x^{(1)},y^{(1)} \right ),\left( x^{(2)},y^{(2)} \right ),\cdots,\left ( x^{(m)},y^{(m)} \right ) \right \}

  •  L表示这个神经网络的总层数
  • s_{l}表示第l层神经元的数量,既激活项的数量。这个数量不包括偏置项

神经网络的代价函数是Logistic回归代价函数的一般形式,因为Logistic回归只有一个目标变量y,所以也只会有一个逻辑回归输出单元h_{\theta }(x),而对于神经网络来说可能会有一个K维的目标向量y,所以输出的也是一个K维向量h_{\Theta }(x)

y\in \mathbb{R}^{K}h_{\Theta }(x)\in \mathbb{R}^{K}

那么\left (h_{\Theta }(x) \right )_{k}就表示输出层K维向量中的第k个输出单元,因此输出层的激活函数为sigmoid函数的神经网络的代价函数J(\Theta )

J(\Theta )=-\frac{1}{m}\left [ \sum_{i = 1}^{m}\sum_{k = 1}^{K}\left (y^{(i)}_{k}\log \left ( h_{\Theta }(x^{(i)}) \right )_{k}+ \left ( 1-y_{k}^{(i)} \right )\log \left ( 1 - h_{\Theta }(x^{(i)})_{k} \right ) \right )\right ]+ \frac{\lambda }{2m}\sum_{l = 1}^{L}\sum_{i = 1}^{s_{l + 1}}\sum_{j = 1}^{s_{l}}\left (\Theta _{ij}^{(l)} \right )^{2}

 输出层的激活函数为softmax函数的神经网络的代价函数J(\Theta )为 

J(\Theta )=-\frac{1}{m}\left [ \sum_{i = 1}^{m}\sum_{k = 1}^{K}y^{(i)}_{k}\log \left ( h_{\Theta }(x^{(i)}) \right )_{k} \right ]+ \frac{\lambda }{2m}\sum_{l = 1}^{L}\sum_{i = 1}^{s_{l + 1}}\sum_{j = 1}^{s_{l}}\left (\Theta _{ij}^{(l)} \right )^{2}

其中\frac{\lambda }{2m}\sum_{l = 1}^{L}\sum_{i = 1}^{s_{l + 1}}\sum_{j = 1}^{s_{l}}\Theta _{ij}^{(l)}为正则项,下标从\Theta ^{(l)}_{i1}开始,不包括偏置项的参数(权重)。

4、反向传播算法 

在得到神经网络模型的代价函数后,需要找到参数\Theta使得代价函数最小,既求出代价函数的最小值\underset{\Theta }{min}J(\Theta ),无论是利用梯度下降法还是别的高级算法,要求出\underset{\Theta }{min}J(\Theta ),都需要计算每个参数的偏导数,既求出\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}}

从输出层开始,从后往前开始求导。输出层为

h_{\Theta }\left ( x \right )=\begin{bmatrix} a_{1}^{(l+1)}\\ a_{1}^{(l+1)}\\ \\ \vdots a_{n^{(l+1)}}^{(l+1)} \end{bmatrix}=g\left (z^{(l+1)} \right )

z^{(l+1)}

z^{(l+1)} = \Theta ^{(l)}a^{(l)}=\begin{bmatrix} \Theta _{11}^{(l)} & \Theta _{12}^{(l)} & \cdots & \Theta _{1n^{(l)}}^{(l)} \\ \Theta _{21}^{(l)} & \Theta _{22}^{(l)} & \cdots & \Theta _{2n^{(l)}}^{(l)} \\ \vdots &\vdots &\ddots & \vdots \\ \Theta _{n1}^{(l)} & \Theta _{22}^{(l)} & \cdots & \Theta _{2n^{(l)}}^{(l)} \\ \end{bmatrix}\begin{bmatrix} a_{1}^{(l)}\\ a_{2}^{(l)}\\ \vdots \\ a_{n^{(l)}}^{(l)} \end{bmatrix}

\Theta ^{(l)}的第一行\Theta _{1j}^{(l)}开始求导,当选用sigmoid函数作为输出层的激活函数时,除了\left (h_{\Theta } \left ( x^{(i)} \right ) \right )_{1},其余输出项对\Theta _{1j}^{(l)}求偏导都为0,因此

\frac{\partial J(\Theta )}{\partial \Theta _{1j}^{(l)}}=\frac{\partial J\left ( \Theta \right )}{\partial z_{1} ^{(l+1)}}\cdot \frac{\partial z _{1}^{(l+1)}}{\partial \Theta _{1j}^{(l)}}=\frac{1}{m}\left [ \sum_{i = 1}^{m} \left (\left (h_{\Theta } \left ( x^{(i)} \right ) \right )_{1} - y_{1} ^{(i)} \right ) \cdot \left (a^{(l)} \right )^{T}\right]

当选用softmax函数作为输出层的激活函数时, 

\frac{\partial J\left ( \Theta \right )}{\partial z_{1} ^{(l+1)}}=\frac{1}{m}\left [ \sum_{i=1}^{m}y_{1} ^{(i)}\left (\left (h_{\Theta }\left ( x^{(i)} \right ) \right )_{1}-1\right )+ y^{(i)}_{2}\left (h_{\Theta }\left ( x^{(i)} \right ) \right )_{2}+ \cdots+ y^{(i)} _{K}\left (h_{\Theta }\left ( x^{(i)} \right ) \right )_{K} \right ]

除了第\left ( y^{(i)} \right )_{k},其余输出项全部为0,因此

 \frac{\partial J(\Theta )}{\partial \Theta _{1j}^{(l)}}=\left\{\begin{matrix} \frac{1}{m}\left [ \sum_{i=1}^{m} y^{(i)}_{k}\left (\left (h_{\Theta }\left ( x^{(i)} \right ) \right )_{k}-1\right )\cdot \left ( a^{(l)} \right )^{T}\right ] \ , \ if \ k=1 \\ \frac{1}{m}\left [ \sum_{i=1}^{m} y^{(i)} _{k}\left (h_{\Theta }\left ( x^{(i)} \right ) \right )_{k}\cdot \left ( a^{(l)} \right )^{T}\right ] \ , \ if \ k=else \end{matrix}\right.

以此类推,以sigmoid函数作为输出层的激活函数时的\frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}

\frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}=\frac{\partial J\left ( \Theta \right )}{\partial z^{(l+1)}}\cdot \frac{\partial z ^{(l+1)}}{\partial \Theta ^{(l)}}=\frac{1}{m}\left [ \sum_{i = 1}^{m} \left (h_{\Theta } \left ( x^{(i)} \right ) - y^{(i)} \right ) \cdot \left (a^{(l)} \right )^{T} \right]

以softmax函数作为输出层的激活函数时的\frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}

 \frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}=\frac{1}{m}\sum _{i=1}^{m}\begin{bmatrix} \left ( h_{\Theta }\left ( x^{(i)} \right )-1 \right )_{1} & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{1} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{1}\\ \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{2} & \left ( h_{\Theta }\left ( x^{(i)} \right )-1 \right )_{2} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{2} \\ \vdots & \vdots & \ddots &\vdots \\ \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{n} & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{n} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} -1\right ) \right )_{n} \end{bmatrix}\cdot y^{(i)}\cdot a^{(l)}

接下来对\Theta ^{(l-1)}进行求导

 \frac{\partial J(\Theta )}{\partial \Theta ^{(l-1)}}=\frac{\partial J\left ( \Theta \right )}{\partial z^{(l+1)}}\cdot \frac{\partial z ^{(l+1)}}{\partial a ^{(l)}}\cdot \frac{\partial a ^{(l)}}{\partial z^{(l)}}\cdot \frac{\partial z ^{(l)}}{\partial \Theta ^{(l-1)}}

其中由之前对\Theta ^{(l)}求导可知,

\frac{\partial J\left ( \Theta \right )}{\partial z^{(l+1)}}=\frac{1}{m}\left [ \sum_{i = 1}^{m} \left (h_{\Theta } \left ( x^{(i)} \right ) - y^{(i)} \right ) \right]

或者

\frac{\partial J(\Theta )}{\partial z ^{(l+1)}}=\frac{1}{m}\sum _{i=1}^{m}\begin{bmatrix} \left ( h_{\Theta }\left ( x^{(i)} \right )-1 \right )_{1} & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{1} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{1}\\ \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{2} & \left ( h_{\Theta }\left ( x^{(i)} \right )-1 \right )_{2} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{2} \\ \vdots & \vdots & \ddots &\vdots \\ \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{n} & \left ( h_{\Theta }\left ( x^{(i)} \right ) \right )_{n} & \cdots & \left ( h_{\Theta }\left ( x^{(i)} -1\right ) \right )_{n} \end{bmatrix}\cdot y^{(i)}

同样先对\Theta _{1j}^{(l-1)}求导,而除了z_{1}^{(l+1)},其余激活项对\Theta _{1j}^{(l-1)}的偏导数也都为0,因此

 \frac{\partial z _{1}^{(l+1)}}{\partial a ^{(l)}}\cdot \frac{\partial a ^{(l)}}{\partial z^{(l)}}\cdot \frac{\partial z ^{(l)}}{\partial \Theta ^{(l-1)}}=\left (\Theta _{1j}^{(l)} \right )^{T}\cdot g'\left ( z^{(l)} \right )\cdot \left (a^{(l-1)} \right )^{T}

以此类推 

\frac{\partial z ^{(l+1)}}{\partial a ^{(l)}}\cdot \frac{\partial a ^{(l)}}{\partial z^{(l)}}\cdot \frac{\partial z ^{(l)}}{\partial \Theta ^{(l-1)}}=\left (\Theta ^{(l)} \right )^{T}\cdot g'\left ( z^{(l)} \right )\cdot \left (a^{(l-1)} \right )^{T}

然后对\Theta ^{(l-2)}进行求导

\frac{\partial J(\Theta )}{\partial \Theta ^{(l-2)}}=\frac{\partial J\left ( \Theta \right )}{\partial z^{(l+1)}}\cdot \frac{\partial z ^{(l+1)}}{\partial a ^{(l)}}\cdot \frac{\partial a ^{(l)}}{\partial z^{(l)}}\cdot \frac{\partial z ^{(l)}}{\partial a ^{(l-1)}}\cdot \frac{\partial a^{(l-1)}}{\partial z^{(l-1)}}\cdot \frac{\partial z^{(l-1)}}{\partial \Theta ^{(l-2)}}

其中

\frac{\partial J\left ( \Theta \right )}{\partial z^{(l+1)}}\cdot \frac{\partial z ^{(l+1)}}{\partial a ^{(l)}}\cdot \frac{\partial a ^{(l)}}{\partial z^{(l)}}=\left (\Theta ^{(l)} \right )^{T}\cdot g'\left ( z^{(l)} \right )

\frac{\partial z ^{(l)}}{\partial a ^{(l-1)}}\cdot \frac{\partial a^{(l-1)}}{\partial z^{(l-1)}}\cdot \frac{\partial z^{(l-1)}}{\partial \Theta ^{(l-2)}} 的求导步骤与上一层一样,因此可以得出

\frac{\partial z ^{(l)}}{\partial a ^{(l-1)}}\cdot \frac{\partial a^{(l-1)}}{\partial z^{(l-1)}}\cdot \frac{\partial z^{(l-1)}}{\partial \Theta ^{(l-2)}}=\left (\Theta ^{(l-1)} \right )^{T}\cdot g'\left ( z^{(l-1)} \right )\cdot \left (a^{(l-2)} \right )^{T}

把输入层作为a^{(1)},就可以得出所有\frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}的值,把\frac{\partial J(\Theta )}{\partial z^{(l)}} \ , \ (l=1,2\cdots ,n)称作误差项\delta ^{(l)}

先以一个训练样本(x^{(1)}, y^{(1)})为例,利用前向传播算法得出输出层输出向量,既假设函数h_{\Theta }(x) 的向量

a^{(1)}=x

z^{(2)}=\Theta ^{(1)}a^{(1)}

a^{(2)}=g(z^{(2)})

z^{(3)}=\Theta ^{(2)}a^{(2)}

a^{(3)}=g(z^{(3)})

z^{(4)}=\Theta ^{​{(3)}}a^{(3)}

a^{(4)}=h_{\Theta }(x)=g(z^{(4)})

接下来为了计算偏导项,将利用反向传播算法(Backpropagation),反向传播算法就是对每一个激活项计算\delta _{j}^{(l)}\delta _{j}^{(l)}代表第l层第j项的误差,从后往前计算。从输出层开始

\delta ^{(4)}_{j}=a_{j}^{(4)}-y_{j}=(h_{\Theta }(x))_{j}-y_{j}

 因此转化为向量形式为

\delta ^{(4)}=a^{(4)}-y=h_{\Theta }(x)-y

而之前几层的误差项的计算方式和最后一层输出层有所区别

\delta ^{(3)}=(\Theta ^{(3)})^{T}\delta ^{(4)}.* g'\left ( z^{(3)} \right )

\delta ^{(2)}=(\Theta ^{(2)})^{T}\delta ^{(3)}.* g'\left ( z^{(2)} \right )

.*”表示向量中的项两两相乘。又因为g'(z)

g'(z)=\frac{e^{-z}}{\left (1+e^{-z} \right )^{2}}

g'\left ( z^{(l)} \right )可以化简为

 g'\left ( z^{(l)} \right )=g\left ( z^{(l)} \right ).*\left (1-g\left ( z^{(l)} \right ) \right )=a^{(l)}.*\left (1-a^{(l)} \right )

而第一层a^{(1)}为输入层也就是特征向量x,不存在误差,也就没有\delta ^{(1)}

所以误差项的一般形式为

\delta ^{(L)}=a^{(L)}-y=h_{\Theta }(x)-y

\delta ^{(l)}=(\Theta ^{(l)})^{T}\delta ^{(l+1)}.* g'\left ( z^{(l)} \right )=(\Theta ^{(l)})^{T}\delta ^{(l+1)}.*a^{(l)}.*\left (1-a^{(l)} \right )

每个省去正则项的偏导项\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}} 为

\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}}=a_{j}^{(l)}\delta _{i}^{(l+1)}

向量化后为

\frac{\partial J(\Theta )}{\partial \Theta ^{(l)}}=\delta ^{(l + 1)}\left ( a^{(l)} \right )^{T}

m个训练样本重复以上操作,把偏导矩阵记作\Delta ^{(l)},并对所有训练样本所对应参数的偏导矩阵求和

\Delta ^{(l)}:= \Delta ^{(l)}+\delta ^{(l + 1)}\left ( a^{(l)} \right )^{T}

 最后分两种情况选择是否对正则项求偏导

D_{ij} ^{(l)}:= \left\{\begin{matrix} \frac{1}{m}\Delta_{ij} ^{(l)}+\lambda \Theta_{ij} ^{(l)} \ , \ j \neq 0 \\ \frac{1}{m}\Delta_{ij} ^{(l)} \ \ \ \ \ \ \ \ \ \ \ , \ j \neq 0 \end{matrix}\right.

由此可知所有参数的偏导数为

\frac{\partial J(\Theta )}{\partial \Theta _{ij}^{(l)}}=D_{ij}^{(l)}

5、梯度检测 

由偏导数的定义可知

\frac{\partial J(\theta _{0},\theta _{1},\cdots ,\theta _{n})}{\partial \theta _{i}}=\underset{\varepsilon \rightarrow 0}{\lim}\frac{J(\theta _{0},\theta _{1},\cdots ,\theta _{i} + \varepsilon ,\cdots ,\theta _{n})-J(\theta _{0},\theta _{1},\cdots ,\theta _{n})}{\varepsilon }

为了检测后向传播算法是否正常运行,对\delta _{ij}^{(l)}以及偏导数\Delta _{ij}^{(l)}的计算是否有误差,如果

\frac{\partial J(\Theta)}{\partial \Theta _{ij}^{(l)}}\approx \frac{J(\Theta _{ij}^{(l)} + \varepsilon)-J(\Theta _{ij}^{(l)} - \varepsilon)}{2\varepsilon }

 则说明后向传播算法正常运行,对偏导数的计算误差不大,\varepsilon一般选择一个很小的值在10^{-4}左右。

但是注意,在用神经网络训练数据时,要把梯度检测给关掉,以为梯度检测的计算量非常大,计算偏导数会非常慢,而反向传播算法的速度就很快,所以为了提高模型的效率,在训练神经网络时,要把梯度检测给关掉。

6、随机初始化

在利用梯度下降法或其他高级算法计算\underset{\Theta }{min}J(\Theta )是,会先初始化参数的值,一般全部设置为0,但是在神经网络中,因为

a^{(l)} = g(z^{(l)}) \ , \ z^{(l+1)}=\Theta ^{(l)}a^{(l)}

如果把初始的参数全部设置为0,既\Theta _{ij}^{(l)} = 0那么

a_{1}^{(l)}=a_{2}^{(l)}=\cdots =a_{n}^{(l)}

因为每层每个激活项的值都相等,每层每个误差项\delta _{j}^{(l)}也相等。那么就会导致输入的特征冗余,且下降每次每个参数\Theta _{ij}^{(l)}都下降相同的程度。

为了解决这个问题,在神经网络中对参数进行初始化时,要使用随机初始化的思想,对参数\Theta _{ij}^{(l)}在随机范围\left [ -\varepsilon ,\varepsilon \right ]初始化,既

\Theta _{ij}^{(l)}\in \ random \ \left [ -\varepsilon ,\varepsilon \right ]

这里的\varepsilon和梯度检测\varepsilon是不同的\varepsilon,注意区分。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值