【datawhale打卡】深入剖析大模型原理——Qwen Blog

教程及参考文档

Qwen Blog

科普神文,一次性讲透AI大模型的核心概念

Large language models, explained with a minimum of math and jargon

0. 前置知识

由于我没有 LLM 基础,所以直接上手看文档看的是一头雾水。然后就去补了一下基础知识,这里算是一点简单的个人理解和总结吧。

LLM 的核心是 大规模数据训练 + Transformer 架构

大致步骤

文本 \(\xrightarrow{\text{Tokenization}}\) tokens \(\xrightarrow{\text{子词分割}}\) 子词

\(\xrightarrow{\text{Token-to-ID Mapping}}\) ID \(\xrightarrow{\text{Embedding}}\) 嵌入向量 \(\xrightarrow{\text{Transformer}}\) 上下文表示

看不懂这些名词也不用担心,接下来我会挨个解释。

Tokenization

将文本分解为基本的 token,例如单词或标点符号。一般是单个单词/标点为一个 token

token是指文本中最小的语义单元

例:"I love natural language processing!" 的 token 为:

["I", "love", "natural", "language", "processing", "!"]

子词分割

子词是根据语料库中的词频和共现频率来自动划分的。(类似查表的过程)

例:假设有词汇表

{
  "I": 1,
  "love": 2,
  "natural": 3,
  "language": 4,
  "process": 5,
  "ing": 6,
  "!": 7
}

["I", "love", "natural", "language", "processing", "!"] 的 子词 为:

["I", "love", "natural", "language", "process", "ing", "!"]

GPT系列采用了一种叫做Byte Pair Encoding(BPE)的子词划分方法。BPE是一种基于数据压缩原理的算法,它可以根据语料库中出现频率最高的字节对(byte pair)来合并字节,从而生成新的字节。比如,如果语料库中出现频率最高的字节对是“ns”,那么BPE就会把所有的“ns”替换成一个新的字节“Z”,从而减少字节总数。这个过程可以重复进行,直到达到预设的字节总数或者没有更多的字节对可以合并为止。


Token-to-ID Mapping

类似哈希映射,将上一步划分好的子词映射成对应数值向量

例:假设有词汇表

{
  "I": 1,
  "love": 2,
  "natural": 3,
  "language": 4,
  "process": 5,
  "ing": 6,
  "!": 7
}

子词 ["I", "love", "natural", "language", "process", "ing", "!"] 的 数值向量(ID) 为:

[1, 2, 3, 4, 5, 6, 7]

Embedding

这一步是词嵌入,通俗来讲就是将上一步的 ID 转换为 嵌入向量,这一步

嵌入向量(embeddings)是通过训练一个神经网络模型来计算的。嵌入向量将离散的词或子词映射到连续的向量空间,捕捉语义信息,使得在这个向量空间中具有相似语义的词或子词距离更近

相当于把一个值在很多个维度上分解,维度就是:用别的词来描述这个值的属性。比如 "猫" 的维度可能会有 "动物", "有毛发", "喜欢吃鱼", "会发出喵喵声"等。在训练中一般会根据任务类型,数据规模,计算资源,实验验证等各种情况来认为设置维度。

计算原理:统计大量文本下两词语相邻共同出现的概率。通俗理解就是算两词语的亲密度,然后把亲密度作为值放入嵌入向量

理解嵌入向量维度

  • 信息容量:嵌入向量的维度决定了每个词或子词能够容纳的信息量。维度越高,理论上可以表示的细节越多,但也可能引入噪音。
  • 计算复杂度:较高的维度会增加计算复杂度和内存消耗,训练和推理的时间也会增加。选择过高的维度可能导致过拟合。
  • 语义表示:合理的维度可以捕捉词之间的语义关系。较低的维度可能不足以捕捉复杂的语义关系,较高的维度可以更好地捕捉这些关系,但要在信息量和噪音之间找到平衡。

计算嵌入向量的常见方法有两种:预训练方法和在线训练方法
前者是先使用一个大规模的语料库来训练一个词嵌入模型,然后将训练好的嵌入向量应用到具体的任务中;
后者是将嵌入层作为模型的一部分进行训练。
这里就不展开介绍了。

例:嵌入矩阵为

{
  1: [0.1, 0.2, 0.3],
  2: [0.4, 0.5, 0.6],
  3: [0.7, 0.8, 0.9],
  4: [1.0, 1.1, 1.2],
  5: [1.3, 1.4, 1.5],
  6: [1.6, 1.7, 1.8],
  7: [1.9, 2.0, 2.1]
}

嵌入结果为

[
  [0.1, 0.2, 0.3],  // "I"
  [0.4, 0.5, 0.6],  // "love"
  [0.7, 0.8, 0.9],  // "natural"
  [1.0, 1.1, 1.2],  // "language"
  [1.3, 1.4, 1.5],  // "process"
  [1.6, 1.7, 1.8],  // "ing"
  [1.9, 2.0, 2.1]   // "!"
]

Transformer

Transformer模型概述

输入序列 -> 编码器堆栈 -> 解码器堆栈 -> 输出序列

编码器(Encoder)

编码器负责将输入序列转换为上下文表示,捕捉输入序列中的语义信息。
编码器由多个相同的层堆叠而成,每层由两个主要子层组成:

  1. 自注意力层(Self-Attention Layer)
    • 输入:一个序列的嵌入向量。
    • 输出:考虑到序列中所有位置之间关系的新的嵌入向量。

自注意力层可以同时考虑输入序列中所有位置之间的关系,捕捉到输入序列中不同位置之间的依赖关系,从而更好地理解序列中的语义信息。
在自注意力层中,每个位置的词向量都会与序列中所有其他位置的词向量进行注意力计算,产生新的加权词向量表示。

  1. 前馈神经网络(Feed-Forward Neural Network)
    • 输入:来自注意力机制的输出。
    • 输出:通过一层或多层神经网络后的结果。

在自注意力层之后,每个位置的词向量会经过一个前馈神经网络层,进行非线性变换和特征提取。
前馈神经网络通常由两个线性变换和一个激活函数组成,帮助模型学习到更复杂的特征表示。

在每个子层的输出后都会应用残差连接和层归一化,有助于缓解梯度消失和梯度爆炸问题,加速模型训练和提高模型性能。

解码器(Decoder)

解码器负责根据编码器生成的上下文表示和已知的目标序列(如果有的话),生成输出序列。
解码器也由多个相同的层堆叠而成,每层由三个主要子层组成:

  1. 自注意力层(Self-Attention Layer):解码器的第一个子层也是自注意力层,但是与编码器的自注意力层不同的是,在解码器中需要通过掩码(Mask)来确保解码器只关注当前位置之前的信息,避免信息泄露。

  2. 编码器-解码器注意力层(Encoder-Decoder Attention Layer):解码器的每一层从编码器的输出中提取信息,结合解码器的自注意力机制输出,来生成新的向量表示。

  3. 前馈神经网络(Feed-Forward Neural Network):同编码器

同样,每个子层后面都有一个残差连接和层归一化。

训练Transformer模型通常使用自回归的方式:
即在训练过程中,解码器的每一步都使用真实的前一时间步作为输入;
而在推理过程中,解码器的每一步都使用模型的预测作为输入。
最终结果:解码器输出序列。

在预测下一个词的时候,如果采取贪心搜索,每次取概率分数最大的词的话,只能得到局部最优,不等于全局最优。优化是束搜索:不仅关注序列中下一个词,而是考虑一组较大令牌集合的概率。(更长远的角度看问题)

多头注意力(Multi-Head Attention)

  • 多头注意力机制允许模型并行计算多个自注意力,捕捉不同类型的关系。
  • 每个头独立计算注意力,然后将结果拼接在一起,经过线性变换整合。

以下来自GPT:

分析步骤

  1. 数据准备

    • 收集和清理数据:收集大规模的文本数据,并进行预处理(如去除噪声、标记化)。
    • 创建词汇表:生成包含常见单词或子词的词汇表,用于词嵌入。
  2. 模型初始化

    • 选择模型架构:确定Transformer的层数、每层的注意力头数、隐藏层大小等超参数。
    • 权重初始化:初始化模型的权重参数,通常使用正态分布或均匀分布。
  3. 模型训练

    • 前向传播:输入数据通过嵌入层、自注意力层和前馈层,生成预测输出。
    • 计算损失:使用目标函数(如交叉熵损失)计算预测输出与实际标签之间的误差。
    • 反向传播和优化:通过反向传播计算梯度,使用优化算法(如Adam)更新模型权重。
  4. 评估和验证

    • 验证集评估:在验证集上评估模型性能,调整超参数。
    • 防止过拟合:使用正则化方法(如Dropout)防止模型在训练数据上过拟合。
  5. 模型调优

    • 超参数优化:调整模型的超参数(如学习率、批量大小)以提升性能。
    • 继续训练:在更大规模的数据上继续训练,进一步优化模型。
  6. 推理和应用

    • 生成文本:使用训练好的模型进行文本生成或补全。
    • 下游任务应用:将模型应用于特定任务(如翻译、摘要、问答系统)。

总结

大语言模型通过自注意力机制和Transformer架构,能够有效捕捉自然语言中的复杂关系和长距离依赖。其训练过程涉及大规模数据的准备、模型初始化、前向传播、损失计算、反向传播、评估和验证等步骤。通过不断优化和调优,最终得到能够在多种NLP任务中表现优异的语言模型。


1. 读代码

todo

posted @ 2024-05-15 22:54  Sakana~  阅读(134)  评论(0编辑  收藏  举报