第六章 深度前馈网络
这种模型本质上是一个函数近似器。例如我们在某个自然得来的数据集中希望找到一个映射(y=f^{*}(x)),那么我们可以假设(y=f(x; heta)),这里的思想和线性回归很相似,如果取线性函数则直接得到线性模型。
那么网络一词用从何而来?这是因为前馈网络模型常常会采用多层函数进行拟合,从而得到类似于这样的模型:(y=a(b(c(d(e(f(g(x))))))))。这个函数链的全长就叫做模型的深度,其中函数(a())叫做函数的输出层。最内层的(g())的输入十分容易确定,但是中间的其他函数层的输入和输出都暂时无从得知,故称为隐藏层。
为了理解它,我们可以从线性模型出发,线性模型存在的比较严重的问题是无法对非线性函数或者非线性关系进行描述。我们可以这样改进线性模型:线性模型可以看成是若干个$ x_{i} (分量的线性组合,那么非线性模型可以看成是若干个) phi_{i}(x)(的线性组合。至于这里的) phi $的函数形式如何确定,我们大致有如下三种方式:
-
直接人为地指定一个固定形式的函数,例如:直接指定$ phi_{i}(x)=e{-frac{(x_{i}-mu)2}{sigma^{2}}}$
(问题:书中提到一般这种映射仅仅只是符合了“局部平滑原则”,但是并没有引入足够的先验信息?p122)
-
深度学习选择了从数据中学习出(phi_{i}(x))的具体形式。例如我们最终的模型为:$ y=phi(x; heta)^{ m T}omega $ 。那么我们的任务就是先将$ phi(x)$限定在某一个具有固定形式但没有固定参数的函数族中,之后把学习函数的问题缩小成学习参数的任务。这种方法是一种trade-off,因为这种确定函数的策略完全地放弃了函数的凸性,也就是说学习后得到的函数很可能不是一个凸函数,而非凸的函数形式在后续的优化工作中会使得算法的收敛性比较坏。(但是舍弃优化上的便利也是有好处的:这种确定函数的方式使得人类专家只需要确定正确的函数族?并且可以向训练过程中引入先验知识从而影响函数的形式?p123)
从零开始设计一个前馈网络的过程大致有如下几个步骤:
- 选择一个用来进行预测的模型,配套的代价函数和输出形式;
- 选择用于计算隐藏层数的激活函数的函数形式;
- 确定网络的层数、神经元之间的连接方式、每层有多少个单元等;
6.1 学习XOR函数——从零构建深度前馈网络
XOR函数可以认为是一个二元离散函数:
所以也很容易确定训练集:$ (1,1);(1,0);(0,1);(0,0)$,我们只需要把这四个实例的函数值准确预测出来即可。
我们先使用一种简单的策略进行学习,直接认为我们的拟合函数$ f^{*}(x)(是一个接收向量值的线性函数,这就成了一个线性回归问题,自然我们也能确定出损失函数的形式:) J(x; heta)=frac{1}{4}sum_{x}(f(x)-f(x; heta))^{2}$ 。既然选择了线性模型,我们的函数形式也得到了确定:(f(x; heta)=x^{ m T}omega+b)。
带入到上面的损失函数中,对其求最小值,我们甚至可以解出两个参数的具体值:(b=frac{1}{2}; omega=0)。但是(f(x; heta)=frac{1}{2})并不能令人满意。
解决这个问题的一个办法是,对数据集施加一个变换(g),将(x)空间变换成(h)空间,对变换(g)的要求是:我们还是用原先的模型进行函数拟合,但是要求模型在(h)空间上必须能得到线性模型。无形之中,我们就多引入了一层函数。完整的模型我们可以这样表示:
仍然认为(f^{(1)})最简单的线性模型可不可以?不可以:
实际上大多数的神经网络会这样设置它们的(f^{(1)}), 它们先将数据集进行一次仿射变换,之后再将结果用一个非线性变换作用一次,即得到(h=g(W^{ m T}x+b))。现代神经网络的设计中会默认采用这个函数(针对所有任务吗?):
这就是我们的模型了!下面我们在假设参数全都已知的情况下看一下它的分类效果:
最后再乘上我们的$ omega (则得到最终结果) (0,1,1,0)$。
6.2 基于梯度的学习
神经网络模型也采用梯度下降法进行训练,这和很多机器学习模型没有太大的区别。但是线性回归模型的解可以从方程组解析地求出,(logistic)回归和支持向量机又都有各自的能确保全局收敛性的凸优化算法(从而使得这些模型的优化可以指定任意初始值)。但是神经网络模型所对应的优化问题则不具有凸性,对参数的初始值十分敏感,所以在神经网络的训练之初,指定足够小的初始值是非常必要的。
除此之外,神经网络模型的构建思路就和其他机器学习模型没有太大的区别了,目前我们也无需关心优化算法的细节,只需要知道优化任务可以完成就行了。接下来我们讨论模型的代价函数。
6.2.1 代价函数
代价函数的选取原则其实也和其他模型相同。大多数情况下可以直接使用模型所定义的分布和最大似然条件进行优化;也有的情况需要我们从模型所定义分布的某个条件分布出发进行优化:
6.2.1.1 分布+最大似然条件
这是大多数神经网络会采取的代价函数。最大似然条件需要将分布取负对数并取期望,这样代价函数就和模型的交叉熵等价了(什么是交叉熵?p128):
倘若这里的(p)是一个高斯分布,则可得到最大似然估计等价于最小化均方误差。但实际上选取其他函数形式的分布(p({ m y}|{ m x})=f(x; heta)),也会得到完全相同的结论(如何证明?p129)
最大似然方法的
最大优势在于:
- 把代价函数的形式和分布的形式关联起来,减轻了设计上的麻烦;
- 现代神经网络设计中总是希望代价函数的梯度具有较大的模长。然而很多分布的密度函数常常是变化平缓的(指数分布密度和高斯密度)。大多数情况下取了负对数之后({ m ln}p)的平滑程度都要比(p)下降很多,这样自然能期望函数的梯度具有比较大的模长;
- 交叉熵形式的代价函数常常找不到最小值(不懂?p129);
6.2.1.2 利用条件统计量作为代价函数
有的时候我们的目的不是得到完整的概率分布(p(y|x; heta)),而仅仅是得到某个统计量(T(x))的函数形式。我们不妨举例我们要得到均值统计量的函数形式,即预测给定(x)作为输入条件下输出的均值。
这里我们不会选择最大似然条件产生代价函数。因为我们现在面临的任务和传统的最大似然估计不同,传统的最大似然估计往往是建立在模型确定但是参数未定的情况下,即分布(p)的函数形式是已知的,余下的任务仅仅是定出分布的几个参数而已。我们现在面临的任务是——一无所知!我们甚至无从得知(p)的函数形式,更不可能得到它的似然函数。
所以我们必须做到通过求解最大化或者最小化问题来确定函数形式!这自然涉及到了一些泛函的想法,即我们这里使用的是代价泛函,而不是代价函数。泛函能将函数映射为一个数,所以理论上有可能通过最大化或者最小化泛函值来反求出使其最大化或者最小化的函数,函数形式得以确定。
但是我们仍然面临一个初始选择——我们必须人为确定泛函的形式。例如我们可以设计一个均方误差代价泛函:
这样我们的学习准则就变成最小化代价泛函:
不同的代价泛函的有不同形式的学习准则,比如说还有:(e={ m argmin}_{f}{mathbb E}[||y-f(x)||])。
但是以上这两种学习准则在优化过程中表现的很不好。所以即便是没有必要预测整个分布时,也优先考虑交叉熵形式代价函数,而不去考虑均方误差等形式。
6.2.2 输出单元
首先要说明的是任何输出单元的函数形式也可以被隐藏单元采用。在本节中我们首先假设,输入(x)已经完成了第一层变换(h=f(x; heta))。