根据Andrew Ng在斯坦福的《机器学习》视频做笔记,已经通过李航《统计学习方法》获得的知识不赘述,仅列出提纲。
1 神经网络学习
1.1 非线性假设
当(n)很大时,用逻辑回归建立非线性假设并不是一个好做法
1.2 模型展示
模仿了大脑中的神经元(计算单元):树突(input)、轴突(output)
偏置单元(bias unit):(x_0=1)
权重(weights/parameters):( heta)
激活函数(activation function):(g(z))
神经网络就是一组神经元连接在一起的集合。
第一层:输入层(input layer)
中间层:隐藏层(hidden layer)
最后一层:输出层(output layer)
(a_i^{(j)}):第(j)层的第(i)个激活项(神经元);
( heta^{(i)})代表从第(j)层映射到第(j+1)层时的权重的矩阵。
向量化
(a_1^{(2)}=g( heta_{10}^{(1)}x_0+ heta_{11}^{(1)}x_1+ heta_{12}^{(1)}x_2+ heta_{13}^{(1)}x_3)
(a_2^{(2)}=g( heta_{20}^{(1)}x_0+ heta_{21}^{(1)}x_1+ heta_{22}^{(1)}x_2+ heta_{23}^{(1)}x_3)
(a_3^{(2)}=g( heta_{30}^{(1)}x_0+ heta_{31}^{(1)}x_1+ heta_{32}^{(1)}x_2+ heta_{33}^{(1)}x_3)
↓
令(z^{(2)}=Theta^{(1)}x= heta^{(1)}a^{(1)}),则(a^{(2)}=g(z^{(2)}))
添加(a_0^{(2)}=1)
(z^{(3)}=Theta^{(2)}a^{(2)},h_ heta(x)=a^{(3)}=g(z^{(3)}))
其中(x=egin{bmatrix}x_0 \ x_1 \ x_2 \ x_3 \ end{bmatrix}quad),(z^{(2)}=egin{bmatrix}z_1^{(2)} \ z_2^{(2)} \ z_3^{(2)} \ end{bmatrix}quad)。
可以知道:每一个(a)都是由上一层所有的(x)和每一个(x)所对应的( heta)决定的。
把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION )
例子
利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。
( ext{XNOR}=( ext{x}_1\, ext{AND}\, ext{x}_2 )\, ext{OR} left( left( ext{NOT}\, ext{x}_1 ight) ext{AND} left( ext{NOT}\, ext{x}_2 ight) ight))
1.3 利用神经网络解决多元分类问题
如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。
输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现([a b c d]^T),且(a,b,c,d)中仅有一个为1,表示当前类。
2 神经网络参数的反向传播算法
2.1 代价函数
(L):网络中总层数
(s_l):第(l)层的单元数(不包含偏差单元)
(K):输出类别个数(≥3)
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)})^Tdelta^{(4)}.*g'(z^{(3)})),其中(g'(z^{(3)})=a^{(3)}.*(1-a^{(3)}))
(delta^{(2)}=(Theta^{(2)})^Tdelta^{(3)}.*g'(z^{(2)})),其中(g'(z^{(2)})=a^{(2)}.*(1-a^{(2)}))
(frac{partial}{partial {{ heta }_{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)}+lambdaTheta_{ij}^{(l)} (if y e0)\ D_{ij}^{(l)}:=frac{1}{m}Delta_{ij}^{(l)} (if j=0))
最终,(frac{partial }{partial {{ heta }_{ij}^{l}}}J({Theta})=D_{ij}^{(l)})
梯度检验
双侧差分:(计算量大,不适合用于计算,而是用来检验)
Ⅰ( heta)为实数时,(frac{d}{d_ heta}J( heta)≈frac{J( heta+epsilon)-J( heta-epsilon)}{2epsilon})
Ⅱ( heta)为(n)维向量时,(frac{partial}{partial heta_1}J( heta)≈frac{J( heta_1+epsilon, heta_2, heta_3,cdots, heta_n)-J( heta_1-epsilon, heta_2, heta_3,cdots, heta_n)}{2epsilon})
检验上述算出的导数与反向传播算法算出的(D)是否相似。
2.3 随机初始化
全0初始化:隐藏单元都在计算相同的特征(高度冗余)
↓(解决对称权重问题)
随机初始化:在([-epsilon,epsilon])上取随机值
3 总结
神经网络结构的选择
输入单元的数量:特征维度的数量
输出单元的数量:类的数量
隐藏层的数量:单个,多个(每个隐藏层有相同的单元数)
隐藏单元数量:越多越好(但是计算量会变大)
训练步骤
- 构建一个神经网络,随机初始化权重
- 执行前向传播算法,计算(h_ heta(x))
- 编写计算代价函数的代码
- 执行反向传播算法,计算偏导数项
- 使用梯度检验进行比较,然后停用
- 将最优化算法和反向传播算法结合,来最小化代价函数