从0开始LLM-词嵌入(embedding)-3

183 阅读3分钟

1. 词位置编码

将 token IDs 转换为连续的向量表示,也就是所谓的 token 编码,作为 LLM 的输入。然而,LLM 的一个缺点是自注意力机制,不包含序列中的 token 位置或顺序信息。

image.png 编码层将 token ID 转换为相同的向量表示,不管其在输入序列中的位置如何。例如,token ID 5 ,无论是在 token ID 输入向量的第一还是第三个位置,都将产生相同的编码向量。

原则上,具有确定性的、与位置无关的编码对于可重现性是有益的。然而,由于LLM的自注意力机制本身也不关注位置,因此将额外的位置信息注入到LLM中是有帮助的。

两种编码方式:

  1. 绝对位置编码:绝对位置编码与序列中的特定位置相关联。对于输入序列中的每个位置,都会添加一个唯一的位置编码到 token 中,来表示其确切位置。

image.png 如图所示,位置编码被添加到 token 中,以创建 LLM 的输入。位置向量具有与原始 token 相同的维度。出于简化考虑,token 编码显示为值为1。

  1. 相对位置编码:相对位置编码不是专注于 token 的绝对位置,而是侧重于 token 之间的相对位置或距离。这意味着模型学习的是 “彼此之间有多远” 而不是 “在哪个确切位置”的关系。这样做的好处是,即使模型在训练过程中没有看到这样的长度,它也可以更好地推广到不同长度的序列。

两种类型的位置编码旨在增强 LLM 理解 token 顺序和关系的能力,确保更准确和更具上下文意识的预测。它们的选择通常取决于具体的应用程序和正在处理的数据的性质。OpenAI 的 GPT 模型使用绝对位置编码,在训练过程中进行了优化,而不是像原始 Transformer 模型中的位置编码那样固定或预定义。

output_dim = 256
vocab_size = 50257
token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim)

max_length = 4
dataloader = create_dataloader_v1(raw_text, batch_size=8, max_length=max_length, stride=max_len)
data_iter = iter(dataloader)
inputs, targets = next(data_iter)

print("\nInputs shape:\n", inputs.shape)  #输出 Inputs shape: torch.Size([8, 4])

token_embeddings = token_embedding_layer(inputs)
print(token_embeddings.shape) #torch.Size([8, 4, 256])

context_length = max_length
pos_embedding_layer = torch.nn.Embedding(context_lengthe, output_dim)
pos_embeddings = pos_embedding_layer(torch.arange(context_length))
print(pos_embeddings.shape) # torch.Size([4, 256])

input_embeddings = token_embeddings + pos_embeddings

print(input_embeddings.shape) #torch.Size([8, 4, 256])

image.png 作为输入处理流程的一部分,输入文本首先被分解为单个 token 。然后使用词汇表将这些标记转换为 token ID。将 token ID 转换为编码向量,然后添加相似大小的位置编码,生成用作主要 LLM 层的输入编码。

在预训练阶段,大型语言模型(LLMs)逐词处理文本。 使用下一个词预测任务训练具有数百万到数十亿参数的大型语言模型,能够产生卓越能力的模型。 这些模型可以进一步微调,以遵循一般指令或执行特定的目标任务。

image.png 上图展示了构建大型语言模型(LLM)的三个主要阶段:在通用文本数据集上预训练LLM,以及在标注数据集上对其进行微调。本章将解释并构建为LLM提供预训练文本数据的数据准备和采样流程。