感知机
感知机就是我们前面学过的线性分类器加上一个激活函数。 线性分类器:
v=wTx+b=(∑iwixi)+b
很多实际问题并不是线性可分的,所以需要用一个非线性函数将上述结果变为非线性的。
y=φ(v)
常用的激活函数有sigmoid 、tanh、ReLU、Softplus:
它们的函数图像分别是:
sigmoid(x)=11+e−x
tanh(x)=ex−e−xex+e−x
ReLU(x)=max(0,x)
softplus(x)=log(1+e−x)
多层神经网络
单层感知机无法处理或模拟像异或这种函数。如果将感知机连接起来构成一个多层神经网络,则可以满足类需求。也就说说多层神经网络的模拟能力远超过单层神经网络。。
设神经网络有L+1层,每一层的输出分别为
[h0,h1,h2,h3,...,hL
,其中
hi
均为增广向量。
h0
为输入
x⃗
,h_L 为
y⃗
。
各层的权值为
[w1,w2,w3,...,bL]
和
[b1,b2,b3,...,wL]
。可以认为第0层没有权值,因为他的输出
h0
就是x,或者也可以认为
w0
为全一向量。这样
h0=1˙x
.
令
φl
表示第
l
层的激活函数。
hl=φl(wTl−1hl−1+bl−1),l=1,2,...,L
(式1)
误差函数
误差函数采用 二阶范式 即
L(w)=12N(y−ylabel)T(y−ylabel)
(式2)
R(w)=λ∑l=1LwTlwl+bl
(式3)
J(w)=L(w)+R(w)
(式4)
各种求导
为了下面的推导方便,我们先给出各种函数的求导结果。
sigmoid :
s′=s(1−s)
(式5)
tanh:
t′=1−t2
(式6)
ReLU:
r′={01 if x<0 if x≥0
(式7)
Softplus:
p′=sigmoid−1
(式8)
线性函数
∂y/∂w=∂∂w(wTx)=x
(式9)
∂∂w(wTw)=w
(式10)
反向传播算法
为了能对这个神经网络模型进行学习,我们同样采用梯度下降法。我们求损失函数
∂L(w)∂wl=∂L(w)∂hL˙∂hL∂hL−1...∂hl+2∂hl+1˙∂hl+1∂hl˙∂hl∂wl
∂L(w)∂bl=∂L(w)∂hL˙∂hL∂hL−1...∂hl+2∂hl+1˙∂hl+1∂hl˙∂hl∂bl
(式11)
这个式子是怎么得到的呢? 观察(式1)可以看出
hl
是
hl−1
的函数。所以运用复合函数求导法则,形成了上述公式。
我们再计算一个L(w)对
wl+1
的偏导数
∂L(w)∂wl+1=∂L(w)∂hL˙∂hL∂hL−1...∂hl+2∂hl+1˙∂hl+1∂wl+1
∂L(w)∂bl+1=∂L(w)∂hL˙∂hL∂hL−1...∂hl+2∂hl+1˙∂hl+1∂bl+1
(式12)
可以分析得到以下结论:
其一、最后一项为相应层的输出
hl
对相应 的
wl
求导, 前面的项从最后的误差函数一直向前求导。
∂L(w)∂wl=∂L(w)∂hl˙∂hl∂wl
∂L(w)∂bl=∂L(w)∂hl˙∂hl∂bl
(式13)
其二、L(w)对
wl
求导和 对
wl+1
求导公式有很多相同项。令
σl=∂L(w)∂hl
(式14)
整理(式11)和(式12)得到
σl=σl+1˙∂hl+1∂hl
(式15)
对于最后一层,其输出就是整个神经网络的输出,所以不能用这个公式, 应该使用下面的公式。
σL=∂L(w)∂hL
这个
σl
称为误差传播项,可以从高层向低层逐层计算。
那么
∂hl+1/∂hl
如何计算呢? 根据(式1),可以得到:
∂hl+1∂hl=∂φl+1∂vl+1˙∂vl+1∂hl=∂φl+1∂v˙wl+1
(式16)
其中
∂φl+1/∂v
就是 (式5) - (式10)给出的,根据这个层的激活函数选用对应的偏导数。
有了误差L(w)对
wl
的偏导数,我们就可以使用梯度下降法求更新权值了。
wl=wl−α∂L(w)∂wl
bl=wbl−α∂L(w)∂bl
(式17)
代入(式13)和(式14),得到
wl=wl−α∂L(w)∂hl˙∂hl∂wl=wl−σl∂hl∂φl˙∂φl∂wl=wl−σl∂hl∂φlhl−1
bl=bl−α∂L(w)∂hl˙∂hl∂bl=wl−σl∂hl∂φl˙∂φl∂bl=wl−σl∂hl∂φl
(式18)
程序实现思路
有了(式15)这个最核心的公式,我们就可以将每个层做成一个类,然后将他们串联起来就可以构造任意的多层神经网络。
matlab中没有类的概念,但有结构体,我们定义一个结构体并定义一组方法来构成一个“类”。
应该具有的方法有:
(1)前向传播 ,根据(式1)从底向上逐层计算每层的输出,最后一层的输出即神经网络的输出
hl
。
(2)误差后向传播。 根据(式15),从顶到底计算每一层的误差传播项
σl
(3)根据(式17)从底向上更新权值。
Matlab 实现