Transformers 自然语言处理(二)(3)https://developer.aliyun.com/article/1513961
使用 BLEU 评估机器翻译
Papineni等人(2002 年)提出了一种评估人类翻译的高效方法。定义人类基线很困难。但是,他们意识到,如果我们逐字比较人类翻译和机器翻译,我们可以获得有效的结果。
Papineni等人(2002 年)将他们的方法命名为双语评估助手分数(BLEU)。
在本节中,我们将使用自然语言工具包(NLTK)实现 BLEU:
www.nltk.org/api/nltk.translate.html#nltk.translate.bleu_score.sentence_bleu
我们将从几何评估开始。
几何评估
BLEU 方法将候选句子的部分与参考句子或多个参考句子进行比较。
打开这本书的 GitHub 存储库的章节目录中的BLEU.py
。
程序导入了nltk
模块:
from nltk.translate.bleu_score import sentence_bleu from nltk.translate.bleu_score import SmoothingFunction
然后,它模拟了机器翻译模型生成的候选翻译与数据集中实际翻译参考之间的比较。 请记住,一句话可能已经多次重复,并且以不同的方式被不同的译者翻译,这使得找到有效的评估策略变得具有挑战性。
该程序可以评估一个或多个参考:
#Example 1 reference = [['the', 'cat', 'likes', 'milk'], ['cat', 'likes' 'milk']] candidate = ['the', 'cat', 'likes', 'milk'] score = sentence_bleu(reference, candidate) print('Example 1', score) #Example 2 reference = [['the', 'cat', 'likes', 'milk']] candidate = ['the', 'cat', 'likes', 'milk'] score = sentence_bleu(reference, candidate) print('Example 2', score)
这两个例子的得分都是1
:
Example 1 1.0 Example 2 1.0
候选C、参考R以及在C(N)中找到的正确令牌数量的简单评估P可以表示为几何函数:
如果您正在寻找 3 克重叠,例如:
#Example 3 reference = [['the', 'cat', 'likes', 'milk']] candidate = ['the', 'cat', 'enjoys','milk'] score = sentence_bleu(reference, candidate) print('Example 3', score)
如果您正在寻找 3 克重叠,则输出会很严重:
Warning (from warnings module): File "C:\Users\Denis\AppData\Local\Programs\Python\Python37\lib\site-packages\nltk\translate\bleu_score.py", line 490 warnings.warn(_msg) UserWarning: Corpus/Sentence contains 0 counts of 3-gram overlaps. BLEU scores might be undesirable; use SmoothingFunction(). Example 3 0.7071067811865475
一个人可以看出得分应该是1
而不是0.7
。 超参数可以更改,但方法仍然保持不变。
上面代码中的警告是一个很好的警告,它预告了下一节的内容。
每个程序版本和每次运行的消息可能会有所不同,因为这是一个随机过程。
Papineni等人(2002 年)提出了一种修改过的一元方法。 思路是统计参考句子中的词出现次数,并确保在候选句子中不会过度评估该词。
考虑由Papineni等人(2002 年)解释的以下示例:
参考 1:地板上有一只猫。
参考 2:垫子上有一只猫。
现在考虑以下候选序列:
候选:the the the the the the the
现在我们来找出候选句子中的单词数(相同单词“the”的7
次出现)在参考 1
句子中(单词“the”的2
次出现)的情况。
标准的一元精确度将是7/7
。
修改后的一元精确度为2/7
。
请注意,BLEU 函数的输出警告表示同意并建议使用平滑。
让我们将平滑技术添加到 BLEU 工具包中。
应用平滑技术
Chen和Cherry(2014 年)引入了一种平滑技术,可以改进标准 BLEU 技术的几何评估方法。
标签平滑是一种非常有效的方法,可以在训练阶段改进Transformers模型的性能。 这对困惑度产生了负面影响。 然而,它迫使模型更加不确定。 这反过来对准确性产生积极影响。
例如,假设我们必须预测以下序列中的掩码单词是什么:
猫[mask]了牛奶。
想象一下输出以 softmax 向量的形式出现:
candidate_words=[drinks, likes, enjoys, appreciates] candidate_softmax=[0.7, 0.1, 0.1,0.1] candidate_one_hot=[1,0,0,0]
这将是一个残酷的方法。 标签平滑可以通过引入 epsilon = 使系统更开放。
candidate_softmax
的元素数量为k=4。
对于标签平滑,我们可以将 设置为 0.25
,例如。
标签平滑的几种方法之一可以是一个直观的函数。
首先,将 candidate_one_hot
的值减小 。
通过 0
值增加 。
如果我们应用这种方法,我们将得到以下结果:
candidate_smoothed=[0.75,0.083,0.083,0.083]
,使输出对未来的变换和更改开放。
变换器使用标签平滑的变体。
BLEU 的一个变体是 chencherry 平滑。
Chencherry 平滑
Chen 和 Cherry(2014)介绍了一种通过将 添加到否则为 0
的值来平滑候选评估的有趣方法。有几种 chencherry(Boxing Chen + Colin Cherry)方法:www.nltk.org/api/nltk.translate.html
。
让我们首先评估一个带有平滑的法语 - 英语示例:
#Example 4 reference = [['je','vous','invite', 'a', 'vous', 'lever','pour', 'cette', 'minute', 'de', 'silence']] candidate = ['levez','vous','svp','pour', 'cette', 'minute', 'de', 'silence'] score = sentence_bleu(reference, candidate) print("without soothing score", score)
尽管人类可以接受候选者,但输出分数较低:
without smoothing score 0.37188004246466494
现在,让我们对评估添加一些开放的平滑:
chencherry = SmoothingFunction() r1=list('je vous invite a vous lever pour cette minute de silence') candidate=list('levez vous svp pour cette minute de silence') #sentence_bleu([reference1, reference2, reference3], hypothesis2,smoothing_function=chencherry.method1) print("with smoothing score",sentence_bleu([r1], candidate,smoothing_function=chencherry.method1))
分数未达到人类可接受程度:
with smoothing score 0.6194291765462159
我们现在已经看到了数据集是如何预处理的以及 BLEU 如何评估机器翻译。
使用谷歌翻译进行翻译
谷歌翻译,translate.google.com/
,提供了一个用于翻译的即用界面。谷歌正在逐步将变换器编码器引入其翻译算法中。在接下来的部分中,我们将使用谷歌 Trax 实现一个翻译任务的变换器模型。
但是,可能根本不需要 AI 专家。
如果我们在谷歌翻译中输入前一节中分析的句子,Levez-vous svp pour cette minute de silence
,我们将实时获得英文翻译:
图 6.2:谷歌翻译
翻译是正确的。
工业 4.0 是否仍需要 AI 专家进行翻译任务,或者只需要一个网络界面开发人员?
谷歌在其谷歌翻译平台上提供了翻译所需的每项服务:cloud.google.com/translate
:
- 一个翻译 API:一个网络开发人员可以为客户创建一个接口
- 可以翻译流媒体内容的媒体翻译 API
- 一个 AutoML 翻译服务,将为特定领域训练一个定制模型
一个谷歌翻译项目需要一个网络开发人员来处理界面,一个专业主题专家(SME),也许还需要一个语言学家。但是,AI 专家不是必需的。
工业 4.0 正朝着 AI 作为一种服务的方向发展。那么为什么要费心学习具有变换器的 AI 开发呢?成为工业 4.0 AI 专家有两个重要的原因:
- 在现实生活中,AI 项目经常遇到意想不到的问题。例如,谷歌翻译可能无论投入多少善意都无法满足特定需求。在这种情况下,谷歌 Trax 将会派上用场!
- 要使用谷歌 Trax 进行 AI,您需要是一个 AI 开发者!
你永远不知道!第四次工业革命正在将一切与一切连接起来。一些 AI 项目可能会顺利运行,而一些则需要 AI 专业知识来解决复杂问题。例如,在第十四章中,解释黑匣子Transformers模型,我们将展示有时需要 AI 开发来实现 Google 翻译。
现在我们已经准备好使用 Trax 进行翻译。
使用 Trax 进行翻译
谷歌大脑开发了Tensor2Tensor(T2T)来使深度学习开发更容易。T2T 是 TensorFlow 的一个扩展,包含了一个深度学习模型库,其中包含许多Transformers示例。
虽然 T2T 是一个很好的开始,但谷歌大脑随后推出了 Trax,一个端到端的深度学习库。Trax 包含一个可以应用于翻译的Transformers模型。谷歌大脑团队目前负责维护 Trax。
这一部分将重点介绍初始化由瓦斯瓦尼等人(2017 年)描述的英德问题所需的最小功能,以说明Transformers的性能。
我们将使用预处理的英语和德语数据集来表明Transformers架构是语言无关的。
打开Trax_Translation.ipynb
。
我们将开始安装我们需要的模块。
安装 Trax
谷歌大脑已经使 Trax 易于安装和运行。我们将导入基础知识和 Trax,可以在一行中安装:
#@title Installing Trax import os import numpy as np !pip install -q -U trax import trax
是的,就是这么简单!
现在,让我们创建我们的Transformers模型。
创建原始的Transformers模型
我们将创建原始的Transformers模型,就像第二章,开始使用Transformers模型架构中描述的那样。
我们的 Trax 函数将在几行代码中检索预训练模型配置:
#@title Creating a Transformer model. # Pre-trained model config in gs://trax-ml/models/translation/ende_wmt32k.gin model = trax.models.Transformer( input_vocab_size=33300, d_model=512, d_ff=2048, n_heads=8, n_encoder_layers=6, n_decoder_layers=6, max_len=2048, mode='predict')
模型是一个具有编码器和解码器堆栈的Transformers。每个堆栈包含6
层和8
个头。d_model=512
,与原始Transformers的架构相同。
Transformers需要预训练的权重才能运行。
使用预训练权重初始化模型
预训练权重包含Transformers的智能。权重构成了Transformers对语言的表示。权重可以表示为将产生某种形式的机器智能 IQ的参数数量。
让我们通过初始化权重来给模型赋予生命:
#@title Initializing the model using pre-trained weights model.init_from_file('gs://trax-ml/models/translation/ende_wmt32k.pkl.gz', weights_only=True)
机器配置及其智能现已准备就绪。让我们对一个句子进行分词。
对句子进行分词
我们的机器翻译器已准备好对句子进行分词。笔记本使用由Trax
预处理的词汇表。预处理方法类似于本章中描述的预处理 WMT 数据集部分。
现在,这个句子将被分词:
#@title Tokenizing a sentence. sentence = 'I am only a machine but I have machine intelligence.' tokenized = list(trax.data.tokenize(iter([sentence]), # Operates on streams. vocab_dir='gs://trax-ml/vocabs/', vocab_file='ende_32k.subword'))[0]
程序现在将解码句子并产生一个翻译。
从Transformers解码
Transformers将句子编码为英语,然后将其解码为德语。模型及其权重构成了其能力集。
Trax
已经使解码函数变得直观易用:
#@title Decoding from the Transformer tokenized = tokenized[None, :] # Add batch dimension. tokenized_translation = trax.supervised.decoding.autoregressive_sample( model, tokenized, temperature=0.0) # Higher temperature: more diverse results.
请注意,较高的温度会产生多样化的结果,就像人类翻译者一样,在本章的定义机器翻译部分有详细解释。
最终,程序将解密并显示翻译。
解密并显示翻译
Google Brain 用Trax
开发了一个主流、颠覆性和直观的 Transformer 实现。
程序现在将解密并显示翻译的结果:
#@title De-tokenizing and Displaying the Translation tokenized_translation = tokenized_translation[0][:-1] # Remove batch and EOS. translation = trax.data.detokenize(tokenized_translation, vocab_dir='gs://trax-ml/vocabs/', vocab_file='ende_32k.subword') print("The sentence:",sentence) print("The translation:",translation)
输出相当令人印象深刻:
The sentence: I am only a machine but I have machine intelligence. The translation: Ich bin nur eine Maschine, aber ich habe Maschinenübersicht.
转换器将machine intelligence
翻译为Maschinenübersicht
。
如果我们将Maschinenübersicht
拆分为Maschin(机器)
+ übersicht(智能)
,我们可以看到:
über
的字面意思是“over”sicht
的意思是“视野”或“视图”
转换器告诉我们,尽管它是一台机器,它能够有视觉。机器智能通过 Transformer 不断增长,但它不是人类智能。机器用自身的智能学习语言。
这结束了我们对 Google Trax 的实验。
总结
在本章中,我们探讨了原始 Transformer 的三个重要方面。
我们首先定义了机器翻译。人工翻译为机器设立了一个极高的基准。我们看到,英语-法语和英语-德语翻译意味着需要解决大量问题。Transformer 解决了这些问题,并创造了最先进的 BLEU 记录。
然后,我们对来自欧洲议会的 WMT 法语-英语数据集进行了预处理,并进行了数据清理。我们必须将数据集转换成行并清理数据。做完这些之后,我们通过消除低于频率阈值的单词来减小数据集的大小。
机器翻译 NLP 模型需要相同的评估方法。在 WMT 数据集上训练模型需要进行 BLEU 评估。我们看到了几何评估是打分翻译的一个很好的基础,但即使是修改后的 BLEU 也有其局限性。因此,我们添加了一种平滑技术来增强 BLEU。
我们看到,Google 翻译提供了标准的翻译 API、媒体流 API 和自定义的自动机器学习模型训练服务。如果项目顺利进行,实施 Google 翻译 API 可能不需要进行 AI 开发。如果不顺利,我们将不得不像从前一样动手做!
我们使用了 Trax,Google Brain 的端到端深度学习库,实现了英语到德语的翻译转换器。
现在我们已经介绍了构建转换器的主要构件:架构、预训练、训练、数据预处理和评估方法。
在下一章,GPT-3 引擎崛起的超人类 Transformer中,我们将探索使用我们在前几章中探讨的构件实现 Transformer 的令人惊叹的方式。
问题
- 机器翻译现在已经超过了人类基准。(是/否)
- 机器翻译需要大规模的数据集。(是/否)
- 没有必要使用相同的数据集比较Transformers模型。(True/False)
- BLEU 是法语单词蓝色的缩写,也是 NLP 度量的首字母缩写。(True/False)
- 平滑技术增强了 BERT。(True/False)
- 德英与英德的机器翻译相同。(True/False)
- 原始的 Transformer 多头注意力子层有 2 个头。(True/False)
- 原始的 Transformer 编码器有 6 层。(True/False)
- 原始的 Transformer 编码器有 6 层,但只有 2 层解码器。(True/False)
- 你可以训练没有解码器的转换器。(True/False)
参考资料
- 英德 BLEU 分数与参考论文和代码:
paperswithcode.com/sota/machine-translation-on-wmt2014-english-german
- 2014 年机器翻译研讨会(WMT):
www.statmt.org/wmt14/translation-task.html
- 欧洲议会议事录 1996-2011,法英平行语料库:
www.statmt.org/europarl/v7/fr-en.tgz
- Jason Brownlee,博士,如何准备法语至英语的机器翻译数据集:
machinelearningmastery.com/prepare-french-english-dataset-machine-translation/
- Kishore Papineni,Salim Roukos,Todd Ward 和 Wei-Jing Zhu,2002 年,BLEU:自动评估机器翻译的方法:
aclanthology.org/P02-1040.pdf
- Jason Brownlee,博士,用 Python 计算文本的 BLEU 得分的简介:
machinelearningmastery.com/calculate-bleu-score-for-text-python/
- Boxing Chen 和 Colin Cherry,2014 年,句子级 BLEU 平滑技术的系统比较:
acl2014.org/acl2014/W14-33/pdf/W14-3346.pdf
- Ashish Vaswani,Noam Shazeer,Niki Parmar,Jakob Uszkoreit,Llion Jones,Aidan N. Gomez,Lukasz Kaiser 和 Illia Polosukhin,2017 年,注意力就是一切:
arxiv.org/abs/1706.03762
- Trax 存储库:
github.com/google/trax
- Trax 教程:
trax-ml.readthedocs.io/en/latest/
加入我们书籍的 Discord 空间
加入该书的 Discord 工作区,与作者进行每月的Ask me Anything会话: