前馈神经网络(Deep feedforward network) 可以说是深度学习最核心的模型之一。前馈神经网络的目的是对于输入
,假设我们要模拟从输入到输出的真实函数
,神经网络想要找到这样的映射
和合适的参数
使得其预测尽量接近于真实函数
。
一.解释前馈神经网络
下面分别解释一下前馈,神经,和网络三个词的含义。
1.前馈
前馈代表了所有的信息都从输入 经过某些中间的计算而最终输出到
,而不存在从模型的输出到输入的反馈(feedback),对于有反馈的情况即为循环神经网络(recurrent neural network)前馈网络已经广泛应用在工业界,其重要性不言而喻,而且它也是理解在自然语言处理中应用广泛的循环神经网络的基础。
2.网络
而网络则代表了该模型是将不同的基本函数组合在一起形成的模型。
例如通过将三个函数
串联起来构成最终的函数
,
就是网络的第一层,
就是网络的第二层,以此类推。这个链的长度又被称作网络的深度(depth),深度学习也因此得名。而前馈网络的最后一层被称作输出层(output layer),对于我们的训练数据,每一个输入
都有相应的标记
,而网络的输出层的结果需要尽量接近
。
但对于其它层来说,和训练数据没有这样的直接对应关系,即我们的算法只要求最后的输出接近于真实的标记,而对于中间每层的目的并没有明确定义,所以这些层又被称作隐藏层(hidden layer)。
3.神经
神经代表了它的灵感部分受到了神经科学的影响。每一隐藏层通常是矢量值,而这些隐藏层的维度定义了网络的宽度。我们可以将每层看做从一个大的从矢量到矢量的函数映射,但从另一方面也可以将矢量的每个元素看做一个小的神经元,每个神经元进行了矢量到标量的映射操作(这一操作又被称作激活函数,activation function),而每一层是不同的神经元并行运算的综合。
前馈神经网络的提出是为了解决传统线性模型的一些限制。线性模型如逻辑回归或者线性回归的优势是我们有的可以快速求出解析解,有的可以利用convex optimization来解决。但同时,线性模型也受限于只能模拟线性关系,而很难学习不同输入参数间的关系。
为了将线性模型扩展到非线性函数,我们可以对于输入
做非线性变换
,再利用对于的线性模型解决该问题,例如支持向量机中提到的kernel trick。我们可以将
理解为从
向其蕴含的特征的映射,或者理解为对于
的一种新的表征(representation)。
- 对于如何选取映射 有如下几种思路:选取一个比较通用的,例如kernel trick中的RBF kernel(也称作Gaussian kernel),如果的维度足够高,我们总能够使其匹配训练集,但很难推广到测试集。因为这种模型只是假设了局域变化不大的前提,而并没有包含任何有价值的先验信息。
- 人工选取合适的 ,实际上这是在深度学习流行之前普遍采用的方法,但是这需要大量的相关经验与人力资源,而且不同领域间的知识很难迁移。
- 深度学习的策略是利用神经网络学习合适的用隐藏层代表的映射 ,即模拟 ,其中 是 的模拟参数,而 是从 到最终输出的映射参数。它结合了第一和第二种方法,我们可以从比较通用的函数家族中学习 ,同时也可以利用经验对函数家族的选择进行一些限制。与第二种方法比较,其优势在于我们只需要找到一个比较合适的函数家族,而不需要知道确切的函数。
二.前馈神经网络解决问题原理
下面就利用异或操作的模拟来简单解释前馈神经网络解决非线性问题的原理。
用神经网络模拟XOR
异或操作XOR定义为对于两个二进制输入
,如果其中有且仅有一个为1,则XOR输出1,否则输出0,如下图所示:
从图中可以看出,我们无法对该空间进行线性分割,使得两个输出为1的点落在分割线同一侧,而两个输出为0的点落在分割线另一侧。所以,传统的线性模型无法解决这一问题。为了解决这个问题,我们需要找到一个新的特征空间,使得在新空间中能用线性模型来解决。
我们引入一个如下图所示的简单的具有一层隐藏层的前馈网络模型:
注意图中两种方式表示是等价的,左图是具体画出每个节点,而右图是简化为层。
假设我们用
模拟从输入到隐藏层的映射,而用
模拟从隐藏层到输出的线性映射,则整个模型可以表示为
,那我们如何选取
呢,通常在神经网络中我们选称作rectified linear unit(整流线性单元),简称为RELU的激活函数,其形式为
。
同时选取
为线性函数,我们的模型转化为
。
我们的输入用矩阵表示为:
而希望模拟的对应的输出是:
对于我们的模型,我们可以找到如下的解【问题简单,所以可以很快得到】:
同时
。我们可以做如下验证,经过
操作后,我们的隐藏层的值为:
即我们已经从原空间映射到隐藏层所代表的空间:
可以看到在新空间中,原来的输出为1的两个点已经汇聚在同一点
,因此我们可以找到该空间的线性分割,使得两个输出为1的点落在分割线同一侧,而两个输出为0的点落在分割线另一侧。
我们继续将h,w,b代入可得最终输出:
这个例子中,我们用简单的神经网络并找到合适的解来模拟XOR操作,实际中问题要复杂得多,而我们不能这么容易的猜到合适的解,这时候我们就需要利用梯度下降算法来逼近合适的解。