如何从预训练的转换器中获取词嵌入

How to get word embeddings from the pretrained transformers

我正在处理多语言数据的词级分类任务,我正在使用 XLM-R,我知道 XLM-R 使用 sentencepiece 作为分词器,有时会将词分词为子词。

For example the sentence "deception master" is tokenized as de ception master, the word deception has been tokenized into two sub-words.

如何获得 deception 的嵌入。我可以采用子词的平均值来完成词的嵌入 here。但是我必须在 TensorFlow 中实现我的代码,而 TensorFlow 计算图不支持 NumPy。

我可以在将子词的均值放入 NumPy 数组后存储最终的隐藏嵌入,并将该数组作为模型的输入,但我想微调转换器。

如何从transformer给出的子词嵌入中得到词嵌入

将子词嵌入到词中以进行词标记并不是解决此问题的通常方法。通常的方法是相反的:保持子词原样,但调整标签以尊重预训练模型的分词。

原因之一是数据通常是成批的。当将子词合并成词时,批次中的每个句子最终都会有不同的长度,这将需要独立处理每个句子并再次填充批次——这会很慢。此外,如果您不对相邻嵌入进行平均,则可以从损失函数中获得更细粒度的信息,该信息明确说明哪个子词导致了错误。

使用SentencePiece分词时,可以得到原始字符串中的索引:

from transformers import XLMRobertaTokenizerFast
tokenizer = XLMRobertaTokenizerFast.from_pretrained("xlm-roberta-base")
tokenizer("deception master", return_offsets_mapping=True)

本 returns 以下词典:

{'input_ids': [0, 8, 63928, 31347, 2],
 'attention_mask': [1, 1, 1, 1, 1],
 'offset_mapping': [(0, 0), (0, 2), (2, 9), (10, 16), (0, 0)]}

通过偏移量,您可以找出子词是否对应于您要标记的词。有多种策略可用于对标签进行编码。最简单的方法就是将标签复制到每个子词。一种更奇特的方法是使用命名实体识别中使用的方案,例如 IOB tagging 明确说明标记段的开头是什么。