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