前馈神经网络入门:为什么我们需要它?_java


深度前馈网络(又称“多层感知器”)是大多数深度学习模型的基础。


卷积神经网络(CNN)和循环神经网络(RNN)这样的网络只是前馈网络的一些特殊情况。这些网络主要用于监控机器学习任务,在这些任务中,我们已经知道目标功能,即我们希望网络实现的结果,并且这些网络对于实践机器学习非常重要,构成了许多商业应用的基础。这些网络的出现极大地影响了如计算机视觉(computer vision)和自然语言理解(NLP)等领域。


前馈网络的主要目标是近似一些函数f*。例如,回归函数y = f *(x)将输入x映射到值y。前馈网络定义了y = f (x; θ)映射,并学习参数θ的值,使结果更加接近最佳函数。


这些网络之所以被称为前馈,是因为信息是向前流动的,因为x用于计算隐藏层中的某些中间函数,而隐藏层又用于计算y。在这种情况下,如果我们将最后一个隐藏层的反馈添加到第一个隐藏层,它将表示一个循环神经网络。


这些网络由许多不同的函数组成。每个模型都与描述函数的组合方式的非循环图相关联。例如,我们可能有三个函数f(1)、f(2)和f(3)连接在一个链中,形成f(x)=f(3)(f(2)(f(1)(x))。其中f(1)是第一层,f(2)是第二层,f(3)是输出层。


输入层和输出层之间的层称为隐藏层,因为训练数据没有显示这些层所需的输出。网络可以包含任意数量的隐藏层和任意数量的隐藏单元。一个单元基本上类似于一个神经元,它从前一层的单元中获取输入并计算自己的激活值。


现在问题来了,为什么当我们有线性机器学习模型时,还需要前馈网络?这是因为线性模型仅限于线性函数,而神经网络不是。当我们的数据不是线性可分离的线性模型时,面临着近似的问题,而神经网络则相当容易。隐藏层用于增加非线性并改变数据的表示,以便更好地泛化函数。


对于任何前馈神经网络的设计,有一些事情需要你决定,大多数网络需要一些成分,其中一些成分和设计机器学习算法是相同的。


前馈神经网络入门:为什么我们需要它?_java_02

优化器

 

优化器或优化算法用于将代价函数最小化,在每个训练周期或每轮后更新权重和偏置值,直到代价函数达到全局最优。

 

优化算法有两种:

 

一阶优化算法

 

这些算法使用与参数相关的梯度值最小化或最大化代价函数。一阶导数告诉我们函数是在某一点上递减还是递增,简而言之,它给出了与曲面切线。

 

二阶优化算法

 

这些算法使用二阶导数来最小化代价函数,也称为Hessian。由于二阶导数的计算成本很高,所以不常使用二阶导数。二阶导数告诉我们一阶导数是递增的还是递减的,这表示了函数的曲率。二阶导数为我们提供了一个与误差曲面曲率相接触的二次曲面。


前馈神经网络入门:为什么我们需要它?_java_03

前馈神经网络的体系结构


前馈神经网络入门:为什么我们需要它?_java_04

网络的结构

 

网络体系结构是指网络的结构,即隐藏层的数目和每层的隐藏单元数。根据通用逼近定理,具有一个线性输出层和至少一个具有任意“压缩”激活函数的隐藏层的前馈网络,只要网络具有足够的隐层,就可以用任何期望的非零误差,将任意一个有限维空间中的Borel可测函数近似为另一个有限维空间中的Borel可测函数。这个定理简单地说明,无论我们试图学习什么函数,总会有一个多层感知机(MLP)能够表示这个函数。

 

我们现在知道总会有一个MLP能够解决我们的问题,但是没有特定的方法来确定MLP的体系结构。没有人可以说,如果我们使用具有m个隐藏单元、n层的结构,我们就能够解决给定的问题,找到这个不用猜测和试验方法的配置仍然是一个热门的研究领域,目前只能通过猜测和试验方法来完成。

 

找到正确的体系结构是困难的,因为我们可能需要尝试许多不同的配置,但是即使我们有了正确的MLP体系结构,它仍然可能无法表示目标函数。这是由两个原因造成的:一是优化算法可能无法找到与所需函数对应的参数的正确值;二是训练算法可能由于过拟合而选择错误的函数。


前馈神经网络入门:为什么我们需要它?_java_05

代价函数


任何训练点的代价函数都显示了我们的模型得出的近似值与我们试图达到的实际目标值之间的差异,并且始终是单值的,因为代价函数的工作是评估整个网络是如何的。与机器学习算法一样,前馈网络也使用基于梯度的学习方法进行训练,在这种学习方法中,使用随机梯度下降等算法来使代价函数达到最小化。


整个训练过程在很大程度上取决于我们的代价函数的选择,其选择或多或少与其他参数模型相同。


在我们的参数模型定义了p(y| x;)分布的情况下,我们只使用训练数据和模型预测之间的交叉熵作为代价函数。我们也可以用另一种方法来预测y在x上的一些统计,而不是预测y上的完全概率分布。


对于反向传播算法的代价函数,它必须满足两个属性:


代价函数必须能够表达为平均值。


代价函数不能依赖于输出层旁边网络的任何激活值。

 

代价函数的形式主要是C(W, B, Sr, Er),其中W是神经网络的权重,B是网络的偏置,Sr是单个训练样本的输入,Er是该训练样本的期望输出。

 

一些可能的代价函数是:

 

二次代价


前馈神经网络入门:为什么我们需要它?_java_06


该函数也被称为均方误差、最大似然率和差平方和。

 

交叉熵代价

前馈神经网络入门:为什么我们需要它?_java_07


这个函数也被称为伯努利负对数似然和二元交叉熵。

 

指数成本

前馈神经网络入门:为什么我们需要它?_java_08


海林格距离

前馈神经网络入门:为什么我们需要它?_java_09


该函数也称为“统计距离”。


前馈神经网络入门:为什么我们需要它?_java_10

输出单元


输出单元是存在于输出层中的那些单元,它们的任务是给我们期望输出或预测,从而完成神经网络必须执行的任务。输出单元的选择与代价函数的选择紧密相关。任何可以在神经网络中用作隐藏单元的单元也可以用作输出单元。


输出单元的选择如下:


线性单位


最简单的输出单元是用于高斯输出分布的线性输出单元,这些单元基于对输出层不提供非线性的仿射变换。给定h特征,一层线性输出产生一个矢量:


前馈神经网络入门:为什么我们需要它?_java_11

线性单元函数


对于线性层,对数似然最大化等同于均方误差最小化,最大似然使高斯分布的协方差近似更容易。


这些线性单元的优点是不饱和,即它们的梯度总是保持不变,从不接近于零,在那里这些单元对基于梯度的优化算法没有困难。


Sigmoid单位

前馈神经网络入门:为什么我们需要它?_java_12

Sigmoid单元函数


为了解决二元分类问题,我们结合了最大似然的Sigmoid输出单元。一个Sigmoid输出单元有两个组成部分,一个是使用线性层计算z=w*h+b,然后使用激活函数将z转换为概率。当使用其他损失函数时,例如均方误差,损失可以随时饱和,也就是说,梯度会收缩得太小而不利于学习。因此,最好使用最大似然。


Softmax单元


Softmax单位用于多输出分布,它用于具有n个可能值的离散变量上的概率分布,这也可以看作是表示二元变量上概率分布的Sigmoid函数的推广。Softmax函数定义如下:


前馈神经网络入门:为什么我们需要它?_java_13

Softmax单元函数


像Sigmoid函数一样,Softmax函数也可以饱和,也就是说梯度会收缩得太小而不利于学习。在Softmax的情况下,由于它有多个输出单元,因此这些单元只能在输入值之间的差异变得极端时饱和。


由于总概率始终为1且不可超过,因此这些单位由“赢家通吃”(winner take all)原则控制,若其中一输出值接近1,其他输出单位的输出值肯定将接近0。


隐藏单元


选择隐藏单元的类型也是一个热门的研究领域,没有一个特定的单元能够保证它在每个问题上都会优于其他所有的单元,但是我们仍然有一些单元是开始时默认的选择,例如,通常使用的是校正线性单元或通常称为Relu,这是由于直观的原因而不是经验。实际上,通常不可能提前预测哪一个最有效。选择一个隐藏的单元需要反复尝试,凭直觉选择一种隐藏的单元可能工作得很好,然后进行测试。


隐藏单位的可能选择是:


整流线性单元


这些函数使用由g(z)定义的激活函数


前馈神经网络入门:为什么我们需要它?_java_14


Relus很容易优化,因为它们类似于线性单元,它们之间的唯一区别是一半域的输出o。Relus之所以如此出名,是因为每当单元处于活动状态时,它们总是有一个恒定的大梯度。梯度方向比激活函数引入二阶效应对学习更有用。


ReLU有一个缺点,那就是不能通过基于梯度的方法来学习,因为它们的激活是零。


Relu有许多推广,这些概括是:


Absolute value rectification


Leaky ReLU


Parametric ReLU


Maxout units


其中,Maxout单位应用元素级函数g(z),Maxout单位将z分为k组。然后,每个最大输出单元输出其中一个组的最大元素。Maxout单元被认为是ReLU的最佳推广,因为它们具有冗余性,这是由于每个单元由多个过滤器驱动,这些过滤器帮助它们抵御灾难性遗忘,在这种遗忘中,神经网络忘记了如何执行它们训练过的任务。


前馈神经网络入门:为什么我们需要它?_java_15

Logistic sigmoid和双曲正切


Logistic sigmoid由以下公式给出:


前馈神经网络入门:为什么我们需要它?_java_16


双曲正切由以下公式给出:


前馈神经网络入门:为什么我们需要它?_java_17


这些单位密切相关,如:


前馈神经网络入门:为什么我们需要它?_java_18

双曲正切与sigmoid的关系


在ReLU之前,这些是神经网络最著名的选择,但现在它们的使用被忽略了,因为当z为正时,它们的饱和值为一个高值;当z为负时,它们的饱和为一个低值;只有当z接近0时,它们才对输入极为敏感。Sigmoid单元的广泛饱和使得基于梯度的学习非常困难。


前馈神经网络入门:为什么我们需要它?_java_19

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货


编译组:高亚晶、狄思云

相关链接:

https://towardsdatascience.com/feed-forward-neural-networks-c503faa46620


如需转载,请后台留言,遵守转载规范


推荐文章阅读


EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017 论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾


长按识别二维码可添加关注

读芯君爱你


前馈神经网络入门:为什么我们需要它?_java_20