深度网络现代实践 - 深度前馈网络之基于梯度的学习篇

序言

深度前馈网络,作为神经网络的一种重要类型,以其独特的单向信息传播方式在机器学习领域占据重要位置。其基于梯度的学习方法是其核心,通过不断迭代和优化,使网络能够更准确地拟合数据,提高预测或分类的准确性。

在深度前馈网络中,信息沿着网络层次向前传播,每一层都通过非线性激活函数对输入进行转换,并传递至下一层。基于梯度的学习算法,如梯度下降,是训练这类网络的关键。通过计算损失函数对网络参数的梯度,我们可以知道如何调整这些参数以最小化损失,从而提高网络的性能。

基于梯度的学习

  • 设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。在构建机器学习算法中,我们描述了如何通过指明一个优化过程、代价函数和一个模型族来构建一个机器学习算法。
  • 线性模型和神经网络区别
    • 我们到目前为止看到的线性模型神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的损失函数都成为了非凸的。这意味着神经网络的训练通常使用的迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值;而不是像用于训练线性回归模型的线性方程求解器,或者用于训练逻辑回归或 SVM \text{SVM} SVM的凸优化算法那样具有全局的收敛保证。
    • 凸优化从任何一种初始参数出发都会收敛(理论上如此——在实践中也很鲁棒但可能会遇到数值问题)。
    • 用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的。偏置可以初始化为零或者小的正值。
    • 这种用于训练前馈神经网络以及几乎所有深度模型的迭代的基于梯度的优化算法会在后续篇章详细介绍,参数初始化会在篇章:深度模型中的优化 - 参数初始化策略中具体说明。
    • 就目前而言,只需要懂得,训练算法:几乎总是基于使用梯度来使得代价函数下降的各种方法即可。一些特别的算法是对梯度下降思想的改进和提纯,在基于梯度的优化方法中介绍。还有一些更特别的,大多数是对随机梯度下降算法的改进,在随机梯度下降中介绍。
  • 我们当然也可以用梯度下降来训练诸如线性回归支持向量机之类的模型,并且事实上当训练集相当大时这是很常用的。
  • 从这点来看,训练神经网络和训练其他任何模型并没有太大区别。计算梯度对于神经网络会略微复杂一些,但仍然可以很高效而精确地实现。
  • 将会在篇章:反向传播和其他的微分算法中,介绍如何用反向传播算法以及它的现代扩展算法来求得梯度。
  • 和其他的机器学习模型一样,为了使用基于梯度的学习方法我们必须选择一个代价函数,并且我们必须选择如何表示模型的输出。现在,我们重温这些设计上的考虑,并且特别强调神经网络的背景。

代价函数(cost function)

  • 深度神经网络设计中的一个重要方面是代价函数的选择。幸运的是,神经网络的代价函数或多或少是和其他的参数模型,例如线性模型的代价函数相同的。
  • 概念:
    • 在大多数情况下,我们的参数模型定义了一个分布 p ( y ∣ x ; θ ) p(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta}) p(yx;θ),并且我们简单地使用最大似然原理。这意味着我们使用训练数据和模型预测间的交叉熵作为代价函数
    • 有时,我们使用一个更简单的方法,不是预测 y \boldsymbol{y} y的完整概率分布,而是仅仅预测在给定 x \boldsymbol{x} x的条件下 y \boldsymbol{y} y的某种统计量。某些专门的损失函数允许我们来训练这些估计量的预测器。
  • 用于训练神经网络的完整的代价函数,通常在我们这里描述的基本代价函数的基础上结合一个正则项。我们已经在应用数学与机器学习基础 - 容量、过拟合和欠拟合篇中看到正则化应用到线性模型中的一些简单的例子。用于线性模型的权值衰减方法也直接适用于深度神经网络,而且是最流行的正则化策略之一。用于神经网络的更高级的正则化策略会在篇章:深度学习中的正则化技术中讨论。

用最大似然学习条件分布

  • 大多数现代的神经网络使用最大似然(maximum likelihood)来训练。这意味着代价函数就是负的对数似然(logastic-likelihood),它与训练数据和模型分布间的交叉熵等价。这个代价函数表示为: J ( θ ) = − E x , y ∼ p ^ data log ⁡ p model ( y ∣ x ) J(\boldsymbol{\theta})=-\mathbb{E}_{\bold{x,y}\sim\hat{p}_{\text{data}}} \log p_{\text{model}}(\boldsymbol{y}|\boldsymbol{x}) J(θ)=Ex,yp^datalogpmodel(yx)
  • 代价函数的具体形式随着模型而改变,取决于 log ⁡ p model \log p_{\text{model}} logpmodel的具体形式。上述方程的展开形式通常会有一些项不依赖于模型的参数,我们可以舍去。
  • 例如,正如我们在应用数学与机器学习基础 - 学习算法篇中看到的,如果 p model ( y ∣ x ) = N ( y ; f ( x ; θ ) , I ) p_{\text{model}}(\boldsymbol{y}\mid\boldsymbol{x})=\mathcal{N}(\boldsymbol{y};f(\boldsymbol{x};\boldsymbol{\theta}),\boldsymbol{I}) pmodel(yx)=N(y;f(x;θ),I),那么我们恢复均方差代价: J ( θ ) = 1 2 E x , y ∼ p ^ data ∥ y − f ( x ; θ ) ∥ 2 + const J(\theta)=\frac{1}{2}\mathbb{E}_{\bold{x,y}\sim\hat{p}_{\text{data}}}\Vert\boldsymbol{y}-f(\boldsymbol{x};\boldsymbol{\theta}) \Vert^2+\text{const} J(θ)=21Ex,yp^datayf(x;θ)2+const
    • 至少系数 1 2 \frac{1}{2} 21和常数项不依赖于 θ \boldsymbol{\theta} θ。舍弃的常数是基于高斯分布的方差,在这种情况下我们选择不把它参数化。
    • 先前,我们看到了对输出分布的最大似然估计和对线性模型均方误差的最小化之间的等价性,但事实上,这种等价性并不要求 f ( x ; θ ) f(\boldsymbol{x};\boldsymbol{\theta}) f(x;θ)用于预测高斯分布的均值。
  • 使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型: p ( y ∣ x ) p(\boldsymbol{y}\mid\boldsymbol{x}) p(yx)则自动地确定了一个代价函数: log ⁡ p ( y ∣ x ) \log p(\boldsymbol{y}\mid\boldsymbol{x}) logp(yx)
  • 贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。饱和(变得非常平)的函数破坏了这一目标,因为它们把梯度变得非常小。
  • 这在很多情况下都会发生,因为用于产生隐藏单元或者输出单元的输出的激活函数会饱和。
  • 负的对数似然帮助我们在很多模型中避免这个问题。
  • 很多输出单元都会包含一个指数函数,这在它的变量取绝对值非常大的负值时会造成饱和。
  • 负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果。我们将会在输出单元中讨论代价函数和输出单元的选择间的交互关系。
  • 用于实现最大似然估计的交叉熵代价函数有一个不同寻常的特性,那就是当它被应用于实践中经常遇到的模型时,它通常没有最小值。
  • 对于离散型输出变量,大多数模型以一种特殊的形式来参数化,即它们不能表示概率零和一,但是可以无限接近。
  • 逻辑回归是其中一个例子。对于实值的输出变量,如果模型可以控制输出分布的密度(例如,通过学习高斯输出分布的方差参数),那么它可能对正确的训练集输出赋予极其高的密度,这将导致交叉熵趋向负无穷。篇章:深度学习中的正则化技术中描述的正则化技术提供了一些不同的方法来修正学习问题,所以模型不会通过这种方式来获得无限制的收益。

学习条件统计量

  • 有时我们并不是想学习一个完整的概率分布: p ( y ∣ x ; θ ) p(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta}) p(yx;θ),而仅仅是想学习在给定 x \boldsymbol{x} x y \boldsymbol{y} y的某个条件下统计量。
  • 例如,我们可能有一个预测器: f ( x ; θ ) f(\boldsymbol{x};\boldsymbol{\theta}) f(x;θ),我们想用它来预测 y \boldsymbol{y} y的均值。
    • 如果我们使用一个足够强大的神经网络,我们可以认为这个神经网络能欧表示一大类函数中的任何一个函数 f f f,这个类仅仅被一些特征所限制,例如连续性和有界,而不是具有特殊的参数形式。
    • 泛函(functional)
    • 从这个角度看,我们可以把代价函数看作是一个泛函(functional)而不仅仅是一个函数。
    • 泛函是函数到实数的映射。我们因此可以将学习看作是选择一个函数而不仅仅是选择一组参数。
    • 变分法(calculas of variations)
    • 我们可以设计代价函数在我们想要的某些特殊函数处理取得最小值。
    • 例如,我们可以设计一个代价泛函,使它的最小值处在一个特殊的函数上,这个函数将 x \boldsymbol{x} x映射到给定 x \boldsymbol{x} x y \boldsymbol{y} y的期望值。对函数求解优化问题需要用到变分法(calculas of variations)这个数学工具。
  • 我们使用变分法导出的第一个结果是解优化问题:
    f ∗ = arg min ⁡ f E x , y ∼ p data ∥ y − f ( x ) ∥ 2 f^\ast=\argmin\limits_f \mathbb{E}_{\bold{x,y}\sim p_{\text{data}}}\Vert\boldsymbol{y}-f(\boldsymbol{x})\Vert^2 f=fargminEx,ypdatayf(x)2,得到 f ∗ ( x ) = E y ∼ p data ( y ∣ x ) [ y ] f^\ast(\boldsymbol{x})=\mathbb{E}_{\bold{y}\sim p_{\text{data}}(\boldsymbol{y}\mid\boldsymbol{x})}[\boldsymbol{y}] f(x)=Eypdata(yx)[y]
    要求这个函数处在我们要优化的类里。
  • 换句话说,如果我们能够用无穷多的、来源于真实的数据生成分布 p data p_{\text{data}} pdata的样例进行训练,最小化均方误差代价函数将得到一个函数,它可以用来对每个 x \boldsymbol{x} x的值预测出 y \boldsymbol{y} y的均值。
  • 平均绝对误差(mean absolute error,MAE)
  • 不同的代价函数给出不同的统计量。第二个使用变分法得到的结果是:
    f ∗ = arg min ⁡ f E x , y ∼ p data ∥ y − f ( x ) ∥ 1 f^\ast=\argmin\limits_f \mathbb{E}_{\bold{x,y}\sim p_{\text{data}}}\Vert\boldsymbol{y}-f(\boldsymbol{x})\Vert_1 f=fargminEx,ypdatayf(x)1
  • 将得到一个函数可以对每个 x \boldsymbol{x} x预测 y \boldsymbol{y} y取值的中位数,只要这个函数在我们要优化的函数簇里。这个代价函数通常被称为平均绝对误差(mean absolute error,MAE)。
  • 不幸的是,均方误差 MSE \text{MSE} MSE)和平均绝对误差 MAE \text{MAE} MAE)在使用基于梯度的优化方法时往往会导致糟糕的结果。一些饱和的输出单元当结合这些代价函数时会产生非常小的梯度。这就是为什么交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了,即使是在没必要估计整个 p ( y ∣ x ) p(\boldsymbol{y}\mid\boldsymbol{x}) p(yx)分布时。

输出单元(output unit)

  • 代价函数的选择与输出单元的选择紧密相关。大多数时候,我们简单地使用数据分布和模型分布间的交叉熵。选择怎样表示输出决定了交叉熵函数的形式。
  • 任何种类的可以被用作输出的神经网络单元,也可以被用作隐藏单元。这里,我们关注把这些单元用作模型的输出,但是原则上它们也可以在内部使用。我们将在篇章:深度网络现代实践 - 深度前馈网络之隐藏单元中重温这些单元并且给出当它们被用作隐藏单元时一些额外的细节。
  • 我们假设前馈网络提供了一组定义为: h = f ( x ; θ ) \boldsymbol{h}=f(\boldsymbol{x};\boldsymbol{\theta}) h=f(x;θ)的隐藏特征。输出层的作用是随后对这些特征进行一些额外的变换来完成整个网络必须完成的任务。

用于高斯输出分布的线性单元

  • 一种简单的输出单元是基于仿射变换的输出单元,仿射变化不带有非线性。这些单元往往被直接成为线性单元。
  • 给定特征 h \boldsymbol{h} h,线性输出单元层产生一个向量 y ^ = W ⊤ h + b \hat{\boldsymbol{y}}=\boldsymbol{W}^\top\boldsymbol{h}+\boldsymbol{b} y^=Wh+b
  • 线性输出层经常被用来产生条件高斯分布的均值 p ( y ∣ x ) = N ( y ; y ^ , I ) p(\boldsymbol{y}\mid\boldsymbol{x})=\mathcal{N}(\boldsymbol{y};\hat{\boldsymbol{y}},\boldsymbol{I}) p(yx)=N(y;y^,I):最大对数似然此时等价于最小化均方误差。
  • 最大化似然的框架使它也可以很直观的来学习高斯分布的协方差矩阵,或者使得高斯分布的协方差是输入的函数。
  • 然而,对于所有输入,协方差矩阵都必须被限制成一个正定的矩阵。用线性输出层来满足这种限制是困难的,所以通常使用其他的输出单元来对协方差参数化。
  • 对协方差建模的方法在其他的输出类型中简要介绍。
  • 因为线性模型不会饱和,所以它们对基于梯度的优化算法没有任何困难并且可以被用在相当广泛的优化算法中。

用于Bernoulli输出分布的sigmoid单元

  • 许多任务需要预测二值型变量 y y y的值。具有两个类的分类问题可以归结为这种形式。此时最大似然的方法是定义 y y y x \boldsymbol{x} x条件下的Bernoulli分布。
  • Bernoulli分布仅需单个参数来定义。神经网络只需要预测 P ( y = 1 ∣ x ) P(y=1\mid\boldsymbol{x}) P(y=1x)即可。为了使这个数是有效的概率,它必须处在区间 [ 0 , 1 ] [0,1] [0,1]中。
  • 满足这个限制需要一些细致的设计工作。假设我们打算使用线性单元,并且通过阈值来限制它成为一个有效的概率:
    P ( y = 1 ∣ x ) = max ⁡ { 0 , min ⁡ { 1 , w ⊤ h + b } } P(y=1\mid\boldsymbol{x})=\max \{0,\min\{1,\boldsymbol{w}^\top\boldsymbol{h}+b\}\} P(y=1x)=max{0,min{1,wh+b}}
  • 这的确定义了一个有效的条件概率分布,但我们并不能使用梯度下降来高效地训练它。任何时候当 w ⊤ h + b \boldsymbol{w}^\top\boldsymbol{h}+b wh+b处于单位区间外时,模型的输出对它的参数的梯度都将为 0 0 0。梯度为 0 0 0通常是有问题的,因为学习算法对于如何提高响应的参数没有了指导。
  • 与之相对的,最好是使用一种不同的方法来保证无论何时模型给出了错误的答案时总能有一个很强的梯度。这种方法是基于sigmoid输出单元结合最大似然来实现的。
  • sigmoid输出单元
    • sigmoid输出单元,定义为: y ^ = σ ( w ⊤ h + b ) \hat{y}=\sigma(\boldsymbol{w}^\top\boldsymbol{h}+b) y^=σ(wh+b)
    • 这里 σ \sigma σ是在概率与信息论篇 - 常用函数的一些性质中介绍的Logistic Sigmoid函数。
    • 我们可以认为sigmoid输出单元具有两个部分。
      • 首先,它使用一个线性层来计算 z = w ⊤ h + b z=\boldsymbol{w}^\top\boldsymbol{h}+b z=wh+b
      • 接着,它使用sigmoid激活函数将 z z z转化成概率。
    • 我们暂时忽略对于 x \boldsymbol{x} x的依赖性,只讨论如何用 z z z的值来定义 y y y的概率分布。sigmoid可以通过构造一个非归一化(和不为 1 1 1)的概率分布 P ~ ( y ) \tilde{P}(y) P~(y)来得到。
    • 我们可以随后除以一个合适的常数来得到有效的概率分布。如果我们假定非归一化的对数概率对 y y y z z z是线性的,可以对它取指数来得到非归一化的概率。然后对它归一化,可以发现这服从Bernoulli分布,它受 z z z的sigmoid变换控制:
      { log ⁡ P ~ ( y ) = y z , P ~ ( y ) = e y z , P ( y ) = e y z ∑ y ′ = 0 1 e y ′ z , P ( y ) = σ ( ( 2 y − 1 ) z ) \begin{cases}\begin{array}{l} \quad\log \tilde{P}(y)=\displaystyle yz\quad, \\\\ \qquad\quad\tilde{P}(y)=e^{\displaystyle yz}\quad,\\\\ \qquad\quad P(y) = \displaystyle\frac{e^{\displaystyle yz}}{\sum_{y^\prime=0}^1 e^{\displaystyle y^\prime z}}\quad,\\\\ \qquad\quad P(y)= \sigma((2y-1)z) \end{array}\end{cases} logP~(y)=yz,P~(y)=eyz,P(y)=y=01eyzeyz,P(y)=σ((2y1)z)
    • 基于指数和归一化的概率分布在统计模型的文献中很常见。用于定义这种二值型变量分布的变量 z z z被称为分对数(logit)。
  • 这种在对数空间里预测概率的方法可以很自然地使用最大似然学习。因为用于最大似然的代价函数是: − log ⁡ P ( y ∣ x ) -\log P(y\mid\boldsymbol{x}) logP(yx),代价函数中的 log ⁡ \log log抵消了sigmoid中的 e e e
  • 如果没有这个效果,sigmoid的饱和性会阻止基于梯度的学习做出好的改进。我们使用最大似然来学习一个由sigmoid参数化的Bernoulli分布,它的损失函数为:
    { J ( θ ) = − log ⁡ P ( y ∣ x ) = − log ⁡ σ ( ( 2 y − 1 ) z ) = ζ ( ( 1 − 2 y ) z ) \begin{cases}\begin{array}{l}J(\boldsymbol{\theta})=-\log P(y\mid\boldsymbol{x})\\\\ \quad\quad= -\log \sigma((2y-1)z)\\\\ \quad\quad= \zeta((1-2y)z) \end{array}\end{cases} J(θ)=logP(yx)=logσ((2y1)z)=ζ((12y)z)
    • 这个推导使用了概率与信息论篇 - 常用函数的一些性质中的一些性质。
    • 通过将损失函数写成softplus函数的形式,我们可以看到它仅仅在 ( 1 − 2 y ) z (1-2y)z (12y)z取绝对值非常大的负值时才会饱和。
    • 因此饱和智慧出现在模型已经得到正确答案时,即当 y = 1 y=1 y=1 z z z取非常大的正直时,或者 y = 0 y=0 y=0 z z z取非常小的负值时。
    • z z z的符号错误时,softplus函数的变量: ( 1 − 2 y ) z (1-2y)z (12y)z,可以简化为 ∣ z ∣ |z| z
    • ∣ z ∣ |z| z变得很大并且 z z z的符号错误时,softplus函数渐进地趋向于它的变量 ∣ z ∣ |z| z
    • z z z求导则渐进地趋向于 sin ⁡ ( z ) \sin(z) sin(z),所以,对于极限情况下极度不正确的 z z z,softplus函数完全不会收缩梯度。这个性质很有用,因为它意味着基于梯度学习可以很快的改正错误的 z z z
    • 当我们使用其他的损失函数,例如均方误差之类的,损失函数会在任何 σ ( z ) \sigma(z) σ(z)饱和时饱和。
    • sigmoid激活函数在 z z z取非常小的负值时会饱和到 0 0 0,在 z z z非常大的正值时会饱和到 1 1 1
    • 注意:这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此时模型给出的是正确还是错误的答案。因为这个原因,最大似然几乎是训练sigmoid输出单元的优选方法。
    • 理论上,sigmoid的对数总是确定和有限的,因为sigmoid的返回值总是被限制在开区间 ( 0 , 1 ) (0,1) (0,1)上,而不是使用整个闭区间 [ 0 , 1 ] [0,1] [0,1]的有效概率。
    • 在软件实现时,为了避免数值问题,最好将负的对数似然写作 z z z的函数,而不是 y ^ = σ ( z ) \hat{y}=\sigma(z) y^=σ(z)的函数。如果sigmoid函数下溢到零,那么之后对 y ^ \hat{y} y^取对数会得到负无穷。

用于Multinoulli输出分布的softmax单元

  • 任何时候当我们想要表示一个具有 n n n个可能取值的离散型随机变量的分布时,我们都可以使用 softmax函数。它可以看作是sigmoid函数的扩展,sigmoid函数用来表示二值型变量的分布。

  • softmax函数最常用作分类器的输出,来表示 n n n个不同类上的概率分布。比较少见的是, softmax 函数可以在模型内部使用,例如如果我们想要在某个内部变量的 n n n个不同选项中进行选择。

  • 在二值型变量的情况下,我们希望计算一个单独的数: y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1\mid\boldsymbol{x}) y^=P(y=1x)

    • 因为这个数需要处在 0 0 0 1 1 1之间,并且我们想要让这个数的对数可以很好地用于对数似然的基于梯度的优化,我们选择去预测另外一个数: z = log ⁡ p ^ ( y = 1 ∣ x ) z=\log\hat{p}(y=1\mid\boldsymbol{x}) z=logp^(y=1x)
    • 对其指数化和归一化,我们就得到了一个由sigmoid函数控制Bernoulli分布。
  • 为了推广到具有 n n n个值的离散型变量的情况,我们现在需要创造一个向量 y ^ \hat{y} y^,它的每个元素是 y ^ i = P ( y = i ∣ x ) \hat{y}_i= P(y = i \mid \boldsymbol{x}) y^i=P(y=ix)

    • 我们不仅要求每个 y ^ i \hat{y}_i y^i元素介于 0 0 0 1 1 1之间,还要使得整个向量的和为 1 1 1使得它表示一个有效的概率分布。
    • 用于Bernoulli 分布的方法同可以推广到Mutlinoulli分布。首先,线性层预测了非标准的对数概率: z = w ⊤ h + b z=\boldsymbol{w}^\top\boldsymbol{h}+\boldsymbol{b} z=wh+b
    • 其中 z i = log ⁡ P ^ ( y = i ∣ x ) z_i=\log\hat{P}(y=i\mid\boldsymbol{x}) zi=logP^(y=ix)
    • softmax函数然后可对 z z z指数化和归一化来获得需要的 y ^ \hat{y} y^。最终,softmax函数的形式为: softmax(z) i = e z i ∑ j = 1 e z j \text{softmax(z)}_i=\displaystyle\frac{e^{z_i}}{\sum_{j=1}e^{z_j}} softmax(z)i=j=1ezjezi
  • 和logistic sigmoid一样,当使用最大化对数似然训练softmax来输出目标值 y y y时,使用指数函数工作地非常好。

  • 这种情况下,我们想要最大化: log ⁡ P ( y = i ; z ) = log ⁡ softmax ( z ) i \log P(y=i;z)=\log \text{softmax}(z)_i logP(y=i;z)=logsoftmax(z)i

  • 将softmax定义成指数的形式是很自然的因为对数似然中的 log ⁡ \log log可以抵消softmax中的 e e e
    log ⁡ softmax ( z ) i = z i − log ⁡ ∑ j = 1 e z j \log \text{softmax}(z)_i=z_i - \log \sum_{j=1}e^{z_j} logsoftmax(z)i=zilogj=1ezj

    • 说明:
      • 第一项表示 z i z_i zi总是对代价函数有直接的贡献。因为这一项不会饱和,所以即使 z i z_i zi对第二项 log ⁡ ∑ j = 1 e z j \log \sum_{j=1}e^{z_j} logj=1ezj的贡献很小,学习依然可以进行。
      • 当最大化对数似然时,第一项鼓励 z i z_i zi被推高,而第二项则鼓励所有 z z z被压低。
      • 为了第二项 log ⁡ ∑ j = 1 e z j \log \sum_{j=1}e^{z_j} logj=1ezj有一个直观的理解,注意到这一项可以大致近似为 max ⁡ j z j \max_j z_j maxjzj。这种近似是基于对任何明显小于 max ⁡ j z j \max_j z_j maxjzj z k z_k zk e z k e^{z_k} ezk都是不重要的。
      • 我们能从这种近似中得到的直觉是,负对数似然代价函数总是强烈地惩罚最活跃的不正确预测。
      • 如果正确答案已经具有了softmax的最大输入,那么 − z i -z_i zi项和 log ⁡ ∑ j e z j ≈ max ⁡ j z j = z i \log \sum_je^{z_j} \approx \max_j z_j = z_i logjezjmaxjzj=zi项将大致抵消。这个样本对整体训练代价贡献很小,将由其他为被正确分类的样本支配。
  • 到目前为止我们只讨论了一个例子。总体来说,未正则化的最大似然会驱动模型去学习一些参数,而这些参数会驱动softmax函数来预测在训练集中观察到的每个结果的比率:
    softmax ( z ( x ; θ ) ) i ≈ ∑ j = 1 m 1 y ( j ) = i , x ( j ) = x ∑ j = 1 m 1 x ( j ) = x \text{softmax}(\boldsymbol{z}(\boldsymbol{x};\boldsymbol{\theta}))_i \approx \displaystyle\frac{\sum_{j=1}^m \boldsymbol{1}_{\displaystyle{y^{(j)}=i,x^{(j)}=\boldsymbol{x}}}}{\sum_{j=1}^m \boldsymbol{1}_{\displaystyle{\boldsymbol{x}^{(j)=\boldsymbol{x}}}}} softmax(z(x;θ))ij=1m1x(j)=xj=1m1y(j)=i,x(j)=x

    • 因为最大似然是一致的估计量,所以只要模型族能够表示训练的分布,这就能保证发生。
    • 在实践中,有限的模型能力和不完美的优化将意味着模型智能近似这些比率。
  • 注意:除了对数似然之外的许多目标函数对softmax函数不起作用。

    • 具体来说,那些不使用对数来抵消softmax中的指数的目标函数,当指数函数的变量取非常小的负值时会造成梯度消失,从而无法学习。
    • 特别是,平方误差对于softmax单元来说是一个很差的损失函数,即使模型做出高度可信的不正确预测,也不能训练模型改变其输出。要理解为什么这些损失函数可能失败,我们需要检查softmax函数本身。
  • 像sigmoid一样,softmax激活函数可能会饱和。

    • sigmoid函数具有单个输出,当它的输入极端负或极端正时会饱和。
    • 对于softmax的情况它有多个输出值。
      • 当输入值之间的差异变得极端时,这些输出值可能饱和。
      • 当softmax饱和时,基于softmax的许多代价函数也饱和,除非它们能够转化饱和的激活函数。
  • 为了说明softmax函数对于输入之间差异的响应,观察到当对所有的输入都加上一个相同常数时softmax的输出不变:
    softmax ( z ) = softmax ( z + c ) \text{softmax}(\boldsymbol{z})=\text{softmax}(\boldsymbol{z}+c) softmax(z)=softmax(z+c),使用这个性质,我们可以导出一个数值方法稳定的softmax函数的变体: softmax ( z ) = softmax ( z − max ⁡ i z i ) \text{softmax}(\boldsymbol{z})=\text{softmax}(\boldsymbol{z}-\max\limits_i z_i) softmax(z)=softmax(zimaxzi)

    • 变换后的形式允许我们在对softmax函数求值时只有很小的数值误差,即使是当 z z z包含极正或者极负的数时。观察softmax数值稳定的变体,可以看到softmax函数由它的变量偏离 max ⁡ i z i \max\limits_i z_i imaxzi的量来驱动。
    • 当其中一个输入是最大( z i = max ⁡ i z i z_i=\max\limits_i z_i zi=imaxzi)并且 z i z_i zi远大于其他的输入时,相应的输出 softmax ( z ) i \text{softmax}(z)_i softmax(z)i会饱和到 1 1 1
    • z i z_i zi不是最大值并且最大值非常大时,相应的输出 softmax ( z ) i \text{softmax}(z)_i softmax(z)i会饱和到 0 0 0
    • 这是sigmoid单元饱和方式的一般化,并且如果损失函数不被设计成对其进行补偿,那么也会造成类似的学习困难。
  • softmax函数的变量 z z z可以用两种方式产生

    • 最常见的是简单地使用神经网络较早的层输出 z z z的每个元素,就像先前描述的使用线性层 z = W ⊤ h + b \boldsymbol{z}=W^\top\boldsymbol{h}+\boldsymbol{b} z=Wh+b
    • 虽然很直观,但这种方法是对分布的过渡参数化。
      • n n n个输出总和必须为 1 1 1的约束意味着只有 n − 1 n-1 n1个参数是必要的;
      • n n n个概率值可以通过 1 1 1减去前面 n − 1 n-1 n1个概率来获得。
    • 因此,我们可以强制要求 z z z的一个元素是固定的。例如我们可以要求 z n = 0 z_n=0 zn=0。事实上,这正是sigmoid单元所做的。定义 P ( y = 1 ∣ x ) = σ ( z ) P(y=1\mid\boldsymbol{x})=\sigma(z) P(y=1x)=σ(z)等价于用二维的 z \boldsymbol{z} z以及 z 1 = 0 z_1=0 z1=0来定义 P ( y = 1 ∣ x ) = softmax ( z ) 1 P(y=1\mid\boldsymbol{x})=\text{softmax}(\boldsymbol{z})_1 P(y=1x)=softmax(z)1
    • 无论是 n − 1 n-1 n1个变量还是 n n n个变量的方法,都描述了相同的概率分布,但会产生不同的学习机制。
    • 在实践中,无论是过度参数化的版本还是限制的版本都很少有差别,并且实现过度参数的版本更为简单。
  • 从神经科学的角度看,有趣的是认为softmax是一种在参与其中的单元之间形成竞争的方式: softmax输出总是和为 1 1 1,所以一个单元的值增加必然对应着其他单元值的减少。这与被认为存在于皮质中相邻神经元间的侧抑制类似。在极端情况下(当最大的 a i a_i ai和其他的在幅度上差异很大时),它变成了赢者通吃 (winner-take-all)的形式(其中一个输出接近 1 1 1,其他的接近 0 0 0)。

  • “softmax”的名称可能会让人产生困惑

    • 这个函数更接近于argmax函数而不是max函数。
    • “soft”这个术语来源于softmax函数是连续可微的。
    • argmax函数的结果表示为一个one-hot向量(只有一个元素为 1 1 1,其余元素都为 0 0 0的向量),不是连续和可微的。
    • softmax函数因此提供了argmax的“软化”版本。
    • max函数相应的软化版本是 softmax ( z ) ⊤ z \text{softmax}(\boldsymbol{z})^\top\boldsymbol{z} softmax(z)z
    • 可能最好是把softmax函数称为“softargmax”,但当前名称是一个根深蒂固的习惯了。

其他的输出类型

  • 先前描述的线性、sigmoid和softmax输出单元是最常见的。神经网络可以推广到我们希望的几乎任何种类的输出层。
  • 最大似然原则为如何为几乎任何种类的输出层设计一个好的代价函数提供了指导。
  • 一般的,如果我们定义了一个条件分布 p ( y ∣ x ; θ ) p(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta}) p(yx;θ),最大似然原则建议我们使用 − log ⁡ p ( y ∣ x ; θ ) -\log p(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta}) logp(yx;θ)作为代价函数。
  • 一般来说,我们可以认为神经网络表示函数 f ( x ; θ ) f(\boldsymbol{x};\boldsymbol{\theta}) f(x;θ)。这个函数的输出不是对 y \boldsymbol{y} y值的直接预测。相反, f ( x ; θ ) = ω f(\boldsymbol{x};\boldsymbol{\theta})=\boldsymbol{\omega} f(x;θ)=ω提供了 y \boldsymbol{y} y分布的参数。我们的损失函数就可以表示成: − log ⁡ p ( y ; ω ( x ) ) -\log p(\boldsymbol{y};\boldsymbol{\omega}(\boldsymbol{x})) logp(y;ω(x))

总结

深度前馈网络的训练是一个复杂而精细的过程。选择合适的激活函数、代价函数和优化算法都至关重要。例如,ReLU激活函数因其避免梯度消失的特性而广受欢迎;交叉熵代价函数则因其对错误预测的敏感性而常被用于分类任务。此外,正则化技术如L1/L2正则化和dropout等,能有效防止过拟合,提高模型的泛化能力。

总之,深度前馈网络基于梯度的学习是一种强大而灵活的机器学习技术,通过不断迭代和优化,可以使网络在复杂的数据集上达到出色的性能。随着计算能力的提升和算法的优化,深度前馈网络将在未来发挥更大的作用。

本篇章涉及往期重要内容回顾

应用数学与机器学习基础 - 构建机器学习算法篇
应用数学与机器学习基础 - 数值计算篇
应用数学与机器学习基础 - 随机梯度下降算法篇
应用数学与机器学习基础 - 容量、过拟合和欠拟合篇
应用数学与机器学习基础 - 学习算法篇
应用数学与机器学习基础 - 概率与信息论篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/772110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇聚荣拼多多评价好不好?

汇聚荣拼多多评价好不好?在探讨电商平台的口碑时,用户评价是衡量其服务质量和商品质量的重要指标。拼多多作为国内领先的电商平台之一,其用户评价自然成为消费者选择购物平台时的参考依据。针对“汇聚荣拼多多评价好不好?”这一问题,可以从…

Elasticsearch初识与 index+mapping+document 基操

前言 在21年多少有使用过es 当时是在艺术赛道的一个教育公司,大概流程就是 将mysql中的各种课程数据通过logstash汇总到es 然后提供rest接口出去。由于在职时间较短(很不幸赶上了教育双减),所以对es的了解其实仅仅是些皮毛,当然elk在我的任职…

稀疏数组搜索

题目链接 稀疏数组搜索 题目描述 注意点 字符串数组中散布着一些空字符串words的长度在[1, 1000000]之间字符串数组是排好序的数组中的字符串不重复 解答思路 因为数组中的字符串是排好序的,所以首先想到的是二分查找,先将数组中长度与s相同的字符串…

全网都在疯传的最新蓝海风口项目!

最近全网都在疯传这种视频,想必兄弟们都见到过了! 大家看这个号,1天的时间,2个作品,第2个直接就爆了,昨天看点赞还是3.8w,今天已经10w了,这是妥妥的风口啊! 大家有没有想…

io_contextttttttttttt

创建上下文——io_context_t 它是一个上下文结构,在内部它包含一个完成队列,在线程之间是可以共享的。 提交请求——iocb io回调数据结构,和io_submit配合使用。 处理结果 通过io_event处理结果, struct io_event {void *data…

TIS人人都会用的数据集成产品

文章目录 1.TIS是什么?1.1 简介1.2 官网及项目地址1.3 架构 2.功能特性2.1 基于Web UI的开箱即用2.2 支持分布式任务分发2.3 全新的基于微内核的运行环境2.4 功能覆盖DataX大部分(Reader/Writer)Plugin2.5 重构DataX的Classloader2.6 支持RDB…

科比老大职业生涯数据预测(基于随机森林模型)

1.实验背景 科比布莱恩特,作为NBA历史上最伟大的篮球运动员之一,他的职业生涯充满了无数精彩瞬间。 科比于1996年以13顺位的选秀身份进入联盟,一生都效力于洛杉矶湖人队。于2016年宣布退役,职业生涯获奖无数,5次NBA总…

99. 岛屿数量

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述&#xff1a…

EXTI寄存器,AFIO的简洁,EXTI配置的流程

一,AFIO简介 AFIO是Alternate Function Input/Output 的缩写,表示复用功能IO,主要用于实现IO端口的复用功能以及外部中断的控制 STM32外设有很多I/O以及内置外设(如12C,ADC,ISP,USART等)。为节省引出管脚的…

命令行运行git reflog(reference log)报错的解决办法

文章目录 1. 检查 Git 是否已安装2. 检查 PATH 环境变量3. 重新安装 Git 在Git中, reflog的英文全称是 “ reference log”。意思是 引用日志(参考日志)。它记录了本地仓库中HEAD和分支引用所指向的提交的变更历史。这包括了你所有的提交&…

经典低功耗四通道运算放大器LM324

前言: SOP14封装LM324 这个LM324运放有几十年的历史了吧?很普通,很常用,搞电路的避免不了接触运放,怎么选择运放,是工程师关心的问题吧? 从本文开始,将陆续发一些常用的运放&#xf…

【AI学习】无线AI的问题和挑战

无线AI,即无线人工智能,是指内生于未来(6G)无线通信系统并通过无线架构、无线数据、无线算法和无线应用所呈现出来的新的人工智能技术体系。 最近一直在进行无线AI的调研,感觉真的是路漫漫其修远兮。业界有一些探索&a…

【人工智能】--生成对抗网络

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉GAN 的基本原理 🍈生成器(Generator) 🍈判别器&…

【前端知识】一篇速成 建议收藏

HTML基础概念 正式敲代码之前呢,我们先来看几个概念: 0 静态网页和动态网页 静态网页: 页面的内容和显示效果就基本上不会发生变化了--除非你修改页面代码。 动态网页: 页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的…

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时,我遇到了一个写入S3文件的报错问题。通过深入调试和分析,找到了问题所在,并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向,希望对大家有帮助! 一、…

PyTorch - 神经网络基础

神经网络的主要原理包括一组基本元素,即人工神经元或感知器。它包括几个基本输入,例如 x1、x2… xn ,如果总和大于激活电位,则会产生二进制输出。 样本神经元的示意图如下所述。 产生的输出可以被认为是具有激活电位或偏差的加权…

Java通过GeoLite2-City.mmdb 进行IP信息查询地理定位和经纬度筛选。

引入依赖 <dependency><groupId>com.maxmind.geoip2</groupId><artifactId>geoip2</artifactId><version>4.2.0</version> </dependency>下载数据文件&#xff1a;https://download.lin2ur.cn/GeoLite2/ package com.cqclo…

经典递归分析

在前面一篇中, 已经看过许多直观的递归的例子, 在这篇里, 将分析两个经典的递归问题, 阶乘与菲波那契数列数列, 在此过程中, 还将对比递归与循环(迭代)间的异同, 探讨递归与内存中的栈的关系, 以及递归的效率等问题. 如无特别说明, 示例使用的是 Java, IDE 则为 Eclipse. 阶乘(…

Matplotlib 简介

import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4]) plt.ylabel(some numbers) plt.show() 当使用plot只传入单个数组时&#xff0c;matplotlib会认为这是y的值&#xff0c;并自动生成长度相同&#xff0c;但是从0开始的x值&#xff0c;所以这里的x会自动生成为 [0,1,2,…

python自动化办公之BeautifulSoup爬取并解析html文本

用到的库&#xff1a;BeautifulSoup 实现效果&#xff1a;爬取网站内容&#xff0c;拿到html文本并解析html文本 代码&#xff1a; 先爬取 # 先导入requests包 import requests urlhttps://www.baidu.com responserequests.get(url) # 做1个断言&#xff0c;如果执行成功&a…
最新文章