深度前馈网络
深度前馈网络也叫作前馈神经网络.之所以被称为前向的,因为信息流过x的函数,流经用于定义f的中间计算过程,最终到达输出y.在模型的输出和模型本身之间没有反馈连接.当前馈神经网络被扩展成包含反馈连接时,它们被称为循环神经网络.
前馈神经网络之所以被称作网络,是因为它们通常用许多不同函数复合在一起来表示.该模型与一个有向无环图相关联,而图描述了函数是如何复合在一起的.例如,有三个函数$f^{(1)}、f^{(2)}、f^{(3)}$连接在一个链上以形成f(x)=$f^{(3)}(f^{(2)}(f^{(1)}(x)))$.在这种情况下,$f^{(1)}$被称为网络的第1层,$f^{(2)}$称为第2层,以此类推.链的全长称为模型的深度(depth)。前馈网络的最后一层被称为输出层.在神经网络的训练过程中,我们会让f(x)去匹配$f^{ }(x)$的值.训练数据为我们提供了在不同训练点上取值的、含有噪声的$f^{ }(x)$的近似实例. 每个样本x都伴随着一个标签y≈$f^* (x)$.
隐藏层的维数决定了模型的宽度.向量的每个元素都可以被视为起到类似一个神经元的作用.除了将层想象成向量到向量的单个函数,我们也可以把层想象成由许多并行操作的单元(unit)组成,每个单元表示一个向量到标量的函数.每个单元在某种意义上类似一个神经元。
一种理解前馈网络的方式是从线性模型开始,并考虑如何克服它的局限性.线性模型,例如逻辑回归和线性回归,是非常吸引人的,因为无论是通过闭解形式还是使用凸优化,它们都能高效且可靠地拟合.线性模型也有明显的缺陷,那就是该模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用.
为了扩展线性模型来表示x的非线性函数,我们可以不把线性模型用于x本身,而是用在一个变换后的输入$\phi(x)$上,其中$\phi$是一个非线性变换.
剩下的问题就是如何选择映射$\phi$
- 其中一种选择是使用一个通用的$\phi$,例如无限维的$\phi$,它隐含地用在基于RBF核机器上.如果$\phi(x)$具有足够高的维数,我们总是有足够的能力来拟合训练集,但对于测试集的泛化往往不佳.非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题
- 另一种选择是手动地设计$\phi$.在深度学习出现以前,这一直是主流的方法.这种方法对于每个单独的任务都需要人们数十年的努力,从业者各自擅长特定的领域,并且不同领域之间很难迁移
- 深度学习的策略是去学习$\phi$.在这种方法中,我们有一个模型$y=f(x;\theta,w)=\phi(x;\theta)^Tw$.我们现在有两种参数:用于从一大类函数中学习$\phi$的参数$\theta$,以及用于将$\phi(x)$映射到所需的输出的参数w.这是前馈网络的一个例子,其中$\phi$定义了一个隐藏层。这是三种方法中唯一一种放弃训练问题的凸性的方法,但利大于弊.在这种方法中,我们将表示参数化为$\phi(x;\theta)$,并且使用优化算法来寻找$\theta$,使它能够得到一个好的表示.如果我们想要的话,这种方法也可以通过使它变得高度通用以获得第一种方法的优点——我们只需要使用一个非常广泛的函数簇$\phi(x;\theta)$.这种方法也可以获得第二种方法的优点.人类专家可以将他们的知识编码进网络来帮助泛化.
前馈网络已经引入了隐藏层的概念,这需要我们去选择用于计算隐藏层值的激活函数.我们还必须设计网络的结构,包括网络应该包含多少层,这些层应该如何连接以及每一层包含多少个单元.在深度神经网络的学习中需要计算复杂函数的梯度.我们给出反向传播算法和它的现代推广,他们可以用来高效地计算这些梯度.
基于梯度的学习
到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸.这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使用代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或SVM的凸优化算法那样保证全局收敛.凸优化从任何一种初始参数出发都会收敛(理论如此)。用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的.偏置可以初始化为0或者小的正值.
代价函数
深度神经网络设计中的一个重要方面是代价函数的选择,幸运的是,神经网络的代价函数或多或少是和其他的参数模型(例如线性模型的代价函数)相同的.
在大多数情况下,参数模型定义了一个分布$p(y|x;\theta)$并且简单地使用最大似然原理.这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数.
而有时,我们使用一个更简单的方法,不是预测y的完整概率分布,而是仅仅预测在给定x的条件下y的某种统计量.某些专门的损失函数允许我们来训练这些估计量的预测器.
通常在我们这里描述的基本代价函数的基础上结合一个正则项.
使用最大似然学习条件分布
大多数现代的神经网络使用最大似然训练.这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价.这个代价函数表示为:
代价函数得具体形式随着模型而改变,取决于$log p_{model}$的具体形式.
如果$p_{model}(y|x)=N(y;f(x;\theta),I)$,我们就可以得到均方误差代价:
使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担.明确一个模型p(y|x)则自动地确定了一个代价函数log p(y|x).
贯穿神经网络设计地一个反复出现的主题是代价函数地梯度必须足够地大和具有足够地预测性,来为学习算法提供一个好的指引.饱和(变得非常平)的函数破坏了这一目标,因为他们把梯度变得非常小.这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。之所以采用负对数,是因为它可以消除指数效应.
学习条件统计量
有时我们并不是想学习一个完整的概率分布$p(y|x;\theta)$,而仅仅是想学习在给定x时y的某个条件统计量.
例如我们可能有一个预测器$f(x;\theta)$,想利用它来预测y的均值.如果使用一个足够强大的神经网络,我们可以认为这个神经网络能够表示一大类函数中的任何一个函数f,这个类仅仅被一些特征所限制,例如连续性和有界性,而不是具有特殊的参数形式.从这个角度来看,我们可以把代价函数看作一个泛函,而不仅仅是一个函数.泛函是函数到实数的映射.因此我们可以将学习看作选择一个函数,而不仅仅是一个函数.可以设计代价泛函在我们想要的某些特殊函数处取得最小值.例如,我们可以设计一个代价泛函,使它的最小值处于一个特殊的函数上,这个函数将x映射到给定x时y的期望值.对函数求解优化问题需要用到变分法这个数学工具.
变分法可以用来导出下面两个结果:
我们使用变分法导出的第一个结果是解优化问题:
得到
要求这个函数处在我们要优化的类里.换句话说,如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练,最小化均方误差代价函数将得到一个函数,他可以用来对每个x的值预测出y的均值
不同的代价函数给出不同的统计量.第二个使用变分法得到的结果是
将得到一个函数可以对每个x预测y取值的中位数,只要这个函数在我们要优化的函数族里.这个代价函数通常被称为平均绝对误差.
可惜的是,均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳.一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度.这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没必要估计整个p(y|x)分布时.
输出单元
代价函数的选择与输出单元的选择有紧密的关系.大多数时候,我们简单地使用数据分布和模型分布间地交叉熵.选择如何表示输出决定了交叉熵函数的形式.
任何可用作输出的神经网络单元,也可以被用作隐藏单元.这里,我们着重讨论将这些单元用作模型输出时的情况,不过原则上他们也可以在内部使用.
用于高斯输出分布的线性单元
一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为线性单元。
给定特征h,线性输出单元层产生一个向量$\hat{y}=W^Th+b$
线性输出层经常被永安里产生条件高斯分布的均值:
最大化其对数似然此时等价于最小化均方误差.
最大似然框架也使得学习高斯分布的协方差矩阵更加容易,或更容易地使高斯分布的协方差矩阵作为输入的函数.然而,对于所有输入,协方差矩阵都必须被限定成一个正定矩阵。线性输出层很难满足这种限定,所以通常使用其他的输出单元来对协方差参数化.
因为楔形单元不会饱和,所以它易于采用基于梯度的优化方法,甚至可以使用其他多种优化算法。
用于Bernoulli输出分布的sigmoid单元
许多任务需要预测二值型变量y的值.具有两个类的分类问题可以归结为这种形式.
此时最大似然的方法是定义y在x条件下的Bernoulli分布.
Bernoulli分布仅需单个参数来定义.神经网络只需要预测P(y=1|x)即可.为了使这个数是有效的概率,它必须处在区间[0,1]中.
为了满足该约束条件需要一些细致的设计工作.假设我们打算使用线性单元,并且通过阈值来限制它成为一个有效地概率:
这的确定义了一个有效地条件概率分布,但我们无法使用梯度下降来高效地训练它.当$W^Th+b$处于单元区间外时,模型的输出对其参数的梯度都将为0.梯度为0通常是有问题的,因为学习算法对于如何改善相应的参数不再具有指导意义.
Sigmoid输出单元定义为
用于Multinoulli输出分布的softmax单元
任何时候,当我们想要表示一个具有n个可能取值的离散型随机变量的分布时,都可以使用softmax函数.他可以看作sigmoid函数的扩展,其中sigmoid函数用来表示二值型变量的分布.
Softmax函数常用作分类器的输出,来表示n个不同类上的概率分布.比较少见的是,softmax函数可以在模型内部使用.
为了推广到具有n个值得离散型变量得情况,现在需要创造一个向量$\hat{y}$,它的每个元素是$\hat{y}_i=P(y=i|x)$.我们不仅要求每个$\hat{y}_i$元素介于0和1之间,还要使得整个向量得和为1,使得它表示一个有效的概率分布.用于Bernoulli分布得方法同样可以推广到Multinoulli分布.首先,线性层预测了为归一化得对数概率:
其中$z_i=log\hat{P}(y=i|x)$.softmax函数然后可以对z指数化和归一化来获得需要得$\hat{y}$.最终,softmax函数的形式为
softamax是一种在参与其中的单元之间形成竞争的方式:softmax输出总和为1.所以一个单元的值得增加必然对应着其他单元值的减少。这与被认为存在于皮质中相邻神经元间的侧抑制类似.在极端情况下(当最大的$a_i$和其他的在幅度上差异很大时),它变成了赢者通吃(winner-take-all)的形式.
为了方便数值计算softmax往往会写成以下形式:
soft这个术语在很多地方都能看到,像是attention里有soft attention,主要想表达连续可微的意思.
其他的输出类型
最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
一般而言,如果我们定义了一个条件分布$p(y|x;\theta)$,最大似然原则建议我们使用$-logp(y|x;\theta)$作为代价函数.我们可以认为神经网络表示函数$f(x;\theta)$.这个函数的输出不是对y值的直接预测.相反,$f(x;\theta)$=w提供了y分布的参数.我们损失函数就可以表示成-logp(y;w(x)).