赞
踩
LLM其实就是large language model,大语言模型。AGI其实就是Artificial General Intelligence。NLP大致可以分为两大任务:NLP理解类任务 和 NLP生成类任务。这两类任务的差异主要体现在输入输出形式上。
NLP各种任务其实收敛到了两个不同的预训练模型框架里:
总结:GPT系列模型架构相同,主要差异点在于数据的size和quality:
GPT3从45TB数据里面只用了570GB,约1.2%,由此可见数据预处理过滤之厉害程度![手动狗头]
基于Transformer的预训练模型参数量对比如下:
(1)预训练阶段: 使用超大规模文本对模型进行训练,训练任务为“预测下一个token”,训练的数据量往往需要几万亿token。
(2)指令微调:使用指令数据,让模型的输出格式与人类对齐,使其具备chat的能力。从5.4w人工标注的指令集中抽取1.3w,在GPT-3大模型上微调。也就是说从测试用户提交的 prompt 中随机抽取一批,靠专业的标注人员,给出指定 prompt 的高质量答案,然后用这些人工标注好的 < prompt,answer > 数据来 Fine-tune GPT 3.5 模型,从而让 GPT 3.5 初步具备理解指令中蕴含的意图的能力;
(3)奖励函数:基于新模型生成一批数据集<prompt,response>,重组成3.3w排序对形式,人工标注后,用于训练奖励模型。奖励模型结构同基座LLM,论文里全部用6B级别,规模大了反而不好。也就是说,随机抽样一批用户提交的 prompt,然后使用第一阶段 Fine-tune 好的冷启动模型为每个 prompt 生成 K 个不同的回答,再让标注人员对 K 个结果进行排序,以此作为训练数据,通过 pair-wise learning to rank 模式来训练reward model;
(4)强化学习:使用人类反馈或者偏好数据来训练模型,使模型的输出更加符合人类的价值观或者预期行为。利用上一阶段学好的 RM 模型,靠 RM 打分结果来更新预训练模型参数。RLHF的具体实现,RM奖励模型作为critic(评论家),SFT阶段的大模型作为actor(行动家),二者相互配合,actor学习指令集,critic评估打分,再更新权重,进入下一轮。论文里对比两种损失函数,后采用混合预训练损失PPT_ptx,兼顾预训练的效果。
The Practical Guides for Large Language Models按照模型结构整理了大模型的进化树。现有 LLMs 的主流架构大致可以分为三大类,即Encoder-Decoder、Causal Decoder、Prefix Decoder:
Encoder-Only结构:BERT系列
Decoder-Only结构:GPT系列,成员最多
Encoder-Decoder结构:BART、T5
测试集名称 | 排行榜 | 语言 | 备注 |
---|---|---|---|
MMLU(Massive Multitask Language Understanding) | 排行榜 | 英文 | 这是最值得注意的测试集,它考虑了 57 个学科,从人文到社科到理工多个大类的综合知识能力。DeepMind 的 Gopher 和 Chinchilla 这两个模型甚至只看 MMLU 的分数。 |
C-Eval(A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models) | 排行榜 | 中文 | 覆盖人文,社科,理工,其他专业四个大方向,52 个学科(微积分,线代 …),从中学到大学研究生以及职业考试,一共 13948 道题目的中文知识和推理型测试集,管它叫 C-Eval,来帮助中文社区研发大模型。是上海交大和清华联合研发的中文大语言模型测试集。 |
GSM8k(Grade School Math 8K) | 排行榜 | 数学 | 是由 OpenAI 发布的一个由 8.5K 高质量的语言多样化的小学数学应用题组成的数据集,要求根据给定的场景和两个可能的解决方案,选择最合理的方案。 |
BBH(BIG-Bench Hard) | 英文 | BBH是一个挑战性任务 Big-Bench 的子集。Big-Bench 目前包括 204 项任务。任务主题涉及语言学、儿童发展、数学、常识推理、生物学、物理学、社会偏见、软件开发等方面。BBH 是从 204 项 Big-Bench 评测基准任务中大模型表现不好的任务单独拿出来形成的评测基准。 |
国外排行榜:opencompass
国内排行榜:datalearner
从下面不同的LLMs 预训练数据源分布,可以看出:垂直领域的模型之所以有价值,是因为有了垂直领域的数据:
当前,绝大多数大语言模型都采用了类似GPT 的架构,使用基于Transformer 架构构建的仅由解码器组成的网络结构,采用自回归的方式构建语言模型,但是在层归一化位置、归一化函数、激活函数、位置编码等细节上各有不同。LLaMA的模型结构如下:
(1)强化学习相较于有监督学习更有可能考虑整体影响
有监督学习针对单个词元进行反馈,其目标是要求模型针对给定的输入给出确切的答案。而强化学习是针对整个输出文本进行反馈,并不针对特定的词元。
反馈粒度的不同,使强化学习更适合大语言模型,既可以兼顾表达多样性,又可以增强对微小变化的敏感性。自然语言十分灵活,可以用多种不同的方式表达相同的语义。而有监督学习很难支持上述学习方式。强化学习则可以允许模型给出不同的多样性表达。
另外,有监督微调通常采用交叉熵损失作为损失函数,由于总和规则,造成这种损失对个别词元变化不敏感。如果改变个别的词元,只会对整体损失产生小的影响。但是,一个否定词可以完全改变文本的整体含义。强化学习则可以通过奖励函数同时兼顾多样性和微小变化敏感性两个方面。
(2)强化学习更容易解决幻觉问题
用户在大语言模型上主要有三类输入:(a)文本型(Text-Grounded),用户输入相关文本和问题,让模型基于所提供的文本生成答案(例如,“本文中提到的人名和地名有哪些”);(b)求知型(Knowledge-Seeking),用户仅提出问题,模型根据内在知识提供真实回答(例如,“流感的常见原因是什么”);(c)创造型(Creative),用户提供问题或说明,让模型进行创造性输出(例如,“写一个关于……的故事”)。有监督学习算法非常容易使得求知型查询产生幻觉。在模型并不包含或者知道答案的情况下,有监督训练仍然会促使模型给出答案。而使用强化学习方法,则可以通过定制奖励函数,将正确答案赋予非常高的分数,将放弃回答的答案赋予中低分数,将不正确的答案赋予非常高的负分,使得模型学会依赖内部知识选择放弃回答,从而在一定程度上缓解模型的幻觉问题。
(3)强化学习可以更好地解决多轮对话奖励累积问题
多轮对话能力是大语言模型重要的基础能力之一。多轮对话是否达成最终目标,需要考虑多次交互过程的整体情况,因此很难使用有监督学习的方法构建。而使用强化学习方法,可以通过构建奖励函数,根据整个对话的背景及连贯性对当前模型输出的优劣进行判断。
比如 “中国的首都是北京”这条知识,以三元组表达就是<北京,is-capital-of,中国>,其中“is-capital-of”代表实体间关系。这条知识它存储在LLM的哪里呢?
《Transformer Feed-Forward Layers Are Key-Value Memories》给出了一个比较新颖的观察视角,它把Transformer的FFN看成存储大量具体知识的Key-Value存储器。FFN的第一层是个MLP宽隐层,这是Key层;第二层是MLP窄隐层,是Value层。FFN的输入层其实是某个单词对应的MHA的输出结果Embedding,也就是通过Self Attention,将整个句子有关的输入上下文集成到一起的Embedding,代表了整个输入句子的整体信息。
我们假设上图的节点 就是记载<北京,is-capital-of,中国>这条知识的Key-Value存储器,它的Key向量,用于检测”中国的首都是…”这个知识模式,它的Value向量,基本存储了与单词“北京”的Embedding比较接近的向量。当Transformer的输入是“中国的首都是[Mask]”的时候, 节点从输入层探测到这个知识模式,所以产生较大的响应输出。我们假设Key层其它神经元对这个输入都没有任何响应,那么对应的Value层的节点,其实只会接收到“北京”这个Value对应的单词embedding,并通过 的大响应值,进行了进一步的数值放大。于是,Mask位置对应的输出,就自然会输出“北京”这个单词。
既然我们已知具体的某条世界知识存储在某个或者某些FFN节点的参数里,自然会引发另外一个问题:我们能否修正LLM模型里存储的错误或者过时的知识呢?比如对于问题:“英国的现任首相是谁?”鉴于近年来英国首相频繁更迭,你猜LLM更倾向输出“鲍里斯”还是更青睐“苏纳克”?很明显训练数据中包含“鲍里斯”的数据会更多,这种情况很大可能LLM会给出错误回答,于是我们就有修正LLM里存储的过时知识的必要性。
目前有三类不同方法来修正LLM里蕴含的知识:
首先,为什么会产生幻觉?这主要原因是用于训练语言模型的大数据语料库在收集时难免会包含一些错误的信息,这些错误知识都会被学习,存储在模型参数中,相关研究表明模型生成文本时会优先考虑自身参数化的知识,所以更倾向生成幻觉内容。
因此有以下几个可能的手段来减少幻觉:
研究证明:当我们独立增加训练数据量、模型参数规模或者延长模型训练时间(比如从1个Epoch到2个Epoch),预训练模型在测试集上的Loss都会单调降低,也就是说模型效果越来越好。
既然三个因素都重要,那么我们在实际做预训练的时候,就有一个算力如何分配的决策问题:假设用于训练LLM的算力总预算(比如多少GPU小时或者GPU天)给定,那么是应该多增加数据量、减少模型参数呢?还是说数据量和模型规模同时增加,减少训练步数呢?此消彼长,某个要素规模增长,就要降低其它因素的规模,以维持总算力不变,所以这里有各种可能的算力分配方案。最终OpenAI选择了同时增加训练数据量和模型参数,但是采用早停策略(early stopping)来减少训练步数的方案。因为它证明了:对于训练数据量和模型参数这两个要素,如果只单独增加其中某一个,这不是最好的选择,最好能按照一定比例同时增加两者,它的结论是优先增加模型参数,然后才是训练数据量。假设用于训练LLM的算力总预算增加了10倍,那么应该增加5.5倍的模型参数量,1.8倍的训练数据量,此时模型效果最佳。
思维链(few-shot CoT,Chain of Thought)Prompting,这个方向目前是LLM推理研究的主方向。
CoT的主体思想其实很直白;为了教会LLM模型学会推理,给出一些人工写好的推理示例,示例里把得到最终答案前,一步步的具体推理步骤说清楚,而这些人工写的详细推理过程,就是思维链Prompting,具体例子可参照上图中蓝色文字部分。CoT的意思是让LLM模型明白一个道理;就是在推理过程中,步子不要迈得太大,否则很容易出错,改变思维模式,化大问题为小问题,步步为营,积小胜为大胜。最早明确提出CoT这个概念的文章是“Chain of thought prompting elicits reasoning in large language models”,论文发布于22年1月份,虽然做法很简单,但是应用CoT后LLM模型的推理能力得到了巨大提升,GSM8K数学推理测试集准确率提高到60.1%左右。
目标不一样。传统语言模型主要是预测一句话中下一个词是什么。而instructGPT的目标是:Follow the user’s instructions helpfully, honestly, and harmlessly.。
以“Self Consistency”方法为例,在大多数据集合上的性能提升,都直接超过了20到50个百分点,这是很恐怖的性能提升,而其实在具体推理模型层面,我们什么也没做,仅仅是预训练的时候除了文本,额外加入了程序代码而已。
越大的LLM模型学习效率越高,也就是说相同训练数据量,模型越大任务效果越好,说明面对的即使是同样的一批训练数据,更大的LLM模型相对规模小一些的模型,从中学到了更多的知识。
当模型参数规模未能达到某个阀值时,模型基本不具备解决此类任务的任何能力,体现为其性能和随机选择答案效果相当,但是当模型规模跨过阀值,LLM模型对此类任务的效果就出现突然的性能增长。也就是说,模型规模是解锁(unlock)LLM新能力的关键,随着模型规模越来越大,会逐渐解锁LLM越来越多的新能力。思维链(Chain of Thought)Prompting是典型的增强LLM推理能力的技术,能大幅提升此类任务的效果。
问题是,为何LLM会出现这种“涌现能力”现象呢?上述文章以及《Emergent Abilities of Large Language Models》给出了几个可能的解释:
一种可能解释是有些任务的评价指标不够平滑。比如说有些生成任务的判断标准,它要求模型输出的字符串,要和标准答案完全匹配才算对,否则就是0分。所以,即使随着模型增大,其效果在逐步变好,体现为输出了更多的正确字符片段,但是因为没有完全对,只要有任何小错误都给0分,只有当模型足够大,输出片段全部正确才能得分。也就是说,因为指标不够平滑,所以不能体现LLM其实正在逐步改善任务效果这一现实,看起来就是“涌现能力”这种外在表现。
另外一种可能的解释是:有些任务由若干中间步骤构成,随着模型规模增大,解决每个步骤的能力也在逐步增强,但是只要有一个中间步骤是错的,最终答案就是错的,于是也会导致这种表面的“涌现能力”现象。
如果你细想,会发现In Context Learning是个很神奇的技术。它神奇在哪里呢?神奇在你提供给LLM几个样本示例 <x1,y1>,<x2,y2>,…,<xn,yn>,然后给它xm,LLM竟然能够成功预测对应的ym。听到这你会反问:这有什么神奇的呢?Fine-tuning不就是这样工作的吗?你要这么问的话,说明你对这个问题想得还不够深入。
Fine-tuning和In Context Learning表面看似都提供了一些例子给LLM,但两者有质的不同(参考上图示意):Fine-tuning拿这些例子当作训练数据,利用反向传播去修正LLM的模型参数,而修正模型参数这个动作,确实体现了LLM从这些例子学习的过程。但是,In Context Learning只是拿出例子让LLM看了一眼,并没有根据例子,用反向传播去修正LLM模型参数的动作,就要求它去预测新例子。既然没有修正模型参数,这意味着貌似LLM并未经历一个学习过程,如果没有经历学习过程,那它为何能够做到仅看一眼,就能预测对新例子呢?这正是In Context Learning的神奇之处。
能够有效增加LLM模型Instruct泛化能力的因素包括:增加多任务的任务数量、增加LLM模型大小、提供CoT Prompting, 以及增加任务的多样性。如果采取任意一项措施,都可以增加LLM模型的Instruct理解能力。
当模型规模足够大的时候,LLM本身是具备推理能力的,在简单推理问题上,LLM已经达到了很好的能力,但是复杂推理问题上,还需要更多深入的研究。
如果梳理现有LLM推理相关工作的话,我把它们归到两大类,体现出挖掘或促进LLM推理能力不同的技术思路:第一类研究比较多,可以统称为基于Prompt的方法,核心思想是通过合适的提示语或提示样本,更好地激发出LLM本身就具备的推理能力,Google在这个方向做了大量很有成效的工作。第二类做法是在预训练过程中引入程序代码,和文本一起参与预训练,以此进一步增强LLM的推理能力,这应该是OpenAI实践出的思路。比如ChatGPT肯定具备很强的推理能力,但它并不要求用户必须提供一些推理示例,所以ChatGPT强大的推理能力,大概率来源于使用代码参与GPT 3.5的预训练。
这两种思路其实大方向是迥异的:利用代码增强LLM推理能力,这体现出一种通过增加多样性的训练数据,来直接增强LLM推理能力的思路;而基于Prompt的方法,它并不会促进LLM本身的推理能力,只是让LLM在解决问题过程中更好地展示出这种能力的技术方法。
当模型参数超过 50B时,往往会产生质变,出现一种涌现能力
为何LLM会出现这种“涌现能力”现象呢?《Emergent Abilities of Large Language Models》给出了几个可能的解释:
全局内存和本地内存使用的高带宽显存(High Bandwidth Memory,HBM)位于板卡RAM存储芯片上,该部分内存容量很大。全局内存是所有线程都可以访问,而本地内存则只能当前线程访问。NVIDIA H100中全局内存有80GB空间,其访问速度虽然可以达到3.35TB/s,但是如果全部线程同时访问全局内存时,其平均带宽仍然很低。
共享内存和寄存器位于GPU芯片上,因此容量很小,并且共享内存只有在同一个GPU线程块(Thread Block)内的线程才可以共享访问,而寄存器仅限于同一个线程内部才能访问。NVIDIA H100中每个GPU线程块在流式多处理器(Stream Multi-processor,SM)可以使用的共享存储容量仅有228KB,但是其速度非常快,远高于全局内存的访问速度。
根据自注意力机制的原理,在GPU中进行计算时,传统的方法还需要引入两个中间矩阵 S 和 P 并存储到全局内存中。具体计算过程如下:
按照上述计算过程,需要首先从全局内存中读取矩阵 Q 和 K,并将计算好的矩阵 S 再写入全局内存,之后再从全局内存中获取矩阵 S ,计算Softmax得到矩阵 P 再写入全局内存,之后读取矩阵 P 和矩阵 V,计算得到矩阵 O。
这样的过程会极大占用显存的带宽。在自注意力机制中,计算速度比内存速度快得多,因此计算效率越来越多地受到全局内存访问的瓶颈。
FlashAttention就是通过利用GPU硬件中的特殊设计,针对全局内存和共享存储的I/O速度的不同,尽可能地避免HBM中读取或写入注意力矩阵。
FlashAttention目标是尽可能高效地使用SRAM来加快计算速度,避免从全局内存中读取和写入注意力矩阵。达成该目标需要能做到在不访问整个输入的情况下计算Softmax函数,并且后向传播中不能存储中间注意力矩阵。
FlashAttention 就提出了不使用中间注意力矩阵,通过存储归一化因子来减少全局内存消耗的方法。
FlashAttention 算法并没有将S、P 整体写入全局内存,而是通过分块写入,存储前向传递的Softmax 归一化因子,在后向传播中快速重新计算片上注意力,这比从全局内存中读取中间注意力矩阵的标准方法更快。
虽然大幅减少了全局内存的访问量,重新计算也导致FLOP 增加,但其运行的速度更快且使用的内存更少。
字节对编码(Byte Pair Encoding,BPE)模型采用的词表包含最常见的单词及高频出现的子词。在使用时,常见词通常本身位于BPE 词表中,而罕见词通常能被分解为若干个包含在BPE 词表中的词元,从而大幅降低未登录词的比例。BPE算法包括两个部分:
(1)词元词表的确定。
(2)全词切分为词元以及词元合并为全词的方法。
在词元词表确定之后,对输入词序列中未在词表中的全词进行切分,BPE 方法对词表中的词元按从长到短的顺序进行遍历,用每一个词元和当前序列中的全词或未完全切分为词元的部分进行匹配,将其切分为该词元和剩余部分的序列。
例如,对于单词“lowest”
首先通过匹配词元“est”将其切分为“low”“est”的序列
再通过匹配词元“low”
确定其最终切分结果为“low”“est”的序列。
通过这样的过程,使用BPE 尽量将词序列中的词切分成已知的词元。
在遍历词元词表后,对于切分得到的词元序列,为每个词元查询词元表示,构成词元表示序列。若出现未登录词元,即未出现在BPE 词表中的词元,则采取和未登录词类似的方式,为其赋予相同的表示,最终获得输入的词元表示序列。
字节级(Byte-level)BPE 通过将字节视为合并的基本符号,改善多语言语料库(例如包含非ASCII 字符的文本)的分词质量。GPT-2、BART、LLaMA 等大语言模型都采用了这种分词方法。原始LLaMA 的词表大小是32K,并且主要根据英文进行训练,因此,很多汉字都没有直接出现在词表中,需要字节来支持所有的中文字符,由2 个或者3 个Byte Token 才能拼成一个完整的汉字。
对于使用了BPE 的大语言模型,其输出序列也是词元序列。对于原始输出,根据终结符的位置确定每个单词的范围,合并范围内的词元,将输出重新组合为词序列,作为最终的结果。
参考官方文档:OpenAI教你如何写prompt
Step-back 这种promp技术起源于人类在面对具有挑战性的任务时,往往会退一步进行抽象,从而得出高层次的概念和原则来指导推理过程,受此启发,研究人员才提出了后退的prompt技术,将推理建立在抽象概念的基础上,从而降低在中间推理步骤中出错的几率。
例子:
你是一个擅长中文和英文的AI 工程师和数据科学家,擅长中文和英文相关的 AI 技术文章编写和翻译。
请将下面的英文翻译成中文,要求语言生动活泼,简洁优雅。
需要翻译的英文段落:
Spending lots of time thinking about different possible future scenarios and their probabilities might be captivating, but I suggest an absolutely different approach — to try to build your prototype yourself. First, it’s rather challenging and fun. Second, it will help us to look at our work in a more structured way. Third, it will give us an opportunity to try in practice one of the most cutting-edge approaches — LLM agents.
请按照一下步骤输出结果:
1. 要想得到通顺优雅简洁的翻译文章,你需要知道哪些前提问题
2. 这些前提问题的答案分别是什么
3. 基于这个前提问题,对于给出英文的翻译结果
尽管目前已经开源了很多的预训练数据,但在训练大规模预训练语言模 型时,预训练数据依然是瓶颈,原因如下:(1)开源的预训练数据或多或少存 在噪音问题,特别是爬虫数据噪音问题严重,如何对预训练数据进行高质量地清洗和去重,是目前数据处理的核心与壁垒;(2)OpenAI 和 Google 使用 的高质量预训练数据集是闭源,无法获得,例如 Google 公司训练 Chinchilla 中使用的 2.1TB 的书籍数据库、3.1TB 的 Github 数据,OpenAI 公司训练 GPT 3 中使用的 WebText23、Books1、Books2 数据集。
自动爬取或收集的原始数据往往存在信息量低和含有噪声的问题,例如版本信息中只有“update”,缺少实质内容;回答中的代码片段可能与问题 无关等。因此,在使用数据之前,必须基于一定规则仔细进行筛选。
预处理流程pipline:
为了支持分布式训练,DeepSpeed 和 Megatron-LM 等优化框架被用来促进并行算法的实现和部署。
ChatGLM3-6B占用显存大约13G
ChatGLM3-6B-32k占用显存大约29G
https://zhuanlan.zhihu.com/p/638827267
https://github.com/Duxiaoman-DI/XuanYuan/tree/main/FinanceIQ
数据集 | 语言类别 | 解释 | 标签类别 |
---|---|---|---|
Financial_Phrasebank (FPB) | 英文 | 该数据集包含 4840 个英语财经新闻句子,按情绪分类。 | 包含3个分类标签:negative、positive、neutral |
FiQA SA | 英文 | 该数据集来自头条新闻和财经新闻的 17,000 个句子组成。 | 包含3个分类标签:negative、positive、neutral |
Twitter Financial News Sentiment (TFNS) | 英文 | 该数据集包含带注释的金融相关推文语料库。 共11,932 个文档 | 包含3个分类标签:bearish(看跌,也即negative)、bullish(看涨,也即positive)、Neutral |
News With GPT instructions (NWGI) | 英文 | 该数据集是一个由 ChatGPT 生成标签的数据集。 训练集有 16.2k 个样本,测试集有 4.05k 个样本。 | 包含7个分类标签:strong negative、moderately negative、mildly negative、neutral、mildly positive、moderately positive、strong positive |
答案是安装flash-attention
git clone --branch v2.4.1 https://github.com/Dao-AILab/flash-attention
# 安装flash-attention
cd flash-attention
MAX_JOBS=4 python setup.py install
# 安装rotary
cd csrc/rotary
MAX_JOBS=4 python setup.py install
cd -
# 安装layer_norm
cd csrc/layer_norm
MAX_JOBS=4 python setup.py install
cd -
至此安装完成,加载模型,不会报flash-attention的警告,加载速度也有显著的提升。
LoRA(Low-Rank Adaptation)和QLoRA(Quantized Low-Rank Adaptation)确实是两种不同的微调技术,它们都用于调整大型语言模型,如GPT。下面是它们之间的一些主要区别:
1.LoRA:
– LoRA通过对模型的权重矩阵进行低秩逼近来实现微调。
– 它只修改原始模型的一小部分参数,这意味着更新的参数数量相对较少。
– LoRA的关键在于通过使用较小的、可训练的矩阵来近似原始的权重矩阵,而不是直接修改原始权重。
2.QLoRA:
– QLoRA是LoRA的一个变种,它引入了量化技术。
– 量化技术意味着QLoRA在执行低秩逼近时,会进一步减少所需的存储和计算资源。
– QLoRA通过对LoRA中使用的矩阵进行量化,可以更有效地处理权重和梯度,进而减少模型的整体大小和运行时资源需求。
总的来说,QLoRA在LoRA的基础上通过量化技术,进一步减少了模型微调过程中所需的资源和存储空间。这使得QLoRA在资源受限的情况下尤其有用,例如在移动设备或嵌入式系统中部署大型模型。然而,这种额外的优化可能会带来一定程度的性能折衷,具体取决于量化的程度和实现方式。
https://github.com/CrazyBoyM/llama3-Chinese-chat
GaLore通过将梯度投影到低秩空间,显著降低了优化器状态占用的内存,从而降低了整体的内存占用。
AI分四个阶段来总结:比如这样一段121567词的《傲慢与偏见》原文:
先把原文总结成276个摘要(24796词),然后进一步压缩成25个摘要(3272词),再到4个摘要(475词)。
最终得到一段175词的摘要,长度只有原片段的千分之一:
推荐国外已经很火的chatpdf网站https://www.chatpdf.com/
chain 的 chain_type 参数
这个参数主要控制了将 document 传递给 llm 模型的方式,一共有 4 种方式:
stuff: 这种最简单粗暴,会把所有的 document 一次全部传给 llm 模型进行总结。如果document很多的话,势必会报超出最大 token 限制的错,所以总结文本的时候一般不会选中这个。
map_reduce: 这个方式会先将每个 document 进行总结,最后将所有 document 总结出的结果再进行一次总结。
refine: 这种方式会先总结第一个 document,然后在将第一个 document 总结出的内容和第二个 document 一起发给 llm 模型在进行总结,以此类推。这种方式的好处就是在总结后一个 document 的时候,会带着前一个的 document 进行总结,给需要总结的 document 添加了上下文,增加了总结内容的连贯性。
map_rerank: 这种一般不会用在总结的 chain 上,而是会用在问答的 chain 上,他其实是一种搜索答案的匹配方式。首先你要给出一个问题,他会根据问题给每个 document 计算一个这个 document 能回答这个问题的概率分数,然后找到分数最高的那个 document ,在通过把这个 document 转化为问题的 prompt 的一部分(问题+document)发送给 llm 模型,最后 llm 模型返回具体答案。
https://github.com/lucidrains/PaLM-rlhf-pytorch
https://github.com/AI4Finance-Foundation/FinGPT 金融领域的GPT模型(优势:应用了RLHF)
https://github.com/lm-sys/FastChat
Vicuna 在总分上达到了 ChatGPT 的 92%
下面是LLaMA、Alpaca、Vicuna几个模型的差别
ChatGPT的核心模块包括SFT、RM、RLHF三个,当前的很多工作主要集中在复现SFT模块,只有ColossalChat 目前复现了SFT+RM+RLHF整个流程
1.1. 算法工作
项目 | 模块 | 备注 |
---|---|---|
LLaMA | 基础 | 提供了一个pre-train的backbone |
Alpaca | SFT模块 | 基于self-instruct技术,做了指令微调 instruction fine-tune |
Alpaca-Lora | SFT模块 | 利用LoRa技术,大大减少了需要微调的参数量 |
Vicuna | SFT模块 | 目前最接近chatGPT的模型 |
LMFlow | SFT模块 | 基于 70 亿参数的 LLaMA,只需 1 张 3090、耗时 5 小时,就可定制自己的GPT并完成网页端部署 |
ColossalChat | 提供了SFT+RM+RLHF整个流程 | 无 |
1.2. 数据集
项目 | 备注 |
---|---|
AlpacaDataCleaned | 对Alpaca提供的52k数据进行了进一步清理 |
Alpaca-CoT | 加入了思维链chain-of-thought数据 |
InstructionWild | colossalChat开放的数据集 |
shareGPT | 一个 ChatGPT 数据共享网站,用户会上传自己觉得有趣的 ChatGPT 回答。 |
1.3. 没有GPU,如何满足在cpu机器上的部署需求
gpt4all
llama.cpp
alpaca.cpp
目前gpt3.5-turbo-0125的价格很便宜:1万个汉字的Input相当于1至2毛钱,1万汉字的Output相当于3至6毛钱
LoRA: Low-Rank Adaptation of Large Language Models 是微软研究员引入的一项新技术,主要用于处理大模型微调的问题。目前超过数十亿以上参数的具有强能力的大模型 (例如 GPT-3) 通常在为了适应其下游任务的微调中会呈现出巨大开销。LoRA 建议冻结预训练模型的权重并在每个 Transformer 块中注入可训练层 (秩-分解矩阵)。因为不需要为大多数模型权重计算梯度,所以大大减少了需要训练参数的数量并且降低了 GPU 的内存要求。研究人员发现,通过聚焦大模型的 Transformer 注意力块,使用 LoRA 进行的微调质量与全模型微调相当,同时速度更快且需要更少的计算。
目前,已经公布明确已经完成 千亿参数规模大模型训练的框架主要是 NVIDIA 开发的 Megatron-LM 、经 过微软深度定制开发的DeepSpeed、国产百度飞浆 PaddlePaddle 和华为昇思 MindSpore。大多数并行框架都支持 PyTorch 分布式训练,可以完成百亿参数规模的模型训练。
Arc搜索App
Arc搜索引擎内嵌的prompt是:prompt,这是一个非常值得学习和借鉴的prompt
操作步骤如下:
我们使用ChatGPT 为每个新闻标题提供推荐并将其转换为“ChatGPT 分数”,其中“是”映射到 1,“未知”映射到 0,“否”映射到 -1。
如果一家公司在某一天有多个头条新闻,我们会平均得分。
我们将头条新闻与下一个市场周期相匹配。
a. 对于开盘日早上6点之前的头条,我们假设头条可以在当天开市前交易,并在当天收盘时卖出。
b. 对于早上 6 点之后下午 4 点之前的头条,我们假设头条可以在当天收盘时交易,并在第二天收盘时卖出。
c. 对于下午4点以后的头条,我们假设头条可以在次日的开盘价成交,在次日的收盘价卖出。
我们对 ChatGPT 分数的第二天回报进行线性回归,并将其与新闻策划公司提供的情绪分数进行比较。 因此,我们所有的结果都是样本外的。
原文:
We prompt ChatGPT to provide a recommendation for each headline and transform it into a “ChatGPT score,” where “YES” is mapped to 1, “UNKNOWN” to 0, and “NO” to -1. We average the scores if there are multiple headlines for a company on a given day. We match the headlines to the next market period. For headlines before 6 am on the opening day, we assume the headlines can be traded by the market opening of the same day and sold at the close of the same day. For headlines after 6 am but before 4 pm, we assume the headlines can be traded at the same day’s close and sold at the close of the next day. For headlines after 4 pm, we assume the headlines can be traded at the opening price of the next day and sold at the closing price of that next day. We then run linear regressions of the next day’s returns on the ChatGPT score and compare it to the sentiment score provided by a news curating company. Thus, all of our results are out-of-sample.
参考文献:
https://arxiv.org/pdf/2304.07619.pdf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。