五、AIGC大模型_01大模型基础知识
1、基本概念
1.1 定义
目前,谈到大模型,通常都指的是大语言模型(LLMs,即:Large Language Models)
大语言模型是具有大规模参数和复杂计算结构的深度学习模型,通常由深度神经网络构建而成,参数量从数十亿到数千亿不等(甚至更多)
这些模型通过训练海量文本数据来学习语言的语法、语义和语境规则,从而能够生成自然语言文本或理解语言文本的含义
1.2 参数量的重要性
-
类脑设计视角:参数可以类比为脑细胞,脑细胞越多,模型的“智力”越强,能够处理更复杂的任务
-
数学视角:从函数的角度看,参数越多,模型能够映射的关系越复杂,从而更好地捕捉数据中的复杂模式
1.3 训练平台
-
硬件需求:训练大语言模型离不开高性能的GPU,通常需要数百甚至上千个GPU集群(一些大型模型的训练平台可能需要“万卡”级别的GPU支持)
-
工程挑战:除了硬件资源,训练大模型还需要高效的分布式训练框架和优化算法,以应对大规模数据和复杂模型结构带来的挑战
1.4 训练数据
-
预训练语料规模:大语言模型通常需要海量的文本数据进行预训练,例如:一些模型可能会使用18T(18万亿字节)级别的语料,相当于3600万本《红楼梦》的量级
-
数据质量与多样性:除了数据量,数据的质量和多样性也至关重要,高质量的数据可以提高模型的性能和泛化能力,而多样化的数据则有助于模型学习到更广泛的语言模式
1.5 训练时长
-
传统时长:过去,训练一个大语言模型可能需要3到6个月
-
当前进展:随着技术的进步,训练时长已经大幅缩短,现在可能只需要1到2个月(甚至更短),这主要得益于更高效的训练算法、硬件性能的提升以及分布式训练技术的发展
2、小模型时代与大模型时代的对比
-
小模型时代:
-
单一职责原则:每个模型通常针对一个特定的场景或任务进行设计和训练,例如:一个用于文本分类的模型、一个用于机器翻译的模型等,每个模型都有独立的数据集、训练过程、评估方法、部署方式和维护策略
-
系统架构:一个系统中可能挂载多个微服务,每个微服务对应一个或几个小模型(这种架构的优点是每个模型可以针对特定任务进行优化,但缺点是系统复杂度高,维护成本高,且难以实现跨任务的知识共享)
-
-
大模型时代:
-
大一统:一个系统中通常挂载一个大模型,通过指令遵循,大模型可以同时解决多种不同的问题,例如:同一个大语言模型可以用于文本生成、问答、翻译等多种自然语言处理任务
-
多模态大模型:除了单纯处理文本或图像等单一模态数据,大模型还可以发展为多模态大模型,这种模型能够同时处理文本、图像、音频等多种数据类型,实现对多模态信息的综合理解和分析
-
3、生成式人工智能与判别式人工智能
生成式人工智能与判别式人工智能是两种常见的人工智能建模方法,他们的区别如下:
-
生成式人工智能(Generative AI)
-
定义:生成式人工智能是指能够生成新的数据样本(如文本、图像、音频等)的人工智能模型,这些模型通过学习数据的分布,生成与训练数据相似但又不完全相同的新内容
-
特点:具有创作性和生成性,能够创造出全新的内容,例如:大语言模型可以根据用户输入的提示生成连贯的文本(随着生成式人工智能的发展,如何实现人机协同成为下一步的重点,人机协同是指人类与人工智能系统之间相互协作,共同完成任务,例如:在创意写作中,人类可以利用生成式人工智能提供的文本片段进行进一步的创作和编辑)
-
-
判别式人工智能
-
定义:判别式人工智能主要用于对已有的数据进行分类、识别或判断,例如:图像识别模型判断一张图片中的物体类别,文本分类模型判断一段文本的主题
-
特点:更侧重于对输入数据的分析和判断,而不是生成新的内容
-
4、大模型三大架构
大模型的工作原理离不开编码器和解码器,由此产生了“编码器-解码器”、“仅编码器”、“仅解码器”这三大典型的架构
4.1 Encoder-Decoder架构
-
架构特点:由编码器(Encoder)和解码器(Decoder)组成,编码器负责对输入序列进行编码以提取特征,解码器则根据编码器的输出生成目标序列,两者通过交叉注意力机制相连
-
T5模型:是该架构的典型代表,由Google开发,它将所有自然语言处理任务统一为文本到文本的转换任务,例如将机器翻译任务转化为“输入英文,输出中文”的格式,T5模型通过增加Transformer的层数和参数量来提升性能,但并非完全淘汰,仍有一些任务适合使用该架构
-
优势:能够同时处理输入和输出序列,适用于需要对输入进行理解和转换的任务,如机器翻译、文本摘要等
-
局限性:相比其他架构,模型结构相对复杂,训练和推理成本较高
4.2 Decoder-Only架构
-
架构特点:仅使用解码器部分,通过自回归的方式逐词生成文本,即在生成下一个词时只能看到之前生成的词
-
LLaMA架构:是该架构的代表之一,由Meta开发,LLaMA2在多个方面进行了改进,例如采用RMSNorm归一化函数和SwiGLU激活函数,此外,LLaMA2还引入了RoPE位置编码,以更好地处理长序列数据
-
千问系列、豆包、星火、kimi、DeepSeek等:这些模型也采用了Decoder-Only架构,专注于生成任务,能够生成流畅且连贯的文本
-
优势:模型结构简单,训练和推理效率较高,适合大规模生成任务,如文本创作、代码生成等
-
局限性:由于只能看到之前的内容,对上下文的理解可能不如Encoder-Decoder架构全面
4.3 GLM(Prefix-Encoder-Only)架构
-
架构特点:融合了BERT的双向编码器和GPT的自回归解码器的优势,在理解上文时,利用双向编码器能够充分考虑上下文信息,而在生成下文时,又具备强大的自回归生成能力
-
BERT双向编码器: BERT(Bidirectional Encoder Representations from Transformers)是一种基于Transformer架构的多层神经网络,每一层神经网络都包含自注意力机制(Self-Attention)和前馈网络(Feed-Forward Network),BERT的自注意力机制是双向的,即在计算某个词的表示时,会同时考虑该词左侧和右侧的所有词
-
GPT自回归解码器: GPT(Generative Pre-trained Transformer)也是基于Transformer架构的多层神经网络,每一层同样包含自注意力机制和前馈网络,与BERT不同的是,GPT的自注意力机制是单向的,即在计算某个词的表示时,只能看到该词左侧的词,而不能看到右侧的词
-
-
优势:兼具文本理解和生成的能力,能够更好地处理需要同时考虑上下文和生成连贯文本的任务
-
局限性:这种混合结构相对复杂,可能在训练和优化上面临一定的挑战
4.4 适用场景
-
Encoder-Decoder架构适用于需要对输入进行理解和转换的任务,如机器翻译、文本摘要等
-
Decoder-Only架构是目前的主流架构,适合大规模生成任务,如文本创作、代码生成等
-
GLM架构则兼具文本理解和生成的能力,适用于需要同时考虑上下文和生成连贯文本的任务
5、数据处理流程
基于现代自然语言处理(NLP)中常见的Transformer架构(如BERT、GPT等)的工作原理基本流程如下:
Step1:用户进行提问(Query)
用户输入一段文本,例如:“明天北京的天气怎么样?” 这是用户与系统交互的起点,用户的问题是整个处理流程的输入
Step2:套模板,格式化输入
- 系统和用户角色: 在一些对话系统中,输入会被标记为“system”或“user”,以区分是系统生成的内容还是用户输入的内容,例如:
{"system": "You are a helpful assistant.","user": "明天北京的天气怎么样?"
}
- 格式化输入: 将用户输入的文本转换为模型能够理解的格式,例如:添加特殊的标记(如
[CLS]
、[SEP]
),或者对输入进行标准化处理(如去除多余空格、标点符号统一等) 示例:[CLS] 明天北京的天气怎么样? [SEP]
Step3:使用分词器(Tokenizer)
-
分词:将输入的文本分割成一个个“token”(词元),分词器会根据预定义的词汇表(如BERT的WordPiece分词器)将文本拆分成子词单元 示例:
[CLS] 明天 北京 的 天气 怎么样 [SEP]
-
转换为
input_ids
:将分词后的结果映射为词汇表中的索引(ID) 示例:[101, 2023, 759, 1996, 2001, 2129, 102]
-
生成
attention_mask
:attention_mask
用于指示模型哪些位置是有效的输入,哪些是填充(padding)部分,有效位置为1,填充位置为0 示例:[1, 1, 1, 1, 1, 1, 1]
Step4:向量化(Embedding)
将input_ids
转换为向量表示(每个input_ids
对应的嵌入向量都是模型预训练时学习到的),例如:
[[0.1, 0.2, ..., 0.9], # [CLS][0.2, 0.3, ..., 0.8], # 明天[0.4, 0.5, ..., 0.7], # 北京...
]
向量的维度通常为d_model
(如512或768)
Step5:位置编码(Positional Encoding)
由于Transformer模型本身不考虑序列的顺序,因此需要添加位置编码来引入位置信息(位置编码与嵌入向量相加,使得模型能够感知单词在句子中的位置),例如:
[[0.1+0.01, 0.2+0.02, ..., 0.9+0.09], # [CLS][0.2+0.03, 0.3+0.04, ..., 0.8+0.08], # 明天[0.4+0.05, 0.5+0.06, ..., 0.7+0.07], # 北京...
]
Step6:循环过程(Transformer层)
Transformer模型的核心是多层Transformer结构,每一层包含两个主要模块,即:自注意力机制和前馈网络
-
自注意力特征抽取(Masked Attention)
-
自注意力(Self-Attention):模型通过计算每个词与其他词之间的关系(注意力权重),动态地提取特征
-
Masked Attention:在某些任务(如语言生成)中,为了防止模型“作弊”,会使用mask机制。例如,在语言生成中,模型只能看到当前词之前的词
-
多头注意力(Multi-Head Attention):将输入分成多个“头”,分别计算注意力,然后将结果拼接起来。这可以让模型从不同角度学习特征
-
-
前馈网络层(FFN/MLP)
-
前馈网络:经过自注意力层后,每个词的特征会被送入一个前馈网络(通常是一个两层的全连接网络)
-
先升再降:第一层通常会将特征维度扩展到一个较大的值(如
d_model
的4倍),然后通过非线性激活函数(如ReLU),最后再降回到d_model
-
残差连接和LayerNorm:在Transformer中,每个模块的输出会与输入进行残差连接,并通过LayerNorm进行归一化,以防止梯度消失或爆炸
-
Step7:输出层,输出结果
-
Linear层:经过多层Transformer处理后,输出的特征向量会通过一个线性层(
linear
)-
d_model
:输入特征的维度(如512或768) -
dict_len
:输出的维度,通常是词汇表的大小(如30522,BERT的词汇表大小)
-
-
Softmax:线性层的输出是一个未归一化的概率分布,通过Softmax函数将其转换为概率分布,表示每个词的生成概率
- 选择输出:根据概率分布,选择最高概率的词作为输出。如果是语言生成任务,模型会逐词生成文本,直到遇到结束符(如
[EOS]
)
6、简单测试
6.1 准备工作
从魔搭社区(https://www.modelscope.cn/models)下载ChatLM-mini-Chinese和Qwen2.5-0.5B-Instruct这两个模型文件,分别用于Encoder-Decoder架构和Decoder-Only架构的简单demo演示
下载后与代码文件放到同级目录下即可
6.2 Encoder-Decoder架构(ChatLM-mini-Chinese)示例
# huggingface核心库 —— transformers
# 加载分词器
from transformers import AutoTokenizer
# 加载 Seq2Seq 类型的大模型
from transformers import AutoModelForSeq2SeqLM
# 深度学习框架
import torch # 定义选用哪个模型
model_name = 'ChatLM-mini-Chinese'
# 设备判断
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 实例化分词器
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 实例化模型
model = AutoModelForSeq2SeqLM.from_pretrained(model_name, trust_remote_code=True).to(device)
# 查看模型结构
print(model)# 定义与模型交互的输入文本
txt = '请把下面的话翻译为英语:你好吗?'
# 用分词器处理输入文本
encode_ids = tokenizer([txt])
# 查看处理后的内容
# tokenizer([txt]) 返回一个字典,包含 input_ids 和 attention_mask 等键
# input_ids:文本被分词后对应的 token ID 列表
# attention_mask:用于指示哪些位置是有效的文本(值为1),哪些是填充的(值为0)
encode_ids# 将分词器返回的 input_ids 和 attention_mask 转换为 PyTorch 的张量,以便在模型中使用
input_ids = torch.LongTensor(encode_ids['input_ids'])
attention_mask = torch.LongTensor(encode_ids['attention_mask'])# 调用模型的 my_generate 方法生成文本
outs = model.my_generate(# input_ids和attention_mask数据搬家input_ids=input_ids.to(device),attention_mask=attention_mask.to(device),# 设置生成文本的最大长度max_seq_len=512,# 指定生成方法为 beam search,这是一种通过维护多个候选序列来提高生成质量的方法search_type='beam'
)# tokenizer.batch_decode:将生成的 token ID 列表解码为可读的文本
# outs.cpu().numpy():将生成的张量从 GPU(如果有)移动到 CPU,并转换为 NumPy 数组
# skip_special_tokens=False:保留特殊标记(如 [CLS]、[SEP] 等)
# clean_up_tokenization_spaces=False:保留分词后的空格
outs_txt = tokenizer.batch_decode(outs.cpu().numpy(), skip_special_tokens=False, clean_up_tokenization_spaces=False)
# 打印生成的第一条文本
print(outs_txt[0])
6.3 Decoder-Only架构(Qwen2.5-0.5B-Instruct)示例
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch# 定义选用哪个模型(填写模型id)
model_name = "Qwen2.5-0.5B-Instruct"
# 设备判断
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 实例化分词器
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 实例化模型
model = AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True).to(device)
# 查看模型结构
print(model)"""为方便编程,先构建消息列表- system: 系统角色- user:用户角色- assistant:大模型角色
"""
messages = [{"role": "system", "content": "你是一个有用的助手!"},{"role": "user", "content": "你是谁?"}
]"""把消息列表通过对话模版,变成一句话
"""
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
print(text)# 对输入文本进行分词并转换为张量
encode_ids = tokenizer([text], return_tensors="pt").to(model.device)# 调用模型的 generate 方法生成文本
outs = model.generate(encode_ids.input_ids,max_new_tokens=512
)# 提取生成的文本
outs = [output_ids[len(input_ids):] for input_ids, output_ids in zip(encode_ids.input_ids, outs)
]# 解码生成的文本
response = tokenizer.batch_decode(outs, skip_special_tokens=True)[0]
print(response)