根据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 最小化
反向传播算法
参考
\(\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 总结
神经网络结构的选择
输入单元的数量:特征维度的数量
输出单元的数量:类的数量
隐藏层的数量:单个,多个(每个隐藏层有相同的单元数)
隐藏单元数量:越多越好(但是计算量会变大)
训练步骤
- 构建一个神经网络,随机初始化权重
- 执行前向传播算法,计算\(h_\theta(x)\)
- 编写计算代价函数的代码
- 执行反向传播算法,计算偏导数项
- 使用梯度检验进行比较,然后停用
- 将最优化算法和反向传播算法结合,来最小化代价函数