返回介绍

数学基础

统计学习

深度学习

工具

Scala

1.2 Single-Turn Evaluation

发布于 2023-07-17 23:38:23 字数 20143 浏览 0 评论 0 收藏 0

  1. 我们首先使用一个现有的 program synthesis benchmark 来评估我们的 CODEGENHumanEval (MIT license)HumanEval 包含 164 个手写的 Python 编程问题。每个问题都提供了一个 prompt ,包括要生成的函数的描述、函数签名、以及断言形式的测试用例。模型需要根据 prompt 完成一个函数,使其能够通过所有提供的测试用例,从而通过功能正确性functional correctness 来衡量性能。由于用户的意图是在一个 prompt 中指定的,并仅仅提示模型一次,我们将 HumanEval 上的评价视为 single-turn evaluation,以区别于我们在下一节介绍的 multi-turn evaluation 。遵循 《Evaluating large language models trained on code》 的做法,我们使用 top-p 的核采样 nucleus sampling ,其中p=0.95$ p=0.95 $ 。

    人类日常生活中交流的词语并不是语言模型中概率最大的词语,而 Beam Search 会总会选择最符合语言模型的单词,因此生成的文本没有新意。为了解决这个问题,最简单的方法就是引入 top-k sampling:每次解码的时候不是选择概率最大的单词,而是根据单词的输出概率进行采样。然而,k$ k $ 的选择是个难点。

    为此,nucleus sampling 换一个思路:给定一个概率阈值p$ p $ ,从候选单词集合中选择一个最小的集合Vp$ \mathbb V_p $ ,使得这些单词出现的概率之和大于等于p$ p $ ,然后再对Vp$ \mathbb V_p $ 中的单词的概率做一次缩放使得它们出现的概率之和为 1 ,最后仅对Vp$ \mathbb V_p $ 中的单词进行解码。

1.2.1 实验比较

  1. baseline:我们将我们的模型与 Codex 模型( 《Evaluating large language models trained on code》 )进行了比较,后者展示了 HumanEvalSOTA 的性能。此外,我们的模型还与开源的大型语言模型 GPT-NEOGPT-J 进行比较。这些模型是在 THEPILE上训练的,因此在训练数据和模型大小方面与我们的 CODEGEN-NL模型相似。

  2. 评估方法:所有的模型都是在温度t{0.2,0.6,0.8}$ t\in \{0.2, 0.6, 0.8\} $ 的情况下进行评估的,我们为每个模型计算 pass@k ,其中k{1,10,100}$ k\in \{1,10,100\} $ 。 为了与 Codex 的结果直接比较,我们选择了对每个k$ k $ 产生最佳 pass@k 的温度。

    我们使用 Codex 提出的 unbiased estimator 来计算 pass@k 。对每个任务,采样nk$ n\ge k $ 个样本。具体而言,我们选择n=200$ n=200 $ 、k100$ k\le 100 $ 。假设c$ c $ 为通过所有单元测试的样本的数量(即,correct samples),那么 unbiased estimator 定义为:

    (1)pass@k=EProblems[1CnckCnk]

    Cnk$ C_n^k $ 表示在所有的n$ n $ 个样本中选择k$ k $ 个结果;Cnck$ C_{n-c}^k $ 表示错误的nc$ n-c $ 个样本中选择k$ k $ 个结果。k$ k $ 为测试用例的数量。

    直接计算这个 estimator 在数值上是不稳定的。我们使用 Codex 引入的数值稳定的 numpy implementation

    在评估模型输出和预期输出之间的 equivalence 之前,我们进行以下 type-relaxation

    • numpy 数组转换为相应的标准类型的Python list (例如,np.int32 被转换为 int )。

    • pandas series 被转换并以 numpy array 格式进行比较。

    • 剩余的情况,模型输出被 castgold standard output 的数据类型。

    • 浮点数的比较中,采用ϵ=106$ \epsilon = 10^{-6} $ 作为阈值。

  3. HumanEval 的表现随着 model sizedata sizescale :我们的模型和 baseline 的结果总结在下表中。可以看到:

    • 我们的 CODEGEN-NL模型(350M, 2.7B, 6.1B)的表现优于或与对应规模的 GPT-NEOGPT-J 模型相当。

    • 在多语言编程语言数据(BIGQUERY)上进一步训练CODEGEN-NL,可以得到 CODEGEN-MULTI 。多语言 CODEGEN 模型的表现远远超过了在 THEPILE 上训练的模型(GPT-NEO, GPT-J, CODEGEN-NL )。

    • 然后,我们在 Python 数据集(BIGPYTHON)上对 CODEGEN-MULTI 进行了微调,形成了 CODEGEN-MONOprogram synthesis 能力得到了大幅提高。因此,Pythonprogram synthesis 能力随着 Python 训练数据量的增加而增强。

    • 对于几乎所有的模型,正如预期的那样,增加模型的规模可以提高整体性能。

    • 与目前 SOTA 的模型 Codex 相比,我们的 Python-monolingual CODEGEN 模型的性能具有竞争力或有所提高。

      • k=100$ k=100 $ 时,CODEGEN-MONO 2.7B 的性能低于 CODEX 2.5B ,但当k{1,10}$ k\in \{1,10\} $ 时,则优于 CODEX 2.5B

      • 我们的 CODEGENMONO 6.1B 展示了接近表现最好的 CodexCODEX 12B )的 pass@k 分数,虽然我们的 CODEGEN-MONO 6.1B 只有CODEX 12B 一半的规模。

      • 我们最大的模型 CODEGEN-MONO 16.1B 具有竞争力,或者在某些k$ k $ 的情况下超越了 CODEX 12B

1.2.2 用户意图理解

  1. 困惑度计算:给定一个问题,假设{pi}i=1n$ \{p_i\}_{i=1}^n $ 为该问题的一组 prompt{si}i=1n$ \{s_i\}_{i=1}^n $ 是模型Pθ$ P_\theta $ 合成的n$ n $ 个子程序,m$ m $ 为所有 prompt 集合{pi}i=1n$ \{p_i\}_{i=1}^n $ 包含的所有 token 的总数。

    • multi-turn prompt 的困惑度:令ci1=[p1;s1;;pi1;si1]$ c_{i-1} = [p_1;s_1;\cdots;p_{i-1};s_{i-1}] $ ,其中[;]$ [\cdot;\cdot] $ 为拼接操作。那么生成 promptpi$ p_i $ 的条件概率为:Probi=Pθ(pici1)$ \text{Prob}_i = P_{\theta}(p_i\mid c_{i-1}) $ 。则 multi-turn prompt 的困惑度为:

      (2)PPLmulti-trun=exp(1mi=1nlogProbi)
    • single-turn prompt 的困惑度:令c=[p1;s1;;pn;sn]$ c=[p_1;s_1;\cdots;p_{n};s_{n}] $ ,那么该文本序列被生成的概率为Prob=Pθ(c)$ \text{Prob} = P_\theta(c) $ 。那么 single-turn prompt 的困惑度为:

      (3)PPLsingle-trun=exp(1mlogProb)
  2. 更好的用户意图理解产生更好的 synthesized program :一个program synthesis 系统的成功高度依赖于它对用户意图的理解程度。当系统以语言模型为基础时,problem prompt 的困惑度perplexity 可以代表系统对用户意图规范user intent specification 的理解。给定一个模型,意图规范的低困惑度表明:该意图规范与模型从训练数据中学到的知识是兼容的。我们研究了是否更好的 prompt 理解(以更低的 prompt 困惑度来衡量)会导致 functionally 更准确的程序。

    我们将所有问题划分为pass 、以及non-pass :一个pass problem 是指 200 个采样的结果中,至少有一个样本通过了所有的测试用例;而对于non-pass problem200 个采样的结果中没有一个通过所有的测试用例。我们根据 CODEGEN-MONO 模型的样本,计算出个pass problemnon-pass problemproblem prompt 的平均困惑度。结果如下表所示。pass problempromptnon-pass problemprompt 具有更低的困惑度。 这一发现意味着,当用户的意图规范被模型更好地理解时,program synthesis 更容易成功。

    事实上,一些训练数据包含自然语言注释和程序的交错序列,其中注释描述了紧接着的程序的功能。因此我们推测,类似于这种模式的用户意图规范会被模型更好地理解,从而导致更好的 program synthesis 。受这种模式的启发,我们提出在 multiple turns 中指定用户意图,这样模型就能一次关注 partial problem ,这将使模型更容易理解用户意图。

    此外,CODEGEN-NLCODEGEN-MULTI 的困惑度结果:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文