当前位置: 首页 > news >正文

【第四章:大模型(LLM)】05.LLM实战: 实现GPT2-(1)文本token到Embedding的代码实现

第四章:大模型(LLM)

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

第一节:文本token到Embedding的代码实现

本节目标:

1. 从自然语言到 Token

在 GPT-2 中,自然语言需要被分词器(Tokenizer)处理为离散 token id。

示例文本:
text = "Hello, how are you?"
使用 HuggingFace 的 GPT-2 Tokenizer:
from transformers import GPT2Tokenizertokenizer = GPT2Tokenizer.from_pretrained("gpt2")
token_ids = tokenizer.encode(text, return_tensors="pt")print("Token IDs:", token_ids)
print("解码结果:", tokenizer.decode(token_ids[0]))
输出(示意):
Token IDs: tensor([[15496, 11, 703, 389, 345]])
解码结果: Hello, how are you?

GPT-2 使用的是 Byte Pair Encoding(BPE) 分词方式,将词语分成子词或字符级别的单位,更利于处理罕见词和拼写变体。


2. 将 Token IDs 转换为 Embedding

GPT-2 模型的输入是一个张量(tensor),需要用 embedding 层将 token ids 转换为连续向量。

GPT-2 的输入嵌入层包括两部分:

  • 词嵌入(token embedding)

  • 位置嵌入(position embedding)

用 PyTorch 自定义实现:
import torch
import torch.nn as nnvocab_size = tokenizer.vocab_size        # 词表大小
embedding_dim = 768                      # GPT-2 small 模型的默认维度
max_position_embeddings = 1024           # 支持的最大序列长度# 定义词嵌入和位置嵌入
token_embedding = nn.Embedding(vocab_size, embedding_dim)
position_embedding = nn.Embedding(max_position_embeddings, embedding_dim)# 输入 token
input_ids = token_ids  # 形状: [batch_size, seq_len]
seq_len = input_ids.size(1)# 生成位置索引
position_ids = torch.arange(seq_len, dtype=torch.long).unsqueeze(0)  # [1, seq_len]# 获取嵌入向量
token_embeds = token_embedding(input_ids)
position_embeds = position_embedding(position_ids)# 最终输入嵌入(两者相加)
input_embeddings = token_embeds + position_embedsprint("Input Embedding shape:", input_embeddings.shape)  # [1, seq_len, embedding_dim]

总结:本节核心要点

步骤说明作用
文本分词使用 GPT2Tokenizer 将文本编码为 token ids离散化
词嵌入将 token id 映射到 dense vector表示 token 含义
位置嵌入编码 token 在序列中的位置信息保留顺序信息
叠加嵌入token_embed + position_embed构成输入层向量

小贴士:

  • GPT-2 的 Tokenizer 是 无空白区分的,因此多个词可能被拆成子词。

  • 所有嵌入层参数是可训练的,会在训练过程中被更新。

  • 若手动构建模型,需确保 embedding 的 shape 与 Transformer 模块匹配。

http://www.dtcms.com/a/322812.html

相关文章:

  • 【数据分享】各省农业土地流转率(2010-2023)
  • Easysearch 冷热架构实战
  • 分治-快排-面试题 17.14.最小k个数-力扣(LeetCode)
  • Redhat Linux 9.6 配置本地 yum 源
  • 【数据结构入门】栈和队列
  • 网盘短剧资源转存项目源码 支持垮克 带后台 附教程
  • Kafka服务端NIO操作原理解析(二)
  • MX 播放器:安卓设备上的全能视频播放器
  • 【解决方法】华为电脑的亮度调节失灵
  • 本地部署接入 whisper + ollama qwen3:14b 总结字幕
  • 服务机器人选择屏幕的逻辑
  • 微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式
  • Orange的运维学习日记--37.iSCSI详解与服务部署
  • FreeRTOS学习笔记:任务通知和软件定时器
  • jQuery 零基础学习第一天
  • 数据结构—二叉树及gdb的应用
  • 【贪心】P4873 [USACO14DEC] Cow Jog G|省选-
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区
  • llm本地部署+web访问+交互
  • Oracle字段操作
  • [TryHackMe]Challenges---Game Zone游戏区
  • 力扣热题100-----118.杨辉三角
  • Kettle ETL 工具存在的问题以及替代方案的探索
  • Arm Development Studio 安全通告:CVE-2025-7427
  • 什么情况下需要JVM调优?
  • Java-file类
  • 力扣 30 天 JavaScript 挑战 第二题笔记
  • 每日算法刷题Day59:8.9:leetcode 队列8道题,用时2h30min
  • 【攻防实战】从外到内全链路攻防实战纪实
  • python---类型别名