LLM Core - Model Structure
模型文件
- 模型文件,也叫模型权重,里面大部分空间存放的是模型参数 - 即权重(Weights)和偏置(Biases)
- 还有其它信息,如优化器状态和元数据等
- 文件格式
- 使用 PyTorch,后缀为
.pth
- 使用 TensorFlow 或者 Hugging Face Transformers,后缀为
.bin
- 使用 PyTorch,后缀为
- 在模型预训练后,可以保存模型,在生产环境,不建议保存模型架构
- 与 Python 版本和模型定义的代码紧密相关,可能存在兼容性问题
模型权重 - 推荐
1 | torch.save(model.state_dict(), 'model_weights.pth') |
模型权重 + 模型架构 - 可能存在兼容性问题
1 | torch.save(model, model_path) |
权重 + 偏置
- 权重 - 最重要的参数之一
- 在前向传播过程中,输入会与权重相乘,这是神经网络学习特征和模式的基本方式
- 权重决定了输入如何影响输出
- 偏置 - 调整输出
- 允许模型输出在没有输入或者所有输入都为 0 的时候,调整到某个基线值
- $y=kx+b$
- $k$ 为权重,$b$ 为偏置
- 在神经网络中,权重 $k$ 决定了每个输入特征对于输出的重要性和影响力
- 偏置 $b$ 是个常数项,提供除了输入特征之外的额外输入
- 允许模型输出可以在没有任何输入或者所有输入都为 0 的时候,调整到某个基线或阈值
- 在复杂的神经网络中,每个神经元都有权重和偏置
- 从前一层接收多个输入信号,对这些输入信号加权求和后加上偏置
- 然后通过一个非线性激活函数(tanh or ReLU)来生成输出信号 - 传递到下一层
- 每一层的权重和偏置都是模型需要学习的参数,根据训练数据进行调整,以最小化模型的预测误差
模型可视化
Netron - 整体结构
6 层 Transformer Decoder-only 架构
Embedding
weight(168283×512)
- 代表 168283×512 的矩阵,每一行对应一个特定的词向量
- 对于词汇表中一个词或者标记,该矩阵提供了一个 512 维的嵌入向量
tensor: float32[168283,512]
- 表明这是一个 FP32 精度的变量,168283 表明训练时使用了 168283 个词汇
TransformerDecoderLayer
具体的实现类 - torch.nn.modules.transformer.TransformerDecoderLayer
包含组件
1 | torch.nn.modules.activation.MultiheadAttention |
torchviz - 具体节点
1 | x = torch.randint(10000, (50,)) # 假设一个序列长度为10的输入 |
整个网络结构的顺序图
训练
- 模型的训练过程就是不断调整权重的过程
- 调整权重的依据就是根据损失函数计算损失,通过反向传播不断调整权重使得损失最小
- 达到理想损失值后,把权重记录下来保存
推理
- 数据到达节点(神经元)后,先从输入层到隐藏层,再从隐藏层到输出层
- 每一层都执行 $y_1=k_1x_1+b_1$,然后应用非线性的激活函数,比如 $x_2=ReLU(y_1)$,最后将 $x_2$ 继续传递下一层
- 下一层的权重 $k_2$ 和偏置 $b_2$ 是已知的,继续计算得到 $y_2$
- 基本都是张量相乘,而不是简单的整数小数相乘
机器学习框架(PyTorch)可以根据描述文件,将模型重构出来,进行训练和推理
模型容量
存储大小
755M
总参数量
vocab_size × embed_size + embed_size + (4 × embed_size × embed_size + 2 × (embed_size × hidden_dim)) × 层数 + vocab_size × embed_size
vocab_size × 512 + 512 + (4 × 512 × 512 + 2 × (512 × 2048)) × 6 + vocab_size × 512
vocab_size = 168283
168283 × 512 + 512 + (4 × 512 × 512 + 2 × (512 × 2048)) × 6 + 168283 × 512 = 191,196,672 = 1.9 亿
- 模型的精度为 float32,即每个参数需要 4 字节的存储空间
- 纯参数方面大约需要 729M 的空间(191,196,672×4/1024/1024),占比 96.5%,剩余 26M 的空间可能存放的是模型结构、元数据等
Embedding 层
Embedding 层在整个模型中的作用非常大,占比 40%
- 权重是
tensor: float32[168283,512]
- 在 Embedding 层参数量为 168283×512 = 86,160,896,存储≈ 328M
- 参数占比 = 86,160,896 / 191,196,672 ≈ 0.45
- 存储占比 = 328 / 755 ≈ 0.43
模型参数
- 具有 50 个参数的矩阵,每个参数表示词向量在特定维度上的权重或特征
- 每一行表示某个词在 10 个不同的特征维度上的数值表示
- 假设 Embedding 层是可训练的
- 在模型训练的过程中,会根据损失计算,反向传播后更新某个参数
- 使得模型可以更好地表示某个词,来达到训练的目的
- 在最终的推理过程中,词向量会被传播下去,作为下一层神经网络的输入,参与到后续的计算过程中
小结
类比 - 通过 Java 字节码文件反推 Java 编码过程
- 模型里存放的是各个层的权重和偏置,类似于 $y=kx+b$ 里面的 $k$ 和 $b$
- 机器学习框架(PyTorch)可以识别模型文件,并且把模型结构重构出来进行训练和推理
- 模型训练过程 - 不断前向传播、损失计算、反向传播、参数更新的过程
- 模型推理过程 - 根据训练好的参数,进行前向传播的过程
- 模型可视化工具 - Netron + torchviz
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.