如何从 BARTTokenizer 查找位置嵌入?

问题描述 投票:0回答:1

目标是添加令牌嵌入(定制-使用不同模型获得)和位置嵌入。

有没有一种方法可以使用 BART 模型找出文章(长度 500-1000 个字)的位置嵌入以及令牌嵌入。

tokenized_sequence = tokenizer(sentence, padding='max_length', truncation=True, max_length=512, return_tensors="pt")

输出是input_ids和attention_mask,但不是BERT模型中返回position_ids链接的参数。

bert.embeddings.position_embeddings('YOUR_POSITIONS_IDS')

或者获得位置嵌入的唯一方法是使用正弦位置编码?

pytorch nlp huggingface-transformers summarization bart
1个回答
0
投票

分词器不负责嵌入。它只生成要输入嵌入层的 id。 Barts 嵌入是学习的,即嵌入来自它们自己的嵌入层。

您可以像这样检索两种类型的嵌入。这里

bart
BartModel
。编码(大致)是这样完成的:

embed_pos = bart.encoder.embed_positions(input_ids)
inputs_embeds = bart.encoder.embed_tokens(input_ids)
hidden_states = inputs_embeds + embed_pos

完整的工作代码:

from transformers import BartForConditionalGeneration, BartTokenizer

bart = BartForConditionalGeneration.from_pretrained("facebook/bart-base", forced_bos_token_id=0)
tok = BartTokenizer.from_pretrained("facebook/bart-base")
example_english_phrase = "UN Chief Says There Is No <mask> in Syria"
input_ids = tok(example_english_phrase, return_tensors="pt").input_ids

embed_pos = bart.model.encoder.embed_positions(input_ids) * bart.model.encoder.embed_scale # by default the scale is 1.0
inputs_embeds = bart.model.encoder.embed_tokens(input_ids)
hidden_states = inputs_embeds + embed_pos

请注意,

embed_pos
对于实际令牌 ID 来说是不变的。只有他们的立场才重要。如果输入变大而不更改早期位置的嵌入,则会添加“新”嵌入:

这些情况产生相同的嵌入:

embed_positions([0, 1]) == embed_positions([123, 241]) == embed_positions([444, 3453, 9344, 3453])[:2]

© www.soinside.com 2019 - 2024. All rights reserved.