深度学习中,模型的目标是让损失函数最小化,即模型尽可能的不去犯错。这里的损失函数本质上是一个打分系统,用来告诉模型当前的计算结果与实际正确有多少差距。因为模型本身是不会理解”正确“的,没有客观物理世界的常识,所以只能以数学计算的方式得到”结果“。这里本质上还是规则驱动。
引入损失函数后,模型会自主调整自己的参数,以达到损失函数最小值,也就是得到模型认为可以接受的”正确“。
基于损失函数的概念,模型为了让损失函数达到最小值,需要一份”导航“,这个导航就是梯度。如果把损失,即变化设定为一个坐标系中从左到右持续下降的曲线,所谓的梯度就是曲线中每个点对应的变化率。对于变化率的统计,可以告诉模型,哪个点的下降速率是最快的。
进一步思考,当某一点的下降速率非常大时,即模型梯度巨大无比,模型参数的更新一次性步子迈的太大时,非常容易崩溃,这就是梯度爆炸。反而,当某一点以及往后都没有什么变化,模型就不知道该如何降低自己的损失函数了,参数层面上会一直得不到更新,这就是梯度消失。
再回到rnn的记忆问题,为什么rnn对长文本的处理不够好?我们先要知道模型的训练过程中有前向传播和反向传播这两个概念:前者是指模型根据现有知识推算问题结果的过程,算完后,损失函数进行最终结果的评价,当认定与正确的差距过大时,反向传播去告诉模型怎么改,也是一步步的反向去把误差进行回传,这样模型可以进行对应的调整。rnn的问题就在此刻发生了,当损失函数过大,反向传播时由于时间步太长,最终回到第一层的参数时,已经不具备任何修改参数的意义了。也就是发生了梯度消失。用一个极具简版的数学公式来表述:
notion image

1. 梯度爆炸

 

2. 梯度裁剪

3. 随机梯度下降

 
 
 
Loading...