文章目录
一、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 大模型训练流程 , 可参考代码中的注释 ;
# 导入需要的库
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等)
# ...(省略)