前馈神经网络
前馈神经网络是最早被提出的神经网络,熟悉的单层感知机,多层感知机,卷积深度网络等都属于前馈神经网络,之所以叫前馈,可能是因为信息向前流:数据从输入–计算–输出步骤。像RNN有反馈连接的叫反馈神经网络。
神经元
科学家参考了生物神经元的结构,抽象了神经元模型MP,一个神经元模型包含:输入,计算,输出
如图:一个典型的神经元模型:包含n个输入,1个输出,计算功能(先求和,再将结果送入f激活函数中) 图中箭头代表连接,每个箭头都会包含一个权值w。一个神经网络的训练算法就是让权重的值调整到最佳,使得整个网络的训练效果最好。
- 激活函数:在MP模型里,函数f称为激活函数,激活函数将数据压缩到一定范围,其值大小将决定该神经元是否处于活跃状态。对于激活函数的要求是:非线性(如果线性,再多层都相当于两层),可微性,单调性。
单层感知机
感知机仅有两层:输入层和输出层。如图:输入层有4个输入单元,输出层有2个神经单元,其中y1的值是4个输入单元与权重相乘再求和,然后再用f激活函数激活后的值,同理f2也是。虽然输入相同不过对应的权重不同,
多层神经网络
由于单层感知机对线性可分或近似可分的数据处理效果很好,但是对线性不可分的数据的效果不理想,即使人们想到了增加输出层的神经元数,调正激活函数,都还是不好,后来人们想到增加层数,这就引入了多层神经网络。
如图:包含n个输入单元,p个隐藏单元,q个输出神经元 共两层神经网络。
增加了层数随之而来的计算复杂度也增加了。此刻人们面临的问题大致如下:
- 如何来缩小计算误差?
- 如何求最优解?
传统机器学习可以通过梯度下降或最小二乘法来解决。而神经网络该如何解决???
面对这些问题,直到1986年Hinton和Rumelhar等人提出了**反向传播(BP)**算法,解决了两层神经网络所需要的计算量问题。
反向传播(BP)
多层神经网络采用反向传播的主要思想步骤如下:
- ① 利用输入数据和其对应权重,从输入层到隐藏层,最后到达输出层,求出预测结果。
- ②利用预测结果和真实值构造损失函数求出损失值。
- ③利用损失函数,将损失值从输出层向隐藏层反向传播,直至传播到输入层,利用梯度下降算法求解参数梯度并优化。
- ④在反向传播过程中,根据误差调整各种参数的值,不断迭代上述过程直至收敛。
①②就是前向传播过程,③④就是反向传播过程。
如图(为了简单介绍,省略偏差b):C是损失函数,z是激活函数,
前向传播:
z
=
∑
i
=
1
2
(
w
i
x
i
)
z = \sum_{i=1}^2(w_ix_i)
z=i=1∑2(wixi),
a
=
g
(
z
)
=
1
/
(
1
+
e
−
z
)
a= g(z) = 1/(1+e^{-z})
a=g(z)=1/(1+e−z)
C
=
1
/
2
(
∣
∣
a
−
y
∣
∣
2
)
C = 1/2(||a-y||^2)
C=1/2(∣∣a−y∣∣2)
反向传播:
δ
(
a
)
=
∂
C
/
∂
a
=
−
(
y
−
a
)
\delta^{(a)} = \partial C/\partial a = -(y-a)
δ(a)=∂C/∂a=−(y−a)
δ
(
z
)
=
∂
C
/
∂
z
=
(
∂
C
/
∂
a
)
∗
(
∂
a
/
∂
z
)
=
δ
(
a
)
a
(
1
−
a
)
\delta^{(z)} = \partial C/\partial z =(\partial C/\partial a ) * ( \partial a/\partial z) = \delta^{(a)} a(1-a)
δ(z)=∂C/∂z=(∂C/∂a)∗(∂a/∂z)=δ(a)a(1−a)
再根据链式求导法则求C关于权重w和偏差b的梯度。
∇
w
C
=
(
∂
C
/
∂
z
)
∗
(
∂
z
/
∂
w
)
=
δ
(
z
)
x
T
\nabla_wC =(\partial C/\partial z)* ( \partial z/\partial w) =\delta^{(z)} x^T
∇wC=(∂C/∂z)∗(∂z/∂w)=δ(z)xT
深度学习的其他策略
随着神经网络的层数的增加,计算的复杂度增加,因微积分的链式规则导致的梯度不稳定,因深度导致的BP算法困难,信息丢失,对超参数敏感,对初始数据敏感,以及因此而导致的欠拟合或过拟合等,面对这些问题,目前也有策略,虽然不是完美,但也不错。如下:
- ①欠拟合我们采用正则化
- ②梯度不稳定采用ReLU
- ③难训练利用Batch Normalization,GPU,深度残差网络,
- ④超敏感问题采用自适应优化算法。
如何选择激活函数?常见的有:sigmoid,tanh,relu,softmax
图中分别是:sigmoid , tanh, relu激活函数
其对应的导数图如下:
答:当神经网络层数不多时,选择这四个都可以,当搭建的神经网络层数较多时,需要适当选举,不当将导致梯度消失,不宜选择sigmoid,tanh因为它们导数都小于1,将导致梯度消失。当然导数也不能大于1,大于1将导致梯度爆炸。
致谢
《python深度学习基于TensorFlow 》吴茂贵 王冬 李涛 杨本法 著