待完成

  • 示例详解

Transformer分两块BERT&GPT都很能打

  1. BERT用的是transformer的encoder

    BERT是用了Transformer的encoder侧的网络,encoder中的Self-attention机制在编码一个token的时候同时利用了其上下文的token,其中‘同时利用上下文’即为双向的体现,而并非想Bi-LSTM那样把句子倒序输入一遍。

  2. GPT用的是transformer的decoder

    在它之前是GPT,GPT使用的是Transformer的decoder侧的网络,GPT是一个单向语言模型的预训练过程,更适用于文本生成,通过前文去预测当前的字。

Bert的embedding

Embedding由三种Embedding求和而成:

  1. Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务

    BERT在第一句前会加一个[CLS]标志,最后一层该位对应向量可以作为整句话的语义表示,从而用于下游的分类任务等。因为与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。 具体来说,self-attention是用文本中的其它词来增强目标词的语义表示,但是目标词本身的语义还是会占主要部分的,因此,经过BERT的12层(BERT-base为例),每次词的embedding融合了所有词的信息,可以去更好的表示自己的语义。而[CLS]位本身没有语义,经过12层,句子级别的向量,相比其他正常词,可以更好的表征句子语义。

  2. Segment Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务

  3. Position Embeddings和之前文章中的Transformer不一样,不是三角函数而是学习出来的

API

tokenizer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from transformers import AutoConfig,AutoModel,AutoTokenizer,AdamW,get_linear_schedule_with_warmup,logging

# config模块
MODEL_NAME="bert-base-chinese"
config = AutoConfig.from_pretrained(MODEL_NAME) #c onfig可以配置模型信息

# tokenizer模块
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)

tokenizer.all_special_ids # 查看特殊符号的id [100, 102, 0, 101, 103]
tokenizer.all_special_tokens # 查看token ['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']

tokenizer.vocab_size # 词汇表大小
tokenizer.vocab # 词汇对应的dict形式

## tokening
text="我在北京工作"
token_ids=tokenizer.encode(text)
token_ids # [101, 2769, 1762, 1266, 776, 2339, 868, 102]
tokenizer.convert_ids_to_tokens(token_ids) # ['[CLS]', '我', '在', '北', '京', '工', '作', '[SEP]']
# convert_tokens_to_ids(tokens) 为对应方法

## padding 做向量填充
token_ids=tokenizer.encode(text,padding=True,max_length=30,add_special_tokens=True)

## encode_plus
token_ids=tokenizer.encode_plus(
text,padding="max_length",
max_length=30,
add_special_tokens=True,
return_tensors='pt',
return_token_type_ids=True,
return_attention_mask=True
)

使用pre_train模型载入数据

1
2
model=AutoModel.from_pretrained(MODEL_NAME)
outputs=model(token_ids['input_ids'],token_ids['attention_mask'])

数据集dataset定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class EnterpriseDataset(Dataset):
def __init__(self,texts,labels,tokenizer,max_len):
self.texts=texts
self.labels=labels
self.tokenizer=tokenizer
self.max_len=max_len
def __len__(self):
return len(self.texts)

def __getitem__(self,item):
"""
item 为数据索引,迭代取第item条数据
"""
text=str(self.texts[item])
label=self.labels[item]

encoding=self.tokenizer.encode_plus(
text,
add_special_tokens=True,
max_length=self.max_len,
return_token_type_ids=True,
pad_to_max_length=True,
return_attention_mask=True,
return_tensors='pt', #转为tensor
)

#print(encoding['input_ids'])
return {
'texts':text,
'input_ids':encoding['input_ids'].flatten(),
'attention_mask':encoding['attention_mask'].flatten(),
# toeken_type_ids:0
'labels':torch.tensor(label,dtype=torch.long)
}