TransCoder介绍
人工智能如果能写代码的话那可能就是程序员的噩梦了。不过也许人们可以把更多的精力放在真正创造性的工作上去,比如移民火星什么的。Facebook的TransCoder虽然不能解放人类,但是也算朝这个方向迈出了坚实的一步。
无监督的代码转换
这项工作的重点在"无监督"上面。毕竟,如果我们有完美的平行语料,即源语言语料库和对齐的目标语言语料库,那么代码转换(或者代码互翻)可以简单理解为神经机器翻译(NMT)问题,比如英译德,中译英等等。然而现实并不存在这样的完美对齐的代码语料库。
作者用了github上大量的单语料库作为训练集,包括C++, Java, Python,成功实现了它们之间的互译功能。先看下图从Python到C++的效果。翻译模型显然需要能够推断变量的类型,然后才能正确的实现从动态类型语言到静态类型语言的转换。另外模型也照顾到了两种语言里deque包含的不同的方法,python里独有的range等等。这些都是通过无监督的训练实现的,这是怎么做到的?
无监督机器翻译
这个要从无监机器督翻译说起。无监督代码转换(翻译)可以看成是无监督机器翻译的一个子问题,或者一个简化问题。很长一段时间以来人们就在研究语言翻译里的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也可以在嵌入空间找到