AI学习笔记整理(60)——主流预训练模型介绍
开源大模型(LLM)是人工智能领域发展迅速的重要方向,其开放性允许研究人员、开发者和企业自由使用、修改和部署。根据当前公开资料,开源大模型可以从多个维度进行分类和汇总。开源大模型可根据其架构设计、训练目标、语言能力、参数规模等特征进行划分,通用大语言模型:这是最主流的类别,专注于理解和生成自然语言,适用于问答、文本摘要、内容创作等广泛任务。例如,Qwen-7B、ChatGLM2-6B、Bai
开源大模型类别与汇总
开源大模型(LLM)是人工智能领域发展迅速的重要方向,其开放性允许研究人员、开发者和企业自由使用、修改和部署。根据当前公开资料,开源大模型可以从多个维度进行分类和汇总。
开源大模型可根据其架构设计、训练目标、语言能力、参数规模等特征进行划分,主要类别包括:
-
通用大语言模型:这是最主流的类别,专注于理解和生成自然语言,适用于问答、文本摘要、内容创作等广泛任务。例如,Qwen-7B、ChatGLM2-6B、Baichuan-7B等均属于此类。
-
多语言模型:这类模型在预训练阶段就融入了多种语言的数据,旨在实现跨语言的通用理解与生成。Qwen-7B和TigerBot等模型都强调了其对多语言的良好支持。
-
对话/指令微调模型:在通用模型基础上,通过大量对话数据或指令数据进行微调,使其更擅长与人类进行交互式对话或遵循复杂指令。Qwen-7B-Chat、ChatGLM2-6B、Baize Chatbot等是典型代表。
-
视觉-语言模型:结合了图像和文本理解能力,能够根据图像内容生成描述或回答问题。MiniGPT-4是这一领域的开源代表。
-
高效/轻量级模型:追求在保持较好性能的同时,降低计算资源需求,便于在边缘设备或资源受限环境下部署。DLite(124M参数)和GPT4All(7–13B)是此类的代表。
-
MoE(混合专家)模型:采用稀疏激活的架构,模型参数量巨大但计算效率高。Snowflake的Arctic是目前最大的开源MoE模型,拥有4800亿参数。
代表性开源大模型汇总
以下是一些在不同时间点发布、具有代表性的开源大模型:
- Qwen-7B系列:由阿里云推出,基于Transformer架构,在超过2.2万亿token的高质量数据上训练。它在自然语言理解、数学推理和代码生成等方面表现优异,并支持8K上下文长度和插件调用。
- ChatGLM2-6B:智谱AI推出的中英双语对话模型,相比初代在多个权威评测集(如MMLU、CEval、GSM8K)上性能大幅提升,是同尺寸模型中的有力竞争者。
- Baichuan-7B:百川智能发布的开源大模型,在约1.2万亿tokens上训练,支持中英文,上下文窗口为4096。
- TigerBot:由老虎证券推出,是一个多语言多任务大模型,其7B版本在公开评测中达到了OpenAI同规模模型96%的综合表现,并提供了完整的训练和推理代码。
- Arctic:由Snowflake发布,以128位专家和4800亿参数成为目前最大的开源模型,其MoE架构使其在计算资源消耗上远低于同等参数的稠密模型。
- Llama 2 / Llama 3:由Meta AI发布,是开源社区中影响力巨大的基础模型系列,许多其他模型(如OpenLLaMa、Alpaca)都是在其基础上进行微调的。
- MPT-7B / RedPajama-INCITE:由MosaicML等组织发布,强调商业可用性,是早期推动开源LLM商业化的关键项目之一。
- GPT4All:不仅是一个模型,更是一个完整的开源生态系统,提供了在本地设备上训练和部署定制化LLM的工具链。
这些模型大多在GitHub等平台公开了代码和权重,开发者可根据需求选择合适的模型进行微调或直接应用。
主流预训练大模型
主流预训练大模型是指那些在大规模文本数据上进行预训练、具备强大语言理解和生成能力,并可通过微调应用于多种下游任务的AI模型。根据当前技术发展,主流模型主要基于Transformer架构,可分为编码器(Encoder)、解码器(Decoder)和编码器-解码器(Encoder-Decoder)三大类。
主流预训练大模型概览
-
BERT系列(Encoder架构):采用双向上下文理解,擅长文本分类、问答等理解类任务。
- BERT:由Google提出,开创了预训练语言模型的新时代,通过掩码语言模型(MLM)和下一句预测(NSP)任务进行预训练。
- RoBERTa:对BERT的改进版,使用更大的数据集、更长的训练时间和动态掩码策略,性能进一步提升。
- ALBERT:通过参数共享和因式分解降低模型参数量,在保持性能的同时提高了效率。
- DistilBERT:BERT的蒸馏版本,模型更小、推理更快,适合资源受限的场景。
-
GPT系列(Decoder架构):采用自回归(从左到右)生成方式,擅长文本生成、对话等任务。
- GPT-3:参数规模达1750亿,具备强大的少样本学习能力。
- GPT-4:参数规模估计在1.7万亿级别,性能相比GPT-3有显著提升,支持更复杂的推理和多模态输入。
- Llama系列:由Meta开源,基于标准Transformer架构,通过大规模数据预训练和指令微调实现高性能,是开源生态的重要基石。
-
T5与BART(Encoder-Decoder架构):适用于序列到序列(Seq2Seq)任务,如文本摘要、机器翻译。
- T5:将所有NLP任务统一为“文本到文本”格式,使用统一的编码器-解码器结构进行处理。
- BART:结合了去噪自编码和序列到序列学习,对噪声数据鲁棒性强。
-
其他代表性模型:
- ChatGLM:由智谱AI开发,以长文本处理能力和中文优化见长,适用于专业场景。
- Qwen:由阿里云开发,提供多种参数规模版本,注重轻量化设计与低成本部署。
- DeepSeek:在代码和金融等领域有专精化模型,采用MoE(混合专家)架构提升效率。
预训练模型的发展历程
-
词嵌入时代(2013-2017)
代表模型:Word2Vec、GloVe、FastText
特点:
静态词向量表示
无法处理一词多义
上下文无关 -
上下文感知时代(2018-2019)
代表模型:ELMo、ULMFiT
突破:
动态词向量表示
能够处理一词多义
双向语言模型 -
Transformer时代(2019至今)
里程碑模型:BERT、GPT、T5
革命性改进:
基于Transformer架构
大规模预训练
强大的迁移学习能力
主流预训练大模型结构
预训练模型(Pre-trained Models)是自然语言处理(NLP)领域近年来最重要的技术突破之一。这类模型通过在大规模文本数据上进行预先训练,学习通用的语言表示能力,然后可以针对特定任务进行微调(Fine-tuning)。
核心思想
- 两阶段学习:先在大规模通用数据上训练,再在小规模特定任务数据上微调
- 迁移学习:将通用语言知识迁移到具体任务中
- 参数共享:同一套模型参数可用于多种下游任务


-
Encoder架构(BERT系列)

特点:
双向上下文理解
适合分类、问答等任务
代表模型:BERT、RoBERTa、ALBERT -
Decoder架构(GPT系列)

特点:
单向上下文(从左到右)
擅长文本生成
代表模型:GPT-3、GPT-4 -
Encoder-Decoder架构

特点:
适合序列到序列任务
代表模型:T5、BART
从零实现一个基座模型
从零实现一个基座模型是一个复杂但极具学习价值的工程,通常涉及数据处理、模型架构设计、预训练和微调等多个环节。根据当前公开资料,有多个开源项目提供了从零开始构建基座模型的实践路径,主要分为语言模型和具身智能机器人基座两大方向。
语言模型基座的从零实现
对于构建类似GPT或Llama的大型语言模型基座,以下项目提供了端到端的代码实现和详细教程:
-
Karpathy的LLM101n课程:由前OpenAI联合创始人Andrej Karpathy开发,该项目通过构建一个故事讲述者AI,从零开始使用Python、C和CUDA实现一个类似GPT的功能性Web应用。它不依赖高级深度学习框架,而是从底层实现Transformer架构的核心组件,如注意力机制和前馈神经网络,帮助深入理解模型内部运作。
-
《从零开始构建大型语言模型》书籍项目:该开源项目配套书籍,逐步讲解并实现LLM的各个模块。内容涵盖字节对编码(BPE)分词器的实现、嵌入层与线性层的对比、多头注意力机制的高效实现、使用Transformers库加载预训练权重,以及在Gutenberg等数据集上进行预训练的完整代码。
-
从头实现Llama3项目:该项目专注于逐行实现Llama3模型的每一个组件,包括分词器、RMS归一化、RoPE位置编码、多头注意力机制以及前馈神经网络的完整流程,涉及张量运算和矩阵乘法的底层细节,是深入理解Llama架构的绝佳实践。
-
Zero-ChatGPT项目:该项目旨在完整复现ChatGPT的技术路线,包括数据收集与清洗、词表训练、语言模型预训练、指令微调以及基于RLHF(如PPO)的强化学习对齐。其目标是训练一个0.1B参数的模型,流程完整,适合希望理解工业级LLM开发全链路的学习者。
具身智能机器人基座的从零实现
在机器人领域,构建一个能驱动不同机器人的通用基座模型是前沿方向。智源研究院开源的RoboBrain-X0是这一领域的代表性项目:
-
核心思想:RoboBrain-X0不学习如何控制特定机器人的关节(“怎么做”),而是学习任务的抽象语义(“做什么”),如“拿起杯子”。它通过一个“本体映射机制”,将通用任务指令实时翻译为特定机器人的底层控制指令,从而实现零样本跨本体泛化。
-
关键技术:
- 统一动作表征(UAV):将不同机器人的复杂动作(如末端执行器运动、夹爪状态)压缩并编码为标准化的“动作token”序列,类似于语言模型处理文字。
- 分层推理框架:采用“任务解析→动作映射→控制解码”三层架构,实现了任务意图、通用动作和底层控制的解耦,提升了模型的可解释性和泛化能力。
-
开源与数据:智源已将RoboBrain-X0的预训练模型、核心训练数据集(包含真实机器人动作数据)和相关代码在GitHub和Hugging Face上全面开源,为研究者提供了从零开始训练和微调的完整基础。
从零实现基座模型,无论是语言模型还是机器人基座,其核心都在于理解并实现从原始数据到抽象表征,再到可执行输出的完整流程。对于语言模型,重点在于Transformer架构和大规模文本预训练;对于机器人基座,则在于跨本体的动作语义抽象与统一控制。
从零实现一个基座模型数据处理
从零实现一个基座大模型的数据处理流程,是一个复杂且资源密集型的任务,通常涉及数据收集、清洗、预处理和构建等多个环节。
核心数据处理步骤
-
数据收集 (Dataset Collection)
- 目标:获取海量、高质量、多样化的文本数据。数据的广度和质量直接决定了模型的最终性能。
- 来源:需要从多种公开、开源的语料库中整合数据,例如:
- 通用文本:网页抓取内容(如Common Crawl)、书籍、百科全书(如Wikipedia)。
- 专业领域:学术论文、技术文档、代码库(如GitHub)。
- 权威数据集:如“The Pile”是一个被广泛认可的大规模、多源开源数据集,常被用作预训练基准
- 关键考量:避免数据偏差,确保覆盖语言、风格和主题的多样性。
-
数据预处理 (Dataset Pre-processing)
- 数据清洗 (Data Cleaning):移除HTML标签、广告、导航栏等噪声内容,对文本进行标准化格式化。
- 数据采样 (Data Sampling):对不同来源或质量的数据进行加权。例如,提高高质量学术文献的采样率,降低低质量论坛帖子的权重。
- 数据去重 (Data Deduplication):使用如局部敏感哈希(LSH)等技术,移除重复或高度相似的文档,避免模型过拟合于常见文本。
- 下游任务数据移除:为防止数据泄露,需识别并移除可能出现在未来评估基准(如测试集)中的训练数据片段,常用方法包括n-gram匹配。
- 处理非标准文本:将表情符号、特殊符号等转换为可处理的文本形式。
-
构建与优化 (Construction and Optimization)
- 构建数据集:将处理后的数据整合成一个统一的、可高效加载的大规模数据集。
- 优化策略:根据模型目标进行调整。例如,若目标是构建科学领域模型,可重点采样和增强论文数据。
重要考量与建议
- 资源投入:从零开始构建基座模型的数据处理流程,需要巨大的存储、计算和人力投入。公开资料指出,这通常是大型研究机构或科技巨头的专利。
- 实践建议:对于大多数个人或小型团队,更现实的路径是:
- 直接使用现有API:调用如OpenAI的GPT等已训练好的模型服务。
- 基于现有基座微调:下载如LLaMA、Qwen等开源的预训练模型,然后在自己的特定领域数据上进行微调(Fine-tuning)或使用检索增强生成(RAG)技术。这能显著降低数据处理的门槛和成本。
- 工具辅助:使用Weights & Biases等工具可以可视化训练过程中的数据和模型表现,辅助优化数据处理流程。
总而言之,从零实现基座模型的数据处理是AI领域的前沿工程挑战,其核心在于构建一个庞大、纯净、多样化的语料库。然而,鉴于其极高的门槛,当前主流实践更倾向于利用开源的预训练模型进行二次开发。
从零开始实现注意力机制
从零开始实现注意力机制,通常指的是在深度学习框架(如PyTorch)中,手动编写代码来构建一个注意力层,而非直接调用现成的库函数。这有助于深入理解其内部工作原理。以下将基于常见的“缩放点积注意力”(Scaled Dot-Product Attention)机制进行实现,这是Transformer模型的核心组件。
注意力机制解决了之前的机器学习模型中的对全文感知弱的问题,也就比如说GPT在生成文本的时候,会知道上下文,而不会出现新生成出来的字对前面的字有衔接,而对稍微远点的文字完全没有感知的情况。
实现过程主要分为两个部分:单头注意力和多头注意力。多头注意力是单头注意力的并行化版本,能从不同子空间学习信息,效果更佳。
单头注意力实现
单头注意力是基础,它将输入序列转换为查询(Q)、键(K)、值(V)矩阵,并计算注意力权重。
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class SingleHeadAttention(nn.Module):
def __init__(self, embed_dim):
"""
初始化单头注意力层。
:param embed_dim: 输入嵌入维度,也是Q、K、V的维度。
"""
super(SingleHeadAttention, self).__init__()
# 定义线性变换层,将输入映射到Q、K、V空间
# 在实际实现中,常将W_q, W_k, W_v合并为一个大矩阵以提高效率
self.W_q = nn.Linear(embed_dim, embed_dim, bias=False)
self.W_k = nn.Linear(embed_dim, embed_dim, bias=False)
self.W_v = nn.Linear(embed_dim, embed_dim, bias=False)
# 输出投影层
self.W_o = nn.Linear(embed_dim, embed_dim, bias=False)
def forward(self, query, key, value, mask=None):
"""
前向传播。
:param query: 查询张量,形状为 (batch_size, seq_len_q, embed_dim)
:param key: 键张量,形状为 (batch_size, seq_len_k, embed_dim)
:param value: 值张量,形状为 (batch_size, seq_len_v, embed_dim)
:param mask: 掩码张量,用于屏蔽特定位置(如填充位或未来位),形状可为 (batch_size, 1, 1, seq_len_k) 或 (batch_size, 1, seq_len_q, seq_len_k)
:return: 注意力输出,形状为 (batch_size, seq_len_q, embed_dim)
"""
batch_size = query.size(0)
# 1. 线性变换得到 Q, K, V
Q = self.W_q(query) # (batch_size, seq_len_q, embed_dim)
K = self.W_k(key) # (batch_size, seq_len_k, embed_dim)
V = self.W_v(value) # (batch_size, seq_len_v, embed_dim)
# 2. 计算缩放点积注意力分数
# Q与K的转置相乘,得到注意力分数矩阵
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(Q.size(-1)) # (batch_size, seq_len_q, seq_len_k)
# 3. 应用掩码(如果提供)
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf')) # 将掩码位置的分数设为负无穷
# 4. 对注意力分数进行softmax归一化,得到注意力权重
attention_weights = F.softmax(scores, dim=-1) # (batch_size, seq_len_q, seq_len_k)
# 5. 使用注意力权重对V进行加权求和
attention_output = torch.matmul(attention_weights, V) # (batch_size, seq_len_q, embed_dim)
# 6. 最终线性变换
output = self.W_o(attention_output) # (batch_size, seq_len_q, embed_dim)
return output, attention_weights
多头注意力实现
多头注意力将Q、K、V分割成多个“头”,并行计算注意力后再拼接起来。
class MultiHeadAttention(nn.Module):
def __init__(self, embed_dim, num_heads):
"""
初始化多头注意力层。
:param embed_dim: 输入嵌入维度,必须能被num_heads整除。
:param num_heads: 头的数量。
"""
super(MultiHeadAttention, self).__init__()
assert embed_dim % num_heads == 0, "embed_dim must be divisible by num_heads"
self.num_heads = num_heads
self.head_dim = embed_dim // num_heads # 每个头的维度
self.embed_dim = embed_dim
# 定义线性变换层
self.W_q = nn.Linear(embed_dim, embed_dim, bias=False)
self.W_k = nn.Linear(embed_dim, embed_dim, bias=False)
self.W_v = nn.Linear(embed_dim, embed_dim, bias=False)
self.W_o = nn.Linear(embed_dim, embed_dim, bias=False)
def forward(self, query, key, value, mask=None):
"""
前向传播。
"""
batch_size = query.size(0)
# 1. 线性变换
Q = self.W_q(query) # (batch_size, seq_len_q, embed_dim)
K = self.W_k(key) # (batch_size, seq_len_k, embed_dim)
V = self.W_v(value) # (batch_size, seq_len_v, embed_dim)
# 2. 将Q、K、V分割成多个头
# 将最后一个维度 (embed_dim) 拆分为 (num_heads, head_dim)
Q = Q.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) # (batch_size, num_heads, seq_len_q, head_dim)
K = K.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) # (batch_size, num_heads, seq_len_k, head_dim)
V = V.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2) # (batch_size, num_heads, seq_len_v, head_dim)
# 3. 计算缩放点积注意力
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.head_dim) # (batch_size, num_heads, seq_len_q, seq_len_k)
if mask is not None:
# 扩展掩码以匹配多头的形状
mask = mask.unsqueeze(1) # (batch_size, 1, seq_len_q, seq_len_k)
scores = scores.masked_fill(mask == 0, float('-inf'))
attention_weights = F.softmax(scores, dim=-1) # (batch_size, num_heads, seq_len_q, seq_len_k)
attention_output = torch.matmul(attention_weights, V) # (batch_size, num_heads, seq_len_q, head_dim)
# 4. 拼接多头输出
attention_output = attention_output.transpose(1, 2).contiguous().view(batch_size, -1, self.embed_dim) # (batch_size, seq_len_q, embed_dim)
# 5. 最终线性变换
output = self.W_o(attention_output) # (batch_size, seq_len_q, embed_dim)
return output, attention_weights
使用示例
# 设置超参数
batch_size = 2
seq_len = 10
embed_dim = 512
num_heads = 8
# 创建随机输入数据
query = torch.randn(batch_size, seq_len, embed_dim)
key = torch.randn(batch_size, seq_len, embed_dim)
value = torch.randn(batch_size, seq_len, embed_dim)
# 创建多头注意力层
mha = MultiHeadAttention(embed_dim=embed_dim, num_heads=num_heads)
# 前向传播
output, weights = mha(query, key, value)
print(f"Input shape: {query.shape}")
print(f"Output shape: {output.shape}")
print(f"Attention weights shape: {weights.shape}")
注意事项
- 掩码(Mask):在实际应用中,掩码至关重要。例如,在解码器中,为了防止模型“偷看”未来的信息,需要使用因果掩码(Causal Mask);在处理变长序列时,需要使用填充掩码(Padding Mask)来忽略填充的token。
- 效率优化:在实际的模型(如Transformer)中,为了提高计算效率,常将Q、K、V的线性变换合并为一个大的线性层,然后在计算后分割,这与上述分开实现是数学等价的。
- 变体:除了上述的缩放点积注意力,还有其他变体,如基于加性(Additive)或点积(Dot-Product)的注意力,但缩放点积因其计算效率和效果成为主流。
从零实现GPT模型
从零实现一个GPT模型是一个涉及多个步骤的复杂工程,主要包括数据准备、模型架构设计、训练流程实现和推理功能开发。
核心实现步骤
- 数据准备与预处理
- 选择数据集:需要一个大规模的文本语料库。常用的选择包括维基百科中文数据集(如zhwiki-20250920-pages-articles-multistream.xml.bz2)或英文数据集如WikiText-2。
- 数据清洗:原始数据(如维基百科的XML文件)包含大量格式标记、参考文献、HTML标签和日期数字等噪音。需使用工具(如wikiextractor)进行解压,并编写脚本移除这些非文本内容,保留纯净的句子和段落。
- 文本编码:将清洗后的文本转换为模型可处理的数字序列。这需要实现一个分词器(Tokenizer)。常用的方法是字节对编码(BPE)算法,也可以直接调用现成的库(如Hugging Face的Tokenizer)来完成。
- 构建GPT模型架构
GPT模型基于Transformer的解码器(Decoder)结构,其核心组件包括:- 嵌入层(Embedding):将输入的词元ID(token ID)映射为稠密的向量表示。
- 位置编码(Positional Encoding):由于Transformer本身没有序列概念,需要添加位置编码来为模型提供词元在序列中的位置信息。通常使用正弦和余弦函数生成。
- Transformer块(Transformer Block):这是模型的核心,通常由多个相同的块堆叠而成。每个块包含:
- 多头自注意力机制(Multi-Head Self-Attention):允许模型在处理每个词元时,关注序列中所有其他词元,并计算它们之间的相关性。
- 前馈神经网络(Feed-Forward Network):一个简单的全连接网络,对自注意力层的输出进行非线性变换。
- 层归一化(Layer Normalization)和残差连接(Residual Connection):用于稳定训练过程,缓解梯度消失问题。
- 语言模型头(Language Model Head):在模型的最后,将Transformer块输出的隐藏状态映射回词汇表大小的维度,用于预测下一个词元的概率分布。
一个简化的GPT模型(如MiniGPT)的实现通常需要约200-300行Python代码。
-
模型训练
- 损失函数:使用交叉熵损失(Cross-Entropy Loss),目标是最大化模型对下一个正确词元的预测概率。
- 优化器:常用AdamW优化器来更新模型参数。
- 训练循环:将预处理好的数据划分为批次(Batch),输入模型,计算损失,反向传播梯度,并更新参数。关键的训练参数包括批大小(Batch Size)、学习率(Learning Rate)、上下文长度(Context Length)和Dropout率。
- 性能优化技巧:为提高训练效率和稳定性,可采用混合精度训练、梯度裁剪和学习率调度等技术。
-
模型推理
训练完成后,模型可以用于生成文本。实现推理功能通常包括:- 输入提示(Prompt):给模型一个起始文本。
- 自回归生成:模型逐个词元地生成文本。每次预测下一个词元,将其添加到输入序列中,再预测下一个,如此循环。
- 采样策略:为了生成多样化的文本,可以使用温度采样(Temperature Sampling)等策略,而不是简单地选择概率最高的词元。
使用未标记数据训练大模型
使用未标记数据训练大模型是当前人工智能领域的关键技术之一,主要通过自监督学习和半监督学习等范式实现,旨在利用海量低成本的未标记数据来提升模型的泛化能力和性能。
主要方法
-
自监督学习 (Self-Supervised Learning, SSL):这是训练大模型最主流和最有效的方法。其核心思想是从数据本身构造监督信号。
- 原理:通过设计预训练任务(Pretext Tasks),让模型从未标记数据的内部结构中学习到有用的表示。例如,在自然语言处理中,模型可能被要求预测被遮蔽的单词(如BERT模型)或预测下一个句子;在计算机视觉中,模型可能被要求预测图像被旋转的角度或从图像的片段中重建原图。
- 优势:无需人工标注,可以利用互联网上海量的文本、图像、音频等数据。训练出的模型具备强大的通用特征提取能力,之后可以通过微调(Fine-tuning)应用于具体的下游任务(如情感分析、图像分类)。
- 应用:现代大语言模型(如GPT、BERT)和视觉模型(如ViT)的预训练阶段都深度依赖自监督学习。
-
半监督学习 (Semi-Supervised Learning, SSL):当同时拥有少量标记数据和大量未标记数据时,可以采用此方法。
- 原理:结合标记数据的监督信号和未标记数据的结构信息来训练模型。常用技术包括:
- 自训练 (Self-Training):先用标记数据训练一个初始模型,然后用该模型为未标记数据生成预测标签(伪标签),再将置信度高的预测结果与原始标记数据一起用于训练新的模型,迭代进行。
- 一致性正则化 (Consistency Regularization):对未标记数据施加不同的扰动(如添加噪声、数据增强),要求模型对这些扰动后的数据输出保持一致。这鼓励模型学习到更鲁棒的特征。
- 优势:能有效利用稀缺的标记数据,显著提升模型在标记数据有限场景下的性能。
- 原理:结合标记数据的监督信号和未标记数据的结构信息来训练模型。常用技术包括:
-
基于聚类的无监督方法:对于未标记数据,可以先通过聚类算法发现数据的内在结构,再将其作为监督信号。
- 原理:例如,可以使用深度学习模型(如CNN)提取未标记数据的特征,然后对这些特征进行K-Means聚类,将聚类结果作为伪标签,再用这些伪标签训练模型。
- 应用:这种方法常用于数据预处理阶段,例如对大模型训练前的原始数据进行自动分类、去重和整理,以提升数据质量。
总而言之,训练大模型主要依赖自监督学习来利用未标记数据进行预训练,这是构建强大基础模型的核心。在特定场景下,当存在少量标记数据时,半监督学习技术(如自训练、一致性正则化)可以进一步提升模型效果。而聚类等无监督方法则更多地用于数据预处理和特征学习的辅助环节。
更多推荐


所有评论(0)