感知机
感知机就是我们前面学过的线性分类器加上一个激活函数。 线性分类器:
很多实际问题并不是线性可分的,所以需要用一个非线性函数将上述结果变为非线性的。
常用的激活函数有sigmoid 、tanh、ReLU、Softplus:
它们的函数图像分别是:
多层神经网络
单层感知机无法处理或模拟像异或这种函数。如果将感知机连接起来构成一个多层神经网络,则可以满足类需求。也就说说多层神经网络的模拟能力远超过单层神经网络。。
设神经网络有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 层的激活函数。
误差函数
误差函数采用 二阶范式 即
各种求导
为了下面的推导方便,我们先给出各种函数的求导结果。
sigmoid :
tanh:
ReLU:
Softplus:
线性函数
反向传播算法
为了能对这个神经网络模型进行学习,我们同样采用梯度下降法。我们求损失函数
(式11)
这个式子是怎么得到的呢? 观察(式1)可以看出 hl 是 hl−1 的函数。所以运用复合函数求导法则,形成了上述公式。
我们再计算一个L(w)对
wl+1
的偏导数
(式12)
可以分析得到以下结论:
其一、最后一项为相应层的输出 hl 对相应 的 wl 求导, 前面的项从最后的误差函数一直向前求导。
(式13)
其二、L(w)对
wl
求导和 对
wl+1
求导公式有很多相同项。令
整理(式11)和(式12)得到
对于最后一层,其输出就是整个神经网络的输出,所以不能用这个公式, 应该使用下面的公式。
这个 σl 称为误差传播项,可以从高层向低层逐层计算。
那么 ∂hl+1/∂hl 如何计算呢? 根据(式1),可以得到:
其中 ∂φl+1/∂v 就是 (式5) - (式10)给出的,根据这个层的激活函数选用对应的偏导数。
有了误差L(w)对
wl
的偏导数,我们就可以使用梯度下降法求更新权值了。
(式17)
代入(式13)和(式14),得到
(式18)
程序实现思路
有了(式15)这个最核心的公式,我们就可以将每个层做成一个类,然后将他们串联起来就可以构造任意的多层神经网络。
matlab中没有类的概念,但有结构体,我们定义一个结构体并定义一组方法来构成一个“类”。
应该具有的方法有:
(1)前向传播 ,根据(式1)从底向上逐层计算每层的输出,最后一层的输出即神经网络的输出
hl
。
(2)误差后向传播。 根据(式15),从顶到底计算每一层的误差传播项
σl
(3)根据(式17)从底向上更新权值。