AI大模型之旅-大模型为的微调参数详解

chenkangck50 2024-10-01 16:31:09 阅读 50

output = model.generate(

inputs.input_ids,

max_length=max_length,

do_sample=do_sample,

temperature=temperature,

top_p=top_p,

top_k=top_k

)

大模型文本常用参数为以上几个,下面我们详细解析下:

初解:

max_length

定义:生成的文本的最大长度。

作用:这个参数控制生成的文本在多少个 token 之后停止,防止输出过长。

使用场景:限制生成文本的长度。比如你只想生成不超过 100 个 token 的回答,可以设置 max_length=100。do_sample

定义:是否启用采样(随机生成)机制。

作用:当 do_sample=True 时,模型会在每一步生成过程中随机选择一个 token,而不是总是选择最有可能的 token。启用采样时,输出的多样性和随机性会增加。

使用场景:如果你希望生成更加多样化的文本(如写作、生成对话等),可以设置 do_sample=True。如果希望生成更确定性(如任务问答)的文本,可以设置 do_sample=False。temperature

定义:控制模型输出的随机性。

作用:temperature 调节生成的平滑性和多样性。较低的温度(如 temperature=0.1)会使模型倾向于选择更高概率的 token,输出会更确定;较高的温度(如 temperature=1.0 或更高)会增加随机性,使生成的文本更加多样化和不确定。

使用场景:适用于需要控制生成输出的随机性时。例如在生成故事时,可以提高 temperature 以获得更创意的文本;在回答问题时,可以降低 temperature 来获得更可靠的回答。top_p

定义:控制模型的核采样(Nucleus Sampling)。

作用:top_p 决定模型会从多少概率质量的 token 中进行采样。例如,top_p=0.9 表示从概率总和为 0.9 的 token 集中进行采样。这种方法可以确保模型只选择最可能的 token,同时保留一定的随机性。

使用场景:当需要生成较为自然的文本时,通常设置 top_p 在 0.8-0.95 之间,它比 top_k 更灵活。top_k

定义:控制模型从概率最高的前 k 个 token 中进行采样。

作用:top_k=50 表示每次生成时,模型只从前 50 个最有可能的 token 中随机选择。top_k=1 类似于贪婪搜索,只选择最可能的那个 token。

使用场景:当希望对生成的多样性进行强控制时,可以调整 top_k。一般来说,top_k=50 到 top_k=100 是常见的选择,用于保持一定的随机性而不会太过无序。

详细解析:

什么是 Token?

在自然语言处理(NLP)中,Token 指的是模型处理的文本片段。它可以是一个单词、单词的一部分,甚至是标点符号。比如在句子 “I am learning” 中,每个词可以被视为一个 Token:

“I” → 1 个 Token

“am” → 1 个 Token

“learning” → 1 个 Token

具体到某些分词器,像 “learning” 这样的词可能会被进一步拆分为多个子词 Token(例如 “learn” 和 “ing”)。

max_length 定义:生成的文本的最大长度。作用:这个参数控制生成的文本在多少个 token 之后停止,防止输出过长。

do_sample

do_sample 是否启用采样(随机生成)机制 do_sample=True 时,模型会在每一步生成过程中随机选择一个 token 启用采样时,输出的多样性和随机性会增加

do_sample=False 总是选择最有可能的 token

temperature 控制模型输出的随机性,do_sample=True的随机性的基础上,调节生成的平滑性和多样性

较低的温度(如 temperature=0.1)会使模型倾向于选择更高概率的 token,输出会更确定;较高的温度(如 temperature=1.0 或更高)会增加随机性,使生成的文本更加多样化和不确定。使用场景:适用于需要控制生成输出的随机性时。例如在生成故事时,可以提高 temperature 以获得更创意的文本;在回答问题时,可以降低 temperature 来获得更可靠的回答

do_sample=True 与 temperature 配合:当 do_sample=True 时,你可以通过调整 temperature 来进一步控制随机性和生成多样性:

do_sample=True, temperature=1.0:默认温度,模型的抽样过程较为均衡,不会特别偏向高或低概率的 token。

do_sample=True, temperature>1.0:提高温度,增加随机性,模型有更多的机会选择低概率 token,适合生成更有创意的内容。

do_sample=True, temperature<1.0:降低温度,减少随机性,生成的文本更趋向于选择高概率的 token,适合更稳定的输出

如果 do_sample=False,就不需要使用 temperature,因为 temperature 只在启用随机采样时(即 do_sample=True)有作用。

do_sample=False 时,模型会进行确定性生成,也就是每一步都选择概率最高的 token,不会引入随机性。因此,temperature 参数无效,因为它的作用是调节随机性的强弱。

temperature 只有在随机采样时(即 do_sample=True)才会影响模型的行为,它决定了模型在选取下一个 token 时的概率分布是否要平滑或锐化。

为什么 do_sample 不够

do_sample=True:只决定是否进行随机采样,如果设置为 True,则模型会进行随机选择,但这个随机性可能会过强或过弱,难以微调。

temperature:控制的是随机选择的程度。即使 do_sample=True,如果你不调整 temperature,模型会按照默认的温度(通常是 1.0)进行采样,而这可能不完全适合你的需求。

temperature 提供了更多细腻的控制:

如果仅使用 do_sample=True:

输出会有随机性,但你无法控制它的强度,可能太随机或者不够随机。

比如,当 temperature=1.0 时,随机性适中,但可能你需要更稳定(低 temperature)或更创造性的输出(高 temperature)。

例子:

仅使用 do_sample=True:你希望模型随机生成一些内容,但你无法细致控制它是更偏向常规(保守)的输出,还是更有创意的(激进)输出。

配合 temperature 使用:当 do_sample=True 时,通过调节 temperature:

低 temperature:生成结果更保守、更接近最可能的选项,随机性减少。

高 temperature:生成结果更具创意,低概率选项的机会增加,增加了生成内容的不可预测性。

举个生活中的例子:

想象你去一家餐馆点餐:

do_sample=True:你决定让服务员帮你随机推荐一份餐点(有随机性)。

temperature:这个时候,你可以让服务员根据你的口味偏好推荐(例如更保守或更大胆的推荐)。

低 temperature:推荐会偏向安全的、最受欢迎的菜品。

高 temperature:推荐会更大胆,甚至是一些不常见的菜。

总结:

do_sample=True 让模型在生成时随机选择,但它不能微调随机性的强弱。

temperature 可以进一步微调随机性,让你控制生成内容是更保守还是更创意。

所以,do_sample 决定是否随机采样,而 temperature 决定采样的随机程度。它们配合使用会给你更大的灵活性

top_p和 top_k

top_p:top_p 通过累积概率的方式来选择候选 token。模型会从概率总和达到 p 的最小 token 集合中随机选择下一个 token。动态调整考虑的 token 集合大小,更有可能生成符合语境的高概率词,但仍保留一定的随机性。适合自然文本生成,特别是在需要保留一定随机性的同时,避免生成特别低概率的 token。

top_k(Top-k Sampling):top_k 限制模型只从前 k 个概率最高的 token 中进行随机采样。与 top_p 不同的是,它不关心累计概率,而是只从固定数量的前 k 个 token 中选择。

简单直接:强制只从 k 个最有可能的 token 中选择,提供了一个更直接的随机控制机制。固定限制:不管剩下的 token 概率总和是多少,只有固定数量的 k 个 token 会被考虑

简单直接,特别适合对输出多样性有要求的任务(如生成对话或故事),但在某些情况下,可能会忽略一些重要的低概率 token。

区别:top_k 是固定数量的候选 token,意味着无论候选词的概率分布如何,模型都只会考虑前 k 个词。top_p 是基于概率累积的候选词选择方式,动态地选择概率加起来等于 p 的最小集合,这意味着它可以根据不同的概率分布自适应调整候选词数量。

在这里插入图片描述

使用 top_k=3 的情况:

在这两种上下文下,top_k=3 都会考虑前三个候选词。

上下文 1:即使 “晴朗” 的概率远高于其他词,top_k 依然会将 “阴天” 纳入选择集合中,而它的概率可能太低,没必要考虑。

候选词集:晴朗、多云、阴天

上下文 2:因为所有候选词的概率都很接近,top_k=3 会忽略掉概率较低但仍然有 20% 概率的 “雨天”。

候选词集:晴朗、多云、阴天,但忽略了 “雨天”。

使用 top_p=0.85 的情况:

top_p 根据每个上下文中的概率动态调整候选词集合。

上下文 1:top_p=0.85 会累积前两个最高概率的词 (“晴朗” 和 “多云”),因为它们的总概率是 85%。“阴天” 和 “雨天” 的概率加起来只有 15%,太低,不会被纳入。

候选词集:晴朗、多云

上下文 2:top_p=0.85 会选择前三个词,因为 “晴朗”、“多云” 和 “阴天” 的总概率是 80%,然后再加入 “雨天”(20%),以达到 85% 的累积概率。

候选词集:晴朗、多云、阴天、雨天

为什么 top_k 不能完全替代 top_p?

固定 vs 动态:top_k 总是选择固定数量的候选词,而不考虑这些词的总概率。如果概率分布非常集中或分散,top_k 会让模型在一些情况下选得过多或过少,无法灵活调整。

在 上下文 1,top_k=3 考虑了低概率的 “阴天”,而这个词实际上几乎没有必要被选中。

在 上下文 2,top_k=3 忽略了有 20% 概率的 “雨天”,但这个词在这样的分布下其实是重要的候选词。

灵活性:top_p 的核心优势是能够动态调整选词集合,确保选出最合适的 token 数量。这使得它在处理不同的概率分布时,生成结果更加自然。

上下文 1:由于 “晴朗” 占据了大部分概率,top_p 可以只从两个候选词中选择,避免低概率词。

上下文 2:top_p 能够自适应地将所有有一定概率的词都纳入候选,生成更加丰富、自然的结果。

总结:

top_k=3 是一个固定的限制,在某些情况下,它会选得过多或过少,无法适应不同的概率分布。

top_p 是根据实际的概率分布动态选择候选词,更加灵活,能够适应不同的上下文。

当概率分布非常集中时,top_p 可以选择较少的高概率词;当概率分布较为分散时,top_p 会自动增加候选词数量。

虽然 top_k 可以通过调整 k 值在一定程度上替代 top_p 的效果,但它缺少 top_p 动态适应上下文的能力,这意味着在某些生成任务中 top_p 会提供更自然的文本输出。这就是为什么 top_k 和 top_p 常常被分别使用,适应不同的场景需求

top_p 和 top_k 是否需要配合使用

配合使用的示例:

设定 top_k=50,top_p=0.9:

步骤 1:模型首先从所有候选词中选择前 50 个最高概率的词(top_k=50),丢弃概率较低的候选词。

步骤 2:接着,模型会在这 50 个词中筛选出累计概率达到 90% 的词进行采样(top_p=0.9),确保只保留最合适的候选词。

这种配合可以防止生成过程中过于随机,也确保即使在候选集较大时,模型依然能选择合理的词汇进行采样

Token 概率是如何计算出来的?

下一个 token 的概率是由语言模型(如 GPT-3、BERT 等)根据当前的上下文预测出来的。这些概率反映了在给定的上下文中,生成下一个词的可能性。以下是一个简化的流程,说明这些概率是如何计算的:

模型如何预测下一个 token:

输入的预处理:

输入的文本首先被模型处理为 token(即分词),比如 “今天 天气 非常” 会被转换成对应的 token 序列。

通过模型生成概率分布:

模型会根据已经输入的 token 序列,预测下一个可能的 token。具体来说,模型会输出一个概率分布,即对于每个可能的 token(词汇表中的每个词),模型预测它作为下一个词的可能性有多大。

例如,模型可能预测下一个词是 “晴朗” 的概率为 0.4,是 “多云” 的概率为 0.3,“阴天” 为 0.2,“雨天” 为 0.1。

使用神经网络进行预测:

语言模型是基于神经网络(通常是Transformer 结构)的。神经网络通过多层的自注意力机制,分析上下文中的每个词之间的关系,并逐步生成下一个词的概率分布。

这种生成概率的过程是通过模型的参数(如权重和偏置)经过多层计算后得到的。每一层都会基于当前词的上下文计算出候选词的可能性。

Softmax 函数:

最终,模型使用 Softmax 函数将每个候选词的得分转换为一个概率分布。Softmax 函数会把模型输出的得分(可以是正数、负数)转换为 0 到 1 之间的概率值,且这些概率值加起来等于 1。

假设模型对候选词生成了如下得分(logits):晴朗=3.0, 多云=2.5, 阴天=2.0, 雨天=1.0。Softmax 会将这些值转换成一个概率分布。

示例计算(简化的 Softmax 过程):

假设候选 token 的 logits 是:

晴朗=3.0

多云=2.5

阴天=2.0

雨天=1.0

Softmax 转换为概率的过程如下:

计算每个词的指数值(exp):

exp(3.0) ≈ 20.09

exp(2.5) ≈ 12.18

exp(2.0) ≈ 7.39

exp(1.0) ≈ 2.72

计算指数值的总和:

总和 = 20.09 + 12.18 + 7.39 + 2.72 = 42.38

计算每个词的概率:

晴朗的概率 ≈ 20.09 / 42.38 ≈ 0.47

多云的概率 ≈ 12.18 / 42.38 ≈ 0.29

阴天的概率 ≈ 7.39 / 42.38 ≈ 0.17

雨天的概率 ≈ 2.72 / 42.38 ≈ 0.06

因此,模型根据上下文预测 “晴朗” 是下一个词的概率为 47%,“多云” 为 29%,依此类推。

总结:

top_p 和 top_k 的配合使用:可以让你在候选 token 集合的数量和质量上进行更灵活的控制,确保模型既不过于随意也不过于限制。

Token 概率的计算:基于语言模型的上下文理解和神经网络的参数,通过 Softmax 函数将模型得分转换为概率分布,表示每个可能 token 出现的概率。

生成流程概述:

input_ids:

模型的输入,是已经过分词器处理后的 token 序列。它是生成的基础和上下文,模型会根据这些输入生成后续的文本。

do_sample:

是否启用随机采样。这个参数决定了生成的过程是否随机。如果 do_sample=False,则使用确定性的生成方法(比如贪婪搜索或束搜索),这时 temperature、top_p、top_k 这些随机相关的参数都不会生效。

如果 do_sample=True,则进入随机生成模式,接下来 temperature、top_p 和 top_k 这些参数将生效并影响生成的随机性和多样性。

top_k:

限制候选集的数量。如果 top_k 被设置,模型在每次生成 token 时,只会从前 k 个概率最高的 token 中进行选择。这是第一个控制生成结果范围的限制。

如果 top_k=50,表示每次只从 50 个概率最高的 token 中选一个,这个 token 是根据后续步骤(比如 top_p 和 temperature)随机选出的。

top_p:

基于概率总和的采样。如果 top_p 被设置,模型会从累计概率达到 p 的候选 token 集中进行选择。它不会固定选择前 k 个 token,而是根据概率动态确定候选集的大小。

如果 top_p=0.9,模型会选择累计概率达到 90% 的候选 token 集。这样即使有较低概率的词,也可能进入候选集,提供更多的多样性。

temperature:

控制随机性的平滑度。temperature 会影响 token 的概率分布,使得高概率和低概率 token 的选择更随机或更确定。

如果 temperature=1.0,表示保持默认的随机性;如果 temperature>1.0,会增加生成的随机性;而 temperature<1.0 则会让模型更倾向于选择高概率的 token,减少随机性。

具体生成顺序与逻辑

Step 1:输入 input_ids,模型根据输入的上下文准备生成下一个 token。

Step 2:检查 do_sample 是否为 True:

如果 do_sample=False:模型不使用随机采样,直接选择概率最高的 token(确定性生成)。

如果 do_sample=True:模型进入随机采样模式,接下来的 top_k、top_p、temperature 参数将生效。

Step 3:使用 top_k 限制候选集:

如果设置了 top_k,模型只从概率最高的 k 个 token 中选择。这是候选集的第一个限制。

Step 4:使用 top_p 限制候选集:

如果设置了 top_p,模型从累计概率达到 p 的候选集(由 top_k 筛选出的)中进行采样。这是候选集的第二个限制。

Step 5:应用 temperature 控制随机性:

最后,temperature 调节这些候选 token 的概率分布。如果 temperature 值较高,模型会更加随机选择下一个 token。如果 temperature 较低,模型更倾向于选择高概率的 token。

Step 6:生成下一个 token,重复以上步骤,直到达到 max_length 限制。

总结:

输入 input_ids:提供模型初始输入。

do_sample 决定是否使用随机生成:

do_sample=False:直接选择概率最高的 token(确定性生成),忽略 temperature、top_p、top_k。

do_sample=True:随机采样,temperature、top_p、top_k 生效。

top_k 和 top_p:共同决定候选 token 的范围。top_k 限制候选集大小,top_p 基于概率筛选候选集。

temperature:最后控制生成结果的随机性和多样性



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。