最近, 笔者想研究 BERT 模型, 然而发现想弄懂 BERT 模型, 还得先了解 Transformer.
本文尽量贴合 Transformer 的原论文, 但考虑到要易于理解, 所以并非逐句翻译, 而是根据笔者的个人理解进行翻译, 其中有一些论文没有解释清楚或者笔者未能深入理解的地方, 都有放出原文, 如有不当之处, 请各位多多包含, 并希望得到指导和纠正.
论文标题
Attention Is ALL You Need
论文地址
https://arxiv.org/pdf/1706.03762.pdf
摘要
序列转换方式由基于复杂递归神经网络 (RNN) 和卷积神经网络 (CNN) 的编码器和解码器模型主导. 表现最佳的模型也只是通过一个注意力机制来连接了编码器和解码器. 我们提出一个新的简单网络架构 --Transformer. 相比表现最佳的模型, 该架构仅仅基于注意力机制, 完全摒弃了递归和卷积. 从两个机器翻译任务的实验结果显示, Transformer 的效果更优秀, 同时有更好的并行性, 显著的减少了训练的时间. 我们的模型在 WMT2014 年发布的 "英 - 德" 翻译任务上达到了 28.4 BLEU[注解 1] , 超越了该任务上现有的最好的记录 2 个 BLEU, 包括总体效果. 在英 - 法翻译任务上, 我们的模型在 8 块 GPU 上训练了 3.5 天, 并创造了单模型最好 BLEU 分数 --41.8. 相比文献中的最佳模型, 这个训练成本不高. Transformer 在其它任务上也有好的泛化能力, 我们将其应用于 English constituency parsing(英语成分句法分析), 无论在大量的训练数据上还是有限的训练数据上都获得了成功.
- import matplotlib.pyplot as plt
- import numpy as np
- def softmax(inputs):
- return np.exp(inputs) / float(sum(np.exp(inputs)))
- def line_graph(x, y, x_title, y_title):
- plt.plot(x, y)
- plt.xlabel(x_title)
- plt.ylabel(y_title)
- plt.show()
- # graph_x = range(0, 21) 维数小的时候
- graph_x = range(0, 61) # 维数大的时候
- # graph_x = np.array(graph_x)/(float(len(graph_x)) ** 0.5) # 加入缩放因子
- graph_y = softmax(graph_x)
- print("GraphXreadings: {}".format(graph_x))
- print("GraphYreadings: {}".format(graph_y))
- line_graph(graph_x, graph_y, "Inputs", "SoftmaxScores")
来源: https://www.cnblogs.com/anai/p/11572847.html