HuggingFace(二) | Transformers类模型的输入有哪些?

Glossary(术语)

请确保你了解以下的术语,在这里会简单的介绍各个术语:

  • 自编码模型: see MLM;
  • 自回归模型: see CLM;
  • CLM: Causal Language Modeling. 标准语言模型,其训练task一般是从左往右对输入序列进行下一个token的预测;
  • MLM: Masked Language Modeling. 掩码语言模型,其训练task一般通过对输入序列的token随机mask并进行预测;
  • multimodal: 将文本与另一种输入(例如图像)结合在一起的task;
  • NLG: Natural Language Generation, 自然语言生成,例如翻译;
  • NLP: Natural Language Processing, 自然语言处理;
  • NLU: Natural Language Understanding, 通常指结构化输入序列的任务,例如文本分类;
  • pretrained model: 预训练模型;
  • RNN: Recurrent Neural Network,循环神经网络;
  • seq2seq or sequence-to-sequence: 通过一段输入序列来产生另一段输入序列的模型,例如翻译模型;
  • token: 序列的一部分,简单的可以理解为被分词之后的词或字,但实际上要根据具体模型而言。

 

Transformers类模型的输入

大多数模型的输入相同,但也会有个别模型有不同的输入。

Input IDs

token在vocab中的索引。

例如,BERT使用的WordPiece tokenizer先将序列tokenize成token:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
sequence = "A Titan RTX has 24GB of VRAM"
# 输出:['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']

然后将token转换为token在vocab中的id:

inputs = tokenizer(sequence)
print(inputs["input_ids"])
# 输出:[101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]

同样,通过token ids,可以解码回原来的序列:

decoded_sequence = tokenizer.decode(encoded_sequence)
print(decoded_sequence)
# 输出:[CLS] A Titan RTX has 24GB of VRAM [SEP]

Attention mask

Transformer模型有固定长度的token的输入序列,当两个输入序列之间互相计算attention时,如果token长度不一样,那么就无法构建二维的attention张量来计算两两之间的关系,因此需要对其中一段序列的token进行补齐或者截断。如果补齐,将会在补齐的位置上添加masked=0,以希望这些位置的token只用作补齐,而并不会进行真正的attention计算。

例如对于以下两个不同token长度的序列,它们之间的token长度并不相等:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
sequence_a = "This is a short sequence."
sequence_b = "This is a rather long sequence. It is at least longer than the sequence A."
encoded_sequence_a = tokenizer(sequence_a)["input_ids"]
encoded_sequence_b = tokenizer(sequence_b)["input_ids"]
print(encoded_sequence_a, '\n', encoded_sequence_b)
# 输出:[101, 1188, 1110, 170, 1603, 4954, 119, 102] 
#       [101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]

添加上自动补齐参数padding=True后,可以看到attention_mask中补齐的token其mask=0:

padded_sequences = tokenizer([sequence_a, sequence_b], padding=True)
print(padded_sequences["input_ids"])
print(padded_sequences["attention_mask"])
# 输出:[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

Token Type IDs

有一些模型的目标是为了解决文本分类或者阅读理解,训练或者预测的时候通常需要将两个不同的句子一起输入,为了区分这两个句子,通常需要增加一些特殊的token在两者之间,例如[CLS],[SEP],例如BERT模型中的输入即是:[CLS] SEQUENCE_A [SEP] SEQUENCE_B [SEP],将两个属于不同序列的token添加不同的Token Type IDs。

例如在BERT中:

from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-cased")
sequence_a = "HuggingFace is based in NYC"
sequence_b = "Where is HuggingFace based?"
encoded_dict = tokenizer(sequence_a, sequence_b)
decoded = tokenizer.decode(encoded_dict["input_ids"])
print(decoded)
# 输出:[CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]

print(encoded_dict['token_type_ids'])
# 输出:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]

Position IDs

和RNN自带序列位置信息不同的是,transformers需要自己计算位置信息,position id表示token在序列中的位置id,该参数是可选参数。如果没有position id传递给模型,则position id将自动创建为绝对位置编码。绝对位置编码会在

[0, config.max_position_embeddings - 1]

之间选择,也有模型使用其余方式的位置编码,例如相对位置编码,sinusoidal position embeddings等。

Labels

可选参数,主要在微调模型的时候需要用到,它会计算预测labels与传递给模型labels之间的loss。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值