大模型解惑

学习以下文章:

如何理解大模型中的参数?

大模型可以看作是数据转换问题,即输入\(X\)序列,输出\(Y\)序列,其中\(Y = WX\),这里的W矩阵就可以看作大模型必不可少的参数。

大模型中的“大”也可以指参数非常大(多),多大千亿、万亿等。

什么是transformer?

正如上述举例,大模型可以看作是数据转换问题,Transformer的本质是一种序列到序列(seq2seq)的机器学习模型的架构,即将序列\(X\)转换为\(Y\)的一种机器学习模型架构。例如,将A语言翻译为B语言的过程;ChatGPT中将人提问的文字序列转换为机器回答的文字序列的过程。

Embedding

对信息的向量化表示,可以将自然语言转换为机器可以理解的信息,具体就是把给定的序列转换为矩阵或n维向量,方便机器计算、能保留原有语义、可以表示相似度,能实现多模态转换(图片、本文、视频等格式都可以转为矩阵)。

Embedding,给大模型装上了嘴巴、眼睛和耳朵,可以采集大量数据,转换为向量/矩阵给大模型。

自注意力机制

Self Attention,作用是将序列信息中各个元素之间隐含的内在关联进行显性化表征的一种编码技术。例如要翻译一句话,这里的内在关联是指一句话中词的位置、语义、语法等会影响翻译结果的因素。

例如,翻译:怪兽没有穿过街道,因为它太累了”,对机器来说,这里的“它”,难以理解,是指怪兽,还是街道?如何才能理解呢?通过自注意力机制可以让机器知道“它”和“怪兽”之间Attention(关联性),要比“它”和“街道”的Attention大得多,这样机器就知道“它”表示的是怪兽了。

多头注意力机制

Multi-Head Self Attention,就是多个维度的自注意力机制,每个维度只关注一方面的内在关联,比如上面例子中,词的位置信息、语义信息、语法信息等都是一种维度。

在原论文中,指出多头注意力机制有8个头,即可以从8个方面去考虑,最终将8个头的结果连在一起,进行统一编码即可。

Multi-Head Self Attention, 相当于是“术业有专攻”,让每一个头的Self Attention机制都聚焦于一个特定维度的隐含内在关联,最后再把多个头的结果汇总进行编码,这样得到的结果,比大一统的同时关注多个维度得到的结果,效果要更好。

简单理解Transformer流程?

整体上看,有两部分:Encoder(编码器)和Decoder(解码器)。

逻辑上看,Transformer就是把一个输入序列\(X\),先通过Encoder,转换成中间序列\(Z\);然后再通过Decoder,将\(Z\)转换成输出序列\(Y\)的过程,其中\(Z\)是经过编码后的序列,即把\(X\)中各元素之间银行的内在关联都显性化表征出来的向量化表示(做了多头注意力机制)。

image-20231123171330498

  • 编码器

image-20231123165458785

  • 解码器

image-20231123165748151

Prompt Engineering的方式是一种相对来说容易上手的使用大模型的方式

我理解的prompt,就是给引导模型去思考,包括问题描述,解决办法,输出格式等。例如在prompt中提到要求分步思考,效果会不加这句话要好,还有一些关于prompt的优化技巧:

  • COT(思维链),就是在prompt中加入一些实示例,来引导大模型更好的推理,但这种方法有局限性(参数足够多时,通常是1000亿参数量);
  • seft-consistency(自一致性技术),在COT的基础上,让LLM不止生成唯一结果,而是利用LLM结果的多样性,生成多种不同推理路径的结果集合,从结果集合中投票选择,选出最佳的即为最终答案;
  • least-to-most(从易到难):针对在使用COT时,给出示例是简单问题,而提问的问题确实很难得,这时效果就不如人意了,Ltm核心思想是把复杂问题拆解成一系列的简单问题,通过解决一系列简单问题,来最终得到复杂问题得结果。

还有一些重要参数:

  • 温度(Temperature):介于0-1之间,用于控制模型输出的多样性,当为0时,模型输出最可能的答案;当为1时,模型输出更多样化,但可能不会很精准。例如,温度为 0:可能会输出“苹果是一种水果”,温度为 1:可能会输出“苹果是一种多汁、美味的水果,常用于制作各种美食”。
  • Top-K:一个整数,用于限制模型在生成每个单词时考虑的候选单词的数量。例如,如果 Top_K 设置为 50,模型在生成下一个单词时只会考虑概率最高的前 50 个选项。和温度参数效果很像,当Top-k小时,模型输出会更加一致和精准,当Top-k大时,模型输出可能会更加多样,准确率低。

prompt工程可以看作是通过对话的方式去训练模型,输出你想要的结果(这不也是一种“微调”么?哈哈)。例如以下对话:

  • 第一个问题,确定韩立身份,这是正确的,也是我想要的结果。

image-20231123094721494

image-20231123094738323

  • 第二个问题,通过人工干预,“知识注入”的方式强行“带偏”,这或许就是prompt工程吧。

image-20231123094837137

image-20231123094903896

image-20231123094928709

image-20231123095044788

如何理解和区分Prompt Engineering/Prompt Tuning/Fine Tuning?

(1) 我们输入给大模型的是Prompt,大模型返回给我们的是Completion;

(2) Prompt在输入给大模型之前的优化,是属于Prompt Engineering的范畴;

(3) Prompt在输入给大模型之后,在开始进行Transformer的Encoder处理之前的优化,是属于Prompt Tuning的范畴;

(4) Prompt在进入Transformer之后,在Encoder或者Decoder阶段做的优化,是属于Fine Tuning的范畴。

训练、推理、微调?

  • 训练数据(训练)

    • 预训练(大量数据/参数)

    • 微调(少量数据/参数)

  • 测试数据(推理)

强化学习?

大模型和人类认知对齐(Reinforcement Learning with Human Feedback, RLHF),核心就是反馈 。

大致工作原理是:

(1) 用户提供Prompt给大模型,大模型生成Completion给用户;

(2) 用户对大模型生成的Completion进行评价打分(Rate)

(3) 系统拿着<Prompt, Completion, Rate>这样的数据,再去大模型进行微调

(4) 最终大模型就会越来越倾向于生成人类打分高的内容,因为RLHF的核心就是通过打分来引导机器向打分高的方向进化。

量化?

布署大模型也有一定的挑战,因为大模型确实够大,布署起来的最大的挑战,就是对硬件的要求也非常高。

所以,通常为了在尽量不影响大模型表现的情况,我们通常还会去做一些压缩和优化,让大模型对硬件的要求不要那么高,这样整体的使用成本也会更低一些。

量化(Quantization)是一种在保证模型效果基本不降低的前提下,通过降低参数的精度,来减少模型对于计算资源的需求的方法。

大致原理是:

(1)大模型这样的机器学习模型,参数/数据最终存在在文件中的,就是一堆的数字(矩阵)

(2)如果原来大模型中的参数是用4个字节的数字存储的,那我们可以把它的精度降低一些,用1个字节来存,这样就能很大程度上降低对于内存的需求。

例如下面就是百川2对齐版和对齐量化版:

image-20231123184348638

为何要微调?

prompt 工程效果不好(prompt长度和推理成本呈正相关),通过自由数据,进行微调(Fine Tuning),提升大模型在特定领域的能力,总结一下有两点意义:

  • 可以增强特定领域的专业能力。
  • 相比于训练来说微调成本相对较低。

如何微调?

根据训练数据来源,训练方式看,大模型的微调有以下技术路线:

  • 监督式微调SFT(Supervised Fine Tuning),采用人工标注的数据,用传统机器学习中的监督学习方法,对大模型进行微调。
  • 基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback),把人类的反馈,通过强化学习,引入到对大模型的微调中,使其输出更符合人类期望。
  • 基于AI反馈的强化学习微调RLAIF(Reinforcement Learning with AI Feedback),原理和RLAIF相似,但反馈来源是AI,使其反馈效率提升。

根据参数规模,大致分为两种常用技术路线:

  • 全量微调FFT(Full Fine Tuning),即对全量的参数,进行全量的训练。

原理就是用特定的数据,对大模型进行训练,将\(W\)变成\(W’\),其中\(W’\)\(W\)相比,优点是大模型的推理能力在上述特定数据领域表现会好很多,但也会带来两个问题:

(1)训练成本高,微调的参数和预训练差不多。

(2)灾难性遗忘(Catastrophic Forgetting),即把之前表现好的别的领域的能力变差(遗忘)。

  • 高效参数微调PEFT(Parameter-Efficient Fine Tuning),即只对部分的参数进行训练。PEFT则可以解决FFT的两个问题,也是目前主流的微调方案,例如:

    • Prompt Tuning

    思想是基座模型(Foundation Model)的参数不变下,为每个特定任务,训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率,即Prompt Tuning发生在Embedding环节,往输入序列X前面加特定的Token

    具体来说,就是将\(X = [x1, x2, ..., xm]\)变成,\(X' = [x'1, x'2, ..., x'k; x1, x2, ..., xm], Y = WX'\)

    如果将大模型比做一个函数:\(Y=f(X)\),那么Prompt Tuning就是在保证函数本身不变的前提下,在\(X\)前面加上了一些特定的内容,而这些内容可以影响\(X\)生成期望中\(Y\)的概率。

    • Prefix Tuning

    思想上述很像,即在不改变大模型的前提下,在Prompt上下文中添加适当的条件,可以引导大模型有更加出色的表现。

    Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀,具体来说,就是将\(Y=WX\)中的\(W\),变成\(W' = [Wp; W],Y=W'X\)

    • LoRA

    大模型参数很多,但并不是所有的参数都是发挥同样作用的,其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是低维的本质模型。LoRA的基本思路,包括以下几步:

    (1)首先,要适配特定的下游任务,要训练一个特定的模型,将\(Y=WX\)变成\(Y=(W+∆W)X\),这里面\(∆W\)主是我们要微调得到的结果;

    (2)其次,将\(∆W\)进行低维分解$∆W=AB \(,其中\)∆W\(为\)m * n\(维,\)A\(为\)m * r\(维,\)B\(为\)r * n\(维,\)r$就是上述假设中的低维);

    (3)接下来,用特定的训练数据,训练出\(A\)\(B\)即可得到\(∆W\),在推理的过程中直接将\(∆W\)加到\(W\)上去,再没有额外的成本。

    • QLoRA

    量化的核心目标是降成本,降训练成本,特别是降后期的推理成本。QLoRA就是量化版的LoRA,它是在LoRA的基础上,进行了进一步的量化,将原本用16bit表示的参数,降为用4bit来表示,可以在保证模型效果的同时,极大地降低成本。例如,对于65B的LLaMA 的微调要780GB的GPU内存,而用了QLoRA之后,只需要48GB。

微调就是调整参数,进而找到最佳性能,主要参数有:

  • 学习率(LR):参数更新的幅度大小,一般设置的比较小。

  • 训练轮数:模型训练的总轮数,全量数据训练一次为一轮。

  • 批处理大小(batch size):单次输入模型的数据量,会受显存大小限制。

  • 断点名称:保存训练模型的文件夹名称。

手动微调参考:

posted @ 2023-11-23 18:46  PamShao  阅读(1431)  评论(0编辑  收藏  举报