赞
踩
简介
Transformers是一个用于自然语言处理(NLP)的Python第三方库,实现Bert、GPT-2和XLNET等比较新的模型,支持TensorFlow和PyTorch。本文介对这个库进行部分代码解读,目前文章只针对Bert,其他模型看心情。
手把手教你用PyTorch-Transformers是我记录和分享自己使用 Transformers 的经验和想法,因为个人时间原因不能面面俱到,有时间再填
本文是《手把手教你用Pytorch-Transformers》的第一篇,主要对一些源码进行讲解
目前只对 Bert 相关的代码和原理进行说明,GPT2 和 XLNET 应该是没空写了
Model相关
BertConfig
BertConfig 是一个配置类,存放了 BertModel 的配置。比如:
vocab_size_or_config_json_file:字典大小,默认30522
hidden_size:Encoder 和 Pooler 层的大小,默认768
num_hidden_layers:Encoder 的隐藏层数,默认12
num_attention_heads:每个 Encoder 中 attention 层的 head 数,默认12
BertModel
实现了基本的Bert模型,从构造函数可以看到用到了embeddings,encoder和pooler。
下面是允许输入到模型中的参数,模型至少需要有1个输入: input_ids 或 input_embeds。
input_ids 就是一连串 token 在字典中的对应id。形状为 (batch_size, sequence_length)。
token_type_ids 可选。就是 token 对应的句子id,值为0或1(0表示对应的token属于第一句,1表示属于第二句)。形状为(batch_size, sequence_length)。
Bert 的输入需要用 [CLS] 和 [SEP] 进行标记,开头用 [CLS],句子结尾用 [SEP]
两个句子:
tokens:[CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP]
token_type_ids:0 0 0 0 0 0 0 0 1 1 1 1 1 1
一个句子:
tokens:[CLS] the dog is hairy . [SEP]
token_type_ids:0 0 0 0 0 0 0
attention_mask 可选。各元素的值为 0 或 1 ,避免在 padding 的 token 上计算 attention(1不进行masked,0则masked)。形状为(batch_size, sequence_length)。
position_ids 可选。表示 token 在句子中的位置id。形状为(batch_size, sequence_length)。形状为(batch_size, sequence_length)。
head_mask 可选。各元素的值为 0 或 1 ,1 表示 head 有效,0无效。形状为(num_heads,)或(num_layers, num_heads)。
input_embeds 可选。替代 input_ids,我们可以直接输入 Embedding 后的 Tensor。形状为(batch_size, sequence_length, embedding_dim)。
encoder_hidden_states 可选。encoder 最后一层输出的隐藏状态序列,模型配置为 decoder 时使用。形状为(batch_size, sequence_length, hidden_size)。
encoder_attention_mask 可选。避免在 padding 的 token 上计算 attention,模型配置为 decoder 时使用。形状为(batch_size, sequence_length)。
encoder_hidden_states 和 encoder_attention_mask 可以结合论文中的Figure 1理解,左边为 encoder,右边为 decoder。
如果要作为 decoder ,模型需要通过 BertConfig 设置 is_decoder 为 True
def __init__(self, config):
super(BertModel, self).__init__(config)
self.config=config
self.embeddings=BertEmbeddings(config)
self.encoder=BertEncoder(config)
self.pooler=BertPooler(config)
self.init_weights()def forward(self, input_ids=None, attention_mask=None, token_type_ids=None, position_ids=None,
head_mask=None, inputs_embeds=None, encoder_hidden_states=None, encoder_attention_mask=None):
...
BertPooler
在Bert中,pool的作用是,输出的时
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。