问题的提出

从图像识别问题入手。
比如,对于识别是不是汽车的问题,图像上的每个像素点就是一个特征,
(假设是灰度图像,即像素只需要考虑强度大小,对于RGB彩色图其实同理)

04_p1
04_p1

(上图只是用两个像素点举个简单的例子)
显然,这是非线性的分类问题。

考虑一般的图片,有上百万、千万的像素,显然特征太多了,用前面的方法无法解决。
因此,用神经来学习复杂的非线性假设。

神经网络模型

神经元 neuron

本来是生物学概念。信息从树突输入,通过轴突输出。
如下图,不妨用一个黄圈表示一个神经元。
那么就可以用下图表示之前的逻辑回归模型。

04_p2
04_p2

\[ \begin{aligned} &(x_0=1) \\ &x=\left[\begin{matrix}x_0\\x_1\\x_2\\x_3\\\end{matrix}\right] \\ &\theta=\left[\begin{matrix}\theta_0\\\theta_1\\\theta_2\\\theta_3\\\end{matrix}\right] \\ &h_\theta\left(x\right)=\frac{1}{1+e^{-\theta^Tx}} \\ \end{aligned} \]

偏置单元

上面的\(x_0\)项,怎么加视情况而定。
为常数,所以一般不画出来。计算时别忘了。

激活函数

神经元上运行的函数。

上图可称为带有sigmoid(或logistic)激活函数的人工神经元。
注意激活函数不是只有最后一步输出前才用,而是每一步都用。
每一步都用\(g(z)\),相当于全部归一化。

权重

即参数\(\theta\)。神经网络文献里一般称为权重\(w\)

神经网络 neural network

上面的模型里只有一个神经元,
神经网络即若干神经元的组合。

如上图所示,(偏置单元\(x_0\)\(a_0^{\left(2\right)}\)可以不画出来)
有三个输入单元\(x_1,x_2,x_3\)
接下来一层有三个神经元\(a_1^{\left(2\right)},a_2^{\left(2\right)},a_3^{\left(2\right)}\)
最后一层有一个神经元,计算并输出到假设函数\(h\)

输入层

第一层,输入特征。

输出层

最后一层,这层的神经元输出神经网络的最后结果。
(可能之后还要经过假设函数计算)

隐藏层

中间的层。(显然可能不止一层)

标记方法解释:
\(a_j^{\left(l\right)}\)——第\(l\)层的第\(j\)个神经元。
\(\Theta_{ji}^{\left(l\right)}\)——权重矩阵(从\(l\)层的第\(i\)项,映射到\(l+1\)层的第\(j\)项)
\(z_j^{\left(l\right)}\)——应用归一化函数后的方便表示,即\(a_j^{\left(l\right)}=g\left(z_j^{\left(l\right)}\right)\)\(z^{\left(l\right)}=\Theta^{\left(l-1\right)}a^{\left(l-1\right)}\)

前向传播

根据\(x\)\(\Theta\),向前计算\(a\)\(h\)的过程。
(下面的过程里每一层都用\(g(z)\)归一化)
(其实\(x\)就可以看作\(a^{\left(1\right)}\),不同资料上表示方法可能略有出入)

插入\(x_0=1\)
\(a^{\left(2\right)}=g\left(\Theta^{\left(1\right)}x\right)\)
插入\(a_0^{\left(2\right)}=1\)
\(a^{\left(3\right)}=g\left(\Theta^{\left(2\right)}a^{\left(2\right)}\right)\)
\(h_\Theta\left(x\right)=a^{\left(3\right)}\)

计算的时候别忘了偏置项。(只是由于都是1,平时不画出来)
注意各个量的维度,理清楚矩阵运算的过程
\(x,a^{\left(j\right)}\)为向量,一维

\[ \begin{aligned} &x=\left[\begin{matrix}x_0\\x_1\\x_2\\x_3\\\end{matrix}\right] \\ &a^{\left(j\right)}=\left[\begin{matrix}a_0^{\left(l\right)}\\a_1^{\left(l\right)}\\a_2^{\left(l\right)}\\a_3^{\left(l\right)}\\\end{matrix}\right] \\ \end{aligned} \]

\(\Theta^{\left(l\right)}\)为变换矩阵,二维,即一个\(3\times4\)矩阵(在这层)

\[ \left[\begin{matrix}a_1^{\left(l+1\right)}\\a_2^{\left(l+1\right)}\\a_3^{\left(l+1\right)}\\\end{matrix}\right]=g\left(\left[\begin{matrix}\Theta_{10}^{\left(l\right)}&\cdots&\cdots&\Theta_{13}^{\left(l\right)}\\\vdots&&&\vdots\\\Theta_{30}^{\left(l\right)}&\cdots&\cdots&\Theta_{33}^{\left(l\right)}\\\end{matrix}\right]\times\left[\begin{matrix}x_0\\x_1\\x_2\\x_3\\\end{matrix}\right]\right) \]

具体来说,\(\Theta^{\left(l\right)}\)这个矩阵的行列视输入输出层特征数而定,
即输出特征数个行、输入特征数个列。
\(k\)等于隐层数加一,\(l\in\left[1,k\right]\)
整个\(\Theta\)实际上是个\(i\times j\times L\)的三维张量。

架构

字面意思,神经网络中神经元的连接方式。

简单案例:用神经网络构造逻辑函数

比如

\[ g\left(\left[\begin{matrix}-30&20&20\\\end{matrix}\right]\times\left[\begin{matrix}1\\x_1\\x_2\\\end{matrix}\right]\right)=a \]

(假设\(x_i\)为二进制输入,即只有0或1)
那么显然我们得到了逻辑与。
同理可以构造其他逻辑函数。

那么,如果有很多层数,就可以实现复杂的功能。

多元分类

假设一个问题的答案有且只有四类,
(而且互斥,比如把图片分为“人、车、狗、猫”四类)
那么我们就需要一个有四个输出的神经网络,
对应的四种答案为不同的\(y^{\left(i\right)}\)

\[ y=\left[\begin{matrix}1\\0\\0\\0\\\end{matrix}\right], y=\left[\begin{matrix}0\\1\\0\\0\\\end{matrix}\right], y=\left[\begin{matrix}0\\0\\1\\0\\\end{matrix}\right], y=\left[\begin{matrix}0\\0\\0\\1\\\end{matrix}\right] \]

那么就容易表述了,可以表示为成对的输入输出\(\left(x^{\left(i\right)},y^{\left(i\right)}\right)\)

反向传播算法

神经网路的代价函数

从上面的讨论可见,神经网络类似于多层多元复合的逻辑回归,
那么其代价函数也类似,或者说由逻辑回归推导而来。

\[ J\left(\Theta\right)=−\frac{1}{m}\sum_{i=1}^{m}\sum_{k=1}^{K}\left[y_k^{\left(i\right)}ln\left(h_\Theta\left(x^{\left(i\right)}\right)\right)_k+\left(1-y_k^{\left(i\right)}\right)ln\left(1-\left(h_\Theta\left(x^{\left(i\right)}\right)\right)_k\right)\right]+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}\left(\Theta_{ji}^{\left(l\right)}\right)^2 \]

(注意\(\Theta_{j0}^{\left(l\right)}\)不参与正则化)
样本对数\(m\)
层数\(L\)
\(l\)层的单元数\(s_l\)(不含偏置项)
输出维度为\(K\),即\(y\)\(K\)个值的向量。

反向传播算法

其实本质还是按老样子用梯度下降法,不过这次的梯度计算比较复杂

\[ \frac{\partial}{\partial\Theta_{ij}^{\left(l\right)}}J\left(\Theta\right) \]

误差\(\delta\)

\[ \delta_j^{\left(L\right)}=a_j^{\left(L\right)}−y_j \]

\(L\)\(j\)节点的“误差”,
(编程的时候注意,对于偏置项\(a_\Theta^{\left(l\right)}\)没有误差)
最后一层\(L\)层的误差是参考\(y\),其他部分是从\(l+1\)层递推到\(l\)层。

\(\delta\)\(j\times\left(L-1\right)\)的二维张量(第一层没有误差\(\delta^{\left(1\right)}\)), 描述\(\Theta\)映射过程中在每一个节点产生的误差)

反向递推出前面的值

\[ \delta^{\left(l\right)}=\left(\Theta^{\left(l\right)}\right)^T\delta^{\left(l+1\right)}.∗g^\prime\left(z^{\left(l\right)}\right) \]

其中

\[ g^\prime\left(z^{\left(l\right)}\right)=g\left(z^{\left(l\right)}\right) .∗\left(1-g\left(z^{\left(l\right)}\right)\right)=a^{\left(l\right)}.∗(1−a^{\left(l\right)}) \]

对于每个参数\(\Theta_{ij}^(l)\)的梯度求解方法

已知训练样本数据集为\(\left\{\left(x^{\left(c\right)},y^{\left(c\right)}\right)\right\} \left(c\in\left[1,m\right]\right)\)
初始化\(\Delta_{ij}^{\left(l\right)}=0 \left(\forall l,i,j\right)\)
\(\Delta\)\(i\times j\times l\)的三维张量,不妨称之为总误差,
它用来累加储存对于所有训练样本,在\(\Theta_{ij}^{\left(l\right)}\)映射过程中产生的误差)
计算所有的样本 for c = 1 : m
  前向传播初始化,设置\(a^{\left(1\right)}=x^{\left(c\right)}\)
  前向传播计算\(a^{\left(l\right)} \left(l\ from\ 2\ to\ L\right)\)
  反向传播初始化,设置\(\delta^{\left(L\right)}=a^{\left(L\right)}−y^{\left(i\right)}\)
  反向传播计算\(\delta^{\left(l\right)} \left(l\ from\ L-1\ to\ 2\right)\)
  (\(\delta^{\left(1\right)}\)是输入层,没有误差)
  那么现在我们已经得到了\(a,\delta\),可以开始计算总误差
  \(\Delta_{ij}^{\left(l\right)}+=a_j^{\left(l\right)}\delta_i^{\left(l+1\right)} \left(\forall l,i,j\right)\)
  (上面这一步可以向量化地写成\(\Delta^{\left(l\right)}+=\delta^{\left(l+1\right)}\left(a^{\left(l\right)}\right)^T\)
把上面这个对于所有样本的循环计算完后,(当然,编程的时候建议不用循环直接用矩阵运算)
引入D,计算
\(\left(\forall l,i,j\right)\)
\(D_{ij}^{\left(l\right)}=\frac{1}{m}\Delta_{ij}^{\left(l\right)}+\lambda\Theta_{ij}^{\left(l\right)} \left(j\neq0\right)\)
\(D_{ij}^{\left(l\right)}=\frac{1}{m}\Delta_{ij}^{\left(l\right)}   \ \ \  \left(j=0\right)\)
好了我们终于得到了梯度的结果

\[ \frac{\partial}{\partial\Theta_{ij}^{\left(l\right)}}J\left(\Theta\right)=D_{ij}^{\left(l\right)} \]

随机初始化

对于神经网路的\(\Theta\),不能全部初始化为零(这样根本没法更新),
应当将其用别的初始化方法,比如随机初始化。
这样的初始化操作称为“对称破坏”,即破坏神经网络的对称性,让它真正起作用。