【AI 大模型】GPT 大模型训练架构 ( Transformer 架构 | 编码器和解码器 | 输入序列的位置编码 | 自注意力机制编码流程 | Transformer 训练代码示例 )

2024-06-28 10:13:10 浏览数 (2)

文章目录

  • 一、GPT 大模型训练架构 - Transformer 架构
    • 1、Transformer 架构
    • 2、Transformer 架构的编码器和解码器
    • 3、输入序列的位置编码
    • 4、自注意力机制编码流程
    • 5、OpenAI 开源的训练 GPT 大模型的 Transformer 代码
    • 6、Transformer 代码示例

一、GPT 大模型训练架构 - Transformer 架构


1、Transformer 架构

Transformer 架构 是 Google 设计的 , 当前最流行的 GPT 大模型 都使用的该架构 , 最著名的就是 OpenAI 的 ChatGPT 大模型 ;

Transformer 架构 是一种用于 处理序列数据 的深度学习模型架构 , 主要用于解决 自然语言处理 NLP 领域中的序列建模任务 ;

2、Transformer 架构的编码器和解码器

Transformer 架构 由 编码器 和 解码器 两部分组成 , 每个部分都包含 多层堆叠的 自注意力机制 和 前馈神经网络 ;

  • 编码器 : 负责 将 输入序列 转换为一系列 向量表示 ;
    • 自注意力机制 : 计算输入序列中每个位置与其他所有位置的相关性 , 来捕捉序列中的依赖关系 ;
    • 前馈神经网络 : 每层包含一个前馈神经网络 , 组成了两层全连接网络 , 用于进一步转换自注意力机制的输出 ;
  • 解码器 : 根据 向量表示 生成 输出序列 ;
    • 掩码自注意力机制 : 在计算 注意力权重 时添加一个掩码 , 使得当前位置只能关注到它之前的输入 , 确保当前位置的输出只依赖于之前的输入 ;

3、输入序列的位置编码

自注意力机制 允许 训练的大模型 在一个 输入序列 中的 各个位置 之间 建立 全局依赖关系 ;

使用 位置编码 来为 输入序列 中的 每个位置 标记 位置信息 , 位置编码 将 位置信息 编码成一个 固定维度 的向量 , 这样 训练的模型 可以区分不同位置的 词语 ;

在计算每个位置的表示时 , 同时 考虑到 序列中所有其他位置的信息 , 这对于捕捉 长距离依赖 特别有效 ;

4、自注意力机制编码流程

自注意力机制 训练 / 编码 流程 :

  • 首先 , 计算 输入序列 中 每个位置的 查询 Query 、 键 Key 、 值 Value 的 向量 ;
  • 然后 , 计算 查询向量 与所有 键向量 的点积 , 同时应用 softmax 函数 得到每个位置的 注意力 权重 ;
  • 最后 , 根据这些 注意力权重 对 值向量 进行 加权求和 , 得到 每个位置 的 输出向量 ;

5、OpenAI 开源的训练 GPT 大模型的 Transformer 代码

下面是 OpenAI 开源的训练 GPT 大模型的 Transformer 代码 :

  • finetune-transformer-lm 项目 : https://github.com/openai/finetune-transformer-lm/tree/master
  • 核心 main 函数入口代码 : https://github.com/openai/finetune-transformer-lm/blob/master/train.py

在 GPT 领域 , 代码并不是难点 , 难点是 数据的处理 和 算力 , 训练 GPT 大模型的代码量很少 ;

6、Transformer 代码示例

GPT 大模型训练 的 Transformer 代码 : 具体的 GPT 大模型训练流程 , 可参考代码中的注释 ;

  • 代码地址 : https://github.com/openai/finetune-transformer-lm/blob/master/train.py
代码语言:javascript复制
# 导入需要的库  
import os  
import time  
import math  
import json  
import joblib  
import random  
import argparse  
import numpy as np  
import tensorflow as tf  
  
# 导入一些工具函数和模块  
from tqdm import tqdm  # 进度条  
from functools import partial  # 高阶函数工具  
from sklearn.utils import shuffle  # 打乱数据  
from sklearn.metrics import accuracy_score  # 计算准确率  
  
# 从自定义模块中导入函数和类  
from opt import adam, warmup_cosine, warmup_linear, warmup_constant  # 优化器和学习率调度器  
from datasets import rocstories  # 数据集加载函数  
from analysis import rocstories as rocstories_analysis  # 数据分析函数  
from text_utils import TextEncoder  # 文本编码工具  
from utils import encode_dataset, flatten, iter_data, find_trainable_variables, convert_gradient_to_tensor, shape_list, ResultLogger, assign_to_gpu, average_grads, make_path  # 一些实用函数  
  
# 定义激活函数  
def gelu(x):  
    # GELU激活函数  
    return 0.5*x*(1 tf.tanh(math.sqrt(2/math.pi)*(x 0.044715*tf.pow(x, 3))))  
  
def swish(x):  
    # Swish激活函数  
    return x*tf.nn.sigmoid(x)  
  
# 定义优化器、激活函数和学习率调度器的字典  
opt_fns = {'adam':adam}  
act_fns = {'relu':tf.nn.relu, 'swish':swish, 'gelu':gelu}  
lr_schedules = {'warmup_cosine':warmup_cosine, 'warmup_linear':warmup_linear, 'warmup_constant':warmup_constant}  
  
# 标准化函数  
def _norm(x, g=None, b=None, e=1e-5, axis=[1]):  
    # ...(函数内部实现省略)  
  
def norm(x, scope, axis=[-1]):  
    # ...(函数内部实现省略)  
  
# Dropout函数  
def dropout(x, pdrop, train):  
    # ...(函数内部实现省略)  
  
# 注意力权重掩码函数  
def mask_attn_weights(w):  
    # ...(函数内部实现省略)  
  
# 注意力机制函数  
def _attn(q, k, v, train=False, scale=False):  
    # ...(函数内部实现省略)  
  
# 分割和合并状态函数  
def split_states(x, n):  
    # ...(函数内部实现省略)  
  
def merge_states(x):  
    # ...(函数内部实现省略)  
  
# 分割和合并头函数  
def split_heads(x, n, k=False):  
    # ...(函数内部实现省略)  
  
def merge_heads(x):  
    # ...(函数内部实现省略)  
  
# 一维卷积函数  
def conv1d(x, scope, nf, rf, w_init=tf.random_normal_initializer(stddev=0.02), b_init=tf.constant_initializer(0), pad='VALID', train=False):  
    # ...(函数内部实现省略)  
  
# 注意力块函数  
def attn(x, scope, n_state, n_head, train=False, scale=False):  
    # ...(函数内部实现省略)  
  
# 多层感知机函数  
def mlp(x, scope, n_state, train=False):  
    # ...(函数内部实现省略)  
  
# Transformer块函数  
def block(x, scope, train=False, scale=False):  
    # ...(函数内部实现省略)  
  
# 嵌入函数  
def embed(X, we):  
    # ...(函数内部实现省略)  
  
# 分类函数  
def clf(x, ny, w_init=tf.random_normal_initializer(stddev=0.02), b_init=tf.constant_initializer(0), train=False):  
    # ...(函数内部实现省略)  
  
# 主模型函数  
def model(X, M, Y, train=False, reuse=False):  
    # ...(函数内部实现省略)  
  
# 多GPU训练函数  
def mgpu_train(*xs):  
    # ...(函数内部实现省略)  
  
# 多GPU预测函数  
def mgpu_predict(*xs):  
    # ...(函数内部实现省略)  
  
# 数据转换函数  
def transform_roc(X1, X2, X3):  
    # ...(函数内部实现省略)  
  
# 迭代应用函数(用于训练和验证)  
def iter_apply(Xs, Ms, Ys):  
    # ...(函数内部实现省略)  
  
# 迭代预测函数  
def iter_predict(Xs, Ms):  
    # ...(函数内部实现省略)  
  
# 保存模型参数函数  
def save(path):  
    # ...(函数内部实现省略)  
  
# 记录日志函数  
def log():  
    # ...(函数内部实现省略)  
  
# 主函数(命令行参数解析和模型训练/预测)  
if __name__ == '__main__':  
    # ...(参数解析和模型初始化省略)  
  
    # 训练循环  
    for i in range(n_iter):  
        # ...(训练迭代和日志记录省略)  
  
    # 提交预测  
    if submit:  
        # ...(加载最佳参数,进行预测和分析省略)  
  
# 一些辅助函数和变量定义(如argmax,pred_fns,filenames等)  
# ...(省略)

0 人点赞