神经元模型
M-P神经元模型:
当前的神经元负责处理输入信号
∑
i
=
1
n
w
i
x
i
\sum_{i=1}^{n}w_ix_i
∑i=1nwixi,其模拟了生物神经网络中的电位阈值激活,通过激活函数
f
f
f判断总输入是否大于阈值来决定输出
y
y
y:
y
=
f
(
∑
i
=
1
n
w
i
x
i
−
θ
)
y=f( \sum_{i=1}^{n}w_ix_i - \theta)
y=f(i=1∑nwixi−θ)
理想的
y
y
y是一个阶跃函数,但阶跃函数具有不光滑、不连续的性质,因此用连续光滑的sigmoid函数代替阶跃函数。
感知机与多层网络
感知机(perceptron)由两层神经元组成,其输出层通过激活函数处理,有点类似于逻辑回归下的二分类:
感知机能容易地实现线性可分的与或非运算,但对非线性可分的异或运算则无能为力。
要解决异或这样的非线性可分问题,两层神经元是不够的,多层神经元则可以解决,多层感知机也称为前馈神经网络、深层前馈网络,其目标都是近似某个函数(如这里的异或函数)。
权重
w
i
w_i
wi是能自动学习的,感知机的学习规则为:
w
i
←
w
i
+
Δ
w
i
Δ
w
i
=
η
(
y
−
y
^
)
x
i
w_i \leftarrow w_i + \Delta w_i \\ \Delta w_i = \eta(y-\hat{y})x_i
wi←wi+ΔwiΔwi=η(y−y^)xi
可以看出,其更新目标是就是近似
y
=
y
^
y=\hat{y}
y=y^,
y
^
\hat{y}
y^代表网络预测出来的值,
y
y
y则为理想的值(标签)。
误差逆传播算法—反向传播
一般我们叫做反向传播(Back Propagation)算法,但也许误差逆传播更能说明BP算法的本质。
神经网络的本质的训练是找出每一层感知机合适的权重
w
i
w_i
wi,我们相信存在一个最合适的
w
i
w_i
wi能保证我们的输出与真值(因为是监督学习)拟合的最好,也就是代价函数要尽可能的小。在逻辑回归中,我们用的是梯度下降的方法,或者用一些高级优化算法(如牛顿法、共轭梯度等)都会不可避免的用到梯度的信息,因为梯度在泰勒展开后能够做到一阶近似,能够衡量参数变化后的误差。
比如参数
w
w
w在函数
J
J
J从
w
0
w_0
w0增加了
δ
\delta
δ,那么J会产生
Δ
J
\Delta J
ΔJ的误差:
J
(
w
0
+
δ
)
−
J
(
w
0
)
=
δ
∂
∂
w
J
(
w
)
Δ
J
=
δ
∂
∂
w
J
(
w
)
J(w_0+\delta) - J(w_0) = \delta\dfrac{\partial }{\partial w} J(w)\\ \Delta J =\delta \dfrac{\partial }{\partial w} J(w)
J(w0+δ)−J(w0)=δ∂w∂J(w)ΔJ=δ∂w∂J(w)
神经网络是多个感知机的链接组合,输出层与真值的误差通过梯度反向传播给参数,参数再反向修正即可,同时神经网络的特点:数据特征太多,复合的网络结构导致直接单独逐个求导效率非常低,BP算法则是一种高性能计算导数的方法。
这里每个神经元的激活函数都是sigmoid激活函数。
假定神经网络的输出为
y
k
^
=
(
y
1
^
,
y
2
^
,
.
.
.
,
y
l
^
)
\hat{y_k}=(\hat{y_1},\hat{y_2},...,\hat{y_l})
yk^=(y1^,y2^,...,yl^),
l
l
l个输出
y
j
^
=
f
(
β
j
−
θ
j
)
=
σ
(
β
j
−
θ
j
)
\hat{y_j}=f(\beta_j - \theta_j)=\sigma(\beta_j - \theta_j)
yj^=f(βj−θj)=σ(βj−θj)
β
j
=
∑
h
=
1
q
w
h
j
b
h
\beta_j=\sum_{h=1}^{q}w_{hj}b_h
βj=∑h=1qwhjbh是第j个神经元的输入,
θ
j
\theta_j
θj是输出层第j个神经元的阈值。
代价函数假设为均方误差,也就是误差反向传播中的误差,目的是为了尽可能近似目标:
J
k
=
1
/
2
∑
j
=
1
l
(
y
j
^
−
y
j
)
2
J_k=1/2\sum_{j=1}^{l} (\hat{y_j} - y_j)^2
Jk=1/2j=1∑l(yj^−yj)2
任意参数
w
,
v
,
θ
,
γ
w,v,\theta,\gamma
w,v,θ,γ的更新估计式为:
μ
=
u
+
Δ
u
\mu=u+\Delta u
μ=u+Δu
下面我们用连接权
w
h
j
w_{hj}
whj作为参数
u
u
u的例子:
BP算法基于梯度下降的策略,以目标的负梯度方向对参数进行调整,对误差
J
J
J,给定学习率
η
\eta
η,有:
Δ
w
h
j
=
−
η
∂
J
∂
w
h
j
\Delta w_{hj}=-\eta \dfrac{\partial J}{\partial w_{hj}}
Δwhj=−η∂whj∂J
由上面的图5.7可以看出
w
h
j
w_{hj}
whj先影响到第
j
j
j个输出层神经元的输入值
β
j
\beta_j
βj,再影响到其输出值
y
j
k
^
\hat{y_j^k}
yjk^,然后影响到
J
k
J_k
Jk,故:
∂
J
∂
w
h
j
=
∂
J
∂
y
j
k
^
.
∂
y
j
k
^
∂
β
j
.
∂
β
j
∂
w
h
j
\frac{\partial J}{\partial w_{hj}}=\frac{\partial J}{\partial \hat{y_j^k} }.\frac{\partial \hat{y_j^k} }{\partial \beta_j}.\frac{\partial \beta_j}{\partial w_{hj}}
∂whj∂J=∂yjk^∂J.∂βj∂yjk^.∂whj∂βj
所以
Δ
w
h
j
\Delta w_{hj}
Δwhj的更新公式为:
Δ
w
h
j
=
η
y
j
k
^
(
1
−
y
j
k
^
)
(
y
j
k
−
y
j
k
^
)
b
h
\Delta w_{hj}=\eta \hat{y_j^k}(1-\hat{y_j^k})(y_j^k - \hat{y_j^k})b_h
Δwhj=ηyjk^(1−yjk^)(yjk−yjk^)bh
同理也可推出其它参数的更新式,权重的更新直到训练误差达到一个很小的值。
上面的推导只考虑了单个训练样本,称为“标准BP算法”,如果是考虑了所有的训练样本,则代价函数为:
J
=
1
m
∑
k
=
1
m
J
k
J=\frac{1}{m}\sum_{k=1}^{m}J_k
J=m1k=1∑mJk
基于此推出的更新则成为“累计BP算法”,“累计BP算法”在面临训练集非常大时更新缓慢,这时“标准BP算法”迭代次数虽然较多,但往往会更快的获得更好的解。
过拟合解决方案
由于其强大的表示能力,BP神经网络经常遭遇过拟合,其训练误差持续降低,但测试误差却可能上升,有两种策略常用来缓解BP网络的过拟合。
1. 早停
将数据集分成训练集和验证集,训练集用于计算梯度、阈值和权重,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回就有最小验证集误差的连接权重和阈值。
2. 正则化
在误差函数中加入一个正则项,
J
=
1
m
∑
k
=
1
m
(
y
k
^
−
y
k
)
2
+
λ
∑
i
w
i
2
J=\frac{1}{m}\sum_{k=1}^{m} (\hat{y_k} - y_k)^2+\lambda \sum_{i}w_{i}^2
J=m1k=1∑m(yk^−yk)2+λi∑wi2
正则项对大的连接权重进行惩罚,因为有些权重过高会导致高阶项占主导,从而过拟合,因为我们的目的是 min w J ( w ) \underset{w}{ \operatorname{min} }J(w) wminJ(w),正则项保证了 w i w_i wi不会过大。
参考
主要来源于周志华的西瓜书和吴恩达的公开课视频,知乎上关于反向传播的直观解释也非常好。
- 周志华—机器学习(西瓜书)
- 吴恩达-机器学习
- 如何直观地解释 backpropagation 算法? https://www.zhihu.com/question/27239198