问题的提出
从图像识别问题入手。
比如,对于识别是不是汽车的问题,图像上的每个像素点就是一个特征,
(假设是灰度图像,即像素只需要考虑强度大小,对于RGB彩色图其实同理)
(上图只是用两个像素点举个简单的例子)
显然,这是非线性的分类问题。
考虑一般的图片,有上百万、千万的像素,显然特征太多了,用前面的方法无法解决。
因此,用神经来学习复杂的非线性假设。
神经网络模型
神经元 neuron
本来是生物学概念。信息从树突输入,通过轴突输出。
如下图,不妨用一个黄圈表示一个神经元。
那么就可以用下图表示之前的逻辑回归模型。
\[ \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\),不能全部初始化为零(这样根本没法更新),
应当将其用别的初始化方法,比如随机初始化。
这样的初始化操作称为“对称破坏”,即破坏神经网络的对称性,让它真正起作用。