Coursera平台 Andrew Ng《Machine Learning》课程 Nueral Network 一章学习笔记.
Neural Network Presentation
考虑如下的情况:特征数$n=100$,直接使用sigmoid函数的计算为$g(\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1x_2+\theta_4x_1^2x_2+\dots)$,仅二次的乘积有5000次,三次的乘积需计算$O(n^3)$次.对于许多情况,n很大,因而,采用直接计算乘积使用sigmoid函数的方法不是一个好办法.
对于CV,假设图像大小为$50\times50$像素,对于灰度图$n=(50\times50=)2500$,即
$$
x=
\begin{pmatrix}
像素1(0-255)\
像素2(0-255)\
\vdots\
像素2500(0-255)
\end{pmatrix}
$$
$x_i\times x_j$越有300万个特征,计算量极大.
神经元模型:Logistic Unit
对于具有3个特征$x_1 x_2 x_3$的逻辑回归,$h_\theta(x)=\frac{1}{1+\exp{(-\theta^Tx)}}$,其中$x=\begin{pmatrix}x_0 & x_1 & x_2 & x_3\end{pmatrix}^T$,$\theta=\begin{pmatrix}\theta_0 & \theta_1 & \theta_2 & \theta_3\end{pmatrix}^T$.
###一个3层的神经网络
上图中,Layer 1 称为 Input Layer,Layer 2 称为 Hidden Layer,Layer 3 称为 Output Layer,$a^{(j)}_i$为第j层第i个单元的激励,$\Theta^{(j)}$为控制第j到第j+1层的映射函数的比重.
上图中,
$$
a^{(2)}1=g(\Theta^{(1)}{10}x_0 + \Theta^{(1)}_{11}x_1 + \Theta^{(1)}_{12}x_2 + \Theta^{(1)}_{13}x_3)
$$
$$
a^{(2)}2=g(\Theta^{(1)}{20}x_0 + \Theta^{(1)}_{21}x_1 + \Theta^{(1)}_{22}x_2 + \Theta^{(1)}_{23}x_3)
$$
$$
a^{(2)}3=g(\Theta^{(1)}{30}x_0 + \Theta^{(1)}_{31}x_1 + \Theta^{(1)}_{32}x_2 + \Theta^{(1)}_{33}x_3)
$$
$$
h_\Theta(x)=a^{(3)}1=g(\Theta^{(2)}{10}a^{(2)}0 + \Theta^{(2)}{11}a^{(2)}1 + \Theta^{(2)}{12}a^{(2)}2 + \Theta^{(2)}{13}a^{(2)}_3)
$$
其中$x_0=a^{(2)}_0=1$
若第$j$层有$s_j$个单元,$j+1$层有$s_{j+1}$个 单元,则矩阵$\Theta^{(j)}$为$s_j \times s_{j+1}$阵.
取$z^{(2)}1=\Theta^{(1)}{10}x_0 + \Theta^{(1)}_{11}x_1 + \Theta^{(1)}_{12}x_2 + \Theta^{(1)}_{13}x_3$,$z^{(2)}2=\Theta^{(1)}{20}x_0 + \Theta^{(1)}_{21}x_1 + \Theta^{(1)}_{22}x_2 + \Theta^{(1)}_{23}x_3$,$z^{(2)}3=\Theta^{(1)}{30}x_0 + \Theta^{(1)}_{31}x_1 + \Theta^{(1)}_{32}x_2 + \Theta^{(1)}_{33}x_3$.
则$z^{(2)}=\Theta^{(1)}x=\begin{pmatrix}z^{(2)}_1 \ z^{(2)}_2 \ z^{(2)}_3 \end{pmatrix} \in \mathbb{R}^3$
同理,$z^{(3)}=\Theta^{(2)}a^{(2)}, h_\Theta(x)=a^{(3)}=g(z^{(3)})$
以上计算过程可称前向传播(Foward Propogation).
简单例子:“与”门
记$x_1, x_2 \in \begin{Bmatrix} 0,1\end{Bmatrix},x=\begin{pmatrix} 1 \ x_1 \ x_2\end{pmatrix},h_\Theta(x)=g(\Theta_0+\Theta_1x_1+\Theta_2x_2)$.
取$\Theta=\begin{pmatrix} -30 \ 20 \ 20\end{pmatrix}$,则输入与输出关系如下:
$$
\begin{array}{c|c|c}
{x_1} & {x_2} & {h_\Theta(x)} \
\hline
{0} & {0} & {g(-30)\approx 0} \
{0} & {1} & {g(-10)\approx 0} \
{1} & {0} & {g(-10)\approx 0} \
{1} & {1} & {g(30)\approx 1}
\end{array}
$$
故而$h_\Theta(x) \approx x_1 \land x_2$
多类别分类
例如$h_\Theta(x) \in \mathbb{R}^4$,我们希望$h_\Theta(x) \approx \begin{pmatrix} 1\0\0\0 \end{pmatrix},\dots,\begin{pmatrix} 0\0\0\1 \end{pmatrix}$,这与逻辑回归相似,只不过有了4个类别.
设训练集为$((x^{(1)},y^{(1)}),\dots,(x^{(m)},y^{(m)})$,其中
$y^{(i)}=
\begin{Bmatrix}
\begin{pmatrix} 1\0\0\0 \end{pmatrix},
\begin{pmatrix} 0\1\0\0 \end{pmatrix},
\begin{pmatrix} 0\0\1\0 \end{pmatrix},
\begin{pmatrix} 0\0\0\1 \end{pmatrix}
\end{Bmatrix}
$
Cost Function
用$l$表示层数,$s_l$表示第$l$层的单元个数.
对于逻辑回归,有
$$
J(\theta)=-\frac{1}{m}[\sum\limits_{i=1}\limits^{m} y^{(i)}\log h_\theta(x^{(i)}) + (1-y^{(i)})\log (1-h_\theta(x^{(i)}))] + \frac{\lambda}{2m} \sum\limits_{j=1}\limits^{n} \theta_j^2
$$
对神经网络,有
$$
h_\Theta(x) \in \mathbb{R}^K,(h_\Theta(x))i=i^{th} \mathtt{output}
$$
$$
J(\Theta)=- \frac{1}{m}\left[\sum\limits{i=1}\limits^{m} \sum\limits_{k=1}\limits^{K} y^{(i)}k\log h\Theta(x^{(i)})_k + (1-y^{(i)}k)\log(1-h\Theta(x^{(i)})k)\right] + \frac{\lambda}{2m} \sum\limits{l=1}\limits^{L-1} \sum\limits_{i=1}\limits^{s_l} \sum\limits_{j=1}\limits^{s_l+1} \left(\Theta^{(l)}_{j i}\right)^2
$$
Back Propogation
我们希望获取$\Theta$使得$J(\Theta)$最小.为此,需要计算$J(\Theta)$和$\frac{\partial}{\partial\Theta^{(l)}_{i j}}J(\Theta)$.
偏导项的计算
假设有一个训练样本$(x,y)$,存在4层的神经网络,每个 Hidden Layer 有3个单元,$x \in \mathbb{R}^3$,$y \in \mathbb{R}^4$.
使用前向传播算法计算如下.
$$
\begin{align}
& 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)})
\end{align}
$$
定义$\delta^{(l)}_j$为第$l$层第$j$个单元的“误差”,则$\delta^{(i)}$的计算方向与$z^{(l)}$、$a^{(l)}$相反.
$$
\begin{align}
& \delta^{(4)}=a^{(4)}-y \in \mathbb{R}^4 \
& \delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)} . g’(z^{(3)}) \
& \delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)} . g’(z^{(2)}) \
\end{align}
$$
其中$g’(z^{(l)})$是对$g(z^{(l)})$的求导,$g’(z^{(l)})=a^{(l)}.*(1-a^{(l)})$.
可以证明,忽略bias项时,有$\frac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta)=a^{(l)}_j\delta^{(l+1)}_i$.
Back Propogation Algrithm
设训练集${(x^{(1)},y^{(1)}),\dots,(x^{(m)},y^{(m)})}$.
置$\Delta^{(l)}_{i j} = 0,\ \mathrm{for\ all\ i,\ j,\ l}$.
$$
\begin{align}
& \mathrm{for\ i=1:m} \
& \quad a^{(1)}:=x^{(i)} \
& \quad 使用\mathrm{Foward\ Propogation}计算a^{(l)},l=2,3,\dots,L. \
& \quad 利用y^{(i)}计算\delta^{(L)}=a^{(L)}-y^{(i)}. \
& \quad 计算\delta^{(L-1)},\delta^{(L-2)},\dots,\delta^{(2)}. \
& \quad \Delta^{(l)}{i j} := \Delta^{(l)}{i j} + a^{(l)}_j\delta^{(l+1)}j \
& \mathrm{end} \
& D^{(l)}{i j} := \frac{1}{m}\Delta^{(l)}{i j} + \lambda\Theta^{(l)}{i j},\ \mathrm{if}\ j \neq 0. \
& D^{(l)}{i 0} := \frac{1}{m}\Delta^{(l)}{i j}
\end{align}
$$
Gradient Checking
当$\epsilon$很小时,$\frac{d}{d\theta}J(\theta) \approx \frac{J(\theta + \epsilon) - J(\theta - \epsilon)}{2\epsilon}$.
对于神经网络,$\Theta \in \mathbb{R}^n$.
$$
\begin{align}
& \mathrm{for\ i = 1 : n} \
& \quad \theta^+ = \theta;\ \theta^+(i) = \theta(i) + \epsilon; \
& \quad \theta^- = \theta;\ \theta^-(i) = \theta(i) - \epsilon; \
& \quad \frac{\partial}{\partial\theta(i)}J(\theta) = \frac{J(\theta^+) - J(\theta^-)}{2\epsilon} \
& \mathrm{check\ that\ } \frac{\partial}{\partial\theta}J(\theta) \approx \mathrm{DVec}
\end{align}
$$
在使用 gradient check 确认算法正确之后,由于其计算量大,不再使用,直接使用BP算法.
Random Initialize
在神经网络中,将$\Theta$初始化为全0,会导致神经网络失去非对称性.随机初始化用于打破这种对称性.将$\Theta^{(l)}_{i j}$的值随机初始化为$[-\epsilon,\epsilon]$之间的一个数,其中$\epsilon$是个很小的正数.
Puting It Together
选择一个神经网络
- 神经网络有几层,每层包含几个unit.
- 特征$x^{(i)}$的维数.
- 类别数($y^{(i)}$的维数).
训练神经网络
- 随机初始化$\Theta^{(l)}_{i j}$.
- 实现前向传播,利用$x^{(i)}$计算$h_\Theta(x^{(i)})$.
- 计算 cost function $J(\Theta)$.
- 利用反向传播算法计算$\frac{\partial}{\partial\Theta^{(l)}{i j}}J(\Theta)$.
$$
\begin{align}
& \mathrm{for}\ i = 1 : m \
& \quad 对(x^{(i)},y{(i)})实现前向传播和反向传播 \
& \quad 计算\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)}\left(a^{(l)}\right)^T \
& \mathrm{end} \
& 计算 \frac{\partial}{\partial\Theta^{(l)}{i j}}J(\Theta)
\end{align}
$$ - 使用 Gradient Check 检验正确性.
- 使用梯度下降或其他优化方法,最小化$J(\Theta)$.