关于如何入门 LLM,大多数回答都提到了调用 API、训练微调和应用。但是大模型更新迭代太快,这个月发布的大模型打榜成功,仅仅过了一个月就被其他模型超越。训练微调也已经不是难事,有大量开源的微调框架(llamafactory、firefly 等),你只要懂部署,配置几个参数就能启动训练。甚至现在有大量云上项目,你根本不需要部署,直接上传数据,就能启动。
对于初学者如何入门,我的建议是从一个开源大模型入手,全面了解它的运行原理以及如何应用。可以将大模型比作一辆车,我开车无需理解车是如何做的,但是车出问题了,了解原理能够帮我们快速找到其中的问题。
为了更好入门大模型,我建议按照以下顺序学习,分为编程基础准备、大模型原理理解和大模型应用三个部分。
一、编程基础准备
1. 熟练 Python 编程语言
我一般使用 numpy 用于数据处理,matplotlib 用于画图分析(比如分析位置编码、注意力矩阵)。numpy 很多函数与 pytorch 类似放后面讲,这里主要讲常用的 matplotlib 画图函数,学好 matplotlib 库有利于我们以可视化的角度去理解一些大模型原理。
举个例子,画直方图分析 llama3 8B 中参数分布情况,可以发现有 2 个峰值,分别是 embedding 层和最后输出 logits 层,两者参数量一致。
举个例子,画点图分析 llama3 8B 中的位置编码 RoPE。在同一位置 m 下,可以发现向量中的元素,在 i 比较小的时候变化较快,i 较大的时候变化较慢。
举个例子,画热力图分析 llama3 8B 中的 Attention 矩阵。我的 input 为"The boy didn't cross the street because he was too ",要预测下一个词。观察第 10 行(分析注意力矩阵都是以行为单位)可以发现"he"这个 token 与"boy"这个 token 关联度很高,而不是"street"这个 token。
所以说画图很重要,深度学习本质上都是矩阵运算,单看数字看不出什么结论,需要结合画图等可视化工具分析。
2. 熟悉 PyTorch 等深度学习框架
目前主流大模型基本上都是用 PyTorch 写的,PyTorch 语法太多了,下面介绍在LLM 中常用的 PyTorch 语法(排序不分先后)
(1). torch.nn.Embedding(num_embeddings, embedding_dim...)
其中 num_embeddings 代表词表的大小,embedding_dim 代表词向量的维度。embedding.weight的 size 为 [num_embeddings, embedding_dim]。举个例子,输入索引 i,输出 embedding.weight 的第 i 行。
(2). torch.matmul(x,y)、x*y、torch.dot(x,y) 与 torch.mul(x,y)之间的区别
其中 torch.matmul(x,y) 代表矩阵相乘,torch.mul(x,y) 与 x*y 均代表矩阵对应元素相乘,torch.dot(x,y) 代表向量之间的点积。
(3). torch.full(size, fill_value)
torch.full([2,3],2.0)
(4). torch.triu(x)
import torch a = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) b = torch.triu(a) print(b)
用于注意力机制中的 mask 计算。
(5). torch.outer(x,y)
x = torch.arange(1,5) y = torch.arange(1,4) print(torch.outer(x,y))
一般用于大模型位置编码计算中,比如正弦余弦位置编码、相对位置编码、旋转位置编码等。
(6). torch.view_as_complex(x)
x=torch.randn(4, 2)
大模型位置编码有两种计算方法,一种是在实数域计算、一种是复数域计算。该函数一般用于复数域计算。
(7). torch.view_as_real(x)
x= torch.tensor([ 0.0024+1.5686j, -1.2883+1.0111j, 0.8764+0.1839j, 0.8543-0.0061j]) torch.view_as_real(x)
同上。
(8). 弄清楚 torch.reshape(input,shape) 和 torch.view(input,shape)
我建议从内存分配的角度来理解 reshape。无论一个张量 shape 怎么改变,它的分量在内存中的存储顺序也是不变的。
import numpy as np a = np.arange(6)
(9). 弄清楚 torch.transpose(tensor,dim0,dim1) 和 torch.permute(dim0, dim1, dim2, dim3)
两者均代表矩阵的转置,在二维的时候很容易想明白转置之后的情况,但是高维度的时候就糊涂了。举个例子:
arr = torch.arange(16) arr = arr.reshape(2,2,4)
上面这个三维数组例子,我定义为(batch,H,W),transpose(1,2)等效于长和宽转置。类似这样的例子我们已经练习过很多次了。
不过如何理解 arr.transpose(0,1)?,batch 和 H 维度转置没有物理含义。这需要借用矩阵 stride 概念来理解。
(10). torch.cat 和 torch.stack的区别
torch.cat 是沿着现有维度拼接,增加维度长度;torch.stack 是创建新维度并堆叠。例如两个形状为 (2,3) 的 tensor,cat 后变成 (2,6) 或 (4,3),而 stack 后变成 (2,2,3)。
(11). 以及一些常用的数学计算公式 torch.rsqrt、tensor.pow、torch.mean 等等
二、大模型原理理解
整体要干什么?
简单来说通过基于 Transformer 架构预测下一个词出现的概率。我就不放论文里的图了。我这里放一张 llama3-8B 的网络架构图。这个网络架构里的每一个模块,你都能手写出来,就算是大模型原理这一块入门了。
建议学习网络架构的时候带着问题去学习,不要局限于矩阵中的元素怎么乘,pytorch 语法只是工具,真正需要做的是思考为什么这样做以及背后的数学含义。
1. 自注意力机制的理解
了解单头注意力机制,什么是 K 矩阵、V 矩阵和 Q 矩阵,以及如下公式为什么要除 sqrt(d_k)。
- Mask 的作用:分析为什么在注意力机制中要加入 mask?主要是为了防止未来信息泄露(Decoder 端)或处理填充符(Padding Mask)。
- 多头注意力(MHA):分析
attention is all you need 这篇文章中的多头注意力机制,分析为什么要多头?单头注意力机制为什么不行?多头允许模型在不同表示子空间同时关注不同位置的信息,增强了模型的表达能力。
- GQA:分析为什么要搞 Grouped-query Attention(GQA),它相比 MHA 的好处在哪里?以及应用在哪些方面。GQA 减少了 KV Cache 的显存占用,提升了推理速度,同时保持了接近 MHA 的性能。
上面四点弄明白,对于注意力机制差不多算入门了。
2. 位置编码的理解
- 必要性:Transformer 架构为什么需要位置编码?它解决了常规 NLP 网络架构中的什么问题?Transformer 本身不具备序列顺序感知能力,位置编码注入序列顺序信息。
- 类型对比:绝对位置编码和相对位置编码,他们各有什么优点和缺点?绝对编码易于实现但泛化性差,相对编码泛化性强但计算复杂。
- RoPE:为什么现在大模型都在用旋转位置编码 RoPE?它在实数域和复数域的实现方式是怎样的?RoPE 的缺点有哪些?顺带可以了解下最新的上下文位置编码 CoPE。RoPE 将位置信息融入查询和键向量的旋转中,具有良好的外推性和相对位置感知能力。
- 长文本:大模型为什么有 Long-Context 问题以及如何利用位置编码去解决长文本问题?随着序列增长,位置编码的精度可能下降,需要更高效的编码策略。
3. 前馈网络(Feed Forward)的理解
- 作用:为什么需要前馈网络?用于非线性变换,增加模型容量。
- SwiGLU:为什么 llama3 要使用 SwiGLU?SwiGLU 结合了 Swish 激活函数和 Gating 机制,通常比标准的 FFN 表现更好且收敛更快。
4. 归一化(Normalization)
- 必要性:为什么需要归一化?稳定梯度分布,加速收敛。
- Layer vs Batch:Batch normalization、Layer normalization 有什么区别?为什么语言模型用 Layer Normalization,不去用 Batch Normalization?BN 依赖 batch 统计量,不适合变长序列和小 batch,LN 对每个样本独立计算,更适合 NLP。
- RMS Norm:详细理解 layer normalization 中 RMS Norm,分析其相比常规 layer normalization 的优势。RMS Norm 去掉了均值中心化步骤,减少了计算量,在 Llama 系列中被广泛采用。
5. 推理
- 生成过程:本质上每次推理都是一次吐一个字?如何加速推理?可以去了解 KV Cache。
- Batch 推理:句子长度参差不齐,batch 推理如何补齐长度?通常使用 Padding 或 Bucketing 策略。
- 采样参数:如果最后大模型输出 logits 取最大值,那么大模型生成式能力从何体现?这就需要去了解 temperature 和 top p 参数。这些参数控制生成的随机性和多样性。
三、大模型应用
1. 微调训练
大模型训练分为预训练、指令微调和人类反馈强化学习。大模型训练对于硬件要求高,平民玩家没卡,建议去了解 LoRA、QLoRA 等高效微调算法。
了解 llamafactory、Firefly 等大模型微调框架,自己做个数据集,在大模型的基础上微调子任务。
如果有卡,可以尝试多卡多机跑跑模型,因为我也没什么卡,所以没法给出建议。
2. RAG
思考为什么要 RAG?RAG 和 Long Context 之间是什么关系?RAG 通过检索外部知识库增强模型知识,适合动态知识场景。
RAG 分为知识库构建、知识检索和智能问答,从零实现一个最简单的 RAG。
在最简单 RAG 的基础上,学一学 Faiss、Milvus 等向量数据库,优化 RAG 中涉及的检索、知识存储。
学一学成熟的 RAG 框架 RagFlow。
3. Agent
从零手写一个 Agent 框架。
学一学成熟的 Agent 框架 LangChain、Dify 等。
总结
入门大语言模型是一个系统工程,需要从代码基础到理论原理再到工程实践的全面掌握。Python 和 PyTorch 是重要的工具,理解 Transformer 内部机制如 Attention、Positional Encoding 和 Normalization 是核心。在实际应用中,根据资源选择合适的微调策略(如 LoRA)和架构(如 RAG、Agent)至关重要。建议学习者保持持续学习的态度,关注社区最新进展,并通过动手实践巩固理论知识。