transformer based(transformer-based)

作者:电脑培训网 2024-05-03 10:54:54 713

基于transformers的generate()方法实现多样化的文本生成:参数含义及算法原理解读一、前言

最近在做文本生成,使用huggingfaceTransformers库的文本生成generate()函数,就是实现GenerationMixin类是自回归文本生成预训练模型相关参数的集合。因此,本文解释了这些参数的含义以及贪心搜索、波束搜索、采样等常用算法的原理。

transformer based(transformer-based)

该类提供的外部方法是generate(),通过调整参数可以完成以下事情:

贪婪解码:当num_beams=1且do_sample=False时,调用greedy_search()方法。每一步都会生成条件概率最高的单词,从而生成一段文本。多项式采样:当num_beams=1且do_sample=True时,调用sample()方法对单词列表进行采样,而不是选择条件概率最高的单词,以增加多样性。beam-search解码:当num_beams1且do_sample=False时,调用beam_search()方法进行num_beams列搜索,每次贪婪地选择前N列。beam-search多项式采样:当num_beams1且do_sample=True时,调用beam_sample()方法相当于不再每次都贪婪地选择前N列,而是添加一些样本。多样化的波束搜索解码:当num_beams1和num_beam_groups1时,调用group_beam_search()方法。约束波束搜索解码:当constraints!=None或force_words_ids!=None时,实现可控文本生成。二、各输入参数含义

接下来看一下各个输入参数:

我认为对文本生成质量最有用的参数是:max_length、min_length、do_sample、top_k、top_p、repetition_penalty。接下来有选择的记录一下各个参数的含义。

输入-用作生成提示或编码器的模型输入的序列。如果None该方法使用bos_token_id和批量大小1对其进行初始化。对于仅解码器模型,输入应采用input_ids的格式。对于编码器-解码器模型,输入可以表示input_ids、input_values、input_features或Pixel_values中的任何一个。

输入:输入提示。如果为空,则用bos_token_id初始化,批量大小为1。对于只有解码器的模型,输入需要为input_ids;对于编码器-解码器模型,输入更加多样化。

max_length(int,可选,默认为model.config.max_length)—要生成的序列的最大长度。

max_length:生成序列的最大长度。

min_length(int,可选,默认为10)—要生成的序列的最小长度。

min_length:生成序列的最短长度,默认为10。

do_sample(bool,可选,默认为False)—是否使用采样;否则使用贪婪解码。

do_sample:是否启用采样,默认为False,表示贪婪地寻找条件概率最大的词。

Early_stopping(bool,可选,默认为False)—当每批至少完成num_beams个句子时是否停止波束搜索。

Early_stopping:生成至少num_beams个句子后是否停止beamsearch。默认值为False。

num_beams(int,可选,默认为1)—用于波束搜索的波束数量。1表示不进行波束搜索。

num_beams:默认为1,表示不进行波束搜索。

温度—用于对下一个标记概率进行建模的值。

默认值为1.0。温度越低,softmax输出的贫富差距越大;温度越高,softmax之间的差距越小。

top_k(int,可选,默认为50)—为top-k过滤保留的最高概率词汇标记的数量。

top_k:top-k过滤算法保留多少个概率最高的单词作为候选词,默认为50。详细信息见下文。

top_p—如果设置为float1,则仅保留概率总计为top_p或更高的最可能的标记进行生成。

top_p:已知生成每个单词的总概率为1。如果top_p小于1,则从高到低累加直到top_p,并取前N个词作为候选词。

典型_p—典型解码中要考虑的原始分布的概率质量量。如果设置为1.0,则不起作用。请参阅本文了解更多详细信息。

典型_p:典型采样,默认值为1.0。该参数无效。主要思想是:不总是从分布的高概率区域中选择单词,而是从单词集中采样的接近期望值典型_p的信息内容。

论文:自然语言生成的典型解码

repetition_penalty(float,可选,默认为1.0)—重复惩罚的参数。1.0表示没有处罚。请参阅本文了解更多详细信息。

repetition_penalty:默认为1.0,重复惩罚。

论文:CTRL:用于可控生成的条件变换器语言模型

pad_token_id(int,可选)—填充令牌的id。

bos_token_id(int,可选)—序列开始标记的id。

eos_token_id(int,可选)—序列结束标记的id。

pad_token_id/bos_token_id/eos_token_id:填充词PAD的id,起始附录s和结束字符/s。

length_penalty(float,可选,默认为1.0)—长度的指数惩罚。1.0表示波束分数受到序列长度的惩罚。0.0表示不处罚。设置为值0.0是为了鼓励模型生成更长的序列,设置为值0.0是为了鼓励模型生成更短的序列。

length_penalty:长度惩罚,默认为1.0。

length_penalty=1.0:束搜索分数将受到生成序列长度的惩罚length_penalty=0.0:无惩罚length_penalty0.0:鼓励模型生成长句子length_penalty0.0:鼓励模型生成短句子no_repeat_ngram_size(int,可选,默认为0)—如果设置为int0,则该大小的所有ngram只能出现一次。

no_repeat_ngram_size:用于控制重复词的生成。默认为0。如果大于0,则对应的N-gram只会出现一次。

encoder_no_repeat_ngram_size—如果设置为int0,则编码器_input_ids中出现的该大小的所有ngram都不能出现在解码器_input_ids中。

encoder_no_repeat_ngram_size:同样用于控制重复词的生成。默认为0。如果大于0,encoder_input_ids的N-gram将不会出现在decoder_input_ids中。

bad_words_ids(List[List[int]],可选)—不允许生成的tokenid列表。为了获取不应出现在生成文本中的单词的标记ID,请使用tokenizer(bad_words,add_pfix_space=True,add_special_tokens=False).input_ids。

bad_words_ids:禁止生成的单词id列表。可以使用tokenizer(bad_words,add_pfix_space=True,add_special_tokens=False).input_ids方法获取id。

force_words_ids(List[List[int]]或List[List[List[int]]],可选)—必须生成的令牌ID列表。如果给定一个List[List[int]],则将其视为必须包含的简单单词列表,与bad_words_ids相反。如果给定List[List[List[int]]],这会触发析取约束,其中可以允许每个单词有不同的形式。

force_words_ids:与上面的bad_words_ids相反,它传入必须生成的令牌id列表。如果ids格式为[List[List[int]]],如[[1,2],[3,4]],则触发析取约束,大致意思是一个带有可以生成不同的单词。形式,如“孤独”、“孤独”等。

论文:因果的引导生成

num_return_sequences(int,可选,默认为1)—批次中每个元素独立计算的返回序列的数量。

num_return_sequences:每个输入生成多少个输出序列,默认为1。

max_time:多少秒后停止生成。

focus_mask:默认与输入input_ids形状相同,0代表mask,1代表无mask,被mask的token不参与计算attention权重。

Decoder_start_token_id:如果编码器-解码器架构模型可能具有与编码器不同的解码开始标记,则可以指定一个int值。

num_beam_groups(int,可选,默认为1):为了保证波束搜索时不同波束之间的多样性,可以将这些波束分为组。有关详细信息,请参阅论文DiverseBeamSearch:DecodingDiverseSolutionsfromNeuralSequenceModels。

多样性_惩罚:如果一个波束生成的单词与同一步骤中的其他波束相同,则减去该值作为惩罚。该值仅在启用num_beam_groups时有效。

pfix_allowed_tokens_fn(Callable[[int,torch.Tensor],List[int]],可选):如果提供此函数,则波束搜索的每一步将仅限于允许的标记,否则将不应用任何约束。该函数有两个输入,即batch_id和当前步骤的输入input_ids,并返回一个包含下一步允许的标记的列表。可用于条件约束生成。有关详细信息,请参阅论文自回归实体检索。

output_attentions(bool,可选,默认为False):是否返回所有注意力层的注意力矩阵值,默认为False。

output_hidden_states(bool,可选,默认为False):是否返回每层的hidden_states,默认为False。

output_scores:是否返回预测分数。

forced_bos_token_id(int,可选):解码器在生成decoder_start_token_id对应的token后指定生成的tokenid。它被mBART等多语言模型使用,因为该值通常用于区分目标语言。

forced_eos_token_id(int,可选):当达到最大长度max_length时,强制为最后生成的tokenid。

remove_invalid_values:是否删除模型nan和inf以防止崩溃,但可能会减慢生成速度。

exponential_decay_length_penalty,可选):生成一定数量的令牌后,以的格式应用指数增长长度惩罚。前者表示应用惩罚的指数,后者表示指数衰减因子。

三、函数输出含义

如果return_dict_in_generate=True或config.return_dict_in_generate=True,则返回ModelOutput类对象,否则返回torch.FloatTensor。

四、各解码算法原理简述

本节主要介绍自回归文本生成最常用的几种解码方法,包括贪婪搜索、Beam搜索、Top-K采样和Top-p采样。自回归生成基于以下公式,该公式假设单词序列的概率分布等于每个单词的条件概率的乘积。

=

t

=

1

时间

,和

w

1

:

=

,

P(w_{1:T}|W_0)=\prod_{t=1}^TP(w_{t}|w_{1:t-1},W_0)\text{,with}w_{1:0}=\emptyset,

P(w1:TW0)=t=1TP(wtw1:t1,W0),其中w1:0=,

4.1GreedySearch

贪心搜索,每个时间步

t

t

t选择概率最高的单词:

w

t

=

A

r

G

A

X

w

w_t=argmax_{w}P(w|w_{1:t-1})

wt=argmaxwP(ww1:t1)

比如图中,最终生成的序列是。这种贪心算法和束搜索的共同缺点是很容易生成重复的单词。让我们尝试一下:

此外,贪婪搜索往往会忽略低概率词后面的高概率词。比如一开始的,“狗有”的概率是0.4*0.9=0.36,比“好女人”的0.5*0.4=0.20要高。然而,由于第一轮的狗概率低于nice,因此错过了图中更好的解决方案。集束搜索可以解决这个问题。

4.2BeamSearch

BeamSearch在每个时间步选择最有可能的Top-num_beams个单词,解决了贪婪搜索通过的风险。

如图中的例子,num_beams=2,第一步选择概率最高的序列nice(0.5)和狗(0.4),第二步选择概率最高的序列狗(0.40.9=0.36)和好女人。

需要注意的是,尽管束搜索能够比贪婪搜索以更高的概率找到解,但并不能保证是全局最优解。

试一试。设置num_beams1,early_stopping=True,当指定数量的beams产生结束字符时提前停止。

比以前好多了,但还是有重复的地方。您可以添加no_repeat_ngram_size=2以禁止模型生成重复的2-gram。但需要谨慎使用,因为“喜欢”这个词生成后就无法再生成,从而导致“喜欢周杰伦”消失。

另外,还可以通过num_return_sequences参数指定返回概率最高的topN序列。

可以看到,生成的前5个序列之间的差异并不是太大。

关于集束搜索,存在三种观点:

如果生成长度可以提前预测,例如摘要和翻译,集束搜索会更好。然而,对于开放式生成,例如对话、故事生成等,输出长度变化很大,因此束搜索不适合。集束搜索很容易重复生成单词。由于需要大量的实验来实现“禁止生成重复的n-gram”和“允许周期性生成重复的n-gram”之间的平衡,因此在开放式中使用这种惩罚来控制重复并不容易生成任务。人类在说话时往往并不总是选择概率高的词作为下一个词,而是常常措手不及、出乎意料,如图所示。所以集束搜索仍然存在很大的问题。

4.3Sampling

采样算法不再拘泥于高概率词,而是根据条件概率分布随机选择词。如图所示,像car这样的低概率词也有机会被选为生成文本。

在generate函数中,设置do_sample=True,并传递top_k=0,暂时禁用topk采样,看看实际效果。

可以看到模型有点乱码……这时候温度参数就派上用场了。

4.3.0Temperature

温度参数相当于降低了softmax的温度,增大了每个单词的概率差距。公式如下:

比较:下图是加了温度的。

下图是没有温度的情况。

看得到:

T越小,接近0,概率密度越集中在高概率词上,越倾向于贪婪搜索,也越容易产生重复词。T越大,越接近1,越接近原始的softmax,随机性越大。T越大,甚至大于1,抽样就越随机,概率分布趋于均匀分布。

试一试:

当温度=0.7时:

当温度=0.1时:

4.3.1Top-k采样

HierarchicalNeuralStoryGeneration提出了Top-K采样方法。原理是先找到K个最有可能的词,然后计算这K个词之间的概率分布,如图。GPT2就采用了这种采样方法。

可以看到比以前好很多了,但是也存在问题:

top-k采样的问题是K是死的,无法动态调整。这就引出了上面的例子。在上面的例子中,左图中t=1步时,概率分布比较平坦,而右图中t=2步时,概率分布则截然不同。在上面的例子中,给定t=1时选择的单词是合理的,但是当t=2时,down和a显然不合适但也被选入候选集中。因此,候选集被限制为固定值K,可以让模型

在右图的悬殊分布里生成胡言乱语,也限制了在平缓分布中的一些创造性。所以top-p采样应运而生。

4.3.2Top-p采样

Top-p(nucleus)sampling是AriHoltzmanetal.(2019)提出的算法。他是从使得累计概率超过p的最小候选集里选择单词,然后算这些单词的概率分布。这样候选单词集的大小就不跟topK似的一成不变了,会随下一个单词的概率分布动态增加和减少。

比如设置p=0.92,给定the后,t=1时前面9个词加起来概率为0.94,刚刚超过了0.92,于是前9个词成了候选词;t=2时前面3个词概率加起来已经达到了0.97。

也就是说,当下个单词不太可预测时,那候选就多一些;如果下个单词模型打眼一看就知道是哪些,那候选就少一些。

top_p是0-1之间的值,值越接近1效果越好。

当p设置的比较大时,top-p采样出来的候选词可能巨多,所以可以跟top-k结合起来用,避免那些top-p选中的概率很低的词,如图设置top_p和top_k。

官方文档:

参考资料:

相关推荐

  • 培训学校学生成长,培训学校学生成长档案模板

    培训学校学生成长,培训学校学生成长档案模板

    大家好,今天小编关注到一个比较有意思的话题,就是关于培训学校学生成长的问题,于是小编就整理了4个相关介绍培训学校学生成长的解答,让我们一起看看吧。家校共育赋能成…

    培训学校学生成长,培训学校学生成长档案模板 2024-09-26 05:55:40
  • easypoi导出动态表头(easyexcel动态生成模板详解)

    easypoi导出动态表头(easyexcel动态生成模板详解)

    EasyExcel解析动态表头并导出前言Excel文件导入导出,这是日常开发中经常遇到的需求。这次笔者以EasyExcel为例,详细介绍一下项目中遇到的动态头解…

    easypoi导出动态表头(easyexcel动态生成模板详解) 2024-05-06 19:50:50
  • vue fullcalendar(vue-fullcalendar)

    vue fullcalendar(vue-fullcalendar)

    在Vue中使用Fullcalendar的想法一、npm安装Fullcalendar及相关插件npmi--save@fullcalendar/vue@fullca…

    vue fullcalendar(vue-fullcalendar) 2024-05-04 01:54:10
  • solidworks培训学校,solidworks培训学校费用

    solidworks培训学校,solidworks培训学校费用

    大家好,今天小编关注到一个比较有意思的话题,就是关于solidworks培训学校的问题,于是小编就整理了3个相关介绍solidworks培训学校的解答,让我们一…

    solidworks培训学校,solidworks培训学校费用 2024-05-02 17:58:02
  • ai自动生成绘画软件(ai作画app)

    ai自动生成绘画软件(ai作画app)

    人工智能前沿——6AI绘画生成工具深度学习Tricks,第一时间送达目录一、【前言】二、【6款AI绘画生成工具】1.DeepAI2.NightCafe3.Dee…

    ai自动生成绘画软件(ai作画app) 2024-04-30 20:12:11