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

根据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)

[J( heta)=-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}}( heta_{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)})^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 总结

神经网络结构的选择

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

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

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

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

训练步骤

  1. 构建一个神经网络,随机初始化权重
  2. 执行前向传播算法,计算(h_ heta(x))
  3. 编写计算代价函数的代码
  4. 执行反向传播算法,计算偏导数项
  5. 使用梯度检验进行比较,然后停用
  6. 将最优化算法和反向传播算法结合,来最小化代价函数
原文地址:https://www.cnblogs.com/angelica-duhurica/p/10928012.html