大模型基础知识

大模型基础知识


前言

提示:大模型越来越多领域应用,有机器学习基础初识大模型可以参考这篇文章。


提示:以下是本篇文章正文内容,下面案例可供参考

一、大模型基础知识

自注意力机制(Self-Attention Mechanism)

自注意力机制用于计算序列中每个元素与序列中其他元素的关系或依赖性。在自然语言处理中,自注意力机制允许模型在处理一个词时,能够“看到”序列中的所有其他词。这比传统的卷积神经网络(CNN)或循环神经网络(RNN)更为有效,尤其是处理长序列时。

自注意力机制(Self-Attention Mechanism)的作用在深度学习和自然语言处理(NLP)领域中非常关键,它主要帮助模型在处理序列数据时,动态地选择性关注序列中的不同部分,从而能够捕获序列中元素之间的依赖关系,尤其是长距离的依赖关系。以下是自注意力机制的主要作用:
1. 捕捉序列中不同元素之间的依赖关系
在传统的循环神经网络(RNN)或卷积神经网络(CNN)中,模型处理序列时通常只能依赖临近的几个元素,捕捉长距离的依赖性会比较困难,尤其在RNN中,由于信息是逐步从一个时间步传播到下一个时间步,随着序列长度的增加,捕捉远距离依赖的能力会逐渐减弱,导致梯度消失问题。而自注意力机制可以在处理某个元素时,直接与序列中的每一个其他元素交互,从而轻松捕捉长距离的依赖关系。
举个例子:在翻译句子时,一个词可能与远距离的另一个词有依赖关系。例如在句子 “The cat, which was black, sat on the mat.” 中,词 “cat” 和 “sat” 是紧密相关的,尽管它们被其他词隔开了很远。自注意力机制可以让模型同时关注这些远距离的相关词汇,理解整个句子的结构。
2. 动态调整注意力权重
自注意力机制根据输入数据的特定上下文,计算每个元素对于其他元素的注意力权重,这使得模型能够动态地“决定”每个元素在当前任务中有多重要。通过这种方式,模型可以为当前处理的元素选择性地关注那些对该任务最为相关的其他元素。
例如:在机器翻译任务中,自注意力机制可以让模型重点关注源语言中与目标语言词汇高度相关的部分,而忽略其他部分。这样,翻译生成的准确性会提高,因为模型能够灵活选择相关的信息进行处理。
在这里插入图片描述在这里插入图片描述
Softmax是一种常见的激活函数层,它将输入的一个向量或张量转换为一个概率分布。具体来说,Softmax会将输入的每个元素转换为一个非负值,并确保所有输出值的总和为1,因此常用于分类任务中,尤其是多分类问题的输出层。

Softmax的作用:

  • 将数值转化为概率分布: Softmax层的输出是一个0到1之间的概率值,且这些概率值的总和等于1。这对于多分类任务非常有用,因为它可以直接反映每个类别的相对概率。例如,在图像分类中,Softmax可以将神经网络输出的数值转换为每个类别的概率,模型将选择概率最高的类别作为预测结果。
  • 平滑输入:Softmax函数将输入的值按比例缩放,这种缩放可以有效避免过大或过小的值,使得模型的输出更加平滑。相比于简单的argmax操作(即直接选择最大值),Softmax可以反映每个类的相对可能性,而不仅仅是返回单一的最大值。

Softmax与其他激活函数的区别

  • ReLU:ReLU是一种分段线性的激活函数,只保留输入的正值,负值被置为0。它常用于隐藏层。
  • Sigmoid:Sigmoid将输入值压缩到0到1之间,通常用于二分类问题的输出层。
  • Softmax:Softmax适用于多分类问题的输出层,将输入值转换为概率分布,总和为1。
    在这里插入图片描述
import torch
import torch.nn as nn
import torch.nn.functional as F

class SelfAttention(nn.Module):
    def __init__(self, embed_size, heads):
        """
        embed_size: 嵌入向量的维度
        heads: 多头注意力的头数
        """
        super(SelfAttention, self).__init__()
        self.embed_size = embed_size
        self.heads = heads
        self.head_dim = embed_size // heads
        
        assert (
            self.head_dim * heads == embed_size
        ), "Embedding size needs to be divisible by heads"
        
        # 为每个头分别定义查询、键、值的线性变换
        self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.fc_out = nn.Linear(heads * self.head_dim, embed_size)  # 最终输出的线性变换

    def forward(self, values, keys, query, mask):
        N = query.shape[0]  # batch size
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]

        # 将输入分为多头
        values = values.reshape(N, value_len, self.heads, self.head_dim)
        keys = keys.reshape(N, key_len, self.heads, self.head_dim)
        queries = query.reshape(N, query_len, self.heads, self.head_dim)

        # 对每个头计算自注意力
        values = self.values(values)  # (N, value_len, heads, head_dim)
        keys = self.keys(keys)  # (N, key_len, heads, head_dim)
        queries = self.queries(queries)  # (N, query_len, heads, head_dim)

        # 计算注意力分数 (queries * keys^T)
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])  # (N, heads, query_len, key_len)

        # 如果有mask,将不需要注意的部分置为负无穷
        if mask is not None:
            energy = energy.masked_fill(mask == 0, float("-1e20"))

        # 通过softmax计算注意力权重
        attention = torch.softmax(energy / (self.head_dim ** 0.5), dim=3)  # (N, heads, query_len, key_len)

        # 加权求和值向量
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(
            N, query_len, self.heads * self.head_dim
        )  # (N, query_len, embed_size)

        # 将多头注意力的输出拼接并通过最后的线性层
        out = self.fc_out(out)
        return out
        
输入与参数:
embed_size 是输入嵌入向量的维度。
heads 是多头注意力机制中的头数,head_dim 是每个头的维度,等于 embed_size / heads。
线性变换:
self.values、self.keys 和 self.queries 是线性层,用于将输入向量映射到不同的空间来计算查询、键和值。
重塑输入:
输入的 values、keys 和 query 被重塑为 (batch_size, 序列长度, 头数, 每头的维度),以便进行多头操作。
自注意力计算:
使用 torch.einsum 计算查询和键的点积以获得注意力分数,得到维度为 (batch_size, 头数, query_len, key_len) 的能量矩阵。
注意力权重计算:
能量矩阵通过 softmax 转化为注意力权重,并与值向量进行加权求和。
输出:
多个头的输出拼接在一起,并通过一个全连接层 fc_out 输出,最终的输出维度为 (batch_size, query_len, embed_size)。

假设你有一个输入序列,并且想要计算自注意力机制的输出:
embed_size = 256  # 嵌入维度
heads = 8  # 注意力头数
seq_length = 10  # 序列长度

# 创建自注意力层
self_attention = SelfAttention(embed_size, heads)

# 模拟输入数据,形状为 (batch_size, seq_length, embed_size)
values = torch.rand(32, seq_length, embed_size)
keys = torch.rand(32, seq_length, embed_size)
queries = torch.rand(32, seq_length, embed_size)

# 没有mask的情况下执行前向传播
out = self_attention(values, keys, queries, mask=None)
print(out.shape)  # 输出形状: (32, seq_length, embed_size)

在这个实现中,自注意力机制本身没有明确使用非线性激活函数层,如ReLU或Sigmoid。然而,这不代表自注意力机制不包含非线性元素。在Transformer的整个架构中,通常在自注意力机制的输出之后,会通过全连接的前馈网络(Feed-Forward Network, FFN)来引入非线性层。
具体来说,非线性层通常是在整个Transformer架构的每个编码器和解码器层的前馈网络部分中,而不是直接在自注意力机制内部。

Transformer 结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
多头注意力机制(Multi-Head Attention)是 Transformer 模型中核心的组成部分,也是其强大能力的来源之一。相比于单一的注意力机制,多头注意力通过引入多个注意力头来增强模型捕捉不同维度信息的能力。每个注意力头可以关注输入序列中的不同方面,使得模型在处理复杂的序列依赖时能够更全面地理解输入数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参考 Transformer详细介绍(知乎)
在这里插入图片描述

Encoder-only 和 Decoder-only

Encoder-only 模型只使用 Transformer 的编码器部分,没有解码器。它主要用于对输入进行深度理解、特征提取、分类等任务,重点在于捕捉输入的全局和局部信息。
在这里插入图片描述
Encoder-only 模型的典型代表
BERT:BERT 是典型的 Encoder-only 模型,它采用双向自注意力机制,同时关注输入序列的左右上下文。BERT 的设计目的是进行深度的语言理解,并且可以通过预训练任务(如掩码语言模型和下一句预测)来学习语义信息。

  • 掩码语言模型(MLM):模型随机遮掩输入序列中的一些词,并要求模型预测这些被遮掩的词。
  • 下一句预测(NSP):模型判断两个句子是否连续,从而学习句间关系。

通过这种双向机制,BERT 能够非常有效地捕捉上下文信息,是众多自然语言理解任务的强大工具。

Decoder-only 模型只使用 Transformer 的解码器部分,没有编码器。解码器主要用于生成任务,例如文本生成、对话生成、语言建模等。
在这里插入图片描述
Decoder-only 模型的典型代表
GPT(Generative Pre-trained Transformer):GPT 是 Decoder-only 架构的典型代表。它使用自回归方式生成文本,即在生成序列时,模型会根据之前生成的词逐步生成下一个词。GPT 模型在预训练阶段,通过大规模文本数据进行语言建模,学习词之间的相关性和语义表示。
在这里插入图片描述
Encoder-only 模型 适合自然语言理解任务,因为它使用双向自注意力,能够同时参考输入序列的所有词,帮助模型捕捉复杂的上下文依赖关系,提升对文本的理解能力。
Decoder-only 模型 适合自然语言生成任务,因为它使用单向自注意力,保证生成过程中只能依赖已生成的词,这种自回归生成方式确保模型生成出的文本是连贯和自然的。

深层次的Transformers网络,避免过拟合是一个关键问题

  • 正则化技术
    L2正则化(权重衰减): 通过在损失函数中添加权重惩罚项(通常是权重的L2范数平方),可以防止模型过度依赖某些权重,避免权重过大。这样可以让模型更泛化,避免过拟合。
    L1正则化: L1正则化会让模型倾向于将一些权重置为零,从而稀疏化模型参数,有助于控制模型复杂度。
  • Dropout
    Dropout是防止过拟合的常用技术,它通过在训练期间随机丢弃一些神经元(即使它们的激活值为零)来降低模型对特定神经元的依赖。Dropout对Transformer网络的多层感知机(MLP)层尤其有效。应用在Transformer上:可以在Transformer的注意力头、MLP层和注意力权重计算中使用Dropout。
  • 数据增强
    数据增强是通过人为地增加数据集的多样性来减少过拟合的机会。虽然在NLP中,数据增强不像计算机视觉中那么常见,但也有一些方法可用:
  • 词汇替换:随机替换同义词或同类别的词,增加语料库的多样性。
    随机Masking:对输入数据进行随机mask操作(比如BERT的Masking策略)可以帮助模型学习更鲁棒的表示。
  • 提前停止(Early Stopping)
    提前停止是在验证集上监控模型的性能,当性能不再提升(或者下降)时,提前停止训练过程。这可以防止模型继续在训练数据上学习,从而减少过拟合的风险。应用在Transformer中:在训练Transformer时,通常会监控验证集上的损失函数或某些评估指标,当发现它们不再改善时就停止训练。
  • 减少模型复杂度
    降低Transformer层数或宽度:如果模型过于复杂,可以通过减少Transformer的层数、注意力头数或隐藏单元数量来降低模型复杂度,防止过拟合。减少参数量:参数量越大,模型越有可能过拟合。可以通过精简模型架构、减少每层的参数量来控制复杂度。
  • Batch Normalization 或 Layer Normalization
    正则化方法如Layer Normalization,在Transformer中已经广泛应用。它通过对每层输出进行标准化,能够缓解梯度消失问题,并帮助模型更快地收敛,防止过拟合。
  • 使用更大的训练数据集
    拥有足够大的训练数据可以帮助减少过拟合的发生。对于Transformer网络,模型的参数量通常非常庞大,因此需要大规模的数据进行训练。通过引入更多的数据,或者从预训练模型中微调,可以有效减少过拟合的风险。
  • 预训练和微调:使用预训练的语言模型,如BERT、GPT等,能够提供一个良好的初始状态,再通过微调来适应特定任务。这种方式能够更好地利用已有的大量训练数据,避免过拟合。
  • 数据正则化:Label Smoothing:在分类问题中,label smoothing通过将目标类别的标签分布平滑化(例如,将标签从0或1调整为0.9或0.1),使得模型在训练时不至于过度自信,进而减少过拟合。
  • 增加Attention Mask:Transformer的注意力机制依赖于注意力权重。通过在训练期间引入更多的masking机制,可以有效抑制模型对某些部分信息的过度依赖。
  • 混合精度训练
    混合精度训练有助于加速模型训练,同时减小模型的浮点数计算范围,从而在一定程度上防止过拟合。这种方法不仅能加快训练速度,还能减少内存使用,帮助更好地控制模型的泛化能力。

Bert模型

BERT(Bidirectional Encoder Representations from Transformers)是一个基于双向 Transformer 编码器的预训练语言模型。BERT 的主要创新点在于它的双向自注意力机制,使得它可以在理解文本时同时参考输入序列中的前文和后文。BERT 的设计目标是让模型能够通过预训练学习语言的深层语义表示,然后在下游任务中进行微调。
虽然BERT是基于transformer的,但是它只使用了transformer的encoder部分,它的整体框架是由多层transformer的encoder堆叠而成的。每一层的encoder则是由一层muti-head-attention和一层feed-forword组成,大的模型有24层,每层16个attention,小的模型12层,每层12个attention。每个attention的主要作用是通过目标词与句子中的所有词汇的相关度,对目标词重新编码。所以每个attention的计算包括三个步骤:计算词之间的相关度,对相关度归一化,通过相关度和所有词的编码进行加权求和获取目标词的编码。
在这里插入图片描述
Embedding由三种Embedding求和而成:
在这里插入图片描述

  • 词嵌入(Token Embeddings):将输入序列中的每个词(或子词)映射为词向量。
  • 段嵌入(Segment Embeddings):BERT 允许输入两个句子,使用段嵌入区分它们,例如用𝐴表示第一个句子,用 𝐵表示第二个句子。
  • 位置嵌入(Position Embeddings):BERT 没有使用 RNN 或CNN,因此需要明确告诉模型输入中词的位置。位置嵌入向量为输入序列中的每个词引入位置信息。
    输入嵌入的最终表示形式是词嵌入、段嵌入和位置嵌入的向量加和。

BERT的训练包含pre-train和fine-tune两个阶段。pre-train阶段模型是在无标注的标签数据上进行训练,fine-tune阶段,BERT模型首先是被pre-train模型参数初始化,然后所有的参数会用下游的有标注的数据进行训练。

  • 掩码语言模型(Masked Language Model, MLM): BERT 的输入序列中的一部分词会被随机遮掩(通常是 15%的词),模型的任务是预测这些被遮掩的词。这让 BERT 能够学习如何在上下文中预测被隐藏的词,进而学会理解每个词的语义。
    举个例子,句子 “The cat sat on the [MASK]” 中,BERT 的任务是根据上下文来预测被遮掩的词是 “mat”。
  • 下一句预测(Next Sentence Prediction, NSP): BERT 会输入两个句子,模型的任务是判断第二个句子是否是紧跟第一个句子的下一句。通过这个任务,BERT 学习到了句子之间的关系,这对于诸如问答系统和自然语言推理任务非常重要。
    例如,句子对:“The cat sat on the mat.” 和 “It was a sunny day.” 不应该被认为是连续句,而句子 “The cat sat on the mat.” 和 “It looked comfortable.” 是相互相关的。

微调阶段
经过预训练后,BERT 可以被应用于各种下游任务。BERT 的设计允许通过微调来适应不同的任务:

  • 微调任务:BERT 模型可以被微调在不同的任务上,例如文本分类、命名实体识别、问答系统等。通过在少量的任务特定数据上微调预训练好的 BERT 模型,能够快速适应具体任务。
    微调的过程非常简单:BERT 的基础模型被固定,接着在其上添加一个任务特定的层(例如一个分类层),然后对整个网络进行少量的训练。由于 BERT 在预训练阶段已经学到了通用的语言表示,微调阶段的任务只是对其进行稍微调整,通常只需要较少的数据和训练时间。

BERT 的输出是一个表示序列中每个词的向量表示(通常称为词表示)。对于具体的任务,BERT 通常会在最后添加一个任务相关的层,例如:
文本分类任务:将句子的 [CLS] 标记的输出向量送入一个分类器,用于预测句子的类别。
问答任务:BERT 可以根据输入的问题和上下文,预测答案的起始和结束位置。

SBERT

SBERT 的设计目标是为每个句子生成一个独立的固定维度向量表示,便于后续计算句子之间的相似度。SBERT 将每个句子分别送入 BERT 模型(或其变体),生成每个句子的向量表示,然后可以直接通过计算两个句子向量的余弦相似度或其他距离度量来进行相似度计算。
高效性:SBERT 通过生成独立的句子嵌入,使得句子之间的比较只需要进行一次前向传播,生成每个句子的向量表示后,直接计算相似度。这相比于 BERT 大大提高了效率,尤其是在大规模语料库中的句子相似度计算和语义搜索任务中。
SBERT 的架构是在 BERT 的基础上增加了一个 Siamese(孪生网络)结构 或 Triplet(三元组)结构。这种架构允许模型同时处理两个或多个句子,并将它们分别编码成独立的向量表示。SBERT 在训练时会通过优化句子对的相似度任务(如语义文本相似度任务,STS-B),使模型能够生成语义上有意义的句子嵌入。
训练目标:SBERT 使用带有孪生网络架构的 BERT,通过使用对比损失(Contrastive Loss)或三元组损失(Triplet Loss)来优化模型,使得相似的句子向量距离更近,不相似的句子向量距离更远。这一优化目标使得 SBERT 可以更好地捕捉句子的语义表示,适用于相似度计算和文本检索任务。

损失函数为:
在这里插入图片描述

大模型的训练步骤

1. 数据准备(Data Preparation)

  • 数据收集:为模型准备大量的训练数据集。这些数据可以来自多种来源,如网络爬取、公开数据集、领域特定数据集等。大模型的训练往往需要数百GB甚至TB的数据。
  • 数据清洗:对收集到的数据进行清洗,去除噪声、不相关内容或重复数据,确保数据质量。对于NLP任务,还可能进行文本的预处理,比如标点符号处理、去除HTML标签等。
  • 数据标注:对于有监督任务,需要准备标注数据(如分类标签、对话对等)。在无监督任务中,通常不需要标注,但仍需要定义目标任务(如语言模型的下一个词预测任务)。

2. 预训练(Pre-training)

  • 无监督预训练:大模型的预训练阶段通常是在大量的无标签数据上进行。预训练任务可以是语言模型任务(如GPT的自回归生成)或者掩码语言模型任务(如BERT)。
  • 目标任务:预训练的目标是让模型学习广泛的语言知识和上下文关联。比如在GPT模型中,模型需要基于前面的单词预测下一个单词;在BERT中,模型通过掩盖部分单词然后预测这些被掩盖的单词来学习语言表示。
    大规模计算:预训练通常需要非常庞大的计算资源,如大型GPU或TPU集群,因为模型参数量巨大,训练时间可能需要数周或数月。

3. 微调(Fine-tuning)

  • 任务特定的微调:在预训练完成后,模型通常会被微调,以适应特定的任务。比如,可以使用已经预训练好的模型在特定的分类任务、对话生成任务、问答任务上进行有监督的微调。
  • 迁移学习:由于大模型通过预训练学习到了广泛的语言知识,微调只需要少量任务特定的数据,便可以取得良好的效果。这种方式叫做迁移学习,即利用预训练模型中的知识转移到新的任务上。
  • 冻结部分层:在微调过程中,可能会冻结部分预训练好的层,只对新任务相关的层进行训练,避免模型过拟合和减少计算资源。

4. 监督微调(Supervised Fine-tuning, SFT)

  • 有标签数据训练:在这个阶段,使用有监督的标签数据对预训练模型进行微调。这个过程让模型能够专门针对某一类任务表现更好。
  • SFT的目标:SFT的主要目的是让模型在给定任务上能够学习具体的任务规则。例如,在对话生成中,通过SFT模型能够生成与训练数据一致的对话回复。

5. 基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)

  • 收集人类反馈:模型在生成输出后,会让人类对输出进行评价。评价可以是质量、逻辑、礼貌等维度。通过这些反馈数据来训练奖励模型(Reward Model),以区分高质量和低质量的生成。
  • 奖励模型训练:根据人类反馈训练奖励模型,奖励模型用于评估模型生成的输出质量。
  • 强化学习优化模型:使用奖励模型和强化学习算法(如PPO, Proximal Policy Optimization)来进一步优化模型,使其生成更符合人类偏好的内容。RLHF通常被用来改善对话系统和生成任务中的输出质量。

6. 模型优化与压缩(Model Optimization and Compression)

  • 剪枝(Pruning):通过移除冗余的神经元或权重减少模型的计算复杂度,同时保持较好的性能。
  • 模型蒸馏(Distillation):将大型模型的知识传递给小型模型,从而使小型模型保留原模型的性能,但计算资源需求更低。
  • 模型量化(Quantization):将模型的浮点运算转换为低精度定点运算,从而减少存储和计算资源。

7. 模型验证与评估(Validation and Evaluation)

  • 验证集评估:在训练过程中通过验证集评估模型性能,确保模型没有过拟合或欠拟合。
  • 评价指标:根据任务的不同,使用不同的评估指标来衡量模型的效果。例如在分类任务中,使用准确率(Accuracy)、F1分数;在生成任务中,使用BLEU、ROUGE等指标。
  • 超参数调整:通过调整模型的超参数(如学习率、批量大小)进一步优化模型性能。

8. 模型部署(Model Deployment)

  • 推理优化:在实际应用中,需要对模型进行优化以减少推理时间和资源消耗。可以使用如模型压缩、量化等技术。
  • 线上部署:将模型部署到生产环境,为用户提供在线服务。
  • 持续学习与更新:在部署后,可以通过持续学习(如从用户反馈中学习新数据)来不断更新模型,确保其在真实环境中的表现持续改进。

优化算法

模型剪枝(Pruning)

模型剪枝(Pruning)是一种用于减少神经网络模型复杂度的优化技术,其目标是在保持模型性能的前提下,通过移除冗余的神经元或连接(权重)来减小模型规模、降低计算量和存储需求。剪枝可以显著提高模型的推理速度、减少资源占用,并且在某些情况下还能防止过拟合。

冗余权重与神经元:神经网络中的许多权重和神经元可能对模型的预测贡献较小,或者在训练过程中起到的作用微乎其微。这些冗余的部分可以通过剪枝技术进行删除,而不会显著降低模型的精度。
剪枝的目标:通过移除不重要的权重和神经元,减小模型的尺寸,提升推理速度,并减少模型的存储需求。

类型

  • 结构化剪枝(Structured
    Pruning)
    :剪枝整个卷积核、神经元或层。这种方法能够直接减少网络结构中的某些部分,因此更容易应用于硬件加速。然而,过度的剪枝可能导致性能损失。
  • 定义:结构化剪枝是移除整个神经元、卷积核或层等网络的结构单元。与非结构化剪枝不同,结构化剪枝会改变网络的拓扑结构。
  • 操作方式:选择移除某些神经元或整个卷积核。这通常是通过设定一个剪枝率来确定要剪掉的层数或神经元个数,比如移除具有较低权重或对输出贡献较小的卷积核或整个通道。
  • 优点:结构化剪枝后,模型的计算复杂度显著降低,且更适合硬件加速器的运算,因为不再需要处理稀疏矩阵。
  • 缺点:结构化剪枝对模型的性能影响较大,因为剪枝直接改变了网络结构,可能导致模型能力的显著下降。
  • 非结构化剪枝(Unstructured
    Pruning)
    :删除权重较小的单个连接,而不改变网络结构。这种方式可以非常精细地减少参数数量,但不利于硬件上的计算优化。
  • 定义:非结构化剪枝是逐个移除网络中的权重,不改变网络的整体结构。即在网络的任何位置,权重数值较小或贡献不大的连接(权重)都会被移除,但网络的拓扑结构保持不变。
  • 操作方式:通过设定一个阈值,当权重的绝对值低于这个阈值时,认为该权重对模型输出影响较小,可以将其设为0。这样可以减少网络中非零权重的数量,减小计算量。
  • 优点:最大程度上减小了模型的参数量,因为可以非常精细地选择哪些权重需要移除。
  • 缺点:非结构化剪枝后的模型仍然保持原始的网络结构,硬件计算时仍然需要处理稀疏矩阵操作,无法显著提高计算效率,特别是在硬件加速器(如GPU、TPU)上。

具体步骤:
1. 训练模型:首先正常训练模型,使其达到一个较好的初始性能。
2. 权重剪枝:剪去网络中权重较小的部分,或者剪去影响不大的神经元。
3. 微调(Fine-tuning):剪枝后对模型进行微调,以恢复模型在剪枝过程中可能损失的性能。

优点:
剪枝后模型体积减小,推理速度提升。
在计算资源有限的设备(如移动设备)上尤其有用。
挑战:
剪枝可能导致模型性能下降,需要仔细选择剪枝比例并通过微调来恢复性能。

模型蒸馏(Distillation)

模型蒸馏(Model Distillation)是一种知识蒸馏(Knowledge Distillation)的技术,主要用于在保留大型模型性能的同时,将知识传递给较小的模型,从而减少计算资源需求,提高推理速度。模型蒸馏的核心思想是利用一个已经训练好的大型模型(称为教师模型,Teacher Model)来指导一个较小的模型(称为学生模型,Student Model)的训练,使学生模型在性能上尽量接近教师模型,但占用的资源和计算量更少。蒸馏技术在深度学习中的应用非常广泛,特别是在移动设备、实时系统等资源有限的场景中尤为重要。
1. 模型蒸馏的基本概念

  • 教师模型(Teacher
    Model)
    :通常是一个经过完整训练的大型模型,它在一个任务上表现出色,能够提供高精度的预测结果,但计算复杂度和内存需求较大。
  • 学生模型(Student
    Model)
    :这是一个较小的模型,其参数数量和复杂度远小于教师模型。通过学习教师模型的输出,学生模型可以在性能上接近教师模型,同时降低计算开销。
  • 软标签(Soft
    Labels)
    :教师模型输出的概率分布(软标签)包含了更多的语义信息,而不仅仅是硬标签(即正确分类)。这些软标签帮助学生模型捕捉到教师模型中学到的更深层次的特征。

2. 模型蒸馏的原理
在模型蒸馏过程中,通常会使用两种损失函数来训练学生模型:
软标签损失(Soft Target Loss):这是核心的蒸馏过程,它利用教师模型生成的输出概率分布(软标签)来引导学生模型的学习。软标签能够提供更丰富的信息,因为它不仅传递了正确类别的概率,也包含了模型对错误类别的评估。
硬标签损失(Hard Target Loss):这是经典的监督学习损失,学生模型根据真实标签进行学习。例如在分类任务中,真实的类别标签是硬标签,学生模型通过交叉熵损失来学习这些标签。
在这里插入图片描述
3. 蒸馏的训练过程如下:

  • 训练教师模型:首先训练一个性能优越的教师模型,这通常是一个较大的神经网络,可以在任务上表现出色。
  • 蒸馏学生模型:学生模型通过两种方式进行训练:一方面学习教师模型的输出(软标签),另一方面通过真实的硬标签进行监督训练。学生模型通过组合这两部分的损失来优化自身的权重。
  • 调整温度参数:选择合适的温度参数 T,使得学生模型能够更好地学习教师模型的概率分布

4. 模型蒸馏的挑战

  • 教师模型的选择:选择一个性能足够好的教师模型是关键。如果教师模型的性能不足,学生模型将无法从中学习到有用的特征,可能会限制学生模型的性能提升。
    学生模型的架构设计:学生模型的设计需要找到一个合适的权衡。虽然学生模型的目标是减少计算量和模型参数,但如果模型过于简单,可能无法充分学习到教师模型传递的知识。
    温度参数 T 的调优:温度参数的选择直接影响教师模型输出的概率分布平滑程度。温度太高或太低都可能影响学生模型的学习效果。通常需要通过实验来确定合适的温度值。

5. 模型蒸馏的扩展与应用
任务层次的蒸馏:蒸馏可以应用于不同任务。除了经典的分类任务,蒸馏还可以用于其他任务,如目标检测、语义分割、对话生成等。学生模型可以通过教师模型学习不同任务上的知识。
跨模型类型的蒸馏:教师模型和学生模型不必是相同类型的网络。例如,教师模型可以是一个深层的卷积神经网络,而学生模型可以是一个轻量级的卷积神经网络或甚至是一个完全不同类型的模型。这种跨模型的蒸馏使得该技术具有更广泛的应用场景。
序列任务中的蒸馏:在自然语言处理(NLP)任务中,模型蒸馏也得到了广泛应用。像BERT这样的预训练语言模型可以作为教师模型,而较小的Transformer模型可以作为学生模型,通过蒸馏来学习。

6. 模型蒸馏的典型应用
BERT蒸馏:BERT是一个大型预训练语言模型,但其模型规模庞大,难以在低资源设备上运行。蒸馏BERT(DistilBERT)通过将BERT作为教师模型,训练了一个更小的BERT模型,该模型保留了BERT的大部分性能,但推理速度显著提高。
视觉任务中的蒸馏:在计算机视觉中,ResNet等大型卷积神经网络常用于作为教师模型,训练小型的卷积神经网络或轻量级模型(如MobileNet)以便在移动设备或嵌入式系统中应用。

补充:交叉熵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模型量化

模型量化(Quantization) 是一种用于优化深度学习模型的技术,通过将模型的权重和激活值从高精度表示(如32位浮点数)转换为低精度表示(如8位整数),从而减少计算资源需求和存储占用,并提高推理速度。量化技术特别适合在嵌入式设备、移动设备或其他计算资源有限的环境中使用。
量化技术可以分为以下几种常见类型:
动态量化(Dynamic Quantization)
定义:动态量化是在模型推理过程中动态地将权重从浮点数转换为低精度整数(如INT8),而激活值仍以浮点数计算。这种方法可以在不需要重新训练模型的情况下减少计算复杂度。
步骤:
在推理时,将权重值动态地从浮点数转换为低精度的整数。
在每一次计算过程中,将权重转换为整数形式,然后再进行卷积或矩阵乘法操作。
优点:无需对模型进行重新训练,适合那些已经经过训练的模型直接部署。
缺点:激活值仍以浮点数计算,因此计算复杂度的降低有限。
静态量化(Static Quantization)
定义:静态量化是指在推理之前对模型的权重和激活值都进行量化,且这些量化操作是静态执行的,不依赖于推理过程中的数据分布。通过在推理前确定量化参数(如零点和量化比例因子),可以显著降低计算复杂度
步骤:
在模型推理前,对模型权重和激活值进行量化,将它们转换为整数形式。
量化时会确定每一层的量化参数,如量化比例(scale)和零点(zero-point),用于将浮点数映射到低精度整数。
在推理时,所有计算都基于低精度表示完成。
优点:显著减少内存占用和计算量,特别是在推理过程中能带来较大的加速效果。
缺点:需要对模型进行重新量化,并且量化后的模型可能需要重新调优,确保性能不下降太多。
量化感知训练(Quantization Aware Training, QAT)
定义:量化感知训练是指在模型训练过程中模拟量化操作,使得模型能够在训练时适应低精度计算,从而在量化后保持较高的性能。QAT通过在训练时引入量化误差,使模型逐渐适应量化后的计算环境。
步骤:
在模型训练过程中,插入模拟量化操作,即在前向传播时对权重和激活值进行量化,模拟推理时的低精度计算。
反向传播时仍然使用高精度浮点数来更新模型参数,以保持梯度计算的准确性。
完成训练后,模型在推理时可以直接使用量化参数进行低精度计算。
优点:相比于静态量化和动态量化,量化感知训练能最大程度上减少量化引入的精度损失,保持模型在推理时的高性能。
缺点:需要重新训练模型,训练成本较高,且训练过程复杂。

二、prompt

Prompt(提示)是指输入给一个生成模型的文本或指令,用于引导模型产生特定输出。在自然语言处理(NLP)任务中,尤其是在大规模预训练生成模型(如 GPT-3、ChatGPT 等)中,prompt 是与模型交互的核心方式通过设计合适的 prompt,用户可以控制模型生成特定类型的文本、回答问题、执行任务等。

Prompt 的概念

在生成模型中,prompt 通常是用户提供给模型的一段文本,它定义了模型要执行的任务或生成的内容。prompt 的形式可以非常灵活,例如:

  • 问题或问题提示(如 “What is the capital of France?”)
  • 未完成的句子或短语(如 “The sun
    rises in the east and…”)
    任务指令(如 “Write a summary of the following
    text:”)

Prompt 的作用是给生成模型提供上下文信息,模型根据这个上下文来理解生成任务,并根据其内部的预训练知识或推理能力生成合适的输出。

在这里插入图片描述
Prompt 在生成模型中的作用
Prompt 在生成模型中的主要作用是引导生成。由于生成模型是基于输入的上下文进行预测或生成,因此 prompt 起到了限定生成范围的作用。通过设计合理的 prompt,用户可以有效地控制模型的行为。

1. 提供上下文信息
Prompt 是生成模型的起点,它告诉模型任务的背景或问题。例如,如果你向模型输入“Write a story about a robot”,模型就会理解你期望生成的是一个关于机器人的故事。prompt 为模型提供了必要的上下文,使得模型可以基于这些上下文进行推断和生成。

2. 任务指示
Prompt 也可以明确指示模型执行某种特定的任务。通过特定的提示形式,用户可以引导模型完成特定的操作。例如:
“Summarize the following text:” 用于指示模型执行摘要任务。
“Translate this sentence to French:” 用于指示模型执行翻译任务。
Prompt 的灵活性使得同一个生成模型可以处理多种不同类型的任务,所有这些任务的切换都依赖于 prompt 的设计。

3. 控制生成风格和结构
在某些情况下,prompt 也可以用于控制模型生成文本的风格、结构、语气等。例如,如果你向模型提供以下 prompt:
“Write a formal letter to a business client.”
“Generate a humorous story about a lost cat.”
模型将生成与提示风格一致的输出。通过清晰地定义 prompt,用户可以调整模型生成的内容形式,使得模型输出更加符合预期。

prompt属于大模型中的哪一部分?

Prompt 并不是大模型训练中的一部分,而是大模型使用时(特别是在推理阶段)与模型交互的方式。它的作用是在已经训练好的大模型上,提供明确的输入,引导模型生成合适的输出。简单来说,prompt 是给定给大模型的一段文本或任务指令,用于控制模型的生成行为。Prompt 也并不是模型微调(fine-tuning)中的一部分,而是在模型已经训练完成(预训练或微调之后),进入推理阶段时使用的一种方法。在生成任务中,prompt 作为输入,给模型提供明确的指令或上下文信息,引导模型生成所需的输出。

  • 目的:Prompt 是在模型的推理阶段引导模型生成特定输出的一种输入方式。它不会修改模型的内部参数,而是通过设计适当的输入文本,明确告诉模型你想要它完成的任务。
  • 过程:prompt 是在模型已经完成训练(无论是预训练还是微调)之后,直接用于推理阶段。模型根据输入的 prompt 提示生成文本、回答问题、翻译句子等任务。
  • 应用场景:prompt 在没有进行微调的模型上非常常见,特别是在大规模预训练模型(如GPT-3)上,用户不需要对模型进行微调,只需要提供一个好的 prompt,就可以让模型执行各种任务。

Prompt 和大模型预训练的关系

  1. 预训练阶段:在大模型的训练过程中,模型会在大规模的无监督语料上进行预训练,学习语言的基础知识和模式。这种预训练通常使用任务,比如语言模型(Language
    Modeling),或者其他类似的任务(如掩码语言模型 Masked Language Model,下一句预测 Next
    Sentence Prediction)。在这个阶段,模型并不知道最终会处理什么具体任务,它主要是在学习语言的统计特征和语义关联。
  2. 微调和使用阶段:在预训练之后,模型可以用于特定的任务,这时我们通常会使用 prompt 来引导模型完成这些任务。prompt 作为输入的一部分,通过提供明确的任务指令或上下文信息,引导模型生成所需的内容。例如,当我们向模型提供 “Translate this sentence to French: ‘Hello, how are you?’”,模型会根据这个 prompt 生成正确的法语翻译。
  3. Prompt 使用不涉及参数更新:在使用 prompt 时,模型的参数不会发生变化。它是一种利用模型现有能力的方式,而不是通过进一步训练来调整模型的能力。因此,prompt 不涉及任何模型参数的更新。
  4. 微调会更新模型参数:微调是在特定任务上进一步训练模型,模型的参数会根据特定任务的数据进行调整。例如,如果要微调 BERT 模型用于情感分类,模型在情感分类数据集上训练后,参数会被更新,使得模型能够在这个任务上表现得更好。

Prompt 的使用是在推理阶段,而不是预训练阶段:

  1. 预训练阶段:模型会在大量数据上进行无监督或自监督训练,模型通过这些大规模的训练数据学习到语言的表示和模式。在这个阶段,模型不依赖 prompt,只是通过自动化的方式处理输入数据。
  2. 微调:是对模型的进一步训练,以适应特定任务。它会通过提供任务相关的数据集来更新模型的参数。Prompt 是用户在模型已经训练完成之后使用的提示,用于控制模型在推理阶段生成所需的内容,不会涉及模型参数的更新。
  3. 推理阶段(使用阶段):模型经过预训练之后被应用于实际任务。这时,用户通过构建合适的 prompt(输入文本或任务指令),告诉模型该做什么。这就是为什么 prompt 是与生成模型交互的核心。

举个例子

  • 预训练阶段:假设一个语言模型(如
    GPT-3)在大规模文本数据上进行预训练,任务是预测下一个词。模型会学习在各种上下文中如何生成合理的下一个词。这时,模型没有明确的任务,只是在学习如何理解和生成语言。
  • 微调的例子:你有一个预训练好的 BERT 模型,你想用它来做情感分析任务。你收集了一个标注好的情感分类数据集,并在这个数据集上对BERT 进行微调,更新模型的参数。训练之后,BERT 模型就专门用于情感分析任务。
  • 推理阶段(使用 prompt):当你使用 GPT-3 时,给它输入一个 prompt,例如 “Write a short poem about the ocean”,这就是在引导模型生成与海洋相关的诗。prompt 告诉模型你想要生成的内容,从而控制输出。

Prompt 在大模型中的重要性
在一些非常大的预训练模型中(如 GPT-3),prompt 的设计和使用非常关键。GPT-3 之类的大模型在很多任务上并不需要微调,而是依靠 prompt 进行任务切换。一个设计得当的 prompt 能够引导模型生成所需的内容,而不需要进行专门的任务训练。因此,prompt 工程(Prompt Engineering)变得非常重要,通过优化 prompt,可以提高模型生成的质量和任务表现。

三、 RAG

RAG(Retrieval-Augmented Generation)的主要作用是将检索(Retrieval)和生成(Generation)结合在一起,提升大模型在生成任务中的表现。RAG 通过从外部知识库中检索相关信息,并将这些信息作为上下文输入到生成模型,增强模型在面对复杂问题或知识密集型任务时的生成能力。

RAG的作用

在这里插入图片描述
RAG 的核心概念:RAG 是一种将检索增强与生成模型结合的框架。它在处理自然语言生成任务时,先从外部知识库中检索相关文档或信息片段,然后将这些检索到的内容作为生成任务的额外上下文,最终生成输出。这种设计在需要广泛知识背景的任务中非常有效,比如开域问答(Open-Domain Question Answering)和其他知识密集型任务。

RAG 的基本工作流程可以分为两步:

  • 检索(Retrieval):模型首先通过输入的查询从一个外部知识库中检索出与输入最相关的文档或片段。
  • 生成(Generation):检索到的文档片段作为上下文传递给生成模型,生成模型基于这些检索到的信息和原始输入,生成最终的答案或文本。

RAG 的工作原理

RAG 并不是单一的模型,而是一种框架,RAG 是通过结合检索模块和生成模块来完成任务的
1. 检索模块(Retriever Module)
RAG 首先使用检索模块从一个大规模的知识库中获取与输入查询相关的文档片段。检索模块通常基于嵌入向量匹配的方式进行。
输入的查询会被映射为一个向量表示,通过嵌入检索系统(如使用 BERT 或其他预训练模型生成的嵌入)来找到与输入查询最相关的文档。
常见的检索方式包括:
稠密向量检索:基于嵌入的稠密表示进行检索,使用深度学习模型生成输入和文档的嵌入,并通过向量的相似度(如余弦相似度)找到最相关的文档。
稀疏向量检索:使用传统的信息检索技术,如 TF-IDF 或 BM25,来根据关键词匹配进行检索。
2. 生成模块(Generator Module)
在检索到的文档片段基础上,生成模块接收这些片段以及原始的输入,并根据它们生成最终的输出。生成模块通常是一个基于 Transformer 的生成模型,如 BART、T5、GPT 等。
生成过程:生成模型会将原始输入和检索到的文档片段一起处理,将检索到的信息与原有的语言模型知识结合起来,生成回答或新的文本。生成模块不仅依赖自身的预训练知识,还能从动态检索的外部信息中补充内容。
在这里插入图片描述
在这里插入图片描述
RAG(Retrieval-Augmented Generation) 不是在大模型训练过程中的某个单独部分,而是一种结合检索和生成的技术框架。它通过预训练生成模型和检索模块的结合,在推理过程中引入外部知识库来增强模型的生成能力。RAG 既可以在微调阶段中使用,也可以在推理阶段中使用。
在这里插入图片描述在这里插入图片描述
总结

  • RAG
    应用于推理阶段,主要通过从外部知识库中检索相关信息,然后结合这些信息生成输出。它特别适用于知识密集型任务,如开域问答、对话生成、新闻生成等。
  • RAG 也可以在微调阶段进行优化,调整检索和生成模块,以更好地适应特定任务的需求。
  • 典型应用场景包括开域问答、知识型对话、信息生成任务、内容摘要等,RAG 通过结合外部知识,显著提升了生成模型的生成质量。

四、大模型常见方法和模型

1. 预训练阶段方法

在这里插入图片描述
在这里插入图片描述

2.预训练模型

在大规模语言模型(LLM,Large Language Model)领域,有许多著名的模型,它们在自然语言处理(NLP)任务中表现出色。这些模型大多基于Transformer 架构,通过大规模的预训练学习丰富的语言表示,适用于文本生成、翻译、问答、分类等多种任务。

1. GPT 系列(Generative Pre-trained Transformer)

  • 开发者:OpenAI
  • 简介:GPT 是一种基于自回归语言模型的生成模型,通过预训练后的逐词生成机制进行文本生成。
  • 模型版本:
    GPT-2:具有数亿至数十亿个参数,擅长文本生成、问答、对话生成等任务。
    GPT-3:拥有 1750 亿个参数,是目前最知名的大模型之一,支持多种任务,包括文本生成、问答、翻译、代码生成等。
    GPT-4:进一步提升了模型的生成能力,并加入了多模态能力,能够处理文本和图像输入。
  • 应用场景:文本生成、对话生成、机器翻译、代码生成、内容创作等。

2. BERT(Bidirectional Encoder Representations from Transformers)

  • 开发者:Google AI
  • 简介:BERT 是一种双向编码器模型,擅长自然语言理解任务,通过**掩码语言模型(MLM)和下一句预测(NSP)**进行预训练。
  • 特点:BERT 的双向性使其可以捕捉上下文中的双向信息,非常适合文本分类、问答系统、命名实体识别等理解类任务。
  • 模型版本:
    BERT-base:110M 参数。
    BERT-large:340M 参数。
  • 应用场景:文本分类、问答系统、情感分析、命名实体识别、自然语言理解任务。

3. T5(Text-to-Text Transfer Transformer)

  • 开发者:Google Research
  • 简介:T5 将所有 NLP 任务都转换为“文本到文本”的格式,这使得 T5 在各种任务上具有很好的泛化能力。
  • 特点:T5 通过将不同任务(如分类、翻译、生成等)统一建模,能够轻松适应多种任务形式。
  • 模型版本:
    T5-small:60M 参数。
    T5-base:220M 参数。
    T5-large:770M 参数。
    T5-3B:3B 参数。
    T5-11B:11B 参数。
  • 应用场景:文本生成、机器翻译、摘要生成、文本分类、问答系统.

4. RoBERTa(Robustly Optimized BERT Pretraining Approach)

  • 开发者:Facebook AI(现 Meta AI)
  • 简介:RoBERTa 是对 BERT 进行优化的版本,它去掉了 BERT 的下一句预测任务,并使用更大的批量和更多的数据进行预训练。
  • 特点:通过更长时间的训练和更大的数据集,RoBERTa 在许多任务上超过了 BERT 的表现。
  • 模型版本:
    RoBERTa-base:125M 参数。
    RoBERTa-large:355M 参数。
  • 应用场景:文本分类、情感分析、问答系统、自然语言理解任务。

5. BART(Bidirectional and Auto-Regressive Transformers)

  • 开发者:Facebook AI(现 Meta AI)
  • 简介:BART 是一种结合了 BERT 和 GPT 思想的模型,使用编码器-解码器结构,既支持双向编码,又可以进行自回归生成,适合生成任务。
  • 特点:BART 可以用于文本生成、机器翻译、问答等生成和理解任务,表现非常灵活。
  • 应用场景:文本生成、机器翻译、摘要生成、对话系统、问答系统。

6. XLNet

  • 开发者:Google Brain 和 CMU
  • 简介:XLNet 通过改进的自回归语言建模技术,克服了 BERT 的一些局限性。它结合了自回归和双向上下文的优势,适用于多种 NLP 任务。
  • 特点:XLNet 在语言模型任务上优于 BERT,因为它通过训练捕捉双向和序列关系。
  • 应用场景:文本分类、情感分析、问答系统、语言建模任务。

7. ALBERT(A Lite BERT)

  • 开发者:Google Research
  • 简介:ALBERT 是 BERT 的一种轻量级版本,旨在通过减少参数量来提升效率。通过分解词嵌入矩阵和共享层参数,ALBERT 取得了更好的效率,并保持了 BERT 的强大性能。
  • 特点:与 BERT 类似,但参数量大幅减少,训练和推理速度更快。
  • 应用场景:文本分类、命名实体识别、情感分析、自然语言理解任务。

8. Turing-NLG

  • 开发者:Microsoft
  • 简介:Turing-NLG 是微软开发的一个自然语言生成模型,类似 GPT,采用自回归生成方式进行文本生成。
  • 特点:Turing-NLG 是微软目前最大的生成模型之一,拥有 170 亿参数,专注于高质量的文本生成任务。
  • 应用场景:文本生成、对话系统、机器翻译等。

9. ERNIE(Enhanced Representation through Knowledge Integration)

  • 开发者:百度
  • 简介:ERNIE 是基于 BERT 的一种语言模型,百度通过将知识图谱和语义关系结合到模型中,使其对中文自然语言处理任务有更好的表现。
  • 特点:与 BERT 类似,但增强了知识整合能力,尤其在中文 NLP 任务上表现优异。
  • 应用场景:中文文本分类、命名实体识别、问答系统、自然语言理解任务。

10. LLaMA(Large Language Model Meta AI)

  • 开发者:Meta AI(Facebook)
  • 简介:LLaMA 是 Meta 开发的一个大规模语言模型,专注于在资源受限的环境中提供高效的语言处理能力。LLaMA 通过优化计算资源,提高了大模型的效率。
  • 特点:LLaMA 提供了多个参数规模的模型(7B、13B、30B、65B),适合不同计算资源的用户。
  • 应用场景:文本生成、对话系统、问答系统、自然语言处理任务。

11. Megatron-Turing NLG

  • 开发者:NVIDIA 和 Microsoft
  • 简介:Megatron-Turing NLG 是目前全球最大规模的语言模型之一,拥有 5300 亿参数,采用自回归生成方式进行大规模文本生成任务。
  • 特点:具备极强的生成能力和理解能力,适用于复杂的自然语言任务。
  • 应用场景:文本生成、机器翻译、对话系统、复杂的文本处理任务。

12. GLaM(Generalist Language Model)

  • 开发者:Google
  • 简介:GLaM 是 Google 的一个稀疏专家(Mixture-of-Experts, MoE)模型。它通过将模型的不同部分用于不同任务来提高效率。
  • 特点:采用稀疏专家结构,可以根据任务只激活一部分模型,提高计算效率。
  • 应用场景:文本生成、问答系统、多任务学习。

3.微调方法

1. 经典的微调方法
(1) 全参数微调(Full Fine-Tuning)

  • 方法简介:全参数微调是最常见的微调方法,它指的是在特定任务上对整个预训练模型的参数进行微调。通过为下游任务提供带标签的数据,优化整个模型的权重,以使其适应特定任务。
  • 适用场景:当拥有充足的计算资源和较大规模的任务数据时,全参数微调是最直接和有效的方法,适用于自然语言处理任务中的文本分类、问答、机器翻译等。
  • 优点:可以充分发挥预训练模型的能力,模型可以对下游任务进行全面的优化。
  • 缺点:大模型的全参数微调非常昂贵且计算资源消耗大,尤其在处理拥有数亿或数十亿参数的模型时。

(2) 冻结部分参数的微调(Partial Fine-Tuning)

  • 方法简介:在这种方法中,预训练模型的大部分参数被冻结,只对少量层或模块进行微调。例如,可以选择只微调最后几层,或者仅微调自注意力层的参数,而其他层保持不变。
  • 适用场景:适合在计算资源有限的情况下微调模型,同时又希望保持模型的大部分预训练能力。
  • 优点:减少了需要更新的参数量,因此计算开销较小。
  • 缺点:由于模型的大部分参数未被更新,可能在某些任务上无法达到全参数微调的效果。

2. 参数高效微调方法
随着大模型的参数规模越来越大,研究者们提出了许多参数高效微调方法,这些方法可以通过对模型的少量参数进行微调或插入新的小模块来适应新任务,从而减少训练时间、显存占用和计算开销。

(1) LoRA(Low-Rank Adaptation of Large Language Models)

  • 方法简介:LoRA 是一种低秩近似方法,在微调时引入低秩矩阵来表示权重变化,而不是直接更新模型中的大矩阵。具体而言,LoRA在模型的某些层中插入两个低秩矩阵 𝐴 和 𝐵,通过微调这两个小矩阵来捕捉模型的权重调整
  • 适用场景:适合处理大规模模型(如 GPT、T5)的微调任务,在显存或计算资源受限的情况下非常有效。
  • 优点:显著减少了需要更新的参数量和显存占用,同时性能几乎不损失。
  • 缺点:虽然降低了计算成本,但在极端情况下可能略微限制模型的表示能力。

(2) Adapter 模型

  • 方法简介:Adapter是一种轻量级的模块,在预训练模型的不同层之间插入小的适配器模块,预训练模型的主干参数保持不变,而适配器模块的参数通过微调来学习新任务的特征。典型的Adapter 结构包括一个降维层、非线性激活函数和升维层
  • 适用场景:在需要处理多个任务或领域的场景中特别适用,例如一个模型需要在多任务上微调时,Adapter 可以为每个任务插入特定的适配器模块,而不改变原始模型的结构。
  • 优点:Adapter 模块非常小,因此更新的参数量也很小,适合多任务学习和资源受限的场景。
  • 缺点:在某些任务上可能表现不如全参数微调。

(3) Prefix Tuning

  • 方法简介:Prefix Tuning通过在输入序列前面添加一个可学习的前缀(Prefix)来微调模型,而不是直接微调模型本身的参数。这个前缀与模型的输入连接在一起,作为模型的额外输入,从而引导模型更好地完成特定任务。
  • 适用场景:适用于生成类任务,如文本生成、翻译和对话系统等。
  • 优点:只需优化少量的前缀参数,而无需更新整个模型,从而大幅减少了微调成本。
  • 缺点:在某些任务中,性能可能不如全参数微调。

(4) Prompt Tuning

  • 方法简介:Prompt Tuning是一种通过优化模型的**输入提示(prompt)**来微调模型的技术。具体做法是为每个下游任务设计特定的提示模板(prompt),然后通过优化这些提示,使得预训练模型能够在不修改其内部参数的情况下执行任务。
  • 适用场景:适用于生成任务和语言理解任务,例如问答系统、文本分类、对话生成等。
  • 优点:参数更新非常少,只需调整输入提示,不需要更新模型参数,计算开销小。
  • 缺点:Prompt 的设计需要很高的技巧,且模型可能在复杂任务上表现较弱。

(5) BitFit

  • 方法简介:BitFit 是一种极简微调技术,指只微调大模型中的偏置项(bias parameters),其余参数保持不变。模型中的偏置项参数相对较少,因此微调时更新的参数量大幅降低。
  • 适用场景:适用于需要微调大量任务的场景,特别是当计算资源非常有限时。
  • 优点:只需微调少量的偏置项,显著降低了微调成本。
  • 缺点:与全参数微调相比,性能可能略有下降。

3. 多任务和跨任务微调

(1) 多任务学习微调

  • 方法简介:多任务学习微调指的是在微调过程中,让模型同时处理多个任务。通过为模型提供多任务数据集进行训练,模型可以学习到跨任务的通用特征。
  • 适用场景:适合需要处理多个相关任务的场景,如问答、文本分类和情感分析等任务的联合微调。
  • 优点:通过同时学习多个任务,模型可以共享特征,增强模型的泛化能力。
  • 缺点:多任务学习的训练过程复杂度较高,任务间的冲突可能影响模型性能。

(2) 迁移学习(Transfer Learning)

  • 方法简介:迁移学习通过先在某个源任务上微调模型,然后将微调好的模型用于目标任务,特别是在源任务和目标任务具有相似性的情况下,这种方法能够很好地提升目标任务的性能。
  • 适用场景:特别适合在目标任务数据较少的情况下,通过迁移学习来提升模型的表现。
  • 优点:通过借鉴源任务的知识,能够显著提升目标任务的性能,尤其是在数据不足的情况下。
  • 缺点:源任务和目标任务的差异过大会影响迁移效果。

4. 其他微调方法

(1) 层冻结微调(Layer Freezing)

  • 方法简介:层冻结微调是一种策略性冻结部分模型层的技术,即只微调特定的几层,而将其他层冻结保持不变。通常是在模型的后几层上进行微调,因为这些层较为专注于特定任务的特征表示。
  • 适用场景:适合需要快速微调模型,且计算资源有限的场景。
  • 优点:减少了计算负担,尤其适合在资源受限的情况下进行大模型微调。
  • 缺点:可能无法捕捉到更深层次的特征,效果不如全参数微调。

(2) 知识蒸馏(Knowledge Distillation)

  • 方法简介:知识蒸馏通过将预训练大模型作为教师模型,然后训练一个较小的学生模型,使其模仿教师模型的输出。学生模型能够保留大模型的性能,同时大大减少计算资源和内存消耗。
  • 适用场景:适合需要将大模型压缩为小模型以进行高效推理的场景。
  • 优点:学生模型体积小,推理速度快,适合部署在低

微调方法的选择

  • 任务类型:根据具体任务(如分类、生成、翻译)选择合适的微调方法和模型。
  • 计算资源:在资源有限的情况下,可以选择参数高效微调方法,如 LoRA、Adapter、Prefix Tuning 等。
  • 性能要求:如果追求最佳性能,且资源充足,可以选择全参数微调。

微调方法的损失函数
如之前提到的,不同的微调方法通常使用与任务相关的损失函数,而不是特定于微调方法的损失函数。损失函数的选择主要取决于下游任务,例如:
分类任务:使用交叉熵损失函数。
生成任务:使用语言模型损失(通常也是交叉熵损失)。
回归任务:使用均方误差(MSE)损失函数。

3.检索增强生成模型(RAG,Retrieval-Augmented Generation)

RAG 是一种将检索模型和生成模型结合起来的模型框架。通过从外部知识库中检索相关信息,再结合生成模型生成最终的答案,RAG 能够显著扩展模型的知识库并提高生成质量。

特点:RAG 在生成任务中通过动态检索信息进行增强,适合知识密集型任务。
应用场景:开域问答系统、知识型对话生成、复杂文档生成等。
常见组合:RAG 通常结合预训练的生成模型(如 BART、T5)和检索系统(如稠密向量检索、关键词检索等)。
作用:
动态知识增强:通过检索外部知识,RAG 可以提升模型的生成能力,使其能够回答更多复杂的问题。

4. 对比学习模型

对比学习模型通过构建正负样本对,学习相似样本之间的表示,用于无监督学习或半监督学习。
应用范围:

  • 无监督表示学习:适用于在没有大量标注数据的情况下进行表示学习,特别适合文本、图像等多模态数据的表示学习。
  • 语义相似度计算:例如在搜索引擎或语义相似度任务中,对比学习可以用来学习文本的嵌入表示,帮助更好地匹配相似的查询和文档。

典型模型:

  • SimCLR:图像对比学习模型,但方法可以扩展到 NLP 任务。
  • SimCSE:专门用于句子嵌入学习,通过对比学习方法获取句子表示,应用于语义相似度计算、句子匹配任务。

5. 知识蒸馏模型

知识蒸馏将大模型的知识压缩到小模型中,适用于需要在设备上高效部署的场景。
应用范围:

  • 模型压缩:在计算资源有限的设备(如移动端、嵌入式系统)上运行大模型时,知识蒸馏能够显著减小模型大小,同时保留模型的大部分性能。
  • 加速推理:在推理速度要求较高的场景,使用知识蒸馏可以显著提高推理效率。
  • 模型部署:适合在需要轻量级模型的场景下部署,如聊天机器人、虚拟助手等。
    典型模型:
  • DistilBERT:BERT 的精简版本,保持了模型性能的同时减少了参数。
  • TinyBERT:进一步通过知识蒸馏压缩 BERT,适合部署在低资源设备上。

6. 稀疏专家模型(Mixture-of-Experts, MoE)

稀疏专家模型是一种高效的模型架构,通过只激活模型中部分参数来处理特定任务,减少计算量。

- 应用范围:

  • 多任务学习:在需要同时处理多个任务的场景中,稀疏专家模型通过激活不同的专家模块处理不同的任务。
  • 资源优化:在处理超大规模模型时,通过只激活一部分模型,可以显著减少不必要的计算量,提高资源利用率。

- 典型模型:

  • Switch Transformer:一种稀疏专家模型,适合处理生成任务和多任务学习。
  • GLaM:通过专家模块降低计算负担,适合大规模生成任务。

7. 多模态模型

多模态模型可以同时处理和理解不同模态的数据(如图像、文本、语音),非常适合需要结合多种数据类型的任务。

应用范围:

  • 跨模态生成与理解:如图片描述生成、视频字幕生成、文本到图像生成等任务。
  • 视觉与语言融合:在需要结合视觉和语言理解的任务中(如 VQA:视觉问答系统),多模态模型可以同时理解图像和文本。
  • 多模态搜索:根据文本或语音在图片、视频中进行搜索,适合电商、社交媒体等场景。

典型模型:

  • CLIP:可以理解图像和文本的语义关系,应用于图像搜索和分类任务。
  • DALL·E:根据文本生成图像,用于创意设计、广告等领域。
  • Flamingo:结合文本和图像生成或理解任务,适合跨模态生成。

8. 解码器模型(Decoder-only Models)

解码器模型专注于生成任务,适合逐步生成输出,常见于文本生成、代码生成等任务中。

应用范围:

  • 文本生成与补全:适用于自动写作、内容生成、对话生成等场景。
  • 代码生成:在自动编程工具中,解码器模型通过逐步生成代码片段,帮助开发人员进行自动补全或生成。

典型模型:
GPT 系列:用于生成类任务,如文本生成、对话生成、代码生成等。

总结:
预训练模型是整个大模型的基础,适用于通用的语言表示学习。
微调模型是针对特定任务进行优化,可以通过全参数微调或参数高效微调方法实现,适应广泛的下游任务。
RAG 模型在需要动态引入外部知识时表现出色,适合知识密集型生成任务。
对比学习模型适合无监督或半监督的表示学习,常用于搜索和相似性计算。
知识蒸馏模型用于在资源受限设备上部署压缩后的模型。
稀疏专家模型在多任务和大规模生成任务中高效运行。
多模态模型结合不同模态数据,适合跨模态生成与理解任务。
解码器模型则擅长逐步生成类任务。

五、训练大模型

训练不同领域的大模型的基本步骤通常是相似的,主要区别在于具体应用的任务和领域,以及选择的模型和微调方法。大模型的训练流程大体上遵循类似的框架,只是在面对不同任务或领域时,可能会根据需求选择不同的模型架构、预训练数据、微调策略和优化方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值