一文理清深度学习前馈神经网络

🚙 Index

  • 多层感知机(MLP)介绍
  • 深度神经网络的激活函数
  • 深度神经网络的损失函数
  • 多层感知机的反向传播算法
  • 神经网络的训练技巧
  • 深度卷积神经网络

前馈神经网络(feedforward neural network)是一种最简单的神经网络,各神经元分层排列。每一个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。是目前应用最普遍、发展最迅速的人工神经网络之一。研究从20世纪60年代开始,目前理论研究和实际应用达到了很高的水平html

——百度百科python

而深度学习模型,相似的模型统称是叫 深度前馈网络(Deep Feedforward Network),其目标是拟合某个函数f,因为从输入到输出的过程当中不存在与模型自身的反馈链接,所以被称为“前馈”。常见的深度前馈网络有:多层感知机、自编码器、限制玻尔兹曼机、卷积神经网络等等。算法

01 多层感知机(MLP)介绍

提及多层感知器(Multi-Later Perceptron),不得不先介绍下单层感知器(Single Layer Perceptron),它是最简单的神经网络,包含了输入层和输出层,没有所谓的中间层(隐含层),可看下图:网络

file

也就是说,将输入向量赋予不一样的权重向量,整合后加起来,并经过激活函数输出1或-1,通常单层感知机只能解决线性可分的问题,以下图:机器学习

file

我选择了0个隐含层,也就是咱们介绍的单层感知机,对于能够线性可分的数据,效果仍是能够的。若是我换成线性不可分的数据集,以下图,那么跑半天都跑不出个什么结果来。ide

file

这个时候就引入多层感知器,它相比单层感知器多了一个隐含层的东西,一样的数据集,我加入两层 隐含层,瞬间就能够被分类得很好。函数

file

对于上面直观的了解,我这里仍是要深刻介绍一下多层感知机的原理。Multi-Layer Perceptron(咱们后面都叫MLP),MLP并无规定隐含层的数量,所以咱们能够根据本身的需求选择合适的层数,也对输出层神经元没有个数限制。性能

02 深度神经网络的激活函数

感知机算法中包含了前向传播(FP)和反向传播(BP)算法,但在介绍它们以前,咱们先来了解一下深度神经网络的激活函数。学习

为了解决非线性的分类或回归问题,咱们的激活函数必须是非线性的函数,另外咱们使用基于梯度的方式来训练模型,所以激活函数也必须是连续可导的。 @ 磐创 AI优化

经常使用的激活函数主要是:

Sigmoid激活函数

Sigmoid函数就是Logistic函数,其数学表达式为:
$$
f(z) = \frac{1}{1+e^{-z}}
$$
对应函数图像为:

file

对应的导函数为:
$$
f^{'}(z) = f(z)(1-f(z))
$$
能够看出,Sigmoid激活函数在定义域上是单调递增的,越靠近两端变化越平缓,而这会致使咱们在使用BP算法的时候出现梯度消失的问题。

Tanh激活函数

Tanh激活函数中文名叫双曲正切激活函数,其数学表达式为:
$$
f(z)=tanh(z)=\frac{\sin hz}{\cos hz}=\frac{e^z-e^{-z}}{e^z+e^{-z}}
$$
对应函数图像为:

file

对应的导函数为:
$$
f^{'}(z)=1-(f(z))^2
$$
一样的,tanh激活函数和sigmoid激活函数同样存在梯度消失的问题,可是tanh激活函数总体效果会优于Sigmoid激活函数。

Q:为何Sigmoid和Tanh激活函数会出现梯度消失的现象?

A:二者在z很大(正无穷)或者很小(负无穷)的时候,其导函数都会趋近于0,形成梯度消失的现象。

ReLU激活函数

ReLU激活函数又称为修正线性单元或整流性单元函数,是目前使用比较多的激活函数,其数学表达式为:
$$
f(z)=max(0,z)
$$
对应函数图像为(a):

file

对应的导函数为:
$$
f^{'}=\begin{cases} 1,z>0; \ 0,z \leq0 \end{cases}
$$
ReLU激活函数的收敛速度要比上面两种要快得多,ReLU激活函数的X轴左侧值恒为0,使得网络具备必定的稀疏性,从而减小参数之间的依存关系,缓解了过拟合的状况,并且它的导函数有部分为常数1,所以不存在梯度消失的问题。但ReLU激活函数也有弊端,那就是会丢失一些特征信息。

LReLU激活函数

上面能够看到LReLU激活函数的图像了,它和ReLU激活函数的区别在于当z<0时,其值不为0,而是一个斜率为a的线性函数(通常a会是一个十分小的正数),这样子即起到了单侧抑制,也不彻底丢失负梯度信息,其导函数表达式为:
$$
f^{'}=\begin{cases} z,z>0; \ az,z \leq0 \end{cases}
$$

03 深度神经网络的损失函数

损失函数(Loss Function)又被称为Cost Function,做用是用来表示预测值与真实值之间的偏差,深度学习模型的训练是基于梯度的方法最小化Loss Function的过程,下面就介绍几种常见的损失函数。

均方偏差损失函数

均方偏差(Mean Squared Error,MSE)是比较经常使用的损失函数,其数学表达式以下:
$$
MSE=\frac{1}{2N}\sum_{k=1}^n (y_k- \hat{y_k})^2
$$

交叉熵损失函数

交叉熵(Crocs Entropy)损失函数使用训练数据的预测值与真实值之间的交叉熵来做为损失函数,其数学表达式以下:
$$
H(p,q)=E_p[\frac{1}{log(q)}] = - \sum_xp(x)log(q(x))
$$

适用场景

通常来讲,MSE更适合输出值为连续值,而且最后一层不含Sigmoid或Softmax激活函数的神经网络;而交叉熵则适合二分类或者多分类的场景。

04 多层感知机的反向传播算法

在MLP中,输入信号经过各个网络层的隐节点产生输出的过程,咱们称之为“前向传播“,而前向传播最终是产生一个标量损失函数。而反向传播算法(Backpropagation)则是将损失函数的信息沿着网络层向后传播用以计算梯度,达到优化网络参数的目的。

由于这篇文章仍是主要以引导了解为主,关于BP算法原理的讲解和推导就不展开,有兴趣的能够参考下面两篇文章(来自公众号 @磐创AI):

一文完全搞懂BP算法:原理推导+数据演示+项目实战(上篇)

一文完全搞懂BP算法:原理推导+数据演示+项目实战(下篇)

05 神经网络的训练技巧

神经网络的训练,经常会遇到的问题就是过拟合,而解决过拟合问题的方法也有不少,简单罗列下:Data Augmentation(数据增广)、Regularization(正则化)、Model Ensemble(模型集成)、Dropout等等。此外,训练深度学习网络还有学习率、权重衰减系数、Dropout比例的调参等。还有Batch Normalization,BN(批量归一化)也能够加速训练过程的收敛,有效规避复杂参数对网络训练效率的影响。

Data Augmentation

Data Augmentation也就是数据增广的意思,就是在不改变数据类别的状况下,这里主要针对图像数据来讲,主要包括但不限于:

1)角度旋转

2)随机裁剪

3)颜色抖动:指的是对颜色的数据加强,包括图像亮度、饱和度、对比度变化等

4)增长噪声:主要是高斯噪声,在图像中随机加入

5)水平翻转

6)竖直翻转

参数初始化

考虑到全链接的深度神经网络,同一层中的任意神经元都是同构的,因此拥有相同的输入和输出,若是参数所有初始化为同一个值,不管是前向传播仍是反向传播的取值都会是同样的,学习的过程将没法打破这种状况。所以,咱们须要随机地初始化神经网络的参数值,简单的通常会在 $$(-\frac{1}{\sqrt{d}},\frac{1}{\sqrt{d}})$$ 的均匀分布中去随机抽取,其中d是一个神经元接受的输入维度。

学习率

学习率咱们一般设为0.1,可是若是在实践中验证集上的loss或者accuracy不变的时候,能够考虑增长2~5倍的学习率。

Dropout原理

Dropout在深度学习网络训练中是十分经常使用的,指的是以必定的几率p随机丢弃一部分神经元节点,而这个“丢弃”只是临时的,是针对每一次小批量的训练数据而言,因为是随机丢弃,因此每一次的神经网络结构都会不同,至关于每次迭代都是在训练不一样结构的神经网络,有点像传统机器学习中的Bagging方法。

具体实现上,在训练过程当中,神经元的节点激活值以必定的几率p被“丢弃”,也就是“停工”。所以,对于包含N个神经元节点的网络,在Dropout的做用下能够看作是生成 2的N次方个模型的集合,这个过程会减弱全体神经元之间的联合适应性,减小过拟合的风险,加强泛化能力。

1564022901304

Batch Normalization原理

由于神经网络的训练过程本质就是对数据分布的学习,所以训练前对输入数据进行归一化处理显得很重要。咱们知道,神经网络有不少层,每通过一个隐含层,训练数据的分布会由于参数的变化而发生改变,致使网络在每次迭代中都须要拟合不一样的数据分布,这样子会增长训练的复杂度以及过拟合的风险。

所以咱们须要对数据进行归一化处理(均值为0,标准差为1),把数据分布强制统一再一个数据分布下,并且这一步不是一开始作的,而是在每次进行下一层以前都须要作的。也就是说,在网路的每一层输入以前增长一个当前数据归一化处理,而后再输入到下一层网路中去训练。

Regularizations(正则化)

这个咱们见多了,通常就是L一、L2比较常见,也是用来防止过拟合的。

L1正则化会使得权重向量w在优化期间变得稀疏(例如很是接近零向量)。 带有L1正则化项结尾的神经网络仅仅使用它的最重要的而且接近常量的噪声的输入的一个稀疏的子集。相比之下,最终的权重向量从L2正则化一般是分散的、小数字。在实践中,若是你不关心明确的特征选择,能够预计L2正则化在L1的性能优越。

L2正则化也许是最经常使用的正则化的形式。它能够经过将模型中全部的参数的平方级做为惩罚项加入到目标函数(objective)中来实现,L2正则化对尖峰向量的惩罚很强,而且倾向于分散权重的向量。

Model Ensemble(模型集成)

模型集成在现实中很经常使用,通俗来讲就是针对一个目标,训练多个模型,并将各个模型的预测结果进行加权,输出最后结果。主要有3种方式:

1)相同模型,不一样的初始化参数;

2)集成几个在验证集上表现效果较好的模型;

3)直接采用相关的Boosting和Bagging算法。

file

06 深度卷积神经网络(CNN)

终于来到了咱们耳熟能详的CNN了,也就是卷积神经网络(Convolutional Neural Network,CNN),它也是属于前馈神经网络的一种,其特色是每层的神经元节点只响应前一层局部区域范围内的神经元(全链接网络中每一个神经元节点则是响应前一层的所有节点)。

一个深度卷积神经网络模型,通常由若干卷积层叠加若干全链接层组成,中间包含各类的非线性操做、池化操做。卷积运算主要用于处理网格结构的数据,所以CNN天生对图像数据的分析与处理有着优点,简单地来理解,那就是CNN是利用滤波器(Filter)将相邻像素之间的轮廓过滤出来。

file

Convolution(卷积)

卷积的滤波器(Filter)咱们能够看作是一个window,能够观察下面的案例,有一个6X6的网络以及一个3X3的Filter,其中Filter的每一个格子上有权值。拿着FIlter在网络上去移动,直到全部的小格子都被覆盖到,每次移动,都将Filter“观察”到的内容,与之权值相乘做为结果输出。最后,咱们能够获得一个4X4的网格矩阵。(下面的6张图来自参考文献5,侵删)

file

Padding(填充)

卷积后的矩阵大小与一开始的不一致,那么咱们须要对边缘进行填充,以保证尺寸一致。

file

Stride(步长)

也就是Filter移动的步伐大小,上面的例子为1,其实能够由咱们本身来指定,有点像是学习率。

file

Depth(深度)

深度指的是图片的深度,一张6X6X3大小的图片通过3X3X3的Filter过滤后会获得一个4X4X1大小的图片,所以深度为1。咱们也能够经过增长Filter的个数来增长深度,以下:

file

Pooling(池化)

由于滤波器在进行窗口移动的过程当中会有不少冗余计算,效率很慢,池化操做的目的在于加速卷积操做,最经常使用的有Maxpooling,其原理以下图所示:

file

完整的深度CNN网络

file

卷积操做的本质

1)Sparse Interaction(稀疏交互)

由于卷积核的尺度会小于输入的维度,也就是咱们的FIlter会小于网络大小同样,这样子每一个输出神经元仅仅会与部分特定局部区域内的神经元存在链接权重(也就是产生交互),这种操做特性咱们就叫稀疏交互。稀疏交互会把时间复杂度减小好几个数量级,同时对过拟合的状况也有必定的改善。

2)Parameter Sharing(参数共享)

指的是在同一个模型的不一样模块使用相同的参数,它是卷积运算的固有属性。和咱们上面说的Filter上的权值大小应用于全部网格同样。

References

0)《百面机器学习》(文中未标明出处的图片均来自此书)

1)Tensorflow系列专题(四):神经网络篇以前馈神经网络综述

https://blog.csdn.net/fendouaini/article/details/83626441

2)深度学习之(神经网络)单层感知器(python)(一)

https://www.jianshu.com/p/d7189cbd0983?from=groupmessage

3)多层感知机及其BP算法(Multi-Layer Perception)

https://www.cnblogs.com/ooon/p/5577241.html

4)深度神经网络训练的必知技巧

https://www.cnblogs.com/mengmengmiaomiao/p/7852948.html

5)AI学习笔记——卷积神经网络(CNN)

https://www.jianshu.com/p/49b70f6480d1

本文由博客一文多发平台 OpenWrite 发布!