Learning "Build a Large Language Model (From Scratch)"
Learning "Build a Large Language Model (From Scratch)"
学习《Build a Large Language Model (From Scratch)》一书
《Build a Large Language Model (From Scratch)》
- Author: Sebastian Raschka
- BOOK: Build a Large Language Model (From Scratch)
- GitHub: rasbt/LLMs-from-scratch
- 中英文pdf版本, 可联系我获取
- 如有侵权,请联系删除
参考
setup/01_optional-python-setup-preferences
.setup/02_installing-python-libraries
按照步骤配置环境:
代码语言:javascript代码运行次数:0运行复制git clone --depth 1 .git
cd LLMs-from-scratch
conda create -n LLMs python=.10
conda activate LLMs
conda install jupyterlab watermark
pip install -r
在这里遇到了以下问题:
解决方案:
代码语言:javascript代码运行次数:0运行复制hash -r
解释:
hash
是一个 Bash 内建命令,用于查并记住命令的位置。如果你在安装了新的软件之后,想要立即使用它,但是 Bash 仍然使用旧的命令,那么你可以使用hash -r
命令来刷新 Bash 的命令缓存。
Chapter 01
Chapter 02
目录:
- 2.1 Understanding word embeddings
- 2.2 Tokenizing text
- 2. Converting tokens into token IDs
- 2.4 Adding special context tokens
- 2.5 Byte pair encoding
- 2.6 Data sampling with a sliding window
- 2.7 Creating token embeddings
- 2.8 Encoding word positi
- 2.9 Summary
- 什么是Token?
- Token是指文本的最小单位,可以是一个字、一个单词或一个子词。
- 例如,句子 “I love LP” 可以被分解为 “I”, “love”, “LP”。
- 什么是Token ID?
- 每个Token会被映射到一个唯一的数字ID。
- 假设我们有一个词汇表:“I”, “love”, “LP”, “AI”,其中:
- “I” 的ID是0
- “love” 的ID是1
- “LP” 的ID是2
- “AI” 的ID是
- 为什么需要嵌入(Embedding)?
- 模型无法直接处理文字或数字ID,我们需要将这些ID转为具有实际意义的向量(连续值表示)。
- 比如,“LP”的ID是2,我们可能需要一个三维向量 1.2, -0.4, 0.6 来表示它。
dataloader = create_dataloader_v1(raw_text, batch_size=8, max_length=4, stride=4)
其中参数:
raw_text
是原始文本。batch_size
是批量大小。max_length
是滑动窗口的大小。stride
是滑动窗口的步长。
步骤1:定义Token ID和词汇表
假设我们有4个Token,其ID是 2, , 5, 1,词汇表的大小为6。
import torch
input_ids = (2, , 5, 1) # Token的ID
vocab_size = 6 # 假设词汇表有6个单词
output_dim = # 我们希望嵌入是维向量
代码语言:javascript代码运行次数:0运行复制- input_ids 是一个张量,表示我们的输入文本。
- vocab_size 是词汇表的大小,也就是可能的Token ID的总数。
- output_dim 是嵌入向量的维度。
步骤2:创建嵌入层
_seed(12) # 设置随机种子,结果可复现
embedding_layer = Embedding(vocab_size, output_dim) # 创建嵌入层
代码语言:javascript代码运行次数:0运行复制- Embedding 是PyTorch提供的嵌入层,用于将Token ID映射为向量。
- 嵌入层的权重矩阵是随机初始化的。
权重矩阵的形状为 (vocab_size, output_dim)。
假设随机初始化后为:
tensor([ 0.1, -0.2, 0.,
代码语言:txt复制 [ 0.4, 0.5, -0.6],
代码语言:txt复制 [ 0.7, -0.8, 0.9],
代码语言:txt复制 [ 1.0, -1.1, 1.2],
代码语言:txt复制 [-1., 1.4, -1.5],
代码语言:txt复制 [ 1.6, -1.7, 1.8]])
代码语言:javascript代码运行次数:0运行复制- 每一行是一个Token ID对应的嵌入向量。
- 比如,Token ID为2的嵌入向量是 [0.7, -0.8, 0.9]。
步骤:查询嵌入向量
embedding_vector = embedding_layer((2))
print(embedding_vector)
输出:
tensor([0.7, -0.8, 0.9])
解释:
代码语言:javascript代码运行次数:0运行复制- 这段代码从嵌入层中查Token ID为2的向量,也就是矩阵中的第行(索引从0开始)。
扩展到批量处理:
print(embedding_layer(input_ids))
输出:
tensor([ 0.7, -0.8, 0.9, # ID 2
代码语言:txt复制 [ 1.0, -1.1, 1.2], # ID
代码语言:txt复制 [ 1.6, -1.7, 1.8], # ID 5
代码语言:txt复制 [ 0.4, 0.5, -0.6]]) # ID 1
2.8 位置编码(Positional Encoding)
问题:为什么需要位置编码?
嵌入层只能将Token ID映射为向量,但无法表示Token的位置。
例如:
代码语言:javascript代码运行次数:0运行复制- 对于句子 “I love LP” 和 “LP love I”,它们的Token是一模一样的,但顺序完全不同。
为了让模型区分位置,我们需要给每个Token加上位置信息。
步骤1:创建位置嵌入
context_length = 4 # 假设句子长度为4
output_dim = # 嵌入维度与Token嵌入相同
pos_embedding_layer = Embedding(context_length, output_dim) # 位置嵌入层
假设位置嵌入层初始化后的权重矩阵是:
代码语言:javascript代码运行次数:0运行复制tensor([[ 0.1, 0.2, -0.], # 位置0
[ 0.4, -0.5, 0.6], # 位置1
[-0.7, 0.8, -0.9], # 位置2
[ 1.0, -1.1, 1.2]]) # 位置
步骤2:查位置嵌入
代码语言:javascript代码运行次数:0运行复制position_ids = torch.arange(context_length) # 生成位置ID [0, 1, 2, ]
pos_embeddings = pos_embedding_layer(position_ids) # 查询位置向量
print(pos_embeddings)
输出:
代码语言:javascript代码运行次数:0运行复制tensor([[ 0.1, 0.2, -0.], # 位置0
[ 0.4, -0.5, 0.6], # 位置1
[-0.7, 0.8, -0.9], # 位置2
[ 1.0, -1.1, 1.2]]) # 位置
步骤:将Token嵌入和位置嵌入相加
假设之前的Token嵌入为
代码语言:javascript代码运行次数:0运行复制token_embeddings = embedding_layer(input_ids)
将Token嵌入与位置嵌入相加
代码语言:javascript代码运行次数:0运行复制input_embeddings = token_embeddings + pos_embeddings
print(input_embeddings)
输出:
代码语言:javascript代码运行次数:0运行复制tensor([[ 0.8, -0.6, 0.6], # Token ID 2 + 位置 0
[ 1.4, -1.6, 1.8], # Token ID + 位置 1
[ 0.9, -0.9, 0.9], # Token ID 5 + 位置 2
[ 1.4, -0.6, 0.6]]) # Token ID 1 + 位置
解释:
- 每个Token的向量中都加入了对应位置的位置信息。
- 新生成的向量将用于模型的下一步处理。
总结
- 嵌入层:
- 将Token ID映射为连续向量表示。
- 初始向量随机生成,随着训练不断优化。
- 位置嵌入:
- 给每个Token附加位置信息,帮助模型理解顺序。
- 最终输入:
- Token嵌入和位置嵌入相加,生成模型的输入。
Chapter 0
文章作者: Alan Zeng
原始链接: /
版权说明:本博客所有文章除特别声明外,均采用BY-C-SA 4.0许可协议。获得许可后,要求转载时注明文章出处和网站链接,谢谢!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-09-29,如有侵权请联系 cloudcommunity@tencent 删除token编码模型buildmodel#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 8 条评论) |
本站网友 过敏性紫癫 | 27分钟前 发表 |
“LP”的ID是2 | |
本站网友 浴场 | 18分钟前 发表 |
生成模型的输入 | |
本站网友 什么是软交换 | 12分钟前 发表 |
结果可复现embedding_layer = Embedding(vocab_size | |
本站网友 北京开元名都大酒店 | 16分钟前 发表 |
-1.5] | |
本站网友 挽面 | 6分钟前 发表 |
位置嵌入:给每个Token附加位置信息 | |
本站网友 双井家乐福 | 2分钟前 发表 |
0.9] | |
本站网友 四生丸 | 23分钟前 发表 |
# 位置1 [-0.7 |