Finetuning vs. Prompting:大语言模型两种使用方式

目录

    • 前言
    • 1. 对于大型语言模型的两种不同期待
    • 2. Finetune(专才)
    • 3. Prompt(通才)
      • 3.1 In-context Learning
      • 3.2 Instruction-tuning
      • 3.3 Chain of Thought(COT) Prompting
      • 3.4 用机器来找Prompt
    • 总结
    • 参考

前言

这里和大家分享下关于大语言模型的两种使用方式,一种是 Finetune 另一种是 Prompt🤗

以下内容来自于李宏毅老师的视频讲解

课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php

视频链接:机器学习2023(生成式AI)

1. 对于大型语言模型的两种不同期待

这节要讲的是人类对大型语言模型在历史上有两种不同的期待,这两种不同的期待其实导致了非常不一样的结果,这两种不同的期待对应到两种不同的技术,一个叫 Finetune,一个叫 Prompt

在这里插入图片描述

语言模型是我们都了解过的东西,我们说 GPT 就是一个语言模型,GPT 在做的事情就是文字接龙,这是大家都已经很熟悉的事情,语言模型除了 GPT 以外,另一个特别知名的叫做 BERT,BERT 是 Google 在 2018 年年底的时候发布的一个大型的语言模型,BERT 做的事情跟 GPT 其实略有不同,BERT 做的事情是文字填空,文字填空跟文字接龙有点像又有微妙的差异,文字填空做的事情是给机器一个句子,它要做的事情是句子里面有一些部分是镂空的,它要把镂空的部分填回来,所以 GPT 是做文字接龙把不完整的句子补完,BERT 是做文字填空把一个句子里面挖空的地方把它补齐

为了讲解如何使用大型语言模型,下面我让 DALL-E 画了一张图来形象的说明这个事情:

在这里插入图片描述

这个就是 DALL-E 画的图,大象我们可以认为是大型的语言模型,它在网络上学习过很多知识,它知道很多事情但是它不知道自己要做什么,它空有一身力量,但是站在那里不知道要做什么,它需要有人来指引它前进的方向,这个指引它方向的人也许不用花很大的力量,只需要用一点点的力量就可以引导大象走向我们要它走的方向,所以大象指的就是大型语言模型,而大象头上的这个老鼠指的是使用这个语言模型的人类

人类对大型语言模型有两种不同的期待

  • 期待一:成为专才,解某一特定任务
  • 期待二:成为通才

第一个期待是我们期待大型语言模型成为解决某一问题的专才,它可以解决某一自然语言处理的特定任务,举例来说:

在这里插入图片描述

我们让大型语言模型做一些调整以后叫它专门做翻译,你给它什么句子,它都把中文翻成英文;我们还可以做一些调整叫它专门做摘要,给定一段文章输出其中的主要内容,这个是让大语言模型变成专才

第二个期待呢是期待大型语言模型变成一个通才,变得无所不能,什么都会,举例来说:

在这里插入图片描述

那因为这个大型语言模型是一个通才,什么都会,所以如果你只给它一个句子它不知道要得到什么输出,它不知道你是要做翻译还是要做摘要还是要做什么,因为这些它都会,所以你需要给它下指令,你需要告诉大型语言模型说,现在把这句话做翻译,期待它就产生翻译后的英文的句子,同样的句子你也可以下不同的指令告诉它做摘要,它就会把你输入的文字进行摘要

而这个额外所下的用人类语言来描述的指令叫做 Prompt,大家都知道说,今天 ChatGPT 走的就是期待二的路线,希望我们的大型语言模型变成一个通才,你今天要叫它做什么事情,直接用人类的语言去操控它

其实让语言模型成为一个通才这件事并不是一个非常新鲜的点子,很早以前就已经有人提出过类似的想法

在这里插入图片描述

有一篇 2018 年的文章 The Natural Language Decathlon: Multitask Learning as Question Answering,在这篇文章里面就有说所有自然语言处理的问题都可以看作是问答的问题,怎么说呢?假设你今天要做翻译,就是给机器一段文字然后你问它说怎么把这句话从英文翻译成中文,期待它输出中文给你,或者是你给机器一篇文章,你现在的问题是这篇文章的摘要是什么,期待机器输出一个摘要,这些其实都是我们说的问答的问题,给定一个问题期待机器输出一个回答,其实这篇文章里面所谓的 Question 所谓的问题在今天看起来就是 Prompt

其实这篇文章也不是最早提出这样概念的文章,有一篇 2015 年的文章 Ask Me Anything: Dynamic Memory Networks for Natural Language Processing 在 Deep Learning 刚开始火起来的时候就有人提出这样的概念了,这篇文章标题中的 Ask Me Anything 就可以知道说作者有一个很大的野心,他相信所有自然语言处理的问题通通都是问答的问题,他期待有一个模型文它什么问题都可以回答,当然在当时看来这个就是天方夜谭,但今天回头看起来不就是 ChatGPT 吗?所有这边想要讲的就是让机器变成通才这件事情也不是最近才有的点子,是人类一直以来的梦想

成为通才跟专才其实各自有利有弊:

  • 成为专才的好处:专才在单一任务上有机会赢过通才
  • 成为通才的好处:只要重新设计 prompt 就可以快速开发新功能,不用些程式

成为专才的好处就是这个模型专注在一个任务上面,其它什么事都不想,所以它比较有机会在单一任务上面击败通才,这边举一个例子,有一篇腾讯的文章 Is ChatGPT A Good Translator? Yes With GPT-4 As The Engine

在这里插入图片描述

这篇文章想知道说既然 ChatGPT 是通才,它可以做翻译,那它跟现在的商用翻译软件相比比如 Google Translator 比起来怎么样呢?但是你要让 ChatGPT 做翻译需要先对它下指令,要先对它做 Prompt,所以这篇文章先问 ChatGPT 说我应该要下什么样的 Prompt 才能够让你做翻译呢?然后 ChatGPT 给出了十个建议(如上图所示)

作者再根据这十个建议做一些修改得到一个他们觉得最适合把 ChatGPT 当作翻译软件的 Prompt,结果如下图所示:

在这里插入图片描述

这边做了十二个不同的翻译任务,尝试了 Google、DeepL、Tencent 三种不同的商用翻译软件跟 ChatGPT 来做对比,这边的衡量指标是一个叫做 BLEU Score 的数值,它通常拿来评价翻译系统,数值越大代表翻译的品质越好,细节大家可以看下论文:BLEU: a Method for Automatic Evaluation of Machine Translation

你可以很明显地看到说,在多数地情况下其实 ChatGPT 都是输给商用系统的,商用系统只单一做一件事情当然可以比 ChatGPT 做得好,ChatGPT 还要另外做一堆事情,所以翻译并不是它特别专长的事情

那后面 Microsoft 出了另外一篇文章 How Good Are GPT Models at Machine Translation? A Comprehensive Evaluation 想要知道 GPT 系列当作一个翻译软件的时候跟现有最强的翻译模型比起来怎么样,结果如下图所示:

在这里插入图片描述

这边一样试了各种不同语言间的翻译,总共试了 8 种不同的情况,这边比较的基本是 WMT-Best,WMT 是一个翻译比赛,WMT-best 是这个翻译比赛里面最强的那一个模型,从上面的结果你就会发现说这个 ChatGPT 如果跟 WMT-best,跟最好的翻译模型比起来还是没有办法赢的,在多数情况下 WMT-best 还是赢过 ChatGPT 的

这就是专才的好处,假设你只在意一个任务那你其实应该专门为这个任务打造一个系统

那成为通才的好处是什么呢?其实成为通才最大的好处就是这个才符合人类对人工智能的想象,这样才潮,才有关注,才会被讨论,你只专做一个任务,现在没有什么特别厉害的地方😂,此外通才的另一个好处就是未来要开发新的功能就很快了,过去开发新的自然语言处理的任务是要些程式,从今天开始使用 ChatGPT 你要开发任务就不再是写程式了,你是用人类的语言直接操控一个现有的通才的模型让它做你想要做的事,比如:

在这里插入图片描述

假设如果你对模型下的指令是请帮我做摘要,但是模型输出的摘要还是太长了,怎么办?以前你要改程式,很麻烦,现在直接改指令说我要 100 字以内的摘要那 ChatGPT 就会按照你的要求输出指定长度的摘要

所以我们就讲了两种对于语言模型不同的期待,一个是希望它只做一件事情,一个是希望它成为通才,而这两种期待导致两种不同类型的使用与大型语言模型的方式

2. Finetune(专才)

我们先看期待一有什么样的大型语言模型的使用方式

在这里插入图片描述

我们刚才提到 BERT 是一个做文字填空的模型,通常我们在使用它的时候都是在期待一的情境下来使用它,我们有一个语言模型我们想要这个语言模型成为各种不同任务的专才之前我们需要对它做一些改造。什么样的改造呢?这个改造分为两个方面:加外挂和微调参数,一个改造是你需要加一个外挂,另一个改造是你需要对它的参数做一些微调它才能够变成专精于某一任务的专才

那为什么需要加一个外挂呢?你可以想想看 BERT 相较于 GPT 系列有一个先天的劣势,什么样的劣势呢?它不会讲话,我们当初叫它学习的事情就是文字填空,这是它会做的事情,但它不会生成一个完整的句子,所以如果你今天的任务是要 BERT 去产生某一种样子的答案或是要它做翻译生成一个完整的句子,你说没办法直接使用 BERT 这种模型的,你需要加上外挂,那怎么帮 BERT 加上外挂呢?大家感兴趣的可以看看:【機器學習2021】自督導式學習 (Self-supervised Learning) (二) – BERT簡介

基本上有几个固定的套路,本身在原始 BERT 文章里面就已经告诉你说有几个固定的套路,你可以根据你的需求来改装这个 BERT,所以 BERT 不是一出场就可以使用的,它要做一些改装加上一些额外的模组才能够做你想做的任务

在这里插入图片描述

这里也有一篇关于 BERT 不错的文章,大家感兴趣的可以看看: https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html

上面讲的是加外挂,另一个要做的事情就是你需要去微调(Finetune)语言模型内部的参数,微调的概念是什么呢?一个语言模型拿来你要叫它做翻译,它是不会做翻译的,所以怎么办?

在这里插入图片描述

你要先准备一些成对的数据,告诉模型说如果有人跟你输入 Good morning,你就要输出早安,然后你就去微调语言模型内部的参数让它变成一个翻译的专才。我们刚才有说如果你今天用的语言模型是一个 BERT,它是讲不了一句话的,所以你一定要加额外的外挂它才讲得一句完整的话,而外挂是要另外训练出来的,你还是需要一些标注的数据才能够训练出来。

这边所谓 Finetune 的意思讲得更具体一点,就是大家都已经知道的,如果你要调整一个类神经网络的参数你要怎么做呢?你要跑 gradient descent,这边所谓的 Finetune 其实就是跑 gradient descent 的意思,就是你把语言模型原来的参数当作训练的初始化参数当作训练的 Initialization,然后用翻译的数据去做一点微调,你去做几步的 gradient descent 那这个模型可能就能够很好的翻译

这个就是微调的概念,你把原来语言模型里面的参数当作初始化的参数,用 gradient descent 去微调模型里面的参数。

还要另外一个技术叫做 Adapter,如下所示:

在这里插入图片描述

Adapter 的意思是说这个语言模型的参数我们都不去动它,我们在语言模型里面再插入额外的模组,这个额外的插件可能就是新增加的一个 layer 等等,有了这个额外的插件以后,今天在 Finetune 的时候,假设我们要让这个语言模型可以做翻译,我们有一些翻译的数据,在 Finetune 的时候语言模型本身是不动的,你只去微调 Adapert 里面的参数。

所以语言模型本身不动,但语言模型加上 Adapter,加上额外的插件,合起来它们可以做插件,合起来变成一个有翻译专长的模型。Adapter 这个插件实际上长什么样子呢?那其实它有各式各样不同的变形,你可以在 https://github.com/adapter-hub/adapters 仓库里面找到格式各样的 Adapter,如下图所示:

在这里插入图片描述

这边列了几种常见的插件,一种是 Bitfit 把所有的 bias 当作额外的插件,今天在 finetune 的时候只 finetune 那些神经元的 bias,而 weights 都不去动它,这是一种做法;另一种叫 Houlsby,Houlsby 就是一个 transformer encoder 的 layer,中间包括了 attention、Feed-forward network,Houlsby 就在 Feed-forward 后面再接一层 Feed-forward network,到时候 finetune 的时候只 finetune 额外插入的一层

AdapterBias 是跟 Feed-forward 的模组平行的,它会对 Bitfit forward 的 output 做一些修改,把 Bitfit forward 的 output 做一下平移;还有 Prefix tuning,它是去改 attention;还有一个因为跟 Diffusion Model 结合突然变得热门的方法叫做 LoRA,LoRA 也是去改 attention

更多细节大家可以看看论文:Exploring Efficient-tuning Methods in Self-supervised Speech Models

总之这些插件可以放在各式各样的地方,那至于放在哪里好,你得自己试,比如 LoRA 在 NLP 上表现得很好,但是放在语音上可能表现很差,所以一个 Adapter 要放在哪里才会好,其实取决于你的应用,这个是你要自己去尝试的

那 adapter 有什么样的好处呢?我们刚才说如果没有 adapter 的话我们就要微调整个模型所有的参数,但是我们期待机器可以做的事情可能有成百上千个任务,如果今天要微调整个模型,意味着每一个任务你都有一组全新的模型,你都有一组全新的参数,如下图所示:

在这里插入图片描述

那今天的语言模型都很大,比如 GPT-3 就有 176 billion 的参数,它参数量太多了,这些模型实在是太巨大了,一百个任务就要存一百个模型,一千个任务就要存一千个模型,这个是难以承受的,所以怎么办呢?

在这里插入图片描述

adapter 的方法是,语言模型本身就不动我们只插入额外的插件,到时候你真正实际要存的模型参数其实只有大型语言模型本身,GPT-3 只需要存一个,它有 176 billion 的参数。但是每一个任务其实你只存了 adapter,一百个任务你就存一百个 adapter 就好,adapter 通常都很小,它们可能只有一个 layer 的参数而已,所以存一百个也许你还是可以接受的。这个是 adapter 的优势,也是为什么大家会想要使用 adapter 这样的技术的原因

OK,以上我们讲的是期待一就是大家通常使用 BERT 这个模型的方式

3. Prompt(通才)

接下来我们就要进入期待二,怎么把模型变成一个通才呢?怎么让机器能够阅读我们要它做的任务的叙述并且我们提供一些范例,它根据我们要它解的题目或者是任务的叙述跟范例,就做我们想做的事情呢?

大家在考英语的时候可能会看到下面的题目的叙述:

在这里插入图片描述

给你一个叙述,给你一个范例,希望你就知道接下来要怎么做,那对于机器而言,这种给题目叙述就要能够回答叫做 Instruction Learning,那给范例就要能够回答叫做 In-context Learning,那这个就是 ChatGPT 系列想要达成的目标

那其实 OpenAI 并不是这几年才突然想做这件事,他们一直都想做这件事,之前的课程:【機器學習2021】自督導式學習 (Self-supervised Learning) (四) – GPT的野望 我们有说 GPT 它想要做的事情就是让机器读题目的叙述然后再看范例就能够回答问题。不过在 21 年那个时候会觉得这个想法太狂了,没想到这么快就可以看到结果了

很多人常常都会想一个问题,GPT 系列能不能够成为一个专才跟 BERT 一样针对不同的任务去做微调呢?其实是可以的,但是为什么 GPT 系列没有选择跟 BERT 一样去微调参数呢?以下是两个可能的猜测

  • 一开始 OpenAI 对于 AI 就有比较高的期待?
  • 因为 BERT 已经做了微调参数,只好另辟蹊径?

首先第一个猜想就是一开始 OpenAI 对于人工智能的技术就有比较高的期待,让机器成为专才这件事是他不屑做的,他一开始就像开发成能够当作通才的模型,他一开始就想开发一个模型可以看得懂人类的指令

另外一个可能就是 BERT 都已经把微调那个路线做得差不多了,也就是专才那个路线已经被 BERT 封死了,GPT 再去做微调你也不过只能跟 BERT 做得差不多,所以一定要另辟蹊径走一条不一样的路

当然以上都纯属于猜测罢了

3.1 In-context Learning

我们就先来看一下机器怎么根据范例来做学习,根据范例来做学习这件事情叫做 In-context Learning

在这里插入图片描述

假设我们现在要让语言模型做情感分析的任务,也就是给它一个句子,它要判断说这个句子是正面的还是负面的,如上图所示。那你直接给它一个句子是没有用的,因为就算它有情感分析的能力,你直接给它一个句子它也不知道要干嘛,是要做翻译吗?是要做摘要吗?它不知道要干嘛,所以你得告诉它说,现在要做情感分析

那怎么告诉它现在要做情感分析呢?提供给它一些例子,如下所示:

在这里插入图片描述

那我们把这些例子通通串起来,在加上我感到非常高兴这个句子,通通丢到语言模型里面当作是一个文字接龙,然后让语言模型输出,接下来应该输出哪一个词汇。希望它可以领悟到说根据这些例子可以知道现在就是要做情感分析,所以给你这个句子,你应该输出正面

讲到这里,大家可能会非常困惑,**机器真的能够从例子中学习吗?**如果你没有什么机器学习的概念,你可能会觉得说这个不就跟人一样,看一些例子本来就可以学会啊,但是如果你有机器学习的概念,你可能会对此非常怀疑,因为这不是跑 gradient descent,它只是 input 而已,机器真的能够从这些 input 就做类似学习的事情,得到正确的答案吗?

所以有人就很怀疑,在 Rethinking the Role of Demonstrations: What Makes In-Context Learning Work? 这篇文章里面就做了一个实验,它故意给机器错的答案,一个给它例子,只不过这些例子的标注是错误的,然后看看机器会有什么样的反应,如下所示:

在这里插入图片描述

我们来看下实验的结果:

在这里插入图片描述

图中上面是一堆分类任务的正确率,下面是一堆多选题任务的正确率,横轴代表不同的模型,从 GPT-2 一直到 GPT-3,蓝色是没有给范例的,没有给范例机器表现当然很差,这没有什么问题。黄色是给了范例的,然后范例里面的标注是正确的,红色也是给了范例的,但是范例里面的标注是错误的,最有趣的地方是范例给了错误的标注以后其实正确率并没有真的下降很多,看来给机器这些范例,它从范例里面似乎并没有做真正的学习

接下来,作者又做了另外一个实验,如果我们故意给机器一些无关的输入,一些奇奇怪怪的句子那结果会怎么样呢?

在这里插入图片描述

结果如下图所示:

在这里插入图片描述

图中黄色的就是给正确的答案,红色的是给错误的答案,紫色的是给无关的句子,蓝色的是没有给例子,所以你会发现说如果你给机器的例子它里面的句子跟你现在要解的任务是来自于不同的 domain,也就是说它们的内容差异非常大,那你发现说根据范例来学习就会没有效,所以看起来给机器的那些范例它的 domain 是很重要的

所以这篇文章里面,作者就给了一个推测,这些语言模型本来就会做情感分析,你给它这个句子,它本来就知道它是正面的,它需要的是什么?它其实不需要这些例子来做学习,它不需要你教它说这是正面,这叫负面,它早就会了,那这些例子有什么用?这些例子是启动它,让它知道说现在要做情感分析,而不是做其它的事情比如说翻译或摘要

那有另外一个说法是说想这种 In-context Learning 的方法其实你这边例子给多了也没什么用,因为 In-context Learning 的这些例子,它最重要的目标并不是让机器根据这些例子做学习,而是要唤醒机器,告诉它说现在要执行什么样的任务,而语言模型本身就有执行这些任务的能力,我们需要的只是透过这些例子,唤醒它让它知道现在要解什么样的任务

在这里插入图片描述

所以在文章种你会发现说其实 In-context Learning 你给的范例的数目没有那么的重要,上图中纵轴是是不同任务上面的表现,横轴是不同范例的数目,如果是一般的 supervised learning 比如说微调模型参数的时候,你给的例子从 4 增加到 32,这个对于机器来说差别非常大,照理说你的正确率会上升非常多

但是对于 In-context Learning 这种方法,你会发现说很快就收敛了,到 8 个例子的时候其实机器就不能够再做得更好了,它并不是透过这些例子进行学习,这些例子主要是唤醒它的记忆,告诉它说现在要做什么样的事情,所以例子给多了可能帮助也不大

但是也有不一样的声音:

  • Why Can GPT Learn In-Context? Language Models Implicitly Perform Gradient Descent as Meta-Optimizers
  • What learning algorithm is in-context learning? Investigations with linear models

在这里插入图片描述

这两篇文章有告诉你说,其实 In-context Learning 也是有机会让机器做到 Learning 这件事情的,In-context Learning 也是可以达成类似 gradient descent 的效果,细节大家可以细读论文

有一篇文章 Larger language models do in-context learning differently 它也是想要深入研究 In-context Learning,但它得到的结果跟我们刚才看到的前一篇 rethinking 那篇文章得到的结果是略有不同的,我们下面一起来看看

在这里插入图片描述

这篇文章做了很多不同的任务,然后尝试了很多不同的模型,在上图中颜色越深代表模型越大,横轴是我们今天在做 In-context Learning 的时候给机器的例子里面有百分之多少是错误的,你会发现从图上看来有很多模型都是给它越多错误的例子,它做的结果越差,你会发现尤其是大型的模型受到多雾的例子的影响是最大的

所以从这篇文章看起来机器还是有从那些例子里面学到东西的,它并不是想要告诉你说前面的文章的结果是错的,它是想说 In-context Learning 这件事情,机器如果要从范例学习这件事情,可能要是非常大的模型才会发生,大模型比如 PaLM-540B 这种巨大的模型它确实就会受到这个例子很大的影响,但如果是小的模型,受到错误的例子的影响就比较小

所以过去的论文之所以会得到结论说 In-context Learning 里面数据是不是对的没有什么用,那是因为过去看的都是小模型,如果看大的模型,机器真的可以从范例种进行学习

另外一个机器可以从范例中进行学习的例子也可以从上图中看出,灰色的虚线代表 random 随机的结果,那情感分析你随便乱猜都有 50% 的正确性,那我们可以看给定 100% 错误标签的时候,机器得到的正确率是低于 50% 的,那这是不是代表它不只没有乱猜,它还从 100% 错误的数据中进行了学习,你既然给它这样错误的例子它就照着给你学下来,所以正面的句子它会标负面,负面的句子它会标正面。

所以你看到这些特别大的模型在 100% 错误标注的时候,它的正确率是低于 50% 的,意味着它可以从错误的数据中进行学习

在这里插入图片描述

这是另外一个机器有从 In-context Learning 学到东西的例子,在文章中有直接拿大语言模型来做分类的问题,怎么做呢?如上图所示,直接给机器一些 feature 和对应的 label 的例子,然后再给机器一个 feature 的 input 看看能不能得到一些正确的答案出来,结果还真可以!

在这里插入图片描述

这边横轴是问题的难度也就是你的输入,你可以发现说这些模型学到的正确率是高过于随机乱猜的,当然 SVM 还是比这些大型语言模型更强,但是这边想要表达的意思是说在某一些清晰下,大型语言模型分类的 performance 居然只跟 SVM 差了一点点。给了它一堆例子它就自己学会了一个分类的算法,可以拿来做分类就是这么神奇,所以这是一个大型语言模型神秘的 In-context Learning 的能力

当然你可能会说,我们今天在做 pre-training 的时候你从来没有教机器说看到这个例子就要按照这些例子来做我们想做的事情,所以 In-context Learning 结果不怎么好也是可以理解的。所以你可以让机器去学习怎么做 In-context Learning 这件事情,这个部分的做法其实就比较直接,如下图所示:

在这里插入图片描述

你可以告诉机器说给你一些例子然后再给你一个句子,根据这些例子你就要知道做翻译,给你一些范例给你一个问题,你知道根据这些范例就要做问答,我们希望今天给你不一样任务的范例,机器知道说,这个不一样的任务的范例就告诉它做 NLI(Natural Language Inference)自然语言推论,所以你可以让机器去学习做 In-context Learning 这件事情

当然,让机器有学习做 In-context Learning 会比完全没有学做 In-context Learning 还要结果好得多,我们之前的例子中机器并没有去学着做 In-context Learning 这件事,一个大语言模型只学了文字接龙直接拿出来以后就有神秘的 In-context Learning 的能力

3.2 Instruction-tuning

上面我们讲的是透过范例来学习,更进一步我们要讲机器怎么透过题目的叙述来学习,其实透过范例来学习对人类来说还是没有那么的自然,今天要操控机器,你还得去找一些范例感觉有点麻烦,能不能更进一步让机器透过叙述叫它做什么就做什么呢?能不能让机器直接阅读任务的叙述就知道我们要它干什么呢?

如果今天要让机器可以看到任务的指示就做对应的事情,其实直接使用一个预训练的模型是不够的,直接使用一个文字接龙的模型现在看起来效果是很差的,所以文字接龙的模型还是需要经过一些微调叫做 Intruction-tuning 以后才能够看得懂人类的指令

那什么是 Instruction-tuning 呢?如下所示:

在这里插入图片描述

Instruction-tuning 就是在训练的时候你给机器不同的指令,比如说请做翻译,请做摘要等等,期待在测试的时候给一个前所未有的指令机器自动知道这个指令是什么意思,然后给出合理的回应,这个就是 Instruction-tuning 的概念

在这里插入图片描述

这样的概念其实也不是全新的点子,很多人都试过这个概念了,一个知名的模型是 Hugging Face 的 T0,那 T0 做的事情是你今天在训练的时候,你给机器做摘要的指令叫它做摘要,你给机器做情感分析的指令叫它做情感分析,你给机器问答的指令叫它做问答,期待在测试的时候你直接叫它做 Natural Language Inference 它也可以给你正确的答案,这个就是 T0

另一个知名的模型是 Google 提出的 FLAN

在这里插入图片描述

那 FLAN 在做 Instruction-tuning 的时候他们先去收集了一大堆自然语言处理的任务,比如翻译、摘要等等,收集各式各样自然处理的任务还要标注的数据集,接下来你需要把这些任务改写指令,什么意思呢?

在这里插入图片描述

假设现在我们要做的任务是自然语言推论,在自然语言推论里面,机器要给它一个前提然后给它一个假设,然后它回答说这个前提跟假设有没有矛盾。如果是一般的模型,那你就是给它读这两个句子(前提和假设)期待它可以得到正确的结果,但是我们现在要叫机器做的事情是看懂人类下的指令,所以这边要问的问题就是当人类想要叫机器做自然语言推论的时候你会怎么跟机器说话?

接下来就有各种不同的说法,在 FLAN 这篇 paper 里面每一个 NLP 的任务他们都想了十个不同的描述方式,如上图所示。简单来说,你要想办法把自然语言推论这个任务用人类的语言把它描述出来,然后变成一个 dataset,然后去教你的机器看看大语言模型可不可以自动学到看这些指令就做它该做的事情

结果怎么样呢?结果还真的是可以的

在这里插入图片描述

上图是 FLAN paper 中的结果,他们做了三种不同的测试任务包括自然语言推论、Reading Comprehension 以及 Closed-Book QA,这边要强调下,当它的测试任务是 NLI 的时候训练数据里面就没有 NLI,这个需要大家了解,就是说如果训练数据里面已经有 NLI 的任务,那你在测试的时候也有 NLI 的任务,机器可以看懂你要它做推论的指令这听起来没什么稀奇的,所以这边如果测试的时候是 NLI 的任务,训练的时候就没有 NLI 的任务,然后看看机器能不能再它从来没有看过的指令的情况下自动知道说人要它做什么

图中的数值越高越好,黄色的是 GPT-3 且只有给它指令得到的姐u共,红色的就是给它指令也做 In-Context Learning,蓝色的是 FLAN 有做 Instruction Learning,它有学过怎么根据人的指示来做合理的回应,因此它的效果最好

所以看起来机器是有机会学会根据人下给它的指令做事情,然后它学到的东西可以泛化到没有看过的指令上面,这个就是 Instruction Learning

3.3 Chain of Thought(COT) Prompting

这节要讲的另外一个技术叫做 Chain of Thought(CoT),它是另外一个 Prompt 的方式,我们刚才说我们要下指令给机器的时候有两种下法,一种是给机器问题的描述,任务的描述,一种是给机器一些范例,那 CoT 是另外一种更详细的给机器 Prompt 的方法,那它讲起来概念也非常的简单,如下所示:

在这里插入图片描述

论文中发现说如果是一些需要推理的问题比如数学的问题,直接用 In-context Learning 给机器一些范例的方法它往往做得不是太好,所以你给机器一个应用题告诉它答案是 11,给它另外一个应用题期待它可以自动给你答案,但是往往没办法答对。那 CoT 的概念是什么呢?CoT 的概念就是在给机器范例的时候顺便给它一些推论的过程,所以给它问题给它推论过程给它答案,期待它看到新的问题的时候它自己写出推论过程,再写成答案

那 CoT 这招有没有用呢?在论文中看起来还是蛮有用的

在这里插入图片描述

从图中你可以看到 Finetune GPT-3 去解数学问题它可以得到 33% 的正确率,然后过去最好的结果可以做到 55% 的正确率,那用 PaLM 大语言模型如果只是一般的 Prompting 即 In-context Learning,给它这个题目和答案,它只能得到 18% 的正确率,但是用 CoT 你给它问题和答案的时候还顺便告诉它推论的过程,告诉它这个答案是怎么来的,这个语言模型的能力突然就起飞了,得到 57% 的准确率,就是这么神奇,只是多让它看了详解以后,突然之间机器好像有了一点推论的能力

那 CoT 还有不同的变形,我们刚才讲的 CoT 是在 In-context Learning 下做的 CoT,也就是说你提供给机器一些范例,还要提供给它解题的过程,但是很多时候我们根本就没有解题的过程,这个解题的过程是人写的。那有时候我们没有解题的过程怎么办?

在这里插入图片描述

有人想了一个神奇的做法,这个神奇的做法是机器在回答问题之前告诉它说 Let’s think step by step.,它能力就起飞了,它突然之间就会做推论了,这种 CoT 的方法叫做 Zero-shot-CoT,连例子都不给它直接叫它 think step by step 它就开始推论了

在这里插入图片描述

另一个跟 CoT 常常搭配的方法叫做 Self-consistency,你要知道现在 ChatGPT 这种模型每次回答都不一样,因为它有随机性的,所以叫机器在做 CoT 的时候除了直接叫它 think step by step,你还要让它产生好多次结果,那每一次结果它的推论过程可能都不一样,它的答案也都不一样,但是很直觉的,你可以想象说如果不同的推论过程都得到同样的答案,那这个答案的可信度其实就会高很多

现在这个 Self-consistency 的概念就这么简单,让你的语言模型产生好几次不同的结果,有不同的推论,不同的答案,然后再看看哪一种答案出现最多次,它就是正确答案。其实在这篇 paper 里面还要另外一个小小的技巧,就是我们不只是投票每一个答案,还去算一下这个 Language Model 输出答案的信心分数,我们把不同的答案根据这个信心分数给它一个权重,那信心分数比较高的那个答案就比较可靠。那论文里面说这招没有什么帮助,直接产生多个答案再投票就好了

那讲到这边其实有一个疑惑,就是这一招是不是要搭配 CoT 才特别有效呢?这边有一个解释,是李宏毅老师直接拿 ChatGPT 实测的结果(博主也做了对应测试),其实 CoT 这招对于 ChatGPT 可能没有什么帮助,为什么呢?因为其实 ChatGPT 它也会自动列详细的运算过程,除非你抑制它喜欢列数学公式的能力,所以这边问了 ChatGPT 一个鸡兔同笼的问题

在这里插入图片描述

这边告诉 ChatGPT 说直接给答案,不列计算过程,跑 5 次的结果都是 12 只,它生不出另外不同的答案出来,但是如果现在让它自己做一下推论,结果又不一样

在这里插入图片描述

这个时候它就开始列计算过程,开始解方程最后得到 16 只的正确答案,那博主也测试了 5 次,答案也都是 16 只,与老师测试的结果不同,可能是因为博主使用的是 GPT-4 性能更强一些,GoT 对 GPT-4 来说可能还是有帮助的

OK,那其实还有其它跟 CoT 有关的做法,如下图所示:

在这里插入图片描述

这个做法叫做 Least-to-most prompting,那它的概念是说有一些数学问题太难了,怎么办?我们要把这些数学问题进行拆解,把它变成简单的数学问题,如上图所示。那这边的想法是说直接让机器去解一个复杂的数学问题太难了,我们要告诉机器怎么拆解这个问题,所以你就让 Language Model 自己先把这个问题拆解(Stage 1),然后把拆解后的简单的问题和之前的问题一起再丢给 Language Model(Stage 2),然后再给它我们最后的问题,期待它就可以因此得到正确的答案

那这整个 process 都非常地直觉,那这边难得点就是怎么让 Language Model 自动把这个复杂的数学问题做简化呢?所以其实你还是得做 In-context Learning

在这里插入图片描述

所以在论文里面他们是有给机器一些范例的,告诉它说看到这么难的一个数学问题,你要先做这样的简化,这样机器才能够学会做简化这件事

3.4 用机器来找Prompt

OK,接下来就是要讲怎么让机器自动生成 prompt,那怎么用机器来找 prompt 呢?

在这里插入图片描述

我们到目前为止讲的 prompt 其实是 Hard Prompt,什么叫 Hard Prompt 呢?就是我们输入给机器的东西是文字。那还有另外一种做法是给机器 Soft Prompt,就是你给机器的额外输入,你给机器的指令,并不是用人类看得懂的语言来描述的,而是一堆连续的向量,而这些向量是可以 train 的,你可以把这些向量想成模型参数的一部分,它们可以跟着 label data 进行调整

那讲到这个 Soft Prompt 有人就会说听起来很像是把 adapter 放在了 input,那其实这样想也是没有问题的,Soft Prompt 这个想法其实跟让机器变成专才是比较像的,你可以想成 Soft Prompt 就是 adapter 的一种特例

那还要什么其它的方法来让机器自动找 prompt 呢,你可以用 reinforcement learning 的方法来硬造 prompt

在这里插入图片描述

你现在有一个大型的 Language Model,给一个 Input 输出一个 Response,你直接用另外一个 Language Model 生成一个句子,这个句子就当作 GPT-3 的 prompt,那期待这个句子可以影响 GPT-3,然它 output 的结果是我们想要的

那这个 Generator 它怎么知道要怎么产生合适的 prompt 呢?你就要做 reinforcement learning,你要有一个方法来判断说现在大型 Language Model 的 output 是不是我们要的,如果是就得到高的 reward,如果不是就得到低的 reward,把 reward 再 丢给这个 Generator 让它进行学习,期待它产生出来的 prompt 可以影响 GPT-3,让它出来的结果是我们想要的,所以你确实可以用 reinforcement learning 的方法来硬学一个 Generator 产生一个 prompt 来达成我们的目标

大家感兴趣的可以看看:Learning to Generate Prompts for Dialogue Generation through Reinforcement Learning

接下来还要更狂的方法连 reinforcement learning 都不用做,直接用大型 Language Model 自己把自己的 prompt 想出来,怎么做呢?

在这里插入图片描述

这边的做法是这个样子的,你先描述一段文字然后让 ChatGPT 告诉你现在这个 instruction 是什么,叫它硬把那个 instruction 想出来,这样就不用人想了,让机器自己把 prompt 想出来,更具体的例子:

在这里插入图片描述

你的 input 可能是一句话例如今天天气真好,output 就是正面,你给机器一些这样的范例,然后问它说如果要产生这样子的结果,那需要下什么样的指令呢?期待它直接说出请决定这句话是正面还是负面

能不能做到这样子的事情呢?Large Language Models Are Human-Level Prompt Engineers 这篇文章就是这么做的,如下图所示:

在这里插入图片描述

他完整的做法是这个样子的,你就给机器下一些指令叫他硬是把 instruction 想出来,让机器自己去把指令想出来,把这些指令想出来以后就把它们一个一个去试,看看哪一个指令效果最好,你就有一个好的指令了,不过为了怕机器找出来的指令不够好,所以他还做了下一步,就是把一些比较好的指令再去丢给 Language Model 跟它说现在给你一个指令,请帮我生成这个指令的辩析,然后得到更多不同的指令以后再去你要的任务上做衡量,直到你选出一个最好的指令。

那论文里面有说,其实后面这半段是不太需要的,没有什么帮助机制,基本上做第一步就可以找出很强的指令了

最好我们再回到刚刚的数学问题求解上:

在这里插入图片描述

刚才我们有说如果跟机器讲 Let’s think step by step.,它突然能力就暴涨,本来没有做 CoT 它的正确率是 17.7%,跟它说了这句话后正确率就变成了 78.7%,然后上表中有各式各样的指令,那用刚才的那个方法可以找出另外一个更强的指令将正确率提升到 82.0%。这样子让机器自己来想 instruction,机器自己催眠自己,连人类也不用想 prompt 的指令了。

OK,以上就是跟大家分享的对机器的两个期待,那 OpenAI 期待机器可以成为一个通才所以就有了 ChatGPT

总结

这里我们主要学习了对 LLM 的两种不同的期待:Finetune 和 Prompt 即专才和通才,像 BERT 这种通过加外挂和微调参数可以成为专才,而 ChatGPT 这种则是一个通才,我们讲了有关通才 prompt 的三种方式,一种是 In-context Learning 通过范例来进行 prompt,一种是 Instruction-tuning 通过题目叙述来进行 prompt,还要一种是 Chain of Thought,不仅给题目叙述和范例还给推论过程,最后我们还简单聊了下如何让机器自己来找 prompt

OK,以上就是关于对 LLM 两种不同期待的全部内容了😄

参考

  • [https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php]
  • 机器学习2023(生成式AI)
  • The Natural Language Decathlon: Multitask Learning as Question Answering
  • Ask Me Anything: Dynamic Memory Networks for Natural Language Processing
  • Is ChatGPT A Good Translator? Yes With GPT-4 As The Engine
  • BLEU: a Method for Automatic Evaluation of Machine Translation
  • How Good Are GPT Models at Machine Translation? A Comprehensive Evaluation
  • 【機器學習2021】自督導式學習 (Self-supervised Learning) (二) – BERT簡介
  • https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html
  • https://github.com/adapter-hub/adapters
  • Exploring Efficient-tuning Methods in Self-supervised Speech Models
  • 【機器學習2021】自督導式學習 (Self-supervised Learning) (四) – GPT的野望
  • Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?
  • Why Can GPT Learn In-Context? Language Models Implicitly Perform Gradient Descent as Meta-Optimizers
  • What learning algorithm is in-context learning? Investigations with linear models
  • Larger language models do in-context learning differently
  • Multitask Prompted Training Enables Zero-Shot Task Generalization
  • Finetuned Language Models Are Zero-Shot Learners
  • Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
  • Large Language Models are Zero-Shot Reasoners
  • Self-Consistency Improves Chain of Thought Reasoning in Language Models
  • Learning to Generate Prompts for Dialogue Generation through Reinforcement Learning
  • Large Language Models Are Human-Level Prompt Engineers

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单理解数据存取

1.存 1.从编写程序开始说起,源代码中初始化一个变量,在文本编辑器中显示的是10进制的数, 2.程序运行后,先在内存开辟相应空间,然后: (开始实质用数据了) 一.将十进制转换为二进制…

ASP.NET基于BS的计算机等级考试系统的设计与实现

摘 要 随着计算机技术的发展及计算机的日益普及,基于B/S结构的考试系统与无纸化办公一样已成为大势所趋。论文详细论述了一个基于B/S结构的计算机等级考试系统的设计过程。软件采用ASP.NET 2005作开发平台,C#作编程语言,SQL Server 2005作…

比较指令CMP

cmp 比较 将2个值比较输出给软元件 大于条件软元件得电 等于软元件1得电 小于软元件2得电 1,当计数起接通一次Y2得电 当计数器等于5时Y1 得电 当计数器大于5时Y0得电

python中time库的time.time()函数的作用是什么?

python中time库的time.time()函数的作用是什么? 作用:Python time time() 返回当前时间的时间戳(1970纪元后经过的浮点秒数)。 time()方法语法:time.time() #!/usr/bin/python # Write Python 3 code in this onlin…

蓝桥杯——18

学习视频&#xff1a;21-广度优先搜索练习_哔哩哔哩_bilibili Q&#xff1a;密码锁 #include<iostream> #include<queue> using namespace std; int s, e; bool vis[10000]; struct node {int state;int step;node(int s1, int s2) {state s1;step s2;} }; int…

《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法

word2vec使用语言天生具备序列这一特性训练得到词语的向量表示。而在图结构上&#xff0c;则存在无法序列的难题&#xff0c;因为图结构它不具备序列特性&#xff0c;就无法得到图节点的表示。deepwalk 的作者提出&#xff1a;可以使用在图上随机游走的方式得到一串序列&#x…

Java 设计模式系列:模板方法模式

简介 模板方法模式是一种行为型设计模式&#xff0c;它定义一个操作中的算法骨架&#xff0c;将一些步骤推迟到子类中。模板方法模式使得子类可以不改变一个算法的结构&#xff0c;即可重定义该算法的某些特定步骤。 在模板方法模式中&#xff0c;抽象类中定义了一系列基本操…

网络篇10 | 网络层 IP

网络篇10 | 网络层 IP 01 简介02 名称解释03 IP报文格式(IPv4)1&#xff09;4位版本协议(version)2&#xff09;4位首部长度(header length)3&#xff09;8位服务类型(Type Of Service, TOS)4&#xff09;16位总长度5&#xff09;16位(分片)标识6&#xff09;3位(分片)标志7&am…

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([&#xff1a;这表示创建一个转换组合&#xff0c;将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip()&#xff1a;这个操作是随机水平翻转图像&#xff0c;以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

coreldraw2024直装版下载 永久免费使用附下载安装教程( 仅限 win10用户 )

CorelDRAW 2024具有一些特别的优势&#xff0c;这些优势不仅体现在其丰富的功能和卓越的性能上&#xff0c;还体现在其跨平台的兼容性上。 首先&#xff0c;CorelDRAW 2024支持多种操作系统平台&#xff0c;包括但不限于Windows 10和Windows 11等高级操作系统。这意味着无论是…

webpack-(plugin,本地服务器,路径别名,安装vue)

安装vue npm i vue-loader -D npm i vue 编写一个vue文件&#xff1a; 在index.html中设置 一个id为app的div 将vue文件挂载到app中 vue比较特殊&#xff0c;除了使用loader外&#xff0c;还使用了plugin const path require("path"); const { VueLoaderPlugin …

zabbix 使用 dataease 做数据大屏

1、环境介绍 操作系统&#xff1a;龙蜥os 7.9 软件&#xff1a;dataease v1.18.18 zabbix&#xff1a; 6.0 2、软件下载 https://community.fit2cloud.com/#/products/dataease/downloads 3、将软件包上传到服务器并解压缩 tar -xvf dataease-v1.18.18-offline.tar.gz4、修改…

鸿蒙端云一体化开发--开发云函数--适合小白体制

开发云函数 那什么是云函数&#xff1f;我们将来又怎么去使用这个云函数呢&#xff1f; 答&#xff1a;我们之前要编写一些服务端的业务逻辑代码&#xff0c;那现在&#xff0c;在这种端云一体化的开发模式下&#xff0c;我们是把服务端的业务逻辑代码&#xff0c;通过云函数来…

Mybatis中SqlSession接口中的selectList方法

1、SqlSession SqlSession是Mybatis持久层框架提供的接口&#xff0c;该接口中包含了大量的CRUD操作方法&#xff08;既增删改查方法&#xff09;。 2、selectList方法 selectList方法是用于查询的方法&#xff0c;该方法具有多态性&#xff0c;如图所示&#xff08;打开myb…

qemu源码解析一

基于qemu9.0.0 简介 QEMU是一个开源的虚拟化软件&#xff0c;它能够模拟各种硬件设备&#xff0c;支持多种虚拟化技术&#xff0c;如TCG、Xen、KVM等 TCG 是 QEMU 中的一个组件&#xff0c;它可以将高级语言编写的代码&#xff08;例如 C 代码&#xff09;转换为可在虚拟机中…

51单片机-独立按键模块

1. 独立按键控制LED状态 轻触按键实现原理&#xff1a;按下时&#xff0c;接通&#xff0c;通过金属弹片受力弹动来实现接通和断开。 松开按键 按下之后&#xff1a;就会被连接 同时按下K1和K2时&#xff0c;P2_0,接口所连LED灯才亮。 #include <REGX52.H> void ma…

python-numpy(3)-线性代数

一、方程求解 参考资料 对于Ax b 这种方程&#xff1a; np.linalg.inv(A).dot(B)np.linalg.solve(A,b) 1.1 求解多元一次方程一个直观的例子 # AXB # X A^(-1)*B A np.array([[7, 3, 0, 1], [0, 1, 0, -1], [1, 0, 6, -3], [1, 1, -1, -1]]) B np.array([8, 6, -3, 1]…

Vue - 6( 13000 字 Vue3 入门级教程)

一 &#xff1a;Vue3 1.1 Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-ne…

Android ParcelFileDescriptor实现进程间通信

需求 一个通信通道&#xff0c;实现跨进程的的Socket网络通信。 具体的通信通道的图如下。 需求分析 我们需要一个进程一直做通信通道的事情&#xff0c;业务进程把数据通过进程间通信交给通信进程。通信进程通过Socket通道将数据发给网络另外一端的通信进程。接收端的通信进…

RedisTemplate

3.3.RedisTemplate 在Sentinel集群监管下的Redis主从集群&#xff0c;其节点会因为自动故障转移而发生变化&#xff0c;Redis的客户端必须感知这种变化&#xff0c;及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。 下面&#xff0c;我们…