【第四章:大模型(LLM)】05.LLM实战: 实现GPT2-(6)贪婪编码,temperature及tok原理及实现

第四章:大模型(LLM)

第五部分:LLM实战: 实现GPT2

第六节:贪婪编码,temperature及tok原理及实现


1. 贪婪解码(Greedy Decoding)

在 GPT-2 等自回归语言模型中,文本生成是一步步预测下一个 token 的过程。
贪婪解码(Greedy Decoding)是最简单的一种生成策略:

  • 在每一步预测中,直接选择概率最大的下一个 token。

  • 优点:速度快、实现简单。

  • 缺点:可能陷入局部最优,导致生成的文本缺乏多样性。

公式:

PyTorch 实现示例:

python 复制代码
def greedy_decode(model, tokenizer, prompt, max_length=50):
    tokens = tokenizer.encode(prompt, return_tensors='pt')
    for _ in range(max_length):
        logits = model(tokens).logits
        next_token = torch.argmax(logits[:, -1, :], dim=-1)
        tokens = torch.cat([tokens, next_token.unsqueeze(0)], dim=1)
    return tokenizer.decode(tokens[0])

2. Temperature 参数

在生成任务中,Temperature 用于控制模型输出分布的"平滑度":

  • Temperature = 1:正常 softmax 概率。

  • Temperature < 1:放大高概率 token 的差距,使模型更保守(确定性更高)。

  • Temperature > 1:平滑概率分布,使低概率 token 更容易被采样(多样性更高)。

修改 logits 的方式:

实现:

python 复制代码
def apply_temperature(logits, temperature=1.0):
    return logits / temperature

3. Token 原理

GPT-2 使用 Byte Pair Encoding (BPE) 分词:

  • 将文本切分为子词单元(subword),常见词保持完整,生僻词拆分成多个子单元。

  • 英文可以按空格分词,但 BPE 能更好地兼顾词汇表大小与覆盖率。

  • 中文 BPE 会将常用字、常用词直接作为 token,罕见组合才拆分。

优点:

  • 减少词表大小,降低模型参数量。

  • 能处理 OOV(未登录词)问题。

简单 BPE 分词示例:

python 复制代码
from transformers import GPT2Tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
tokens = tokenizer.encode("机器学习是一门有趣的学科")
print(tokens)         # Token ID 列表
print(tokenizer.decode(tokens))  # 再解码回文本

4. 结合实现:带 Temperature 的贪婪解码

python 复制代码
import torch

def generate_with_temperature(model, tokenizer, prompt, max_length=50, temperature=1.0):
    tokens = tokenizer.encode(prompt, return_tensors='pt')
    for _ in range(max_length):
        logits = model(tokens).logits[:, -1, :]
        logits = logits / temperature  # 调整温度
        probs = torch.softmax(logits, dim=-1)
        next_token = torch.argmax(probs, dim=-1)
        tokens = torch.cat([tokens, next_token.unsqueeze(0)], dim=1)
    return tokenizer.decode(tokens[0])

# 使用示例
# result = generate_with_temperature(model, tokenizer, "从前有座山", temperature=0.7)
# print(result)

5. 小结表格

概念 功能 优点 缺点
贪婪解码 每步选概率最大 token 简单、快 缺乏多样性
Temperature < 1 让模型更确定 连贯性高 容易重复
Temperature > 1 增加多样性 生成有创意 容易偏离主题
Token(BPE) 压缩词表,子词编码 减少参数 分词依赖预训练
相关推荐
冻柠檬飞冰走茶7 分钟前
PTA基础编程题目集 7-11 分段计算居民水费(C语言实现)
c语言·开发语言·算法
An_s9 分钟前
Java Spring Boot+vue3文件管理系统
java·开发语言
名字还没想好☜18 分钟前
Go for-range 循环变量陷阱:goroutine 里全打印同一个值(Go 1.22 前后差异)
开发语言·后端·golang·go
用户20187928316719 分钟前
彻底搞懂LayoutInflater、ViewInflater与textViewStyle优先级:XML属性为何能覆盖全局样式?
android
达达尼昂22 分钟前
AI Native 工程实践:如何为 Claude 5 设计更有效的上下文
android·人工智能·后端
倒流时光三十年32 分钟前
第一阶段 05 · Java 客户端查询类详解(Query / SearchCriteria / Response 与复杂拼接)
java·开发语言·python
心平气和量大福大41 分钟前
C#-WPF-控件-LiveChart图表-线性2(LineSeries)-数据绑定
开发语言·c#·wpf
lingran__1 小时前
C++_stack和queue和priority_queue(容器适配器)
开发语言·c++
Cry丶1 小时前
【已解决】adb devices 能识别手机,但 HBuilderX 搜索不到设备的避坑指南
android·adb·uni-app·hbuilderx·真机调试
::呵呵哒::1 小时前
java中SseEmitter
java·开发语言