首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消失梯度和梯度零点

消失梯度和梯度零点
EN

Data Science用户
提问于 2020-09-30 05:18:06
回答 1查看 696关注 0票数 1

vanishing gradientFeedforward Neural Network (FNN)BackPropagation训练中存在一个众所周知的问题(这里不考虑递归神经网络的消失梯度)。

我不明白为什么消失梯度不意味着零梯度,也就是我们想要的最优解?我看到一些回答说,消失梯度并不完全是零梯度,只是意味着梯度的更新非常缓慢。然而,梯度体面的停止规则仅仅是\epsilon.中参数的不变。

有人能给我一个明确的答案吗?

EN

回答 1

Data Science用户

回答已采纳

发布于 2020-10-01 23:40:48

The设置:

我们有一个带有权值\mathbf{w} \in \mathbb{R}^{q}的神经网络D1。损失函数\hat{L}: \mathbb{R}^{m} \times \mathbb{R}^{m} \rightarrow \mathbb{R}评估预测的质量。如果神经网络将x \in \mathbb{R}^{n}映射到y \in \mathbb{R}^{m},则损失被称为\hat{L}(\phi(x),y)

对于固定的数据集D \subset \mathbb{R}^{n} \times \mathbb{R}^{m},我们得到了经验误差。

F(\mathbf{w}):= \sum_{(x,y) \in D} \hat{L}(\phi_{\mathbf{w}}(x),y)。然后是F: \mathbb{R}^{q} \rightarrow \mathbb{R}

现在,使用反向传播将F最小化。

让我们尝试定义消失梯度项。我不确定是否有一个正确的定义,但我想说,我们在p有一个消失梯度,如果0 <||\nabla F(p)|| \leq c对于一些小的c

Raised问题:

  • 如果由于消失的梯度,梯度几乎为零,这是否意味着当前的解非常接近最优?这样我们就可以停止迭代了。
  • 为什么有“逐渐消失的梯度”是不好的呢?

Adressing问题1

从学校回想起,如果一个功能性Fp有一个局部最优,那么\nabla F(p) = \mathbf{0}D^2 F(p)是确定的。

如果D^2 F(p)是正定的(x^T D^2 F(p) x > 0,对于所有的x,其中D^2 F(p)是Hesse矩阵),那么p是局部最小的。

如果\nabla F(p) = \mathbf{0}D^2 F(p)是确定的,则p是一个鞍点。

特别是,这表明,具有零梯度并不总是意味着位置是一个局部最优。

(如果q = 1F是两倍可微的,Fp有一个局部最优,如果F'(p) = 0F''(p) \neq 0 。)

我们还可以构造一个在远离最小值的情况下具有任意小梯度的函数:考虑函数f_{c}(x) = \max\{0,cx\}c>0。然后是\min_{x \in \mathbb{R}} f_c(x) = 0。对于任何p>0,我们都有f'_{c}(p) = c

例如,让p = 10^{9999}c = 10^{-90}。然后,f_{c}(p)值远离最小值,仍然是梯度f'_{c}(p) = 10^{-99}保持值,这表明小梯度并不意味着当前点接近最优值。

Adressing问题2

注意,执行反向传播是执行梯度下降算法。

现在要解决部分问题,有两个方向(一个解析答案和一个数值答案)。

分析的答案是,消失的梯度不是什么特别的,需要考虑。

如果适当地选择步长,则可以证明迭代(p_k)的序列要么是有限的,要么是无限序列,并且是\lim_{k \rightarrow \infty} \nabla F(p_{k}) = 0,因此每个极限点都是一个不动点。这将独立于任何“消失的梯度”。

但是,如果我们从数字的角度来考虑这个问题,就会有一些问题。

1.)存在一个机器epsilon \epsilon,因此不能在计算机中执行数值小于\epsilon的更新。这实际上意味着如果||\nabla F(p)|| \leq \epsilon的话,该算法将收敛到某个点。

2.)即使值大于\epsilon,“小”梯度向量也会导致非常缓慢的权重更新。

3.)例如,如果在深层神经网络中使用sigmoid函数作为激活,则可能会出现消失梯度问题。这可以从链规则中理解。让我们计算一个简单的例子,其中我们有一个由L层组成的神经网络,每个层由一个神经元组成,没有任何偏差。作为激活函数,我们使用sigmoid函数\sigma(t) = \frac{1}{1+e^{-t}}。然后是\sigma'(t) = \sigma(t)*(1-\sigma(t))

第一层的输出为f_{i}(w) := \sigma(w o_{i-1}),其中o_{i-1}i-1-th层的输出。

让我们忽略损失函数,假设F正是神经网络。

i上的输出被表示为o_{i},因此我们有o_{i} := \sigma(w_{i} o_{i-1})o_{1} = w_{1}

然后是F(w_{1},\ldots,w_{L}) = o_{L} = \sigma(w_{L} o_{L-1})

根据链规则,我们有\frac{\mathrm{d}F}{\mathrm{d}w_{1}}(w) = \frac{\mathrm{d} \sigma}{\mathrm{d}w_{1}}(w_{L} o_{L-1}) = \sigma'(w_{L} o_{L-1}) \frac{\mathrm{d} w_{L} o_{L-1}}{\mathrm{d}w_{1}} = \sigma'(w_{L} o_{L-1}) w_{L} \frac{\mathrm{d} o_{L-1}}{\mathrm{d}w_{1}}

重复应用链规则会导致:

\frac{\mathrm{d}F}{\mathrm{d}w_{1}}(w) = \prod_{i = 2}^{L} w_{i} \prod_{i = 2}^{L} \sigma'(w_{i}o_{i-1})

\sigma(t) \in [0,1]开始,我们就有了\sigma'(t) \in [0,1]。特别是,我们通常希望\sigma输出01。然而,如果\sigma(w_{i}o_{i-1})接近01,那么\sigma'(w_{i}o_{i-1})将接近0

现在,如果\frac{\mathrm{d}F}{\mathrm{d}w_{1}}(w)中的一个(或多个)数字接近于零,则会得到一个非常小的数字,这会导致数值问题(由于到达机器epsilon),导致算法中更新非常缓慢。

票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/82383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档