AlphaCode论文精读

        论文标题:《Competition-Level Code Generation withAlphaCode》

        下载地址:https://storage.googleapis.com/deepmind-media/AlphaCode/competition_level_code_generation_with_alphacode.pdf

        DeepMind 发表于2022年2月19号

        AlphaCode在OpenAI的CodeX工作的基础上前进了一大步,运行有更长的文档,并且能生成更复杂的文档

摘要

        现在的工作只是将简单的描述或指令转换成代码,并不能理解并完成真的很复杂并没有见过的问题,比如程序竞赛,作者提出的AlphaCode在最近的Codeforces竞赛中能打败54.3%的对手(5000多参赛选手)

        工作的核心:

        1)有一个很好的数据集

        2)有一个简单有效地基于transformer的架构

        3)需要有一个高效的采样方法,能够生成大量的候选答案

导言

        AlphaCode性能与Codex差不多,但能解决更难更复杂的问题,比如在编程竞赛中能取得还算不错的成绩

程序竞赛

        题目:给定一段题目介绍和题目限制(时间复杂度和空间复杂度以及输出格式),并给予一些测试样例,写出问题所需的代码

        怎么评估模型:

                n@k:采样k个输出算法,并对其排序,若前n(n

数据集

        预训练数据集:收集了github上的主流语言代码,并做了简单过滤,总计715.1GB

        微调数据集:CodeContest数据集:主要来自Codeforces。

        如果不为数据集生成额外的测试样例,那么很有可能出现通过测试,但实际是错误或超时的算法

模型

        基于标准transformer架构(包括编码器和解码器),并做了一些改动:

                1)k和v使用同一个投影矩阵,而不是多头,降低计算量

                2)解码器层数比编码器高大约6倍,因为关键在于生成代码

                3)非对称机制:编码器输入长度1536 token,解码器输入长度768,因为生成的代码通常比问题描述短

                4)tokenization使用SentencePiece(8000个 tokens)

预训练:由于资源有限,训练最大的模型,训练的token数比上一个模型还少

微调:

        1)使用Tempering,相对采样的文本长度较长,所以使用一个小一点的温度(0.2)作为超参

        2)数据集中问题有多个解,有对的,也有不对,保留不对的解也有一定的好处,但对于不对的解增加判别方法

                在输入前面加入前置:CORRECT SOLUTION

                加入一个新的目标损失函数,判断当前解释正解还是错误解

        3)GOLD

        模型只需要找到一个正确的解,而不需要把所有的解都找出来,但是训练时,问题和某一个解都是一对一放进来的,因此算法就会倾向于把所有正确的解和错误的解都拟合出来,这并没有必要。

        对每一个样本,放置一个权重,如果对于某一个问题,模型对于其中一个正确解的预测已经足够好的情况下,就将权重调高,而将其他的解的权重调低,使用GOLD算法实现(一个离线的增强学习算法)

怎么生成提交的候选:

        1. 生成一半的python,一半的C++

        2. 随机化提示中的一些标签

        3. 使用稍微高一点的温度(0.25或0.12),还是比CodeX低很多

        4. 也尝试了top-k和CodeX中的核采样方法(作者感觉没必要,可能作者生成了成千上万的样本,不在意这些小细节)

从候选中找出正确的解:

        1. 过滤,使用给定的样例来测试候选,只保留正确的输出,可以过滤掉99%的输出,但是还有10%的问题没有任何一个输出能通过给定的测试样例,并且对于一些问题,即使过滤掉了99%的输出,还是会有长百上千的候选

        2. 聚类,训练了一个额外的模型,做同样的预训练,但是微调时去预测测试样例,将生成测试样例放进生成代码的模型中得到输出,根据输出的样例对模型进行聚类,可以认为每一个类代码差不多,在每个类中挑出一个算法,并按类大小进行排序,类最大的那个解作为第一个输出,第二大的类作为第二个输出,以此类推

实验

        模拟比赛下预估的成绩

        不同大小的模型采样不同数量输出的结果

模型越大,采样数越多,效果越好

对比只使用解码器或者标准的多头自注意力架构

预训练模型的影响

使用的trick以及带来的提升

定性分析(能力和局限性)

1. 模型会不会从训练数据中复制代码

人给的答案和生成的答案的代码重合度

2. 是否有很多冗余无用的代码

对于python来说,可以将代码转换到Abstract Syntax Tree (ast) ,再转换回来(没有使用的枝就会被去掉)

3. 对于问题的描述是否很敏感

感觉还不错。简化问题后会提高通过率,但如果将题中的重要部分描述改变以后,模型精度也会降低,说明模型确实真的在理解哪些重要的点

4. 对于元数据的敏感程度

更换tag和难易程度,确实对生成代码有影响

5. 损失是解决率的一个不那么好的近似

影响

跟CodeX差不多

总结

        使用完整的编码器与解码器架构,因为编码器在处理长文本上更加有效一点,如果使用跟GPT一样的纯解码器架构,对于长文本会多付出2-3倍的代价,AlphaCode采样数从10到100万,因而性能差别还是比较巨大。由于采样了更大的解,因此在排序上面使用更多的技术来做优化

        OpenAI选题时选择一个了更加容易产品化的路线,跟github开源的同时发布了产品Copilot

        DeepMind选题反而选择参加程序竞赛,跟产品化相比又比较远了,当然也容易刷头条

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值