一、模型架构
预训练语言模型大体可以分为三种:自回归(GPT系列)、自编码(BERT系列)、编码-解码(T5、BART),它们每一个都在各自的领域上表现不俗,但是,目前没有一个预训练模型能够很好地完成所有任务。
预训练语言模型是自然语言处理(NLP)领域的一个重要进展,它们利用大量文本数据学习语言的通用表示,然后可以被进一步微调来执行特定的NLP任务。上述内容提到的三种模型自回归(GPT系列)、自编码(BERT系列)、编码-解码(T5、BART),代表了不同的预训练技术和架构。下面详细解析这三种模型的特点:
1、自回归模型(GPT系列)
自回归语言模型,如 GPT 系列(Generative Pre-trained Transformer),是一种生成式模型,它们在预训练时学习预测下一个单词,给定之前的单词(即,学习单词序列的概率分布)。这种模型通常用于生成文本任务,如故事生成、对话生成等。
特点:
- 单向:模型只能看到前面的词来预测下一个词。
- 生成能力强:由于其设计,GPT非常擅长生成连贯和流畅的文本。
- 微调灵活性:可以通过微调来适应各种下游任务,如文本分类、摘要、问答等。
2、自编码模型(BERT系列)
自编码模型,如 BERT(Bidirectional Encoder Representations from Transformers)采用了另一种预训练策略,即遮蔽语言模型(Masked Language Model, MLM)。在这种模型中,输入文本中的一些单词会被随机遮蔽,模型的任务是预测这些被遮蔽的单词。与自回归模型不同,BERT在预测时可以查看整个输入序列(前后文都考虑在内)。
特点:
- 双向上下文理解:BERT能够考虑到单词前后的上下文,从而获得更深层次的语言理解。
- 强大的表征能力:在很多理解任务如文本分类、命名实体识别、问答等任务上,BERT表现出色。
- 预训练-微调范式:BERT预训练后,可以通过微调来适应各种下游任务。
3、编码-解码模型(T5、BART)
编码-解码模型,如 T5(Text-to-Text Transfer Transformer)和 BART(Bidirectional and Auto-Regressive Transformers),结合了编码器和解码器的架构。这种模型通常在预训练时采用序列到序列(Seq2Seq)的任务,如文本摘要、翻译等。
特点:
- 灵活的输入输出:编码-解码模型可以处理各种输入输出结构,非常适合需要生成特定文本的任务。
- 强大的理解和生成能力:这类模型不仅能够理解复杂的语言结构,还能生成高质量的文本。
- 端到端训练:预训练和微调通常是端到端的,输入和输出都是文本序列,这简化了任务适配的过程。
尽管这些模型在它们各自的领域表现突出,但是目前还没有一个模型能在所有任务上都表现最优。这是因为:
(1)不同任务的需求差异:某些任务可能更依赖于上下文信息的理解,而另一些则可能更依赖于生成连贯的文本。
(2)模型架构的局限性:例如,GPT 系列由于预训练语言模型是自然语言处理领域的一项关键技术,它们通过在大量文本数据上进行预训练,学习语言的深层次表示,然后可以针对特定的任务进行微调。上述内容提到了三种主要的预训练语言模型:自回归(GPT系列)、自编码(BERT系列)和编码-解码(T5、BART)模型。下面对这三种模型进行详细解析:
总结来说,虽然这些预训练模型在自己擅长的领域内都有非常出色的表现,但由于NLP任务的多样性,目前还没有单一的模型能在所有任务上都达到最佳表现。每种模型都有其独特的优势和局限性,通常需要根据特定任务的需求来选择合适的模型。随着研究的深入,我们可能会看到更多的创新模型,它们在更广泛的任务上表现出色,或者是通过模型融合等技术来整合不同模型的优势。
二、微调方法
方法名称 | 主要原理 | 适用条件 | 优点 | 缺点 |
---|---|---|---|---|
Fine-Tuning | 微调预训练模型的所有参数以适应特定任务 | 数据量较大,任务与预训练任务有一定差异 | 简单易实现,通常性能好 | 需要大量数据,容易过拟合,计算成本高 |
Adapter Tuning | 在预训练模型中插入小型可训练层(Adapters),只训练这些层的参数 | 数据量较少,希望保持预训练参数不变 | 参数量少,低风险地微调 | 可能不如完全微调性能强 |
Prompt Tuning | 利用提示(prompts)引导模型输出,训练可学习的提示符 | 小样本学习,需要灵活性高的任务 | 不需改动模型结构,利用语言模型的零样本学习能力 | 性能依赖于提示设计,可能需要手动调整 |
Layer Freezing | 只微调模型的部分层(通常是顶层) | 数据量适中,任务与预训练任务相关性较高 | 减少计算量,避免底层过拟合 | 可能限制模型学习到新任务的能力 |
Knowledge Distillation | 用大型模型(教师)指导小型模型(学生)学习 | 需要轻量化的模型,资源受限环境 | 学生模型计算高效,易部署 | 教师模型需要额外的训练资源,学生模型性能可能不及教师模型 |
LoRA | 在预训练模型的自注意力和前馈网络中加入低秩矩阵,只更新这些矩阵 | 想要保持预训练模型的大部分参数不变,同时微调模型 | 微调参数少,节省内存和计算资源 | 可能需要仔细的超参数调整,性能提升有限 |
三、Embedding算法
在大型语言模型中,嵌入(embedding)层是一种将单词或短语转换为向量的方法。这些向量代表了词汇的语义和句法特征,并能够捕捉到词与词之间的关系。模型如Word2Vec、GloVe和ELMo都有自己的嵌入方法,而BERT以及OpenAI的模型(如GPT系列)则采用了不同的策略来生成嵌入。下面介绍一些大型语言模型中的嵌入方法,并将其合并为一个统一的描述。
1、Word2Vec
Word2Vec有两种主要形式:连续词袋模型(CBOW)和Skip-Gram模型。CBOW根据上下文词来预测当前词,而Skip-Gram则相反,它根据当前词来预测上下文。
2、GloVe
GloVe(Global Vectors for Word Representation)通过对共现矩阵进行分解来训练词嵌入。它结合了矩阵分解和局部上下文窗口的概念,通过全局统计信息来生成词嵌入。
3、ELMo
ELMo(Embeddings from Language Models)使用双向LSTM来生成词嵌入,这些嵌入是上下文敏感的,这意味着同一个词在不同的句子中会有不同的嵌入表示。
4、BERT嵌入
BERT(Bidirectional Encoder Representations from Transformers)使用Transformer架构来生成嵌入,它在预训练时考虑了词汇的左右两侧上下文,生成的嵌入能够捕捉更丰富的上下文信息。
5、GPT和其他OpenAI模型
GPT(Generative Pre-trained Transformer)及其后续版本,如GPT-2、GPT-3和GPT-4,使用基于Transformer的架构。在这些模型中,嵌入层将单词映射到向量空间,并且通过位置嵌入来保持单词顺序的信息。这些模型通过无监督的方式在大量文本数据上预训练,通过预测下一个词来学习语言的模式。
6、统一描述
在大型语言模型的嵌入层中,不同的算法和架构的共同目标是将自然语言转换为计算机可以处理的数字表示形式。无论是通过静态嵌入如Word2Vec和GloVe,还是通过动态嵌入如ELMo和BERT,或是通过大规模预训练语言模型如GPT系列,嵌入层的核心任务都是捕获并编码单词和短语的语义意义及其上下文关系。
在合并的视角下,我们可以看到一个从静态、局部上下文嵌入向动态、全局上下文嵌入演进的过程。静态嵌入将每个单词表示为一个固定的向量,而动态嵌入则根据单词在不同上下文中的用法生成不同的向量表示。最新的大型模型,如GPT-4,通过深层的Transformer网络对这种上下文敏感性进行了进一步的增强,实现了对自然语言深层次理解的巨大飞跃。
四、优化器选择
1、Adam
Adam 结合了动量(Momentum)和 RMSprop 的优点。它计算梯度的一阶矩估计(即均值,`m`)和二阶矩估计(即未中心化的方差,`v`),并对它们进行偏差校正,得到 `m^` 和 `v^`。
自适应矩估计更新规则如下:
其中,η 是学习率,ε 是一个非常小的数,防止除以零。
优点:
自适应学习率: 对每个参数有不同的学习率。
适合稀疏数据: 在处理稀疏数据时效果好。
通常较快收敛: 相比于其他优化器,Adam 通常需要更少的时间收敛。
缺点:
可能不稳定: 在某些情况下,Adam 可能不如 SGD 稳定。
敏感于超参数: 虽然通常表现良好,但在某些问题上调整超参数(尤其是学习率)可能很棘手。
2、SGD
SGD 是最传统的优化器,仅仅根据当前批次的平均梯度更新参数。
随机梯度下降更新规则如下:
优点:
简单且易于实现。
在凸问题上有理论收敛保证。
内存效率高: 由于每次只使用一个数据点来更新参数,因此内存需求小。
缺点:
收敛速度可能慢: 特别是在梯度较小或者鞍点附近。
需要手动调整学习率: SGD 不会自动调整学习率,可能需要使用如学习率衰减等技术。
对所有参数同样的学习率: 不像 Adam 那样对每个参数有不同的自适应学习率。
3、Adadelta
Adadelta 是对 AdaGrad 的改进,旨在解决其学习率随时间单调递减的问题。Adadelta 累积过去梯度的平方来调整学习率,但不像 AdaGrad 那样累积所有过去的梯度平方。
累积梯度调整更新规则如下:
其中,`G_t` 是过去梯度平方的衰减平均,`η` 是学习率(在 Adadelta 中通常设置为 1),`g_t` 是当前梯度。
其中,G_t 是过去梯度平方的衰减平均,η 是学习率(在 Adadelta 中通常设置为 1),g_t 是当前梯度。
优点:
自适应学习率: 无需手动设置学习率。
解决了 AdaGrad 学习率持续下降的问题: 通过限制梯度累积的窗口大小。
缺点:
复杂性高: 相比于 SGD 和 Momentum,实现起来更复杂。
可能难以调整: 虽然原则上不需要设置学习率,但实际上通常需要调整其他超参数(如衰减率)以获得最佳性能。
可能在某些任务上效果不如 Adam 或 SGD + Momentum: Adadelta 是自适应学习率方法的一种,但并不总是最优的选择。
4、三种优化器的不同点
学习率调整:
SGD 使用固定的学习率,可能需要手动调整或者使用衰减策略。
Adam 提供了自适应学习率,根据每个参数的一阶(均值)和二阶(未中心化的方差)矩估计自动调整。
Adadelta 也提供了自适应学习率,但它是基于梯度的累积调整而不需要设置默认学习率。
内存要求:
SGD 对内存的要求最少,因为它没有额外的参数累积。
Adam 和 Adadelta 会存储过去梯度的某种形式和/或平方梯度的信息,增加了内存的需求。
适用性:
SGD 简单且易于理解,但可能需要更多的迭代来收敛,并且在参数调整方面较为敏感。
Adam 通常在实践中表现得非常好,几乎适用于各种不同的问题,但在某些情况下可能因为其自适应性而导致过拟合。
Adadelta 设计用来解决 AdaGrad 在训练后期学习率过低的问题,但可能不如 Adam 那样流行或广泛使用。
在选择优化器时,通常需要根据具体问题和数据集的特性进行实验。没有一种优化器是适用于所有任务的最佳选择,实际选择时通常需要进行交叉验证来找到最适合特定任务的优化器和超参数设置。