大模型原理:embedding词元嵌入向量1 作者:马育民 • 2026-01-09 16:17 • 阅读:10001 # 复习 大语言模型的输入文本的准备工作包括: - 文本分词 - 将词元转换为词元ID - 将词元ID转换为嵌入向量 # 介绍 为大语言模型训练准备输入文本的最后一步是将 **词元ID转换为嵌入向量(权重)**,如图: [](https://www.malaoshi.top/upload/0/0/1GW2YkB2jisj.png) 由于类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=) ``` **可知:**词元ID为 `3` 的嵌入向量,是嵌入矩阵中的第 `4` 行(索引从0开始,因此它对应索引为3的行) [](https://www.malaoshi.top/upload/0/0/1GW2YrdXlKNu.png) ### 独热编码(one-hot encoding) 可以将 **嵌入层** 视为一种更有效 **[独热编码](https://www.malaoshi.top/show_1EF3QPTxusan.html "独热编码")** 方法 ### 取出所有词元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=) ``` 过程如下图: [](https://www.malaoshi.top/upload/0/0/1GW2YsZqliVx.png) ### 完整代码 ``` 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)) ``` 原文出处:http://www.malaoshi.top/show_1GW2YriiPo97.html