transformer,bert等预训练语言模型火了这么久,GPT3都出来了,不能再等了,赶紧用上!
我重点关注Bert。模型,论文啥都不多说,必须先看懂了,源码还没时间进行阅读,因为目前急需使用,所以希望抓紧时间用上。
于是乎,我找到了Transformers这个集合了目前所有先进预训练语言模型的包,开始学习吧!
之前是看了一些博客,写仿着写了一些代码,但是觉得有些函数,参数都是一知半解,还是得跟着官方文档从零学起哇。
安装就不讲了,很简单,直接从术语开始。
1. input_id:是模型的输入之一,表示token(可以理解为输入文本中的最小单位,如中文的单字)在vocab中的索引。
给定一句话:sequence="A Titan RTX has 24GB of VRAM"
将这句token化(就是分词):tokenized_sequence=tokenizer.tokenize(sequence)
得到:['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M']
获取input_id:encoded_sequence=tokenizer(sequence)["input_ids"] 或者使用tokenizer.encode(sequence)
得到每个token在词表中的索引值:[101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]
2. Attention mask:用于区分句子中参与attention和不参与attention的位置,因为要统一长度,有些句子需要padding 0,那么这些padding的位置是不需要参与attention计算的,如何让模型区分,这正是attention mask的任务。
sequence_a="This is a short sequence."
sequence_b="This is a rather long sequence. It is at least longer than the sequence A."
假设让句子a补充到b的长度:padded_sequences=tokenizer([sequence_a,sequence_b],padding=True)
查看其input_id:padded_sequences["input_ids"]
[[101, 1188, 1110, 170, 1603, 4954, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[101, 1188, 1110, 170, 1897, 1263, 4954, 119, 1135, 1110, 1120, 1655, 2039, 1190, 1103, 4954, 138, 119, 102]]
再看看其attention_mask: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]
可以看到padding部分的attention_mask是0,就不会参与到attention计算中。
3. Token Type IDs:用于区分当前token是属于哪个句子的
给出两个句子:[CLS] HuggingFace is based in NYC [SEP] Where is HuggingFace based? [SEP]
它们的token_type_ids是:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
4. Position IDs:因为transformer中attention计算方式与每个参与计算的token位置无关,而语序是包含信息的,所以加了position ids来明确每个token是在什么位置上,从0到最后依次编号。