Transformers 文档
GPTSAN-japanese
并获得增强的文档体验
开始使用
GPTSAN-japanese
该模型目前仅处于维护模式,我们不接受任何更改其代码的新拉取请求(PR)。如果您在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.40.2。您可以通过运行以下命令来完成:pip install -U transformers==4.40.2
。
概述
GPTSAN-japanese 模型由 Toshiyuki Sakamoto (tanreinama) 在其仓库中发布。
GPTSAN 是一个使用 Switch Transformer 的日语语言模型。它的结构与 T5 论文中介绍的 Prefix LM 模型相同,支持文本生成和掩码语言建模任务。这些基础任务同样可以进行微调,以用于翻译或摘要等任务。
用法示例
可以使用 generate()
方法来使用 GPTSAN-Japanese 模型生成文本。
>>> from transformers import AutoModel, AutoTokenizer
>>> import torch
>>> tokenizer = AutoTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> model = AutoModel.from_pretrained("Tanrei/GPTSAN-japanese").cuda()
>>> x_tok = tokenizer("は、", prefix_text="織田信長", return_tensors="pt")
>>> torch.manual_seed(0)
>>> gen_tok = model.generate(x_tok.input_ids.cuda(), token_type_ids=x_tok.token_type_ids.cuda(), max_new_tokens=20)
>>> tokenizer.decode(gen_tok[0])
'織田信長は、2004年に『戦国BASARA』のために、豊臣秀吉'
GPTSAN 特性
GPTSAN 有一些独特的特性。它具有 Prefix-LM 的模型结构。对于前缀输入词元(Prefix Input tokens),它像一个经过移位的掩码语言模型(Masked Language Model)。无前缀的输入行为则与普通生成模型相似。Spout 向量是 GPTSAN 特有的输入。Spout 向量经过随机输入的预训练,但您可以在微调期间指定一类文本或任意向量。这使您能够指示生成文本的倾向。GPTSAN 具有基于 Switch-Transformer 的稀疏前馈网络(Feed Forward)。您还可以添加其他层并对其进行部分训练。详情请参见原始 GPTSAN 仓库。
Prefix-LM 模型
GPTSAN 的结构与 T5
论文中名为 Prefix-LM 的模型相同。(原始 GPTSAN 仓库称之为 hybrid
)在 GPTSAN 中,Prefix-LM 的 Prefix
部分,即可以被前后两个词元同时引用的输入位置,可以指定为任意长度。对于每个批次,也可以指定不同的任意长度。此长度适用于分词器中输入到 prefix_text
的文本。分词器将 Prefix-LM 的 Prefix
部分的掩码作为 token_type_ids
返回。模型将 token_type_ids
为 1 的部分视为 Prefix
部分,即输入可以同时引用前后的词元。
使用技巧
指定 Prefix 部分是通过传递给自注意力机制的掩码来完成的。当 token_type_ids=None 或全为零时,它等同于常规的因果掩码。
例如
x_token = tokenizer(“アイウエ”) input_ids: | SOT | SEG | ア | イ | ウ | エ | token_type_ids: | 1 | 0 | 0 | 0 | 0 | 0 | prefix_lm_mask: SOT | 1 0 0 0 0 0 | SEG | 1 1 0 0 0 0 | ア | 1 1 1 0 0 0 | イ | 1 1 1 1 0 0 | ウ | 1 1 1 1 1 0 | エ | 1 1 1 1 1 1 |
x_token = tokenizer("", prefix_text=“アイウエ”) input_ids: | SOT | ア | イ | ウ | エ | SEG | token_type_ids: | 1 | 1 | 1 | 1 | 1 | 0 | prefix_lm_mask: SOT | 1 1 1 1 1 0 | ア | 1 1 1 1 1 0 | イ | 1 1 1 1 1 0 | ウ | 1 1 1 1 1 0 | エ | 1 1 1 1 1 0 | SEG | 1 1 1 1 1 1 |
x_token = tokenizer(“ウエ”, prefix_text=“アイ”) input_ids: | SOT | ア | イ | SEG | ウ | エ | token_type_ids: | 1 | 1 | 1 | 0 | 0 | 0 | prefix_lm_mask: SOT | 1 1 1 0 0 0 | ア | 1 1 1 0 0 0 | イ | 1 1 1 0 0 0 | SEG | 1 1 1 1 0 0 | ウ | 1 1 1 1 1 0 | エ | 1 1 1 1 1 1 |
Spout 向量
Spout 向量是一种用于控制文本生成的特殊向量。该向量在自注意力机制中被视为第一个嵌入,为生成的词元带来额外的注意力。在 Tanrei/GPTSAN-japanese
发布的预训练模型中,Spout 向量是一个 128 维的向量,它在模型中通过 8 个全连接层,并被投影到作为外部注意力的空间中。由全连接层投影的 Spout 向量被分割后传递给所有的自注意力模块。
GPTSanJapaneseConfig
class transformers.GPTSanJapaneseConfig
< 来源 >( vocab_size = 36000 max_position_embeddings = 1280 d_model = 1024 d_ff = 8192 d_ext = 4096 d_spout = 128 num_switch_layers = 10 num_ext_layers = 0 num_heads = 16 num_experts = 16 expert_capacity = 128 dropout_rate = 0.0 layer_norm_epsilon = 1e-05 router_bias = False router_jitter_noise = 0.0 router_dtype = 'float32' router_ignore_padding_tokens = False output_hidden_states = False output_attentions = False initializer_factor = 0.002 output_router_logits = False use_cache = True separator_token_id = 35998 pad_token_id = 35995 eos_token_id = 35999 **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 36000) — GPTSANJapanese 模型的词汇表大小。定义了在调用 GPTSanJapaneseModel 时,可以通过inputs_ids
表示的不同词元的数量。 - max_position_embeddings (
int
, 可选, 默认为 1280) — 该模型可能使用的最大序列长度。默认设置为 1280。 - d_model (
int
, 可选, 默认为 1024) — 编码器层和池化层的大小。 - d_ff (
int
, 可选, 默认为 8192) — 每个SwitchTransformersBlock
中间前馈层的大小。 - d_ext (
int
, 可选, 默认为 4096) — 每个额外层中中间前馈层的大小。 - d_spout (
int
, 可选, 默认为 128) —spout
向量的大小。 - num_switch_layers (
int
, 可选, 默认为 10) — Switch Transformer 层中的层数。 - num_ext_layers (
int
, 可选, 默认为 0) — 额外层中的层数。 - num_heads (
int
, 可选, 默认为 16) — Transformer 编码器中每个注意力层的注意力头数。 - num_experts (
int
, 可选, 默认为 16) — 每个 SwitchTransformer 层的专家数量。 - expert_capacity (
int
, 可选, 默认为 128) — 每个专家可以存储的词元数量。如果设置为 1,模型的行为将类似于常规 Transformer。 - dropout_rate (
float
, 可选, 默认为 0.0) — 所有 dropout 层的比率。 - layer_norm_eps (
float
, 可选, 默认为 1e-5) — 层归一化层使用的 epsilon 值。 - router_bias (
bool
, 可选, 默认为False
) — 是否为路由器添加偏置。 - router_jitter_noise (
float
, 可选, 默认为 0.0) — 添加到路由器的噪声量。在预测期间将其设置为 0.0,或在训练期间设置一个较小的值(通常为 1e-2)。 - router_dtype (
str
, 可选, 默认为"float32"
) — 用于路由器的dtype
。最好将dtype
保持为"float32"
,正如 论文 中关于 选择性精度 的讨论中所述。 - router_ignore_padding_tokens (
bool
, 可选, 默认为False
) — 在路由时是否忽略填充词元(padding token)。 - output_hidden_states (
bool
, 可选, 默认为False
) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 `hidden_states`。 - output_attentions (
bool
, 可选, 默认为False
) — 是否返回所有注意力层的注意力张量。 - initializer_factor (
float
, 可选, 默认为 0.002) — 用于初始化所有权重矩阵的因子。 - output_router_logits (
bool
, 可选, 默认为False
) — 是否返回所有专家的路由器 logits。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后一个键/值注意力(并非所有模型都使用)。
这是一个用于存储 GPTSanJapaneseModel 配置的配置类。它用于根据指定的参数实例化一个 GPTSANJapanese 模型,定义模型架构。使用默认值实例化配置将产生与 GPTSANJapanese Tanrei/GPTSAN-japanese 架构相似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。请阅读 PretrainedConfig 的文档以获取更多信息。
GPTSanJapaneseTokenizer
class transformers.GPTSanJapaneseTokenizer
< 来源 >( vocab_file emoji_file unk_token = '<|nottoken|>' pad_token = '<|separator|>' bos_token = '<|startoftext|>' eos_token = '<|endoftext|>' sep_token = '<|segmenter|>' do_clean_text = False **kwargs )
参数
- vocab_file (
str
) — 包含词汇表的文件。 - emoji_file (
str
) — 包含表情符号的文件。 - unk_token (
str
, 可选, 默认为"<|nottoken|>"
) — 用于未知字符的词元。 - pad_token (
str
, 可选, 默认为"<|separator|>"
) — 用于填充的词元。 - bos_token (
str
, 可选, 默认为"<|startoftext|>"
) — 序列开始词元。 - eos_token (
str
, 可选, 默认为"<|endoftext|>"
) — 序列结束词元。 - sep_token (
str
, 可选, 默认为"<|segmenter|>"
) — 一个特殊词元,用于将词元分为前缀部分和通用输入部分。 - do_clean_text (
bool
, 可选, 默认为False
) — 是否对文本中的 URL、EMAIL、TEL、日语日期和日语价格进行清理。
此分词器基于 GPTNeoXJapaneseTokenizer,并进行了以下修改:
- 正确解码 byte0~byte255 词元
- 增加了词袋(bagofword)词元处理
- 为 Prefix-LM 模型返回 token_type_ids 词袋词元表示前一个词元的重复,在解码时会转换为 3 个连续的词元。此外,原始的日语特殊子词编码已在此仓库中发布(https://github.com/tanreinama/Japanese-BPEEncoder_V2)。token_type_ids 是一个掩码,指示 Prefix-LM 模型的前缀输入位置。要指定前缀位置,请为 prefix_text 指定一个前缀输入,或者将前缀部分和其后部分的句子指定为批处理输入的文本对。
示例
>>> from transformers import GPTSanJapaneseTokenizer
>>> tokenizer = GPTSanJapaneseTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> # You can confirm both 慶応 and 慶應 are encoded to 17750
>>> tokenizer("吾輩は猫である🐯。実は慶応(慶應)大学出身")["input_ids"]
[35993, 35998, 34347, 31459, 30647, 31448, 25, 30659, 35729, 35676, 32417, 30647, 17750, 35589, 17750, 35590, 321, 1281]
>>> # Both 慶応 and 慶應 are decoded to 慶応
>>> tokenizer.decode(tokenizer("吾輩は猫である🐯。実は慶応(慶應)大学出身")["input_ids"])
'吾輩は猫である🐯。実は慶応(慶応)大学出身'
Prefix-LM 示例
>>> from transformers import GPTSanJapaneseTokenizer
>>> tokenizer = GPTSanJapaneseTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> tokenizer("実は慶応(慶應)大学出身", prefix_text="吾輩は猫である🐯。")["input_ids"]
[35993, 34347, 31459, 30647, 31448, 25, 30659, 35729, 35676, 35998, 32417, 30647, 17750, 35589, 17750, 35590, 321, 1281]
>>> # Mask for Prefix-LM inputs
>>> tokenizer("実は慶応(慶應)大学出身", prefix_text="吾輩は猫である🐯。")["token_type_ids"]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
批量编码示例
>>> from transformers import GPTSanJapaneseTokenizer
>>> tokenizer = GPTSanJapaneseTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> tokenizer([["武田信玄", "は、"], ["織田信長", "の配下の、"]], padding=True)["input_ids"]
[[35993, 35998, 8640, 25948, 35993, 35998, 30647, 35675, 35999, 35999], [35993, 35998, 10382, 9868, 35993, 35998, 30646, 9459, 30646, 35675]]
>>> # Mask for Prefix-LM inputs
>>> tokenizer([["武田信玄", "は、"], ["織田信長", "の配下の、"]], padding=True)["token_type_ids"]
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>>> # Mask for padding
>>> tokenizer([["武田信玄", "は、"], ["織田信長", "の配下の、"]], padding=True)["attention_mask"]
[[1, 1, 1, 1, 1, 1, 1, 1, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
将标记序列(字符串)转换为单个字符串。
create_token_type_ids_from_sequences
< 来源 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None )
分词器返回 token_type_ids 作为前缀部分和其余部分之间的分隔符。前缀部分的 token_type_ids 为 1,其余词元的 token_type_ids 为 0。
示例
>>> from transformers import GPTSanJapaneseTokenizer
>>> tokenizer = GPTSanJapaneseTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> x_token = tokenizer("アイウエ")
>>> # input_ids: | SOT | SEG | ア | イ | ウ | エ |
>>> # token_type_ids: | 1 | 0 | 0 | 0 | 0 | 0 |
>>> x_token = tokenizer("", prefix_text="アイウエ")
>>> # input_ids: | SOT | ア | イ | ウ | エ | SEG |
>>> # token_type_ids: | 1 | 1 | 1 | 1 | 1 | 0 |
>>> x_token = tokenizer("ウエ", prefix_text="アイ")
>>> # input_ids: | SOT | ア | イ | SEG | ウ | エ |
>>> # token_type_ids: | 1 | 1 | 1 | 0 | 0 | 0 |
GPTSanJapaneseModel
class transformers.GPTSanJapaneseModel
< 来源 >( config: GPTSanJapaneseConfig )
参数
- config (GPTSanJapaneseConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化不会加载与模型相关的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。
原始的 GPTSAN-japanese 模型 Transformer,输出原始隐藏状态,顶部没有任何特定的头。
GPTSAN-japanese 模型在《通用 Swich Transformer 基础上的日语语言模型》中被提出。
此模型也是 PyTorch torch.nn.Module 的子类。可以像常规 PyTorch 模块一样使用它,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。
forward
< 来源 >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.FloatTensor] = None token_type_ids: typing.Optional[torch.FloatTensor] = None spout: typing.Optional[torch.FloatTensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None head_mask: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = False inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_inputs_embeds: typing.Optional[torch.FloatTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None output_router_logits: typing.Optional[bool] = None num_precontext: typing.Optional[torch.LongTensor] = None )
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列词元的索引。GPTSAN-japanese 是一个生成句子续写或预测掩码位置词元的模型。模型所需的特殊词元会自动附加。 - attention_mask (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) — 用于避免对填充词元索引执行注意力的掩码。掩码值在 `[0, 1]` 中选择:- 1 表示词元未被掩码,
- 0 表示词元被掩码。
- token_type_ids (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) — 用于掩盖 Prefix-LM 输入中前缀部分的输入。掩码值在 `[0, 1]` 中选择:- 1 表示词元是前缀输入,
- 0 表示词元是非前缀输入。
- spout (
torch.Tensor
,形状为(batch_size, config.d_spout)
) — 该向量通过一个 8 层 FFN 进行转换,可以用来替代past_key_values
。 - past_key_values (
tuple(tuple(torch.FloatTensor))
,长度为config.n_layers
,每个元组包含 4 个形状为(batch_size, num_heads, sequence_length - 1, embed_size_per_head)
的张量) — 包含预先计算的注意力块的键和值隐藏状态。可用于加速解码。如果使用
past_key_values
,用户可以选择只输入最后一个decoder_input_ids
(那些没有为其提供过去键值状态的 `decoder_input_ids`),形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的 `decoder_input_ids`。 - head_mask (
torch.FloatTensor
,形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于使自注意力模块的选定头无效的掩码。掩码值在 `[0, 1]` 中选择: - use_cache (
bool
, 可选) — 如果设置为True
,则返回 `past_key_values` 键值状态,可用于加速解码(参见 `past_key_values`)。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递 `input_ids`。如果你想比模型内部的嵌入查找矩阵更能控制如何将 `input_ids` 索引转换为相关向量,这将非常有用。 - decoder_inputs_embeds (
torch.FloatTensor
,形状为(batch_size, target_sequence_length, hidden_size)
,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递 `decoder_input_ids`。如果使用 `past_key_values`,则可以选择只输入最后一个 `decoder_inputs_embeds`(参见 `past_key_values`)。如果你想比模型内部的嵌入查找矩阵更能控制如何将 `decoder_input_ids` 索引转换为相关向量,这将非常有用。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 `attentions`。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 `hidden_states`。 - return_dict (
bool
, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。 - router_logits (
tuple(torch.FloatTensor)
, 可选, 在传递 `output_router_logits=True` 或 `config.add_router_probs=True` 时返回) — `torch.FloatTensor` 的元组(每层一个),形状为 `(batch_size, sequence_length, num_experts)`。解码器模型的路由器 logits,可用于计算混合专家模型(MoE)的辅助损失。 - num_precontext (
torch.LongTensor
,形状为(batch_size,1)
) — 输入中 `hybrid` 输入词元的长度。此长度之前的词元同时参考前后文(如 BERT),之后的词元只参考前文(如 GPT)。另请参阅:https://github.com/tanreinama/GPTSAN/blob/main/report/model.md
GPTSanJapaneseModel 的 forward 方法,重写了 `__call__` 特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应调用 `Module` 实例而不是此函数,因为前者会处理运行前后处理步骤,而后者会静默地忽略它们。
GPTSanJapaneseForConditionalGeneration
class transformers.GPTSanJapaneseForConditionalGeneration
< 来源 >( config: GPTSanJapaneseConfig )
参数
- config (GPTSanJapaneseConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化不会加载与模型相关的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。
带语言建模头的原始 GPTSAN-japanese 模型。
GPTSAN-japanese 模型在《通用 Swich Transformer 基础上的日语语言模型》中被提出。
此模型也是 PyTorch torch.nn.Module 的子类。可以像常规 PyTorch 模块一样使用它,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。
forward
< 来源 >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.FloatTensor] = None token_type_ids: typing.Optional[torch.FloatTensor] = None spout: typing.Optional[torch.FloatTensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None head_mask: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = False inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_inputs_embeds: typing.Optional[torch.FloatTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None output_router_logits: typing.Optional[bool] = None labels: typing.Optional[torch.LongTensor] = None )
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列词元的索引。GPTSAN-japanese 是一个生成句子续写或预测掩码位置词元的模型。模型所需的特殊词元会自动附加。 - attention_mask (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) — 用于避免对填充词元索引执行注意力的掩码。掩码值在 `[0, 1]` 中选择:- 1 表示词元未被掩码,
- 0 表示词元被掩码。
- token_type_ids (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) — 用于在 Prefix-LM 输入中掩码前缀部分的输入。掩码值在[0, 1]
中选择:- 1 表示作为前缀输入的词元,
- 0 表示作为非前缀输入的词元。
- spout (
torch.Tensor
,形状为(batch_size, config.d_spout)
) — 该向量通过一个 8 层的 FFN 进行转换,可用于替代past_key_values
。 - past_key_values (
tuple(tuple(torch.FloatTensor))
,长度为config.n_layers
,每个元组包含 4 个形状为(batch_size, num_heads, sequence_length - 1, embed_size_per_head)
的张量) — 包含注意力模块预先计算好的键和值隐藏状态。可用于加速解码。如果使用了
past_key_values
,用户可以选择只输入最后一个decoder_input_ids
(即那些没有为其提供过去键值状态的词元),其形状为(batch_size, 1)
,而不是输入所有形状为(batch_size, sequence_length)
的decoder_input_ids
。 - head_mask (
torch.FloatTensor
,形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于使自注意力模块中选定的头无效的掩码。掩码值在[0, 1]
中选择: - use_cache (
bool
,可选) — 如果设置为True
,则返回past_key_values
的键值状态,并可用于加速解码(参见past_key_values
)。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,你可以直接传递嵌入表示,而不是传递input_ids
。如果你想比模型内部的嵌入查找矩阵更好地控制如何将input_ids
索引转换为关联向量,这会很有用。 - decoder_inputs_embeds (
torch.FloatTensor
,形状为(batch_size, target_sequence_length, hidden_size)
,可选) — 可选地,你可以直接传递嵌入表示,而不是传递decoder_input_ids
。如果使用了past_key_values
,可以选择只输入最后一个decoder_inputs_embeds
(参见past_key_values
)。如果你想比模型内部的嵌入查找矩阵更好地控制如何将decoder_input_ids
索引转换为关联向量,这会很有用。 - output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。 - router_logits (
tuple(torch.FloatTensor)
,可选,当传递output_router_logits=True
或config.add_router_probs=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(batch_size, sequence_length, num_experts)
。解码器模型的路由器 logits,可用于计算专家混合(Mixture of Experts)模型的辅助损失。 - labels (
torch.LongTensor
,形状为(batch_size,)
,可选) — 用于计算序列分类损失的标签。索引应在[-100, 0, ..., config.vocab_size - 1]
范围内。所有设置为-100
的标签都会被忽略(掩码),损失只对[0, ..., config.vocab_size]
范围内的标签计算。
GPTSanJapaneseForConditionalGeneration 的 forward 方法重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应调用 `Module` 实例而不是此函数,因为前者会处理运行前后处理步骤,而后者会静默地忽略它们。
示例
使用常规 LM 模型进行文本生成
>>> from transformers import AutoModel, AutoTokenizer, trainer_utils
>>> device = "cuda"
>>> model = AutoModel.from_pretrained("Tanrei/GPTSAN-japanese").to(device)
>>> tokenizer = AutoTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> x_token = tokenizer("織田信長は、", return_tensors="pt")
>>> trainer_utils.set_seed(30)
>>> input_ids = x_token.input_ids.to(device)
>>> gen_token = model.generate(input_ids, max_new_tokens=50)
>>> tokenizer.decode(gen_token[0])
"織田信長は、政治・軍事の中枢まで掌握した政治家であり、日本史上類を見ない驚異的な軍事侵攻を続け..."
使用 Prefix-LM 模型进行文本生成
>>> from transformers import AutoModel, AutoTokenizer, trainer_utils
>>> device = "cuda"
>>> model = AutoModel.from_pretrained("Tanrei/GPTSAN-japanese").to(device)
>>> tokenizer = AutoTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> x_token = tokenizer("", prefix_text="織田信長は、", return_tensors="pt")
>>> trainer_utils.set_seed(30)
>>> input_ids = x_token.input_ids.to(device)
>>> token_type_ids = x_token.token_type_ids.to(device)
>>> gen_token = model.generate(input_ids, token_type_ids=token_type_ids, max_new_tokens=50)
>>> tokenizer.decode(gen_token[0])
"織田信長は、政治・外交で数々の戦果を上げるが、1568年からは、いわゆる本能寺の変で細川晴元に暗殺される..."
同时进行文本生成和掩码语言模型
>>> from transformers import AutoModel, AutoTokenizer, trainer_utils
>>> device = "cuda"
>>> model = AutoModel.from_pretrained("Tanrei/GPTSAN-japanese").to(device)
>>> tokenizer = AutoTokenizer.from_pretrained("Tanrei/GPTSAN-japanese")
>>> masked_sentence = "武田信玄は、<|inputmask|>時代ファンならぜひ押さえ<|inputmask|>きたい名将の一人。"
>>> x_token = tokenizer("", prefix_text=masked_sentence, return_tensors="pt")
>>> trainer_utils.set_seed(30)
>>> input_ids = x_token.input_ids.to(device)
>>> token_type_ids = x_token.token_type_ids.to(device)
>>> out_lm_token = model.generate(input_ids, token_type_ids=token_type_ids, max_new_tokens=50)
>>> out_mlm_token = model(input_ids, token_type_ids=token_type_ids).logits.argmax(axis=-1)
>>> tokenizer.decode(out_mlm_token[0])
"武田信玄は、戦国時代ファンならぜひ押さえておきたい名将の一人。"
>>> tokenizer.decode(out_lm_token[0][input_ids.shape[1] :])
"武田氏の三代に渡った武田家のひとり\n甲斐市に住む、日本史上最大の戦国大名。..."