fastNLP.embeddings.bert_embedding module

class fastNLP.embeddings.bert_embedding.BertEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]

基类:fastNLP.embeddings.contextual_embedding.ContextualEmbedding

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.BertEmbedding fastNLP.embeddings.bert_embedding.BertEmbedding

使用BERT对words进行编码的Embedding。建议将输入的words长度限制在430以内,而不要使用512(根据预训练模型参数,可能有变化)。这是由于 预训练的bert模型长度限制为512个token,而因为输入的word是未进行word piece分割的(word piece的分割有BertEmbedding在输入word 时切分),在分割之后长度可能会超过最大长度限制。

BertEmbedding可以支持自动下载权重,当前支持的模型:

en: base-cased en-base-uncased: en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import BertEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = BertEmbedding(vocab, model_dir_or_name='en-base-uncased', requires_grad=False, layers='4,-2,-1')
>>> words = torch.LongTensor([[vocab.to_index(word) for word in "The whether is good .".split()]])
>>> outputs = embed(words)
>>> outputs.size()
>>> # torch.Size([1, 5, 2304])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pool_method: str = 'first', word_dropout=0, dropout=0, include_cls_sep: bool = False, pooled_cls=True, requires_grad: bool = True, auto_truncate: bool = False, **kwargs)[源代码]
参数
  • vocab (Vocabulary) – 词表

  • model_dir_or_name (str) – 模型所在目录或者模型的名称。当传入模型所在目录时,目录中应该包含一个词表文件(以.txt作为后缀名), 权重文件(以.bin作为文件后缀名), 配置文件(以.json作为后缀名)。

  • layers (str) – 输出embedding表示来自于哪些层,不同层的结果按照layers中的顺序在最后一维concat起来。以’,’隔开层数,层的序号是 从0开始,可以以负数去索引倒数几层。 layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)

  • pool_method (str) – 因为在bert中,每个word会被表示为多个word pieces, 当获取一个word的表示的时候,怎样从它的word pieces 中计算得到它对应的表示。支持 last , first , avg , max

  • word_dropout (float) – 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。

  • dropout (float) – 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。

  • include_cls_sep (bool) – bool,在bert计算句子的表示的时候,需要在前面加上[CLS]和[SEP], 是否在结果中保留这两个内容。 这样 会使得word embedding的结果比输入的结果长两个token。如果该值为True,则在使用 :class::StackEmbedding 可能会与其它类型的 embedding长度不匹配。

  • pooled_cls (bool) – 返回的[CLS]是否使用预训练中的BertPool映射一下,仅在include_cls_sep时有效。如果下游任务只取[CLS]做预测, 一般该值为True。

  • requires_grad (bool) – 是否需要gradient以更新Bert的权重。

  • auto_truncate (bool) – 当句子words拆分为word pieces长度超过bert最大允许长度(一般为512), 自动截掉拆分后的超过510个 word pieces后的内容,并将第512个word piece置为[SEP]。超过长度的部分的encode结果直接全部置零。一般仅有只使用[CLS] 来进行分类的任务将auto_truncate置为True。

  • kwargs – int min_freq: 小于该次数的词会被unk代替, 默认为1

forward(words)[源代码]
计算words的bert embedding表示。计算之前会在每句话的开始增加[CLS]在结束增加[SEP], 并根据include_cls_sep判断要不要

删除这两个token的表示。

参数

words (torch.LongTensor) – [batch_size, max_len]

返回

torch.FloatTensor. batch_size x max_len x (768*len(self.layers))

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数

words (torch.LongTensor) – batch_size x max_len

返回

save(folder)[源代码]
将embedding保存到folder这个目录下,将会保存三个文件vocab.txt, bert_embed_hyper.txt, bert_embed/, 其中bert_embed下包含

config.json,pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)

参数

folder (str) –

返回

classmethod load(folder)[源代码]

给定一个folder, 需要包含以下三个内容vocab.txt, bert_embed_hyper.txt, bert_embed/

参数

folder (str) –

返回

training: bool
class fastNLP.embeddings.bert_embedding.BertWordPieceEncoder(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True, **kwargs)[源代码]

基类:torch.nn.modules.module.Module

别名 fastNLP.embeddings.BertWordPieceEncoder fastNLP.embeddings.bert_embedding.BertWordPieceEncoder

读取bert模型,读取之后调用index_dataset方法在dataset中生成word_pieces这一列。

BertWordPieceEncoder可以支持自动下载权重,当前支持的模型:

en: base-cased en-large-cased-wwm: en-large-cased: en-large-uncased: en-large-uncased-wwm cn: 中文BERT wwm by HIT cn-base: 中文BERT base-chinese cn-wwm-ext: 中文BERT wwm by HIT with extra data pretrain. multi-base-cased: multilingual cased multi-base-uncased: multilingual uncased

__init__(model_dir_or_name: str = 'en-base-uncased', layers: str = '-1', pooled_cls: bool = False, word_dropout=0, dropout=0, requires_grad: bool = True, **kwargs)[源代码]
参数
  • model_dir_or_name (str) – 模型所在目录或者模型的名称。默认值为 en-base-uncased

  • layers (str) – 最终结果中的表示。以’,’隔开层数,可以以负数去索引倒数几层。layer=0为embedding层(包括wordpiece embedding, position embedding和segment embedding)

  • pooled_cls (bool) – 返回的句子开头的[CLS]是否使用预训练中的BertPool映射一下。如果下游任务取[CLS]做预测,一般该值为True。

  • word_dropout (float) – 以多大的概率将一个词替换为unk。这样既可以训练unk也是一定的regularize。

  • dropout (float) – 以多大的概率对embedding的表示进行Dropout。0.1即随机将10%的值置为0。

  • requires_grad (bool) – 是否需要gradient。

index_datasets(*datasets, field_name, add_cls_sep=True)[源代码]

使用bert的tokenizer新生成word_pieces列加入到datasets中,并将他们设置为input,且将word_pieces这一列的pad value设置为了 bert的pad value。

参数
  • datasets (DataSet) – DataSet对象

  • field_name (str) – 基于哪一列的内容生成word_pieces列。这一列中每个数据应该是List[str]的形式。

  • add_cls_sep (bool) – 如果首尾不是[CLS]与[SEP]会在首尾额外加入[CLS]与[SEP]。

返回

forward(word_pieces, token_type_ids=None)[源代码]

计算words的bert embedding表示。传入的words中应该自行包含[CLS]与[SEP]的tag。

参数
  • words – batch_size x max_len

  • token_type_ids – batch_size x max_len, 用于区分前一句和后一句话. 如果不传入,则自动生成(大部分情况,都不需要输入), 第一个[SEP]及之前为0, 第二个[SEP]及到第一个[SEP]之间为1; 第三个[SEP]及到第二个[SEP]之间为0,依次往后推。

返回

torch.FloatTensor. batch_size x max_len x (768*len(self.layers))

drop_word(words)[源代码]

按照设定随机将words设置为unknown_index。

参数

words (torch.LongTensor) – batch_size x max_len

返回

save(folder)[源代码]
会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件config.json,

pytorch_model.bin,vocab.txt三个文件(该folder下的数据也可以直接被BERTModel读取)

参数

folder (str) –

返回

classmethod load(folder)[源代码]

会在folder下创建两个文件bert_encoder_hyper.json与bert_encoder/, bert_encoder下包含三个文件

参数

folder

返回

training: bool