fastNLP.embeddings.roberta_embedding module

class fastNLP.embeddings.roberta_embedding.RobertaEmbedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', 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.RobertaEmbedding fastNLP.embeddings.roberta_embedding.RobertaEmbedding

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

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

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

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import RobertaEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = RobertaEmbedding(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: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', 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) – 模型所在目录或者模型的名称。当传入模型所在目录时,目录中应该包含一个词表文件 (以vocab.json作为后缀名), 权重文件(以.bin作为文件后缀名), 配置文件(以config.json作为后缀名)。

  • 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

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)[源代码]

将roberta embedding保存到folder,保存之后包含三个文件vocab.txt, roberta_embed_hyper.txt, roberta_embed/,

参数

folder (str) – 保存地址

返回

classmethod load(folder)[源代码]

从folder中读取数据初始化RobertaEmbedding

参数

folder

返回

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

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

别名 fastNLP.embeddings.RobertaWordPieceEncoder fastNLP.embeddings.roberta_embedding.RobertaWordPieceEncoder

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

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

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

__init__(model_dir_or_name: str = 'en', 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)

  • pooled_cls (bool) – 返回的句子开头的<s>是否使用预训练中的BertPool映射一下。如果下游任务取<s>做预测,一般该值为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, add_prefix_space=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) – 如果首尾不是<s>与</s>会在首尾额外加入<s>与</s>。

  • add_prefix_spance (bool) – 是否在句首添加额外的空格,RoBERTa预训练时该值为True

返回

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

计算words的bert embedding表示。传入的words中应该自行包含<s>与</s>>的tag。

参数
  • words – batch_size x max_len

  • token_type_ids – batch_size x 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

返回

training: bool