往期回顾:
02——逻辑回归/logistic回归、广义线性模型与最大熵模型
03——支持向量机以及核方法
04——从传统机器学习走向深度学习
让我们学习一下深度学习最基本的深度前馈网络(主要参考《深度学习》)
一、深度前馈网络的基本概念
深度前馈网络(deep freedforward network)也叫做前馈神经网络或者多层感知机(multilayer perception,MLP),是最典型的深度学习模型。它的目标是近似某个函数 f ∗ f^* f∗。
前向(feedforward) 是指信息流通过 x x x的函数,流经用于定义 f f f的中间过程,最终到达输出 y y y,模型的输出和模型本身之间没有反馈(feedback) 连接。 包含反馈连接的称为循环神经网络(recurrent neural network)。
网络(network) 是指神经网络通常用许多不同函数的复合来表示。该模型与一个有向无环图关联。例如经典的链式结构: f ( x ) = f ( 3 ) ( f ( 2 ) ( f ( 1 ) ( x ) ) ) f(x)=f^{(3)}(f^{(2)}(f^{(1)}(x))) f(x)=f(3)(f(2)(f(1)(x)))。此时 f ( 1 ) f^{(1)} f(1)称为网络的第一层,以此类推。链的全长称为深度 (也就是深度学习的来源),前馈网络的最后一层称为输出层,而中间层称为隐藏层。
神经网络,之所以叫“神经”,是因为它受到神经科学的启发。网络中的每个隐藏层通常都是向量值的。这些隐藏层的维数决定了模型的宽度。向量的每个元素都可以被视为类似一个神经元的作用。每一层既可以看作是向量到向量的函数,也可以把层看作许多并行操作的单元组成。每个单元是一个由向量到标量的函数。与神经元类似,这些单元接受来自其他单元的输入,并计算自己的激活值,传递给之后的单元。
但是,深度前馈网络只是为了实现统计泛化的函数近似机,并不是大脑的近似模型。 神经科学只是提供了些许灵感。
进一步理解神经网络
我们可以从线性模型出发去理解神经网络。
-
线性模型如逻辑回归和线性回归,无论是通过闭解形式还是使用凸优化,它们都能高效且可靠地拟合。但是线性模型只局限在线性函数中,模型的容量太小,不足以学习变量间非线性的相互作用。
-
为了扩展线性模型,我们可以把线性模型用于一个变换后的输入 ϕ ( x ) \phi(x) ϕ(x)上,这里的映射是一个非线性变换。同样,我们还可以用核技巧,得到一个隐含使用 ϕ \phi ϕ映射的非线性学习算法。
-
接下来我们需要考虑如何去选择 ϕ \phi ϕ:
- 第一种方法是选择一个通用的 ϕ \phi ϕ,比如无限维的 ϕ \phi ϕ ,它隐含在基于RBF核的核机器上。但是这经常会导致在测试集上的泛化不好。通用的特征映射通常只基于局部光滑的原则,并且没有足够的先验信息进行编码来解决高级问题。
- 另一种是手动的设计 ϕ \phi ϕ。在深度学习以前,这一直是主流的方法。但这种方法过于复杂,需要从业者足够擅长特定的领域才可以设计出较好的特征。并且不同领域之间很难去迁移。
- 深度学习的策略就是学习 ϕ \phi ϕ,此时我们的模型 y = f ( x ; θ , w ) = ϕ ( x ; θ ) T w . y=f(x;\theta,w)=\phi(x;\theta)^Tw. y=f(x;θ,w)=ϕ(x;θ)Tw.因此我们有两种参数:用于学习 ϕ \phi ϕ的参数 θ \theta θ,以及用于将 ϕ ( x ) \phi(x) ϕ(x)映射到所需输出的参数 w w w。学习 ϕ \phi ϕ意味着隐藏层的存在,同时也表明了我们放弃了问题的凸性,但是利大于弊。我们可以使学习到的 ϕ \phi ϕ变得高度通用,只需使用一个非常广泛的函数族 ϕ ( x ; θ ) \phi(x;\theta) ϕ(x;θ)——这反映了第一种方法的优点;另外,我们可以将一些先验知识编码进入网络来帮助泛化,只需要设计一些预期表现优异的函数族(注意:不用去寻找特定的函数)即可——这体现出了第二种方法的优点。
因此我们知道了神经网络的基本思想就是学习特征,接下来让我们学习一下部署一个网络的基本设计决策。
二、前馈神经网络的基本设计决策 —— 基于梯度的学习
设计神经网络与使用梯度下降训练其他机器学习模型并没有太大不同。但是神经网络的非线性导致了许多我们已知的代价函数变得非凸,因此我们的神经网络的训练通常使用迭代的、基于梯度的优化,且只会使得代价函数达到一个较小的值,但是用于非凸损失函数的随机梯度下降并不能保证会达到全局收敛,并且神经网络对于初始值很敏感,因此初始化的策略是很重要的。
总之,绝大多数的训练算法都是基于梯度的学习,或是对梯度下降思想的改进或提纯。当然,传统的机器学习算法也可以用梯度下降来训练,因此可以认为深度学习和其他模型本质上并没有太大区别。
1. 代价函数
与其他模型一样,我们需要选择一个代价函数来进行学习。我们可以直接使用传统的代价函数,也就是简单地使用最大似然原理,我们使用训练数据和模型预测之间的交叉熵作为代价函数。
另外,有时候我们不是预测 y y y的完整概率分布,而是仅预测给定 x x x的条件下 y y y的某些统计量。有些专门的损失函数允许我们训练这些预测器。
(1). 使用最大似然学习条件分布
最大似然与训练数据和模型分布间的交叉熵等价,即 J ( θ ) = − E x , y ∼ p ^ d a t a log p model ( y ∣ x ) J(\theta)=-\mathbb{E}_{x,y\sim\hat p_{data}}\log p_{\text{model}}(y|x) J(θ)=−Ex,y∼p^datalogpmodel(y∣x)使用最大似然的优势就是简便,只要我们明确一个模型 p ( y ∣ x ) p(y|x) p(y∣x)就自动确定了一个代价函数。
神经网络的代价函数的梯度必须足够大和具有足够的预测性,来为学习算法提供一个好的指引。在很多情况下,隐藏单元的激活函数会使函数变得饱和(变得非常平),从而使梯度非常小。因此负的对数似然可以在很多模型中避免这一问题。
(2). 学习条件统计量
有时我们想通过一个预测器学习概率分布的某些统计量。如果我们有一个足够强大的神经网络,即可以表示一大类函数中的任何一个函数 f f f,此时我们可以把代价函数看作一个泛函(functional),即由函数到实数的映射。我们的学习过程就是选择函数的过程,因此可以设计代价泛函使它的最小值处于特殊的函数上。对函数求解优化问题需要变分法这一工具,就不在这里详述了。我们只需知道变分法可以导出下面两个结果:
- 对于优化问题 f ∗ = arg min f E x , y ∼ p d a t a ∥ y − f ( x ) ∥ 2 f^*=\argmin_f \mathbb E_{x,y\sim p_{data}}\|y-f(x)\|^2 f∗=fargminEx,y∼p