机器学习(2)- 神经网络

根据Andrew Ng在斯坦福的《机器学习》视频做笔记,已经通过李航《统计学习方法》获得的知识不赘述,仅列出提纲。

1 神经网络学习

1.1 非线性假设

\(n\)很大时,用逻辑回归建立非线性假设并不是一个好做法

1.2 模型展示

模仿了大脑中的神经元(计算单元):树突(input)、轴突(output)

偏置单元(bias unit):\(x_0=1\)

权重(weights/parameters):\(\theta\)

激活函数(activation function):\(g(z)\)

神经网络就是一组神经元连接在一起的集合。

第一层:输入层(input layer)

中间层:隐藏层(hidden layer)

最后一层:输出层(output layer)

\(a_i^{(j)}\):第\(j\)层的第\(i\)个激活项(神经元);

\(\theta^{(i)}\)代表从第\(j\)层映射到第\(j+1\)层时的权重的矩阵。

向量化

\(a_1^{(2)}=g(\theta_{10}^{(1)}x_0+\theta_{11}^{(1)}x_1+\theta_{12}^{(1)}x_2+\theta_{13}^{(1)}x_3\)

\(a_2^{(2)}=g(\theta_{20}^{(1)}x_0+\theta_{21}^{(1)}x_1+\theta_{22}^{(1)}x_2+\theta_{23}^{(1)}x_3\)

\(a_3^{(2)}=g(\theta_{30}^{(1)}x_0+\theta_{31}^{(1)}x_1+\theta_{32}^{(1)}x_2+\theta_{33}^{(1)}x_3\)

\(z^{(2)}=\Theta^{(1)}x=\theta^{(1)}a^{(1)}\),则\(a^{(2)}=g(z^{(2)})\)

添加\(a_0^{(2)}=1\)

\(z^{(3)}=\Theta^{(2)}a^{(2)},h_\theta(x)=a^{(3)}=g(z^{(3)})\)

其中\(x=\begin{bmatrix}x_0 \\ x_1 \\ x_2 \\ x_3 \\ \end{bmatrix}\quad\)\(z^{(2)}=\begin{bmatrix}z_1^{(2)} \\ z_2^{(2)} \\ z_3^{(2)} \\ \end{bmatrix}\quad\)

可以知道:每一个\(a\)都是由上一层所有的\(x\)和每一个\(x\)所对应的\(\theta\)决定的。

把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )

例子

利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。

\(\text{XNOR}=( \text{x}_1\, \text{AND}\, \text{x}_2 )\, \text{OR} \left( \left( \text{NOT}\, \text{x}_1 \right) \text{AND} \left( \text{NOT}\, \text{x}_2 \right) \right)\)

1.3 利用神经网络解决多元分类问题

如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。

输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现\([a \ b \ c \ d]^T\),且\(a,b,c,d\)中仅有一个为1,表示当前类。

2 神经网络参数的反向传播算法

2.1 代价函数

\(L\):网络中总层数

\(s_l\):第\(l\)层的单元数(不包含偏差单元)

\(K\):输出类别个数(≥3)

\[J(\theta)=-\frac{1}{m}[\sum_{i=1}^{m}\sum_{k=1}^{K}{{{y}_k^{(i)}}\log({h_\Theta}({{x}^{(i)}}))_k+( 1-{{y}_k^{(i)}})\log(1-{h_\Theta}({{x}^{(i)}}))_k]}+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}(\theta_{jl}^{(l)})^2 \]

2.2 最小化

反向传播算法

参考https://blog.csdn.net/qq_29762941/article/details/80343185

\(\delta_j^{(l)}=a_j^{(l)}-y_j\):第\(l\)层的第\(j\)节点的误差,实际上是\(cost(i)\)关于\(z_j^{(l)}\)的偏导

\(\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})\),其中\(g'(z^{(3)})=a^{(3)}.*(1-a^{(3)})\)

\(\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)})\),其中\(g'(z^{(2)})=a^{(2)}.*(1-a^{(2)})\)

\(\frac{\partial}{\partial {{\theta }_{ij}^{l}}}J({\Theta})=a_j^{(l)}\delta_i^{(l+1)}\)(忽略\(\lambda\),即不做任何正则化处理时)

实现

首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。

???

\(for \ i=1 \ to \ m \\ \ \ \ \ set \ a^{(i)}=x^{(i)} \\ \ \ \ \ perform \ forward \ propagation \ to \ compute \ a^{(l)} \ for \ l=2,3,\cdots,L \\ \ \ \ \ using \ y^{(i)},compute \ \delta^{(L)}=a^{(L)}-y^{(i)} \\ \ \ \ \ compute \ \delta^{(L-1)},\delta^{(L-2)},\cdots,\delta^{(2)} \\ \ \ \ \ \Delta_{ij}^{(l)}:=\Delta_{ij}^{(l)}+a_j^{(l)}\delta_i^{l+1} \\ D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)} (if \ y\ne0)\\ D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)} (if \ j=0)\)

最终,\(\frac{\partial }{\partial {{\theta }_{ij}^{l}}}J({\Theta})=D_{ij}^{(l)}\)

梯度检验

双侧差分:(计算量大,不适合用于计算,而是用来检验)

\(\theta\)为实数时,\(\frac{d}{d_\theta}J(\theta)≈\frac{J(\theta+\epsilon)-J(\theta-\epsilon)}{2\epsilon}\)

\(\theta\)\(n\)维向量时,\(\frac{\partial}{\partial\theta_1}J(\theta)≈\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,\cdots,\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,\cdots,\theta_n)}{2\epsilon}\)

检验上述算出的导数与反向传播算法算出的\(D\)是否相似。

2.3 随机初始化

全0初始化:隐藏单元都在计算相同的特征(高度冗余)

↓(解决对称权重问题)

随机初始化:在\([-\epsilon,\epsilon]\)上取随机值

3 总结

神经网络结构的选择

输入单元的数量:特征维度的数量

输出单元的数量:类的数量

隐藏层的数量:单个,多个(每个隐藏层有相同的单元数)

隐藏单元数量:越多越好(但是计算量会变大)

训练步骤

  1. 构建一个神经网络,随机初始化权重
  2. 执行前向传播算法,计算\(h_\theta(x)\)
  3. 编写计算代价函数的代码
  4. 执行反向传播算法,计算偏导数项
  5. 使用梯度检验进行比较,然后停用
  6. 将最优化算法和反向传播算法结合,来最小化代价函数
posted @ 2019-05-26 22:20  白芷呀  阅读(210)  评论(0编辑  收藏  举报