fastNLP.embeddings.transformers_embedding module

将transformers包中的模型封装成fastNLP中的embedding对象

class fastNLP.embeddings.transformers_embedding.TransformersEmbedding(vocab, model, tokenizer, layers='-1', pool_method: str = 'first', word_dropout=0, dropout=0, requires_grad=True, include_cls_sep: bool = False, auto_truncate=True, **kwargs)[源代码]

基类:fastNLP.embeddings.contextual_embedding.ContextualEmbedding

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.TransformersEmbedding fastNLP.embeddings.transformers_embedding.TransformersEmbedding

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

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import TransformersEmbedding
>>> from transformers import ElectraModel, ElectraTokenizer
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> model = ElectraModel.from_pretrained("google/electra-small-generator")
>>> tokenizer = ElectraTokenizer.from_pretrained("google/electra-small-generator")
>>> embed = TransformersEmbedding(vocab, model_dir_or_name='en', 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, model, tokenizer, layers='-1', pool_method: str = 'first', word_dropout=0, dropout=0, requires_grad=True, include_cls_sep: bool = False, auto_truncate=True, **kwargs)[源代码]
参数
  • vocab (Vocabulary) – 词表

  • tokenizer – transformers包中的PreTrainedTokenizer对象

  • layers (str,list) – 输出embedding表示来自于哪些层,不同层的结果按照layers中的顺序在最后一维concat起来。以’,’隔开层数,层的序号是 从0开始,可以以负数去索引倒数几层。layer=0为embedding层(包括wordpiece embedding, position 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) – 返回的<s>是否使用预训练中的BertPool映射一下,仅在include_cls_sep时有效。如果下游任务只取<s>做预测, 一般该值为True。

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

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

  • kwargs

    int min_freq: 小于该次数的词会被unk代替, 默认为1 dict tokenizer_kwargs: 传递给tokenizer在调用tokenize()方法时所额外使用的参数,例如RoBERTaTokenizer需要传入

    {‘add_prefix_space’:True}

Model model

transformers包中的PreTrainedModel对象

forward(words)[源代码]

计算words的roberta embedding表示。计算之前会在每句话的开始增加<s>在结束增加</s>, 并根据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)[源代码]

保存tokenizer和model到folder文件夹。model保存在`folder/{model_name}`, tokenizer在`folder/{tokenizer_name}`下 :param str folder: 保存地址 :return:

training: bool
class fastNLP.embeddings.transformers_embedding.TransformersWordPieceEncoder(model, tokenizer, layers: str = '-1', word_dropout=0, dropout=0, requires_grad: bool = True, **kwargs)[源代码]

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

别名 fastNLP.embeddings.TransformersWordPieceEncoder fastNLP.embeddings.transformers_embedding.TransformersWordPieceEncoder

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

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

en: roberta-base en-large: roberta-large

__init__(model, tokenizer, layers: str = '-1', word_dropout=0, dropout=0, requires_grad: bool = True, **kwargs)[源代码]
参数
  • model – transformers的model

  • tokenizer – transformer的tokenizer

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

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

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

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

index_datasets(*datasets, field_name, **kwargs)[源代码]

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

参数
  • datasets (DataSet) – DataSet对象

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

  • kwargs – 传递给tokenizer的参数

返回

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

返回

training: bool