基于梯度的学习
设计和训练神经网络与使用梯度下降训练其他任何机器学习模型并没有太大不同。线性模型和神经网络最大的区别之一在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸,这意味着神经网络的训练通常用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值,并不能保证全局收敛。用于非凸损失函数的随机梯度下降没有收敛性保证,且对参数的初始值很敏感。因此对于前馈神经网络,将所有的权重初始化为小随机数是很重要的,偏置可以初始化为零或者小的正值。
代价函数
神经网络的代价函数或多或少是和其他的参数模型例如线性模型的代价函数相同的。大多数情况下,参数模型定义了一个分布 p ( y ∣ x ; θ ) p(\boldsymbol{y}|\boldsymbol{x};\boldsymbol{\theta}) p(y∣x;θ),如果我们使用最大似然原理,那我们就相当于使用训练数据和模型预测间的交叉熵作为代价函数。
使用最大似然学习条件分布
大多数现代神经网络使用最大似然来训练,这意味着代价函数就是负的对数似然:
J
(
θ
)
=
−
E
x
,
y
∼
p
^
d
a
t
a
log
p
m
o
d
e
l
(
y
∣
x
)
J(\boldsymbol{\theta})=-\mathbb{E}_{\boldsymbol{x},\boldsymbol{y}\sim \hat{p}_{data}}\log p_{model}(\boldsymbol{y}|\boldsymbol{x})
J(θ)=−Ex,y∼p^datalogpmodel(y∣x)
使用最大似然来导出代价函数的方法的一个优势是,它减轻了为每个模型设计代价函数的负担。明确一个模型 p ( y ∣ x ) p(\boldsymbol{y}|\boldsymbol{x}) p(y∣x) 则自动地确定了一个代价函数 log p ( y ∣ x ) \log p(\boldsymbol{y}|\boldsymbol{x}) logp(y∣x)。
贯穿神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。饱和(平坦)的函数并不理想,因为它们把梯度变得非常小。这在很多情况下会发生,例如激活函数会饱和。负的对数似然帮助我们在很多模型中避免这个问题:很多输出单元都会包含一个指数函数,这在它的变量取绝对值非常大的负值时会造成饱和,负对数似然中的对数消除了某些输出单元中的指数效果。
用于实现最大似然估计的交叉熵代价函数被应用于实践中经常遇到的模型时,通常没有最小值。对于离散型输出变量,大多数模型以一种特殊的形式来参数化,即它们不能表示概率零和一,但是可以无限接近。
学习条件统计量
有时我们并不想学习一个完整的概率分布,而仅仅是想学习在给定 x \boldsymbol{x} x 时 y \boldsymbol{y} y 的某个条件统计量。
例如,我们有一个预测器 f ( x ; θ ) f(\boldsymbol{x}; \boldsymbol{\theta}) f(x;θ),想用它来预测 y \boldsymbol{y} y 的均值。如果我们使用一个足够强大的神经网络,可以表示一大类函数中的任何一个函数 f f f,而不是具有特殊的参数形式。从这个角度看,可以把代价函数看作是一个泛函而不仅仅是一个函数。泛函是函数到实数的映射,我们可以将学习看作是选择一个函数而不仅仅是选择一组参数。我们可以设计代价泛函在我们想要的某些特殊函数处取得最小值。对函数求解优化问题需要用到变分法,这里不做详细讨论。
输出单元
代价函数的选择与输出单元的选择紧密相关。任何可用作输出的神经网络单元也可以被用作隐藏单元,这里这考虑用作输出单元的情况。我们假设前馈网络提供了一组定义为 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}^\intercal \boldsymbol{h}+\boldsymbol{b} y^=W⊺h+b。最大化对数似然此时等价于最小化均方误差。
因为线性模型不会饱和,所以它们易于采用基于梯度的优化算法。
用于 Bernoulli 输出分布的 sigmoid 单元
许多任务需要预测二值型变量 y y y 的值,例如二分类问题。此时最大似然的方法是定义 y y y 在 x \boldsymbol{x} x 条件下的 Bernoulli 分布。如果我们仍然使用线性单元,且通过阈值来限制它成为一个有效的概率,那我们将无法使用梯度下降来高效的训练(梯度可能为 0)。我们需要一种新的方法来保证无论何时模型给出了错误的答案时,总能有一个较大的梯度:
sigmoid 输出单元定义为
y
^
=
σ
(
w
⊺
h
+
b
)
\hat{y} = \sigma(\boldsymbol{w}^\intercal \boldsymbol{h}+b)
y^=σ(w⊺h+b)
其中
σ
\sigma
σ 为 logistic sigmoid 函数:
σ
(
x
)
=
1
1
+
exp
(
−
x
)
\sigma(x)=\frac{1}{1+\exp(-x)}
σ(x)=1+exp(−x)1
它将产生非归一化的概率值(0,1)。尽管 sigmoid 函数在变量绝对值非常大时会饱和,但基于最大对数似然的代价函数可以抵消 sigmoid 的饱和性。
用于 Multinoulli 输出分布的 softmax 单元
sigmoid 函数的扩展,可以表示一个具有 n n n 个可能取值的离散型随机变量的分布。
首先线性层预测了未归一化的对数概率:
z
=
W
⊺
h
+
b
\boldsymbol{z}= \boldsymbol{W}^\intercal \boldsymbol{h}+ \boldsymbol{b}
z=W⊺h+b
softmax 函数然后可以对
z
z
z 指数化和归一化来得到有效的概率分布:
s
o
f
t
m
a
x
(
z
)
i
=
exp
(
z
i
)
∑
j
exp
(
z
j
)
{\rm softmax}(\boldsymbol{z})_i=\frac{\exp(z_i)}{\sum_j \exp(z_j)}
softmax(z)i=∑jexp(zj)exp(zi)
除了对数似然之外的许多目标函数对 softmax 函数不起作用。像 sigmoid 一样,softmax 激活函数可能会饱和。对于 softmax 的情况,它有多个输出值。当输入值之间的差异变得极端时,这些输出值可能饱和。当某个输入是最大且远大于其他输入时,相应的输出会饱和到 1。
从神经科学的角度看,有趣的是认为 softmax 是一种在参与其中的单元之间形成竞争的方式:softmax 输出总是和为1,所以一个单元的值增加必然对应着其他单元值的减少。这与被认为存在于皮质中相邻神经元间的侧抑制类似。在极端情况下(当最大的 a i a_i ai 和其他的在幅度上差异很大时),它变成了赢者通吃(winner-take-all)的形式。
为模型选择正确的输出层激活函数和损失函数
| 问题类型 | 最后一次激活 | 损失函数 |
|---|---|---|
| 二分类问题 | sigmoid | binary_crossentropy |
| 多分类、单标签问题 | softmax | categorical_crossentropy |
| 多分类、多标签问题 | sigmoid | binary_crossentropy |
| 回归到任意值 | 无 | mse |
| 回归到 0-1 范围内的值 | sigmoid | mse 或者 binary_crossentropy |
References
I. J. Goodfellow, Y. Bengio, and A. Courville, Deep Learning. Cambridge, MA, USA: MIT Press, 2016, http://www.deeplearningbook.org.
:基于梯度的学习&spm=1001.2101.3001.5002&articleId=127724957&d=1&t=3&u=5ae46b9f5d35452abfea30edfdf15776)
5220

被折叠的 条评论
为什么被折叠?



