ZMonster's Blog 巧者劳而智者忧,无能者无所求,饱食而遨游,泛若不系之舟

论文笔记:Visualizing and understanding recurrent networks


作者

  • 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 的比例

    lstm_gru_saturation.png

    其中

    • 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 错误,但对其他类型的错误却没有明显的改善,这说明光是增大模型大小是不够的,可能需要设计更好、更新的结构