fastNLP.embeddings.gpt2_embedding module

class fastNLP.embeddings.gpt2_embedding.GPT2Embedding(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '-1', pool_method: str = 'first', dropout=0, requires_grad: bool = True, auto_truncate: bool = False, language_model: bool = False, **kwargs)[源代码]

基类:fastNLP.embeddings.contextual_embedding.ContextualEmbedding

基类 fastNLP.embeddings.ContextualEmbedding

别名 fastNLP.embeddings.GPT2Embedding fastNLP.embeddings.gpt2_embedding.GPT2Embedding

使用GPT2对words进行编码的Embedding。

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

en: gpt2 en-medium: gpt2-medium

Example:

>>> import torch
>>> from fastNLP import Vocabulary
>>> from fastNLP.embeddings import BertEmbedding
>>> vocab = Vocabulary().add_word_lst("The whether is good .".split())
>>> embed = GPT2Embedding(vocab, model_dir_or_name='en-small', 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, 3096])
__init__(vocab: fastNLP.core.vocabulary.Vocabulary, model_dir_or_name: str = 'en', layers: str = '-1', pool_method: str = 'first', dropout=0, requires_grad: bool = True, auto_truncate: bool = False, language_model: bool = False, **kwargs)[源代码]
参数
  • vocab (Vocabulary) – 词表

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

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

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

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

  • 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。

  • language_model (bool) – 是否计算gpt2的lm loss,可以通过get_loss()获取,输入一个batch之后的get_loss调用即为batch的language model的loss

  • **kwargs

    bool only_use_pretrain_bpe: 仅使用出现在pretrain词表中的bpe,如果该词没法tokenize则使用unk。如果embedding不需要更新

    建议设置为True。

    int min_freq: 仅在only_use_pretrain_bpe为False有效,大于等于该次数的词会被新加入GPT2的BPE词表中 bool truncate_embed: 是否仅保留用到的bpe(这样会减内存占用和加快速度)

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 (torch.LongTensor) – batch_size x max_len

返回

get_lm_loss(release=True)[源代码]

当language_model=True时,可以通过该接口获取当前batch的language model loss的大小

参数

release (bool) – 如果为True,获取了lm_loss后在下一次forward完成之前都无法获取lm_loss了

返回

torch.FloatTensor([])

training: bool
class fastNLP.embeddings.gpt2_embedding.GPT2WordPieceEncoder(model_dir_or_name: str = 'en', layers: str = '-1', word_dropout=0, dropout=0, requires_grad: bool = True, language_model: bool = False)[源代码]

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

别名 fastNLP.embeddings.GPT2WordPieceEncoder fastNLP.embeddings.gpt2_embedding.GPT2WordPieceEncoder

GPT2模型,使用时先使用本模型对应的Tokenizer对数据进行tokenize GPT2WordPieceEncoder可以支持自动下载权重,当前支持的模型:

en: gpt2 en-medium: gpt2-medium

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

  • layers (str,list) – 最终结果中的表示。以’,’隔开层数,可以以负数去索引倒数几层

  • word_dropout (float) – 多大概率将word piece置为<|endoftext|>

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

  • language_model (bool) – 是否使用language model

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

index_datasets(*datasets, field_name, add_endoftext=False, add_prefix_space=True)[源代码]

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

参数
  • datasets (DataSet) – DataSet对象

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

  • add_endoftext (bool) – 在句子开头加入<|endofline|>。

  • add_prefix_space (bool) – 是否在句首增加空格

返回

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

计算words的bert embedding表示。传入的words中应该在开头包含<|endofline|>。

参数
  • word_pieces – batch_size x max_len

  • token_type_ids – batch_size x max_len,

返回

torch.FloatTensor.

drop_word(words)[源代码]
参数

words (torch.LongTensor) – batch_size x max_len

返回

generate_from_str(text='', max_len=40, do_sample=True, num_beams=1, temperature=1, top_k=50, top_p=1.0, repetition_penalty=1.0, length_penalty=1.0)[源代码]
参数
  • text (str) – 故事的开头

  • max_len (int) – 生成多长的句子

  • do_sample (bool) – 是否使用采样的方式生成,如果使用采样,相同的参数可能出现不同的句子。

  • num_beams (int) – 使用多大的beam size

  • temperature (float) – 用以调节采样分布的

  • top_k (int) – 只保留此表中top_k个词进行生成。范围1-infinity

  • top_p (float) – 保留概率累积为top_p的词汇,范围0-1.

  • repetition_penalty (float) – 对重复token的惩罚

  • length_penalty (float) – 惩罚过长的句子

返回

list[str]

generate(word_pieces=None, max_len=40, do_sample=True, num_beams=1, temperature=1, top_k=50, top_p=1.0, repetition_penalty=1.0, length_penalty=1.0)[源代码]
参数
  • word_pieces (torch.LongTensor,None) – 如果传入tensor,shape应该为batch_size x start_len; 如果传入None,会随机生成。

  • max_len (int) – 生成多长的句子

  • do_sample (bool) – 是否使用采样的方式生成,如果使用采样,相同的参数可能出现不同的句子。

  • num_beams (int) – 使用多大的beam size

  • temperature (float) – 用以调节采样分布的

  • top_k (int) – 只保留此表中top_k个词进行生成。范围1-infinity

  • top_p (float) – 保留概率累积为top_p的词汇,范围0-1.

  • repetition_penalty (float) – 对重复token的惩罚

  • length_penalty (float) – 惩罚过长的句子

返回

get_lm_loss(release=True)[源代码]

当language_model=True时,可以通过该接口获取当前batch的language model loss的大小

参数

release (bool) – 如果为True,获取了lm_loss后在下一次forward完成之前都无法获取lm_loss了

返回

torch.FloatTensor([])

training: bool