AI 能匹敌程序员了吗?OpenAI 新研究展​示 NLP 大模型的局限性

2021-08-05 10:11:06 浏览数 (1)

Codex

在一篇新论文中,OpenAI 的研究人员展示了 Codex 的详细信息,它是一种生成软件源代码的深度学习模型。

Codex 可以为 OpenAI 和 GitHub 联合开发的 “AI 配对程序员” 工具 Copilot 提供支持。Copilot 目前以 Beta 测试模式为部分用户提供服务。

这篇论文讲述了了 OpenAI 的科学家重新利用其旗舰语言模型 GPT-3 以创建 Codex 的过程。更重要的是,该论文还阐明了读者可以在多大程度上信任深度学习编程(“数据实战派” 后台留言 “Codex” 可获取论文下载链接)。

“没有免费的午餐” 定理

Codex 由 GPT-3 发展而来,GPT-3 是去年发布的大规模深度学习语言模型。

深度学习模型的复杂性通常通过它们拥有的参数数量来衡量。一般来说,模型的学习能力随着参数数量的增加而增加。GPT-3 带有 1750 亿个参数,比其前身 GPT-2(15 亿个参数)大两个数量级以上。GPT-3 的训练数据超过 600 GB,比 GPT-2 的训练数据集大 50 多倍。

除了规模的大幅扩展之外,GPT-3 的主要创新是 “少样本学习”,即执行未经训练的任务的能力。GPT-3 的论文标题是 “少样本学习语言模型”,它证明扩展语言模型大大提高了与任务无关的少样本学习的性能,有时甚至可以达到现有最先进的微调方法的效果。”

其前提是在一个大的文本语料库上训练一个足够大的模型,它可以匹敌或优于专门用于特定任务的几个模型。

但根据 OpenAI 的新论文,GPT-3 的各种版本都无法解决用于评估 Codex 的任何编码问题。

GPT-3 的训练数据集中没有编码样本,所以我们不能指望它能够编码。但 OpenAI 科学家还测试了 GPT-J,这是一个在 The Pile 上训练的有 60 亿参数的模型,包括一个 800 GB 的数据集,其中包括 95 GB 的 GitHub 和 32 GB 的 StackExchange 数据。GPT-J 解决了 11.4% 的编码问题。Codex 是由 GPT-3 发展来的包含 120 亿参数的一个版本,在 GitHub 的 159 GB 代码示例上进行了微调,解决了 28.8% 的问题。Codex 的单独版本称为 Codex-S,通过监督学习进行了微调,将性能提升到 37.7%(其他 GPT 和 Codex 模型通过无监督学习进行训练)。

Codex 可以解决大量的编码挑战。使用监督学习 (Codex-S) 微调的模型版本进一步提高了性能。

Codex 证明,机器学习仍然受到 “没有免费的午餐” 定理(NFL)的支配,这意味着泛化是以牺牲性能为代价的。也就是说,当机器学习模型旨在解决一个特定问题时,它们会更加准确;但是当他们的问题领域扩大时,它们的表现会下降。

Codex 能够以较差的自然语言处理能力为代价,高精度地执行一项专门任务(将函数描述和特征转换为源代码)。另一方面,GPT-3 是一种通用语言模型,可以生成关于许多主题(包括复杂的编程概念)的得体文本,但不能编写代码。

规模与成本

OpenAI 的研究人员表明,Codex 的性能随着他们增加机器学习模型的大小而提高。在 3 亿个参数下,Codex 解决了 13.2% 的评估问题,而 120 亿个参数模型的性能则为 28.8%。

完整版的 GPT-3 有 1750 亿个参数,比用于创建 Codex 的参数大了整整一个数量级。在 Codex 上训练更大的模型不会产生更好的结果吗?

参数体量停留在 120 亿的一个可能原因可能是数据集大小。更大的 Codex 模型需要更大的数据集。在 159 GB 的语料库上训练它可能会导致过度拟合,在这种情况下,模型变得非常擅长记忆和排练其训练示例,而在处理新情况时非常糟糕。收集和维护更大的数据集是一个昂贵且耗时的过程。

另一个让人烦恼的问题是 Codex 的成本。除了科学实验之外,Codex 还应该成为未来产品的支柱,该产品应该能够商业化并为实验室带来利润。但是训练和运行包含 1750 亿参数的 GPT-3 模型的高昂成本使其难以成为盈利的商业模型。

相反,经过微调的、相对规模较小的 GPT-3 在损益控制方面更易于管理。

OpenAI 的实验结果表明,Codex 的大小 / 性能比遵循对数标度。这意味着随着模型大小的增加,性能提升会逐渐降低。因此,收集数据,训练和运行更大模型所增加的成本可能抵不上小小的性能提升。

代码生成是一个利润丰厚的市场。鉴于程序员的高时薪,即使每月节省几个小时的编码时间也足以支付 Codex 的订阅费用。在劳动力成本较低的其他领域,从盈亏的角度来看,使用大型语言模型自动执行任务将更具挑战性。

生成与理解代码

需要注意的是,无论 Codex 的输出多么有吸引力,深度学习模型都不懂编程。

与所有其他基于深度学习的语言模型一样,Codex 正在挖掘代码片段之间的统计相关性。

OpenAI 的科学家在他们的论文中承认,Codex “训练样本效率不高”,并且 “即使是经验丰富的开发人员在他们的职业生涯中也不会遇到任何接近这个体量的代码。

他们进一步补充说,“完成计算机科学入门课程的优秀学生预计能够解决比 Codex-12B 更多的问题。”

这里列举论文中一个有趣摘录:“我们从 Codex 中进行采样标记,直到遇到以下停止序列之一:'nclass'、'ndef'、'n#'、'nif' 或 'nprint',否则该模型将继续生成其他功能或语句。”

这意味着 Codex 将无意识地继续生成代码,即使它已经完成了相关任务。

当您想解决重复性强的简单问题时,这是一种非常有效的方案。但是,当您想尝试编写一个大型程序来解决必须分多个步骤解决的问题时,Codex 的局限性就变得很明显了。

OpenAI 的科学家发现,随着函数描述组件数量的增加,模型的性能呈指数下降。

他们认为:“这种行为是人类程序员的少有行为,如果他们可以为长度为 2 的链执行程序,那么他们应该能够正确地为任意长度的链进行操作。”

OpenAI 的 Codex 无法解决需要综合多个组件的编码问题。

进一步暴露 Codex 对程序结构和代码缺乏理解的事实是,它 “可以推荐语法错误或未定义的代码,并且可以调用未定义或代码库范围之外的函数、变量和属性,”。实际上,这意味着在某些情况下,机器学习模型会将之前看到的不同代码段拼接在一起,即使它们不适合在一起。

在他们的论文中,研究人员还讨论了 Codex 中的 “错位” 问题,该模型能够解决特定问题,但也会由于各种各样的错误而不这样做。Codex 可以使用您正在处理的文件的内容作为上下文来生成其输出,但是如果您的代码包含细微的错误(如果您是人类程序员,这很正常),Codex 可能会 “故意” 建议表面上看起来不错但不正确的代码。

错位是一个有趣的现象,需要进一步研究。但 OpenAI 的实验进一步表明,“如果数据、参数和训练时间扩大,错位可能会持续存在,甚至变得更糟”,这可能是将模型大小保持在 120 亿个参数的另一个原因。

如果提示的上下文包含细微的错误,OpenAI 的 Codex 可能会故意犯错误。

负责任地使用和推广人工智能

有观点认为,GitHub 上描述 Copilot 所说的 “AI 匹敌程序员” 是不准确的。

Codex 不是程序员,而且它也不会占用您的工作(如果您是程序员)。编码只是程序员工作的一部分。OpenAI 的科学家观察到,在目前的状态下,Codex “可能会通过提高程序员的生产力在一定程度上降低生产软件的成本”,但它不会取代软件开发人员经常做的其他任务,例如 “与同事协商,编写设计规范,并升级现有的软件堆栈。”

将 Codex 当做程序员也会导致 “过度依赖” 的问题,即程序员盲目地认可模型生成的任何代码,而没有对其进行修改。鉴于 Codex 可能会犯的明显或难以捉摸的的错误,忽视这一威胁可能会带来质量和安全风险。OpenAI 的研究人员在他们的论文中警告说:“安全使用 Codex 等代码生成系统需要人工监督和警惕。”

总的来说,程序员社区的反应表明 Codex 是一个非常有用的工具,可能对软件行业的未来产生巨大影响。同时,考虑到 Copilot 发布的炒作,了解其有害的影响很重要。在这方面,OpenAI 的人们负责任地研究、记录和报告 Codex 的局限和威胁是值得赞扬的。

Reference:

https://bdtechtalks.com/2021/07/15/openai-codex-ai-programming/

0 人点赞