首页 > 编程知识 正文

神经网络算法基本介绍,梯度下降算法

时间:2023-05-05 09:21:32 阅读:22325 作者:4163

参考资料链接: https://珠兰.智惠.com/p/22338087

随时间的反向传播(BPTT)首先,让我们马上回想一下RNN的基本公式。 我注意到这里对符号进行了一些更改(变成了)。 这只是为了和我参考的资料一致。

同样,将损失值定义为交叉熵损失,如下。

在这里,总是表示正确的词语是我们的预测。 通常,我们把整个句子作为训练样本,所以整体错误是每次错误的加法。

我们的目标是计算错误值对参数的梯度,以及使用在随机梯度下降中学习到的参数。 就像将所有错误相加一样,也将每个训练样本的每个时间梯度值相加。

为了计算梯度,采用链式求导规律,主要采用反向传播算法对错误进行后续传播。 以下,主要为了便于说明而作为例子使用。

上面是向量的外积。 如果你不理解上面的公式,请不要担心。 我在这里跳过了几个步骤。 请自己计算一下这些坡度值。 这里我想说明的是,坡度值只依赖于当前的结果。 由此,计算的梯度只剩下简单的矩阵积。

但是坡度的情况不同。 如上所述,你可以写连锁规律。

注意到这里的依赖,依赖和等。 所以为了得到的梯度,不能视为常数。 我们需要再次使用连锁法则,得到的结果如下。

我们把各时刻得到的梯度值相加,换句话说,在计算输出的所有步骤中都使用了。 我们需要使时刻的梯度向相反方向传播。

梯度消失问题在教程的前一部分中提到,RNN很难依赖——学习几步之外的词语之间的相互作用。 这有问题。 因为英语句子的意思通常由相距不大的词语决定,如“themanwhoworeawigonhisheadwentinside”。 这个句子是男人进来的,而不是假发。 但是,普通的RNN捕捉不到这样的信息。 要理解为什么,首先仔细看看上面计算的梯度:

我意识到有必要使用链式法则。 例如, 请注意,因为我们使用向量函数对向量求导数,所以结果是一个称为Jacobian矩阵的矩阵,矩阵元素是每个点的导数。 可以重新绘制顶部坡度:

可以证明上面Jacobian矩阵的二范数(被认为是绝对值)的上界为1。 这是直观的。 因为激活函数将所有制映射到-1和1之间,所以导数的值边界也是1。

可以看到tanh函数和sigmoid函数两端的梯度值为0,接近平行线。 当这种情况发生时,我们认为相应的神经元饱和了。 这些坡度为0,前一层的坡度也为0。 矩阵中存在较小的值,多个矩阵相乘后梯度值呈指数下降,最终几步后完全消失。 相对较远的时间梯度值为0,这些时间状态无助于学习过程,无法学习长距离依赖。 消失梯度问题不仅出现在RNN上,还出现在深度前方神经网上。 只是,由于RNN通常很深(在例子中深度和句子长度一致),所以这个问题变得更加普遍。

依赖于我们的激活函数和网络参数,如果Jacobian矩阵的值过大,很容易发生梯度爆炸而不是梯度消失问题。 坡度消失比坡度爆炸受到更多关注有两个原因。 一是梯度爆炸容易发现,梯度值变为NaN,程序崩溃。 其二,通过用预定义的阈值修剪梯度,可以简单有效地解决梯度爆炸问题。 坡度消失出现时不那么明显,很难处理。

幸运的是,有几种解决坡度消失问题的方法。 合适的初始化矩阵w可以减小梯度消失效应,也起到正则化的作用。 更好的方法是选择ReLU而不是sigmoid和tanh作为激活函数。 ReLU的导数为常数值0或1,因此不会引起梯度消失。 在更常见的情形中,采用长短项存储(LSTM )或阈值递归单元(GRU )结构。 LTM于1997年首次提出,可能是目前NLP中最普遍采用的模式。 GRU于2014年首次提交,是LSTM的简化版本。 这两种RNN结构都是为解决梯度消失问题而设计的,可以有效地学习长距离依赖。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。