论文笔记:Visualizing and understanding recurrent networks
2018-11-10作者
- Andrej Karpathy
- Justin Johnson
- Li Fei-Fei
观点
- LSTM 在实践中表现出了非常好的结果,但我们对其性能的来源和限制理解地都还很不够
- 过去的一些分析都是靠最终测试集上的全局困惑度来评价 LSTM 的效果,并没有在「真实数据」上进行分析,也不够直观
数据集
- 托尔斯泰的《战争与和平》文本,共 3,258,246 字
- Linux 内核代码,共 6,206,996 字
模型/实验/结论
模型:
- RNN,分别尝试层数为 1 层、2 层和 3 层,隐层大小分别尝试 64, 128, 256 和 512,共 12 个模型
- LSTM,同 RNN
- GRU,同 RNN
实验和结论
- 用上述模型在两个数据集上训练语言模型,最后在测试集上计算交叉熵误差,对比三类共 36 个模型之间的结果
对 LSTM/GRU 的 gate 输出分布做可视化分析。如下图所示,图中的小圆圈代表一个神经元,横轴表示该神经元 gate 值超过 0.9 的比例,纵轴是 gate 值小于 0.1 的比例
其中
- forget gate 值超过 0.9 的比例很大的神经元,说明它能一直记住比较早之前的信息
- input gate 值超过 0.9 的比例很大的神经元,说明它对当前输入比较敏感
- output gate 的值超过 0.9 的比例很大的神经元,没什么意义,单纯的控制大小
对 LSTM 而言
- 第一层只有很少一部分 gate 值超过 0.9 或小于 0.1,其比例比较密集地分布在 0 附近,说明大部分都是在 0.1 到 0.9 之间
- 有一些神经元 forget gate 值超过 0.9 的比例超级大,也就是说它一直都超过 0.9,一直记着很早以前的东西
- 有一些神经元 forget gate 的值小于 0.1 的比例很大,但没有一直都小于 0.1 的,比例最大在 0.8 左右
- input gate 倾向于超过 0.9(相对比例大的神经元更多), output gate 的值分布比较均匀
对 GRU 来说
- 第一层的 update gate 普遍比较大而 reset gate 普遍比较小,注意本文中的 update gate 相当于 LSTM 中的 input gate
- 高层不像第一层那么极端,但总体形式差不多,就是 update gate 大而 reset gate 小这样
分析了 LSTM 在《战争与和平》文本上的错误类型
- ngram 错误,1-9 阶 ngram 模型能预测正确但 LSTM 预测失败的部分
- 罕见词错误: 既由词频不大于 5 的词导致的错误。这部分错误通过扩充数据集和 pretraining 是可以得到缓解的
- 词建模错误: 在遇到空格、换行、引号等词分隔符后,预测错了下一个词的第一个字符,和前面个动态长期记忆错误不一样的是,这个相当于在前面的词的基础上要选择一个词,而前面那个相当于是已经知道是什么词了,但是要补全它,这两者的信息量是完全不一样的
- 标点符号预测错
- 最后剩余的错误称为 boost error,
结论
- 多个隐藏层模型比单个隐藏层模型的效果要好
- LSTM 和 GRU 之间难分伯仲,但都显著好于 RNN
- LSTM 表现出了对长程结构的记忆能力,如在处理被引号括起来的长文本时,对开头和结尾的引号有特殊的响应
- 在多层的 LSTM/GRU 中,高层的神经元都开始分化,会有一部分倾向于接收新信息,有一部分则倾向于记住旧的信息
- GRU 的第一层几乎不怎么使用旧的信息,即使到高层后也更倾向于使用当前输入
- LSTM 建模长程依赖的能力大大超过 ngram 模型,一个 11MB 的 LSTM 模型效果能略微超过一个 3GB 的 20-gram 模型
- 对本身明显包含结构的文本(如内核代码)进行建模,当序列长度在 10 以下时,LSTM 和 20-gram 模型的差异不大,但随着序列变长,两者之间的差距逐渐变大,在 Linux 内核代码上,LSTM 能记忆的最大约 70 左右的距离
- LSTM 在迭代训练的过程中,首先建模了短程依赖,然后在此基础上逐渐地学习到对长程依赖的建模能力,这也是 seq2seq 论文中提到的逆序源语言序列有效的原因,因为这让模型先开始建模短程依赖再去建模长程依赖
- LSTM 并不能完全利用好最近的一些输入,LSTM 的错误中,有 42% 是 0-9 阶的 ngram 模型能够正确预测的
- 相信像 Memory Networks 那样,如果能直接对序列中最近的历史进行 attention 操作,那么能够提高 RNNLM 的效果
- 增大数据集、无监督预训练能提高 LSTM LM 对罕见词的效果
- 增大模型大小,显著减小了 ngram 错误,但对其他类型的错误却没有明显的改善,这说明光是增大模型大小是不够的,可能需要设计更好、更新的结构