万字长文——这次彻底了解LLM大语言模型


前言

在深入学习LLM(大型语言模型)之前,了解NLP(自然语言处理)的基本原理对于应用LLM至关重要。虽然在具体的LLM训练和应用中,NLP相关概念的内容应用可能有限,但这并不削弱了解NLP基础知识的重要性。这种基础知识有助于更好地理解LLM的训练方法、功能以及其在各种领域的潜在应用。因此,在学习LLM之前,建议先掌握NLP的基础原理,以便更全面地掌握这一领域的知识,并能够更好地应用它们。感兴趣的同学可以移步AI模型训练——入门篇


一、浅析语言模型中的核心概念

自然语言处理领域正在经历着一场又一场的革命,各类技术层出不穷,不断的改变我们对文本的理解方式和文本生成方式。类似与蝴蝶效应,这场革命不仅提高了机器翻译、文本摘要、文本分类等任务的性能,还在各行各业引发了巨大的变革。越来越 多的行业AI化、智能化。在本小节,将介绍一些语言模型中的核心概念,为更好的理解大语言模型做铺垫。

1.1分词:

分词是将文本分解成词汇单元或标记的过程。把这些词汇单元通常是语言中的最小可操作单元,可以是单词、子词(单词的一部分)、字符或其他更小的文本单元。这个过程更好的处理未登录词(也就是词典里未记录的词)、解决拼写错误等问题。在入门篇中,我们已经知道,分词是NLP中的一个基本预处理步骤,它为文本的后续处理提供了原始材料,并有助于理解和处理文本数据。可以将分词理解为在进行语言建模,语言建模是提高机器语言智能的主要方法之一。常用的英文分词工具有NLTK、SpaCy;中文有jieba库等。

最早应用分词概念的是n-gram模型,可以说它是语言建模的元祖,这个概念提出于20世纪20年代,在20世纪50年代和60年代得到了进一步发展和形成。Claude Shannon和Warren Weaver的著作《The Mathematical Theory of Communication》中也探讨了类似的思想。不过,n-gram模型并没有一个具体的创始人,是通过多位研究者的努力和研究逐渐演化和发展起来的。n-gram模型在自然语言处理领域的早期应用主要集中在文本处理和信息检索等领域。随着计算机技术的发展,变得更加重要,并被用于各种自然语言处理任务,包括机器翻译、语音识别、文本分类和文本生成等。其核心思想是假设一个词出现的概率仅依赖于它前面的N-1个词。在预测下一个单词的概率时,只会考虑它前面的N-1个词,值得注意的是,这个“词”不单指单词,也可以是指字,比如在情感分析的时候就可以是词,在文本纠错的时候就可以是单字。以N=1、2、3为示例:

Unigram(1-gram)模型:每个单词被视为独立的,其概率只取决于它自己,而不受其他单词的影响。这意味着句子的概率等于所有单词概率的乘积。

Bigram(2-gram)模型:每个单词的概率仅取决于前一个单词。这个模型考虑了相邻单词之间的依赖关系,但没有考虑更远处的单词。

Trigram(3-gram)模型:这个模型与bigram类似,但每个单词的概率取决于前两个单词。它更进一步考虑了单词之间的依赖关系,但仍然存在局限性。

总体来说,n-gram模型忽略了较长范围的依赖关系,因此在处理复杂的句子结构和语言模糊性时存在限制。它们也无法处理未见过的词汇或短语,因为模型的概率是基于训练数据中出现的n-grams计算的。

1.2词向量:

在入门篇中,也有提到过词向量的概念,那么什么是词向量呢?词向量其实是为了完成将词语转换成对应数值向量的表达形式,便于计算机读取和运算这一任务产生的名词概念。在发展长河中,创建词向量的常用的方法有:独热编码和表示学习。

独热编码:
独热编码是一种用于将离散的词汇表示成二进制向量的方法,每个词汇对应一个唯一的向量,其中只有一个元素为1,其余元素为0。这个1位通常表示词汇在词汇表中的位置。独热编码的步骤如下:

构建词汇表:首先,需要构建一个包含文本数据中所有不同词汇的词汇表。每个词汇都被赋予一个唯一的整数标识,通常按照它们在词汇表中的顺序分配。

独热编码:对于每个词汇,将对应的整数标识转化为一个二进制向量,其中只有一个位置为1,而其他位置都为0。这个1位的位置表示词汇的标识。

举个例子,假设我们有一个包含4个词汇的词汇表:[“apple”, “banana”, “cherry”, “date”],那么独热编码后的向量如下:

“apple”:[1, 0, 0, 0]
“banana”:[0, 1, 0, 0]
“cherry”:[0, 0, 1, 0]
“date”:[0, 0, 0, 1]

通用数学公式:v(“x”)∈R^N,
独热编码的优点是简单易懂,每个词汇都有唯一的编码。然而,它的缺点是无法捕捉单词间的相似性和语义关系,每个词都是独立的。除此之外,向量维度与词汇表大小相关,要为每个词创建一个维度,也导致了对于大型词汇表其向量会十分稀疏,只有一个位置为1其余都为0。

表示学习:
表示学习是一项重要的自然语言处理(NLP)技术,旨在将词汇、短语或文本转换为稠密、低维的实值向量,以便于计算机更好地理解和处理文本数据。这一技术的核心思想是通过训练,将词汇表中的每个单词映射到一个固定长度的低维向量空间中,使得在这个向量空间中,相似的词汇具有相似的表示,从而捕获了词汇之间的语义信息。该方法有以下几个特点:

1.从高维到低维:传统的文本表示方法(如上文中的独热编码)会将每个词汇表示为一个高维稀疏向量,其中大多数维度为零。这种表示方式在大规模文本数据中会导致维度爆炸,且难以捕捉词汇之间的语义关系。表示学习的思想是将这些高维向量映射到一个低维稠密向量空间中,使得每个词汇都能够用更紧凑的形式表示。

  1. 语义信息的捕获:表示学习的目标是捕获词汇之间的语义信息,使得相似的词汇在向量空间中有相似的表示。这意味着在向量空间中,语义相似的词汇会彼此靠近,而语义上不相关的词汇会在空间中远离彼此。这种语义相似度的度量使得我们可以更好地理解文本的含义和关联。

  2. 向量空间的构建: 表示学习中的一个关键概念是构建词汇表的向量空间。词汇表中的每个词汇都被映射到向量空间中的一个点,这个点的坐标就是词汇的向量表示。所有这些词向量共同构成了向量空间,这个空间中的距离和角度关系反映了词汇之间的语义相似度和关联性。

  3. 维度的减小:表示学习的另一个关键目标是将维度大大减小。传统的高维稀疏表示会浪费大量的存储空间和计算资源。通过降低维度,我们能够更高效地存储和处理大规模的文本数据,同时保留了重要的语义信息。

1.3神经概率语言模型

词向量模式有一定的弊端,因为他是利用静态语料去训练的,在训练完成后不会在发生任何变化,也就导致它的能力局限在了词表,无法处理超出此范围的词。为了解决这一问题,神经网络就此诞生,其具有强大表达学习能力。我们可以理解为词向量通过神经网络参数,彼此之间可以产生联系。

它由三部分构成:

输入层接受一个上下文窗口内的词汇作为输入,将其表示为词向量。
隐藏层通过学习权重来捕获词汇之间的复杂关系,具备非线性建模能力。
输出层使用softmax函数生成概率分布,表示词汇表中每个词汇作为下一个词的概率。
虽然NLM在某些任务中表现出色,但它也有一些缺点,如处理长序列时的性能问题,也就推动了后续的Transformer模型出现。

二、大语言模型发展历程

第一阶段(2013-2017):前期探索与词嵌入:

2013年,NLP领域迎来了重要的突破,词嵌入技术开始崭露头角。Google公司在2013年发布的Word2vec成为了时代的亮点,即上文中表示学习发放代表作,它是由Tomas Mikolov等人开发的。Word2vec的工作机制是将单词映射到低维向量空间,从而捕捉单词之间的语义关系。通俗地说,Word2vec能够快速将词语转换成模型所需要的向量形式,成为NLP领域强有力的工具,大大提升了NLP的效率,同时也标志着NLP从基于规则转向基于数据驱动。

第二阶段(2018-2019):BERT和自监督学习的崭露头角

BERT(Bidirectional Encoder Representations from Transformers)崭露头角:在2018年底,Google发布了BERT,这是一种双向自监督预训练模型,它引入了一种全新的范式,彻底改变了自然语言处理的方法。传统的自监督学习方法通常是单向的,而BERT则可以双向理解文本,这意味着它可以同时考虑一个词的左右上下文,大大提高了对上下文的理解。BERT的出现引发了一波研究热潮,各种NLP任务的性能得到了显著提高。与此同时,OpenAI的GPT(Generative Pre-trained Transformer)模型也初露锋芒。虽然GPT采用了单向的自监督学习方法,但它拥有着巨大的生成能力,能够生成连贯、有逻辑的文本。这两个模型的出现使自监督学习成为自然语言处理的主流方法之一。这一阶段的关键特点是BERT的发布,它引入了双向自监督学习的概念,颠覆了传统的自然语言处理方法,以及GPT等模型的出现,促进了自监督学习方法的研究和应用。

第三阶段(2020-2021):大规模模型和多模态任务

GPT-3的出现和参数规模的飞跃:2020年6月,OpenAI发布了GPT-3,这是一个巨大的预训练语言模型,具有数千亿的参数。GPT-3的出现引发了广泛的讨论和关注,它展示了前所未有的生成能力。这个模型可以生成高质量的文本、回答问题、甚至创作诗歌和散文。与此同时,模型库如Hugging Face的Transformers库得到了广泛的发展和推广(入门篇有详细介绍)。这些库提供了各种预训练语言模型的实现,使研究人员和开发者能够更轻松地访问和使用这些模型。这大大推动了模型的研究和应用。为了更好地适应特定领域的需求,研究人员开始开发专用的预训练模型。例如,BioBERT是专门用于生物医学领域的模型,LegalBERT则专注于法律领域。专用模型使得其在相应领域的任务上表现更为出色。除了文本处理,多模态任务也受到了广泛的关注。这一阶段见证了将文本与图像、音频等多种模态数据结合的研究,模型开始具备理解和处理多种类型数据的能力。这对于实现更复杂的自然语言处理任务和应用具有重要意义。

第四阶段(2022-至今):AIGC时代的到来

模型参数规模的进一步扩大:这一阶段模型参数规模的持续扩大。如GPT-4、Bard等已经拥有千亿乃至千万亿级别的参数,这使得它们在NLP中的性能也越发惊人。大规模模型的出现推动了NLP领域的进一步探索和创新。毋庸置疑,在模型参数规模不断扩大的同时,模型的架构也在不断演进。自回归架构成为主潮结构,这也使得其在生成式任务上表现出了更高的能力。随着模型规模的扩大,对与人类交互的安全性和可靠性的关注也日益增加。研究人员和开发者致力于开发无毒、无偏见、不歧视的模型,以确保它们在与用户互动时不会产生有害或不当的内容。至今,这一领域的研究和工作仍在不断进行中。总结一下,这一阶段的主要特点是模型参数规模的进一步扩大、模型架构的演变以及对与人类交互的安全性和可靠性的更多关注。同时,当前的研究和发展趋势也表明,预训练语言模型领域仍然充满了机会和挑战,将继续为自然语言处理技术的未来发展开辟新的道路。

三、LLM基本结构

有了第一小节部分的铺垫,我相信你已经很清楚大多数LLM是基于Transformer架构的了,在大规模文本数据上进行预训练,然后微调至适用于任务要求的状态, 最后应用于各类NLP任务,如文本生成、文本理解、情感分析等。自 Bert作为双向语言模型,在大规模无标签语料库上使用专门设计的预练任务,使性能显著提升以来,预训练-微调便作为一个学习范式被遵循,科研人员将其引入不同的架构,比如bart、gpt等表现优异的模型中去。在本小节,将具体的介绍预训练和微调这两个概念。

3.1预训练阶段工作步骤

LLM的预训练(Pretraining)是指在将模型用于特定任务之前,模型在大规模通用语料库上进行的初始训练阶段。模型在这个阶段会学习关于NLP的一般性知识,包括语法、语义、词汇等。这个过程通过自监督学习的方式进行。所以在这个过程中,语料库的规模和质量对于其获得强大的能力至关重要

预训练的目标是让模型获得足够的语言理解能力,以便在后续的微调或特定任务中表现出色。一旦完成了预训练,模型可以通过微调(Fine-tuning)来针对具体任务进行进一步训练,以适应任务特定的数据和要求。

LLM的预训练过程的关键步骤如下:

1.数据收集:毋庸置疑,NLP类型的任务都是基于数据的。所以要准备好数据集。数据可以大体分为两类:1 .通用文本数据,这类数据通常来源于网页、数据。规模较大,并且获取难度很低。专用文本数据则是根据任务目的去获取,比如代码或者论文等科学文本。

2.数据清洗和预处理:清洗过程包括但不限于去除不必要的格式、特殊字符,确保数据的质量和一致性。预处理数据时主要会对数据进行一下几个方面操作:1.质量过滤,删除语料库中的低质量数据——常用方法有基于分类器的方法和基于启发式的方法,但是对于第一种方法来说,经常会误删除一些有用数据,如方言、口语等,使得语料库的多样性降低。2.去重,在大量实验中发现,过多的重复数据也会影响语言模型的多样性,导致训练过程不稳定,从而影响模型的性能。3.隐私去除,在训练过程中不容小视的一步是安全性问题,因为很多数据来源于网络,所以可能包含了很多个人信息,训练前也要针对性的剔除此类数据。4 分词,这一步骤在前文中已经介绍过,这里不再赘述。

3.构建模型架构:同普通的NLP任务一样,在数据准备好后,就会基于Transformers,选定合适的模型结构,以自监督学习方法进行训练。(自监督学习表示会根据输入文本预测另一部分内容)

4.参数调整:在预训练过程中,需要调整模型的超参数,如学习率、批次大小、训练轮数等,以便取得最佳的性能。

5.保存和部署预训练模型:以模型参数的方式,保存预训练模型权重,以供下游任务使用。

3.2预训练阶段模型结构

除了入门篇(二)中介绍的编码器(encoder)、解码器(decoder)、(编码器-解码器)encoder-decoder模型以外,常见的预训练模型结构还有:

3.2.1Causal Language Modeling(因果语言模型)

CLM(Contrastive Language Modeling)是一种采用单向注意力掩码自监督学习方法,核心思想是通过生成文本的方式来学习语言表示。这种思想确保每个输入标记只关注过去标记和它本身。在这种方法中,模型在生成文本时只关注前面的文本,而不考虑后面的文本,因此这种方法生成的文本是因果的(causal)。

在传统的自监督学习方法中,文本被编码成一个上下文向量,然后被用于计算相似度或者生成文本。在CLM中,则使用对角掩蔽矩阵来保证各token只能看到它之前的token。具体来说,对角掩蔽矩阵的对角线元素为1,其他元素为负无穷,这使得每个token只能看到它前面的token。这使得CLM能够生成因果文本,因为它只能根据之前的token来生成下一个token,而忽略后面的token。

CLM是一种基于生成的自监督学习方法。在生成文本时,模型从当前时刻的隐藏态(hidden state)中采样当前时刻的token,然后将该token加入训练集中。由于生成的token是因果的,因此训练集也被约束为因果,也就是说,如果输入一个之前的token,那么生成的下一个token必须依赖于这个token。这个约束使得模型能够学习到有效的语言表示。迄今为止,因果解码器已被广泛采用为各种现有大语言模型的体系结构,例如GPT 、BLOOM 和 Gopher 。

3.2.2Prefix Language Model(前缀语言模型)
它可以看作是Encoder-Decoder模型的一种变体。 在传统的Encoder-Decoder模型中,Encoder用于将输入序列编码为固定长度的向量表示,其为 AE模式即双向注意力机制,而Decoder则使用单项注意力机制,来使这个向量生成输出序列。可以说它修正了CLM的掩码机制,使其前缀标记执行的是双向注意力机制,但是生成的标记只是单向注意力。

而在Prefix LM中,前缀(prefix)部分充当了Encoder的角色,它包含了输入信息或上下文。模型根据前缀生成连续的文本,这一过程类似于Decoder的工作,但在这里没有明确的分隔符来标识输入和输出序列,因为他们共用一个transformer blocks。可以将Prefix LM视为Encoder-Decoder模型的一种扩展,其中Encoder和Decoder之间没有明确的边界,允许更加灵活的文本生成。

这种结构的灵活性,使得Prefix LM对于生成任务的多样性有了显著提升。同Encoder-Decoder模型,使用这种结构可以同时进行语言理解和语言生成类任务,并且因为Encoder和Decoder共用一个transformer,量级略轻;不过它也有一定的弊端就是效果没有传统的Encoder-Decoder模型优秀(理解类有差距、生成类效果相似)。目前采用此种模型机制的大语言模型有GLM-130B和U-PaLM。

3.2.3Premuted Languge Model(排列语言模型)
PLM 的核心思想是通过对输入文本进行排列重组(置换)来训练模型,从而使其具备更好的序列建模能力。同前缀语言模型,它也是采用单个 Transformer 模型作为主干结构,同时在训练方法上采用了一种独特的方式,将形式看似是自回归(AR)的输入过程与实际上是自编码(AE)的方法相结合。Premuted LM 的外在表现形式是按照自回归(AR)方式生成文本,而 AE 通常直接编码和解码输入数据,没有显式的生成过程。但它在内部使用了 Attention Mask,将上下文信息编码到每个位置,然后根据上下文生成输出。这是一种同时结合了自回归(AR)和自编码(AE)特性的方法。而 AE 更注重数据的压缩和重构,不一定需要生成文本。Premuted LM 更适合自然语言生成任务,如文本生成、翻译等,因为它在外观上类似于AR模型。而 AE 通常用于数据重构、特征学习等领域。

总的来说,PLM 是一种将自回归和自编码的思想结合在一起的预训练模型,它在外观上看似AR,但内部实际上采用了AE的方法,从而在不同的应用场景中具有独特的优势。

3.3Fine-tuning(微调)

本文第一节中介绍了预训练其实就是利用海量数据训练一份模型参数保存下来,这些参数将被应用于微调。预训练+微调的工作模式使得我们完成任务的时候,无须在从头构建一个新的模型。
值得注意的是Fine-tuning是一个通用概念,不同的任务采用不同的微调方法,比如Instruction Tuning、Task-Specific Fine-tuning、Domain Adaptation、Prompt Engineering等等,但无论选择哪种方法,其流程都大体如下:

1.选择预训练模型:根据任务选择一个在大规模数据上训练过的预训练模型。

2.准备数据:准备特定任务的训练数据集。这个数据集通常比预训练模型的数据集小得多,因为微调的目标是调整模型以适应新数据。

3.定义任务:为任务定义输入和输出。例如,对于文本分类,输入可以是文本,输出可以是类别标签;对于图像分割,输入可以是图像,输出可以是每个像素的标签。

4.微调模型:最后,使用准备好的数据集,将预训练模型的权重微调,以最小化任务特定的损失函数。

用之前入门篇的知识,进一步细化介绍下微调的相关概念以及步骤:

  1. Tokenizer:这个组件负责数据预处理,将自然语言文本转换为适用于模型输入的形式。

  2. Datasets:用于训练模型的数据集,可以直接从社区获取各种数据集,方便快捷。

  3. Model:这是对PyTorch模型的封装,专门用于更好地支持预训练模型的使用。

  4. Evaluate:评估函数,用来对模型的输出结果进行全面的评估和分析。

  5. Trainer:训练器,可以在其中配置各种模型参数,以便快速启动模型训练流程。

  6. Pipeline:模型推理的必备工具,快速验证和检查模型的输出结果。

总结一下:导入想要应用的包->加载想要训练的数据集->(划分数据集)->预处理数据集->创建model->(设置评估函数)->创建trainer->配置trainer参数->模型训练

3.3.1Task-specific Fine-tuning(任务特定微调)
Task-specific Fine-tuning 是Fine-tuning的一种具体应用,它指的是将模型微调以适应特定任务。这个任务可以是任何NLP类型任务,包括文本分类、文本生成、问答等。当在Fine-tuning中使用特定任务的数据集和损失函数时,就可以说我们正在进行 Task-specific Fine-tuning。

让我们通过一个实际的例子来解释Task-specific Fine-tuning(任务特定微调):

假设有一个预训练语言模型以及一个NER(命名实体识别)任务,任务是从文本中识别出人名、地名、组织名等命名实体。

以下是任务特定微调的步骤:

  1. 预训练模型:首先,准备一个在大规模文本数据上进行了预训练的模型,该模型具备了一定的自然语言理解能力。

  2. 数据准备:为了执行NER任务,准备一个任务特定的数据集,其中包含了包含命名实体标注的文本样本。这个数据集是特定任务的数据,通常包括训练集和验证集。

  3. 任务定义:定义这个任务的输入和输出格式。在NER任务中,输入是文本序列,输出是相应文本序列中每个词对应的命名实体标签(如人名、地名、组织名等)

  4. 微调模型:使用预训练模型,将其权重微调到NER任务上。

  5. 评估和使用:一旦模型经过微调,可以在验证集上评估其性能。当性能满足要求,就可以将该模型部署到实际应用中,用于识别文本中的命名实体。

在这个例子中,Task-specific Fine-tuning 是将通用预训练模型(BERT)微调为特定任务(NER)的过程。通过提供任务特定的数据集和相应的标签,可以使模型学会在文本中识别命名实体。

3.3.2Instruction Tuning(指令微调)
Instruction tuning是fine-tuning 的一种方式,通过提供特定领域的指令和数据来调整模型,以适应该领域的文本和任务要求。依旧是通过一个实际的例子来解释Instruction Tuning(指令微调):

假设一家律师事务所需要频繁地生成各种法律文件,包括合同、法律建议和法庭文件。想要利用AI来自动化这个过程,以节省时间和提高效率。

  1. 选择预训练模型:首先,选择一个在大量法律类型数据上进行了预训练的语言模型。

  2. 准备数据:为了生成法律文件,准备一个任务特定的数据集,其中包括了符合事务所特征的常用法律术语、法规和法律文件的示例。这个数据集将被用于Instruction Tuning。

  3. 定义任务:生成特定类型的法律文件。例如,你可能提供以下指令:“生成一份租赁合同,包括租金、租赁期限和各方信息。”

  4. Instruction Tuning:现在,将选择的预训练模型进行Instruction Tuning。在这个过程中,将使用准备好的任务特定数据集和任务指令来微调模型。模型会学会理解指令,并生成符合法律要求的合同文本。

  5. 生成法律文件:当模型经过Instruction Tuning,就可以将指定的任务指令提供给模型,它会生成相应的法律文件。例如,它可以生成一份租赁合同,其中包含了正确的租金、租赁期限和各方信息,并且完全符合法律要求。

在这个例子中,Instruction Tuning将通用的预训练语言模型调整为法律领域的专用生成器,它能够根据指令生成特定类型的法律文件。

指令微调对于预训练模型的效果提升作用不容忽视,主要有两个方面的影响:从性能上看,此种微调方式挖掘了大预言模型的能力,在多个语言模型上研究后发现,各种规模的都回在指令微调中受益。第二个方面则是使得任务泛化性能力大大增强,进行了指令微调的大模型,对于未曾见过的任务也能实现卓越的性能表现。

3.3.3 Domain Adaptation(领域适应)
Domain Adaptation(领域适应)是一种将模型从一个领域适应到另一个领域的方法。与Instruction Tuning类似,它可以利用所涉及领域的特定数据来微调模型,以提高在特定领域任务中的性能。

假设有一个源领域的模型应用场景为:针对某社交媒体类软件上的评论进行情感分析,该模型在通用社交媒体评论数据上进行了Fine-tuning,以执行情感分析任务。

现在,如果想将这个情感分析模型用于某一特定行业,比如医疗行业。那么在医疗领域的评论,就及有可能包含特定的医学术语,与源领域中通用社交媒体评论有所不同。可以理解为这是一个目标领域。

为了使通用情感分析模型更加适应于医疗保健领域,则可以执行以下步骤:

Fine-tuning(微调):首先,已经在通用社交媒体评论数据上对模型进行了Fine-tuning,以执行情感分析任务,这里不再赘述。

Domain Adaptation(领域适应):将模型从源领域(社交媒体评论)适应到目标领域(医疗保健评论)。在这个过程中,会使用医疗保健领域的评论数据,同时结合源领域的数据,以微调模型的参数。这个微调过程涉及到将模型适应医疗保健领域的特定情感分析任务。

通过Domain Adaptation,情感分析模型现在可以更好地理解医疗保健评论中的医学术语和情感内容,并执行情感分析任务。模型的性能在医疗保健领域得到了提高,同时仍然能够在通用社交媒体评论上执行情感分析。

3.3.4Layer-wise Fine-tuning(逐层微调)
Layer-wise Fine-tuning 是一种微调方法,通过这种方法,我们可以对模型进行精细的调整,而不必调整整个模型。这种方法通常用于控制模型的复杂性,使其更适应特定任务。

假设现在需要处理图像分类任务,有一个预训练模型,这个模型有多个卷积层和全连接层。在微调时,通常只对最后一个卷积层进行微调,而不是整个网络,这就是Layer-wise Fine-tuning。

为什么要这样做呢?因为往往都是在最后一个卷积层通常包含了一些高级特征,例如物体的形状和色彩等信息,这些特征对于特定的图像分类任务可能非常有用。所以,只要通过微调最后一层,就可以在保留模型底层特征提取能力的同时,将模型调整得更适合我们的任务。

这个过程就好像是在用一块精准的刀子对模型进行微调,专注于任务所需的部分,而不是对整个模型进行全面的改动。

3.3.5Multi-Task Learning(多任务学习)
顾名思义,Multi-Task Learning就是在一个模型中同时处理多个相关任务。这种方法有几个好处一是通过共享特征表示,使得模型更好的泛化到新数据和新任务上,二是因为此类微调可以将不同任务的信息结合起来,从而帮助了模型在有限的数据中学习更多的知识。三是降低过拟合(指的是模型在训练数据上表现得很好,但在未见过的新数据上表现不佳的情况),当任务数据较少时,多任务学习可以通过共享知识来减轻过拟合问题。

假设我们正在开发一个AI助理,它需要具备多种文本能力,比如要能够进行文本分类,文本理解或者是命名实体识别。在传统方法中,我们可能需要为每个任务训练一个单独的模型。但是,使用Multi-Task Learning,我们可以在同一个模型中同时训练多个任务。

在这个模型中,底层的特征提取层会从文本中提取共享的信息,例如语法、词义等。然后,每个任务都有自己的输出层,用于执行文本分类或命名实体识别。这使得模型能够更好地理解文本中的多个信息,并在多个任务之间共享知识。

这就好像是在一个聪明的团队中,每个成员都有自己的专长,但他们共享知识,以提高整个团队的效率。

通过这种方式,Multi-Task Learning 允许我们在单个模型中同时解决多个相关任务,从而提高了模型的性能和通用性。

3.3.6Prompt Engineering(提示设计)
Prompt engineering通常是在微调(Fine-tuning)的上下文中使用的一种技术,通过设计或选择任务相关的提示来引导预训练语言模型(如GPT-3、BERT)执行特定的任务或生成特定类型的文本。这个技术的目的是通过巧妙构prompt提示语,来影响模型的行为,使其在特定任务上表现出色。

假设我们有一个预训练语 言模型,希望使用它来执行情感分析任务,即确定一段文本的情感是积极的、消极的还是中性的。我们可以使用Prompt Engineering来设计提示,以引导模型执行这个任务。

提示示例:请分析以下文本的情感:[文本]

在这个提示中,"[文本]"是一个占位符,我们将实际的文本插入其中。模型接收到这个提示后,会根据提示的要求生成相应的情感分析结果。例如,如果我们将一段文本:“这部电影太精彩了!” 插入占位符,模型可能会生成结果:“积极情感”。

Prompt Engineering帮助我们引导模型执行情感分析任务,这种方法非常灵活,可以根据不同的情境和任务需求设计不同的提示。

可能读到这,你有一点点迷惑,Fine-tuning、Task-specific Fine-tuning 、instruction Tuning…这些概念有重叠的区域,但又好像是父子级的关系,其实我们无须将谁归为谁的父级/子集,其实这些方法在微调和适应性领域中有一些交叉点,但它们的关注点和应用场景略有不同。Fine-tuning是一个通用概念,而其他方法是Fine-tuning的变体或扩展,以适应不同的需求,选择适当的方法取决于任务和数据的特性。比如Instruction Tuning是Fine-tuning的一种方式,用于生成任务,依赖于任务指令;而Multi-Task Learning是Fine-tuning的一种策略,本文介绍他们,主要是让大家更好的理解在微调过程中的常用手段。

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL多数据源是指在一个应用程序中同时使用多个不同的MySQL数据库来存储和管理数据的技术。它可以帮助开发人员更灵活地处理各种数据库操作,提高程序的性能和可扩展性。下面是一个完整的MySQL多数据源教程。 一、设置数据库连接信息 1. 在应用程序的配置件中,创建多个数据库连接的配置项。例如,可以为每个数据源创建一个配置项,分别命名为db1、db2等。 2. 在配置项中,设置每个数据源的连接信息,包括数据库地址、用户名、密码等。 二、创建数据源管理器 1. 创建一个数据源管理器类,用于管理多个数据源。该类需要实现数据源的动态切换和获取。 2. 使用Java的线程安全的数据结构,如ConcurrentHashMap来存储数据源信息。将配置件中的数据库连接信息加载到数据结构中。 3. 实现方法来切换不同的数据源,通过传入数据源的名称来切换到对应的数据库。 三、实现数据源切换 1. 在应用程序中,根据业务需求选择需要使用的数据源。可以通过调用数据源管理器的方法来切换数据源。 2. 在DAO层的代码中,根据当前使用的数据源名称,选择对应的数据源进行数据库操作。 四、使用多数据源进行数据库操作 1. 在DAO层的代码中,区分不同的数据源,并将数据库操作的代码包装在对应的数据源中。 2. 在业务层的代码中,调用DAO层的方法来进行数据库操作。不同的数据源会自动切换。 五、处理事务 1. 如果需要在一个事务中操作多个数据源,可以使用分布式事务的方式来处理。 2. 可以使用开源的分布式事务框架,如Atomikos、Bitronix等来实现多数据源的事务管理。 六、监控和维护 1. 使用监控工具来监控多个数据源的使用情况,包括连接数、查询次数等。 2. 定期对数据库进行维护,包括索引优化、数据清理等工作,以保证数据库的性能和稳定性。 通过以上步骤,我们可以实现MySQL多数据源的配置和使用。使用多数据源可以更好地管理和处理不同的数据库操作,在提高程序性能和可扩展性的同时,也提供了更灵活的数据操作方式。同时,需要注意合理选择和配置数据源,以及监控和维护数据库,以保证系统的运行效率和数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值