Attention 模块是现在几乎所有大模型的核心模块,因此也有很多工作致力于提升注意力计算的性能和效果。其中MHA(Multi-Head Attention)、MQA(Multi-Query Attention)和 GQA(Grouped-Query Attention)这一路线的思路和做法被很多主流模型所采用,因此简单地梳理一些这几个变体的思路和做法,以及会涉及到的KV Cache相关内容。思路比较直白,但也有一些细节和原理值得思考。
理解自注意力机制
自Transformer架构的开山之作《Attention Is All You Need》发表以来,自注意力机制已成为深度学习模型的基石技术,尤其在自然语言处理领域展现革命性突破。鉴于该机制已渗透至各类先进模型架构,深入理解其运作原理变得至关重要。
LLM之KVCache
在Transformer架构的生成式模型(如GPT系列)中,推理过程需要逐个生成token。传统方式每次生成都需重新计算所有历史token的注意力信息,导致计算复杂度达到O(n²)。KV Cache技术通过缓存历史token的Key和Value矩阵,将后续生成的计算复杂度降至O(n),实现推理加速,本质上是一种用空间来换取时间的加速策略。
LLM之位置编码
在自然语言处理的任务中,位置编码是帮助模型理解序列中每个单词或词片(token)在序列中的位置的一种机制。这是因为像 Transformer 这样的架构本质上是无序的,它们通过注意力机制处理整个序列中的所有元素,但并不能直接感知这些元素在序列中的顺序。因此,我们需要将序列的位置信息编码进模型的输入,编码的方式有绝对位置编码和相对位置编码。
LLM之模型训练Tricks
学习LLM过程中的经典策略记录。
LLM之余弦退火学习率
学习率这个概念在非线性优化中经常出现,在深度学习中模型在反向传播阶段严重依赖于损失函数梯度的链式传播,为了更好的控制参数更新的步长,引入了学习率的概念: \[ w_{new} = w_{old} - \eta \ \Delta J(w) \]
卡尔曼滤波
傅立叶变换
希尔伯特空间是一个完备的内积空间,其标准正交函数系,直观来看就是向量空间中基
的延伸。其为基于任意正交系上的多项式表示的傅立叶级数和傅立叶变换提供了一种有效的表述方式,而这也是泛函分析的核心概念之一。下文中我们将通过希尔伯特空间的标准正交函数系推导周期函数和有限区间上函数的傅立叶级数表示,并进一步推出傅里叶积分来表示无穷区间的非周期函数,最后引入复数形式的傅立叶积分,引出傅立叶变换。在这一系列推导中,鉴于篇幅,主动略去了一些比较关键的部分,比如\(f(x)\)可积性及级数收敛性的讨论,有兴趣的读者可以在了解大致原理后,进行细致的理论推导以作补充。为了便于理解希尔伯特空间的概念,引用维基百科中的定义:
NEON指令集
本文字数: 1.2k 阅读时长 ≈ 5 分钟
NEON(Advanced SIMD)是ARM架构中用于向量化计算的指令集,广泛应用于手机、嵌入式设备和 Apple Silicon等基于ARM的平台上。NEON提供了一种高效的方式同时处理多个数据元素,在多媒体处理、信号处理和机器学习中非常重要。
Linux命令指南
du
du 用于计算文件或目录的磁盘使用情况。它帮助我们确定需要压缩的文件夹大小,用于为进度条工具(如 pv)提供总大小信息。
常用选项:
- -s:显示文件夹的总大小,而不是列出子目录的大小。
- -k:以 KiB(1024 字节为一单位)显示大小。
- -b:以byte为单位显示大小(macOS 无此选项)
tar
tar 是一个打包工具,用于将多个文件/目录打包为单一的归档文件(不压缩),然后可以通过管道传递给其他压缩工具。
常用选项:
- -c:创建新的归档。
- -v:显示详细信息(如每个被打包的文件名)。
- -f:指定输出文件名,或用 - 表示将数据传递到标准输出(如管道)。
- -:表示数据直接输出到标准输出(通常用于与其他工具结合,如 pv 和 pigz)。
pv
pv 是一个工具,用于监视通过管道传输的数据流,显示实时的进度、速度、已处理数据量和预计完成时间。
常用选项:
- -s
:指定总数据量(通常是以字节为单位)。若未指定,pv 会根据数据流猜测总量,但不准确。 - $(...):在命令中动态执行 du 并将输出传递给 pv。
- awk '{print $1 * 1024}':将 du 的输出(以 KiB 为单位)转换为字节。
pigz
pigz 是 gzip 的多线程版本,支持更高的压缩效率和速度。
常用选项:
- -9:指定最高压缩级别。
- -p
:指定线程数(根据你的 CPU 核心数设置)。
1 | % 多线程压缩 |
1 | % 线程解压 |