自然语言处理
未读注意力机制
1 Self-Attention
Self-Attention
是一种注意力机制,它允许模型在输入序列中的不同位置之间建立依赖关系。
Self-Attention
Self-Attention 机制的计算如下:
\[
\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}} +
\text{mask})V
\]
2 Multi-Head Attention
多头注意力相比单一的自注意力,通过并行计算多个头的注意力分数,能够从多个子空间中提取信息,捕捉到更加丰富和复杂的特征,极大地提高了模型的表达能力和鲁棒性。
2.1 MHA变种
为了加快注意力计算速度,通常会采用KV-Cache,但是随着上下文窗口或批量大小的增加,多头注意力
(MHA)模型中与 KV 缓存大小相关的内存成本显著增长
对于较大的模型,KV
缓存大小成为瓶颈,键和值投影可以在多个头之间共享,而不会大幅降低性能,可以使用
具有单个 KV
投影的多查询注意(MQA):只使用一个键值头,虽大大加快了解码器推断的速度,但MQA可能导致 ...
自然语言处理
未读计算图
1. 什么是计算图
计算图是由节点和边构成的有向图(Graph),其中:
节点(Nodes):表示操作(例如加法、乘法、激活函数等)或变量(例如输入、权重、偏置等)。
边(Edges):表示数据在节点之间的流动,即操作的输入和输出之间的依赖关系。
在计算图中,每个节点都对应一个操作或变量,边则表示这些操作之间的依赖顺序。
2. 计算图的优势
自动微分:能够自动计算复杂函数的梯度(链式法则)
并行计算:可以识别独立的操作并并行执行
优化:通过图重写、操作融合、内存优化等技术优化计算效率
操作融合:将多个小操作合并为一个更大的操作,以减少数据传输和中间结果的存储需求,如y
= 2x + 3x可优化为y = 5x
内存优化:通过在计算图中智能地分配和释放内存,减少内存占用
利用计算图的结构,框架可以识别出独立的操作,并在多个处理器或 GPU
上并行执行这些操作
3. 计算图的构建
前向计算的过程大概如下
Forward Calculation
根据链式法则,反向计算的过程大概如下
Backward Calculation
先按着计算图往前计算得到各节点的值; ...
自然语言处理
未读词嵌入(Embedding)
1 位置编码(Positional
Encoding)
位置编码是Transformer模型中的一部分,用于为输入序列中的每个位置提供一个位置向量,提供时序信息。
1.1 标准位置编码
如果输入序列长度为seq_len,词嵌入的维度为d_model。位置编码的计算公式如下:
\[
PE_{(pos, 2i)} =
\sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)\\
PE_{(pos, 2i+1)} =
\cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)
\]
其中,\(pos\)表示token在序列中的位置,\(i\)表示维度。位置编码的维度与词嵌入的维度相同。
偶数维度用sin函数编码,奇数维度用cos函数编码。
对于一个序列,位置编码的维度为[seq_len, d_model]。
词嵌入和位置编码相加,作为模型的输入。
比如对于其中一个token,就是一个[d_model]的一维向量,对位相加一个[d_model]的一维位置编 ...
自然语言处理
未读LLM
参数量、FLOPs计算和中间激活值的存储
分析基于Decoder-only的LLM框架
参数
符号
说明
Decoder层数
l
Token嵌入维度
d
Attention层嵌入维度
d
MLP隐藏层维度
4d
通常设置为嵌入维度4倍
Attention head数量
n
要求其整除d
词表尺寸
V
batch_size
b
模型输入长度
s
1. 模型参数量
Embedding层:\([V, d]\) —— \(Vd\)
Self-Attention层(通常是没有带偏置项) —— \(4d^2 (+ 4d)\)
Q K V 矩阵: \([d, d]\) —— \(3d^2\)
O 矩阵:\([d, d]\) —— \(d^2\)
如果带偏置,每个都是\(d\) —— \(4d\)
MLP层(通常带偏置项) —— \(8d^2 +
5d\)
X->H:\([d, 4d]\) —— \(4d^2+4d\)
H->O:\([4d, d]\) —— \(4d^2+d\)
两个LayerNorm层 —— ...
自然语言处理
未读微调(Fine-Tuning)
1 开源基座模型
大语言模型的训练分为两个阶段:
(1)在海量文本语料上的无监督预训练,学习通用的语义表示和世界知识。
(2)在小规模数据上,进行指令微调和基于人类反馈的强化学习,更好地对齐最终任务和人类偏好。
几乎所有知识都是在预训练过程中学习到的,只需要有限的指令微调数据就可以生成高质量的回复。
因此,基座模型的性能是至关重要的,如果基座模型的性能不够好,指令微调和强化学习也难以取得很好的效果。
主流的开源大语言模型主要有三个:LLaMA、ChatGLM和BLOOM。
模型
模型结构
位置编码
激活函数
layer norm
LLaMA
Casual decoder
RoPE
SwiGLU
Pre RMS Norm
ChatGLM-6B
Prefix decoder
RoPE
GeGLU
Post Deep Norm
Bloom
Casual decoder
ALiBi
GeLU
Pre Layer Norm
模型对比
1) 词表扩充
LLaMA原模型的词表大小是32000,tokenizer主要是在英文语料上进行训练的, ...
自然语言处理
未读Flash Attention
FlashAttention 是一种具有 IO
感知,且兼具快速、内存高效的新型注意力算法。为了缓解LLM输入输出序列s扩展时计算复杂度和空间复杂度都是\(O(s^2)\)的问题。
1 Transformer复杂度
transformer模型中self-attention的计算量和储存复杂度随着序列长度 s
呈二次方增长,这限制了大语言模型的最大序列长度 s 的大小。
1.1 计算复杂度
模块
数量
单次FLOPs
总FLOPs
Embedding
1
0
0
LM Head(logits)
1
\(2bsVd\)
\(2bsVd\)
Self-Attention
l
\(8bsd^2+4bs^2d\)
\(8blsd^2+4bls^2d\)
MLP
l
\(16bsd^2\)
\(16blsd^2\)
总FLOPs:\(2bsVd + 24blsd^2 +
4bls^2d\)
1.2 空间复杂度
模块
数量
单个占用
总占用
Self-Attention
l
\(11bsd+5bs^2n\)
\(11b ...
自然语言处理
未读自然语言处理(NLP)
自然语言处理(Natural Language Processing,
NLP)是人工智能领域的一个重要分支,研究如何使计算机能够理解、处理和生成自然语言文本。NLP技术在信息检索、机器翻译、语音识别、情感分析、对话系统等领域有着广泛的应用。
1. NLP基础
2. NLP任务
2.1 数据预处理
NLP任务的第一步是数据预处理,包括收集语料库、文本清洗、分词、去掉停用词(可选)、标准化和特征提取等
任务流程图如下:
graph LR
A[数据预处理] --> B[收集语料库]
B --> C[文本清洗]
C --> D[分词]
D --> E[标准化]
E --> F[特征提取]
2.1.1 收集语料库
每个机器学习问题都从数据开始,例如电子邮件,帖子或推文列表。这些数据的集合称为语料库。语料库可以是一个文本文件,一个文件夹,一个网站,一个数据库或任何其他数据源。
2.1.2 文本清洗
文本清洗是指从文本中删除不必要的字符,例如标点符号、特殊字符、HTML标签等。文本清洗的目的是 ...
KV Cache
KV-Cache是一种加速Transformer推理的策略,几乎所有自回归模型都内置了KV-Cache
1 为什么需要KV-Cache
Transformer每一层分为两个部分,一个是Self-Attention,另一个是Feed
Forward Network(FFN)。
Self-Attention: \(Attention(Q, K, V) =
softmax(\frac{QK^T}{\sqrt{d_k}})V\)
FFN: \(FFN(x) = ReLU(xW_1 + b_1)W_2 +
b_2\)
自回归模型采用每次推理都将前文整句输入模型,然后预测下一个token的方式,这种方式会存在相同结果的重复推理。
令前一次待推理的文本长度为S,下一次为S+1,由于网络中的各项参数已经固定,因此两次推理对于前S个token的计算结果是完全相同的,包括Embedding映射,每一层、每一个注意力头下的KQV映射,注意力权重,以及后续的FFN层都在重复计算。
那么既然下一个token是由当前最后一个token的网络输出所决定的,那能不能仅输入最后一个token来进行 ...
采样(Sampling)
LLM
在推理时,需要对模型输出的概率分布进行采样,以得到最终的输出。即在生成文本时,需要根据概率分布选择下一个词。
例如:在某一步的输出结果如下:
token1: 0.4
token2: 0.3
token3: 0.2
token4: 0.1
这时应该根据什么规则选择下一个词呢?常用的采样方法有:
贪心采样(Greedy Sampling):选择概率最大的词作为下一个词。
简单高效
可能会导致生成的文本过于单调和重复
随机采样(Random Sampling):根据概率分布随机选择下一个词。
增加生成的多样性
生成的文本可能不够连贯和无意义
束搜索(Beam Search):维护一个大小为 k
的候选序列集合,每一步从每个候选序列的概率分布中选择概率最高的 k
个单词,然后保留总概率最高的 k 个候选序列。k=1时即为贪心采样。
增加搜索空间,平衡生成的质量和多样性
可能会导致生成的文本之间的相似度很高,多样性不足,导致过于保守和不自然。
top-k 采样和 top-p
采样是介于贪心解码和随机采样之间的方法,也是目前大模型解码策略中常用的方 ...
自然语言处理
未读Transformer
1. 模型概述
Transformer是一种用于自然语言处理(NLP)和其他序列到序列(sequence-to-sequence)任务的深度学习模型架构,它在2017年由Vaswani等人首次提出。Transformer架构引入了自注意力机制(self-attention
mechanism),这是一个关键的创新,使其在处理序列数据时表现出色。
1.1 基本结构
transformer基本模型图如下图所示。模型的左半边Encoder部分可以看作是一个编码器,右半边Decoder部分可以看作是一个解码器,其中编码器是双向的,解码器是单向的需要循环迭代输出。
transformer基本结构
1.2 特点与创新
训练并行: 即所有字是同时训练的,这样就大大增加了计算效率
自注意力机制:
核心概念之一,它使模型能够同时考虑输入序列中的所有位置,而不是像循环神经网络(RNN)或卷积神经网络(CNN)一样逐步处理。自注意力机制允许模型根据输入序列中的不同部分来赋予不同的注意权重,从而更好地捕捉语义关系。
多头注意力(Multi-Head
Attention):自注意 ...

