您好,欢迎来到华佗养生网。
搜索
您的当前位置:首页以gpt2为例generate()生成函数流程

以gpt2为例generate()生成函数流程

来源:华佗养生网

generate参数设置:

input_ids, max_length=100, num_return_sequences=1, pad_token_id=tokenizer.eos_token

函数运行:

1.加载配置:

2.校验模型输入,生成参数【pad_token_id默认等于eos_token_id】

3.定义模型参数

model_kwargs={

"output_attentions":

"output_hidden_states":

"use_cache":True,

'attention_mask': tensor([[1, 1, 1, 1]]),        # 掩码,区分文本与填充

}

4.定义生成参数:generation_config中只展示前四项,实际后面还有许多属性

GenerationConfig {

"bos_token_id": 50256,

"eos_token_id": 50256,

"max_length": 100,

"pad_token_id": 50256 ,

model_input_name='input_ids',

inputs_tensor=tensor([[7454, 2402, 257, 0]]),

input_ids_length=4,

}

5.选择模式:

num_beam参数:“num_beams"是在进行文本生成时的一个参数。它是指在生成一个序列的时候,预测模型同时生成的候选解的数量。设置越高,可以增加生成的候选解的数量,从而得到更多可能性,但是会同时增加计算代价。

penalty_alpha :penalty_alpha在损失函数中添加的惩罚系数,用于控制生成的文本多样性的参数。当penalty_alpha值越大时,生成结果越多样化;反之,越固定

num_beams默认配置1 && (top_k=50 penalty_alpha = None) --> 自动选择贪婪策略搜索

<GenerationMode.GREEDY_SEARCH: 'greedy_search'>

6.贪婪策略内部运行:

准备model_kwargs:

进入一个大循环:  

使用贪婪策略相同的输入会使得每次输出都是一致!

【逐词生成】将新值拼接到model_kwargs,继续循环:

返回logits和past_key_value【用来做下一次推理的QKV,减少计算量】

运行到最大max_length时跳出outputs对应的token

max_length = len(原始文本的token)+len(新生成的token)

7.tokenizer.decode(skip_special_tokens=True)

skip_special_tokens跳过起始符[BOS]结束符[EOS]等特殊符号

bos_token ->[BOS] -> 50256

eos_token ->[EOS] -> 50256

pad_token -> [PAD] -> 50256

批处理:

# 问题:

1.eos_token_id,bos_token_id,pad_token_id在上面推理过程中貌似没有用到?

        generate支持单条和batch的数据处理!pad_token一般用于批量处理,当批量推理时就会出现pad_token。包括在batch_encode_plus【当缺少pad时需要给tokenizer提前设置pad_token】

2.对于生成模型,如何将生成的字数设置为不是固定值?此时model如何定义终止符号?

3.关于模型其它的生成模型,top_k,top_p等参数的探究

----------------------------------------------------------------------------

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo7.cn 版权所有 湘ICP备2022005869号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务