【Transformer】温度Temperature如何影响LLM的输出

  在自然语言处理(NLP)中,Transformer的decoder并不直接输出单词,通常使用Softmax函数来生成下一个词在词表中的概率分布。

Temperature作为超参数,通过影响Softmax函数的输出分布,从而影响生成文本的多样性和确定性。本文将探讨温度参数如何通过调整Softmax函数的输出分布、如何与不同采样策略结合,进而影响模型生成文本的特性。

目录

1. Softmax函数在Decoder中的位置

2. 温度如何改变Softmax函数输出

例子

代码示例

3. 不同策略影响Top-K、Top-P和Beam Search

1. 贪婪搜索(Greedy Search)

2. 采样(Sampling)

3. 🚩Top-K 采样

4. 🚩Top-P(Nucleus)采样

5. Beam Search(束搜索)

4 总结

选择策略

延伸问题:为什么使用大模型时候,相同的输入可能有不同输出

采样方法(Sampling)

Beam Search 的随机

Dropout 和随机初始化


1. Softmax函数在Decoder中的位置

在Transformer模型的解码过程中,模型通过自注意力机制逐步生成目标序列。每一步解码都会输出一个词的logits(未归一化的分数),然后通过Softmax函数将其转化为概率分布,用于选择下一个词。

具体流程如下:

  1. Decoder输出一个向量,表示当前时刻对每个词的偏好程度(logits)。

  2. 使用Softmax函数将logits转化为一个概率分布:

        P_i = \frac{e^{z_i / T}}{\sum_j e^{z_j / T}}

        其中, T 就是温度参数

       3 .根据这个概率分布,使用采样策略(如贪婪搜索、Top-K采样等)选择下一个词。

因此,Softmax函数在模型中起到了“归一化输出”和“控制选择偏好”的双重作用,而温度参数则是调节这种偏好的关键

2. 温度如何改变Softmax函数输出

温度参数(Temperature)是一个标量,通常用T 表示。它通过调整Softmax函数的输入logits来改变输出分布的形状。引入温度参数后的Softmax函数公式如下:

P(y_i) = \frac{e^{z_i / T}}{\sum_{j=1}^{V} e^{z_j / T}}

温度参数 T 的作用如下:

  • 当 T > 1 时,Softmax函数的输出分布变得更加平滑,概率分布中的差异减小。这意味着模型生成文本时,更倾向于选择概率较低但多样的词汇,从而增加文本的多样性。

  • 当 T < 1 时,Softmax函数的输出分布变得更加尖锐,概率分布中的差异增大。这意味着模型生成文本时,更倾向于选择概率最高的词汇,从而增加文本的确定性。

例子

假设模型输出的logits为 [2.0, 1.0, 0.5] ,词汇表大小为3。我们分别计算 T = 1 、 T = 0.5 和 T = 2 时的概率分布。

代码示例

以下是一个简单的代码示例,展示温度参数如何影响生成结果:

import torch
import torch.nn.functional as F

# 假设模型的原始输出(logits)
logits = torch.tensor([[1.0, 2.0, 3.0]])

def generate_text(logits, temperature=1.0):
    # 应用温度参数
    logits = logits / temperature
    # 计算概率分布
    probs = F.softmax(logits, dim=-1)
    # 从概率分布中采样
    next_token = torch.multinomial(probs, num_samples=1)
    return next_token.item()

# 低温(确定性高)
print("低温 (T=0.1):", generate_text(logits, temperature=0.1))  # 总是选择概率最高的词

# 默认温度
print("默认温度 (T=1.0):", generate_text(logits, temperature=1.0))  # 按原始概率分布采样

# 高温(多样性高)
print("高温 (T=2.0):", generate_text(logits, temperature=2.0))  # 更有可能选择低概率词

3. 不同采样策略影响:Top-K、Top-P和Beam Search

温度参数不仅影响Softmax函数的输出分布,还与其他生成策略如Top-K、Top-P和Beam Search相互作用,进一步影响生成文本的特性。

1. 贪婪搜索(Greedy Search)
  • 机制:每一步只选择概率最高的词。

  • 温度影响:Temperature变化对贪婪搜索影响较小,因为无论分布如何,模型始终选择最大概率的词。

  • 结论:Temperature在此策略下作用有限,生成结果最确定但最缺乏多样性。

2. 采样(Sampling)
  • 机制:根据Softmax输出的概率分布进行采样。

  • 温度影响:

    • 低温度(<1):采样集中在高概率词,生成更保守。

    • 高温度(>1):采样分布更均匀,生成更随机、更创新。

  • 结论:温度是调节采样策略多样性的重要参数,适合用于需要创造性输出的场景(如写故事、诗歌)。

3. 🚩Top-K 采样(常用)
  • 机制:Top-K策略在每个时间步只保留概率最高的K个词,然后从这K个词中随机选择下一个词。温度参数通过调整Softmax函数的输出分布,间接影响Top-K策略的选择。当 T 较大时,概率分布平滑,Top-K策略可能选择更多样的词;当 T 较小时,概率分布尖锐,Top-K策略更倾向于选择概率最高的词。

  • 温度影响:

    • 高温度:Top-K范围内分布更均匀,增加多样性。

    • 低温度:Top-K中高概率词被选中概率更高,生成更确定。

  • 结论:温度与K值共同控制生成的多样性与合理性,适合在质量和多样性之间取得平衡。

4. 🚩Top-P(Nucleus)采样(常用)
  • 机制:选择累计概率超过阈值P的最小词集进行采样。

  • 温度影响:

    • 高温度:Top-P集合中各词概率更接近,采样更随机。

    • 低温度:集合中某个词可能占主导,生成更稳定。

  • 结论:Top-P对温度敏感,能自适应词表分布,是目前广泛使用的生成策略之一。

5. Beam Search(束搜索)
  • 机制:保留多个候选序列,每一步扩展并保留最优的K个路径。

  • 温度影响:

    • 通常不直接应用温度参数,因为Beam Search基于确定性策略,基于排序

    • 但在一些变体中(如Soft Beam Search),温度可被引入以增加路径多样性。

  • 结论:温度对标准Beam Search影响有限,但可作为增强多样性的辅助手段。

4 总结

温度参数是控制文本生成过程中确定性与多样性之间平衡的重要工具。它通过调节Softmax函数输出的概率分布,影响模型在不同解码策略下的输出行为:

对贪婪算法、beam search更更注重概率之间排序这类算法影响不大,但是对随机采样、topK、topP这类按照概率的采样算法影响较大

选择策略

  • 低温度:生成更确定、更保守,适合任务导向型场景(如问答、摘要)。

  • 高温度:生成更随机、更具创造性,适合创意写作、对话生成等任务。

  • 结合不同策略:温度与Top-K、Top-P等策略结合使用,可以在生成质量与多样性之间取得良好平衡。

通过合理使用温度参数,我们可以更好地掌控模型生成文本的风格与质量,从而更好地服务于不同的应用场景。


延伸问题:为什么使用大模型时候,相同的输入可能有不同输出

大模型在生成文本时,通常会基于概率分布选择下一个词。这种概率分布是通过 Softmax 函数对模型的输出进行归一化得到的。因此,生成过程本身是 随机的,具体体现在以下几个方面:

采样方法(Sampling)

  • 在生成文本时,模型可以通过 采样 的方式选择下一个词。例如,从概率分布中随机选择一个词,而不是总是选择概率最高的词。这种随机性会导致相同的输入产生不同的输出。(Temperature会改变概率分布平滑还是尖锐,从而改变低频次出现概率)

Beam Search 的随机

  • 即使使用 Beam Search(一种贪婪搜索算法),如果设置了 num_beams > 1,模型也会探索多个候选序列,这可能导致不同的输出。

Dropout 和随机初始化

  • 在训练和推理时,Dropout 和随机初始化也会引入一定的随机性。

### LLM(大型语言模型)代码实现与解析 #### 使用Transformer架构构建LLM的核心组件 大型语言模型通常基于Transformer架构,该架构通过自注意力机制捕获输入序列中的长期依赖关系[^2]。以下是使用Python和Hugging Face库来加载并运行预训练的LLM的一个简单示例: ```python from transformers import AutoTokenizer, AutoModelForCausalLM # 加载预训练的语言模型及其分词器 tokenizer = AutoTokenizer.from_pretrained("gpt2") # 替换为其他模型名称如"gpt3" model = AutoModelForCausalLM.from_pretrained("gpt2") # 输入文本 input_text = "The capital of France is" # 将文本转换为模型可接受的格式 inputs = tokenizer(input_text, return_tensors="pt") # 获取模型生成的结果 outputs = model.generate(**inputs, max_length=50) # 转换回人类可读的形式 generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print(generated_text) ``` 上述代码展示了如何利用现有的预训练模型完成简单的文本补全任务。`AutoTokenizer`负责将原始字符串转化为适合神经网络处理的张量形式;而`AutoModelForCausalLM`则是用于因果语言建模的具体类。 #### 微调LLM以适配特定任务 尽管大规模预训练赋予了LLM强大的泛化能力,但在实际应用中往往还需要针对具体场景进一步调整参数设置。这一步骤被称为微调(fine-tuning),其目的是让模型更好地服务于目标领域内的需求[^3]。下面是一个关于情感分类的例子: ```python import torch from datasets import load_dataset from transformers import Trainer, TrainingArguments, BertForSequenceClassification, BertTokenizerFast # 数据准备阶段 dataset = load_dataset('imdb') tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased') def preprocess_function(examples): return tokenizer(examples['text'], truncation=True, padding='max_length', max_length=128) encoded_dataset = dataset.map(preprocess_function, batched=True) # 定义模型结构以及优化策略 model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) training_args = TrainingArguments( output_dir='./results', evaluation_strategy="epoch", per_device_train_batch_size=16, per_device_eval_batch_size=64, num_train_epochs=3, weight_decay=0.01, ) trainer = Trainer( model=model, args=training_args, train_dataset=encoded_dataset["train"], eval_dataset=encoded_dataset["test"] ) # 开始训练过程 trainer.train() ``` 这段脚本首先下载IMDB影评数据集,并对其进行必要的前处理操作以便于后续计算。接着实例化了一个二元分类版本的BERT模型,并配置了一些超参控制实验条件。最后借助Trainer API简化整个迭代流程管理。 #### 利用LLM进行高级文档分析 除了基本的文字创作外,现代LLM还擅长解决更加复杂的业务挑战——比如从非结构化的PDF文件里抽取关键信息。相比传统的正则表达式方法,这种方法具备更强健性和灵活性[^4]。考虑这样一个情景:我们需要定位某篇学术文章里的作者姓名列表。可以采用如下方式实现自动化提取功能: ```python from langchain.document_loaders import PyPDFLoader from langchain.chains.summarize import load_summarizer_chain from langchain.prompts.prompt import PromptTemplate from langchain.llms.openai import OpenAI loader = PyPDFLoader("./example_paper.pdf") pages = loader.load_and_split() llm = OpenAI(model_name="text-davinci-003", temperature=0) prompt_template = """Extract the list of authors from this paper. Paper excerpt: {context} Author names:""" PROMPT = PromptTemplate(template=prompt_template, input_variables=["context"]) summarization_chain = load_summarizer_chain(llm=llm, chain_type="map_reduce", prompt=PROMPT) output_summary = summarization_chain(pages[:2]) # 只取前两页作为示范用途 print(output_summary['output_text']) ``` 这里我们引入LangChain框架辅助完成多步逻辑串联工作流设计。它先通过PyPDFLoader模块把源材料拆分成单独页面对象集合;再定制专用Prompt指导OpenAI服务专注于寻找所需条目而非概括全文内容摘要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值