微软亚研院副院长周明:从语言智能到代码智能

2024-04-13 21:32

本文主要是介绍微软亚研院副院长周明:从语言智能到代码智能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:智源社区、AI科技评论

本文约4700字,建议阅读10分钟

周明副院长在“语言与智能高峰论坛”讲解从语言智能到代码智能。


11月6日上午,在中国中文信息学会和中国计算机学会联合创办的“语言与智能高峰论坛”上,微软亚洲研究院副院长周明,以《从语言智能到代码智能》为题,介绍了智能代码理解和生成代码的机理、预训练模型(CodeBERT/CodeGPT)、基准数据集(CodeXGLUE)以及融合了编程语言句法和语义信息的新的评价指标(CodeBLEU),分享了微软在编程语言知识和上下文进行推理,支持代码检索、补全、翻译、纠错、问答等场景的应用。

周明,微软亚洲研究院副院长、中国计算机学会副理事长、国际计算语言学会(ACL)前任会长。

1、NLP预训练模型到代码智能预训练模型

自然语言处理在深度学习的支撑下取得了迅猛发展,把自然语言发展的技术迁移到智能代码研究领域,以提升代码能力成为近年来新的研究热点。

代码智能能够让计算机具备理解和生成代码的能力,利用编程的语言知识和上下文进行推理,支持代码检索、代码翻译等场景应用。

图1:基于神经网络的NLP研究(NN-NLP)

图为清华大学唐杰团队总结的过去5年ACL文章中自然语言发展的主要工作,包括 Word embeddings、LSTM、Encode decoder、RNN、Pre-trainedmodel 等,这些技术推动了自然语言的应用,包括基于神经网络的机器翻译,预训练模型演化,阅读理解技术等。

基于以上研究,周明总结了过去5年神经网络自然语言处理具有里程碑意义的工作。

图2:NN-NLP的技术演进

1. Word embedding。

2013年,Mikolov 等提出利用上下文预测中间词或利用中间词来预测上下文。在一个窗口内,根据预测的损失,回传调整 Word embeddings,并通过大规模文本训练,得到了一个相对稳定的 Wordembeddings。Word embeddings 包含词本身的意义、上下文、句法语义等信息的嵌入,相对来讲,它是一个静态表示。

2. Sentence embedding。 

既然词可以做嵌入,那么句子也应该能做嵌入,对句子进行表示的最初考虑是利用 RNN 或 CNN,从词嵌入出发,得到句子的全局表示。

3. Encoder-decoder。

之后,研究者提出 Encoder decoder,以实现不同语言串的输出,比如机器翻译能够将中文语言串,变为英文语言串。Decoder 在产生某个输出时,需要考虑输入各节点权值的影响。

4.Transformer。

RNN 自左到右的并行能力比较弱,只有一个特征抽取器,从多角度来进行特征抽取时,需要引入自注意力机制(Self-attention Mechanism),实现一个词与其他词连接强度的同步计算,而 Multi-header 的多角度抽取特征,为Transformer技术带来很多革命性突破。

5. Pre-trained model。

对大型数据库做 Self-supervised learning,针对大规模语料进行训练,可以得到预训练模型。

预训练模型是把大规模语料中训练的通用语言知识浓缩在一个模型中,该模型是一个词的上下文相关的语义表示,在该模型中对下游任务做 Fine-tuning。所谓 Fine-tuning,是在原有神经网络的基础上,根据具体任务来调整参数,每一个具体任务标注语料,然后针对标注的语料进行训练,训练的损失回传,调整网络,得到一个相对较好的处理器。

图3:预训练模型-自然语言处理的新范式

预训练模型包括预训练和微调(Fine-tuning),可以做纯文本训练,也可以做文本、图像、文本和视频,用成对数据进行处理。

在 Pre-trained model中,需要一个自监督学习策略 Autoregressive language model (自回归语言模型)和 Auto encoder (解码自动编码器)做单语言、多语言或多模态,支持多种自然语言任务,包括分类、序列标注、结构预测、序列生成。

Self-supervise learning 可以利用数据的自然特点,不需要人工进行标注就可以进行训练和学习。Auto-encoding 可以对词或者句子进行覆盖或调整,让模型来猜测原来的词或原来的词序,其错误率可以调整网络。

图4:自监督学习的预训练

关于为什么做预训练模型,周明进行了以下总结:

1. 预训练模型嵌入了与任务无关的常识。对语法知识和语义知识进行了隐式编码。

2. 预训练模型将学习到的知识转移到下游任务中,包括低资源注释任务和语言的任务。

3. 预训练模型几乎支持所有的 NLP 任务,且都具有 SOTA 效果。驱使研究者利用自然训练的迁移模型,来支持所有的自然语言任务。

4. 为各种应用程序提供可扩展的解决方案。只需通过特定任务的标签数据微调支持新任务。


图5:语言、视觉及其他方面的预训练模型发展趋势

图6:微软预训练模型的主要应用

预训练模型近几年的研究进展:

1. 出现具有 SOTA 性能的大型模型(例如,Turing 17B;GPT-3 175B;GShard 600B)。

2. 预训练的方法和模型不断创新,新的预训练任务、屏蔽策略和网络结构出现。

3. 从单一语言到多语言,到多模式(图像、视频、音频),再到编程语言,不断拓展,把迁移学习的模型更广泛的运用到新的任务中。 

4. 可满足实际需要的小型经济模型(例如模型压缩,知识提炼等)。

报告中,周明介绍了几类预训练语言模型。

1. UniLM

BERT 和GPT 都是从左到右的语言模型,GPT 适合做生成,BERT 适合做理解,而UniLM 可以把两个任务同时融入,通过引入 Sequence to Sequence 的语言模型,在预测词时做多任务学习,通过Mask矩阵来控制词和词的连接,用一个统一架构,通过多任务学习得到 UniLM,该模型兼具分析生成和 Encoder decoder 工作。

图7:UniLM

2. Unicoder

与经典的多元预训练模型相比,Unicoder 通过引入新任务 Constructive Learning (构造性学习)来预测两个词之间是否构成互译或者两个短语或句子之间是否构成互译,比如中英文句子的互译,该任务使预训练水平有所提高。

图8:Unicoder

3. Unicoder和Unicoder-VL

针对 Unicoder 只能做分析或理解,研究者引入了 Unicoder-VL 进行生成,利用对输入句子加入噪声,比如颠倒词序,或加、减词做 Encode,并在 Decode 时试图恢复所破坏的部分,测试模型的整体能力,之后,研究者将预训练模型继续扩展到图像和视频任务中,并构建模型 Unicoder-VLfor Images 和 Unicoder-VL for Videos。

图9:Unicoder-VL for Images

图10:Unicoder-VL for Videos

4. LayoutLM

LayoutLM 是 Document 的训练模型, 该模型考虑了分布信息。用 OCR 扫描文档,扫描结果加每一个识别对象的位置信息作为输入,得到 OCR 的结果,每个结果的位置信息,和对应文档的预训练模型,使用时,将预训练模型加图像的部分融入,做各项文档识别和信息抽取的任务。

图11:LayoutLM: Text Layout Pre-training

预训练模型的应用包括问答、多语言问答、文本理解和视频章节提取等。

图12:预训练模型的应用

为促进预训练模型发展,微软发布数据集 XGLUE,该数据集覆盖十几种语言,包含几十个任务。

图13:数据集XGLUE

2、如何用预训练模型做代码智能

从Excel的智能化操作,到自然语言查询转换为 SQL 的数据库操作,再到 GPT-3 自动生成代码,代码智能的实际应用在不断革新和扩大。那么,用预训练模型如何做代码智能?

1. 将代码特点融入预训练模型

通过将代码融入预训练模型,用代码训练 BERT,得到包含代码的预训练模型;通过融入有文本注释的代码进一步训练模型,可以得到具有代码和文本的 CodeBERT。

此外,代码具有结构,代码之间的变量有顺序关系,需要抽取变量之间的依赖关系或相同关系来构建模型,对于给定的代码,可以用程序包得到代码对应的抽象语法树(AST),将抓取的代码特点融入模型,训练建立新的具有代码结构的 CodeBERT。

CodeBERT是一个可处理双模态数据的新预训练模型,使用了 Transformer 作为基本网络结构,采用混合目标函数:掩码语言模型和替换 Token 检测。

图14:CodeBERT——Pre-Train with Code

图15:CodeBERT:Pre-Train with code + Text

图16:CodeBERT——Pre-Train with Code + Text + Structure

同样,可以通过已有的GPT模型训练得到 CodeGPT。

图17:CodeGPT

基于以上模型,进行代码智能的实验,构建Fine-tuning框架。该框架中,CodeBERT主要用于分析,而codeGPT用于生成,Encoder Decoder 用于实现不同语言串之间的转化,其中Encoder部分可以利用CodeBERT进行初始化。

代码智能的下游任务包括代码搜索(Code Search)、代码完成(Code Completion)、代码修复(Code Repair)和代码翻译(Code Translation)等,实验发现,代码智能在自然语言代码检索、修复,文档生成、翻译等任务上均取得了 SOTA 效果。

图18:Fine-tuning框架

2. 发布数据集CodeXGLUE

为了支持代码智能的研究,研究人员发布了数据集 CodeXGLUE。该数据集包括14个子数据集,用于10个多样化的代码智能任务,包括 Code-Code、Text-Code、Code-Text 和Text-Text 四大类。

图19:CodeXGLUE

图20:GitHub链接

3. 新的代码评估机制CodeBLEU

代码的评测需要考虑语法和语义问题,周明表示,CodeBLEU 评估机制融合了 N-Gram AST 和 Semantic Dataflow 及其不同权值组合进行评估,相关度测试表明,CodeBLEU性能更好。

图21:CodeBLEU

图22:CodeBLEU实验

周明表示,代码智能的研究更需要考虑代码语言上的特点,需要具有对全局内容进行建模的能力,代码翻译中编码的逻辑特点和代码搜索中复杂和多意图的自然语言理解等目前仍需要进一步改进。

报告最后,周明提出代码智能未来的研究方向:

1. 引入新的训练任务,以更好地表示代码的特征并考虑全局上下文。

2. 通过考虑逻辑、语义、效率、安全性、执行力等提升评估方法(CodeBlue++,更好的模拟代码质量)。

3. 探索类似于 NLP 任务之外的其他代码智能的任务(测试用例生成,用于算法设计的 AI,bNg 检测和修复等)。

4. 呼吁软件工程领域和 NLP 领域之间进行更多的跨学科研究。

3、问答环节

Q1: 高校师生如何进行与预训练有关的研究?

周明: 应从研究的角度探究其方法论,比如知识、领域知识常识、知识图谱等如何融入,在领域知识表达方面,研究能否用小模型做更好的工作,比如模型压缩、知识萃取等。

在Fine-tuning方面也有很多工作可以去做,另外,可以进行扩展应用领域的研究,包括单语言到多语言,甚至到语音、图像、视频、文档等新领域的扩展和跨学科的研究。

Q2: 自动生成的代码的语法规则是硬约束还是自动学习的?怎么保证这种正确性? 

周明:这是做自然语言的人的弱项,我们只知道串对串,串生成完之后用 BLEU 算N-Gram匹配程度。

这里存在一个非常重要的问题,就是如何衡量代码生成的能力和质量,比如,逻辑上是否正确,语义上是否正确,效率是否高,安全性和可执行是否可以,这些目前还没有一个很好的办法来衡量,但在逻辑性、语义、效率等方面,可以进行一些模拟工作。期待今后有更多的人做自动评价生成的代码的逻辑语义和效率问题的研究工作。

Q3: 自然语言处理与语音、图像结合的未来工作前景如何?

周明:自然语言从语音、图像领域借鉴了很多方法,比如,深度学习。自然语言处理研究者提出Transformer和更好的预训练模型。

但我们不应固于自己的思路,应该把一切可序列化的问题,包括单序列化建模、多序列化的互相映射和比较都看作是一种自然语言任务,用自然语言的方法来帮助提高相关领域的技术发展,共同推动人工智能的发展。

Q4: 与语言智能相比,代码智能有什么独特的技术挑战?

周明: 和自然语言相比,代码的书写需要遵循特定的语法规则。自然语言通常本身不可执行,但代码在编译环境下可以执行并返回结果。

因此,和语言智能相比,代码智能无论在数据、建模、评测、应用上都需要更关注代码的语法规则和可执行性。

Q5: 语言学本体在智能方面的发展前景如何?

周明: 近十年,人工智能的蓬勃发展主要得益于大数据、数据驱动的大模型和强算力,但其建模人类本体知识的能力很有限,因此如何结合数据驱动模型(如深度学习)和以知识图谱为代表的本体知识是一个非常有前景的方向。

Q6: 如何保证生成的 code 的正确性,如何测试?

周明:测试 code 的正确性一直是代码生成的一大难点。对于比较独立的、不依赖其它函数或者环境的代码,测试其正确性可以采用人工设计的 Test Case 来实现,但也不能保证通过了这些测试的代码就是正确的。

对于依赖比较多的函数,使用 Test Case 测试比较困难,所以只能通过其它的自动评价的方法,比如跟参考答案完全匹配的准确率,或者N元文法的准确率。我们提出了 CodeBLEU 的评价方法,使用句法树匹配信息和变量依赖关系的匹配信息来逼近生成代码的语义的正确性。

Q7: 程序自身的算法逻辑思想怎么体现?同样的功能,不同的人写的code会不一样,这种自动生成能体现这种特点吗?

周明: 目前的代码理解方法很难直接体现算法的逻辑,已有一些方法在代码理解和生成任务中考虑代码的语法结构(AST)和代码的语义结构(Data Flow)。目前的代码生成系统多是基于大规模数据训练的数据驱动模型,并没有考虑个性化代码生成。

Q8: 代码翻译成不同的语言,框架层面怎么翻译呢?

周明: 框架结构方面的信息对代码翻译是很重要的。CodeBERT 在预训练的过程中考虑了句法(AST)和语义(Data Flow)等结构相关的信息,使用 CodeBERT 初始化的序列到序列转换模型能够对这些结构信息进行建模,从而可以生成框架结构一致的目标语言代码。在代码翻译的研究领域也存在显式的基于代码树和逻辑图进行建模的方法。

Q9: 怎么在NN中解决标识量的作用域问题?

周明: 一种解决标识量作用域的方式是使用数据流分析,该技术也被我们用来做 CodeBERT 模型和 CodeBLEU 指标。数据流分析中,当一个变量离开它的作用域,这个变量就会被标记为 dead,这一定程度上反映了标识量的作用域。


编辑:于腾凯

校对:林亦霖

这篇关于微软亚研院副院长周明:从语言智能到代码智能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901265

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d