机器翻译变压器输出 - “未知”令牌?
Posted
技术标签:
【中文标题】机器翻译变压器输出 - “未知”令牌?【英文标题】:Machine translation transformer output - "unknown" tokens? 【发布时间】:2021-12-04 07:35:09 【问题描述】:在基础 Transformer 模型(Vaswani 等人)上训练后解码/翻译测试数据集时,我有时会在输出中看到这个标记“unk”。
这里的“unk”指的是一个未知的令牌,但我的问题是这背后的原因是什么?基于https://nlp.stanford.edu/pubs/acl15_nmt.pdf,是否意味着我为训练集构建的词汇不包含测试集中存在的单词?
作为参考,我使用 Spacy
en_core_web_sm
和 de_core_news_sm
构建了 Vocab
用于德语到英语的翻译任务。
示例输出:
ground truth = ['a', 'girl', 'in', 'a', 'jean', 'dress', 'is', 'walking', 'along', 'a', 'raised', 'balance', 'beam', '.']
predicted = ['a', 'girl', 'in', 'a', '<unk>', 'costume', 'is', 'jumping', 'on', 'a', 'clothesline', '.', '<eos>']
如您所见,jean 在这里是“unk”。
【问题讨论】:
unk
表示词汇表中不存在令牌。您需要使用 BPE 或 SentencePiece 模型来解决这个问题。
你所说的词汇是指它不在 Spacy 的列表中吗?还是模型在数据预处理过程中构建的词汇?那么模型参数的任何调整都无济于事吗?对于 BPE / Sentence 片段,它与子词相同吗?如果我做对了,BPE 会尝试预测未知词吗?顺便说一句,光束搜索有帮助吗?我正在使用贪婪解码。
没有为此调整的模型参数。早些时候,这个问题在单向 RNN 中更加持久,但您使用的是 Transformer 模型。在训练翻译模型之前,您需要在 src 和 tgt 词汇中使用子词,因为词汇量是有限的,并且不允许列出语料库中所有可能的单词和单词形式。
【参考方案1】:
神经机器翻译模型的词汇量有限。原因是您可以通过将编码器的隐藏状态乘以每个词汇标记有一行的矩阵来获得目标词汇标记的分布。您提到的论文使用 1000 维的隐藏状态。如果你想合理地覆盖英语,你需要一个至少 200k 标记的词汇表,这意味着这个矩阵只有 800MB。
您提到的论文是 2015 年的过时解决方案,并试图找到如何使词汇量尽可能大。然而,增加词汇量似乎并不是最好的解决方案,因为随着词汇量的增加,你会在词汇表中添加越来越少的单词,并且这些单词嵌入的训练信号越来越少,因此模型最终不会学会正确使用这些词。
最先进的机器翻译使用 BPE 算法将 introduced in 2016 分割成子词。与此同时,Google 为他们的first production neural machine translation system 提供了一个名为 WordPiece 的替代解决方案。后来,谷歌推出了改进的分割算法SentencePiece in 2018。
子词词汇表的主要原则是频繁词保持不变,而稀有词被分割成更小的单元。稀有词通常是没有真正被翻译的专有名称。对于具有复杂形态的语言,子词分割允许模型学习如何创建相同单词的不同形式。
【讨论】:
感谢您的详细解答!为了提供更新,我现在使用 Bert 标记器而不是 Spacy以上是关于机器翻译变压器输出 - “未知”令牌?的主要内容,如果未能解决你的问题,请参考以下文章