A Survey of Large Language Models

news2024/11/23 22:29:10

本文是LLM系列的第一篇文章,针对《A Survey of Large Language Models》的翻译。

大语言模型综述

  • 摘要
  • 1 引言
  • 2 概述
    • 2.1 LLM的背景
    • 2.2 GPT系列模型 的技术演化
  • 3 LLMs的资源
    • 3.1 公开可用的模型检查点或APIs
    • 3.2 常用的语料库
    • 3.3 库资源
  • 4 预训练
    • 4.1 数据收集
      • 4.1.1 数据源
      • 4.1.2 数据预处理
      • 4.1.3 预训练数据对LLMs的影响
    • 4.2 架构
      • 4.2.1 主流架构
      • 4.2.2
      • 4.2.3
      • 4.2.4
    • 4.3
      • 4.3.1
      • 4.3.2
  • 5
    • 5.1
      • 5.1.1
      • 5.1.2
      • 5.1.3
    • 5.2
      • 5.2.1
      • 5.2.2
      • 5.2.3
    • 5.3
      • 5.3.1
      • 5.3.2
  • 6
    • 6.1
      • 6.1.1
      • 6.1.2
      • 6.1.3
    • 6.2
      • 6.2.1
      • 6.2.2
  • 7
    • 7.1
      • 7.1.1
      • 7.1.2
      • 7.1.3
    • 7.2
      • 7.2.1
      • 7.2.2
      • 7.2.3
    • 7.3
      • 7.3.1
      • 7.3.2
  • 8 结论与未来方向

摘要

自从20世纪50年代提出图灵测试以来,人类一直在探索通过机器掌握语言智能。语言本质上是一个由语法规则控制的复杂的人类表达系统。开发能够理解和掌握语言的人工智能算法是一个重大挑战。在过去的二十年里,语言建模作为一种主要的语言理解和生成方法得到了广泛的研究,从统计语言模型发展到神经语言模型。最近,通过在大规模语料库上对Transformer模型进行预训练,提出了预训练语言模型(PLM),在解决各种自然语言处理(NLP)任务方面表现出强大的能力。由于研究人员发现模型缩放可以提高模型容量,他们通过将参数缩放增加到更大的尺寸来进一步研究缩放效应。有趣的是,当参数尺度超过一定水平时,这些放大的语言模型不仅实现了显著的性能改进,而且还表现出了一些小规模语言模型(如BERT)中不存在的特殊能力(如上下文学习)。为了区分不同参数尺度下的语言模型,研究界为具有显著规模的PLM(例如,包含数百亿或数千亿个参数)创造了“大型语言模型”(LLM)一词。近年来,学术界和工业界对LLM的研究都取得了很大进展,其中一个显著的进展是ChatGPT(一种基于LLM开发的强大的人工智能聊天机器人)的推出,引起了社会的广泛关注。LLM的技术发展对整个人工智能社区产生了重要影响,这将彻底改变我们开发和使用人工智能算法的方式。考虑到这一快速的技术进步,在本次综述中,我们通过介绍背景、关键发现和主流技术来回顾LLM的最新进展。特别是,我们关注LLM的四个主要方面,即预训练、适应调整、利用和能力评估。此外,我们还总结了开发LLM的可用资源,并讨论了未来方向的剩余问题。这项综述提供了LLM文献的最新综述,这对研究人员和工程师来说都是一个有用的资源。

1 引言

语言是人类表达和交流的一种突出能力,它在儿童早期发展,并在一生中进化。然而,除非配备强大的人工智能算法,否则机器无法自然地掌握以人类语言形式进行理解和交流的能力。实现这一目标,使机器能够像人类一样阅读、书写和交流,一直是一个长期的研究挑战。
从技术上讲,语言建模(LM)是提高机器语言智能的主要方法之一。一般来说,LM旨在对单词序列的生成可能性进行建模,从而预测未来(或丢失)标记的概率。LM的研究在文献中受到了广泛的关注,可分为四个主要的发展阶段:

  • 统计语言模型。SLM是基于20世纪90年代兴起的统计学习方法开发的。其基本思想是基于马尔可夫假设建立单词预测模型,例如,基于最近的上下文预测下一个单词。具有固定上下文长度n的SLM也称为n-gram语言模型,例如,bigram和trigram语言模型。SLM已被广泛应用于提高信息检索(IR)和自然语言处理(NLP)中的任务性能。然而,它们经常遭受维度的诅咒:由于需要估计指数数量的转换概率,因此很难准确估计高阶语言模型。因此,引入了专门设计的平滑策略,如退避估计和Good–Turing估计,以缓解数据稀疏性问题。
  • 神经语言模型(NLM)。NLM通过神经网络(例如递归神经网络)来表征单词序列的概率。作为一项显著的贡献,[15]中的工作引入了单词的分布式表示的概念,并建立了以聚合上下文特征(即分布式单词向量)为条件的单词预测函数。通过扩展学习单词或句子的有效特征的思想,开发了一种通用的神经网络方法来为各种NLP任务构建统一的解决方案。此外,word2vec被提议建立一个用于学习分布式单词表示的简化浅层神经网络,该网络在各种NLP任务中被证明是非常有效的。这些研究开创了将语言模型用于表示学习(超越单词序列建模),对NLP领域产生了重要影响。
  • 预训练的语言模型(PLM)。作为早期的尝试,ELMo被提出通过首先预训练双向LSTM(biLSTM)网络(而不是学习固定的单词表示),然后根据特定的下游任务微调biLSTM网络来捕获上下文感知的单词表示。此外,基于具有自注意机制的高度并行化的Transformer架构,通过在大规模未标记语料库上使用专门设计的预训练任务预训练双向语言模型,提出了BERT。这些预训练的上下文感知单词表示作为通用语义特征非常有效,这在很大程度上提高了NLP任务的性能标准。这项研究启发了大量的后续工作,确立了“预训练和微调”的学习范式。根据这一范式,已经开发了大量关于PLM的研究,引入了不同的架构(例如,GPT-2和BART)或改进的预训练策略。在这种模式下,通常需要对PLM进行微调,以适应不同的下游任务。
  • 大型语言模型(LLM)。研究人员发现,扩展PLM(例如,扩展模型大小或数据大小)通常会提高下游任务的模型容量(即,遵循扩展定律)。许多研究已经通过训练越来越大的PLM(例如,175B参数GPT-3和540B参数PaLM)来探索性能极限。尽管缩放主要在模型大小上进行(具有类似的架构和预训练任务),但这些大型PLM表现出与较小PLM不同的行为(例如,330M参数BERT和1.5B参数GPT-2),并在解决一系列复杂任务时表现出令人惊讶的能力(称为涌现能力)。例如,GPT-3可以通过上下文学习解决小样本任务,而GPT-2则不能很好地解决。因此,研究界为这些大型PLM创造了“大型语言模型(LLM)”一词。LLM的一个显著应用是ChatGPT,它将GPT系列的LLM用于对话,展现了与人类惊人的对话能力。

在现有文献中,PLM已被广泛讨论和综述,而LLM很少以系统的方式进行综述。为了激励我们的综述,我们首先强调LLM和PLM之间的三个主要区别。首先,LLM显示出一些令人惊讶的涌现能力,这在以前的较小PLM中可能没有观察到。这些能力是语言模型在复杂任务中表现的关键,使人工智能算法空前强大和有效。其次,LLM将彻底改变人类开发和使用人工智能算法的方式。与小型PLM不同,访问LLM的主要方法是通过提示界面(例如,GPT-4 API)。人类必须了解LLM是如何工作的,并以LLM可以遵循的方式格式化他们的任务。第三,LLM的发展不再明确区分研究和工程。LLM的训练需要在大规模数据处理和分布式并行训练方面有丰富的实践经验。为了开发有能力的LLM,研究人员必须解决复杂的工程问题,与工程师合作或成为工程师。
如今,LLM正在对人工智能社区产生重大影响,而ChatGPT和GPT-4的出现导致了对人工通用智能(AGI)可能性的重新思考。OpenAI发表了一篇题为“AGI及其后的规划”的技术文章,讨论了接近AGI的短期和长期计划,最近的一篇论文认为GPT-4可能被视为AGI系统的早期版本。随着LLM的快速发展,人工智能的研究领域正在发生革命性的变化。在NLP领域,LLM可以作为通用语言任务求解器(在某种程度上),研究范式已经转向LLM的使用。在IR领域,传统的搜索引擎受到了通过AI聊天机器人(即ChatGPT)寻找信息的新方式的挑战,而new Bing提出了一种基于LLM增强搜索结果的初步尝试。在CV领域,研究人员试图开发类似ChatGPT的视觉语言模型,这些模型可以更好地服务于多模式对话,GPT-4通过整合视觉信息支持多模式输入。这一新的技术浪潮可能会带来一个繁荣的基于LLM的现实世界应用生态系统。例如,微软365被LLM(即Copilot)授权自动化办公工作,而OpenAI支持在ChatGPT中使用插件来实现特殊功能。
尽管取得了进展并产生了影响,但LLM的基本原则仍然没有得到很好的探索。首先,为什么新兴能力出现在LLM中,而不是较小的PLM中,这是很神秘的。作为一个更普遍的问题,缺乏对LLM卓越能力的关键因素的深入、详细的调查。研究LLM何时以及如何获得这种能力是很重要的。尽管对这个问题进行了一些有意义的讨论,需要更有原则的综述来揭开“秘密”“LLM。其次,研究界很难培养出有能力的LLM。由于对计算资源的巨大需求,进行重复的、消融的研究以综述各种训练LLM策略的效果是非常昂贵的。事实上,LLM主要由行业训练,其中许多重要的训练细节(如数据收集和清洁)不向公众披露。第三,使LLM与人类价值观或偏好保持一致是一项挑战。尽管有这种能力,LLM也可能产生有毒、虚构或有害的内容。它需要有效和高效的控制方法来消除LLM使用的潜在风险。
面对机遇和挑战,LLM的研发需要更多的关注。为了对LLM有一个基本的了解,本综述从四个主要方面对LLM的最新进展进行了文献综述,包括预训练(如何预训练一个有能力的LLM)、适应调整(如何从有效性和安全性两个角度有效地调整预训练的LLM,利用率(如何使用LLM来解决各种下游任务)和能力评估(如何评估LLM的能力和现有的经验发现)。我们彻底梳理了文献,总结了LLM的关键发现、技术和方法。对于本次综述,我们还通过收集LLM的支持资源创建了一个GitHub项目网站,链接为https://github.com/RUCAIBox/LLMSurvey.我们还知道一些关于PLM或LLM的相关综述文章。这些论文要么讨论了有限法律责任或有限法律责任的某些特定(或一般)方面。与它们相比,我们专注于开发和使用LLM的技术和方法,并为LLM的重要方面提供了相对全面的参考。
本综述的其余部分组织如下:第2节介绍了LLM的背景,包括术语、设置、资源和组织大纲,然后在第3节中总结了开发LLM的可用资源。第4、5、6和7节分别从预训练、适应调整、利用和能力评估四个方面回顾和总结了最近的进展。最后,我们在第8节中总结了主要综述结果,并讨论了未来工作的剩余问题。

2 概述

在本节中,我们概述了LLM的背景,然后总结了GPT系列模型的技术演变。

2.1 LLM的背景

通常,大型语言模型(LLM)是指包含数千亿(或更多)参数的Transformer语言模型,这些参数是在大量文本数据上训练的,如GPT-3、PaLM、Galactica和LLaMA。LLM在理解自然语言和解决复杂任务(通过文本生成)方面表现出强大的能力。为了快速了解LLM的工作原理,本部分介绍了LLM的基本背景,包括缩放定律、涌现能力和关键技术。
LLM的缩放定律。
目前,LLM主要建立在Transformer架构的基础上,其中多头注意力层堆叠在非常深入的神经网络中。现有的LLM采用类似的Transformer架构和预训练目标(例如,语言建模)作为小型语言模型。而LLM在很大程度上扩展了模型大小、数据大小和总计算量(放大倍数)。广泛的研究表明,缩放可以在很大程度上提高LLM的模型容量。因此,建立一种定量方法来表征缩放效应是有用的。接下来,我们介绍Transformer语言模型的两个有代表性的缩放定律。

  • KM比例定律。2020年,Kaplan等人(OpenAI团队)首次提出对神经语言模型的模型性能与三个主要因素的幂律关系进行建模,即模型大小(N)、数据集大小(D)和训练计算量(C)。在给定计算预算 c c c的情况下,他们根据经验给出了缩放定律的三个基本公式:
    L ( N ) = ( N c N ) α N , α N ∼ 0.076 , N c ∼ 8.8 × 1 0 13 L ( D ) = ( D c D ) α D , α D ∼ 0.095 , D c ∼ 5.4 × 1 0 13 L ( C ) = ( C c C ) α C , α C ∼ 0.050 , C c ∼ 3.1 × 1 0 13 \begin{gather} L(N)=\Big(\frac{N_c}{N}\Big)^{\alpha_N},\alpha_N\sim0.076,N_c\sim8.8\times10^{13} \\ L(D)=\Big(\frac{D_c}{D}\Big)^{\alpha_D},\alpha_D\sim0.095,D_c\sim5.4\times10^{13} \notag \\ L(C)=\Big(\frac{C_c}{C}\Big)^{\alpha_C},\alpha_C\sim0.050,C_c\sim3.1\times10^{13} \notag \end{gather} L(N)=(NNc)αN,αN0.076,Nc8.8×1013L(D)=(DDc)αD,αD0.095,Dc5.4×1013L(C)=(CCc)αC,αC0.050,Cc3.1×1013
    其中 L ( ⋅ ) L(\cdot) L()表示nats中的交叉熵损失。这三个定律是通过在一些假设下(例如,一个因素的分析不应受到其他两个因素的阻碍),用不同的数据大小(22M到23B词元)、模型大小(768M到1.5B非嵌入参数)和训练计算来拟合模型性能得出的。他们表明,模型性能与这三个因素有很强的依赖关系。
  • Chinchilla缩放定律。作为另一项具有代表性的研究,Hoffmann等人(Google DeepMind团队)提出了一种缩放定律的替代形式,以指导LLM的计算机优化训练。他们通过改变更大范围的模型大小(70M到16B)和数据大小(5B到500B词元)进行了严格的实验,并拟合了类似的缩放定律,但具有不同的系数,如下:
    L ( N , D ) = E + A N α + B D β , \begin{gather} L(N,D)=E+\frac{A}{N^\alpha}+\frac{B}{D^\beta}, \end{gather} L(N,D)=E+NαA+DβB,
    其中 E = 1.69 , A = 406.4 , B = 410.7 , α = 0.34 E=1.69,A=406.4,B=410.7,\alpha=0.34 E=1.69,A=406.4,B=410.7,α=0.34 β = 0.28 \beta=0.28 β=0.28。通过在约束 C ≈ 6 N D C\approx6ND C6ND下优化损失 L ( N , D ) L(N,D) L(N,D),他们表明计算资源预算分配给模型大小和数据大小的最佳配置可以推导如下:
    N o p t ( C ) = G ( C 6 ) a , D o p t ( C ) = G − 1 ( C 6 ) b , \begin{gather} N_{opt}(C)=G\Big(\frac{C}{6}\Big)^a,D_{opt}(C)=G^{-1}\Big(\frac{C}{6}\Big)^b, \end{gather} Nopt(C)=G(6C)a,Dopt(C)=G1(6C)b,
    其中 a = α α + β , b = β α + β a=\frac{\alpha}{\alpha+\beta},b=\frac{\beta}{\alpha+\beta} a=α+βα,b=α+ββ,同时 G G G是缩放系数能够通过 A , B , α A,B,\alpha A,B,α β \beta β来计算。如[34]中所分析的,在计算预算增加的情况下,KM缩放定律倾向于在模型大小上比数据大小更大的预算分配,而Chinchilla缩放定律认为,这两个大小应该以相等的比例增加,即方程(3)中的a和b具有相似的值。
    尽管有一些有限的假设,但这些缩放定律提供了对缩放效应的直观理解,使预测LLM在训练期间的性能变得可行。然而,根据缩放定律,一些能力(例如,上下文学习)是不可预测的,只有当模型大小超过一定水平时才能观察到(如下所述)。

LLM的涌现能力。
在文献[31]中,LLM的涌现能力被正式定义为“不存在于小模型中但出现于大模型中的能力”,这是LLM与以前的PLM区别开来的最突出特征之一。它进一步介绍了当涌现能力出现时的一个显著特征:当规模达到一定水平时,性能显著高于随机。类似地,这种涌现模式与物理学中的相变现象有着密切的联系。原则上,涌现能力可以定义为与一些复杂任务有关,而我们更关心的是可以应用于解决各种任务的一般能力。在这里,我们简要介绍了LLM的三种典型涌现能力以及具有这种能力的代表性模型。

  • 上下文学习。GPT-3正式引入了上下文学习(ICL)能力:假设语言模型已经提供了一个自然语言指令和/或几个任务演示,它可以通过完成输入文本的单词序列来生成测试实例的预期输出,而不需要额外的训练或梯度更新。在GPT系列模型中,175B GPT-3模型总体上表现出较强的ICL能力,但GPT-1和GPT-2模型则不然。同时,这种能力也取决于具体的下游任务。例如,对于13B GPT-3,ICL能力可以出现在算术任务(例如,3位数的加法和减法)上,但175B GPT–3甚至不能很好地工作在波斯QA任务上。
  • 指令跟随。通过对通过自然语言描述格式化的多任务数据集的混合进行微调(称为指令调整),LLM在同样以指令形式描述的看不见的任务上表现良好。通过指令调整,LLM能够在不使用显式示例的情况下遵循新任务的任务指令,从而具有改进的泛化能力。根据[62]中的实验,当模型大小达到68B时,指令调整的LaMDA PT在看不见的任务上开始显著优于未调整的,但在8B或更小的模型大小下则不然。最近的一项研究发现,PaLM至少需要62B的模型大小才能在四个评估基准(即MMLU、BBH、TyDiQA和MGSM)中的各种任务上表现良好,尽管对于一些特定任务(例如MMLU)来说,更小的大小可能足够了。
  • 逐步推理。对于小型语言模型,通常很难解决涉及多个推理步骤的复杂任务,例如数学单词问题。而通过思维链(CoT)提示策略,LLM可以通过利用提示机制来解决此类任务,该提示机制涉及推导最终答案的中间推理步骤。据推测,这种能力可能是通过对代码进行训练获得的。一项实证研究表明,当应用于模型大小大于60B的PaLM和LaMDA变体时,CoT提示可以带来性能增益(在算术推理基准上),而当模型大小超过100B时,其相对于标准提示的优势变得更加明显。此外,CoT提示的性能改进似乎也因不同的任务而异,例如,GSM8K>MAWPS>PaLM的SWAMP。

LLM的关键技术。
LLM发展到目前的状态已经有很长的路要走:普通和有能力的学习者。在开发过程中,提出了一些重要的技术,极大地提高了LLM的能力。在这里,我们简要列出了(可能)导致LLM成功的几个重要技术,如下所示。

  • 缩放。如前几部分所述,Transformer语言模型中存在明显的缩放效应:更大的模型/数据大小和更多的训练计算通常会提高模型容量。作为两个有代表性的模型,GPT-3和PaLM分别通过将模型大小增加到175B和540B来探索缩放极限。此外,由于计算预算通常是有限的,因此可以采用缩放定律来进行计算资源的更高效的分配。例如,Chinchilla(具有更多的训练词元)通过在相同的计算预算下增加数据规模,优于其对应的模型Gopher(具有更大的模型大小)。同时,应该注意的是,数据缩放应该经过仔细的清理过程,因为预训练数据的质量在模型容量中起着关键作用。
  • 训练。由于模型尺寸巨大,成功训练一个有能力的LLM是非常具有挑战性的。需要分布式训练算法来学习LLM的网络参数,其中经常联合使用各种并行策略。为了支持分布式训练,已经发布了几个优化框架来促进并行算法的实现和部署,如DeepSpeed和Megatron LM。此外,优化技巧对训练稳定性和模型性能也很重要,例如,重新启动以克服训练损失峰值和混合精度训练。最近,GPT-4提出开发特殊的基础设施和优化方法,用更小的模型可靠地预测大型模型的性能。
  • 启发能力。经过大规模语料库的预训练,LLM被赋予了作为通用任务解决者的潜在能力。然而,当LLM执行某些特定任务时,这些能力可能不会明确表现出来。作为技术方法,设计合适的任务指令或具体的情境学习策略来激发这种能力是有用的。例如,思维链提示已被证明通过包括中间推理步骤来解决复杂的推理任务是有用的。此外,我们可以通过用自然语言表达的任务描述进一步对LLM进行指令调整,以提高LLM在看不见的任务上的可推广性。然而,这些技术主要对应于LLM的涌现能力,这可能在小型语言模型上没有表现出相同的效果。
  • 对齐调整。由于LLM是为了捕捉预训练语料库的数据特征而训练的(包括高质量和低质量的数据),因此它们很可能会对人类产生有毒、有偏见甚至有害的内容。有必要使LLM与人类价值观保持一致,例如有益、诚实和无害。为此,InstructGPT设计了一种有效的调整方法,使LLM能够遵循预期的指令,该方法利用了人类反馈的强化学习技术。它通过精心设计的标签策略将人融入训练循环。ChatGPT确实是在与InstructionGPT类似的技术上开发的,该技术在产生高质量、无害的回答方面表现出强大的协调能力,例如拒绝回答侮辱性问题。
  • 工具操作。从本质上讲,LLM是作为大量纯文本语料库上的文本生成器进行训练的,因此在不能最好地以文本形式表达的任务(例如,数值计算)上执行得不太好。此外,他们的能力也局限于训练前的数据,例如无法获取最新信息。为了解决这些问题,最近提出的一种技术是使用外部工具来弥补LLM的不足。例如,LLM可以利用计算器进行精确计算,并使用搜索引擎检索未知信息。最近,ChatGPT启用了使用外部插件(现有或新创建的应用程序)的机制,与LLM的“眼睛和耳朵”类似。这种机制可以广泛扩大LLM的能力范围。

此外,许多其他因素(例如硬件的升级)也有助于LLM的成功。尽管如此,我们的讨论仅限于开发LLM的主要技术方法和关键发现。

L L M ( x ) = ∑ i = 1 n log ⁡ P ( x i ∣ x < i ) . \begin{gather} \mathcal{L}_{LM}(x)=\sum^n_{i=1}\log P(x_i|x_{<i}). \end{gather} LLM(x)=i=1nlogP(xix<i).

L D A E ( x ) = log ⁡ P ( x ~ ∣ x \ x ~ ) . \begin{gather} \mathcal{L}_{DAE}(x)=\log P(\tilde x|x_{\backslash\tilde x}). \end{gather} LDAE(x)=logP(x~x\x~).

L L M ( I , f ( x 1 , y 1 ) , ⋯   , f ( x k , y k ) , ⏟ d e m o s t r a t i o n s f ( x k + 1 ⏟ i n p u t , _ _ _ ⏟ a n s w e r ) ) → y ^ k + 1 . \begin{gather} LLM(I,\underbrace{f(x_1,y_1),\cdots,f(x_k,y_k),}_{demostrations}f(\underbrace{x_{k+1}}_{input},\underbrace{\_\_\_}_{answer}))\rightarrow\hat y_{k+1}. \end{gather} LLM(I,demostrations f(x1,y1),,f(xk,yk),f(input xk+1,answer ___))y^k+1.

2.2 GPT系列模型 的技术演化

在这里插入图片描述
在这里插入图片描述
由于ChatGPT在与人类交流方面的卓越能力,自发布以来,它点燃了人工智能社区的兴奋。ChatGPT是基于强大的GPT模型开发的,具有特别优化的会话能力。考虑到人们对ChatGPT和GPT模型越来越感兴趣,我们增加了一个关于GPT系列模型技术演变的特别讨论,以简要总结它们在过去几年中的发展进展。总体而言,OpenAI对LLM的研究大致可以分为以下几个阶段。
早期探索。
根据对Ilya Sutskever(OpenAI的联合创始人兼首席科学家)的一次采访,在OpenAI的早期就已经探索过用语言模型接近智能系统的想法,而在循环神经网络(RNN)中也尝试过。随着Transformer的出现,OpenAI开发了两个初始的GPT模型,即GPT-1和GPT-2,这两个模型可以被视为随后更强大的模型(即GPT-3和GPT-4)的基础。

  • GPT-1。2017年,谷歌推出了Transformer模型,OpenAI团队迅速将他们的语言建模工作适应了这种新的神经网络架构。他们在2018年发布了第一个GPT模型,即GPT-1,并创造了缩写词GPT作为模型名称,代表生成预训练。GPT-1是基于生成的、仅解码器的Transformer架构开发的,并采用了无监督预训练和有监督微调的混合方法。GPT1为GPT系列模型建立了核心架构,并确立了对自然语言文本建模的基本原则,即预测下一个单词。
  • GPT-2。遵循GPT-1的类似架构,GPT-2将参数规模增加到1.5B,并使用大型网页数据集WebText进行训练。正如GPT-2的论文中所声称的那样,它试图通过无监督的语言建模来执行任务,而无需使用标记数据进行明确的微调。为了激励这种方法,他们引入了一种用于多任务求解的概率形式,即 p ( o u t p u t ∣ i n p u t , t a s k ) p(output|input,task) p(outputinput,task)([106]中也采用了类似的方法),它根据输入和任务信息预测输出。为了对这种条件概率进行建模,语言文本可以自然地作为一种统一的方式来格式化输入、输出和任务信息。通过这种方式,解决任务的过程可以被转换为用于生成解决文本的单词预测问题。此外,他们为这一想法引入了一个更正式的说法:“由于(特定任务的)监督目标与无监督(语言建模)目标相同,但仅在序列的子集上进行评估,因此无监督目标的全局最小值也是监督目标(针对各种任务)的全局最小”。对这一主张的基本理解是,每个(NLP)任务都可以被视为基于世界文本子集的单词预测问题。因此,如果无监督语言建模被训练成具有足够的恢复世界文本的能力,那么它就能够解决各种任务。GPT-2论文中的这些早期讨论与黄仁勋(Jensen Huang)对伊利亚·萨茨克弗(Ilya Sutskever)的采访相呼应:“神经网络学习的是产生文本的过程的一些表征。文本实际上是世界的投影……你预测下一个单词的准确性越高,在这个过程中获得的分辨率就越高……”

容量飞跃。
尽管GPT-2旨在成为一种“无监督的多任务学习器”,但与现有技术的有监督微调方法相比,它的总体性能较差。虽然它的模型尺寸相对较小,但它在下游任务中进行了广泛的微调,尤其是对话框任务。在GPT-2的基础上,GPT-3通过扩展(几乎相同)生成预训练架构,展示了一个关键的能力飞跃。

  • GPT-3。GPT-3于2020年发布,将模型参数扩展到175B的更大尺寸。在GPT-3的论文中,它正式引入了上下文学习(ICL)的概念,它以较少或零样本的方式使用LLM。ICL可以教授(或指导)LLM以自然语言文本的形式理解任务。使用ICL,LLM的预训练和利用收敛到相同的语言建模范式:预训练预测以下基于上下文的文本序列,而ICL预测正确的任务解决方案,在给定任务描述和演示的情况下,该解决方案也可以格式化为文本序列。GPT-3不仅在各种NLP任务中表现出非常出色的性能,而且在许多需要推理或领域自适应能力的特殊设计任务中也表现出非常优异的性能。尽管GPT-3的论文没有明确讨论LLM的涌现能力,但我们可以观察到可能超越基本缩放定律的巨大性能飞跃,例如,更大的模型具有更强的ICL能力(如GPT-3论文的原始图1.2所示)。总的来说,GPT-3可以被视为从PLM到LLM发展历程中的一个非凡里程碑。经验证明,将神经网络扩展到一个显著的规模可以导致模型容量的巨大增加。

能力提升。
由于强大的能力,GPT3一直是为OpenAI开发更强大LLM的基础模型。总体而言,OpenAI探索了两种主要方法来进一步改进GPT-3模型,即对代码数据进行训练和与人类偏好保持一致,具体如下。

  • 代码数据训练。原始GPT-3模型(在纯文本上预先训练)的一个主要限制在于缺乏对复杂任务的推理能力,例如完成代码和解决数学问题。为了增强这一能力,OpenAI于2021年7月推出了Codex,这是一个在大型GitHub代码库上微调的GPT模型。它证明了Codex可以解决非常困难的编程问题,也可以显著提高解决数学问题的性能。此外,2022年1月报道了一种训练文本和代码嵌入的对比方法,该方法被证明可以改进一系列相关任务(即线性探针分类、文本搜索和代码搜索)。实际上,GPT-3.5模型是在基于代码的GPT模型(即code-davinci-002)的基础上开发的,这表明对代码数据的训练是提高GPT模型的模型能力,特别是推理能力的一种非常有用的实践。此外,也有人猜测,对代码数据进行训练可以大大提高LLM的思维链提示能力,但仍值得进一步研究和更彻底的验证。
  • 人类对齐。关于人类比对的相关研究可以追溯到OpenAI的2017年(或更早):一篇题为“从人类偏好中学习”的博客文章发布在OpenAI博客上,描述了一项应用强化学习(RL)从人类注释的偏好比较中学习的工作(类似于图6中InstructGPT的对齐算法中的奖励训练步骤)。在这篇RL论文发布后不久,近端策略优化(PPO)的论文于2017年7月发表,该论文目前已成为从人类偏好中学习的基础RL算法。从人类偏好中学习的RL算法。2020年1月晚些时候,GPT-2使用上述RL算法进行了微调,该算法利用人类偏好来提高GPT-2在NLP任务上的能力。同年,另一项工作以类似的方式训练了一个用于优化人类偏好的摘要模型。基于这些先前的工作,InstructGPT于2022年1月提出,以改进用于人类比对的GPT-3模型,该模型正式建立了一个三阶段的人类反馈强化学习(RLHF)算法。请注意,在OpenAI的论文和文档中,似乎很少使用“指令调整”的措辞,取而代之的是对人类演示的监督微调(即RLHF算法的第一步)。除了提高指令跟随能力外,RLHF算法还特别有助于缓解LLM产生危害或有毒内容的问题,这是LLM在实践中安全部署的关键。OpenAI在一篇技术文章中描述了他们的对齐研究方法,该文章总结了三个有希望的方向:“训练人工智能系统使用人类反馈,帮助人类评估和进行对齐研究”。

这些增强技术使GPT-3模型得到了改进,具有更强的功能,OpenAI将其称为GPT-3.5模型(请参阅第3.1节中关于OpenAI API的讨论)。
语言模型的里程碑。
基于所有的探索努力,OpenAI已经实现了两个主要的里程碑,即ChatGPT和GPT-4,这在很大程度上提高了现有人工智能系统的容量。

  • ChatGPT。2022年11月,OpenAI发布了基于GPT模型(GPT-3.5和GPT-4)的会话模型ChatGPT。正如官方博客文章所介绍的,ChatGPT以与InstructionGPT类似的方式进行训练(在原文章中称为“InstructionGPt的兄弟模型”),同时专门针对对话进行了优化。他们报告了ChatGPT和InstructionGPT在数据收集设置中的训练之间的差异:人工生成的对话(同时扮演用户和人工智能的角色)以对话格式与InstructionGPt数据集相结合,用于训练ChatGPT。ChatGPT在与人类交流方面表现出卓越的能力:拥有丰富的知识储备,对数学问题进行推理的技能,在多回合对话中准确追踪上下文,并与人类价值观保持良好一致以确保安全使用。后来,插件机制在ChatGPT中得到了支持,这进一步扩展了ChatGPT与现有工具或应用程序的能力。到目前为止,它似乎是人工智能历史上最强大的聊天机器人。ChatGPT的推出对未来的人工智能研究产生了重大影响,为探索类人人工智能系统提供了线索。
  • GPT-4。作为另一个显著的进展,GPT-4于2023年3月发布,将文本输入扩展到多模态信号。总体而言,GPT-4在解决复杂任务方面的能力比GPT-3.5更强,在许多评估任务上表现出很大的性能改进。最近的一项研究通过对人类产生的问题进行定性测试,调查了GPT-4的能力,涵盖了各种各样的困难任务,并表明GPT-4可以实现比以前的GPT模型(如ChatGPT)更优越的性能。此外,由于六个月的迭代校准(在RLHF训练中有额外的安全奖励信号),GPT-4对恶意或挑衅性查询的响应更安全。在技术报告中,OpenAI强调了如何安全地开发GPT-4,并应用了一系列干预策略来缓解LLM可能存在的问题,如幻觉、隐私和过度依赖。例如,他们引入了一种名为“阅读团队”的机制,以减少危害或有毒内容的产生。作为另一个重要方面,GPT4是在完善的深度学习基础设施上开发的,具有改进的优化方法。他们引入了一种称为可预测缩放的新机制,该机制可以在模型训练期间用少量计算准确预测最终性能。

尽管取得了巨大进展,但这些高级LLM仍然存在局限性,例如,在某些特定背景下产生具有事实错误或潜在风险反应的幻觉。LLM的更多限制或问题将在第7节中讨论。开发能力更强、更安全的LLM是长期存在的研究挑战。从工程的角度来看,OpenAI采用了迭代部署策略,按照五个阶段的开发和部署生命周期来开发模型和产品,旨在有效降低使用模型的潜在风险。在下文中,我们将深入了解技术细节,以便具体了解它们是如何开发的。

3 LLMs的资源

考虑到具有挑战性的技术问题和对计算资源的巨大需求,开发或复制LLM绝非易事。一种可行的方法是从现有的LLM中学习经验,并重用公共资源进行增量开发或实验研究。在本节中,我们简要总结了用于开发LLM的公开资源,包括模型检查点(或API)、语料库和库。

3.1 公开可用的模型检查点或APIs

考虑到模型预训练的巨大成本,训练有素的模型检查点对于研究界LLM的研究和开发至关重要。由于参数规模是使用LLM需要考虑的关键因素,我们将这些公共模型分为两个规模级别(即数百亿个参数和数千亿个参数),这有助于用户根据其资源预算确定合适的资源。此外,对于推理,我们可以直接使用公共API来执行我们的任务,而无需在本地运行模型。接下来,我们将介绍公开可用的模型检查点和API。
具有数百亿参数的模型。
这一类别中的大多数模型的参数范围从10B到20B,除了LLaMA(在最大版本中包含65B参数)和NLLB(在最大版中包含54.5B参数)。该范围内的其他型号包括mT5、PanGu- α \alpha α、T0、GPT-Neox-20B、CodeGen、UL2、Flan-T5和mT0。其中,Flan-T5(11B版本)可以作为研究指令调优的首要模型,因为它从三个方面探索了指令调优:增加任务数量、扩大模型规模和使用思想链提示数据进行微调。此外,CodeGen(11B版本)作为一种用于生成代码的自回归语言模型,可以被认为是探索代码生成能力的良好候选者。它还引入了一个新的基准MTPB,专门用于多回合程序合成,由115个专家生成的问题组成。为了解决这些问题,LLM需要获得足够的编程知识(例如,数学、数组运算和算法)。对于多语言任务,mT0(13B版本)可能是一个很好的候选模型,它已经在带有多语言提示的多语言任务上进行了微调。此外,PanGu- α \alpha α在基于深度学习框架MindSpore开发的零样本或小样本设置下的中文下游任务中表现出良好的性能。请注意,PanGu- α \alpha α持有多个版本的模型(最多200B参数),而最大的公共版本具有13B参数。作为最近的一个版本,LLaMA(65B版本)包含的参数大约是其他模型的五倍,在与指令遵循相关的任务中表现出了卓越的性能。由于其开放性和有效性,LLaMA吸引了研究界的极大关注,许多努力都致力于微调或持续预训练其不同的模型版本,以实现新的模型或工具。通常,这种规模的预训练模型需要数百甚至数千个GPU或TPU。例如,GPT-NeoX-20B使用12个超微型服务器,每个服务器配备8个NVIDIA A100-SXM4-40GB GPU,而LLaMA使用2048个A100-80G GPU,如其原始出版物中所述。为了准确估计所需的计算资源,建议使用测量所涉及计算数量的指标,如FLOPS(即每秒浮点运算次数)。
具有数千亿参数的模型。
对于这一类别的模型,只有少数模型公开发布。例如,OPT、OPT-IML、BLOOM和BLOOMZ具有与GPT-3(175B版本)几乎相同数量的参数,而GLM和Galactica分别具有130B和120B参数。其中,OPT(175B版本)特别致力于开放共享,旨在使研究人员能够大规模开展可重复的研究。对于跨语言泛化的研究,BLOOM(176B版本)和BLOOMZ(176B版)可以作为基础模型,因为它们具有多语言建模任务的能力。在这些模型中,OPT-IML已经用指令进行了调整,这可能是研究指令调整效果的好候选者。这种规模的模型通常需要数千个GPU或TPU来训练。例如,OPT(175B版本)使用992个A100-80GB GPU,而GLM(130B版本)则使用96个NVIDIA DGX-A100(8x40G)GPU节点的集群。
LLM的公共API。
API不是直接使用模型副本,而是为普通用户提供了一种更方便的方式来使用LLM,而无需在本地运行模型。作为使用LLM的代表性接口,GPT系列模型的API已被学术界和工业界广泛使用。OpenAI为GPT-3系列中的模型提供了七个主要接口:ada、babbage、curie、davinci(GPT-3序列中最强大的版本)、text-ada-001、text-babbage-001和text-curie-001。其中,前四个接口可以在OpenAI的主机服务器上进行进一步的微调。特别是,babbage、curie和davinci分别对应于GPT-3(1B)、GPT-3(6.7B)和GPT-3)(175B)模型。此外,还有两种与Codex相关的API,称为code-cushman-001(Codex(12B)的强大的多语言版本)和code-davinci-002。此外,GPT-3.5系列包括一个代号为code-davinci-002的基础型号和三个增强版本,即text-davinci-002、text-davici-003和GPT-3.5-turbo-0301。值得注意的是,gpt-3.5-turbo-0301是调用ChatGPT的接口。最近,OpenAI还发布了GPT-4的相应API,包括GPT-4、GPT-4-0314、GPT-4-32k和GPT-4-32k-0314。总的来说,API接口的选择取决于具体的应用场景和响应要求。详细用法可在其项目网站上找到。

3.2 常用的语料库

与早期的PLM相比,由大量参数组成的LLM需要更大量的训练数据,这些数据涵盖了广泛的内容。为了满足这一需求,已经发布了越来越多可访问的训练数据集用于研究。在本节中,我们将简要总结几种广泛用于训练LLM的语料库。根据它们的内容类型,我们将这些语料库分为六组:书籍、CommonCrawl、Reddit链接、维基百科、代码和其他。
在这里插入图片描述

BookCorpus是以前小规模模型(例如GPT和GPT-2)中常用的数据集,由11000多本涵盖广泛主题和流派(例如小说和传记)的书籍组成。另一个大型图书语料库是古腾堡计划,由70000多本文学书籍组成,包括小说、散文、诗歌、戏剧、历史、科学、哲学和其他类型的公共领域作品。它是目前最大的开源图书收藏之一,用于MT-NLG和LLaMA的训练。至于GPT-3中使用的Books1和Books2,它们比BookCorpus大得多,但迄今尚未公开发布。
CommonCrawl。
CommonCrawl是最大的开源网络爬行数据库之一,包含PB级的数据量,已被广泛用作现有LLM的训练数据。由于整个数据集非常大,现有研究主要从中提取特定时期内的网页子集。然而,由于网络数据中普遍存在噪声和低质量的信息,因此有必要在使用前进行数据预处理。基于CommonCrawl,现有工作中常用的过滤数据集有四个:C4、CC-Stories、CC-News和RealNews。Colossal Clean Crawled Corpus(C4)包括五种变体,即en(806G)、en.noclean(6T)、realnews-like(36G)、webtext-like(17G)和多语言(38T)。en版本已用于预训练T5、LaMDA、Gopher和UL2。多语言C4,也称为mC4,已在mT5中使用。CC-Stories(31G)由CommonCrawl数据的子集组成,其中的内容以类似故事的方式制作。然而,CC-Stories的原始来源现在还不可用,因此复制版本CC-Stories-R已包含在表2中。此外,从CommonCrawl中提取的两个新闻语料库REALNEWS(120G)和CC news(76G)也常用作预训练数据。
Reddit链接。
Reddit是一个社交媒体平台,用户可以提交链接和文本帖子,其他人可以通过“赞成票”或“反对票”对其进行投票。投票率高的帖子通常被认为是有用的,可以用来创建高质量的数据集。WebText是一个著名的语料库,由来自Reddit的高度支持的链接组成,但它还没有公开。作为替代,有一种易于访问的开源替代方案,称为OpenWebText。从Reddit中提取的另一个语料库是PushShift.io,这是一个实时更新的数据集,由Reddit自创建之日以来的历史数据组成。Pushshift不仅提供每月的数据转储,还提供有用的实用工具,支持用户搜索、总结和对整个数据集进行初步调查。这使得用户可以轻松地收集和处理Reddit数据。
维基百科。
维基百科是一个在线百科全书,包含大量关于不同主题的高质量文章。这些文章大多是以解释性的写作风格撰写的(有辅助参考文献),涵盖了广泛的语言和领域。通常,维基百科的纯英文过滤版本被广泛用于大多数LLM(例如,GPT-3、LaMDA和LLaMA)。维基百科有多种语言,因此可以在多语言环境中使用。
代码。
为了收集代码数据,现有工作主要从互联网上抓取开源许可代码。两个主要来源是开源许可证下的公共代码库(如GitHub)和与代码相关的问答平台(如StackOverflow)。谷歌已经公开发布了BigQuery数据集,其中包括大量各种编程语言的开源许可代码片段,作为代表性的代码数据集。CodeGen利用BigQuery数据集的子集BIGQUERY来训练CodeGen的多语言版本(CodeGen Multi)。
其他。
Pile是一个大规模、多样化和开源的文本数据集,由来自多个来源的超过800GB的数据组成,包括书籍、网站、代码、科学论文和社交媒体平台。它由22个不同的高质量子集构成。Pile数据集广泛用于具有不同参数尺度的模型,如GPT-J(6B)、CodeGen(16B)和MegatronTuring NLG(530B)。此外,ROOTS由各种较小的数据集(总共1.61TB的文本)组成,涵盖59种不同的语言(包括自然语言和编程语言),这些语言已用于训练BLOOM。
在实践中,它通常需要不同数据源的混合来预训练LLM(见图2),而不是单个语料库。因此,现有的研究通常将几个现成的数据集(如C4、OpenWebText和Pile)混合,然后进行进一步的处理以获得预训练语料库。此外,为了训练适应特定应用的LLM,从相关来源(如维基百科和BigQuery)提取数据也很重要,以丰富预训练数据中的相应信息。为了快速参考现有LLM中使用的数据源,我们提供了三个具有代表性的LLM的预训练语料库:

  • GPT-3(175B)是在300B词元的混合数据集上训练的,包括CommonCrawl、WebText2、Books1、Books2和Wikipedia。
  • PaLM(540B)使用780B词元的预训练数据集,该数据集来源于社交媒体对话、过滤后的网页、书籍、Github、多语言维基百科和新闻。
  • LLaMA从各种来源提取训练数据,包括CommonCrawl、C4、Github、维基百科、书籍、ArXiv和StackExchange。LLaMA(6B)和LLaMA的训练数据大小是1.0T词元,而1.4T词元用于LLaMA和LLaMA65B。
    在这里插入图片描述

3.3 库资源

在这一部分中,我们简要介绍了一系列可用于开发LLM的库。

  • Transformers是一个开源Python库,用于使用Transformer架构构建模型,该架构由Hugging Face开发和维护。它有一个简单且用户友好的API,使其易于使用和定制各种预训练模型。它是一个强大的库,拥有庞大而活跃的用户和开发人员社区,他们定期更新和改进模型和算法。
  • DeepSpeed是微软开发的一个深度学习优化库(与PyTorch兼容),已用于训练许多LLM,如MTNLG和BLOOM。它为分布式训练提供了各种优化技术的支持,如内存优化(ZeRO技术、梯度检查点)和流水线并行。
  • Megatron-LM是NVIDIA开发的深度学习库,用于训练大规模语言模型。它还为分布式训练提供了丰富的优化技术,包括模型和数据并行、混合精度训练和FlashAttention。这些优化技术可以在很大程度上提高训练效率和速度,从而实现跨GPU的高效分布式训练。
  • JAX是谷歌开发的一个用于高性能机器学习算法的Python库,允许用户在具有硬件加速的阵列(例如GPU或TPU)上轻松执行计算。它能够在各种设备上进行高效计算,还支持多种功能,如自动微分和实时编译。
  • Colossal-AI是HPC-AI Tech开发的一个深度学习库,用于训练大型AI模型。它是基于PyTorch实现的,并支持丰富的并行训练策略集合。此外,它还可以使用PatrickStar提出的方法优化异构内存管理。最近,一种名为ColossalChat的类似ChatGPT的模型公开发布了两个版本(7B和13B),这两个版本是使用基于LLaMA的Colossal AI开发的。
  • BMTrain是OpenBMB开发的一个高效库,用于以分布式方式训练具有大规模参数的模型,强调代码简单性、低资源和高可用性。BMTrain已经将几种常见的LLM(例如,Flan-T5和GLM)纳入其模型中心,开发人员可以直接使用这些模型。
  • FastMoE是MoE(即专家混合)模型的专业训练库。它是基于PyTorch开发的,在设计中优先考虑效率和用户友好性。FastMoE简化了将Transformer模型转换为MoE模型的过程,并在训练过程中支持数据并行和模型并行。

除了上述库资源之外,现有的深度学习框架(例如,PyTorch、TensorFlow、MXNet、PaddlePaddle、MindSpore和OneFlow)也提供了对并行算法的支持,这些算法通常用于训练大规模模型。

4 预训练

预训练为LLM的能力奠定了基础。通过大规模语料库的预训练,LLM可以获得基本的语言理解和生成技能。在这个过程中,预训练语料库的规模和质量对于LLM获得强大的能力至关重要。此外,为了有效地预训练LLM,需要精心设计模型架构、加速方法和优化技术。在接下来的内容中,我们首先在第4.1节中讨论数据收集和处理,然后在第4.2节中介绍常用的模型架构,最后在第4.3节中介绍稳定有效地优化LLM的训练技术。

4.1 数据收集

与小规模的语言模型相比,LLM对模型预训练的高质量数据有更强的需求,其模型能力在很大程度上取决于预训练语料库及其预处理方式。在这一部分中,我们讨论了预训练数据的收集和处理,包括数据源、预处理方法,以及预训练数据如何影响LLM性能的重要分析。

4.1.1 数据源

要开发一个有能力的LLM,关键是从各种数据源中收集大量的自然语言语料库。现有的LLM主要利用各种公共文本数据集的混合作为预训练语料库。图2显示了一些具有代表性的LLM的预训练数据来源的分布。
预训练语料库的来源大致可以分为两类:一般数据和专业数据。一般数据,如网页、书籍和会话文本,由于其庞大、多样和可访问的性质,被大多数LLM使用,这可以增强LLM的语言建模和泛化能力。鉴于LLM表现出令人印象深刻的泛化能力,也有研究将其预训练语料库扩展到更专业的数据集,如多语言数据、科学数据和代码,赋予LLM特定的任务解决能力。在下文中,我们描述了这两种类型的预训练数据源及其对LLM的影响。关于常用语料库的详细介绍,可以参考第3.2节。
常规文本数据。
如图2所示,绝大多数LLM采用通用的预训练数据,如网页、书籍和会话文本,这些数据提供了各种主题的丰富文本源。接下来,我们简要总结了三种重要的一般数据。

  • 网页。由于互联网的普及,已经创建了各种类型的数据,这使得LLM能够获得不同的语言知识并增强其泛化能力。为了方便使用这些数据资源,在以前的工作中,如CommonCrawl中,从web上抓取了大量数据。然而,抓取的网页数据往往既包含维基百科等高质量文本,也包含垃圾邮件等低质量文本,因此过滤和处理网页对于提高数据质量非常重要。
  • 对话文本。会话数据可以提高LLM的会话能力,并有可能提高他们在一系列问答任务中的表现。研究人员可以利用公共对话语料库的子集(例如,PushShift.io Reddit语料库)或从在线社交媒体收集对话数据。由于在线会话数据通常涉及多个参与者之间的讨论,因此一种有效的处理方法是将会话转换为树结构,将话语链接到其响应的话语。这样,多方会话树可以划分为多个子会话,这些子会话可以收集在预训练语料库中。此外,一个潜在的风险是,将对话数据过度整合到LLM中可能会导致副作用:陈述性指令和直接询问被错误地视为对话的开始,从而导致指令的有效性下降。
  • 书籍。与其他语料库相比,书籍提供了正式长文本的重要来源,这可能有利于LLM学习语言知识,建立长期依赖关系模型,并生成叙事和连贯的文本。为了获得开源书籍数据,现有研究通常采用Books3和Bookcorpus2数据集,这些数据集可在Pile数据集中获得。

专用文本数据。
专门的数据集有助于提高LLM在下游任务中的特定能力。接下来,我们将介绍三种专门的数据。

  • 多语言文本。除了目标语言中的文本外,整合多语言语料库还可以增强多语言理解和生成语言的能力。例如,BLOOM和PaLM在其预训练语料库中分别策划了涵盖46种和122种语言的多语言数据。这些模型在多语言任务(如翻译、多语言摘要和多语言问答)中表现出了令人印象深刻的性能,并实现了与在目标语言的语料库上进行微调的最先进的模型相当或优越的性能。
  • 科学文本。科学出版物的不断增长见证了人类对科学的探索。为了增强对LLMs科学知识的理解,将科学语料库纳入模型预训练是有用的。通过对大量科学文本进行预训练,LLM可以在科学和推理任务中取得令人印象深刻的表现。为了构建科学语料库,现有的工作主要是收集arXiv论文、科学教科书、数学网页和其他相关的科学资源。由于科学领域中数据的复杂性,如数学符号和蛋白质序列,通常需要特定的标记化和预处理技术来将这些不同格式的数据转换为可以由语言模型处理的统一形式。
  • 代码。程序合成在研究界得到了广泛的研究,尤其是在代码上训练的PLM的使用。然而,这些PLM(例如,GPT-J)生成高质量和准确的程序仍然具有挑战性。最近的研究发现,在庞大的代码语料库上训练LLM可以显著提高合成程序的质量。生成的程序可以成功通过专家设计的单元测试用例或解决竞争性编程问题。通常,两种类型的代码语料库通常用于预训练LLM。第一个来源来自编程问答社区,如Stack Exchange。第二个来源来自公共软件存储库,如GitHub,其中收集代码数据(包括注释和文档字符串)以供使用。与自然语言文本相比,代码采用编程语言的格式,对应于长依赖关系和精确的执行逻辑。最近的一项研究还推测,代码训练可能是复杂推理能力(例如,思维链能力)的来源。此外,已经表明,将推理任务格式化为代码可以帮助LLM生成更准确的结果。

4.1.2 数据预处理

在收集了大量文本数据后,对数据进行预处理以构建预训练语料库至关重要,尤其是去除噪声、冗余、无关和潜在的有毒数据,这些数据可能会在很大程度上影响LLM的容量和性能。在这一部分中,我们回顾了详细的数据预处理策略,以提高收集数据的质量。LLM预处理预训练数据的典型流程如图3所示。
质量过滤。
为了从收集的语料库中去除低质量的数据,现有的工作通常采用两种方法:(1)基于分类器的方法和(2)基于启发式的方法。前一种方法基于高质量文本训练选择分类器,并利用它来识别和过滤低质量数据。通常,这些方法训练一个二元分类器,将精心策划的数据(例如维基百科页面)作为正实例,将样本候选数据作为负实例,并预测衡量每个数据实例质量的分数。然而,几项研究也发现,基于分类器的方法可能会导致方言、口语和社会方言中高质量文本的无意删除,这可能会导致预训练语料库中的偏见,并减少语料库的多样性。作为第二种方法,一些研究,如BLOOM和Gopher,采用基于启发式的方法,通过一组精心设计的规则来消除低质量的文本,可以总结如下:

  • 基于语言的过滤。如果LLM主要用于某些语言的任务,则可以过滤其他语言的文本。
  • 基于度量的过滤。关于生成的文本的评估度量,例如困惑,可以用于检测和去除不自然的句子。
  • 基于统计的过滤。语料库的统计特征,例如标点符号分布、符号与单词的比例和句子长度,可以用来测量文本质量并过滤低质量数据。
  • 基于关键字的过滤。根据特定的关键词集,可以识别并删除文本中嘈杂或无用的元素,如HTML标签、超链接、样板和冒犯性单词。

在这里插入图片描述
重复数据消除。
现有工作发现,语料库中的重复数据会降低语言模型的多样性,这可能导致训练过程变得不稳定,从而影响模型性能。因此,有必要对预训练语料库进行去重处理。特别地,重复数据消除可以以不同的粒度执行,包括句子级别、文档级别和数据集级别的重复数据消除。首先,应该删除包含重复单词和短语的低质量句子,因为它们可能会在语言建模中引入重复模式。在文档层面,现有的研究大多依赖于文档之间表面特征的重叠率(例如,单词和n-gram重叠)来检测和删除包含类似内容的重复文档。此外,为了避免数据集污染问题,通过从训练集中删除可能的重复文本,防止训练集和评估集之间的重叠也是至关重要的。已经表明,三个级别的重复数据消除有助于改进LLM的训练,应在实践中联合使用。
隐私补救措施。
大多数预训练文本数据来自网络来源,包括用户生成的涉及敏感或个人信息的内容,这可能会增加隐私泄露的风险。因此,有必要从预训练语料库中去除个人可识别信息(PII)。一种直接有效的方法是采用基于规则的方法,如关键词识别,来检测和删除姓名、地址和电话号码等PII。此外,研究人员还发现,LLM在隐私攻击下的脆弱性可归因于预训练语料库中存在重复的PII数据。因此,重复数据消除也可以在一定程度上降低隐私风险。
分词。
分词也是数据预处理的关键步骤。它旨在将原始文本分割成单个词元的序列,这些标记随后用作LLM的输入。尽管利用现有的分词是有利的(例如,OPT和GPT-3利用GPT-2的分词),但使用专门为预训练语料库设计的分词可能是非常有益的,尤其是对于由不同域、语言和格式组成的语料库。因此,最近的几个LLM专门为带有句子片段的预训练语料库训练定制的分词。字节级字节对编码(BPE)算法用于确保分词后的信息是无损的。而BPE中的规范化技术,如NFKC,可能会降低分词性能。

4.1.3 预训练数据对LLMs的影响

与小规模的PLM不同,由于对计算资源的巨大需求,多次迭代LLM的预训练通常是不可行的。因此,在训练LLM之前,构建一个准备充分的预训练语料库尤为重要。在这一部分中,我们讨论了预训练语料库的质量和分布如何潜在地影响LLM的性能。
混合来源。
如前所述,来自不同领域或场景的预训练数据具有不同的语言特征或语义知识。通过对来自不同来源的文本数据的混合进行预训练,LLM可以获得广泛的知识范围,并可能表现出强大的泛化能力。当混合不同的来源时,需要仔细设置预训练数据的分布,因为这也可能影响LLM在下游任务中的性能。Gopher对数据分布进行消融实验,以检查混合源对下游任务的影响。LAMBADA数据集的实验结果表明,增加书籍数据的比例可以提高模型从文本中捕获长期依赖关系的能力,增加C4数据集的比例可以改善C4验证数据集的性能。而作为副作用,对某个领域的过多数据进行训练会影响LLM在其他领域的泛化能力。因此,建议研究人员仔细确定来自不同领域的数据在预训练语料库中的比例,以便开发出更好地满足其特定需求的LLM。读者可以参考图2来比较不同LLM的数据源。
预训练数据量。
为了预训练有效的LLM,收集足够的高质量数据以满足LLM的数据量需求是很重要的。现有研究发现,随着LLM中参数规模的增加,还需要更多的数据来训练模型:就模型性能而言,在数据规模方面也观察到与模型规模相似的规模规律。最近的一项研究表明,由于预训练数据不足,许多现有LLM受到次优训练的影响。通过进行广泛的实验,它进一步证明,在给定的计算预算下,以相等的规模增加模型大小和数据大小可以产生更高效的计算模型(即Chinchilla模型)。最近,LLaMA表明,通过更多的数据和更长的训练,较小的模型也可以获得良好的性能。总体而言,建议研究人员更多地关注高质量数据的数量,以充分训练模型,尤其是在缩放模型参数时。
预训练数据的质量。
现有工作表明,在低质量语料库上进行预训练,如噪声、有毒和重复数据,可能会损害模型的性能。为了开发一个性能良好的LLM,至关重要的是要考虑收集的训练数据的数量和质量。最近的研究,如T5、GLaM和Gopher,已经调查了数据质量对下游任务性能的影响。通过比较在过滤和未过滤语料库上训练的模型的性能,他们得出了相同的结论,即在干净的数据上预训练LLM可以提高性能。更具体地说,数据的重复可能导致“双重下降”(指表现最初恶化,随后改善的现象),甚至压垮训练过程。此外,研究表明,重复数据会降低LLM从上下文中复制的能力,这可能会进一步影响LLM在上下文学习中的泛化能力。因此,如[56,59,69]中所建议的,必须小心地将预处理方法纳入预训练语料库中(如第4.1.2节所示),以提高训练过程的稳定性,避免影响模型性能。

4.2 架构

在本节中,我们将回顾LLM的架构设计,即主流架构、预训练目标和详细配置。表3列出了几个具有代表性的LLM的模型卡以及公开的详细信息。
在这里插入图片描述

4.2.1 主流架构

在这里插入图片描述
由于出色的并行性和容量,Transformer架构[22]已成为开发各种LLM的事实骨干,使语言模型能够扩展到数百或数千亿个参数。通常,现有LLM的主流架构可以大致分为三大类型,即编码器-解码器、因果解码器和前缀解码器,如图4所示。

编码器-解码器体系结构。vanilla Transformer模型建立在编码器-解码器架构[22]上,该架构由两堆Transformer块组成,分别作为编码器和解码器。编码器采用堆叠的多头自注意层对输入序列进行编码,以生成其潜在表示,而解码器对这些表示进行交叉注意,并自回归生成目标序列。

编码器-解码器PLM(例如T5[73]和BART[24])在各种NLP任务上显示出有效性。到目前为止,只有少量的LLM是基于编码器-解码器架构构建的,例如Flan-T5[64]。我们在第4.2.4节中留下了关于架构选择的详细讨论。

因果解码器体系结构。因果解码器架构结合了单向注意力掩码,以确保每个输入令牌只能关注过去的令牌及其自身。通过解码器以相同的方式处理输入和输出令牌。作为该体系结构的代表性语言模型,GPT系列模型[26,55105]是基于因果编码器体系结构开发的。特别是,GPT-3[55]成功地证明了该架构的有效性,也展示了LLM惊人的上下文学习能力。

有趣的是,GPT-1[105]和GPT-2[26]并没有表现出GPT-3中那样优越的能力,而且扩展似乎在增加该模型架构的模型容量方面发挥着重要作用。到目前为止,因果解码器已被各种现有的LLM广泛采用作为LLM的架构,如OPT[81]、BLOOM[69]和Gopher[59]。注意,接下来讨论的因果解码器和前缀解码器都属于仅解码器架构。而当提到“仅解码器架构”时,除非另有说明,它主要是指现有文献中的因果解码器架构。

前缀解码器体系结构。前缀解码器架构(也称为非因果解码器[169])修改了因果解码器的掩蔽机制,以使能够对前缀令牌[170]执行双向关注,并仅对生成的令牌执行单向关注。这样,与编码器-解码器架构一样,前缀解码器可以对前缀序列进行双向编码,并逐个自回归预测输出令牌,其中在编码和解码期间共享相同的参数。

与其从头开始进行预训练,一个实用的建议是不断训练因果解码器,然后将它们转换为前缀解码器,以加速收敛[29],例如,U-PaLM[102]是从PaLM[56]导出的。现有的基于前缀解码器的代表性LLM包括GLM130B[83]和U-PaLM[102]。

对于这三种类型的架构,我们还可以考虑通过专家混合(MoE)缩放来扩展它们,其中每个输入的神经网络权重的子集被稀疏激活,例如,Switch Transformer[25]和GLaM[96]。研究表明,通过增加专家数量或总参数大小,可以观察到显著的性能改进[171]。

4.2.2

4.2.3

4.2.4

4.3

4.3.1

4.3.2

5

5.1

5.1.1

5.1.2

5.1.3

5.2

5.2.1

5.2.2

5.2.3

5.3

5.3.1

5.3.2

6

6.1

6.1.1

6.1.2

6.1.3

6.2

6.2.1

6.2.2

7

7.1

7.1.1

在这里插入图片描述

7.1.2

7.1.3

7.2

7.2.1

7.2.2

7.2.3

7.3

7.3.1

7.3.2

8 结论与未来方向

在这项综述中,我们回顾了大型语言模型(LLM)的最新进展,并介绍了理解和使用LLM的关键概念、发现和技术。我们关注的是大型模型(即大小大于10B),而排除了现有文献中已充分涵盖的早期预训练语言模型(如BERT和GPT-2)的内容。特别是,我们的综述讨论了LLM的四个重要方面,即预训练、适应调整、利用和评估。对于每一个方面,我们都强调LLM成功的关键技术或发现。此外,我们还总结了开发LLM的可用资源,并讨论了复制LLM的重要实施指南。这项调查试图涵盖LLM的最新文献,并为研究人员和工程师提供了一个很好的参考资源。
接下来,我们总结了本次综述的讨论,并从以下几个方面介绍了LLM面临的挑战和未来的发展方向。
理论与原理。
为了理解LLM的潜在工作机制,最大的谜团之一是信息是如何通过非常大的深度神经网络分布、组织和利用的。揭示大语言模型能力的基础基本原理与要素这一点很重要。特别是,扩展似乎在提高LLM的容量方面发挥着重要作用。研究表明,当语言模型的参数规模增加到临界规模(例如,10B)时,一些涌现能力会以意想不到的方式出现(突然的性能飞跃),通常包括上下文学习、指令跟随和逐步推理。这些涌现的能力令人着迷但又令人困惑:LLM何时以及如何获得这些能力尚不清楚。最近的研究要么进行了广泛的实验来研究涌现能力的影响和对这些能力的贡献因素,要么用现有的理论框架解释一些特定的能力。一篇颇有见地的技术帖子也专门讨论了这个话题,以GPT系列模型为目标。然而,理解、表征和解释LLM的能力或行为的更正式的理论和原则仍然缺失。由于涌现能力与自然界中的相变非常相似,跨学科理论或原理(例如,LLM是否可以被视为某种复杂系统)可能有助于解释和理解LLM的行为。这些基本问题值得研究界探索,对开发下一代LLM很重要。
模型体系结构。
由于其可扩展性和有效性,由堆叠的多头自注意力层组成的Transformer已成为构建LLM的事实架构。已经提出了各种策略来提高该架构的性能,例如神经网络配置和可扩展的并行训练(见第4.2.2节中的讨论)。为了增强模型容量(例如,多回合会话能力),现有LLM通常保持较长的上下文窗口,例如,GPT-4-32k具有32768个令牌的超大上下文长度。因此,一个实际的考虑是降低标准自注意机制产生的时间复杂性(最初是二次成本)。研究更有效的Transformer变体在构建LLM中的影响很重要,例如,GPT3中使用了稀疏注意力。此外,灾难性遗忘对神经网络来说是一个长期的挑战,这也对LLM产生了负面影响。当用新数据调整LLM时,最初学习的知识很可能会被破坏,例如,根据一些特定任务微调LLM会影响LLM的总体能力。当LLM与人类价值观一致时,也会出现类似的情况(称为一致税)。因此,有必要考虑用更灵活的机制或模块来扩展现有的体系结构,这些机制或模块可以有效地支持数据更新和任务专门化。
模型训练。
在实践中,由于巨大的计算消耗以及对数据质量和训练技巧的敏感性,很难预训练有能力的LLM。因此,考虑到模型有效性、效率优化和训练稳定性等因素,开发更系统、更经济的预训练方法来优化LLM变得尤为重要。应该开发更多的模型检查或性能诊断方法(例如,GPT-4中的可预测缩放),以检测训练期间的早期异常问题。此外,它还要求更灵活的硬件支持或资源调度机制,以便更好地组织和利用计算集群中的资源。由于从头开始预训练LLM的成本非常高,因此设计一种合适的机制来基于公开可用的模型检查点(例如,LLaMA和Flan-T5)持续预训练或微调LLM是很重要的。为此,必须解决一些技术问题,例如灾难性遗忘和任务专门化。然而,到目前为止,仍然缺乏用于LLM的开源模型检查点,该检查点具有完整的预处理和训练日志(例如,准备预训练数据的脚本)以供复制。我们相信,在开源模型中报告更多的技术细节对LLM的研究将具有巨大的价值。此外,开发更多有效激发模型能力的改进调整策略也很重要。
模型利用率。
由于微调在实际应用中成本高昂,提示已成为使用LLM的突出方法。通过将任务描述和演示示例结合到提示中,上下文学习(一种特殊的提示形式)赋予LLM在新任务上表现良好的能力,在某些情况下甚至优于全数据微调模型。此外,为了增强复杂推理的能力,已经提出了先进的提示技术,以思维链策略为例,该策略将中间推理步骤包括在提示中。然而,现有的提示方法仍然存在以下几个不足之处。首先,它在提示的设计上涉及到大量的人力工作。自动生成用于解决各种任务的有效提示将非常有用。其次,一些复杂的任务(如形式证明和数值计算)需要特定的知识或逻辑规则,这些知识或规则可能无法用自然语言很好地表达或通过例子来证明。因此,为提示开发信息量更大、更灵活的任务格式化方法是很重要的。第三,现有的激励策略主要集中在单轮性能上。开发交互式提示机制(例如,通过自然语言对话)来解决复杂任务是有用的,ChatGPT已经证明这非常有用。
安全和对准。
尽管LLM有能力,但它们也面临着与小型语言模型类似的安全挑战。例如,LLM表现出产生幻觉的倾向,这些文本看起来似乎合理,但事实上可能不正确。更糟糕的是,LLM可能是由为恶意系统生成有害、有偏见或有毒文本的故意指令引发的,从而导致潜在的滥用风险。要详细讨论LLM的安全问题(例如,隐私、过度依赖、虚假信息和影响操作),读者可以参考GPT3/4技术报告。作为避免这些问题的主要方法,从人类反馈中强化学习(RLHF)已被广泛使用,将人类纳入训练循环中,以开发一致的LLM。如GPT-4所示,为了提高模型的安全性,在RLHF期间包括安全相关提示也很重要。然而,RLHF严重依赖于来自专业标记员的高质量人类反馈数据,这使得它很难在实践中得到正确实施。因此,有必要改进RLHF框架,以减少人类标注人员的工作量,并寻求一种更有效、数据质量有保证的标注方法,例如,可以使用LLM来协助标注工作。最近,红团队已被用于提高LLM的模型安全性,它利用收集的对抗性提示来细化LLM(即,避免来自红团队的攻击)。此外,为LLM建立适当的学习机制,通过聊天获得人类反馈,并直接利用它进行自我完善,也是有意义的。
应用和生态系统。
由于LLM在解决各种任务方面表现出强大的能力,它们可以应用于广泛的现实世界应用程序(即,遵循特定任务的自然语言指令)。作为一个显著的进步,ChatGPT可能改变了人类访问信息的方式,这一点在新Bing的发布中得到了实现。在不久的将来,可以预见LLM将对信息搜索技术产生重大影响,包括搜索引擎和推荐系统。此外,随着LLM的技术升级,智能信息助理的开发和使用将得到大力推动。在更广泛的范围内,这一波技术创新将导致LLM授权应用程序的生态系统(例如,ChatGPT对插件的支持),这与人类生活有着密切的联系。最后,LLM的兴起为人工通用智能(AGI)的探索提供了线索。它有望开发出比以往更多的智能系统(可能具有多模态信号)。然而,在这个发展过程中,人工智能的安全应该是主要关注的问题之一,即让人工智能为人类带来好处而不是坏处。
CODA:
这项综述是在我们的研究团队举行的一次讨论会上计划的,我们旨在总结大型语言模型的最新进展,作为团队成员可读性强的报告。初稿于2023年3月13日完成,我们的团队成员尽最大努力以相对客观、全面的方式纳入关于LLM的相关研究。然后,我们对文章的写作和内容进行了几次大范围的修改。尽管我们做出了种种努力,但这项调查仍然远非完美:我们可能会错过重要的参考文献或主题,也可能会有不严谨的表达或讨论。由于空间限制,通过设置选择标准,我们只能在图1和表1中包括一小部分现有LLM。然而,我们在GitHub页面上设置了一个更宽松的模型选择标准(https://github.com/RUCAIBox/LLMSurvey),将定期维护。我们将不断更新这项综述,并尽可能提高质量。对我们来说,综述写作也是LLM自己的一个学习过程。对于对改进本次综述有建设性建议的读者,欢迎您在我们综述的GitHub页面上留言或直接给我们的作者发电子邮件。我们将在未来的版本中根据收到的意见或建议进行修订,并感谢在我们的综述中提出建设性建议的读者。
更新日志。在这一部分中,我们定期维护向arXiv提交本次综述的更新日志:

  • 2023年3月31日首次发布:初始版本。
  • 2023年4月9日更新:添加隶属关系信息,修改图1和表1,明确LLM的相应选择标准,改进写作,纠正一些小错误。
  • 2023年4月11日更新:更正库资源的错误。
  • 2023年4月12日更新:修订图1和表1,并澄清LLM的发布日期。
  • 2023年4月16日更新:添加关于GPT系列模型技术演变的新第2.2节。
  • 2023年4月24日更新:添加关于缩放定律的讨论,并添加关于涌现能力的模型大小的一些解释(第2.1节);在图4中添加不同架构的注意力模式的示意图,并在表4中添加详细的公式。
  • 2023年4月25日更新:修改图表中的一些复制错误。
  • 2023年4月27日更新:在第5.3节中添加高效调优。
  • 2023年4月28日更新:修订第5.3节。
  • 2023年5月7日更新:修订表1、表2和一些要点。

规划内容。我们将定期在这项综述中加入新的内容,使其更加独立和最新。在这里,我们列出了下一个主要版本中可能出现的几个潜在主题:(1)从GPT-1到ChatGPT的技术演变(部分完成),(2)基于LLaMA的调整(例如,Alpaca),(3)轻量级调整策略(完成),以及(4)模型细节的详细公式(完成)。如果您对本次综述有具体的建议,请给我们留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图的企业应用-A*算法自动寻路

引言 MC想必大家都玩过,但鸡哥利用A*自动寻路算法来找箱子 箱子里有鸡你太美唱片&#xff0c;和准备好的篮球 当然在这是游戏中找到的宝箱 还得原石x5等一大堆的养成物品 ???等等 ,原神 玩家露出鸡脚了吧! 不应该是 有鸡你太美唱片,还有一条鱼并且给梅里猫的名叫荔枝的? 这…

【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?

前言: 大家好,我是良辰丫,在上一篇文章中我们学习了MyBatis简单的查询操作,今天来介绍一下Spring Boot(SSM)的一种单元测试,有人可能会感到疑惑,框架里面还有这玩意?什么东东呀,框架里面是没有这的,但是我们简单的学习一下单元测试,可以帮助我们自己测试代码,学习单元测试可以…

SEO留痕霸屏技术原理实现分析

留痕效果 通常是查询某个关键词&#xff0c;出现大量搜索结果网页霸屏&#xff0c;而且都会引导到其他平台或者网站进行浏览和查看。留痕网站和指向网站或平台无关联。 示例图片&#xff1a; 原理分析 首先通过内容和链接很容易明白&#xff0c;本质上就是一个搜索页面&…

OpenAI API升级:新GPT-3.5 Turbo和GPT-4助力AIGC应用大放异彩

theme: orange 前言 北京时间2023年6月13日&#xff0c;OpenAI宣布对其领先的生成型AI模型GPT-3.5 Turbo和GPT-4进行一系列更新&#xff0c;以提高工作场所的人工智能能力。这些改进包括引入全新的函数调用功能、增强的可引导性、GPT-3.5 Turbo的扩展上下文&#xff0c;以及修订…

数值分析第九章节 用Python实现常微分方程初值问题的数值解法

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第9章 常微分方程初值问题的数值解法 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 欧拉法后退的欧拉方法梯形方法改进欧拉公式补充龙格—库塔方法线性多步法阿当姆斯显示与隐式公式 9.1引…

5.3.3 因特网的路由协议(三)OSPF协议

5.3.3 因特网的路由协议&#xff08;三&#xff09;OSPF协议 前面我们学习了基于距离向量算法的路由信息协议RIP&#xff08;5.3.2 因特网的路由协议&#xff08;二&#xff09;基于距离向量算法的RIP协议&#xff09;,为了克服RIP协议的局限性于是就有了新的内部网关协议OSPF…

30行代码实现通用无限列表函数

前言&#xff1a; 前两天接到了一个需求&#xff0c;主要功能是实现类似于 B站 消息页面的那种效果&#xff0c;右侧几个 tab 都需要使用到无限加载的功能。 大家都知道&#xff0c;程序员是很懒的&#xff0c;不可能这几个页面全都写一遍重复的逻辑。所以在接到这个需求的时…

HBuilder连接手机模拟器调试,进行抓包

hbuilder连接手机模拟器 1.adb是什么&#xff1f;引用 2. 进行adb路径设置&#xff0c;选中模拟器中的adb路径&#xff0c;配置好端口&#xff0c;夜神模拟器端口&#xff1a;62001 3.运行到Andriod基座 在HBuilder连接模拟器过程中&#xff0c;对接口进行抓包 1.安装抓包工…

Spring Security --- 自定义Filter

简介任何 Spring Web 应用本质上只是一个 servletSecurity Filter在 HTTP 请求到达你的 Controller 之前过滤每一个传入的 HTTP请求Filter请求过滤器可以帮助进行HttpServletRequest请求和HttpServletResponse响应的过滤在自定义的Filter过滤器中可以对请求进行过滤&#xff0c…

控制并发流程,做好线程间的协调

一、概述 1. 什么是控制并发流程&#xff1f; 线程一般是由线程调度器自动控制的&#xff0c;但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合&#xff0c;从而满足业务逻辑。比如&#xff1a; 让线程A等待线程B执行完后再执行等一些相互合作的逻辑&#xff1b…

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

python打包后报错,无法启动,电脑缺少api-ms-win-core-path-11-1-0.dll

参考&#xff1a;《运行打包python程序时报&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失 api-ms-win-core-path-l1-1-0.dll 尝试重新安装该程序以解决此问题。》 原因&#xff1a;python版本较高&#xff0c;打包时的python版本是python3.10&#xff0c;而运行打包…

mdBook介绍及使用——使用 Markdown 创建你自己的博客和电子书

目录 介绍一、下载与创建项目1.下载2.初始化3.结构说明 二、编写文章与启动1.编写文章2.构建3.启动 mdbook 服务 三、其他配置 介绍 mdBook 是一个使用 Markdown 创建书籍的命令行工具。它非常适合创建产品或 API 文档、教程、课程材料或任何需要清晰、易于导航和可定制的演示…

LED开关电源里的PCB回路设计应该怎么做?

LED开关电源的研发速度在最近几年中有了明显的技术飞跃&#xff0c;新产品更新换代的速度也加快了许多。作为最后一个设计环节&#xff0c;PCB的设计也显得尤为重要&#xff0c;因为一旦在这一环节出现问题&#xff0c;那么很可能会对整个的LED开关电源系统产生较多的电磁干扰&…

界面控件DevExtreme UI组件——增强的自定义功能

在本文中&#xff0c;我们将回顾DevExtreme UI组件在v22.2版本主要更新中一系列与自定义相关的增强。 DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#x…

6、微服务组件openfeign

1、在消费端的项目中引入openfeign依赖 首先需要确保引入了springcloud&#xff0c;因为openfeign依赖与springcloud 在消费端的pom.xml中引入openfeign&#xff0c;父项目中已经引入了springcloud了 <?xml version"1.0" encoding"UTF-8"?> <…

行云创新CloudOS助力蜂巢能源获中国信通院2023云原生应用优秀案例奖

2023 年 6 月 6 日&#xff0c;工业和信息化部主办的ICT 中国高层论坛-云原生产业高峰论坛成功举办&#xff0c;活动期间&#xff0c;中国信通院发布了“2023云原生应用优秀案例奖”获奖名单。其中&#xff0c;蜂巢能源作为中国新能源行业的代表之一&#xff0c;凭借其基于行云…

IKEA EDI项目开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

一次 Nacos 导致的 CPU 飙高问题完整复盘

今天下午突然 出现 测试环境 cpu飙高&#xff0c;干到了 60%&#xff0c;其他项目 响应时间明显变长。。。有点吓人&#xff0c;不想背锅 项目背景 出问题的项目是 需要连接各个不同nacos 和不同的 namespace 进行对应操作的 一个项目&#xff0c;对nacos的操作都是httpClien…

【工具】Maven加强版 — mvnd的使用

【工具】Maven加强版 — mvnd的使用 下载 Releases apache/maven-mvnd (github.com) 选对应的版本 我用的Windows版 1、安装 直接解压。 然后配置环境变量&#xff1a;将 bin 目录添加到 PATH 2、测试 打开CMD终端&#xff0c;输入 mvnd -v 可以看到如下信息表示安装成…