第六章 深度前馈网络2 (梯度,隐藏单元,架构设计,反向传播)
基于梯度的学习
基于梯度的优化算法可以找到一些参数使得产生的误差非常小。
上文中XOR问题的解处在损失函数的全局最小点,梯度下降算法可以收敛到这一点。
梯度下降算法的收敛点取决于参数的初始值。
设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。
线性模型和神经网络的最大区别
,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或SVM的凸优化算法那样保证全局收敛。凸优化从任何一种初始参数出发都会收敛。
凸函数最终得到的解是全局最优解,非凸函数得到的可能是局部最优解,训练时可能不收敛。
https://blog.csdn.net/kebu12345678/article/details/54926287
用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置可以初始化为零或者小的正值。
和其他的机器学习模型一样,为了使用基于梯度的学习方法,我们必须选择一个代价(损失)函数,并且必须选择如何表示模型的输出。
1-代价函数
深度神经网络设计中的一个重要方面是代价函数的选择。
在大多数情况下,参数模型定义了一个分布p(y|x;θ)并且简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵
作为代价函数。
用于训练神经网络的完整的代价函数,通常在我们这里描述的基本代价函数的基础上结合一个正则项。用于线性模型的权重衰减方法
适用于深度神经网络,而且是最流行的正则化策略之一。
1-1.使用最大似然学习条件分布
大多数现代的神经网络使用最大似然来训练。这意味着代价函数就是负的对数似然,它与训练数据和模型分布间的交叉熵
等价。
这个代价函数表示为 J ( θ ) = − E x , y ∼ p ^ data log p model ( y ∣ x ) J(\theta) = -E_{x, y \sim \hat{p}_\text{data}} \log p_\text{model} (y \mid x) J(θ)=−Ex,y∼p^datalogpmodel(y∣x)
代价函数的具体形式随着模型而改变,取决于 log p model \log p_\text{model} logpmodel的具体形式。上述方程的展开形式通常会有一些项不依赖于模型的参数,我们可以舍去。
使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型p(y|x)则自动地确定了一个代价函数logp(y|x)。
代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。
1-2.学习条件统计量
有时我们并不是想学习一个完整的概率分布p(y|x;θ),而仅仅是想学习在给定x时y的某个条件统计量。
我们可以把代价函数看作一个泛函
(functional),而不仅仅是一个函数。泛函是函数到实数的映射。因此我们可以将学习看作选择一个函数,而不仅仅是选择一组参数。可以设计代价泛函在我们想要的某些特殊函数处取得最小值。对函数求解优化问题需要用到变分法
(calculus of variations)这个数学工具。
我们使用变分法导出的第一个结果是解优化问题: f ∗ ( x ) = E y ∼ p d a t a ( y ∣ x ) [ y ] f^∗(x)=E_{y∼p_{data}}(y|x)[y] f∗(x)=Ey∼pdata(y∣x)[y]
要求这个函数处在我们要优化的类里。
换句话说,如果我们能够用无穷多的、来源于真实的数据生成分布的样本进行训练,最小化均方误差代价函数将得到一个函数,它可以用来对每个 x x x的值预测出 y y y的均值。
第二个使用变分法得到的结果是
f ∗ = a r g m i n f E x , y ∼ p d a t a ∣ ∣ y − f ( x ) ∣ ∣ 1 f^∗=\underset f {argmin}E_{x,y∼p_{data}}||y−f(x)||_1 f∗=fargminEx,y∼pdata∣∣y−f(x)∣∣1
将得到一个函数可以对每个 x x x预测 y y y取值的中位数,只要这个函数在我们要优化的函数族里。这个代价函数通常被称为平均绝对误差
。
均方误差和平均绝对误差在使用基于梯度的优化方法时往往成效不佳。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没必要估计整个p(y|x)分布时。
1-3.输出单元
代价函数的选择与输出单元的选择紧密相关。选择如何表示输出决定了交叉熵函数的形式。
任何可用作神经网络单元的输出,也可以被用作隐藏单元。
在这里,我们假设前馈网络提供了一组定义为h=f(x;θ)的隐藏特征。输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。
1-3-1.用于高斯输出分布的线性单元
一种简单的输出单元是基于仿射变换的输出单元,仿射变换不具有非线性。这些单元往往被直接称为线性单元
。
给定特征 h h h,线性输出单元层产生一个向量 y ^ = W T h + b \hat{y} = W^T h+b y^=WTh+b。
线性输出层经常被用来产生条件高斯分布的均值: p ( y ∣ x ) = N ( y ; y ^ , I ) p(y∣x)=N(y;\hat y,I) p(y∣x)=N(y;y^,I)
最大化其对数似然此时等价于最小化均方误差。
因为线性单元不会饱和,所以它们易于采用基于梯度的优化算法,甚至可以使用其他多种优化算法。
1-3-2.用于Bernoulli输出分布的sigmoid单元
许多任务需要预测二值型变量y 的值。具有两个类的分类问题可以归结为这种形式。此时最大似然的方法是定义y在x条件下的Bernoulli分布。
sigmoid输出单元定义为 y ^ = σ ( w ⊤ h + b ) \hat y=σ(w^⊤h+b) y^=σ(w⊤h+b)
这里 σ \sigma σ是第三章中介绍的logistic sigmoid函数。
我们可以认为sigmoid输出单元具有两个部分。首先,它使用一个线性层来计算 z = w T h + b z=w^T h+b z=wTh+b。接着,它使用sigmoid激活函数将 z z z转化成概率。
我们使用最大似然来学习一个由sigmoid参数化的Bernoulli分布,它的损失函数为 J ( θ ) = − l o g P ( y ∣ x ) = − l o g σ ( ( 2 y − 1 ) z ) = ζ ( ( 1 − 2 y ) z ) J(θ)=−logP(y∣x)=−logσ((2y−1)z)=ζ((1−2y)z) J(θ)=−logP(y∣x)=−logσ((2y−1)z)=ζ((1−2y)z)
最大似然几乎总是训练sigmoid输出单元的优选方法。
1-3-3.用于Multinoulli输出分布的softmax单元
任何时候,当我们想要表示一个具有n个可能取值的离散型随机变量的分布时,都可以使用softmax函数。它可以看作sigmoid函数的扩展,其中sigmoid函数用来表示二值型变量的分布。
softmax函数最常用作分类器的输出,来表示n个不同类上的概率分布。比较少见的是,softmax函数可以在模型内部使用。
softmax函数的形式为 s o f t m a x ( z ) i = e x p ( z i ) ∑ j e x p ( z j ) softmax(z)_i=\frac {exp(z_i)}{∑_jexp(z_j)} softmax(z)i=∑jexp(zj)exp(zi)
和logistic sigmoid一样,当使用最大化对数似然训练softmax来输出目标值 y y y时,使用指数函数工作地非常好。
1-3-4.其他的输出类型
之前描述的线性、sigmoid和softmax输出单元是最常见的。神经网络可以推广到我们希望的几乎任何种类的输出层。最大似然原则给如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
我们经常想要执行多峰回归
(multimodal regression),即预测条件分布p(y|x)的实值,该条件分布对于相同的x值在y空间中有多个不同的峰值。在这种情况下,高斯混合是输出的自然表示。将高斯混合作为其输出的神经网络通常被称为混合密度网络
(mixture density network)。
神经网络必须有三个输出:定义 p ( c = i ∣ x ) p(c=i\mid x) <