多层神经网络与反向传播算法

感知机

感知机就是咱们前面学过的线性分类器加上一个激活函数。 线性分类器:web

网上弄来的图

v=wTx+b=(iwixi)+b

不少实际问题并非线性可分的,因此须要用一个非线性函数将上述结果变为非线性的。算法

y=φ(v)

经常使用的激活函数有sigmoid 、tanh、ReLU、Softplus:

它们的函数图像分别是:
sigmoid网络

sigmoid(x)=11+ex

tanh

tanh(x)=exexex+ex

这里写图片描述

ReLU(x)=max(0,x)

这里写图片描述

softplus(x)=log(1+ex)

多层神经网络

单层感知机没法处理或模拟像异或这种函数。若是将感知机链接起来构成一个多层神经网络,则能够知足类需求。也就说说多层神经网络的模拟能力远超过单层神经网络。。svg

这里写图片描述

设神经网络有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 层的激活函数。atom

hl=φl(wTl1hl1+bl1),l=1,2,...,L
(式1)

偏差函数

偏差函数采用 二阶范式 即
spa

L(w)=12N(yylabel)T(yylabel)
(式2)
R(w)=λl=1LwTlwl+bl
(式3)
J(w)=L(w)+R(w)
(式4)

各类求导

为了下面的推导方便,咱们先给出各类函数的求导结果。
sigmoid :
3d

s=s(1s)
(式5)
tanh:
t=1t2
(式6)
ReLU:
r={01 if x<0 if x0
(式7)
Softplus:
p=sigmoid1
(式8)

线性函数
xml

y/w=w(wTx)=x
(式9)

w(wTw)=w
(式10)

反向传播算法

为了能对这个神经网络模型进行学习,咱们一样采用梯度降低法。咱们求损失函数

L(w)wl=L(w)hL˙hLhL1...hl+2hl+1˙hl+1hl˙hlwl

L(w)bl=L(w)hL˙hLhL1...hl+2hl+1˙hl+1hl˙hlbl

(式11)

这个式子是怎么获得的呢? 观察(式1)能够看出 hl hl1 的函数。因此运用复合函数求导法则,造成了上述公式。

咱们再计算一个L(w)对 wl+1 的偏导数

L(w)wl+1=L(w)hL˙hLhL1...hl+2hl+1˙hl+1wl+1

L(w)bl+1=L(w)hL˙hLhL1...hl+2hl+1˙hl+1bl+1

(式12)

能够分析获得如下结论:

其1、最后一项为相应层的输出 hl 对相应 的 wl 求导, 前面的项从最后的偏差函数一直向前求导。

L(w)wl=L(w)hl˙hlwl

L(w)bl=L(w)hl˙hlbl

(式13)
其2、L(w)对 wl 求导和 对 wl+1 求导公式有不少相同项。令

σl=L(w)hl
(式14)
整理(式11)和(式12)获得
σl=σl+1˙hl+1hl
(式15)

对于最后一层,其输出就是整个神经网络的输出,因此不能用这个公式, 应该使用下面的公式。

σL=L(w)hL

这个 σl 称为偏差传播项,能够从高层向低层逐层计算。

那么 hl+1/hl 如何计算呢? 根据(式1),能够获得:

hl+1hl=φl+1vl+1˙vl+1hl=φl+1v˙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˙hlwl=wlσlhlφl˙φlwl=wlσlhlφlhl1

bl=blαL(w)hl˙hlbl=wlσlhlφl˙φlbl=wlσlhlφl

(式18)

程序实现思路

有了(式15)这个最核心的公式,咱们就能够将每一个层作成一个类,而后将他们串联起来就能够构造任意的多层神经网络。

matlab中没有类的概念,但有结构体,咱们定义一个结构体并定义一组方法来构成一个“类”。

应该具备的方法有:

(1)前向传播 ,根据(式1)从底向上逐层计算每层的输出,最后一层的输出即神经网络的输出 hl
(2)偏差后向传播。 根据(式15),从顶到底计算每一层的偏差传播项 σl
(3)根据(式17)从底向上更新权值。

Matlab 实现