复习
大语言模型的输入文本的准备工作包括:
- 文本分词
- 将词元转换为词元ID
- 将词元ID转换为嵌入向量
介绍
为大语言模型训练准备输入文本的最后一步是将 词元ID转换为嵌入向量(权重),如图:
由于类GPT大语言模型是使用 反向传播算法(backpropagation algorithm) 训练的深度神经网络,因此需要 连续的向量 表示,即:小数。
在初始阶段,必须用 随机值 初始化这些嵌入权重
例子
演示词元ID转换为嵌入向量的工作原理。
词元
假设有4个ID分别为2、3、5和1的输入词元
input_ids = torch.tensor([2, 3, 5, 1])
创建嵌入层
为简单起见,假设有一张仅包含 6 个单词的小型词汇表(BPE分词器中包含 50257个单词的词汇表),并且创建维度为 3 的嵌入(GPT-3的嵌入维度是 12288),通过PyTorch创建嵌入层。
提示:为了确保结果的可重复性,可以将随机种子设置为 123
# 词汇表数量
vocab_size = 6
# 维度
output_dim = 3
# 设置随机种子
torch.manual_seed(123)
# 创建嵌入层
embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
print("权重:")
print(embedding_layer.weight)
执行结果,嵌入层的权重:
权重:
Parameter containing:
tensor([[ 0.3374, -0.1778, -0.1690],
[ 0.9178, 1.5810, 1.3010],
[ 1.2753, -0.2010, -0.1606],
[-0.4015, 0.9666, -1.1481],
[-1.1589, 0.3255, -0.6315],
[-2.8400, -0.7849, -1.4096]], requires_grad=True)
权重结构 6行3列,其中:
- 每一行对应词汇表中的一个词元
- 每一列则对应一个嵌入维度。
嵌入层的权重矩阵由 小随机数 构成。作为模型优化工作的一部分,这些值将在大语言模型 训练过程中被优化。
根据一个词元ID取权重
取出词元ID是 3 的嵌入向量:
# 根据词元ID获取嵌入向量
print()
print("取出词元ID是 3 的嵌入向量:")
print(embedding_layer(torch.tensor([3])))
执行结果:
根据词元ID 3 获取嵌入向量:
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
可知:词元ID为 3 的嵌入向量,是嵌入矩阵中的第 4 行(索引从0开始,因此它对应索引为3的行)
独热编码(one-hot encoding)
可以将 嵌入层 视为一种更有效 独热编码 方法
取出所有词元ID的向量
# 根据词元ID获取所有嵌入向量
print()
print("根据词元ID input_ids 获取所有嵌入向量:")
print(embedding_layer(input_ids))
执行结果:
根据词元ID input_ids 获取所有嵌入向量:
tensor([[ 1.2753, -0.2010, -0.1606],
[-0.4015, 0.9666, -1.1481],
[-2.8400, -0.7849, -1.4096],
[ 0.9178, 1.5810, 1.3010]], grad_fn=<EmbeddingBackward0>)
过程如下图:
完整代码
import torch
# 词元
input_ids = torch.tensor([2, 3, 5, 1])
vocab_size = 6
output_dim = 3
torch.manual_seed(123)
# 创建嵌入层
embedding_layer = torch.nn.Embedding(vocab_size, output_dim)
print("权重:")
print(embedding_layer.weight)
# 根据词元ID获取嵌入向量
print()
print("根据词元ID 3 获取嵌入向量:")
print(embedding_layer(torch.tensor([3])))
# 根据词元ID获取所有嵌入向量
print()
print("根据词元ID input_ids 获取所有嵌入向量:")
print(embedding_layer(input_ids))


