【零基础学AI】第36讲:GPT模型原理

本节课你将学到

  • 理解GPT模型的基本原理
  • 掌握Transformer解码器的工作机制
  • 实现一个简单的文本生成应用

开始之前

环境要求

  • Python 3.8+
  • 安装包:pip install transformers torch
  • 硬件:CPU即可运行(GPU可加速)

前置知识

  • 了解基本的神经网络概念(第23讲内容)
  • 熟悉Python编程基础

核心概念

什么是GPT?

GPT(Generative Pre-trained Transformer)是一种强大的文本生成模型,就像一个有超强记忆力的作家:

传统写作:你告诉作家每个字写什么
GPT写作:你给作家看很多书,它自己学会写作风格和知识

Transformer解码器原理

想象你在玩"词语接龙"游戏:

  1. 输入提示:你说"今天天气"
  2. 预测下一个词:模型像玩家一样思考可能接的词(如"晴朗")
  3. 自回归生成:把生成的词再加到输入中,继续预测下一个词

这就是GPT的核心机制——基于前面所有词预测下一个词。

关键特点

  • 单向注意力:只能看到前面的词(不像BERT能看到前后)
  • 预训练+微调:先海量数据学习通用知识,再针对特定任务调整
  • 上下文理解:能记住长达几千字的上下文关系

代码实战

1. 加载预训练模型

from transformers import GPT2LMHeadModel, GPT2Tokenizer

# 加载GPT-2模型和分词器(小规模模型,适合教学演示)
# 第一次运行会自动下载模型文件(约500MB)
model = GPT2LMHeadModel.from_pretrained("gpt2")
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

# 设置模型为评估模式(不更新权重)
model.eval()

2. 文本生成函数

def generate_text(prompt, max_length=50):
    # 将输入文本转换为模型能理解的数字ID
    input_ids = tokenizer.encode(prompt, return_tensors="pt")
    
    # 生成文本
    output = model.generate(
        input_ids,
        max_length=max_length,          # 生成的最大长度
        num_return_sequences=1,         # 生成几个结果
        no_repeat_ngram_size=2,         # 避免重复短语
        do_sample=True,                 # 随机采样
        top_k=50,                       # 从概率最高的50个词中选
        temperature=0.7,                # 控制随机性(0.1-1.0)
    )
    
    # 将生成的ID转换回文本
    generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
    return generated_text

3. 运行文本生成

# 输入你的提示词
prompt = "人工智能的未来发展"

# 生成文本
result = generate_text(prompt, max_length=100)

# 打印结果
print("生成的文本:")
print(result)

⚠️ 常见错误

  1. 内存不足:如果报错CUDA out of memory,尝试:

    • 减小max_length
    • 添加model.to('cpu')强制使用CPU
  2. 下载失败:如果模型下载失败:

    • 检查网络连接
    • 手动下载:https://huggingface.co/gpt2

完整项目

项目结构

lesson_36_gpt/
├── gpt_demo.py          # 主程序文件
├── requirements.txt     # 依赖文件
└── README.md            # 说明文档

requirements.txt

transformers==4.28.1
torch==2.0.0

gpt_demo.py 完整代码

from transformers import GPT2LMHeadModel, GPT2Tokenizer

def init_model():
    print("正在加载GPT-2模型...")
    model = GPT2LMHeadModel.from_pretrained("gpt2")
    tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
    model.eval()
    return model, tokenizer

def generate_text(model, tokenizer, prompt, max_length=50):
    input_ids = tokenizer.encode(prompt, return_tensors="pt")
    output = model.generate(
        input_ids,
        max_length=max_length,
        num_return_sequences=1,
        no_repeat_ngram_size=2,
        do_sample=True,
        top_k=50,
        temperature=0.7,
    )
    return tokenizer.decode(output[0], skip_special_tokens=True)

if __name__ == "__main__":
    model, tokenizer = init_model()
    
    print("\nGPT-2文本生成演示(输入'quit'退出)")
    while True:
        prompt = input("\n请输入提示词:")
        if prompt.lower() == 'quit':
            break
            
        print("\n生成结果:")
        print(generate_text(model, tokenizer, prompt))

运行效果

控制台输出示例

正在加载GPT-2模型...
GPT-2文本生成演示(输入'quit'退出)

请输入提示词:人工智能的未来发展

生成结果:
人工智能的未来发展将会深刻改变人类社会的方方面面。从医疗诊断到自动驾驶,从智能家居到教育领域,AI技术将不断提高效率和精确度。专家预测,到2030年,AI可能会创造超过2000万个新的就业岗位,同时也会取代部分重复性工作...

常见问题

Q1: 如何生成更长的文本?

修改max_length参数,但注意:

  • 值越大需要的内存越多
  • 超过1024可能需要使用GPT-3等更大模型

Q2: 为什么生成的文本有时不合理?

尝试调整参数:

  • 降低temperature值(如0.3)减少随机性
  • 增大top_k值(如100)扩大候选词范围

Q3: 如何用于中文文本生成?

使用中文优化模型:

model_name = "uer/gpt2-chinese-cluecorpussmall"
model = GPT2LMHeadModel.from_pretrained(model_name)

课后练习

  • 尝试不同的temperature值(0.1-1.5),观察生成效果差异
  • 用中文提示词测试,比较中英文生成质量
  • 扩展功能:让程序把生成结果保存到txt文件

扩展阅读

  • The Illustrated GPT-2
  • HuggingFace Transformers文档

你可能感兴趣的:(0基础学AI,人工智能,gpt,lstm,rnn,YOLO,目标检测)