掘金 人工智能 07月30日 10:27
从0开始LLM-GPT-0
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文详细介绍了如何编写类似GPT(Generative Pretrained Transformer)的大型语言模型(LLM),涵盖了其核心架构的构建,包括词汇表大小、上下文长度、嵌入维度、注意力头数、层数等关键配置参数的定义。文章通过Python代码示例,展示了模型中嵌入层、Transformer模块、层归一化以及输出层的实现,并解释了数据流向。此外,还讲解了如何使用分词器处理文本输入,以及如何计算模型的参数数量和存储需求,为理解和实践LLM打下了基础。

✨ **LLM架构解析:** GPT模型的核心是Transformer架构,由嵌入层、多个Transformer模块、层归一化和线性输出层组成。每个Transformer模块包含多头自注意力机制,用于处理序列数据并生成文本。文章通过`GPT_CONFIG_124M`字典详细列出了构建1.24亿参数模型所需的配置项,如词汇表大小、上下文长度、嵌入维度、注意力头数、层数、dropout率和QKV偏置。

🚀 **模型实现与数据流:** 使用PyTorch构建`DummyGPTModel`类,其中包含标记嵌入、位置嵌入、Dropout、Transformer块序列、最终层归一化和输出线性层。`forward`方法描述了数据从输入索引到输出logits的整个处理流程,包括嵌入计算、位置编码叠加、Dropout应用、Transformer块处理、层归一化和最终的线性变换,为理解模型内部运作提供了清晰的路径。

📝 **文本处理与编码:** 文章演示了如何使用`tiktoken`分词器将文本输入(如“Every effort moves you”和“Every day holds a”)转换为模型可以理解的标记ID。这些标记ID随后被转换为嵌入向量,并输入到模型中进行处理。输出结果是一个形状为`[2, 4, 50257]`的张量,表示两个输入文本样本,每个样本包含4个标记,每个标记对应一个50257维的向量,该维度等于词汇表大小。

🔧 **训练稳定与效率:** 文章提及了规范化层激活以稳定神经网络训练,以及在深度神经网络中添加快捷方式连接以更有效地训练模型。虽然代码中使用了占位符`DummyTransformerBlock`和`DummyLayerNorm`,但这些是实现完整Transformer和层归一化功能的基础,为后续的实际训练和优化奠定了框架。

本章介绍

编写 LLM 架构

LLM,例如 GPT(代表 Generative Pretrained Transformer),是大型深度神经网络架构,旨在一次生成一个单词(或标记)的新文本。

GPT 模型的心智模型:提供了类似 GPT 的 LLM 的自上而下的视图,其中突出显示了其主要组件。在嵌入层旁边,它由一个或多个变压器模块组成,其中包含在上一章中实现的掩蔽多头注意力模块。以下 Python 字典指定小型 GPT-2 模型的配置,将在后面的代码示例中使用该字典:

GPT_CONFIG_124M = {"vocab_size": 50257,      # Vocabulary size    "context_length": 1024,   # Context length    "emb_dim": 768,           # Embedding dimension    "n_heads": 12,            # Number of attention heads    "n_layers": 12,           # Number of layers    "drop_rate": 0.1,         # Dropout rate    "qkv_bias": False         # Query-Key-Value bias}

在GPT_CONFIG_124M词典中,为了清楚起见,使用简洁的变量名称,并防止长代码行:

第 1 步开始,一个占位符 GPT 主干,称之为 DummyGPTModel:

import torchimport torch.nn as nnclass DummyGPTModel(nn.Module):    def __init__(self, cfg):        super().__init__()        self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"])        self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"])        self.drop_emb = nn.Dropout(cfg["drop_rate"])        self.trf_blocks = nn.Sequential(        *[DummyTransformerBlock(cfg) for _ in range(cfg["n_layers"])]) #A        self.final_norm = DummyLayerNorm(cfg["emb_dim"]) #B        self.out_head = nn.Linear(        cfg["emb_dim"], cfg["vocab_size"], bias=False        )    def forward(self, in_idx):        batch_size, seq_len = in_idx.shape        tok_embeds = self.tok_emb(in_idx)        pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device))        x = tok_embeds + pos_embeds        x = self.drop_emb(x)        x = self.trf_blocks(x)        x = self.final_norm(x)        logits = self.out_head(x)        return logitsclass DummyTransformerBlock(nn.Module): #C    def __init__(self, cfg):    super().__init__()    def forward(self, x): #D    return xclass DummyLayerNorm(nn.Module): #E    def __init__(self, normalized_shape, eps=1e-5): #F    super().__init__()    def forward(self, x):    return x

此代码中的 DummyGPTModel 类使用 PyTorch 的神经网络模块 (nn.模块)。DummyGPTModel 类中的模型架构由标记和位置嵌入、dropout、一系列转换器块 (DummyTransformerBlock)、最终层归一化 (DummyLayerNorm) 和线性输出层 (out_head) 组成。配置是通过 Python 字典传入的。

forward 方法描述了通过模型的数据流:它计算输入索引的标记和位置嵌入,应用 dropout,通过 transformer 模块处理数据,应用归一化,最后使用线性输出层生成 logits。

在上面的代码中,使用了占位符(DummyLayerNorm 和 DummyTransformerBlock)来实现转换器块和层规范化。

图显示如何标记、嵌入和馈送到 GPT 模型的输入数据的概述。在 LLM 中,嵌入的输入令牌维度通常与输出维度匹配。

使用之前介绍的 tiktoken 分词器对 GPT 模型的两个文本输入组成的批次进行分词化:

import tiktokentokenizer = tiktoken.get_encoding("gpt2")batch = []txt1 = "Every effort moves you"txt2 = "Every day holds a"batch.append(torch.tensor(tokenizer.encode(txt1)))batch.append(torch.tensor(tokenizer.encode(txt2)))batch = torch.stack(batch, dim=0)print(batch)#结果tensor([[ 6109, 3626, 6100, 345], #A        [ 6109, 1110, 6622, 257]])

初始化一个1.24亿参数的DummyGPTModel实例:

torch.manual_seed(123)model = DummyGPTModel(GPT_CONFIG_124M)logits = model(batch)print("Output shape:", logits.shape)print(logits)#结果Output shape: torch.Size([2, 4, 50257])tensor([[[-1.2034, 0.3201, -0.7130, ..., -1.5548, -0.2390, -0.4667],         [-0.1192, 0.4539, -0.4432, ..., 0.2392, 1.3469, 1.2430],         [ 0.5307, 1.6720, -0.4695, ..., 1.1966, 0.0111, 0.5835],         [ 0.0139, 1.6755, -0.3388, ..., 1.1586, -0.0435, -1.0400]],        [[-1.0908, 0.1798, -0.9484, ..., -1.6047, 0.2439, -0.4530],         [-0.7860, 0.5581, -0.0610, ..., 0.4835, -0.0077, 1.6621],         [ 0.3567, 1.2698, -0.6398, ..., -0.0162, -0.1296, 0.3717],         [-0.2407, -0.7349, -0.5102, ..., 2.0057, -0.3694, 0.1814]]],       grad_fn=<UnsafeViewBackward0>)

输出张量有两行对应于两个文本样本。每个文本样本由 4 个标记组成;每个标记都是一个 50,257 维的向量,与标记器词汇表的大小相匹配。

嵌入有 50,257 个维度,因为每个维度都引用词汇表中的唯一标记。后处理代码时,将把这些 50,257 维的向量转换回标记 ID,然后我们可以将其解码为单词。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

GPT 大型语言模型 Transformer PyTorch 自然语言处理
相关文章