0%

Preparing a Review of Code Generation Security

由于基础薄弱,希望调研也能作为笔记来帮助我个人进行复习,我额外记录了一些名词解释、新知识,而不是单独写论文的总结,所以内容可能有点啰嗦。

调研了以下优秀的论文。


[2212.09420] Large Language Models Meet NL2Code: A Survey

Submitted on 19 Dec 2022 (v1), last revised 8 May 2023 (this version, v2). Accepted to the main conference of ACL 2023 (long paper)

  1. 使用的 benchmark: HumanEval。它在 [2107.03374] Evaluating Large Language Models Trained on Code 中提出。递归调研见后。
  2. 总结了成功因素:模型规模大,数据质量和规模优秀,专家调优。
  3. 总结了局限性:理解能力、判断能力、解释能力、适应学习能力、多任务能力。
  4. benchmark 局限性:规模小、侧重于Python和英语描述。

[2107.03374] Evaluating Large Language Models Trained on Code

Submitted on 7 Jul 2021 (v1), last revised 14 Jul 2021 (this version, v2)

  1. 在它之前的评估标准:Bleu: a Method for Automatic Evaluation of Machine Translation - ACL Anthology 提出的 Bleu。递归调研见后。

  2. 提出了 HumanEval benchmark,由 164 个手写的 Python 编程问题组成。评估模型从自然语言生成独立函数的能力。通过对单元测试执行生成的代码来确定正确性。pass@k 代表在模型生成的 k 个样本中,至少由一个样本在功能上是正确的概率,

    n 为生成总数,c 为正确的代码。此外采用 nucleus sampling 核采样,它按概率从最可能的 token 中采样,直到累计概率达到 top_p = 0.95。对于温度参数,pass@1 使用 T = 0.2,pass@100 使用 T = 0.8。较高的温度对于较大的 k 是最佳的。

    在 softmax 中用温度参数 T:

    $z_i$ 是模型对第 i 个词的 logits。

  3. 提出了 Codex,它从 GPT 语言模型微调 12B 参数而来。12B、300M 参数的 Codex 在 HumanEval 上比 6B 参数的 GPT-J 点数高。GPT-J 递归调研见后。
    当限制为每个问题一次评估时,使用 Codex 生成的平均对数概率最高的样本的收益显著。
    因为代码分布与语言分布不同,所以添加了一组额外的 token 来表示不同长度的空格。可以少用约 30% tokens 表示代码。
    局限性:Codex 的训练样本效率不高,因为训练集总计数亿行代码。可能会语法不正确,调用未定义或超出代码库范围的函数、变量等。Codex 很难解析越来越长、越来越高级别或系统级的规范。使用不安全的代码。Misalignment。


[2105.09938] Measuring Coding Challenge Competence With APPS

Submitted on 20 May 2021 (v1), last revised 8 Nov 2021 (this version, v3), NeurIPS 2021.

  1. 提出了benchmark: APPS。包含10,000个来自竞技编程平台的Python编程问题。通过针对综合测试套件执行生成的代码来评估其正确性。
  2. Metrics有测试用例平均通过率 test case average、严格准确率 Strict Accuracy。

Bleu: a Method for Automatic Evaluation of Machine Translation - ACL Anthology

ACL 2002

Bleu 是一个评价指标 metric,用来评价机器翻译。它统计 n-gram 的匹配程度来衡量相似度。对 Candidate 中出现的 n-gram,看有多少 n-gram 也出现在 Reference 中。为了防止重复“The”等高频词,引入 clip,每个 n-gram 匹配次数不能超过它在参考译文中出现的次数。如果有多个句子,就逐句计算 n-gram 的匹配情况,得分为其相加除以候选 n-gram 的总数。用几何平均来组合多阶 n-gram,防止1-gram 权重过高。Bleu 也会惩罚短句。


[2203.07814] Competition-Level Code Generation with AlphaCode

Submitted on 8 Feb 2022

  1. 模型用的 encoder-decoder 架构。发现使用浅 encoder + 深 decoder 可以显著提高训练效率,同时不降低解题成功率。

  2. 微调:

    1. Value conditioning:微调时,在题目描述中加入该提交是否正确的信息。采样时,模型以提交正确为条件。我的理解:利用错误数据作为负样本增强模型判断能力。

    2. Value prediction:用 decoder 最后一层的 token 表示再经过一个小型 Transformer,预测该提交是否正确。采样时不使用。我的理解:提高模型理解正确性的能力。

    3. Tempering。

    4. 使用 GOLD:解决竞赛编程问题是多解任务。数据集中解决方案数量比题目描述多。标准的最大似然目标会通过对训练集中的每个解决方案赋予一定权重来最小化损失(我的理解:MLE 鼓励模型生成覆盖更过解的平均解),类似召回率 recall(分类任务中,召回率 = 找到的正样本 / 总正样本),而我们关注模型是否能在给定的提交尝试次数内找到一个正确解。所以采用 GOLD:让模型

      1. 从自己已经赋予高概率的 token 中学习;
      2. 忽略那些不在自身分布中的 token(即模型认为不太可能的 token),专注于精确生成正确解。

      方法:GOLD 的 δ-reward 变体,在标准 MLE 梯度上添加离策略(off-policy)重要性权重,对高概率 token 放大梯度,对低概率 token 减小梯度。:

      1. s 是解决方案中的 token。
      2. $\nabla \log P_\theta(s)$ 是普通 MLE 的梯度。
      3. 乘以 $P_\theta(s)$ 权重,token 原本概率高 → 权重大 → 强化它,反之忽略它。论文中替换为 $\max(P_\theta(s)^\alpha, \beta)$,α=1/2,β=0.05,我的理解是防止梯度爆炸或消失。

      效果就是模型专注在高概率 token 上,更容易生成至少一个正确解。
      预训练和微调之间增加了一个简短的训练阶段用回火不用 GOLD。初始预训练分布过渡到更平滑的分布。我的理解是避免初期 GOLD 过度选择。


GPT-J kingoflolz/mesh-transformer-jax: Model parallel transformers in JAX and Haiku

GPT-3 的开源替代品。GPT-J 代码生成表现很好,可能与训练集有关:EleutherAI/the-pile 有代码相关的内容。


[2308.07124] OctoPack: Instruction Tuning Code Large Language Models

Submitted on 14 Aug 2023 (v1), last revised 18 Feb 2024 (this version, v2)

  1. 以前的指令微调代码LLM通常依赖于由闭源模型生成的合成数据。比如调用 OpenAI 的 API。这依赖法律、存在更强模型、更强模型的环境相关。以前的代码LLM通过代码注释的方式间接接受指令生成代码。
  2. 名词:指令微调(Instruction Tuning)是在预训练语言模型的基础上,使用一批“指令—响应(instruction–response)”示例进行监督微调(Supervised Fine-Tuning, SFT),使模型能按照自然语言指令完成各种任务。
  3. 评测了四种数据集,用其中的 COMMITPACK(作者创建的) 和 OASST 进行指令微调,得到了他们性能最好的模型OCTOCODER。
  4. 创建的新 benchmark:HUMANEVALPACK。三类任务(代码生成、代码修复、代码解释)六种语言(Python、JavaScript、Java、Go、C++、Rust)
  5. CommitPack 的构建:Git 的提交和提交信息自然就是一个代码指令数据集。CommitPack 精炼为 CommitPackFT。

[2307.15370] Private-Library-Oriented Code Generation with Large Language Models

Submitted on 28 Jul 2023

  1. 以往预训练时,LLM 没法接触私有库代码。没有现有的基准评估 LLM 面向私有库的代码生成。
  2. 开创 APIFinder 用于从文档中检索相关 API 信息,采用双编码器密集检索架构,使用两个BERT-base模型,分别处理编程问题描述、API 信息。APICoder 用于利用检索到的 API 生成代码,两种方法,一种通过将检索到的API信息整合到提示中并使用现有模型,另一种CODEGENAPI通过对CODEGEN进行持续预训练,使用API增强的代码示例创建增强版本。
    CODEGEN 递归调研见后。
  3. 创建了四个私有库基准测试:TorchDataEval、TorchDataComplexEval、MonkeyEval 和 BeatNumEval。

[2203.13474] CodeGen: An Open Large Language Model for Code with Multi-Turn Program Synthesis

Submitted on 25 Mar 2022 (v1), last revised 27 Feb 2023 (this version, v5)

  1. 模型在三个数据集上进行顺序训练:自然语言(The Pile)、多语言代码(BIGQUERY)和单语言Python代码(BIGPYTHON)
  2. 将复杂的编程任务分解为与模型的多轮交互。

[2201.11903] Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

Submitted on 28 Jan 2022 (v1), last revised 10 Jan 2023 (this version, v6)
NeurIPS 2022

  1. 思维链开山之作。CoT prompt无需任何微调或架构更改即可显著提高大型语言模型的推理能力。

[2307.08220] FRANC: A Lightweight Framework for High-Quality Code Generation

Submitted on 17 Jul 2023 (v1), last revised 28 Aug 2024 (this version, v2)

  1. LLM 生成的代码有漏洞错误。重新训练或微调 LLM 成本高。
  2. FRANC 是一个框架,实现了一个五阶段管道,可以过滤、排序和修复LLM生成的代码输出。

[2305.04032] ToolCoder: Teach Code Generation Models to use API search tools

Submitted on 6 May 2023 (v1), last revised 11 Sep 2023 (this version, v5)

  1. 现有的面向 API 的代码生成模型通常需要针对每个库进行专门训练,泛化能力有限。
  2. 将多样化的 API 搜索资源抽象为一个统一的函数。使用ChatGPT自动创建工具增强的训练数据。用 LoRA 高效微调。

[2302.06527] An Empirical Evaluation of Using Large Language Models for Automated Unit Test Generation

Submitted on 13 Feb 2023 (v1), last revised 11 Dec 2023 (this version, v4)

  1. 开发了 TESTPILOT。它是基于 LLM 的自适应工具,可自动为现有 JavaScript 代码生成单元测试。
  2. 迭代细化过程根据测试验证结果动态修改 prompt。将失败的测试与错误消息一起重新提交给 LLM 进行调试。
  3. 用了 25 个 npm 包进行测试。

[2306.14583] Exploring the Robustness of Large Language Models for Solving Programming Problems

Submitted on 26 Jun 2023

  1. 用 AOJ 的40个Python编程入门问题作为数据集,并根据隐藏测试用例评估功能正确性。
  2. 结合 RLHF 的 LLM 对表面问题格式的鲁棒性显著更高。
  3. 旧型LLM(Codex)依赖变量名和输出字符串等表面线索,表明它们是一种模式匹配和检索机制,而非对问题陈述的深层语义理解。
  4. 我认为有趣的点:作者测试了三种类型的变量名修改:UUID 变量(通用唯一标识符)、打乱的变量(原始名称在意想不到的上下文中使用)、ABC 变量(用 a、b、c 给变量命名)。此测试让 Codex 性能下降。表面它依赖变量名作为解决方案检索的表面线索。

[2305.12865] Automatic Code Summarization via ChatGPT: How Far Are We?

Submitted on 22 May 2023

  1. 评估了 ChatGPT 在 CodeSearchNet Python 数据集上自动代码摘要的零样本性能。
  2. METEOR 分数高,BLEU和ROUGE-L分数较低,表明在没有特定微调的情况下,ChatGPT 在生成词汇对齐但简洁的摘要方面存在挑战。
    陌生的名词:
    METEOR:结合了语义相似性、同义词和词对齐。
    ROUGE-L:基于生成文本和参考文本之间的最长公共子序列。
  3. 陌生的 baseline:
    NCS:基于Transformer的编码器-解码器,带有复制机制
    CodeBERT:为代码摘要进行微调的预训练模型
    CodeT5:当前最先进的代码任务编码器-解码器模型

本文有较多的陌生概念,现在展开递归调研。


METEOR: An Automatic Metric for MT Evaluation with Improved Correlation with Human Judgments - ACL Anthology

ACL 2005

  1. METEOR是一种用于机器翻译评估的自动指标。
  2. 系统翻译和参考翻译之间做单词对单词的映射匹配。
    计算 Precision / Recall / Fmean。
    计算词序惩罚(Penalty)。

ROUGE: A Package for Automatic Evaluation of Summaries - ACL Anthology

ACL 2004

  1. ROUGE 用来衡量机器生成的摘要(candidate summary)与人工写的参考摘要(reference summaries)之间的相似度。
名称 主要思想 衡量什么
ROUGE-N 计算 n-gram 的重叠:匹配的 n-gram 数量 / 参考摘要中 n-gram 总数 词汇层面的匹配
ROUGE-L 基于最长公共子序列 (LCS) 句子层面的顺序匹配
ROUGE-W 给连续匹配更高权重的 LCS “连续片段”匹配的改进版
ROUGE-S 基于 skip-bigram(允许跳词的二元组) 更灵活的词序匹配

CodeBERT: A Pre-Trained Model for Programming and Natural Languages - ACL Anthology

ACL 2020

CodeBERT 是一个 BERT。

训练数据:

数据类型 举例 用途
Bimodal(双模态)数据 “计算平方根” ↔ def sqrt(x): return x ** 0.5 让模型学会 NL↔PL 的语义对应
Unimodal(单模态)数据 只有代码(没有注释) 让模型更好地理解代码结构

训练目标:

  1. Masked Language Modeling。
  2. Replaced Token Detection。模型的任务是判断词到底是原文的还是被替换的。

[2109.00859] CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generation

Submitted on 2 Sep 2021

CodeT5是一个标识符感知的统一预训练 encoder-decoder 模型。

重要:identifier-aware 预训练任务:专门把代码里的 identifier(函数名、变量名等)当作重要信息来学习。预训练方法:Masked Span Prediction、Identifier Tagging、Masked Identifier Prediction。

benchmark:CodeXGLUE。


[2102.04664] CodeXGLUE: A Machine Learning Benchmark Dataset for Code Understanding and Generation

CodeXGLUE 包含 10 个任务和 14 个数据集。

任务分类:代码到代码(包括克隆检测、缺陷检测、预测标记或行、代码修复、编程语言之间翻译)、文本到代码、代码到文本和文本到文本(自然语言文档翻译)。

三个 baseline:CodeBERT、CodeGPT、编码器-解码器(编码器用预训练的 CodeBERT 权重初始化,解码器用随机初始化的 Transformer)


[2112.02969] Jigsaw: Large Language Models meet Program Synthesis

Submitted on 6 Dec 2021

  1. 作者认为存在的问题:预训练语言模型 PTLM 主要将代码视为 token 序列,缺乏对程序结构、类型和执行行为的语义理解。
  2. 提出增强方法:预处理上下文选择(可以包含 API 文档的问答对(我的理解:这似乎就是一种RAG?))、后处理语义验证修复(代码正确性过滤(为不对的/不是预期输出的代码标记为需要修复或拒绝)、转换引用错误的变量名、转换不正确的参数、根据用户反馈进行 AST(抽象语法树) 到 AST 转换)

[2310.04406] Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models

Submitted on 6 Oct 2023 (v1), last revised 6 Jun 2024 (this version, v3)

  1. 语言智能体树搜索(LATS)是一种框架。
  2. 调整蒙特卡洛树搜索以结合外部环境反馈和语言模型驱动自我反思。
  3. 在HumanEval上达到92.7%的Pass@1准确率。
  4. 蒙特卡洛树搜索(MCTS)是一个决策算法,曾被用在 alphaGo 里。我在网上学习了这个算法。

补课(未完):

RLHF、指令微调:

[2203.02155] Training language models to follow instructions with human feedback

Methods_Diagram_light_mode

RLHF 步骤:

  1. 监督微调(SFT):收集人类编写的期望行为示例,并在此数据上对预训练的 GPT-3 模型进行微调。
  2. 奖励模型训练:收集比较数据,其中人类标注者将不同的模型输出从最好到最差进行排序,然后训练一个奖励模型来预测这些人类偏好。
  3. 强化学习优化:使用奖励模型作为奖励函数,通过近端策略优化(PPO)来优化策略。