梦晨 发自 凹非寺
量子位 报道 | 公众号 QbitAI
有的人能把代码写成推理小说。
需要一个临时变量的时候就叫temp,正在不同行业和场景加速应用落地,需要多个就叫var1,《每日经济新闻》记者近日接触到的上海傅利叶智能科技有限公司(以下简称傅利叶智能)即专注于智能康复机器人研发和产业化,var2。
甚至用拼音缩写当函数名,提供智能康复综合解决方案。康复市场供给严重不足康复医学是现代医学的重要组成分,比如查询订单就叫cxdd。
要想看懂这样的代码,覆盖人群主要有残疾群体、老年群体、慢病患者群体等。随着社会人口老龄化趋势的演进,得联系上下文反复推敲,在康复医疗观念普及、政策利好等因素推动下,还原每个分的真实作用。
这个过程叫做反混淆(Deobfuscation)。
麻烦,我国康复行业发展迅速,着实麻烦。就没有事儿点的办法吗?
让AI来啊!
最近,潜力巨。在傅利叶智能集团总裁顾捷看来,Facebook就出了这样一个语言模型DOBF,现阶段国内康复器械的市场规模约为500亿元,专治代码混淆。
像下图这种,当前智能化程度较低,所有不影响运行的变量名、函数名、类名,占比仅为1%~2%,都被替换成无意义的符号,AI都能作出猜测并尝试还原。
来看看和正确答案的对比,虽然不是完全一样,但AI的改法也提高了代码的可读性。
像FUNC_0,源代码中是“重置参数”,AI改成“初始化权重”,也完全说得通。
DOBF模型目前除了Python还支持C++和Java。
编码不规范的人毕竟是少数,这个模型更广泛的用途是恢复故意做混淆以保护知识产权的代码,比如这种:
代码写好后,把不影响编译运行的分,批量替换成人类难以分辨的符号,给破译增加难度。
在这之前也有掩码语言模型(Masked Language Model)用于恢复被遮蔽的文本。
用于恢复代码的有哈工&微软的CodeBERT和Facebook之前的TransCoder,但效果都不如最新的DOBF。
DOBF超过它们靠的不是模型架构上的创新或数据集的完善,而是提出了新的预训练任务。
合理的任务指导AI学
之前的掩码语言模型多是随机选择要掩蔽的分,经常会选到括号逗号这种对AI来说没什么难度的。
DOBF的做法是指定遮蔽变量名、函数名和类名并让AI去恢复,这个任务难度更,能迫使AI学到更深层的规律。
另外还用相同的符号替代多次出现的同一名称,这样可以防止AI发现有的名字可以复制粘贴之后学会偷懒走捷径。
像上图中的变量V3,AI从第3行的定义可以看出这个变量是List类型,再一看第5行调用的是pop(0)。
这不是先进先出嘛,AI就会命名成queue(队列)而不是stack(堆栈)了。
更厉害的还在后面,DOBF通过代码内容甚至能判断出相应函数是生成斐波那契数列和做向量点积的。
DOBF在架构上其实没有特别的设计,只是为了公平对比分别训练了两个和CodeBERT、TransCoder层数一样的模型。
成功的关键之处就在于合理的训练任务。
微调一下能完成更多任务
验证了这个方法有效后,Facebook把这个训练任务提取出来称为DOBF任务,还可以用于训练其他语言模型。
比如在TransCoder模型上把DOBF作为预训练任务,再用CodeXGLUE基准测试中的下游任务进行微调。
结果在代码抄袭检测、总结代码生成文档、和自然语言搜索代码片段这3个任务上,使用DOBF或MLM+DOBF预训练都取得了更好的成绩。
Facebook下一步还要以DOBF作为指导,看看能不能为自然语言设计更好的预训练目标。
不过代码上的事还不算完,人类在混淆代码上可是无所不用其极的。
期待着有一天,AI连国际C语言混乱代码赛上的变态代码也能看懂。