我们先来看两个句子。

第1个句子是:“李白前些天去万花楼嫖娼,脱了衣服正要准备和明月姑娘行周公之礼时,几个捕快冲进来将他给捆绑了”。

第2个句子是:“李白和蒲松龄前些天去万花楼嫖娼,脱了衣服正要准备和明月姑娘行周公之礼时,几个捕快冲进来将他们给捆绑了”。

第1个句子中因为是一个人,所以使用“他”,第2个句子中,因为是两个人,所以用的“他们”。具体该使用“他”还是“他们”,是要根据句子前面的部分来判断的。假设一个人记性非常不好,当他在说到“几个捕快冲进来将”时,忘记了前面的内容,那么他就不知道接下来该使用“他”还是“他们”了。

 

普通RNN的记性也非常不好,无法记住间隔比较远的时间步的信息,这就导致无法根据上下文信息来生成语法正确的句子。例如在生成英语句子时,要注意单数和复数形式。“The cat,which already ate …,was full”和“The cats,which already ate …,were full”

 

RNN的记性不好,是由于梯度消失造成的。还记得我们之前说过,很深的神经网络很容易发生梯度爆炸或梯度消失。因为有时候梯度会呈指数级增长或减小,随着层数越来越多,最终就导致了梯度爆炸或梯度消失。在RNN中,随着时间步越来越多,也会发生梯度爆炸或梯度消失。也就是说,经过很多时间步之后,到达“将”字关联的时间步时,与“李白”这个词相关的时间步的信息已经消失了,所以接下来就不知道是该使用“他”还是“他们”了。时间步相隔的越远,那么信息互通能力就越差;有点像鱼一样,只有三秒记忆,只能受到附近的时间步的信息影响。

 

所以为了解决记性不好的缺点,我们要尽量避免梯度爆炸和梯度消失。通常来说梯度爆炸是比较容易发现,也比较容易解决的。因为梯度爆炸时,数值会巨大无比,最终超出计算机的数值范围,就会将该值设置为NaN(Not a number)。发现梯度爆炸后也很好解决,只要使用梯度修剪就可以了。梯度修剪就是指设置一个阈值,如果梯度值超过了这个阈值,那么就对梯度值进行缩放。梯度消失就比较难解决,这个我后面的文章会讲解通过解决梯度消失来解决RNN记忆不好的毛病。