Transformer 最近可以算是大放异彩了,最开始是用来做nlp 的,主要是通过注意力机制学习跨邻域之间的关系,取得了非常好的效果。这两年已经将这个思想应用到了视觉等其他方面。尤其是从ICLR2021 的 OpenAI DALL·E 以及AN IMAGE IS WORTH 16X16 WORDS 等文章的惊艳效果,势必会带来一波图像、文字相结合的高潮。
为了跟踪一下热点,也是为了后面想通过transformers 来实现视觉相关的一些任务,所以利用元旦假期学习一下这篇开山之作,希望到后续工作中借鉴,同时也希望对像我一样没有接触过翻译的初学者能够有一点用处。
对于transformer的介绍,有一篇博客写的非常详细[jalammar](The Illustrated Transformer),但是“纸上得来终觉浅”,我想还是跑跑代码更能加深理解,所以这篇文章会基于一个中-英 文翻译任务来帮助理解。因为我没做过翻译相关的项目,理解可能比较浅显 或者有错误,还希望大佬们能帮忙指正。
中-英翻译
从头开始,应该怎么实现这个任务?当然是找开源项目。
[官方项目 tensor-to-tensor](tensorflow/tensor2tensor) 这个项目覆盖比较全,包含了其他一系列论文的实现。
[pytorch-attention](jadore801120/attention-is-all-you-need-pytorch) 基于pytorch的项目,内容相对少,比较适合初学者,我就是基于这个项目来实现的.
- 环境
```
GPU -NVIDIA 1080ti >=1张
ubuntu 16.0
python 3.4+
pytorch 1.3.1
torchtext 0.4.0
spacy 2.2.2+
2.找数据
我们需要找中-英 对照的数据,可以去爬双语著作,但是要处理很麻烦,我在这里[WMT2019](ACL 2019 fourth Conference on Machine Translation) 找到了不同语言之间的翻译数据,其中**news-commentary-v14.en-zh.tsv** 这个是中-英的对照数据,也可以换成其他数据。我们下载之后有30多万行中-英一一对应的句子。
lines = [line.rstrip() for line in open(txt_dir)]
for i in range(len(lines)):
value = re.split(r't', lines[i])
if len(value)<2:
continue
en = value[0]
zh =value[1]
我将数据随机之后再分成 train、val、test,分别占90%、5%、5%。
3. 预处理:
英文是每个单词是一个词,但是中文则会有一些组合词,比如说“开心”,开、心、开心有不同的意思。所以中文应该是需要分词的,怎么实现分词的我不是很清楚,可以参考下[分词算法总结](中文分词算法总结_mandagod的博客-CSDN博客_中文分词算法)。我找到了一个别人训练好的模型,可以帮助我实现分词,这个网站 [spacy](spaCy 101: Everything you need to know · spaCy Usage Documentation)有十几种语言的训练好的模型,我找到中文**zh_core_web_sm** (这是小模型、还有中模型、大模型,我想我用小的就够了,毕竟资源有限) 和英文的模型**en_core_web_sm**,分别下载下来,然后对上面得到的数据每一句中英文分别进行分词。