Spaces:
Sleeping
Sleeping
text.py
Browse filesSigned-off-by: Yao, Matrix <matrix.yao@intel.com>
- naacl_demo/main.py +2 -3
- naacl_demo/text.md +9 -9
- naacl_demo/text.py +14 -12
naacl_demo/main.py
CHANGED
@@ -286,9 +286,8 @@ textbox5.align = "center"
|
|
286 |
# Set up layouts and add to document
|
287 |
########################################################################################################################
|
288 |
|
289 |
-
main_body = column(textbox1, patternification, textbox2, advantage_column, textbox3, null_all_figures, textbox4, pattern_all_figures,
|
290 |
-
textbox5, sizing_mode="scale_width")
|
291 |
main_body.align = "center"
|
292 |
|
293 |
curdoc().add_root(main_body)
|
294 |
-
curdoc().title = "
|
|
|
286 |
# Set up layouts and add to document
|
287 |
########################################################################################################################
|
288 |
|
289 |
+
main_body = column(textbox1, patternification, textbox2, advantage_column, textbox3, null_all_figures, textbox4, pattern_all_figures, textbox5, sizing_mode="scale_width")
|
|
|
290 |
main_body.align = "center"
|
291 |
|
292 |
curdoc().add_root(main_body)
|
293 |
+
curdoc().title = "一条提示抵得上多少样本数据?"
|
naacl_demo/text.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
-
|
2 |
|
3 |
-
|
|
|
|
|
4 |
|
5 |
## 提示法
|
6 |
|
@@ -10,7 +12,7 @@
|
|
10 |
|
11 |
这听起来可能很抽象,但这其实恰恰就是人类在实际生活中进行文本推理时所使用的非常自然的方法:例如,学校练习往往以一个文本输入(例如,一篇关于火星的文章)加上一个问题(“火星上有生命吗?”)的形式呈现,并期望你提供一个自然语言的答案(“否”<sup>1</sup>),该答案其实就可以映射到分类任务的某个类别(这里,“否”对应假,“是”对应真,本例就是个二分类问题)。在这种范式中,就像做语法练习一样,我们把特定于任务的数据输入给模型,而模型就像学生一样,需要以固定的方式进行填空。提示法希望能显式利用语言模型中包含的预训练信息,而不是仅以将其隐含表征馈送给线性分类头的方式隐式利用这些信息。
|
12 |
|
13 |
-
以下是 SuperGLUE
|
14 |
|
15 |
![image](mockups/boolqpatterns.png)
|
16 |
|
@@ -18,11 +20,11 @@
|
|
18 |
|
19 |
这样,我们就把通用语言模型转变成了针对特定任务的分类器。这种基于提示的语言模型分类器的用法很多:
|
20 |
|
21 |
-
-
|
22 |
|
23 |
-
- 为了将有监督的任务数据引入模型,我们可以使用反向传播及语言建模中的交叉熵损失目标来微调:将与正确类别相关联的言语器词作为正确预测。 PET 使用了这个方法,T5 也使用了这个目标函数 - 尽管 T5 使用任务前缀来指示任务,而未使用自然语言提示来描述它。
|
24 |
|
25 |
-
- 还有一种方法是使用*潜觉(priming)*,此时,我们需要为当前问题找到若干正确的示例,将其作为原输入文本的前缀一起输入给模型。它没有反向传播,所以永远不会修改语言模型的权重永远;相反,它主要靠在推理时使用注意力机制去利用正确的示例。GPT3 使用了该方法。
|
26 |
|
27 |
- 最后,PET 的方法是使用提示模型预测未标注数据的软标签(或称为伪标签),然后将其作为标签去训练线性分类头。
|
28 |
|
@@ -32,7 +34,7 @@
|
|
32 |
|
33 |
正如我们所看到的,分类头法和提示法都可以用于针对下游任务进行有监督微调。二者的核心区别在于,除了带标注的原始样本外,提示法还给了模型一个用于对特定任务进行粗略描述的句子。从某种意义上说,这句话也是一种监督数据,因为它告诉模型任务的信息,但它在本质上与机器学习中标准的监督数据又截然不同。我们应该如何看待这种新的监督数据?又该如何量化这种方法的“零样本”程度?
|
34 |
|
35 |
-
我们通过在 SuperGLUE 任务和 MNLI 上比较*分类头法*和*提示法*来尝试回答上面的问题。我们使用的具体方法是:对每个任务,我们通过从数据集中选取样本数不断增加的子集,然后在每个子集上使用这两种方法对 `RoBERTa-large` 进行微调,同时其他所有配置保持不变,最后对评估各自的微调模型的性能。为了公平起见,我们先调整基线分类头模型的超参,并使它们的性能达到 SuperGLUE 排行榜中 BERT++ 的性能水平,然后在对应的*提示法*模型中采用相同的超参。
|
36 |
|
37 |
下图绘制了每个任务 <sup>2</sup> 的最终性能(指标随任务而不同)随数据集大小的变化曲线。有了这个图,我们就能够对两种方法在给定任务上达到一定性能水平所需的数据量进行对比。我们将这种差异称为在该性能水平上其中一个方法相对于其他方法的“数据优势”。我们将两种方法都能达到的性能的范围称为*比较窗口*。通过在该范围内进行积分,我们可以获得在某任务上一种方法相对于另一种方法的“平均数据优势”。从图上看,这即是两条曲线所夹区域的的面积除以比较窗口的高度。<sup>3</sup>
|
38 |
|
@@ -77,8 +79,6 @@
|
|
77 |
|
78 |
<sup>2</sup>:眼尖的读者会注意到所有这些曲线都是单调的。我们为每个实验执行了 4 次运行(即对每个任务的每个数据规模,分别各运行分类头法和提示法 4 次,并用得到的模型测试)。为了清楚起见,并且由于两种方法的微调有时都会失败,从而导致负异常值,因此针对每个数据规模我们报告在此数据规模或更小的数据规模下获得的最大性能,我们将其称为*累积最大*聚合。除了减少方差之外,这不会对���告的数据优势产生太大影响,且即使对于非单调曲线,对图形的解读仍然成立。
|
79 |
|
80 |
-
<sup>3</sup>: We treat each metric linearly to calculate advantage; alternatively, we could re-parameterize the y axis for each task. This choice does not have a consistent effect for or against prompting. For example, emphasizing gains close to convergence increases prompting advantage on CB and MNLI but decreases it on COPA or BoolQ.
|
81 |
-
|
82 |
<sup>3</sup>:在计算每个指标的数据优势时,我们为每个数据赋予相同的权重;我们还可以针对每个任务重新参数化 y 轴。这种做法到底是会对提示法相对于分类头法的数据优势起促进作用还是阻碍作用不好说,与数据集相关。举个例子,强调接近收敛时的增益会增加 CB 和 MNLI 上的提示法的数据优势,但会降低 COPA 或 BoolQ 上的优势。
|
83 |
|
84 |
<sup>4</sup>:有趣的是,PET 已经发现提示对该数据集无效
|
|
|
1 |
+
# 一条提示抵得上多少条数据?
|
2 |
|
3 |
+
当前 NLP 应用的主流方法是针对各式各样的特定任务,分别对预训练语言模型的分类头进行微调。随着语言模型变得越来越大,各种替代方法相继涌现,开始叫板在 [BERT](https://arxiv.org/abs/1810.04805)、[UniLM](https://arxiv.org/abs/1905.03197) 以及 [GPT](https://openai.com/research/language-unsupervised) 中广泛使用的分类头法。特别地,GPT-3 向大家普及了提示法,该方法通过自然语言输入来引导预训练语言模型依靠自身解决任务,而不再需要额外的分类头。
|
4 |
+
|
5 |
+
提示很有意思,用户可以通过它向模型提供信息,这与传统的 ML 监督学习有很大不同。在与 [Alexader Rush](http://rush-nlp.com/) 合作的 [NAACL 2021 论文](https://arxiv.org/abs/2103.08493)中,我们研究了基于提示的微调,该方法可用于替代当前标准的有监督微调法,我们的实验表明提示通常比标准方法更有优势,因此该方法很有前途。在分析这种优势时,我们认为提示为模型带来了额外的信息,这促使我们想用数据点这个指标来量化这种优势,也就是说:**提示可以抵多少个数据点?**
|
6 |
|
7 |
## 提示法
|
8 |
|
|
|
12 |
|
13 |
这听起来可能很抽象,但这其实恰恰就是人类在实际生活中进行文本推理时所使用的非常自然的方法:例如,学校练习往往以一个文本输入(例如,一篇关于火星的文章)加上一个问题(“火星上有生命吗?”)的形式呈现,并期望你提供一个自然语言的答案(“否”<sup>1</sup>),该答案其实就可以映射到分类任务的某个类别(这里,“否”对应假,“是”对应真,本例就是个二分类问题)。在这种范式中,就像做语法练习一样,我们把特定于任务的数据输入给模型,而模型就像学生一样,需要以固定的方式进行填空。提示法希望能显式利用语言模型中包含的预训练信息,而不是仅以将其隐含表征馈送给线性分类头的方式隐式利用这些信息。
|
14 |
|
15 |
+
以下是 [SuperGLUE](https://arxiv.org/abs/1905.00537) 中的 [BoolQ](https://arxiv.org/abs/1905.10044) 任务的示例,其题型为判断题,每条数据包括一个文本 <span style="color: #0c593d">passage</span> 及其对应的问题 <span style="color: #031154">question</span> ,其答案为布尔值,要么为真,要么为假。每条数据可以和 <span style="color: #910713">**模板(pattern)**</span> 一起组装成一个文本序列,该序列只有一个需预测的 <span style="color: #ba9004">**掩码词**</span>。预测出该掩码词后,预测词会被一个预设的 *言语器(verbalizer)* 转换为类,也就是说*言语器*负责输出词与类别之间的映射:比较该词被映射为*真*和*假*的概率,如果*真*的概率高,则最终预测为真,反之则为假。
|
16 |
|
17 |
![image](mockups/boolqpatterns.png)
|
18 |
|
|
|
20 |
|
21 |
这样,我们就把通用语言模型转变成了针对特定任务的分类器。这种基于提示的语言模型分类器的用法很多:
|
22 |
|
23 |
+
- 预训练模型中保留的语言建模功能允许它们在没有额外数据的情况下执行,这与**以随机初始化开始因此初始性能也随机**的*线性分类头*模型相反。因此,许多论文将其用于[零样本分类](https://arxiv.org/abs/1912.10165)。
|
24 |
|
25 |
+
- 为了将有监督的任务数据引入模型,我们可以使用反向传播及语言建模中的交叉熵损失目标来微调:将与正确类别相关联的言语器词作为正确预测。 [PET](https://arxiv.org/abs/2001.07676) 使用了这个方法,[T5](https://arxiv.org/abs/1910.10683) 也使用了这个目标函数 - 尽管 T5 使用任务前缀来指示任务,而未使用自然语言提示来描述它。
|
26 |
|
27 |
+
- 还有一种方法是使用*潜觉(priming)*,此时,我们需要为当前问题找到若干正确的示例,将其作为原输入文本的前缀一起输入给模型。它没有反向传播,所以永远不会修改语言模型的权重永远;相反,它主要靠在推理时使用注意力机制去利用正确的示例。[GPT3](https://arxiv.org/abs/2005.14165) 使用了该方法。
|
28 |
|
29 |
- 最后,PET 的方法是使用提示模型预测未标注数据的软标签(或称为伪标签),然后将其作为标签去训练线性分类头。
|
30 |
|
|
|
34 |
|
35 |
正如我们所看到的,分类头法和提示法都可以用于针对下游任务进行有监督微调。二者的核心区别在于,除了带标注的原始样本外,提示法还给了模型一个用于对特定任务进行粗略描述的句子。从某种意义上说,这句话也是一种监督数据,因为它告诉模型任务的信息,但它在本质上与机器学习中标准的监督数据又截然不同。我们应该如何看待这种新的监督数据?又该如何量化这种方法的“零样本”程度?
|
36 |
|
37 |
+
我们通过在 SuperGLUE 任务和 MNLI 上比较*分类头法*和*提示法*来尝试回答上面的问题。我们使用的具体方法是:对每个任务,我们通过从数据集中选取样本数不断增加的子集,然后在每个子集上使用这两种方法对 [`RoBERTa-large`](https://arxiv.org/abs/1907.11692) 进行微调,同时其他所有配置保持不变,最后对评估各自的微调模型的性能。为了公平起见,我们先调整基线分类头模型的超参,并使它们的性能达到 SuperGLUE 排行榜中 BERT++ 的性能水平,然后在对应的*提示法*模型中采用相同的超参。
|
38 |
|
39 |
下图绘制了每个任务 <sup>2</sup> 的最终性能(指标随任务而不同)随数据集大小的变化曲线。有了这个图,我们就能够对两种方法在给定任务上达到一定性能水平所需的数据量进行对比。我们将这种差异称为在该性能水平上其中一个方法相对于其他方法的“数据优势”。我们将两种方法都能达到的性能的范围称为*比较窗口*。通过在该范围内进行积分,我们可以获得在某任务上一种方法相对于另一种方法的“平均数据优势”。从图上看,这即是两条曲线所夹区域的的面积除以比较窗口的高度。<sup>3</sup>
|
40 |
|
|
|
79 |
|
80 |
<sup>2</sup>:眼尖的读者会注意到所有这些曲线都是单调的。我们为每个实验执行了 4 次运行(即对每个任务的每个数据规模,分别各运行分类头法和提示法 4 次,并用得到的模型测试)。为了清楚起见,并且由于两种方法的微调有时都会失败,从而导致负异常值,因此针对每个数据规模我们报告在此数据规模或更小的数据规模下获得的最大性能,我们将其称为*累积最大*聚合。除了减少方差之外,这不会对���告的数据优势产生太大影响,且即使对于非单调曲线,对图形的解读仍然成立。
|
81 |
|
|
|
|
|
82 |
<sup>3</sup>:在计算每个指标的数据优势时,我们为每个数据赋予相同的权重;我们还可以针对每个任务重新参数化 y 轴。这种做法到底是会对提示法相对于分类头法的数据优势起促进作用还是阻碍作用不好说,与数据集相关。举个例子,强调接近收敛时的增益会增加 CB 和 MNLI 上的提示法的数据优势,但会降低 COPA 或 BoolQ 上的优势。
|
83 |
|
84 |
<sup>4</sup>:有趣的是,PET 已经发现提示对该数据集无效
|
naacl_demo/text.py
CHANGED
@@ -1,18 +1,20 @@
|
|
1 |
-
text1 = """<h1 id="how-
|
2 |
<img class='center' style='height: 5em; float: right;' src='https://raw.githubusercontent.com/TevenLeScao/transformer-xl/master/pytorch/assets/avatar_logo_joint.png' alt='avatar'>
|
3 |
-
<h4
|
4 |
-
<h4>Teven Le Scao,
|
5 |
-
<p
|
6 |
-
<p
|
7 |
-
|
8 |
-
<
|
9 |
-
<p
|
10 |
-
<p
|
11 |
-
<p
|
|
|
|
|
12 |
"""
|
13 |
|
14 |
-
text2 = """<h2 id="fine-tuning"
|
15 |
-
<p
|
16 |
<ul>
|
17 |
<li>The preserved language modeling functionality from the pre-trained model allows them to perform without additional data, as opposed to linear classifier <em>heads</em> that are initialized from scratch and always start at random performance. A variety of papers have used this for <a href="https://arxiv.org/abs/1912.10165">zero-shot classification.</a> </li>
|
18 |
<li>In order to incorporate supervised task data, they can use backpropagation with the usual language modeling cross-entropy loss objective: the verbalizer token associated with the correct class then serves as the correct token prediction. This is a component of <a href="https://arxiv.org/abs/2001.07676">PET</a>, and is the objective used by <a href="https://arxiv.org/abs/1910.10683">T5</a> - although T5 uses prefixes to indicate the task rather than describing it with a natural-language prompt. </li>
|
|
|
1 |
+
text1 = """<h1 id="how-many-data-points-is-a-prompt-worth">一条提示抵得上多少条数据?</h1>
|
2 |
<img class='center' style='height: 5em; float: right;' src='https://raw.githubusercontent.com/TevenLeScao/transformer-xl/master/pytorch/assets/avatar_logo_joint.png' alt='avatar'>
|
3 |
+
<h4>发表于 2021 年 4 月 6 日</h4>
|
4 |
+
<h4>Teven Le Scao, Hugging Face 研究员 • <a href="https://twitter.com/Fluke_Ellington">@Fluke_Ellington</a> </h4>
|
5 |
+
<p>当前 NLP 应用的主流方法是针对各式各样的特定任务,分别对预训练语言模型的分类头进行微调。随着语言模型变得越来越大,各种替代方法相继涌现,开始叫板在 <a href="https://arxiv.org/abs/1810.04805">BERT</a>、<a href="https://arxiv.org/abs/1905.03197">UniLM</a> 以及 <a href="https://openai.com/research/language-unsupervised">GPT</a> 中广泛使用的分类头法。特别地,GPT-3 向大家普及了提��法,该方法通过自然语言输入来引导预训练语言模型依靠自身解决任务,而不再需要额外的分类头。</p>
|
6 |
+
<p>提示很有意思,用户可以通过它向模型提供信息,这与传统的 ML 监督学习有很大不同。在与 <a href="http://rush-nlp.com/">Sasha Rush</a> 合作的 NAACL 2021 <a href="https://arxiv.org/abs/2103.08493">论文</a>中,我们研究了基于提示的微调,该方法可用于替代当前标准的有监督微调法,我们的实验表明提示通常比标准方法更有优势,因此该方法很有前途。在分析这种优势时,我们认为提示为模型带来了额外的信息,这促使我们想用数据点这个指标来量化这种优势,也就是说:<strong>一个提示可以抵多少条数据?</strong> </p>
|
7 |
+
|
8 |
+
<h2 id="prompting">提示法</h2>
|
9 |
+
<p>为了使预训练语言模型能够完成特定任务,当前的主流方法是用随机初始化的线性分类头替换原模型的最后一层:词预测层。然后使用有监督的任务数据通过反向传播来训练修改后的模型,主要学习这个新分类头的权重,同时也可以更新模型其他层的权重。我们将这种方法称为<em>分类头</em>法。</p>
|
10 |
+
<p>一种与之相竞争的方法是*提示法*:这类方法主要尝试使用原语言模型来预测目标类相应的单词来“回答”分类问题,而不是像传统方法那样“预测”类标签。这使得我们可以直接使用语言模型本身来执行分类任务。在这里,*提示*就是精心设计的、用于生成所需的答案文本的输入文本。</p>
|
11 |
+
<p id="footnote1back">这听起来可能很抽象,但这其实恰恰就是人类在实际生活中进行文本推理时所使用的非常自然的方法:例如,学校练习往往以一个文本输入(例如,一篇关于火星的文章)加上一个问题("火星上有生命吗?")的形式呈现,并期望你提供一个自然语言的答案("否"<a href="#footnote1"><sup>1</sup></a>),该答案其实就可以映射到分类任务的某个类别(这里,"否"对应<code>假</code>,"是"对应<code>真</code>,本例就是个二分类问题)。在这种范式中,就像做语法练习一样,我们把特定于任务的数据输入给模型,而模型就像学生一样,需要以固定的方式进行填空。提示法希望能显式利用语言模型中包含的预训练信息,而不是仅以将其隐含表征馈送给线性分类头的方式隐式利用这些信息。</p>
|
12 |
+
<p>以下是 <a href="https://arxiv.org/abs/1905.00537">SuperGLUE</a> 中的 <a href="https://arxiv.org/abs/1905.10044">BoolQ</a> 任务的示例,其题型为判断题,每条数据包括一个文本 <span style="color: #0c593d">passage</span> 及其对应的问题 <span style="color: #031154">question</span> ,其答案为布尔值,要么为真,要么为假。每条数据可以和 <span style="color: #910713">**模板(pattern)**</span> 一起组装成一个文本序列,该序列只有一个需预测的 <span style="color: #ba9004"><strong>掩码词</strong></span>。预测出该掩码词后,预测词会被一个预设的 <em>言语器(verbalizer)</em> 转换为类,也就是说<em>言语器</em>负责输出词与类别之间的映射:比较该词被映射为<em>是</em>和<em>否</em>的概率,如果<em>是</em>的概率高,则最终预测为<code>真</code>,反之则为<code>假</code>。
|
13 |
+
</p>
|
14 |
"""
|
15 |
|
16 |
+
text2 = """<h2 id="fine-tuning">微调</h2>
|
17 |
+
<p>这样,我们就把通用语言模型转变成了针对特定任务的分类器。这种基于提示的语言模型分类器的用法很多: </p>
|
18 |
<ul>
|
19 |
<li>The preserved language modeling functionality from the pre-trained model allows them to perform without additional data, as opposed to linear classifier <em>heads</em> that are initialized from scratch and always start at random performance. A variety of papers have used this for <a href="https://arxiv.org/abs/1912.10165">zero-shot classification.</a> </li>
|
20 |
<li>In order to incorporate supervised task data, they can use backpropagation with the usual language modeling cross-entropy loss objective: the verbalizer token associated with the correct class then serves as the correct token prediction. This is a component of <a href="https://arxiv.org/abs/2001.07676">PET</a>, and is the objective used by <a href="https://arxiv.org/abs/1910.10683">T5</a> - although T5 uses prefixes to indicate the task rather than describing it with a natural-language prompt. </li>
|