从0开始LLM-GPT-0

本章介绍

  • 编写类似 GPT 的大型语言模型 (LLM) 编码,该模型可以训练生成类似人类的文本
  • 规范化层激活以稳定神经网络训练
  • 在深度神经网络中添加快捷方式连接以更有效地训练模型
  • 实现 transformer 模块以创建各种大小的 GPT 模型
  • 计算 GPT 模型的参数数量和存储需求

编写 LLM 架构

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

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

yaml 复制代码
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词典中,为了清楚起见,使用简洁的变量名称,并防止长代码行:

  • "vocab_size"是指 50257 个单词的词汇表,由BPE 分词器使用。
  • "context_length"表示模型通过位置嵌入可以处理的最大输入标记数。
  • "emb_dim"表示嵌入大小,将每个标记转换为 768 维向量。
  • "n_heads"表示多头注意力机制中的注意力头计数。
  • "n_layers"指定模型中变压器块的数量。
  • "drop_rate"表示压差机制的强度(0.1 表示隐藏单位下降 10%),以防止过拟合。
  • "qkv_bias"确定是否在多头注意力的线性层中包含偏向量,以进行查询、键和值计算。 一个心智模型,概述了 GPT 架构进行编码的顺序。

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

python 复制代码
import torch
import torch.nn as nn
class 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 logits
class DummyTransformerBlock(nn.Module): #C
    def __init__(self, cfg):
    	super().__init__()
    def forward(self, x): #D
    	return x
class 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 模型的两个文本输入组成的批次进行分词化:

ini 复制代码
import tiktoken
tokenizer = 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实例:

ini 复制代码
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,然后我们可以将其解码为单词。

相关推荐
点云SLAM1 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
木枷2 小时前
NAS-Bench-101: Towards Reproducible Neural Architecture Search
人工智能·物联网
BAOYUCompany3 小时前
暴雨服务器更懂人工智能+
运维·服务器·人工智能
飞哥数智坊3 小时前
Coze实战第17讲:工资条自动拆分+一对一邮件发送
人工智能·coze
cwn_3 小时前
自然语言处理NLP (1)
人工智能·深度学习·机器学习·自然语言处理
点云SLAM3 小时前
PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
人工智能·pytorch·python·计算机视觉·3d深度学习·张量flatten操作·张量数据结构
智海观潮3 小时前
Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构
大数据·人工智能·ai·iceberg·catalog
爱分享的飘哥3 小时前
第三篇:VAE架构详解与PyTorch实现:从零构建AI的“视觉压缩引擎”
人工智能·pytorch·python·aigc·教程·生成模型·代码实战
柏峰电子4 小时前
市政道路积水监测系统:守护城市雨天出行安全的 “智慧防线”
大数据·人工智能·安全
蓑雨春归4 小时前
自主智能Agent如何重塑工作流自动化:技术、经济与未来展望
人工智能·chatgpt·自动化