大模型原理:embedding词元嵌入向量1

复习

大语言模型的输入文本的准备工作包括:

  • 文本分词
  • 将词元转换为词元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))

原文出处:/show_1GW2YriiPo97.html