论文笔记--Learning To Retrieve Prompts for In-Context Learning
论文笔记--Learning To Retrieve Prompts for In-Context Learning
-
1. 文章简介
-
2. 文章导读
-
- 2.1 概括
- 2.2 文章重点技术
-
- 2.2.1 In-Context Learning
- 2.2.2 Prompt Retrieval
- 2.2.3 Efficient Prompt Retrieval(EPR)
-
3. 文章亮点
-
4. 原文传送门
1. 文章简介
- 标题:Learning To Retrieve Prompts for In-Context Learning
- 作者:Rubin O, Herzig J, Berant J
- 日期:2021
- 期刊:arXiv preprint
2. 文章导读
2.1 概括
文章提出了一种新的In-Context Learning的思路。传统的In-Context Learning 获得training samples(训练样本)的方法主要分为两种;1) 基于非监督的相似度方法得到训练样本 2) 训练一个prompt retriever来为模型挑选训练样本。文章认为,我们应当让大语言模型自己去找到训练样本作为prompt去训练。
文章的整体架构如下

2.2 文章重点技术
2.2.1 In-Context Learning
首先简单介绍下In-Context Learning的概念。所谓In-Context,即“上下文”“内”,意指我们要从上下文内部找到合适的prompt进行训练,而非人工定义prompt。传统的In-Context Learning一般会找到和测试样本最相似的一些标记样本作为测试样本的上下文。例如在一个情感分类任务中,测试样本为s=“It is such an awful movie”,传统的预测方法为将s直接输入给模型,模型会预测s的分类,即y\in \{negative, positive\}。In-Context Learing 会首先遍历标注数据集,找到和s最为相似的样本,假设模型找到2个样本对"The movie is awful–>negative", “It is such a terrible movie! -> negative”,则模型的输入为“"The sentiment of ‘The movie is awful’ is negative; The sentiment of ‘It is such a terrible movie!’ is negative; The sentiment of ‘It is such an awful movie’ is ",然后预测下一个token可能时positive还是negative。
2.2.2 Prompt Retrieval
上述步骤中一个重要的技术就是如何找到这些标记样本,即Prompt Retrieval。下图为一个QA问题的Prompt Retrieval示意。

本文希望让语言模型自己筛选出来上述定义的训练样本。具体任务描述如下:给定标记数据集\mathcal{D} = \{(x_i, y_i)\}_{i=1}^n和测试样本x_{test},Prompt Retrieval 的任务就是找到一个训练样本集\mathcal{P} = \{(x_i, y_i)\}_{i=1}^m \subset \mathcal{D}, m \ll n。我们也可以称这个样本集为一种prompt。
2.2.3 Efficient Prompt Retrieval(EPR)
文章提出了一种叫做EPR的训练集检索方法,具体步骤如下
-
候选集生成 :遍历所有的标记样本(x_i, y_i) \in \mathcal{D},我们通过无监督文本相似度判别方法BM25或SBERT得到和每个标记样本最相似的样本集合,作为该样本的候选prompt: \overline{\mathcal{E}}(x, y):=\overline{\mathcal{E}} = \{\overline{e}_1, \dots, \overline{e}_L\}。
-
得分计算 : 文章选定一个语言模型\hat{g}来为每个\overline{\mathcal{E}}中的样本打分:
score(\overline{e}_l) = Prob(y|\overline{e}_l, x)
即给定x及prompt中的一个候选样本score(\overline{e}_l)时,\hat{g}将输出预测为y的概率有多大。这个得分衡量了该候选样本(不考虑prompt中其它样本对情况下)对解码y的帮助有多大。将该得分函数应用于所有的标记样本,对每个样本(x,y)我们定义其正样本集合\mathcal{E}_{pos}为\overline{\mathcal{E}}中得分最高的k个样本,负样本集合\mathcal{E}_{neg}为\overline{\mathcal{E}}中得分最低的k个样本。基于假设“候选集中包含好的和差的prompt”,我们认为得分越高越可能时好的,反之得分越低越差。 -
训练 : 定义两个编码器E_x(\cdot)和E_P(\cdot)分别用来编码输入句子x的分词和prompt(训练样本对的输入-输出拼接在一起)的分词。文中用BERT作为上述两种词向量编码器,并采用每句话的CLS对应的向量作为该句编码。训练的目的是学习到一个相似度度量使得测试样本和产生对应输出的训练样本集尽可能相似。为此,文章采用了对比学习方法,定义损失函数如下
L(x_i, e_i^+, e_{i,1}^-,\dots, e_{i,2B-1}^- ) = -\log \frac{e^{sim(x_i, e_i^+)}}{e^{sim(x_i, e_i^+)} + \sum_{j=1}^{2B-1} e^{sim(x_i, e_{i,j}^-)}}
其中作者采用了in-batch negatives trick ,即给定x_i时,随机从它的正候选样本集合\mathcal{E}^{(i)}_{pos}中抽取一个样本e_i^+,该样本与x_i的相似度要尽可能高:在损失函数中,sim(x_i, e_i^+)越高,损失函数L的值越小;同理随机从它的负候选样本中抽取样本e_{i,1}^-,再随机从和x_i相同Batch(假设batch size为B)的每个样本x_j的负候选样本\mathcal{E}^{(j)}_{neg}中随机挑选一个样本e_{i,j}^-, j=2, 3, \dots, B,从其正候选样本中随机挑选一个样本e_{i,j}^-, j=B+1, B+2, \dots, 2B-1,所有这些样本与x_i的相似度应该尽可能的小,反映在损失函数中即sim(x_i, e_{i,j}^-), \forall j越小,损失函数越小。 -
推断 :给定测试样本x_{test},首先计算其编码E_X(x_{test}),然后找到与其最相似的L个样本\mathcal{P} = \{e_1, \dots, e_L\}。假设语言模型接受的最大长度为C,则我们得到L中相似度最高的L'个样本使得这些样本的长度和\sum_{i=1}^{L'} |e_i| + |x_{test}|+|y'|\le C。最后,模型基于上述L'个样本和x_{test}的拼接值给出预测输出结果。
3. 文章亮点
文章的主要贡献在于“让语言模型自己打分并选择合适的Prompt”。基于该方法,模型在多个任务上的表现均有了大幅的提升。
