【人工智能99问】LLaMA的训练过程和推理过程是怎么样的?(22/99)
文章目录
- LLaMA的训练过程和推理过程
- 一、LLaMA的训练过程
- 1. 预训练阶段:学习通用语言知识
- 2. 微调阶段:适配特定任务或场景
- 二、LLaMA的推理过程
- 推理步骤详解
- 三、示例
- 1. 训练过程
- 2. 推理过程
- 四、训练与推理的核心特点总结
LLaMA的训练过程和推理过程
LLaMA(Large Language Model Meta AI)是Meta开源的一系列基于Transformer架构的大语言模型,其训练和推理过程遵循大语言模型的通用逻辑,但结合了自身的架构设计和优化策略。以下通过具体场景举例,详细说明LLaMA的训练过程和推理过程。
一、LLaMA的训练过程
LLaMA的训练分为两个核心阶段:预训练(Pre-training) 和微调(Fine-tuning)。预训练目标是让模型学习通用语言规律,微调则是让模型适应特定任务或场景。
1. 预训练阶段:学习通用语言知识
预训练是LLaMA的“基础学习”阶段,目标是通过海量文本数据让模型掌握语言的语法、语义、逻辑和世界知识。
举例场景:训练LLaMA-7B(70亿参数模型)的预训练过程。
-
步骤1:数据准备与清洗
预训练数据需覆盖多领域、多语言的高质量文本,LLaMA的预训练数据主要包括:- 书籍(约占41%):如各类小说、科普书籍、学术著作等(例如《哈利波特》系列、大学教材《计算机科学导论》);
- 网页文本(约占20%):从公开网页爬取的高质量内容(过滤掉低质、重复或有害内容),例如维基百科、博客文章、新闻报道;
- 论文(约占18%):arXiv、PubMed等平台的学术论文(如AI领域的Transformer原理论文);
- 其他文本:如社交媒体对话、论坛讨论(如Reddit高质量帖子)、代码库(如GitHub开源项目代码)等。
数据清洗步骤:
- 去除重复内容(避免模型过度拟合某类文本);
- 过滤低质量文本(如语法错误过多、无意义的乱码);
- 统一格式(如去除特殊符号、标准化标点);
- 按语言比例混合(LLaMA支持多语言,英语占比最高,其次是法语、西班牙语等)。
-
步骤2:Tokenization(文本编码)
LLaMA使用SentencePiece工具将文本转化为模型可理解的“token”(子词单元)。例如,句子“LLaMA is a large language model.”会被编码为:
[LLaMA, 空格, is, 空格, a, 空格, large, 空格, language, 空格, model, .]
每个token对应一个唯一的整数ID(如“LLaMA”对应ID 12345,“is”对应ID 345等),最终文本被转化为一串整数序列。 -
步骤3:模型初始化与架构配置
LLaMA基于Transformer Decoder-only架构(仅保留Transformer的解码器部分),预训练前需初始化模型参数。LLaMA-7B的核心配置为:- 隐藏层维度(d_model):4096;
- 注意力头数:32;
- 编码器层数(n_layer):32;
- 上下文窗口长度:2048 tokens(即模型一次最多处理2048个token的输入)。
-
步骤4:预训练目标与训练过程
预训练的核心目标是自回归语言建模(Autoregressive Language Modeling, AR):给定前序token序列,预测下一个token的概率。
例如,输入序列为“机器学习是人工智能的一个”,模型需要预测下一个token(大概率是“分支”)。训练过程细节:
- 损失函数:交叉熵损失(Cross-Entropy Loss),衡量模型预测token与真实token的差异。例如,若真实下一个token是“分支”(ID 567),模型预测其概率为0.8,则损失较小;若预测概率为0.1,则损失较大。
- 优化器与学习率:使用AdamW优化器,学习率随训练步数动态调整(初始较高,后期衰减),避免模型过拟合或收敛过慢。
- 硬件支持:LLaMA-7B预训练需大量GPU资源(如数百块A100 GPU),通过数据并行(同一模型在不同数据上训练)和模型并行(模型拆分到多设备)提升效率。
- 训练周期:需训练数周甚至数月,直到模型在验证集上的损失稳定下降(表明模型已充分学习数据规律)。
2. 微调阶段:适配特定任务或场景
预训练后的LLaMA具备通用语言能力,但直接用于具体任务(如问答、摘要、代码生成)时效果可能不佳。微调阶段通过特定任务数据调整模型参数,让模型“专项提升”。
举例场景:将预训练后的LLaMA-7B微调到“中文问答”任务。
-
步骤1:微调数据准备
使用中文问答数据集(如自制或公开数据集),每条数据包含“输入(问题)”和“输出(答案)”。例如:- 输入:“什么是大语言模型?”
- 输出:“大语言模型是基于海量文本训练的深度学习模型,能理解和生成人类语言,可用于问答、写作等场景。”
数据格式需统一为“指令+输入+输出”结构(便于模型理解任务目标),例如:
“指令:回答以下问题。问题:什么是大语言模型?答案:大语言模型是基于海量文本训练的深度学习模型,能理解和生成人类语言,可用于问答、写作等场景。”
-
步骤2:微调策略与训练
微调的核心是在预训练模型基础上,用任务数据“小步调整”参数,避免遗忘预训练知识。- 参数调整范围:通常采用“全量微调”(调整所有参数)或“参数高效微调”(如LoRA,仅调整部分参数),LLaMA微调常用LoRA以降低计算成本。
- 学习率与步数:微调学习率远小于预训练(如预训练学习率1e-4,微调1e-5),训练步数较少(如数万步),避免过拟合小数据集。
- 训练目标:仍使用自回归语言建模目标,即给定“指令+问题”的前序序列,预测“答案”的每个token。例如,输入“指令:回答以下问题。问题:什么是大语言模型?答案:”,模型需预测后续的“大语言模型是…”。
-
步骤3:验证与调优
用验证集(未参与训练的问答数据)评估微调效果,若模型回答准确率低(如答非所问),则调整数据质量(增加更多样例)或训练参数(如增大学习率),重复训练直到效果达标。
二、LLaMA的推理过程
推理是LLaMA“应用知识”的阶段:给定输入文本(如问题、指令),模型通过预训练/微调学到的规律生成输出文本。推理核心是“自回归生成”——从输入序列出发,逐token预测并生成下一个token,直到结束。
举例场景:用微调后的LLaMA-7B回答问题:“请解释什么是人工智能?”
推理步骤详解
-
步骤1:输入处理与Tokenization
首先将输入文本转化为token序列。输入“请解释什么是人工智能?”经SentencePiece编码后,得到token序列:
[请, 解释, 什么, 是, 人工智能, ?]
对应token ID为:[1001, 2002, 3003, 4004, 5005, 6006]
。 -
步骤2:初始化生成序列
生成序列初始化为输入token序列:[1001, 2002, 3003, 4004, 5005, 6006]
,记为seq = [t1, t2, t3, t4, t5, t6]
。 -
步骤3:逐token自回归生成
模型通过以下流程循环生成下一个token,直到满足结束条件(生成结束符或达到最大长度):- 输入模型计算:将当前序列
seq
输入LLaMA模型,模型通过Transformer解码器层(含自注意力、前馈网络)计算输出,最终通过输出层(线性层+Softmax)得到下一个token的概率分布P(next_token)
。- 例如,当前序列是“请解释什么是人工智能?”,模型计算后预测下一个token的概率分布中,“人工智能”相关词汇(如“是”“指”“一种”)的概率较高。
- 选择下一个token:根据解码策略从概率分布中选择下一个token。LLaMA常用两种策略:
- 贪婪解码:直接选择概率最高的token(如“是”的概率最高,选“是”);
- 采样解码(如nucleus采样):从概率和≥0.9的token中随机选择(增加多样性,避免重复)。
此处假设用贪婪解码,选择“是”作为下一个token(ID 4004),序列更新为[t1, t2, t3, t4, t5, t6, t7=4004]
。
- 重复生成:将新序列再次输入模型,预测下一个token。例如,下一个token可能是“一种”,序列更新为
[t1,...,t7,t8=7007]
,以此类推。
- 输入模型计算:将当前序列
-
步骤4:终止生成
当生成序列中出现结束符(如<END>
),或序列长度达到预设最大值(如2048 tokens)时,停止生成。最终生成的token序列经解码(将ID转回文本)后,得到输出:
“人工智能是一种模拟人类智能的技术,能通过学习完成推理、决策等任务,广泛应用于语音识别、图像分类等领域。”
三、示例
好的,以下是一个简化的例子,分别说明LLaMA的训练过程和推理过程。假设我们有一个简单的句子“Hello, how are you?”,我们将通过这个例子来展示LLaMA是如何进行训练和推理的。
1. 训练过程
(1)数据准备
假设我们有一个小型的训练数据集,包含以下句子:
Hello, how are you?
I am fine, thank you.
What is your name?
My name is LLaMA.
(2)分词
使用BPE(Byte Pair Encoding)分词器将句子分割成token序列。例如:
- “Hello, how are you?” →
["Hello", ",", "how", "are", "you", "?"]
- “I am fine, thank you.” →
["I", "am", "fine", ",", "thank", "you", "."]
(3)词嵌入
将每个token通过词嵌入矩阵转化为词向量。假设词嵌入维度为128,那么每个token都会被映射到一个128维的向量。例如:
["Hello", ",", "how", "are", "you", "?"]
→[v1, v2, v3, v4, v5, v6]
,其中v1, v2, ..., v6
是128维的词向量。
(4)位置编码
使用旋转位置编码(RoPE)为每个词向量添加位置信息。假设我们使用RoPE将位置信息编码到词向量中,得到新的向量序列:
[v1', v2', v3', v4', v5', v6']
(5)解码器层处理
将处理后的词向量序列送入解码器层。假设我们有一个包含2层的解码器,每层的处理过程如下:
第1层解码器
- RMSNorm归一化:对输入的词向量序列
[v1', v2', v3', v4', v5', v6']
进行RMSNorm归一化。 - 自注意力机制:计算每个位置的上下文表示。例如,
v1'
会根据[v1', v2', v3', v4', v5', v6']
计算出一个新的上下文向量c1
。 - 残差连接:将自注意力的输出
c1
与归一化前的输入v1'
相加,得到新的隐藏层状态h1 = v1' + c1
。 - RMSNorm归一化:对
h1
进行RMSNorm归一化。 - 前馈网络:将归一化后的
h1
送入前馈网络,进行非线性变换,得到新的隐藏层状态h1'
。 - 残差连接:将前馈网络的输出
h1'
与归一化前的输入h1
相加,得到最终的隐藏层状态h1'' = h1 + h1'
。
重复上述步骤,处理所有词向量,得到第一层解码器的输出序列[h1'', h2'', h3'', h4'', h5'', h6'']
。
第2层解码器
将第一层解码器的输出序列[h1'', h2'', h3'', h4'', h5'', h6'']
作为输入,重复上述步骤,得到第二层解码器的输出序列[h1''', h2''', h3''', h4''', h5''', h6''']
。
(6)输出层
将第二层解码器的输出序列[h1''', h2''', h3''', h4''', h5''', h6''']
送入输出层。输出层通常是一个线性层,将隐藏层状态映射到词汇表大小的维度(假设词汇表大小为10000)。例如:
h1'''
→o1
,其中o1
是一个10000维的向量,表示每个token的预测概率分布。
(7)损失计算
假设我们有一个目标序列["Hello", ",", "how", "are", "you", "?"]
,对应的词索引为[1, 2, 3, 4, 5, 6]
。我们通过交叉熵损失函数计算模型的预测输出[o1, o2, o3, o4, o5, o6]
与目标序列的损失值。例如:
- 损失值 =
CrossEntropy(o1, 1) + CrossEntropy(o2, 2) + ... + CrossEntropy(o6, 6)
(8)反向传播与优化
通过反向传播计算损失值对模型参数的梯度,并使用优化器(如AdamW)更新模型参数。重复上述过程,直到模型收敛。
2. 推理过程
假设我们已经训练好的模型,现在要生成句子“Hello, how are you?”的下一句。
(1)输入处理
将输入句子“Hello, how are you?”进行分词和词嵌入,得到词向量序列:
["Hello", ",", "how", "are", "you", "?"]
→[v1, v2, v3, v4, v5, v6]
(2)位置编码
使用RoPE为每个词向量添加位置信息,得到新的向量序列:
[v1', v2', v3', v4', v5', v6']
(3)解码器层处理
将处理后的词向量序列送入解码器层。假设我们使用和训练时相同的解码器结构,经过两层解码器处理后,得到最终的隐藏层状态序列[h1''', h2''', h3''', h4''', h5''', h6''']
。
(4)输出层
将第二层解码器的输出序列[h1''', h2''', h3''', h4''', h5''', h6''']
送入输出层,得到每个位置的预测概率分布。例如:
h6'''
→o6
,其中o6
是一个10000维的向量,表示下一个token的预测概率分布。
(5)采样
从o6
中采样下一个token。假设采样得到的token是"I"
,对应的索引为7
。
(6)重复生成
将生成的token"I"
添加到输入序列中,继续生成下一个token。例如:
- 新的输入序列:
["Hello", ",", "how", "are", "you", "?", "I"]
- 重复上述步骤,直到生成完整的句子。
最终生成的句子可能是:“Hello, how are you? I am fine, thank you.”
总结
- 训练过程:通过分词、词嵌入、位置编码、解码器层处理、输出层、损失计算和反向传播等步骤,训练模型以最小化预测误差。
- 推理过程:通过分词、词嵌入、位置编码、解码器层处理和输出层等步骤,生成新的文本内容。
这个例子展示了LLaMA在训练和推理过程中的基本操作,实际应用中模型会更复杂,涉及更多的优化和细节处理。
四、训练与推理的核心特点总结
阶段 | 核心目标 | 关键输入 | 核心逻辑 | 资源需求 |
---|---|---|---|---|
预训练 | 学习通用语言规律 | 海量多领域文本 | 自回归预测下一个token | 高(数百GPU,数周训练) |
微调 | 适配特定任务 | 任务特定数据集(如问答) | 小范围调整参数,保留通用知识 | 中(数GPU,数天训练) |
推理 | 生成符合输入的输出文本 | 用户输入(指令/问题) | 逐token自回归生成 | 低(单GPU/CPU实时运行) |
通过以上过程,LLaMA从“学习通用知识”到“适配具体任务”,最终实现对用户输入的精准响应,体现了大语言模型“预训练+微调+推理”的完整闭环。