Pytorch中DeepMind的关系复发性神经网络的实施(Santoro等人,2018年)。


关系内存核心(RMC)模块最初来自官方十四行诗实现。但是,目前,它们没有提供完整的语言建模基准代码。
此存储库是RMC的一个港口,并带有其他评论。它具有成熟的单词语言建模基准与传统LSTM。
它支持任何基于单词令牌的文本数据集,包括Wikitext-2和Wikitext-103。
RMC和LSTM型号都均支持自适应SoftMax,以减少大量词汇数据集的记忆使用。 RMC支持Pytorch的DataParallel ,因此您可以轻松地使用多GPU设置进行实验。
基准代码是由官方的pytorch单词语言模型示例固定的
它还具有纸张中最远的合成任务(见下文)。
Pytorch 0.4.1或更高版本(在1.0.0测试)&Python 3.6
python train_rmc.py --cuda用于使用GPU进行RMC的全面培训和测试。
python train_rmc.py --cuda --adaptivesoftmax --cutoffs 1000 5000 20000如果使用大型词汇数据集(如Wikitext-103)来适合VRAM中的所有启动器。
python generate_rmc.py --cuda用于从训练的模型中生成句子。
python train_rnn.py --cuda与GPU一起进行传统RNN的完整培训和测试。
RMC和LSTM的所有默认超参数都是使用Wikitext-2进行两周实验的结果。
使用Wikitext-2和Wikitext-103测试。 Wikitext-2捆绑在一起。
在./data内部创建一个子文件夹,然后将Word-Level train.txt , valid.txt和test.txt放置在子文件夹中。
指定--data=(subfolder name) ,您可以使用。
该代码在第一次训练中执行令牌化,并且该语料库被保存为pickle 。第一次运行后,代码将加载pickle文件。
RMC和LSTM都有〜11m参数。有关超参数的详细信息,请参考培训代码。
| 型号 | 有效的困惑 | 测试困惑 | 向前通过MS/批次(Titan XP) | 正向通行证MS/批次(Titan V) |
|---|---|---|---|---|
| LSTM(cudnn) | 111.31 | 105.56 | 26〜27 | 40〜41 |
| LSTM(用于循环) | 和cudnn相同 | 和cudnn相同 | 30〜31 | 60〜61 |
| RMC | 112.77 | 107.21 | 110〜130 | 220〜230 |
RMC可以达到与LSTM相当的性能(具有大量的超参数搜索),但事实证明,RMC非常慢。每次步骤的多头自我注意力可能是这里的罪魁祸首。使用LSTMCELL进行循环(RMC的更“公平”的基准)会减慢向前传球,但它仍然更快。
另请注意,就速度而言,RMC的超参数是最糟糕的情况,因为它使用了单个内存插槽(如论文中所述),并且没有从多插槽内存中的行分享分享中受益。
这里有趣的是,泰坦V中的速度比泰坦XP慢。原因可能是模型相对较小,并且模型经常调用小型线性操作。
也许Titan XP(〜1,900MHz解锁的CUDA时钟速度与Titan V的1,335MHz限制)受益于此类工作量。也许Titan V的CUDA内核发射潜伏期对于模型中的OPS较高。
我不是Cuda细节的专家。请分享您的结果!
注意参数倾向于过度拟合Wikitext-2。减少过度护理器以供注意(key_size)可以打击过度拟合。
在SoftMax(如LSTM ONE)之前,在输出logit上涂抹掉落有助于防止过度拟合。
| 嵌入式和头部尺寸 | #头 | 注意MLP层 | 钥匙尺寸 | 输出处辍学 | 内存插槽 | 测试ppl |
|---|---|---|---|---|---|---|
| 128 | 4 | 3 | 128 | 不 | 1 | 128.81 |
| 128 | 4 | 3 | 128 | 不 | 1 | 128.81 |
| 128 | 8 | 3 | 128 | 不 | 1 | 141.84 |
| 128 | 4 | 3 | 32 | 不 | 1 | 123.26 |
| 128 | 4 | 3 | 32 | 是的 | 1 | 112.4 |
| 128 | 4 | 3 | 64 | 不 | 1 | 124.44 |
| 128 | 4 | 3 | 64 | 是的 | 1 | 110.16 |
| 128 | 4 | 2 | 64 | 是的 | 1 | 111.67 |
| 64 | 4 | 3 | 64 | 是的 | 1 | 133.68 |
| 64 | 4 | 3 | 32 | 是的 | 1 | 135.93 |
| 64 | 4 | 3 | 64 | 是的 | 4 | 137.93 |
| 192 | 4 | 3 | 64 | 是的 | 1 | 107.21 |
| 192 | 4 | 3 | 64 | 是的 | 4 | 114.85 |
| 256 | 4 | 3 | 256 | 不 | 1 | 194.73 |
| 256 | 4 | 3 | 64 | 是的 | 1 | 126.39 |
原始RMC纸呈现Wikitext-103结果,其型号和批量尺寸较大(6 Tesla P100,每个尺寸为64批量,总计384。ouch)。
使用完整的SoftMax很容易吹动VRAM。强烈建议使用--adaptivesoftmax 。如果使用--adaptivesoftmax ,则应正确提供--cutoffs 。请参阅原始API说明
我没有这样的硬件,我的资源太有限了,无法进行实验。基准结果或其他任何贡献非常欢迎!
该任务的目的是:给定k随机标记(从1到k)d维向量,确定哪个是向量M的最远的向量。(答案是从1到k的整数)。
本文中的具体任务是:给定8个标记为16维向量,这是向量m的第n个最远的向量?向量被随机标记,因此模型必须认识到MTH向量是标记为M的向量,而不是输入中MTH位置中的向量。
该模型的输入包括每个示例的8个40维向量。这些40维矢量的结构是这样的:
[(vector 1) (label: which vector is it, from 1 to 8, one-hot encoded) (N, one-hot encoded) (M, one-hot encoded)]
python train_nth_farthest.py --cuda用于训练和测试GPU最远的任务。
它使用relational_rnn_general.py中的RelationalMemory类,该类是relational_rnn_models.py的一个版本,而没有语言模型特定代码。
有关超参数值的详细信息,请参考train_nth_farthest.py 。这些是从论文中的附录A1和十四行诗实施中获取的。
注意:按照十四行诗的实现,每个时期都会生成新的示例。这似乎与论文一致,该论文未指定所使用的示例数量。
该模型永远接受了单个Titan XP GPU的培训,直到达到91%的测试准确性。以下是3个独立运行的结果: 
如果训练足够长的时间,该模型确实打破了25%的障碍,但是壁时钟时间大约比论文中报道的时间长2至3倍。
尝试不同的超参数