TransCoder介绍

TransCoder介绍
无监督的代码转换
无监督机器翻译
XLM
字典– BPE
两种预训练
去噪编码和回译
TransCoder三部曲
XLM: 预训练编码器和解码器
Denoising auto-encoding: 训练同语种”翻译”
Back-translation: 训练跨语种翻译
测试集
效果
总结
人工智能如果能写代码的话那可能就是程序员的噩梦了。不过也许人们可以把更多的精力放在真正创造性的工作上去,比如移民火星什么的。Facebook的TransCoder虽然不能解放人类,但是也算朝这个方向迈出了坚实的一步。

无监督的代码转换
这项工作的重点在”无监督”上面。毕竟,如果我们有完美的平行语料,即源语言语料库和对齐的目标语言语料库,那么代码转换(或者代码互翻)可以简单理解为神经机器翻译(NMT)问题,比如英译德,中译英等等。然而现实并不存在这样的完美对齐的代码语料库。

作者用了github上大量的单语料库作为训练集,包括C++, Java, Python,成功实现了它们之间的互译功能。先看下图从Python到C++的效果。翻译模型显然需要能够推断变量的类型,然后才能正确的实现从动态类型语言到静态类型语言的转换。另外模型也照顾到了两种语言里deque包含的不同的方法,python里独有的range等等。这些都是通过无监督的训练实现的,这是怎么做到的?

TransCoder介绍
无监督机器翻译
这个要从无监机器督翻译说起。无监督代码转换(翻译)可以看成是无监督机器翻译的一个子问题,或者一个简化问题。很长一段时间以来人们就在研究语言翻译里的few shots或者zero shots问题,因为小语种的翻译总是受限于稀少的平行语料。这方面出彩的工作包括 XLM,这是Facebook在BERT出现后不久就提出的用来编码多种语言的模型。也包括前面介绍过的多语种句子嵌入,里面有提到了NMT问题和Monolingual语料库在不同任务上共同发力的例子。这里有必要再跑题一下,由于Transcoder利用XLM来预训练单语料模型,我们先简要介绍一下XLM。

XLM
XLM代表Cross-lingual Language Modeling,是一种跨(多)语言模型。对应的,该模型需要一个所有语言共享的字典。

字典– BPE
现在BPE简直成为NLP各种模型的字典标配了,在跨语言模型里更是如此。 优点是它可以有效地帮助不同语言的同形词根对齐,比如英语,德语,法语这些相近的语言。举个例子,英语的Hello和德语的Hallo共享”llo”, 以此为锚点,进一步把词根周围的其他词根对齐,这里英语里的He和德语里的Ha也可以在嵌入空间找到相近的位置。 这个方法的缺点是对于距离比较远的语言,比如英语和汉语,就没有什么作用。在代码翻译领域,很多语言有一些相似或者相同的语法保留词,比如if, for, while,try, int, long 等等,这些非常适合使用BPE。

两种预训练
XLM提出了两种不同的预训练目标。如下图:

TransCoder介绍

这里都是用Transformer来训练,上半部分的MLM大家都熟悉,我就不多介绍了。这里的亮点在于作为输入的语言类型编码(Language embeddings)。因为我们的目的是训练一个多语言共享的编码器,所以有必要在编码端区分不同的语言。(作为对比,我们在多语种句子嵌入看到为了能够制造出多语言的编码器,语言类型在编码器的输入端被刻意隐瞒了,而在解码器一端作为输入的一部分出现。具体方法的选择都是灵活的,取决于希望达到的效果。)
下半部分的TLM是把对齐的两种语言一起放在模型里,本质上仍然是MLM,区别在于这里不是仅对一种语言训练。所以这其实是有监督训练。我们这里可以自动忽略TLM。

TransCoder里用到的,就是上面的这个MLM。

去噪编码和回译
无监督机器翻译有两大技术: Denoising Auto-Encoding和Back-translation。 它们极大的促进了无监督翻译领域的发展。在前面多语种句子嵌入一文我们提到过Back-translation,当时是以Dual Learning的形式介绍的。在MASS: 一统GPT和BERT的Seq to Seq框架一文中,我们曾经提到过Denoising Auto-Encoding。

最早把它们落实在翻译中的研究来自Facebook的Unsupervised Translation of Programming Languages。TransCoder的很多idea都借鉴了它的想法。如果想搞清楚算法的来龙去脉,推荐读这篇文章。简要介绍一下它的做法:

假设我们有两种语言A, B和对应的两个质量还过得去的MT Model,一个是从A到B的翻译模型,一个是从B到A的翻译模型。
这个质量还过得去的机器翻译模型,可以来自字/词典上逐字的翻译,就是我们常说的字译。
Denoising Auto-Encoding: 首先给输入加上干扰,比如随机遮掩,去掉,或者打乱一些词的位置,然后把它传给MT Model,在解码器 这一端重新把正确的代码恢复。也就是说,自己”翻译”自己。两个好处,一是让解码器学会了解码,二是让编码器在面对有噪音的输入时更加robust,从而学到更优的表征。具体参考下图中的左边部分。C(x)代表corrupted版本的x,即加过干扰的输入。
Back-translation: 我们进行两次翻译。利用前两步产生的模型,从A语言翻译到B语言,再从B语言到A语言。这样我们就自动构建了一个”有监督”的数据集,它包括原A语言,和经过两次翻译而产生的A‘。这可以当做信号回传给翻译模型进行训练。参考下图的右半部分。C(y)是noisy translation,指的是用现有翻译模型从A到B产生的句子。它经过再次翻译之后从新回到A语言,产生句子x ^ \hat{x}。

TransCoder介绍
有了以上这些准备,我们终于可以介绍TransCoder了。

TransCoder三部曲
TransCoder是一个seq2seq的架构,即encoder+decoder。它的训练包括了三个步骤。具体见下图,是不是很眼熟?和Unsupervised Translation of Programming Languages这篇文章相比,TransCoder简直是照搬了它的做法,仅是在预训练时用XLM(即图中的Cross-lingual Masked Language Model pretaining)替代了基于字典的模型。

TransCoder介绍

XLM: 预训练编码器和解码器
作者采用XLM来分别预训练编码和解码器。具体方法就是把不同的编程语言语料库放在一起,每次batch选择一种语言,然后使用MLM。这种方法能够产生高质量的跨语言的句子表征。但是这里的解码器还没有学会翻译,这需要以下两步。

Denoising auto-encoding: 训练同语种”翻译”
如图例所示,函数名quicksort被替代成了MASK,piv+1去掉了1, piv-1只保留了-,MT Model负责把噪音输入还原。注意,这里仍然是针对单一编程语言的编码解码。在解码端,我们用一个标志语言的token来作为解码序列的初始值。比如用[PYTHON]来代表第一个token。
这时我们的模型已经可以做翻译了。具体方法是比如在输入Python代码之后,在解码器一段用[C++]来作为第一个初始token引导后续的翻译。翻译的质量取决于模型”跨语言”的能力,就是说,如果编码器能够把一个Python片段和它的对应的C++翻译投影在相近的latent space,那么解码器应该可以给出较好的C++翻译。
这个时候我们的MT Model从来没有进行过真正的语言间的互译,翻译的质量仍然不够。这需要第三步来完成。

Back-translation: 训练跨语种翻译
如图,我们可以进行两次翻译,利用前两步产生的模型,从Python翻译到C++,再从C++到Python。这样我们就自动构建了一个”有监督”的数据集,它包括原Python代码,和经过两次翻译而产生的Python代码。这些可以当做信号来回传给原来的翻译模型。

到此为止算法部分介绍完毕,我们看一下测试数据是如何产生的。

测试集
测试数据来源于很多北美程序员都知道的GeekForGeeks。它收集了很多编程面试题,而且提供了不同语言版本(比如Python
C++, Java)的答案。
下图是一个来自GeekForGeeks的例子。看的出来不同编程语言直接对齐的质量很高。

TransCoder介绍

关于evaluation metrics也很有意思,这里从略。接下来直接看一下效果吧。

效果
不同语言的tokens有效的投影在了一个空间。相似的key words位置非常接近。

TransCoder介绍

互译的例子

TransCoder介绍

TransCoder介绍

总结
澳大利亚联邦银行花了8亿美金5年时间才把COBOL系统迁移完毕。希望未来的TransCoder能够避免这种无聊又浪费的事情重演。我们看到TransCoder的实现过程简直是毫无创新之处,全部来自于过去的研究成果。但是从另一个角度来看,很多令人惊艳的产品都不需要太多自主创新,比如iphone,在它产生之前所有的科技突破已经全部就位了。可是没有人会低估iphone的伟大。同样的,我们应该给TransCoder这样接地气的应用掌声。

TransCoder介绍

VB教程网官网:www.vbjcw.cn
本站所有资源版权均属于原作者所有,仅用于参考学习用,请勿直接商用。
若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
VB教程网 » TransCoder介绍