6.2 基于梯度的学习
设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。在第5.10节中,我们描述了如何通过指定一个优化过程、代价函数和一个模型族来构建一个机器学习算法。
我们到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或SVM的凸优化算法那样保证全局收敛。凸优化从任何一种初始参数出发都会收敛(理论上如此——在实践中也很鲁棒但可能会遇到数值问题)。用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置可以初始化为零或者小的正值。这种用于训练前馈神经网络以及几乎所有深度模型的迭代的基于梯度的优化算法会在第8章详细介绍,参数初始化会在第8.4节中具体说明。就目前而言,只需要懂得,训练算法几乎总是基于使用梯度来使得代价函数下降的各种方法即可。一些特别的算法是对梯度下降思想的改进和提纯(在第4.3节中介绍)还有一些更特别的,大多数是对随机梯度下降算法的改进(在第5.9节中介绍)。
我们当然也可以用梯度下降来训练诸如线性回归和支持向量机之类的模型,并且事实上当训练集相当大时这是很常用的。从这一点来看,训练神经网络和训练其他任何模型并没有太大区别。计算梯度对于神经网络会略微复杂一些,但仍然可以很高效而精确地实现。第6.5节将会介绍如何用反向传播算法以及它的现代扩展算法来求得梯度。
和其他的机器学习模型一样,为了使用基于梯度的学习方法,我们必须选择一个代价函数,并且必须选择如何表示模型的输出。现在,我们重温这些设计上的考虑,并且特别强调神经网络的情景。
6.2.1 代价函数
深度神经网络设计中的一个重要方面是代价函数的选择。幸运的是,神经网络的代价函数或多或少是和其他的参数模型(例如线性模型的代价函数)相同的。
在大多数情况下,参数模型定义了一个分布p(y|x;θ)并且简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数。
有时,我们使用一个更简单的方法,不是预测y的完整概率分布,而是仅仅预测在给定x的条件下y的某种统计量。某些专门的损失函数允许我们来训练这些估计量的预测器。
用于训练神经网络的完整的代价函数,通常在我们这里描述的基本代价函数的基础上结合一个正则项。我们已经在第5.2.2节中看到正则化应用到线性模型中的一些简单的例子。用于线性模型的权重衰减方法也直接适用于深度神经网络,而且是最流行的正则化策略之一。用于神经网络的更高级的正则化策略将在第7章中讨论。
6.2.1.1 使用最大似然学习条件分布
大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵等价。这个代价函数表示为
代价函数的具体形式随着模型而改变,取决于的具体形式。上述方程的展开形式通常会有一些项不依赖于模型的参数,我们可以舍去。例如,正如我们在第5.1.1节中看到的,如果,那么我们就重新得到了均方误差代价:
至少系数和常数项不依赖于θ。舍弃的常数是基于高斯分布的方差,在这种情况下,我们选择不把它参数化。之前,我们看到了对输出分布的最大似然估计和对线性模型均方误差的最小化之间的等价性,但事实上,这种等价性并不要求f(x;θ)用于预测高斯分布的均值。
使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型p(y|x)则自动地确定了一个代价函数logp(y|x)。
贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。饱和(变得非常平)的函数破坏了这一目标,因为它们把梯度变得非常小。这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。负的对数似然帮助我们在很多模型中避免这个问题。很多输出单元都会包含一个指数函数,这在它的变量取绝对值非常大的负值时会造成饱和。负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。我们将会在第6.2.2节中讨论代价函数和输出单元的选择间的相互作用。
用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它通常没有最小值。对于离散型输出变量,大多数模型以一种特殊的形式来参数化,即它们不能表示概率零和一,但是可以无限接近。逻辑回归是其中一个例子。对于实值的输出变量,如果模型可以控制输出分布的密度(例如,通过学习高斯输出分布的方差参数),那么它可能对正确的训练集输出赋予极其高的密度,这将导致交叉熵趋向负无穷。第7章中描述的正则化技术提供了一些不同的方法来修正学习问题,使得模型不会通过这种方式来获得无限制的收益。
6.2.1.2 学习条件统计量
有时我们并不是想学习一个完整的概率分布p(y|x;θ),而仅仅是想学习在给定x时y的某个条件统计量。
例如,我们可能有一个预测器f(x;θ),想用它来预测y的均值。如果使用一个足够强大的神经网络,我们可以认为这个神经网络能够表示一大类函数中的任何一个函数f,这个类仅仅被一些特征所限制,例如连续性和有界,而不是具有特殊的参数形式。从这个角度来看,我们可以把代价函数看作一个泛函(functional),而不仅仅是一个函数。泛函是函数到实数的映射。因此我们可以将学习看作选择一个函数,而不仅仅是选择一组参数。可以设计代价泛函在我们想要的某些特殊函数处取得最小值。例如,我们可以设计一个代价泛函,使它的最小值处于一个特殊的函数上,这个函数将x映射到给定x时y的期望值。对函数求解优化问题需要用到变分法(calculus of variations)这个数学工具,我们将在第19.4.2节中讨论。理解变分法对于理解本章的内容不是必要的。目前,只需要知道变分法可以被用来导出下面的两个结果。
我们使用变分法导出的第一个结果是解优化问题:
得到
要求这个函数处在我们要优化的类里。换句话说,如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练,最小化均方误差代价函数将得到一个函数,它可以用来对每个x的值预测出y的均值。
不同的代价函数给出不同的统计量。第二个使用变分法得到的结果是
将得到一个函数可以对每个x预测y取值的中位数,只要这个函数在我们要优化的函数族里。这个代价函数通常被称为平均绝对误差(mean absolute error)。
可惜的是,均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没必要估计整个p(y|x)分布时。
6.2.2 输出单元
代价函数的选择与输出单元的选择紧密相关。大多数时候,我们简单地使用数据分布和模型分布间的交叉熵。选择如何表示输出决定了交叉熵函数的形式。
任何可用作输出的神经网络单元,也可以被用作隐藏单元。这里,我们着重讨论将这些单元用作模型输出时的情况,不过原则上它们也可以在内部使用。我们将在第6.3节中重温这些单元,并且给出当它们被用作隐藏单元时一些额外的细节。
在本节中,我们假设前馈网络提供了一组定义为h=f(x;θ)的隐藏特征。输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。
6.2.2.1 用于高斯输出分布的线性单元
一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为线性单元。
给定特征h,线性输出单元层产生一个向量
线性输出层经常被用来产生条件高斯分布的均值:
最大化其对数似然此时等价于最小化均方误差。
最大似然框架也使得学习高斯分布的协方差矩阵更加容易,或更容易地使高斯分布的协方差矩阵作为输入的函数。然而,对于所有输入,协方差矩阵都必须被限定成一个正定矩阵。线性输出层很难满足这种限定,所以通常使用其他的输出单元来对协方差参数化。对协方差建模的方法将在第6.2.2.4节中简要介绍。
因为线性单元不会饱和,所以它们易于采用基于梯度的优化算法,甚至可以使用其他多种优化算法。
6.2.2.2 用于Bernoulli输出分布的sigmoid单元
许多任务需要预测二值型变量y的值。具有两个类的分类问题可以归结为这种形式。
此时最大似然的方法是定义y在x条件下的Bernoulli分布。
Bernoulli分布仅需单个参数来定义。神经网络只需要预测即可。为了使这个数是有效的概率,它必须处在区间[0,1]中。
为满足该约束条件需要一些细致的设计工作。假设我们打算使用线性单元,并且通过阈值来限制它成为一个有效的概率:
这的确定义了一个有效的条件概率分布,但我们无法使用梯度下降来高效地训练它。当b处于单位区间外时,模型的输出对其参数的梯度都将为0。梯度为0通常是有问题的,因为学习算法对于如何改善相应的参数不再具有指导意义。
相反,最好是使用一种新的方法来保证无论何时模型给出了错误的答案时,总能有一个较大的梯度。这种方法是基于使用sigmoid输出单元结合最大似然来实现的。
sigmoid输出单元定义为
这里σ是第3.10节中介绍的logistic sigmoid函数。
我们可以认为sigmoid输出单元具有两个部分。首先,它使用一个线性层来计算z=。其次,它使用sigmoid激活函数将z转化成概率。
我们暂时忽略对于x的依赖性,只讨论如何用z的值来定义y的概率分布。sigmoid可以通过构造一个非归一化(和不为1)的概率分布来得到。我们可以随后除以一个合适的常数来得到有效的概率分布。如果假定非归一化的对数概率对y和z是线性的,可以对它取指数来得到非归一化的概率。然后对它归一化,可以发现这服从Bernoulli分布,该分布受z的sigmoid变换控制:
基于指数和归一化的概率分布在统计建模的文献中很常见。用于定义这种二值型变量分布的变量z被称为分对数(logit)。
这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。因为用于最大似然的代价函数是,代价函数中的log抵消了sigmoid中的exp。如果没有这个效果,sigmoid的饱和性会阻止基于梯度的学习做出好的改进。我们使用最大似然来学习一个由sigmoid参数化的Bernoulli分布,它的损失函数为
这个推导使用了第3.10节中的一些性质。通过将损失函数写成softplus函数的形式,我们可以看到它仅仅在(1−2y)z取绝对值非常大的负值时才会饱和。因此饱和只会出现在模型已经得到正确答案时——当y=1且z取非常大的正值时,或者y=0且z取非常小的负值时。当z的符号错误时,softplus函数的变量(1−2y)z可以简化为|z|。当|z|变得很大并且z的符号错误时,softplus函数渐近地趋向于它的变量|z|。对z求导则渐近地趋向于sign(z),所以,对于极限情况下极度不正确的z,softplus函数完全不会收缩梯度。这个性质很有用,因为它意味着基于梯度的学习可以很快地改正错误的z。
当我们使用其他的损失函数,例如均方误差之类的,损失函数就会在σ(z)饱和时饱和。sigmoid激活函数在z取非常小的负值时会饱和到0,当z取非常大的正值时会饱和到1。这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此时模型给出的是正确还是错误的答案。因此,最大似然几乎总是训练sigmoid输出单元的优选方法。
理论上,sigmoid的对数总是确定和有限的,因为sigmoid的返回值总是被限制在开区间(0,1)上,而不是使用整个闭区间[0,1]的有效概率。在软件实现时,为了避免数值问题,最好将负的对数似然写作z的函数,而不是的函数。如果sigmoid函数下溢到零,那么之后对取对数会得到负无穷。
6.2.2.3 用于Multinoulli输出分布的softmax单元
任何时候,当我们想要表示一个具有n个可能取值的离散型随机变量的分布时,都可以使用softmax函数。它可以看作sigmoid函数的扩展,其中sigmoid函数用来表示二值型变量的分布。
softmax函数最常用作分类器的输出,来表示n个不同类上的概率分布。比较少见的是,softmax函数可以在模型内部使用,例如,如果我们想要在某个内部变量的n个不同选项中进行选择。
在二值型变量的情况下,我们希望计算一个单独的数
因为这个数需要处在0和1之间,并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度的优化,因而我们选择去预测另外一个数。对其指数化和归一化,就得到了一个由sigmoid函数控制的Bernoulli分布。
为了推广到具有n个值的离散型变量的情况,现在需要创造一个向量,它的每个元素是。我们不仅要求每个元素介于0和1之间,还要使得整个向量的和为1,使得它表示一个有效的概率分布。用于Bernoulli分布的方法同样可以推广到Multinoulli分布。首先,线性层预测了未归一化的对数概率:
其中。softmax函数然后可以对z指数化和归一化来获得需要的。最终,softmax函数的形式为
和logistic sigmoid一样,当使用最大化对数似然训练softmax来输出目标值y时,使用指数函数工作地非常好。这种情况下,我们想要最大化。将softmax定义成指数的形式是很自然的,因为对数似然中的log可以抵消softmax中的exp:
式(6.30)中的第一项表示输入zi总是对代价函数有直接的贡献。因为这一项不会饱和,所以即使zi对式(6.30)的第二项的贡献很小,学习依然可以进行。当最大化对数似然时,第一项鼓励zi被推高,而第二项则鼓励所有的z被压低。为了对第二项有一个直观的理解,注意到这一项可以大致近似为maxj zj。这种近似是基于对任何明显小于maxj zj的zk,exp(zk)都是不重要的。我们能从这种近似中得到的直觉是,负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。如果正确答案已经具有了softmax的最大输入,那么−zi项和项将大致抵消。这个样本对于整体训练代价贡献很小,这个代价主要由其他未被正确分类的样本产生。
到目前为止,我们只讨论了一个例子。总体来说,未正则化的最大似然会驱动模型去学习一些参数,而这些参数会驱动softmax函数来预测在训练集中观察到的每个结果的比率:
因为最大似然是一致的估计量,所以只要模型族能够表示训练的分布,这就能保证发生。在实践中,有限的模型能力和不完美的优化将意味着模型只能近似这些比率。
对数似然之外的许多目标函数对softmax函数不起作用。具体来说,那些不使用对数来抵消softmax中的指数的目标函数,当指数函数的变量取非常小的负值时会造成梯度消失,从而无法学习。特别是平方误差,对于softmax单元来说,它是一个很差的损失函数,即使模型做出高度可信的不正确预测,也不能训练模型改变其输出(Bridle,1990)。要理解为什么这些损失函数可能失败,我们需要检查softmax函数本身。
像sigmoid一样,softmax激活函数可能会饱和。sigmoid函数具有单个输出,当它的输入极端负或者极端正时会饱和。对于softmax的情况,它有多个输出值。当输入值之间的差异变得极端时,这些输出值可能饱和。当softmax饱和时,基于softmax的许多代价函数也饱和,除非它们能够转化饱和的激活函数。
为了说明softmax函数对于输入之间差异的响应,观察到当对所有的输入都加上一个相同常数时softmax的输出不变:
使用这个性质,我们可以导出一个数值方法稳定的softmax函数的变体:
变换后的形式允许我们在对softmax函数求值时只有很小的数值误差,即使是当z包含极正或者极负的数时。观察softmax数值稳定的变体,可以看到softmax函数由它的变量偏离maxi zi的量来驱动。
当其中一个输入是最大(zi=maxi zi)并且zi远大于其他的输入时,相应的输出softmax(z)i会饱和到1。当zi不是最大值并且最大值非常大时,相应的输出softmax(z)i也会饱和到0。这是sigmoid单元饱和方式的一般化,并且如果损失函数不被设计成对其进行补偿,那么也会造成类似的学习困难。
softmax函数的变量z可以通过两种方式产生。最常见的是简单地使神经网络较早的层输出z的每个元素,就像先前描述的使用线性层。虽然很直观,但这种方法是对分布的过度参数化。n个输出总和必须为1的约束意味着只有n−1个参数是必要的;第n个概率值可以通过1减去前面n−1个概率来获得。因此,我们可以强制要求z的一个元素是固定的。例如,我们可以要求zn=0。事实上,这正是sigmoid单元所做的。定义等价于用二维的z以及z1=0来定义。无论是n−1个变量还是n个变量的方法,都描述了相同的概率分布,但会产生不同的学习机制。在实践中,无论是过度参数化的版本还是限制的版本都很少有差别,并且实现过度参数化的版本更为简单。
从神经科学的角度看,有趣的是认为softmax是一种在参与其中的单元之间形成竞争的方式:softmax输出总是和为1,所以一个单元的值增加必然对应着其他单元值的减少。这与被认为存在于皮质中相邻神经元间的侧抑制类似。在极端情况下(当最大的ai和其他的在幅度上差异很大时),它变成了赢者通吃(winner-take-all)的形式(其中一个输出接近1,其他的接近0)。
“softmax”的名称可能会让人产生困惑。这个函数更接近于argmax函数而不是max函数。“soft”这个术语来源于softmax函数是连续可微的。“argmax”函数的结果表示为一个one-hot向量(只有一个元素为1,其余元素都为0的向量),不是连续和可微的。softmax函数因此提供了argmax的“软化”版本。max函数相应的软化版本是。可能最好是把softmax函数称为“softargmax”,但当前名称已经是一个根深蒂固的习惯了。
6.2.2.4 其他的输出类型
之前描述的线性、sigmoid和softmax输出单元是最常见的。神经网络可以推广到我们希望的几乎任何种类的输出层。最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
一般而言,如果我们定义了一个条件分布p(y|x;θ),最大似然原则建议我们使用-logp(y|x;θ) 作为代价函数。
一般来说,我们可以认为神经网络表示函数f(x;θ) 。这个函数的输出不是对y值的直接预测。相反,提供了y分布的参数。我们的损失函数就可以表示成。
例如,我们想要学习在给定x时,y的条件高斯分布的方差。简单情况下,方差σ2是一个常数,此时有一个解析表达式,这是因为方差的最大似然估计量仅仅是观测值y与它们的期望值的差值的平方平均。一种计算上代价更加高但是不需要写特殊情况代码的方法是简单地将方差作为分布p(y|x)的其中一个属性,这个分布由控制。负对数似然将为代价函数提供一个必要的合适项来使优化过程可以逐渐地学到方差。在标准差不依赖于输入的简单情况下,我们可以在网络中创建一个直接复制到ω中的新参数。这个新参数可以是σ本身,或者可以是表示σ2的参数ν,或者可以是表示的参数β,取决于我们怎样对分布参数化。我们可能希望模型对不同的x值预测出y不同的方差。这被称为异方差(heteroscedastic)模型。在异方差情况下,我们简单地把方差指定为f(x;θ)其中一个输出值。实现它的典型方法是使用精度而不是方差来表示高斯分布,就像式(3.22)所描述的。在多维变量的情况下,最常见的是使用一个对角精度矩阵
这个公式适用于梯度下降,因为由β参数化的高斯分布的对数似然的公式仅涉及的乘法和的加法。乘法、加法和对数运算的梯度表现良好。相比之下,如果我们用方差来参数化输出,我们需要用到除法。除法函数在零附近会变得任意陡峭。虽然大梯度可以帮助学习,但任意大的梯度通常导致不稳定。如果我们用标准差来参数化输出,对数似然仍然会涉及除法,并且还将涉及平方。通过平方运算的梯度可能在零附近消失,这使得学习被平方的参数变得困难。无论使用的是标准差、方差还是精度,我们必须确保高斯分布的协方差矩阵是正定的。因为精度矩阵的特征值是协方差矩阵特征值的倒数,所以这等价于确保精度矩阵是正定的。如果我们使用对角矩阵,或者是一个常数乘以单位矩阵(1),那么需要对模型输出强加的唯一条件是它的元素都为正。如果假设a是用于确定对角精度的模型的原始激活,那么可以用softplus函数来获得正的精度向量:。这种相同的策略对于方差或标准差同样适用,也适用于常数乘以单位阵的情况。
学习一个比对角矩阵具有更丰富结构的协方差或者精度矩阵是很少见的。如果协方差矩阵是“满的”和有条件的,那么参数化的选择就必须要保证预测的协方差矩阵是正定的。这可以通过写成来实现,这里是一个无约束的方阵。如果矩阵是满秩的,那么一个实际问题是计算似然的代价很高,计算一个d×d的矩阵的行列式或者的逆(或者等价地并且更常用地,对它特征值分解或者的特征值分解)需要O(d3)的计算量。
我们经常想要执行多峰回归(multimodal regression),即预测条件分布p(y|x)的实值,该条件分布对于相同的x值在y空间中有多个不同的峰值。在这种情况下,高斯混合是输出的自然表示(Jacobs et al.,1991;Bishop,1994)。将高斯混合作为其输出的神经网络通常被称为混合密度网络(mixture density network)。具有n个分量的高斯混合输出由下面的条件分布定义:
神经网络必须有3个输出:定义的向量,对所有的i给出的矩阵,以及对所有的i给出的张量。这些输出必须满足不同的约束:
(1)混合组件:它们由潜变量(2)c关联着,在n个不同组件上形成Multinoulli分布。这个分布通常可以由n维向量的softmax来获得,以确保这些输出是正的并且和为1。
(2)均值:它们指明了与第i个高斯组件相关联的中心或者均值,并且是无约束的(通常对于这些输出单元完全没有非线性)。如果y是个d维向量,那么网络必须输出一个由n个这种d维向量组成的n×d的矩阵。用最大似然来学习这些均值要比学习只有一个输出模式的分布的均值稍稍复杂一些。我们只想更新那个真正产生观测数据的组件的均值。在实践中,我们并不知道是哪个组件产生了观测数据。负对数似然表达式将每个样本对每个组件的贡献进行赋权,权重的大小由相应的组件产生这个样本的概率来决定。
(3)协方差:它们指明了每个组件i的协方差矩阵。和学习单个高斯组件时一样,我们通常使用对角矩阵来避免计算行列式。和学习混合均值时一样,最大似然是很复杂的,它需要将每个点的部分责任分配给每个混合组件。如果给定了混合模型的正确的负对数似然,梯度下降将自动地遵循正确的过程。
有报告说,基于梯度的优化方法对于混合条件高斯(作为神经网络的输出)可能是不可靠的,部分是因为涉及除法(除以方差)可能是数值不稳定的(当某个方差对于特定的实例变得非常小时,会导致非常大的梯度)。一种解决方法是梯度截断(clip gradient)(参见第10.11.1节),另一种解决方法是启发式缩放梯度(Murray and Larochelle,2014)。
高斯混合输出在语音生成模型(Schuster,1999)和物理运动(Graves,2013)中特别有效。混合密度策略为网络提供了一种方法来表示多种输出模式,并且控制输出的方差,这对于在这些实数域中获得高质量的结果是至关重要的。混合密度网络的一个实例如图6.4所示。
一般地,我们可能希望继续对包含更多变量的、更大的向量y来建模,并在这些输出变量上施加更多更丰富的结构。例如,可能希望神经网络输出字符序列形成一个句子。在这些情况下,我们可以继续使用最大似然原理应用到我们的模型上,但用来描述y的模型会变得非常复杂,超出了本章的范畴。第10章描述了如何使用循环神经网络来定义这种序列上的模型。本书第3部分描述了对任意概率分布进行建模的高级技术。
图6.4 从具有混合密度输出层的神经网络中抽取的样本。输入x从均匀分布中采样,输出y从pmodel(y|x)中采样。神经网络能够学习从输入到输出分布的参数的非线性映射。这些参数包括控制3个组件中的哪一个将产生输出的概率,以及每个组件各自的参数。每个混合组件都是高斯分布,具有预测的均值和方差。输出分布的这些方面都能够相对输入x变化,并且以非线性的方式改变
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论