这个算是在课程学习之外的探索,不过希望能尽快用到项目实践中。在文章里会引用较多的博客,文末会进行reference。
搜索Transformer机制,会发现高分结果基本上都源于一篇论文Jay Alammar的《The Illustrated Transformer》(图解Transformer),提到最多的Attention是Google的《Attention Is All You Need》。
- 对于Transformer的运行机制了解即可,所以会基于这篇论文来学习Transformer,结合《Sklearn+Tensorflow》中Attention注意力机制一章完成基本的概念学习;
- 找一个基于Transformer的项目练手
4.基于Tensorflow实现Transformer
距离上次更新已经过去两天了,放弃之前那个Transformer实现,我们换一个项目吼不吼啊(https://github.com/Kyubyong/transformer)。
这周快要累死了,上课上到吐,还被教授公开处刑……
之前那个实现阅读起来有点太麻烦,就弃了。
作者的目的
- 学习论文,进行实现
- 分享自己的代码
与原论文的不同
该项目是实现一个德语-英语的翻译功能,
内容,而是要实现论文的核心思想,并作出简单快速的验证。由于这个原因,部分代码与原论文有所不同。这些不同之处有:
- 使用了 IWSLT 2016 de-en 数据集,而不是 wmt 数据集,因为前者更小,且不需要特殊的预处理。
- 为了简化,我用单词而非子单词构建了词表。当然,如果愿意你可以尝试 bpe 或者 word-piece。
- 我将位置编码直接用作了参数,而原文用了一些正弦公式。论文作者之一 Noam 说两种方法都有效,详见:https://www.reddit.com/r/MachineLearning/comments/6gwqiw/r_170603762_attention_is_all_you_need_sota_nmt/
- 论文根据训练步数逐渐调节学习率,我简单地把学习率固定在一个非常小的值 0.0001 上。因为使用小数据集,训练的速度已经足够快(使用单块 GTX 1060 仅需几个小时!!)
最后一个很恐怖了,使用1060显卡还要几个小时的训练时间,cpu估计就废了,看样子还是得快些打通colab的使用。
文件描述
注意看这里的文档,我们之前写的都是一段脚本,这显然是不够的,一个是要注意文档的写法,还有各个模块之间的关系。
hyperparams.py 包括全部所需的超参数
prepro.py 可为源和目标创建词汇文件(vocabulary file)
data_load.py 包括装载和批处理数据的相关函数
modules.py 拥有全部编码/解码网络的构建模块
train.py 包含模型
eval.py 进行评估
训练
- 第一步:下载 IWSLT 2016 German–English parallel corpus 并且把它放在 corpora/文件夹
- 第二步:如果必要的话在 hyperparams.py 下调整超参数(hyper parameters)
- 第三步:运行 prepro.py,在 preprocessed 文件下生成词汇文件
- 第四步:运行 train.py 或下载预训练好的文件(pretrained files)
网友评论