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

generate参数设置:

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

函数运行:

1.加载配置:

generation_config = {

"bos_token_id": 50256,        # 前面来自模型的config.json加载

"eos_token_id": 50256,

max_length=100,        # 后面两个来自函数传参

pad_token_id=50256

}

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, 640]]),

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等参数的探究

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

关于Text Generation的GenerationCoinfig参数_do sample-CSDN博客

  • 42
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值