当前位置:   article > 正文

bert pytorch 序列标注_手把手教你用Pytorch-Transformers——部分源码解读及相关说明(一)...

pytorch bertweet bert.pooler

简介

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的作用是,输出的时

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/312379
推荐阅读
相关标签
  

闽ICP备14008679号