神经网络
概述
- 当问题变量过多,即n过大时,传统方式计算量过大,难以给出预期结果。因此引出神经网络算法
- 基本原理是模仿人脑
模型
-
单个神经元——逻辑单元
-
将神经元模拟成一个逻辑单元。其中hθ(x)=1+e−θTx1,x=⎣⎢⎢⎡x0x1x2x3⎦⎥⎥⎤,θ=⎣⎢⎢⎡θ0θ1θ2θ3⎦⎥⎥⎤,x0=1。

-
偏置单元:即x0
-
激活函数:即为非线性函数g(x)=1+e−x1
-
模型权重:即为参数θ
-
多个神经元
a12,a22,a32为中间神经元。第一层称为输入层,最后一层为输出层,中间层为隐藏层

-
激活项:由一个具体神经元计算并输出的值
-
aij表示第j层第i个激活项,其中a0j=1
-
Θj表示用于控制从第j层到第j+1层的映射函数的权重矩阵。如果第j层有sj个激活项,第j+1层有sj+1激活项(sj不包含a0j),则Θj为sj+1×(sj+1)维矩阵。Θikj表示第j层第k个神经元连接到第j+1层第i个神经元的权重。
-
神经网络的架构:神经网络中不同神经元的连接方式
-
计算过程
a12=g(Θ101x0+Θ111x1+Θ121x2+Θ131x3)
a22=g(Θ201x0+Θ211x1+Θ221x2+Θ231x3)
a32=g(Θ301x0+Θ311x1+Θ321x2+Θ331x3)
hΘ(x)=a13=g(Θ102a02+Θ112a12+Θ122a22+Θ132a32)
-
向量化
x=⎣⎢⎢⎡x0x1x2x3⎦⎥⎥⎤,z2=⎣⎡z12z22z32⎦⎤,其中z12=Θ101x0+Θ111x1+Θ121x2+Θ131x3,其余同理
z2=Θ1x=Θ1a1,a2=g(z2)。添加第二层偏置单元a02=1
z3=Θ2a2,hΘ(x)=a3=g(z3)
此计算过程也称为向前传播,从输入层到隐藏层再到输出层
多类别分类问题

三个输出可以处理三个分类对象,hθ(x)∈R3,hθ=⎣⎡100⎦⎤,⎣⎡010⎦⎤,⎣⎡001⎦⎤
神经网络训练算法
问题描述
神经网络示意图

训练集为{(x1,y1),(x2,y2),⋯,(xm,ym)}
L表示所用神经网络的层数,此处L=4
sl表示第l层的单元数,不包含偏置单元
代价函数
逻辑回归代价函数:J(θ)=−m1i=1∑m[yilog(hθ(xi))+(1−yi)log(1−hθ(xi))]+2mλj=1∑nθj2
神经网络代价函数:hθ(x)∈RK (hΘ(x))i=ithoutput,其中K为类别个数
J(Θ)=−m1i=1∑mk=1∑K[yilog(hΘ(xi))k+(1−yki)log(1−(hΘ(xi))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θjil)2
反向传播算法
目的:求使得J(Θ)最小的Θ
需要计算的项:J(Θ),\frac{\part}{\part\Theta^l_{ij}}J(\Theta)
相关参数计算:
-
δjl表示第l层第j个节点的误差,\delta^l_j=\frac{\part J(\Theta)}{\part z^l_j}
-
输出层δj4=aj4−yj,向量化δ4=a4−y
隐藏层δ3=(Θ3)Tδ4.∗g′(z3),g′(z3)=a3.∗(1−a3)δ2=(Θ2)Tδ3.∗g′(z2),g′(z2)=a2.∗(1−a2),.∗表示MATLAB中两个向量的乘法
输入层没有误差,所以没有δ1项
算法具体过程:
-
训练集:{(x1,y1),(x2,y2),⋯,(xm,ym)}
-
设置对于任意的l,i,j,Δijl=0
-
For i=1 to m
- a1=xi
- 正向计算al,l=2,3,…,L
- 使用yi计算δL=aL−yi
- 反向计算δL−1,δL−2,⋯,δ2
- Δijl:=Δijl+ajlδil+1,向量形式Δl:=Δl+δl+1(al)T
Dijl:=m1Δijl+λΘijl,j=0
Dijl:=m1Δijl,j=0
-
\frac{\part}{\part\Theta^l_{ij}}J(\Theta)=D^l_{ij},然后即可使用梯度下降算法或者别的优化算法
理解算法:

梯度检测

考虑以上函数图像,我们可以使用2ϵJ(θ+ϵ)−J(θ−ϵ)来近似dθdJ(θ)的值,通常取ϵ=10−4。
当θ=⎣⎢⎢⎢⎡θ1θ2⋮θn⎦⎥⎥⎥⎤时,我们可以使用类似的思想来估计素有的偏导数项:
\frac{\part J(\theta)}{\part\theta_1}\approx\frac{J(\theta_1+\epsilon,\theta_2,\theta_3,\dots,\theta_n)-J(\theta_1-\epsilon,\theta_2,\theta_3,\dots,\theta_n)}{2\epsilon},其余同理。
通过上述方式估算导数之后,与我们从反向传播算法中得到的导数相比较,相差较小,则说明反向传播算法是正确的。当检验确定反向传播算法实现正确之后,在进行实际学习时,不要进行梯度检验,因为梯度检验算法速度很慢,浪费计算资源。
随机初始化
初始化每个Θijl为[−ϵ,ϵ]内的随机值,ϵ和梯度检测无关,ϵ接近0
训练神经网络的过程
- 选择一个合适的神经网络架构
- 随机初始化权重
- 使用前向传播算法
- 计算代价函数
- 使用反向传播算法计算偏导数
- 使用梯度检测检查反向传播算法的结果
- 使用最优化方法和反向传播算法结合来最小化
参考资料