当前位置: 首页 > article >正文

LLM 的星辰大海:大语言模型的前世今生

大型语言模型(LLM)的崛起,犹如一场科技的奇点,正以惊人的速度重塑着我们与信息、与世界的互动模式。它们不再是冰冷的机器,而是具备理解、生成、甚至创造能力的智能体,展现出前所未有的潜力。然而,在这令人兴奋的机遇背后,也隐藏着复杂的技术挑战和深刻的伦理思考。本文将基于一系列精选参考文献[1-9],从概念、技术、应用、挑战等多个维度,以抽丝剥茧的方式深入剖析LLM,共同揭开LLM的神秘面纱。

一. LLM 的演进:从规则到智能的跃迁 💫

1.1 语言模型的蹒跚起步 👶

早期的语言模型,如N-gram模型,依赖于统计词语或短语在文本中出现的频率来预测下一个词。这种方法简单易懂,例如,当输入“今天天气”时,基于大规模语料库的 N-gram 模型可能会预测“很好”作为下一个词,因为它在训练数据中经常与“今天天气”同时出现。然而,N-gram模型存在严重的局限性。它们无法捕捉长距离的依赖关系和上下文信息,例如,在句子 “今天天气虽然很冷,但我仍然想去户外散步” 中,N-gram 模型很难理解 “冷” 对后面 “散步” 的语义影响。此外,基于规则的系统也因为无法应对语言的复杂性和多样性而显得非常脆弱,往往只能在特定领域或特定场景下工作。这些系统高度依赖人工规则,缺乏对语言上下文的理解,难以处理歧义和复杂结构,维护和扩展成本极高[1]。

思考: 为什么早期的基于规则的系统如此脆弱?它们在处理复杂语言时遇到了哪些无法逾越的障碍?

🤔 规则系统需要人为定义大量的规则,维护成本非常高,并且无法处理语言的模糊性、歧义性和动态性。此外,语言的演化和更新速度很快,人为定义的规则很难跟上这种变化。基于规则的系统无法进行有效的泛化,一个领域或场景的规则无法直接应用到另一个领域或场景。

案例: 考虑这样一个句子:“The cat, which was black and white, jumped over the lazy brown dog.” (猫,它是黑白相间的,跳过了懒惰的棕色狗。)。 N-gram 模型在预测 “jumped” 后面的词时,可能会错误地认为 “over” 之后应该是一个名词,但实际上是介词短语 "over the lazy brown dog"作为一个整体。这说明N-gram模型缺乏对句子结构和长距离依赖的理解,无法捕捉句子中词语之间的复杂关系。 😥

1.2 RNN 与 LSTM:序列建模的尝试 🧐

在这里插入图片描述

循环神经网络(RNN)的出现,为序列数据建模提供了一种新的思路。RNN 可以被看作一个“具有记忆”的系统,它在处理序列数据的每一个元素时,都会保留之前处理过的信息,并在后续处理中利用这些信息。这种循环的结构使得 RNN 可以处理长度可变的序列数据。长短期记忆网络(LSTM)是 RNN 的一种改进版本,它通过引入“门”机制(包括输入门、遗忘门和输出门)来解决 RNN 的梯度消失/爆炸问题,并能够更好地处理长序列信息。 LSTM 可以选择性地保留或遗忘历史信息,从而更有效地学习长距离依赖。然而,即使是LSTM,在处理非常长的序列时,仍然会面临信息遗忘和计算效率低下的挑战[1]。这是因为LSTM在处理长序列时,需要按顺序处理每个时间步,无法并行计算,导致计算效率较低。此外,LSTM 在处理更长的序列时,依然无法完全避免信息丢失的问题,尤其是在序列中较早出现的信息。这限制了它们在复杂语言任务中的应用,尤其是当序列过长时。 😫

思考: 为什么 RNN 和 LSTM 虽然能够处理序列数据,但在处理复杂语言时仍然表现不佳? 😓

主要原因在于它们在处理长序列时容易出现梯度消失/爆炸,且计算效率相对较低,难以捕捉长距离依赖关系。同时,RNN的循环结构也使得它难以并行计算,限制了训练的速度和规模。

1.3 Transformer 的横空出世:自注意力机制的革命 💥

在这里插入图片描述

Transformer 架构的出现,彻底改变了自然语言处理领域。Transformer 摒弃了传统的循环结构,采用自注意力机制来实现对序列数据的建模。自注意力机制的核心思想是,让每一个词都关注句子中的其他所有词,并根据它们之间的关联性动态调整自身的表示。可以把自注意力机制比作一个“社交网络”,每个词都与其他词相互连接,并根据它们之间的“关系”来更新自己的“社交地位”[1]。 自注意力机制允许模型并行地处理整个输入序列,极大地提高了计算效率。具体来说,自注意力机制通过三个矩阵:Query (Q)、Key (K) 和 Value (V) 来计算词之间的关联度。对于每一个词,计算它与其他所有词的 Q·K^T 的结果(点积)来得到注意力权重,然后用这些权重加权 V 矩阵,得到该词的上下文表示。公式如下:

Attention(Q, K, V) = softmax(QK^T / sqrt(dk))V

其中,dk是K的维度。softmax函数将注意力权重归一化,sqrt(dk) 用于缩放点积结果,防止梯度消失。 多头注意力机制 (Multi-head Attention) 是自注意力机制的扩展,它允许模型从不同的角度关注句子中的其他词,捕捉更丰富的语义信息[1]。 例如,在句子“The cat chased the mouse because it was hungry.” 中,自注意力机制可以帮助模型理解 “it” 指的是 “cat” 而不是 “mouse”,因为它通过分析句子中所有词之间的关系,发现了 “it” 与 “cat” 的关联性更强。Transformer 的编码器-解码器结构进一步增强了其能力。编码器将输入文本转化为具有语义信息的隐藏表示,解码器则根据编码器的输出,逐步生成目标文本。 Transformer 的并行计算能力也显著提升了训练效率,为LLM的快速发展奠定了基础[1]。 这使得可以使用更大的数据集和模型进行训练,从而获得更好的性能。 😎

案例:考虑句子 “The company acquired a small startup that was working on AI.”。在自注意力机制下,当处理 “startup” 这个词时,模型会同时关注句子中的所有其他词,并根据它们的关联性,动态地为每个词分配权重。例如, “startup” 可能与 “company”, “acquired”, “working”, “AI” 等词产生较高的关联度,从而帮助模型捕捉 “startup” 在这个句子中的具体含义。多头注意力机制允许模型同时关注 “startup” 与 “company” 的关系,以及 “startup” 与 “AI” 的关系,从而更全面地理解 “startup” 的含义。 🧐

思考: Transformer 架构的并行计算能力如何显著提升了训练效率,从而推动了LLM的快速发展? 🤔

Transformer 的自注意力机制让每一个词都可以同时和其他所有词计算关联度,这使得模型可以并行处理整个句子,从而大幅减少了训练时间,而RNN需要按顺序处理,无法并行。同时,Transformer 的自注意力机制可以更好地捕捉长距离的依赖关系,从而更好地理解语言的上下文信息。

1.4 LLM :从预测到创造的飞跃 🚀

大型语言模型不再仅仅是 “预测下一个词” 的工具,它们拥有了对语言的深层次理解、生成、和创造能力[1]。LLM 不仅可以理解复杂概念,进行推理,还能适应各种不同的场景和任务,表现出惊人的智能水平。LLM 的核心挑战在于如何构建一个能够泛化到不同任务,适应各种场景的模型,并能够真实理解人类的意图,这需要模型具备强大的知识表示、推理和泛化能力。LLM 的一个关键能力是 “涌现能力” (Emergent Abilities),即模型在达到一定规模后,会突然展现出一些在较小规模模型上没有的能力,例如上下文学习、多步推理和指令遵循[1]。 ✨

1.4.1 大语言模型族谱

在这里插入图片描述

谷歌机器翻译团队提出了由多组 Encoder/Decoder 构成的机器翻译模型 Transformer,而 Transformer 模型也成为了一切的起点。之后,大模型的发展大致走上了两条路:

一条路是舍弃 Decoder 部分,仅仅使用 Encoder 部分的自编码语言模型,其最出名的代表就是 Bert 家族。
一条路是舍弃 Encoder 部分,仅仅基于 Decoder 部分的自回归语言模型,而 ChatGPT 背后的 GPT 家族则属于 Decoder-only 的分支。

1.4.2 GPT的贡献

由于GPT在LLM的发展中一骑绝尘,贡献最突出,所以这部分重点说一下 GPT 对 LLM 发展的核心贡献。

GPT-1(2018年) 预训练+微调的模型架构

2018 年,OpenAI 发表了论文 ,这就是 GPT-1。GPT-1 提出的预训练+微调的方法可以更好的利用大量的预训练数据,从而让模型能够更好的适应各种特定任务。虽然当时还存在一些局限性,例如当时还不能根据一个给定的标题来生成一篇新闻报道,但是 GPT-1 所开创的这种 预训练+微调 的模型架构,对 NLP 的后续发展具有深远的影响。

在预训练阶段,模型会在大规模无标注文本上进行无监督学习,提取通用的语言特征。
在微调阶段,模型会在特定任务上进行有监督的学习,以适应不同的任务需求。

GPT-2(2019年) 迁移学习能力

为了解决 GPT-1 的问题,2019 年,OpenAI 发布了 GPT-2。通过增加模型参数和数据量,GPT-2 极大的提高了模型的泛化能力和生成能力。除了在特定任务上表现较好(例如根据标题生成文章)之外,GPT-2 还初步表现出一定的零样本或少量样本学习能力。这使得 GPT-2 能够适用于多种自然语言处理任务,例如:翻译,问答,摘要生成,文本生成等,而在 GPT-2 之前,这些特殊任务需要设计专门的模型来分别实现。GPT-2 通过实践证明通过海量数据和大量参数训练出来的词向量模型在不经过额外的特殊训练下就可以迁移到不同类别的任务。

GPT-2 最大的贡献也在于他通过实践验证了大模型的迁移学习能力。

GPT-3(2020年) 上下文学习能力和涌现

2020 年,OpenAI 发布了 1750 亿参数规模的、性能更加强大的 GPT-3。GPT-3 提出了上下文学习(ICL:in-context learning)的概念。ICL 可以指导 LLM 理解以自然语言形式呈现的任务,利用 ICL 的能力,我们可以通过优化给 LLM 的输入以获取更好的结果。在 ICL 的加持下,提示词工程才得以成为可能。GPT-3 在多种自然语言处理任务上展现出了惊人的性能,甚至可以仅通过简单的提示词来适应不同的处理任务。研究人员并未在 GPT-3 训练完成之前预测到该模型具备如此强大的能力。GPT-3 的实践证明,LLM 可以具备涌现能力(Emergent Ability)。

GPT-3.5(2021~2022年) 代码能力和指令遵循能力

为了进一步提升模型的性能,OpenAI 继续探索了两种主要方法:基于代码数据训练和RLHF技术,与人类偏好保持一致。

2021 年,OpenAI推出了在大量 GitHub 代码语料库上微调的 GPT 模型——Codex。Codex 可以解决非常复杂的编程问题,并且还可以显著提高解决数学问题的性能。目前,大名鼎鼎的 Github Copilot 就是基于 Codex 模型而研发。

2022 年,OpenAI推出了基于 RLHF 技术的增强版 GPT-3——InstructGPT。InstructGPT 在指令遵循方面对 GPT-3 模型做了微调,使得其更善于遵循用户的意图。

代码能力和指令遵循能力进一步增强了 GPT-3 模型的能力,OpenAI 将其称之为 GPT-3.5。而 ChatGPT 刚刚推出的时候,其背后默认的模型就是 GPT-3.5。

所以,从整个的 GPT 的历程看,从 2018 年 ~ 2022 年,在长达 5 年多的时间里,OpenAI 一步一步通过探索和实践,让大模型应该具备的相关能力一点一点的浮出水面,进入我们的视野。

二. Token 与 Embedding:LLM 的微观世界 🔬

2.1 Tokenization 的精妙之处 🧩

把输入/输出文本拆分为 LLM AI 模型可以处理的、更小单元的过程,我们称之为:Token 化。token 可以是单词、字符、子单词或符号。文本 Token 化之后,模型可以在 token 的基础上处理不同的语言、词汇和格式,并降低处理过程的计算成本和资源成本。Token 化还可以通过影响 token 的含义和上下文来影响生成文本的质量和多样性。

Tokenization 是将文本分解成更小单元(tokens)的过程,是自然语言处理中的重要步骤。不同的Token 化策略会直接影响LLM的性能、计算效率和泛化能力。Tokenization 的目标是在保证语义信息完整性的前提下,尽可能地减小词汇表的大小,提高计算效率[2]。常见的 Tokenization 方法包括:

2.1.1 空格分词

最简单的分词方法,它根据空格将文本分割成 token。 然而,它无法处理复杂单词和多语言,如 “don’t” 会被分成两个 token,导致信息丢失。同时,空格分词对于处理中文等不使用空格的语言效果很差。 😥

2.1.2 字节对编码(BPE)

BPE(Byte Pair Encoding)最早是一种数据压缩算法,其思想是将经常一起出现的数据对替换为不在数据串中的其他字符,然后再通过一个 merge 表来恢复原始数据。OpenAI 所采用的 tokenization 算法就是 BPE 算法。BPE 可以帮助模型处理罕见的、或者看不见的单词,并创建更紧凑和一致的文本表示。BPE 还允许模型通过组合现有单词或 token 来生成新单词或 token。词汇量越大,模型生成的文本就越多样化和富有表现力。然而,词汇表越大,模型需要的内存和计算资源就越多。因此,词汇大小的选择取决于模型的质量和效率之间的权衡。

BPE是一种基于统计的 tokenization 方法,它可以平衡词汇表大小和语义表达能力,广泛应用于 LLM。 BPE 通过迭代合并文本中频繁出现的字节对来构建词汇表。 BPE可以有效地处理未知词(out-of-vocabulary words),并能够保持相对较小的词汇表,从而提高计算效率[2]。 😎

算法过程

1.准备语料库,确定期望的 subword 词表大小等参数

2.通常在每个单词末尾添加后缀 ,统计每个单词出现的频率,例如,low 的频率为 5,那么我们将其改写为 "l o w </ w>”:5 注:停止符 的意义在于标明 subword 是词后缀。举例来说:st 不加 可以出现在词首,如 st ar;加了 表明该子词位于词尾,如 we st,二者意义截然不同

3.将语料库中所有单词拆分为单个字符,用所有单个字符建立最初的词典,并统计每个字符的频率,本阶段的 subword 的粒度是字符

4.挑出频次最高的符号对 ,比如说 t 和 h 组成的 th,将新字符加入词表,然后将语料中所有该字符对融合(merge),即所有 t 和 h 都变为 th。 注:新字符依然可以参与后续的 merge,有点类似哈夫曼树,BPE 实际上就是一种贪心算法 。

5.重复遍历 2 和 3 操作,直到词表中单词数达到设定量 或下一个最高频数为 1 ,如果已经打到设定量,其余的词汇直接丢弃

举一个完整的例子,来直观地看一下这个过程:

  1. 获取语料库,这样一段话为例:”FloydHub is the fastest way to build, train and deploy deep learning models. Build deep learning models in the cloud. Train deep learning models.“

  2. 拆分,加后缀,统计词频:
    在这里插入图片描述

  3. 建立词表,统计字符频率(顺便排个序):
    在这里插入图片描述

  4. 以第一次迭代为例,将字符频率最高的de替换为de,后面依次迭代:
    在这里插入图片描述

  5. 更新词表
    在这里插入图片描述

继续迭代直到达到预设的subwords词表大小或下一个最高频的字节对出现频率为1。

2.1.3 WordPiece:

与 BPE 类似,但在处理罕见词时具有优势。 WordPiece 使用贪心算法来构建词汇表,它可以更好地处理罕见词,并可以更好地处理一些语言的形态变化。 例如,它可能将 “running” 分解为 “run” 和 “ing”,从而更好地理解词根的含义。 🤓

WordPiece 与 BPE 的主要的差别在于,BPE 按频率来选择合并的 token 对,而 WordPiece 按 token 间的互信息来进行合并。WordPiece 可以较好的平衡词表大小和 OOV 问题,但是可能会产生不太合理的、错误的切分,并且 WordPeice 对拼写错误非常敏感,同时其对前缀的支持也不够好。

2.1.4 Unigram

ULM 是一种基于语言模型的分词算法,这种语言模型可以给多种分词结果赋予概率,从而可以学到其中的噪声,其使用的训练算法可以利用所有可能的分词结果。但是,ULM 的效果与初始词表息息相关,初始词表的好还会影响到最终的结果。 🧐

思考: 选择合适的 Tokenization 策略如何直接影响模型的性能、计算效率和泛化能力?🤔

tokenization 的目标是找到平衡:既能有效地表示文本,又不会导致词汇表过于庞大,影响计算效率和泛化能力。不同的 tokenization 方法适用于不同的场景,没有绝对的优劣之分。 需要根据具体的任务和语言选择合适的 tokenization 策略。

拓展: SentencePiece 和 Tiktoken 是新一代的 Tokenization 工具,它们提供了更加灵活和高效的 tokenization 解决方案,已经被越来越多的 LLM 使用。 SentencePiece 可以处理多语言和不同字符集,并且可以更好地处理未知词。 Tiktoken 是 OpenAI 开发的快速 tokenization 工具,可以高效地处理大量文本数据[2]。 🚀

2.2 Embedding 的力量:语义空间的构建 🌌

在机器学习和自然语言处理中,embedding 是指将高维度的数据(例如文字、图片、音频)映射到低维度空间的过程。embedding 向量通常是一个由实数构成的向量,它将输入的数据表示成一个连续的数值空间中的点。简单来说,embedding 就是一个N维的实值向量,它几乎可以用来表示任何对象,如文本、音乐、视频等。

embedding 将离散的 token 映射到连续的向量空间,从而捕捉词语之间的语义关系和上下文信息[3]。可以将 embedding 看作是词语在语义空间中的“坐标”,语义相似的词在向量空间中距离更近。例如,“国王”、“女王”和“王子”在向量空间中会比较接近,而“国王”和“香蕉”的词向量则会相对较远。LLM 的 Embedding 模型是通过学习大量的文本数据来不断调整词向量的,它们能够更好地理解上下文,并在不同语境下捕捉词语的不同含义。Embedding 的维度通常很高,例如,几百到几千维,从而可以捕捉词语之间的复杂关系[3]。 🤩

案例: 我们可以使用降维技术(如 t-SNE 或 PCA)来可视化词向量。将 “国王”、“女王”、“男人”、“女人” 这些词对应的词向量映射到二维空间,会发现 “国王” 和 “男人” 之间,“女王” 和 “女人” 之间,以及 “国王” 和 “女王” 之间都相对接近,而 “国王” 和 “女人” 则较远。这说明 Embedding 确实捕捉到了这些词语的语义关系。在更高维度空间中,词向量之间的关系更加复杂,可以捕捉到词语之间更微妙的差异。
在这里插入图片描述

拓展: 预训练的词向量(如 Word2Vec、GloVe、FastText)是构建 LLM 的基础。然而,LLM Embedding 与传统的词向量不同, LLM 的 Embedding 具备更强的上下文感知能力,能够根据语境动态调整词向量的表示,使得同一个词在不同的语境下具有不同的 embedding。 例如,“bank” 在“river bank” 和 “bank account” 中的 embedding 是不同的。 这使得LLM可以更好地理解上下文信息[3]。 ✨

思考: Embedding 如何让模型理解词语的含义、上下文关系,以及它们之间的相似性和差异性? 🤔

Embedding 将词语映射到高维的向量空间,通过向量之间的距离和角度,反映词语的语义关系,从而使得模型可以通过计算词向量之间的相似度来进行语义分析。同时,LLM 的 Embedding 可以在不同的上下文中调整词向量的表示,从而更好地理解上下文信息。

三. LLM 的训练:数据、算法与艺术的融合 🎨

3.1 预训练:海量数据的自监督学习 📚

LLM 强大的能力来自于海量数据的自监督学习[1]。预训练过程不需要人工标注数据,模型通过学习文本中词语之间的关系,从而学习通用的语言知识、语法结构和语义关系。 预训练是 LLM 能够涌现出强大能力的关键所在。

目前,大语言模型常用的预训练任务可以分为三类:语言建模(Language Modeling, LM)、去噪自编码(Denoising Autoencoding, DAE)以及混合去噪器(Mixture-of-Denoisers, MoD)
在这里插入图片描述

3.1.1 语言建模(Language Modeling, LM)

语言建模任务是最广泛采用的预训练任务,其核心在于“预测下一个token”,经常被用于训练基于解码器的大语言模型, 例如 GPT-3、PaLM 等。形式化来说,给定一个token序列 u={u1,…,uT},语言建模任务旨在基于序列当前位置之前的token序列 u<t,采用自回归的方式对目标token ui 进行预测。在训练过程中,模型根据下面公式所示的似然函数进行优化:
在这里插入图片描述

可以发现,语言建模任务与人类生成语言数据(如口语表达、书面写作等)的方式十分相似,都是基于前序内容生成(或预测)后续的内容。尽管这种方式形式简单,但当预训练数据足够丰富时,大语言模型便能够学习到自然语言的生成规律与表达模式。

此外,语言建模任务还可以看作是一种多任务学习过程。例如,在预测前缀“这部电影剧情饱满,演员表演得也很棒,非常”中的“好看”时,模型实际上在进行情感分析任务;而预测句子前缀“小明有三块糖,给了小红两块糖,还剩下”中的“一块糖”时,则是在进行数学算术任务。

语言建模的一个变种是前缀语言建模(Prefix Language Modeling)任务,该任务专门为采用前缀解码器架构的模型设计。在训练阶段, 每个文本序列 u 会根据随机选择的位置 k(1≤k≤T) 切分为前缀 uprefix={u1,…,uk} 和后缀 usuffix={uk+1,…,uT} 两个部分,然后仅将后缀中token的损失计入总损失,其目标函数可以表示为下式:
在这里插入图片描述

但是,由于前缀语言建模任务并未将所有token的损失都纳入计算,当使用相同规模的数据集进行训练时,采用前缀语言建模训练的模型在性能上通常会稍逊于使用标准语言建模任务训练的模型。

语言建模的另一个重要变种是中间填充任务,该任务通过重新调整输入序列的顺序,旨在训练模型对于中间缺失信息的填充能力。具体来说,输入序列 u 会被划分为三个部分:前缀 uprefix、中间部分 umiddle 和后缀 usuffix,然后将中间部分移至序列末尾,最后要求模型自回归地对新序列 uprefix⊕usuffix⊕umiddle 进行预测。这样模型就能够学习到填充中间缺失信息的能力。其训练函数可表示为下式:
在这里插入图片描述

中间填充任务经常被用于训练代码预训练模型以提升模型在代码补全等实际应用场景中的表现。

3.1.2 去噪自编码(Denoising Autoencoding, DAE)

去噪自编码任务是另一种常见的语言模型预训 练任务,广泛应用于 BERT、T5 等预训练语言模型中。在去噪自编码任务中,输入文本经过一系列随机替换或删除操作,形成损坏的文本 u∖u~,然后要求模型根据损坏的文本恢复出被替换或删除的词元片段 u~,其训练目标可以表示为下式:
在这里插入图片描述

与语言建模相比,去噪自编码任务的实现更为复杂,需要设定额外的优化策略,如词元替换策略、替换片段长度、替换词元比例等。这些策略的选择会直接影响模型的训练效果。目前使用去噪自编码进行预训练的大语言模型较为有限,代表性模型包括 Flan-T5。

典型任务包括:

掩码语言模型(MLM): 随机遮盖句子中的某些词语,然后让模型预测被遮盖的词。 例如,在句子 “The quick brown fox jumps over the [MASK] dog.” 中,模型需要预测 “lazy” 。 MLM 可以帮助模型学习词语的上下文信息。 模型通过学习预测被遮盖的词,从而理解了词语之间的关系和句子的结构。

下一句预测(NSP): 给定两个句子,模型需要判断第二个句子是否是第一个句子的下一句。 NSP 可以帮助模型学习句子之间的关系。 这有助于模型理解篇章结构和上下文信息。 然而,NSP任务在某些研究中被认为效果有限,一些新的预训练任务如 “sentence order prediction” 等被提出来取代 NSP。

句子顺序预测: 给定一组打乱顺序的句子,模型需要预测正确的句子顺序。这可以帮助模型更好地理解篇章结构和逻辑关系。

文本填充: 给定一段文本,其中一些部分被删除,模型需要预测被删除的部分。这可以帮助模型学习更复杂的语言模式和结构。

3.1.3 混合去噪器(Mixture-of-Denoisers, MoD)

混合去噪器,又称 UL2 损失,通过将语言建模和去噪自编码的目标均视为不同类型的去噪任务,对预训练任务进行了统一建模。具体来说,混合去噪器定义了三种去噪器:S-去噪器、R-去噪器和 X-去噪器。

S-去噪器与前缀语言建模的目标相同,旨在学习基于给定前缀信息生成合理后缀文本的能力。而 R-去噪器和 X-去噪器 与去噪自编码任务的优化目标更为相似,二者仅在被掩盖片段的跨度和损坏比例上有所区别。混合去噪器被应用于训练 UL2 和 PaLM-2 等大语言模型。

思考: 预训练阶段如何有效利用数据中的上下文信息,从而学习到语言的深层结构? 🤔 如何选择合适的预训练数据集?

关键在于使用恰当的预训练任务,让模型学习到词语之间的关系,同时需要选择高质量、多样化、具有代表性的训练数据集,以确保模型学习到更全面的知识。 此外,预训练数据的规模对于模型的性能至关重要,通常需要使用数十亿甚至数万亿 tokens 的数据进行训练[1]。 😮

拓展: 预训练过程中可能会出现偏见和负面影响,例如,模型可能会学习到社会上的刻板印象,或者会生成带有攻击性的内容。 数据清洗、过滤、数据增强等技术可以帮助减轻这些问题。同时,需要在训练过程中使用一些正则化方法,防止模型过拟合训练数据。 😓

3.2 微调:任务定制的艺术 🛠️

微调是将预训练的 LLM 应用于特定下游任务的关键步骤[4]。 通过在高质量标注数据集上训练预训练模型,使其适应特定任务,例如情感分析、文本分类、问答、机器翻译等。 微调需要选择合适的损失函数(如交叉熵损失函数、Focal Loss等)、优化算法(如 AdamW、SGD等)和超参数(如学习率、batch size、weight decay等)。微调过程通常比预训练过程更短,所需的计算资源也相对较少。
在这里插入图片描述

在这里插入图片描述

高质量的标注数据集: 选择与特定任务高度相关的数据集,并进行精确的标注,是微调成功的关键。 数据集的规模和质量直接影响微调的效果。 ✅

合适的损失函数: 根据任务的性质,选择合适的损失函数,例如,分类任务可以使用交叉熵损失函数,回归任务可以使用均方误差损失函数。 损失函数定义了模型预测结果与真实结果之间的差异,模型的目标是最小化损失函数。 🧐

优化算法的选择和参数调整: 选择合适的优化算法,并调整算法的超参数,可以加速模型的收敛并提升性能。 AdamW 是常用的优化算法,它可以自适应地调整学习率,从而加速模型的收敛。 超参数的调整是一个迭代的过程,需要根据实验结果进行调整。 🤓

正则化方法: 使用正则化方法,例如dropout, weight decay 等,可以防止模型过拟合,提高模型的泛化能力。 💪

3.2.1 为什么要微调

除了成本因素之外,微调在机器学习中具有如此重要意义的原因还包括:

数据效率:微调允许使用有限的特定任务数据进行有效的模型自适应。可以使用现有的预先训练模型,并根据任务对其进行优化,而不是收集和标注新的数据集。因此,从数据处理效率层面而言,微调会节省更多的时间和资源。
时间效率:从头开始训练模型需要很长时间,而因为微调是从模型已经学习的特征开始,因此减少了收敛所需的时间,进而加快了训练的过程,提升了训练的效率。
知识迁移:预训练模型在最初的训练中已经从大量数据集中学习到了有价值的特征和模式。微调可以将所获得的知识转移到特定任务中,微调可以使预训练模型在特定任务上有一种增强的效果。
专业化:微调可以允许我们自定义一个模型,使其在特定任务中表现更加出色。通过调整模型的设置,可以创建一个在特定情况下非常有效的工具。

3.2.2 何时微调

虽然微调的成本比从头预训练大模型的成本要小的多的多,但是对模型进行微调仍然需要我们投入时间和精力。微调不是没有成本,只是和预训练大模型相比成本小而已。

因此,在准备微调之前,我们最好先尝试通过提示工程、RAG、或通过类似 Agent的函数调用来获得更好的结果。

在准备微调之前,我们需要进行仔细的分析和考虑:

模型在许多任务上可能最初表现不佳,但使用正确的提示词可以改善结果,此时可能不需要微调。
迭代微调需要创建数据集并运行训练任务,因此迭代提示词比迭代微调快得多。

3.2.3 三种微调方式

方式一:Prompt-tuning

在这里插入图片描述

什么是Prompt-tuning?Prompt-tuning通过修改输入文本的提示(Prompt)来引导模型生成符合特定任务或情境的输出,而无需对模型的全量参数进行微调。这种方法利用了预训练语言模型(PLM)在零样本或少样本学习中的强大能力,通过修改输入提示来激活模型内部的相关知识和能力。

核心原理:PLM(预训练模型)不变,W(模型的权重)不变,X(模型输入)改变。
在这里插入图片描述

如何进行Prompt-tuning?小模型适配下游任务设计任务相关提示模板,并微调提示嵌入以引导预训练模型适应特定任务。仅需微调少量提示嵌入(Prompt Embeddings),而非整个模型参数。

方式二:Prefix-tuning

在这里插入图片描述

什么是Prefix-tuning?Prefix-tuning是Prompt-tuning的一种变体,它通过在输入文本前添加一段可学习的“前缀”来指导模型完成任务。

这个前缀与输入序列一起作为注意力机制的输入,从而影响模型对输入序列的理解和表示。由于前缀是可学习的,它可以在微调过程中根据特定任务进行调整,使得模型能够更好地适应新的领域或任务。

核心原理:PLM(预训练模型)不变,W(模型的权重)不变,X(模型输入)不变,增加W’(前缀嵌入的权重)。
在这里插入图片描述

如何进行Prefix-tuning?在 Transformer 中适配下游任务

在Transformer模型的输入层或各层输入前添加可学习的前缀嵌入,并通过训练这些前缀嵌入来优化模型在特定任务上的表现。

初始化前缀嵌入

在Transformer模型的输入层之前,初始化一个固定长度的前缀嵌入矩阵。

将前缀嵌入与输入序列拼接

将初始化好的前缀嵌入与原始输入序列的词嵌入进行拼接,形成新的输入表示。这个新的输入表示将作为Transformer模型各层的输入。

训练模型

在训练过程中,模型会根据输入序列(包括前缀嵌入)和标签数据进行学习。通过反向传播算法,模型会更新前缀嵌入的参数。
在这里插入图片描述

方式三:LoRA

什么是LoRA?LoRA(Low-Rank Adaptation)通过分解预训练模型中的部分权重矩阵为低秩矩阵,并仅微调这些低秩矩阵的少量参数来适应新任务。
对于预训练权重矩阵W0∈Rd×d,LoRa限制了其更新方式,即将全参微调的增量参数矩阵ΔW表示为两个参数量更小的矩阵A、B,即ΔW = AB。

其中,B∈Rd×r和A∈Rr×d为LoRA低秩适应的权重矩阵,秩r远小于d。
在这里插入图片描述

核心原理:W(模型的权重)不变,X(模型输入)不变,分解ΔW(分解为两个低秩矩阵A、B)。
在这里插入图片描述

如何进行LoRA微调?在冻结预训练模型权重的基础上,通过优化算法训练低秩矩阵A和B以近似增量参数,最小化下游任务损失,从而实现高效的模型微调。

设置LoRA模块

在预训练模型的基础上,添加LoRA模块。LoRA模块通常包含两个参数量较少的矩阵A和B,它们的乘积用于近似全参数微调中的增量参数。

初始化矩阵A和B,通常使用高斯函数进行初始化,以确保训练开始时LoRA的旁路(即BA)为0,从而与全参数微调有相同的起始点。

训练LoRA模块

在训练过程中,冻结预训练模型的权重,仅训练LoRA模块中的矩阵A和B。

通过优化算法(如Adam)更新矩阵A和B的参数,以最小化下游任务的损失函数。
在这里插入图片描述

LoRA参数主要包括秩(lora_rank,影响性能和训练时间)、缩放系数(lora_alpha,确保训练稳定)和Dropout系数(lora_dropout,防止过拟合),它们共同影响模型微调的效果和效率。
在这里插入图片描述

  1. 秩(Rank)

参数名称:lora_rank

描述:秩是LoRA中最重要的参数之一,它决定了低秩矩阵的维度。

常用值:对于小型数据集或简单任务,秩可以设置为1或2;对于更复杂的任务,秩可能需要设置为4、8或更高。

  1. 缩放系数(Alpha)

参数名称:lora_alpha

描述:缩放系数用于在训练开始时对低秩矩阵的更新进行缩放。

常用值:缩放系数的具体值取决于秩的大小和任务的复杂度。

  1. Dropout系数

参数名称:lora_dropout

描述:Dropout系数决定了在训练过程中随机丢弃低秩矩阵中元素的概率。

常用值:Dropout系数的常用值范围在0到1之间。

思考: 如何有效地进行微调,从而最大化模型在特定任务上的性能?🤔 如何防止微调过程中的过拟合现象?

微调需要在精度、泛化性和计算成本之间找到平衡, 需要仔细选择和调整微调参数,使用合适的正则化方法,避免过拟合。同时,需要根据具体的任务选择合适的微调策略,例如,full fine-tuning, parameter-efficient fine-tuning (PEFT) 等。

3.3 强化学习微调(RLHF):对齐人类偏好 🤖

强化学习微调(RLHF)旨在提高 LLM 输出质量,使其更好地对齐人类偏好[4]。 RLHF 通过人类反馈来训练一个奖励模型,用来评价LLM生成内容的质量,然后通过强化学习,让模型生成更高质量、更符合人类期望的文本。 RLHF 包括以下步骤:

  1. 有监督微调: 在预训练模型上进行SFT(Supervised fine-tuning)。 🧠

  2. 训练奖励模型: 使用人类标注的数据(如 “好” 和 “不好” 的回答)来训练一个奖励模型,该模型可以预测 LLM 生成文本的质量。人类标注的数据需要根据特定的标准进行标注,确保标注的质量。奖励模型可以使用多种方法进行训练,例如,可以使用Transformer 模型,或者使用其他机器学习模型。 💯

  3. 强化学习微调: 使用强化学习算法,根据奖励模型的反馈,调整 LLM 的参数,从而让 LLM 生成更高质量的文本。常用的强化学习算法包括 Proximal Policy Optimization (PPO) 等。强化学习的目标是最大化奖励模型的预测值。 ✨
    在这里插入图片描述

3.3.1 有监督微调

在第一阶段,我们利用已有的监督数据对大模型进行微调。这个过程与传统的fine-tuning类似,旨在使模型具有基本的任务执行能力。通过这一阶段,模型可以学习到一些基本的语言规则和任务相关的知识。

SFT (Supervised fine-tuning) 数据集是一些 (prompt, answer) 对,prompt 来源既有标注工人写的,也有用户真实输入的。

SFT 就是在预训练模型上利用这些人工标注的数据进一步微调。另外还有一个概念叫指令微调 (Instruction fine tuning, IFT),IFT 的主要目的是让模型适应、听从人类的指令,比如当 prompt 出现 “summarize” 时,模型就应该知道现在的任务是总结。IFT 可以算作 SFT 的一个子集,或者说先驱步骤。

经过 IFT 后,模型学会了听从指令,但生成的内容却不一定安全可靠。为了提升帮助性、降低有害性,人们继续做 SFT。通过给模型展示无害的、有帮助性的回答,规训模型的生成内容。

3.3.2 训练奖励模型

在第二阶段,我们需要训练一个奖励模型(Reward model)。奖励模型是一个能够评估模型生成的文本序列是否符合人类偏好的模型。它的输入是一个文本序列,输出是一个数值,表示该序列的奖励程度。训练奖励模型的数据通常是同一个数据用不同的语言模型生成结果,然后人工对这些结果打分。打分标准可以是语法的正确性、逻辑的连贯性、情感的适宜性等。通过训练奖励模型,我们可以得到一个能够评估模型行为是否符合人类期望的工具。

Reward model 的输入是 (prompt+answer),输出是一个标量,衡量回答的好坏。可以把 SFT 模型最后的分类头去掉,加上回归头,作为奖励模型的初始化,在此基础上微调。但考虑到计算成本和训练稳定性,一般会选择小几号的模型(架构不变,参数更少)。对于 175B 的 SFT,OpenAI 用了 6B 的奖励模型。

训练奖励模型是一个回归任务。一般情况下,数据集应该长这样:input (prompt+answer); label (score given by human). 但一个现实的问题:给定一个 prompt 和回答,很难量化地去衡量这个回答的好坏。这个回答看起来不错,到底应该给 7 分,8 分还是 9 分呢?很难确定。

OpenAI 的做法是:对不同的回答进行排序。具体来说,从 prompt set 里拿一些 prompt 出来,对于每个 prompt,让 SFT 模型生成 K 个回答 (K=9),人工对这些回答进行排序。有了排序,就有了回答间的相对好坏。一个 prompt 对应九个回答,那么就有 C92=36 对 (good answer, bad answer)

损失函数就定为排序中常见的 pairwise ranking loss。其中 rθ 是奖励模型的输出标量; yw 是一对回答中相对较好的那个; yl 是相对较差的那个回答。

训练过程中,InstructGPT 将每个 prompt 的 36 对回答作为一个单独的 batch。这样一来,只需要进行 9 次前向传播(计算 9 个 r(x,y) )就可以进行 36 次参数更新,避免了重复的计算。

RM 数据集包含 33k 个 prompt,既有标注工人写的,也有用户真实输入的。注意:每个 prompt 对应 36 对回答,所以实际训练 RM 用到的数据量要比 prompt 大一个数量级。

3.3.3 强化学习微调

在第三阶段,我们利用强化学习算法PPO和奖励模型来训练RL模型。强化学习算法的目标是通过与环境的交互,学习到一种策略,使得在该策略下,模型能够获得的奖励最大化。在RLHF中,环境就是模型生成文本序列的过程,而奖励则是由奖励模型给出的。在训练RL模型时,我们需要定义状态空间、动作空间、策略函数和价值函数等概念。状态空间通常定义为输入序列的分布,而动作空间则是模型可以生成的所有token。策略函数就是我们微调的大模型,它根据当前的状态(输入序列)选择下一个动作(生成的token)。价值函数则是由奖励模型和策略约束结合得到的,它表示在某个状态下采取某个动作所能获得的期望奖励。

这部分就是利用PPO微调LLM,在 PPO 微调阶段,我们有四个模型:

SFT LM:第一阶段 SFT 过后得到的模型,它在 PPO 阶段参数冻结,作为 reference model,不进行更新。

RL LM:我们要微调的 LLM,初始参数与 ref LM 一致。用强化学习的术语,可以称它为 actor model

reward model:第二阶段得到的奖励模型,在 PPO 阶段参数冻结。

critic model:用于估算 PPO 中的状态值函数,是一种值函数近似(value function approximation),参数与 RL LM 一起更新

PPO 中通常的做法是让 actor model 与 critic model 共享参数,然后一起训练。此时应该把 policy gradient 的损失函数与 critic model 的损失函数(通常是 MSE)加权求和,作为总的损失。critic model 就是在 actor model (RL LM) 的基础上加了一个全连接层,让每个 token 对应一个标量,作为该 token 对应的状态下,之后能获得的累积(折扣)回报。所以 critic model 的输出形状与输入是一致的,都是 (batch size, seq_len) 。

思考: 如何设计出更加有效的奖励模型?🤔 RLHF 是否会导致其他方面的潜在问题,如公平性、透明度等?

设计高效的奖励模型是一个挑战,它需要能够准确地捕捉人类的偏好。奖励模型的设计需要在准确性、鲁棒性和可解释性之间进行权衡。RLHF 可能会导致模型过度拟合奖励模型, 从而在某些方面表现优秀,但在其他方面表现较差,需要进行多方面的考虑和平衡。同时,需要关注 RLHF 过程中的偏见问题,确保 RLHF 的结果是公平的。 😓

3.4 大模型训练的挑战:算力、数据与伦理 🤯

LLM 的训练面临着巨大的挑战:

巨大的算力需求: LLM 的训练需要大量的算力资源,包括高性能的 GPU、TPU、分布式计算框架等。 如何优化训练过程,降低资源消耗是一个重要的研究方向。 可以使用模型并行、数据并行等技术来加速训练过程。 💻

高质量训练数据的稀缺性: LLM 的性能很大程度上取决于训练数据的质量和规模。 获取高质量、多样化的训练数据是一个巨大的挑战。同时, 如何使用生成模型生成高质量的合成数据也是一个重要的研究方向。 数据增强技术,例如数据扩充,可以用来增加数据的多样性。 📚

模型训练过程中的伦理问题: LLM 可能继承训练数据中的偏见,导致不公平的输出。 隐私泄露、滥用等伦理问题也是需要考虑的。 如何进行伦理审查、构建公平可信的模型,是LLM发展的重要方向。需要在模型训练过程中加入一些技术措施来减少模型的偏见,并确保模型的公平性。 ⚖️

四. Prompt 工程:解锁 LLM 潜能的钥匙 🗝️

4.1 Prompt 的力量:人机交互的桥梁 🌉

在这里插入图片描述

提示工程起源于对预训练模型如何将知识应用于具体任务的探讨。

预训练语言模型通常在大规模语料库上进行预训练,从而学习到大量的语言知识。然而,将这些知识应用于具体任务时,往往需要对模型进行微调(SFT:Supervised Fine Tuning)。微调过程中,模型需要根据标注的任务数据学习任务相关的知识。

这种根据专有数据进行微调的方法,在许多情况下取得了很好的效果,但仍然存在一些问题。例如:

微调过程可能需要大量的标注数据,而这些数据往往难以获得。
微调后的模型可能会存在过拟合现象,导致模型的泛化能力下降。

为了解决这些问题,研究人员开始关注如何通过优化输入和问题表述来引导模型产生更好的输出结果,而无须进行昂贵的微调,这种方法被称提示词工程。

通过精心设计提示词(Prompt ),我们可以引导模型关注输入数据中的关键信息,从而提高模型在各种自然语言处理任务上的性能。提示词工程的核心思想是: 将问题表述为一种容易被模型理解和解答的形式。

Prompt 不仅仅是 “输入文本”,它更是人机交互的关键媒介,决定着 LLM 的行为方式和输出结果[5]。Prompt 的设计至关重要,它需要仔细规划和迭代优化,才能充分发挥 LLM 的潜力。一个好的 Prompt 可以引导 LLM 产生高质量、符合预期的结果,而一个糟糕的 Prompt 则可能导致 LLM 输出错误或不相关的信息。Prompt 工程是一门结合了科学和艺术的领域,它需要对 LLM 的工作原理有深入的理解,同时需要具备一定的创造力和迭代优化能力[5]。 ✨

案例: 对比以下两个 Prompt:“写一篇关于人工智能的文章” 和 “写一篇 500 字的关于人工智能在医疗领域应用的科普文章,重点介绍人工智能如何帮助医生诊断疾病”。 显然,第二个 Prompt 更加具体和明确,可以引导 LLM 生成更符合用户需求的文章。 一个好的 Prompt 需要清晰地表达用户的意图,并给出必要的约束条件。

4.2 多样化的 Prompt 设计 🌈

Prompt 设计的类型多种多样,常见的 Prompt 类型包括:

零样本 Prompt: 直接给出任务描述,不提供任何示例,挑战 LLM 的泛化能力和推理能力。 例如,“Translate ‘Hello, world!’ to French.” 零样本 Prompt 通常适用于简单的任务,但对于复杂的任务,其效果可能不如其他 Prompt 类型。 🧐

少样本 Prompt: 提供少量示例,引导模型学习任务的模式,适用于复杂任务。 例如,提供几个英文和法文翻译的例子,然后让模型翻译新的英文句子。 少样本 Prompt 可以帮助模型更好地理解用户的意图,并生成更符合预期的输出。 🤓

思维链 Prompt: 鼓励模型进行推理,输出中间步骤,提高结果的可解释性。 例如,在求解数学题时,要求模型先列出解题步骤,再给出最终答案。 思维链 Prompt 可以帮助模型进行更复杂的推理,提高模型解决问题的能力。 🤔

角色扮演 Prompt: 让模型模拟特定角色,进行更有针对性的回答。 例如,让模型扮演一位历史学家,回答关于某个历史事件的问题。 角色扮演 Prompt 可以引导模型更好地理解用户的意图,并生成更具针对性的输出。 😎

ReAct Prompt: 结合了推理(Reasoning)和行动(Acting),允许模型在生成回答时,先进行推理,然后再采取行动(例如,检索外部知识库),从而提高回答的准确性和可靠性。 🚀

案例: 对于一个逻辑推理问题, 零样本 prompt 可能会直接让模型回答,而思维链 prompt 会让模型先输出推理步骤,最后输出答案。 思维链 prompt 通常能够提高模型的推理准确率和可解释性。 例如,在解决 “如果小明比小红高,小红比小刚高,那么谁最高” 时,思维链 Prompt 会让模型先分析各个人的身高关系,最后给出正确的答案。

思考: 如何根据不同的任务和需求,选择合适的 Prompt 类型? 🤔

选择合适的 Prompt 类型需要根据任务的复杂度、模型的泛化能力和所需结果的精度来决定。零样本 Prompt 适用于简单的任务,少样本 Prompt 适用于复杂的任务,思维链 Prompt 适用于需要推理的任务,角色扮演 Prompt 适用于需要模拟特定角色的任务。

4.3 Prompt 工程的实践技巧

Prompt 工程是一门精细的艺术,以下是一些常用的 Prompt 工程技巧:

清晰明确的指令: 避免使用模糊的表达,确保 LLM 理解用户的意图。 Prompt 指令应该尽可能地简洁和明确。 ✅

上下文提示: 提供必要的背景信息,帮助模型更好地理解任务。 提供足够的上下文信息可以帮助模型更好地理解用户的意图,并生成更符合预期的输出。 📖

格式约束: 使用特定的格式,例如 JSON、列表等,来引导模型输出。 格式约束可以帮助模型更好地组织输出内容,并提高输出结果的可用性。 🗂️

分解复杂任务: 将复杂任务分解为多个子任务,逐步引导模型。 分解复杂任务可以降低模型的难度,并提高任务的完成质量。 🧩

反向思维:利用反向思维,让 LLM 从不同角度思考问题。 例如,可以要求模型从不同的角度分析某个问题,从而获得更全面的视角。 🔄

迭代优化: 不断尝试和调整 Prompt,直到获得理想的结果。 Prompt 工程是一个迭代的过程,需要不断地测试和优化。 ♻️

使用示例: 在 Prompt 中加入一些示例可以帮助模型更好地理解用户的意图,并生成更符合预期的输出。 💡

使用提示词: 使用一些提示词,例如 “请给出步骤”, “请解释原因”, 可以引导模型生成更详细的输出。 📝

案例: 假设我们想让 LLM 生成一份关于某个产品的市场分析报告, 我们可以通过迭代的方式逐步完善 Prompt。 首先,我们可以先要求模型生成一份简单的市场分析框架,然后逐步添加细节,例如 “请详细分析该产品的竞争对手”、“请给出 SWOT 分析” 等,从而逐步引导模型生成高质量的市场分析报告。 可以通过多次迭代,不断完善 Prompt,最终获得一个高质量的市场分析报告。

思考: 如何构建一个有效的 Prompt 工程流程,从而快速设计出高质量的 Prompt? 🤔

一个有效的 Prompt 工程流程需要包括需求分析、Prompt 设计、Prompt 测试和迭代优化等步骤。需要根据用户的需求分析,设计合适的 Prompt,然后对 Prompt 进行测试,并根据测试结果进行迭代优化。

五. LLM 的挑战:理性看待幻觉与伦理 🤔

5.1 幻觉的根源:LLM 的认知缺陷 😵‍💫

LLM 可能会产生幻觉(Hallucination),即输出与事实不符或不合理的信息[6]。幻觉的产生原因主要有以下几个方面:

训练数据中的偏差: 训练数据可能包含错误的信息、偏见,或者缺乏多样性。如果训练数据中存在偏差,模型可能会学习到这些偏差,并将其反映在输出结果中。 😔

模型知识的局限性: LLM 可能缺乏常识、领域知识,或无法理解复杂的逻辑关系。LLM 的知识主要来源于训练数据,如果训练数据中没有包含相关的知识,模型可能无法正确回答相关的问题。 📚

模型生成的机制: LLM 采用的自回归生成方式,有时会导致输出不合理的信息,例如,在没有足够上下文的情况下,可能会生成不符合常识的语句。自回归生成方式的特点是逐个生成 tokens,这种生成方式有时会导致模型偏离事实。 😥

过分自信: 有时,LLM 会过于自信地生成一些不正确的信息,而没有意识到自己的错误。 🙄

思考: 我们应该如何看待 LLM 的 “创造力” 和 “真实性” 之间的平衡? 🤔如何确保 LLM 输出的可靠性?

LLM 的“创造力” 与 “真实性” 之间存在一定的张力。 我们需要采取多种措施来提高 LLM 输出的可靠性,并对其输出结果进行验证。需要认识到 LLM 的局限性,不能盲目相信其输出结果。

5.2 如何驯服幻觉:增强 LLM 的可靠性 💪

减少 LLM 幻觉的策略主要有以下几种:

使用更高质量的训练数据: 清洗和过滤训练数据,确保数据的准确性、多样性和代表性。 可以使用一些数据验证工具来检查训练数据的质量。 ✅

增强模型的知识和推理能力: 将外部知识库与 LLM 结合,或者使用知识图谱增强模型的推理能力。可以使用 RAG (Retrieval-Augmented Generation) 技术来实现。 🤓

引入事实性验证机制: 使用外部工具或知识库来验证 LLM 输出的真实性。 可以使用一些搜索引擎或者知识库API来验证 LLM 的输出结果。 🔍

模型微调和增强: 使用特定的方法来微调 LLM,减少其生成幻觉的可能性。 例如,可以使用一些专门设计的损失函数或者正则化方法。 🛠️

Prompt 工程技巧: 通过精心设计的 Prompt 来引导 LLM 生成更准确的输出。 例如,可以要求模型给出引用来源,或者使用思维链 Prompt 来引导模型进行推理。

案例: 我们可以使用 RAG (Retrieval-Augmented Generation) 技术,让 LLM 在生成答案之前先检索外部知识库,从而提高答案的准确性和可靠性。 例如,当 LLM 回答关于某个事件的问题时,可以先从维基百科中检索相关信息,然后结合检索到的信息生成答案。

思考: 如何构建更加可信、可靠的 LLM?🤔

构建可信赖的 LLM 需要多方面的努力,包括提高数据质量、增强模型能力、引入验证机制等。同时,需要不断地进行实验和研究,探索减少 LLM 幻觉的方法。

5.3 LLM 的伦理考量:责任与公平 ⚖️

LLM 的发展和应用面临着许多伦理问题:

偏见: LLM 可能继承训练数据中的偏见,导致对特定群体的不公平待遇。这需要我们在训练数据选择、模型训练、以及模型评估等各个环节进行仔细的考虑和改进。 😔

隐私: LLM 在训练过程中可能泄露用户的个人隐私。需要使用一些技术手段来保护用户的隐私,例如,使用差分隐私技术。 🔒

滥用: LLM 可能被用于生成虚假信息、恶意代码等,从而造成危害。需要制定一些法律法规来规范 LLM 的使用,防止其被滥用。 🚨

责任归属: LLM 出现错误时,如何界定责任?需要明确 LLM 的使用者和开发者的责任,并建立相应的责任追究机制。 🤔

思考: 如何开发出更负责任、更公平的 LLM?🤔如何制定相应的法律法规来规范 LLM 的发展? 开发负责任的 LLM 需要在技术、伦理和法律层面进行综合考虑。需要加强伦理审查,并建立相应的监管机制。

5.4 可信赖 AI 的构建 ✨

可信赖 AI (Trustworthy AI) 强调在人工智能系统的开发和应用中,除了性能,还需要考虑透明度、公平性、鲁棒性、安全性、隐私保护等重要因素。构建可信赖的 LLM 系统需要:

透明度: 确保模型的决策过程透明可解释。可以使用一些可解释性技术来理解 LLM 的决策过程,例如,注意力可视化。 👁️

公平性: 避免模型输出对特定群体产生歧视。可以使用一些公平性评估指标来评估模型的公平性。 ⚖️

鲁棒性: 保证模型在不同场景下都能稳定运行。可以使用一些对抗训练技术来提高模型的鲁棒性。 💪

安全性: 防止模型被恶意利用。可以使用一些安全技术来保护模型,例如,防止模型被攻击。 🛡️

隐私保护: 保护用户数据的隐私。可以使用一些隐私保护技术来保护用户的数据,例如,差分隐私技术。 🔒

六. RAG 与 Agent:拓展 LLM 的边界 🚀

6.1 RAG:知识与生成的深度融合 🧠

在这里插入图片描述

RAG (Retrieval-Augmented Generation) 是一种知识增强策略,它可以弥补 LLM 知识不足的缺陷,提高生成内容的准确性和可靠性[7]。 RAG 的工作流程包括:

  1. 信息检索: 根据用户输入,从外部知识库中检索相关信息。 可以使用一些信息检索技术来快速地找到相关信息,例如,基于向量相似度的检索技术。 🔍

  2. 上下文增强: 将检索到的信息添加到用户的 Prompt 中。 将检索到的信息添加到 Prompt 中,可以为 LLM 提供更多的上下文信息,从而生成更准确的输出。 📖

  3. 文本生成: LLM 基于增强后的 Prompt 生成文本。 LLM 利用增强后的 Prompt 生成最终的答案。 ✍️

案例: 如果用户询问:“2023年诺贝尔物理学奖得主是谁?”,LLM 本身可能不知道答案,但 RAG 可以从维基百科等知识库中检索相关信息,然后根据检索到的信息生成准确的答案。 RAG 可以有效地解决 LLM 知识不足的问题。

思考: 如何构建高效的检索系统,从而快速找到与用户输入相关的信息?🤔如何优化 RAG 的流程,从而提高整体性能?

RAG 的关键是构建一个高效的检索系统,同时优化检索策略和融合策略,以便更好地利用检索到的信息。例如,可以使用一些向量数据库来高效地存储和检索知识。

6.2 Agent:LLM 的执行能力 🦾

在这里插入图片描述

Agent 可以被视为拥有 LLM 大脑的智能体,它能够自主地完成各种复杂的任务,与外部环境进行交互,并调用各种工具和服务[8]。 Agent 的组成和工作流程包括:

  1. 规划: Agent 根据用户需求制定任务执行计划。 Agent 需要根据用户的输入来制定一个合理的任务执行计划,并将复杂的任务分解成多个子任务。 🗺️

  2. 执行: Agent 执行计划,调用各种工具和服务。 Agent 需要能够调用各种工具和服务来实现任务的目标。例如,可以调用一些搜索引擎、数据库、API等。 🛠️

  3. 监控: Agent 监控任务执行过程,并根据情况调整计划。 Agent 需要能够监控任务的执行过程,并在出现错误时进行调整。 🧐

  4. 反馈: Agent 向用户提供任务执行结果。 Agent 需要能够向用户提供任务执行结果,并解释任务执行过程。 📢

案例: Agent 可以用来自动预定会议、根据用户需求推荐产品、生成个性化的旅游行程等。例如,用户可以说 “帮我预定明天上午10点在XX会议室的会议”, Agent 会自动完成查找会议室、发送邀请等任务。 Agent 可以提高工作效率,并帮助用户完成各种复杂的任务。 🤩

思考: 如何设计更灵活、更强大的 Agent,使其能够更好地服务于人类? 🤔 如何处理 Agent 在执行任务过程中可能出现的错误和异常情况?

Agent 的设计需要考虑其灵活性、鲁棒性和安全性。需要使用一些技术手段来提高 Agent 的鲁棒性,例如,使用异常检测机制。

拓展: LangChain 和 AutoGPT 是常见的 Agent 框架,它们提供了方便的工具和接口,可以帮助开发者快速构建 Agent 应用。LangChain 提供了一系列的工具和模块,可以帮助开发者快速地构建 Agent 应用,例如,提供了 Prompt 模板、各种工具的接口、以及记忆机制等。 AutoGPT 是一个基于 LLM 的自主 Agent,它能够独立地完成各种任务,而不需要人为的干预。这些框架的出现,大大降低了开发Agent应用的难度,加速了Agent应用的普及。 🚀

七. 国内 LLM 的崛起:挑战与机遇并存 🇨🇳

7.1 国内 LLM 的现状:百舸争流,各具特色 🌊

国内的 LLM 发展迅速,涌现出了一批优秀的 LLM 产品[9]。这些模型在中文理解和生成方面表现出色,并不断拓展应用场景。例如:

深度求索的DeepSeek-R1: 在硅谷,DeepSeek被称作“来自东方的神秘力量”。OpenAI前政策主管、Anthropic联合创始人Jack Clark认为,DeepSeek“雇佣了一批高深莫测的奇才”,还认为中国制造的大模型,“将和无人机、电动汽车一样,成为不容忽视的力量”。

阿里的通义千问: 强调多语言能力和用户体验,在电商等领域具有广泛的应用场景。通义千问在多语言处理方面表现突出,能够处理多种语言的文本。阿里巴巴在电商领域积累了丰富的经验,为通义千问在电商场景中的应用提供了支持。 🛍️

百度的文心一言: 侧重于中文理解和生成,在中文信息处理方面具有优势。文心一言在知识问答、文本创作、代码生成等方面表现出色,并不断拓展在各个行业的应用。百度在搜索引擎技术和中文自然语言处理方面积累了丰富的经验,为文心一言的研发提供了强有力的支持。 💯

华为的盘古: 专注于跨模态和行业应用,在行业领域具有一定的竞争力。盘古模型具有强大的跨模态能力,能够处理文本、图像、音频等多种模态的数据。华为在硬件、云计算等领域具有强大的实力,为盘古模型的训练和部署提供了良好的平台。 🦾

腾讯的混元: 致力于打造通用大模型,在多领域和多场景下表现优异。腾讯在社交、游戏等领域具有丰富的经验,为混元模型的研发提供了有力支持。 🎮

科大讯飞的星火: 专注于语音交互和教育领域,在语音识别和合成方面具有优势。科大讯飞在语音技术方面具有领先地位,为星火模型在语音交互领域的应用提供了坚实的基础。 🗣️

国内 LLM 在某些领域具有独特优势,例如中文处理、本土化应用、行业知识积累等。这些优势为国内 LLM 的发展提供了良好的基础。

思考: 国内 LLM 如何在激烈的竞争中脱颖而出? 🤔

国内 LLM 需要在技术创新、数据积累、应用场景等方面不断突破,才能在激烈的竞争中脱颖而出。需要加强核心算法的研发,并探索一些新的预训练任务和微调方法。 同时,需要加强行业知识的积累,并开发一些具有特色的行业应用。 另外,需要加强开源社区的建设,吸引更多的开发者参与到 LLM 的发展中来。

7.2 面临的挑战:数据、算法与生态 🚧

国内 LLM 发展面临的挑战主要有:

数据质量和规模: 国内高质量的数据资源相对匮乏,训练数据质量还有待提高。高质量的数据对于训练出性能优异的LLM至关重要。 需要加强数据资源的建设,并探索一些新的数据增强方法。同时,需要加强数据的清洗和标注,以确保数据的质量。 📚

核心算法: 在 Transformer 架构的基础上,需要进行更多的创新,以提高模型效率和性能。 Transformer 架构虽然性能强大,但依然存在一些局限性,需要进行一些新的探索,例如,探索新的注意力机制,以及一些更高效的模型结构。 ⚙️

生态建设: 需要构建更加完善的 LLM 生态,包括工具、框架、应用和人才培养等。一个完善的生态系统对于LLM的发展至关重要,可以吸引更多的开发者和用户。需要提供完善的开发工具和框架,并建立一些相关的社区。 🌳

人才培养: 国内LLM人才储备还相对不足。需要加强对LLM人才的培养,并吸引一些国际人才。 可以在高校开设相关课程,并提供相关的培训机会。 👨‍🎓👩‍🎓

算力资源: 大规模的LLM训练需要大量的算力资源,这对于许多中小企业来说是一个巨大的挑战。需要加强算力资源的建设,并提供一些公共的算力平台。 💻

监管和伦理: 需要制定一些相应的监管政策,并建立一些伦理规范,以确保LLM的健康发展。需要加强对LLM的伦理风险评估,并采取相应的措施来降低风险。 ⚖️

思考: 如何加速国内 LLM 的发展,从而缩小与国际先进水平的差距? 🤔 需要加强技术研发,加大对LLM生态的投入,吸引人才,加强国内外交流合作。 需要坚持自主创新,并加强产学研合作。同时,需要积极参与国际合作,学习国际先进的经验。

7.3 未来的机遇:潜力无限,前景广阔 🌟

国内 LLM 的发展机遇包括:

庞大的市场需求: 中国拥有巨大的市场,对 LLM 的需求潜力无限。各行各业都对LLM有着巨大的需求,例如,金融、医疗、教育等。 💰

政策支持: 政府对人工智能产业的发展给予了高度重视和政策支持。政府出台了一系列政策来支持人工智能产业的发展,并加大对人工智能领域的投入。 📜

本土化优势: 国内 LLM 可以更好地适应中文环境和本土用户需求。国内LLM在中文理解和生成方面具有天然的优势,可以更好地满足国内用户的需求。 🇨🇳

数据资源: 中国拥有海量的数据资源,这些数据资源为国内LLM的发展提供了强大的支持。需要充分利用这些数据资源,并进行有效的处理和分析。 📊

应用场景: 国内LLM具有广泛的应用场景,例如,智能客服、智能写作、智能教育等。这些应用场景为国内LLM的发展提供了广阔的空间。 💡

7.4 LLM 的未来:责任与创新并肩而行 🤝

LLM 的发展是人工智能领域的一项重大突破,它将深刻改变我们的生活和工作。LLM 不仅仅是一项技术,更是一种工具,可以用来改变社会,但也需要谨慎使用。

LLM 的未来发展趋势包括:

更加智能化的模型: 具有更强的理解、推理和创造能力。未来的LLM将具有更强大的认知能力,可以更好地理解人类的意图,并进行更复杂的推理。 🧠

更加广泛的应用场景: 渗透到我们生活和工作的各个方面。未来的LLM将在各个行业得到广泛应用,例如,医疗、金融、教育、交通等。 🌍

更加人性化的交互方式: 使人机交互更加自然流畅。未来的LLM将能够与人类进行更自然、更流畅的交互,例如,通过语音、手势等多种方式进行交互。 👋

更加透明和负责任的开发和使用: 确保 LLM 能够为人类带来福祉。未来的LLM的开发和使用将更加透明和负责任,需要建立一些相应的监管机制和伦理规范。 🛡️

多模态能力: 未来的LLM将具有更强的多模态能力,能够处理文本、图像、音频、视频等多种模态的数据。 👁️‍🗨️

个性化定制: 未来的LLM将能够进行个性化定制,以更好地满足用户的需求。 🎁

边缘计算: 未来的LLM将能够部署在边缘设备上,以提高响应速度和保护隐私。 📱

持续学习: 未来的LLM将能够进行持续学习,以不断提高自身的性能。 📈

参考文献

[1] https://wangwei1237.github.io/LLM_in_Action/llm_intro.html
[2] https://wangwei1237.github.io/LLM_in_Action/tokens.html
[3] https://wangwei1237.github.io/LLM_in_Action/embedding.html
[4] https://wangwei1237.github.io/LLM_in_Action/sft.html
[5] https://wangwei1237.github.io/LLM_in_Action/prompt_engineer.html
[6] https://wangwei1237.github.io/LLM_in_Action/hallucination.html
[7] https://wangwei1237.github.io/LLM_in_Action/rag_intro.html
[8] https://wangwei1237.github.io/LLM_in_Action/agent_intro.html
[9] https://www.sohu.com/a/742740997_121124363


http://www.kler.cn/a/512599.html

相关文章:

  • Face2face:非深度学习时代如何进行实时的三维人脸重建
  • SuperdEye:一款基于纯Go实现的间接系统调用执行工具
  • 云原生作业(四)
  • Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量
  • Java——Stream流的peek方法详解
  • 蓝桥杯备考:堆和priority queue(优先级队列)
  • Python毕业设计选题:基于django+vue的二手电子设备交易平台设计与开发
  • ServiceEntry 是一种用于将外部服务引入到Istio内部的服务注册表中的配置资源。
  • kafka学习笔记6 ACL权限 —— 筑梦之路
  • PC端自动化测试实战教程-1-pywinauto 环境搭建(详细教程)
  • 面试题-redis的大key与热key
  • 系统架构演进:从单体到微服务的智能转型
  • Spring boot启动原理及相关组件
  • 【机器学习实战中阶】使用Python和OpenCV进行手语识别
  • 欧拉(Euler 22.03)安装ProxySQL
  • Flutter项目和鸿蒙平台的通信
  • Skyeye 云 VUE 版本 v3.15.5 发布
  • 计算机基础问答-面试总结
  • 路径参数和查询参数分别是什么
  • 什么是股指期货的到期风险?
  • 从前端视角看设计模式之结构型模式篇
  • Springboot和Android项目接入Firebase Cloud Message(FCM)
  • 抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
  • 【Flutter】platform_view之AppKitView在哪个flutter版本添加的
  • 使用 Python 获取 1688 商品快递费用 API 接口的示例代码解析
  • [苍穹外卖] 1-项目介绍及环境搭建