論文題目:LambdaNet: Probabilistic Type Inference using Graph Neural Networks
論文來源:ICLR 2020
論文鏈接:https://openreview.net/forum?id=r1lZ7AEKvB
代碼鏈接:https://github.com/MrVPlusOne/LambdaNet
關(guān)鍵詞:GNN袁稽,謂詞玩焰,代碼類型注釋,attention剪芥,超邊绣张,指針網(wǎng)絡(luò)
1 摘要
本文使用圖神經(jīng)網(wǎng)絡(luò)進(jìn)行推理雅宾,具體的場(chǎng)景是在 Python 或者 Typescript 之類的語言中自動(dòng)進(jìn)行代碼的類型注釋唆迁。
該方法首先使用輕量級(jí)的源代碼分析生成一個(gè)程序抽象——類型依賴圖肉拓。該圖將類型變量和邏輯約束后频、名稱以及使用信息聯(lián)系在一起。給定這個(gè)圖后暖途,使用GNN在相關(guān)的類型變量間進(jìn)行消息傳播卑惜,最終進(jìn)行類型的預(yù)測(cè)。
本文提出的方法可以預(yù)測(cè)標(biāo)準(zhǔn)的類型驻售,例如number露久、string,也可以預(yù)測(cè)出訓(xùn)練中未出現(xiàn)過的用戶自定義的類型欺栗。
2 引言
在過去的十年中毫痕,例如Python、Ruby迟几、Javascript之類的動(dòng)態(tài)類型語言獲得了極大的普及消请,但它們?nèi)狈o態(tài)類型系統(tǒng),缺乏在編譯時(shí)捕獲錯(cuò)誤的能力以及code completion的支持类腮,在可維護(hù)性方面存在一定的缺陷臊泰。
Gradual typing可以解決這些不足:程序變量有可選的類型注釋,這樣類型系統(tǒng)就可以在需要的時(shí)候執(zhí)行靜態(tài)類型檢查蚜枢。有許多流行的編程語言可支持gradual typing缸逃,但由于它們大量使用動(dòng)態(tài)語言結(jié)構(gòu)并且缺乏主要的類型,編譯器不能使用來自編程語言社區(qū)的標(biāo)準(zhǔn)算法進(jìn)行類型推斷厂抽。并且察滑,手動(dòng)向現(xiàn)有的代碼庫添加類型注釋非常繁瑣而且易出錯(cuò)。
為了減少從無類型的代碼向靜態(tài)類型代碼過渡所涉及的人工工作修肠,本文的工作使用基于學(xué)習(xí)的方法贺辰,自動(dòng)地為無類型(或有部分類型)的代碼庫推斷出可能的類型注釋。
已有方法的缺點(diǎn):
本文使用的是TypeScript嵌施,是Javascript的一種變形饲化,該語言有大量的類型注釋的程序作為訓(xùn)練數(shù)據(jù)。已經(jīng)有一些使用機(jī)器學(xué)習(xí)為TypeScript推斷類型標(biāo)注的方法吗伤,但這些方法都有一些缺點(diǎn):
(1)推斷的結(jié)果來源于有限的類型詞典吃靠,即推斷的類型都是在訓(xùn)練過程中出現(xiàn)過的,不能推斷出用戶定義的數(shù)據(jù)類型足淆。
(2)即使不考慮用戶定義的類型巢块,這些方法的準(zhǔn)確率也不高礁阁。
(3)這些方法可能會(huì)產(chǎn)生不一致的結(jié)果,對(duì)于相同的變量可能因?yàn)槌霈F(xiàn)位置的不同族奢,導(dǎo)致預(yù)測(cè)出來的類型不同姥闭。
作者提出:
使用GNN對(duì)TypeScript進(jìn)行類型推斷,避免了上述問題越走。
本文的方法先使用輕量級(jí)的源代碼分析棚品,將程序轉(zhuǎn)換成類型依賴圖。圖由節(jié)點(diǎn)和有標(biāo)簽的超邊(hyperedges)組成廊敌,圖中的節(jié)點(diǎn)代表類型變量铜跑,節(jié)點(diǎn)間的關(guān)系編碼在了超邊里。類型依賴圖中除了表達(dá)了邏輯約束之外骡澈,還結(jié)合了設(shè)計(jì)命名和變量使用的上下文提示锅纺。
給定類型依賴圖后,使用GNN為每種類型變量計(jì)算出一個(gè)向量表示肋殴,然后使用類似指針網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行類型預(yù)測(cè)伞广。
GNN本身需要處理各種類型的超邊(有些具有可變數(shù)量的參數(shù)),為此作者定義了恰當(dāng)?shù)膱D傳播操作疼电。
在預(yù)測(cè)層比較了類型變量的向量表示和候選類型的向量表示,從而可以靈活地處理在訓(xùn)練階段未出現(xiàn)過的用戶定義的類型减拭。
另外蔽豺,模型的預(yù)測(cè)結(jié)果具有一致性,因?yàn)槟P瓦M(jìn)行的是變量級(jí)別的預(yù)測(cè)拧粪,而不是位置級(jí)別的預(yù)測(cè)修陡。
貢獻(xiàn):
(1)提出了一個(gè)TypeScript的概率類型推斷算法)(LambdaNet),使用了深度學(xué)習(xí)的方法可霎,根據(jù)程序?qū)?yīng)的類型依賴圖的表示進(jìn)行預(yù)測(cè)魄鸦。
(2)使用GNN方法進(jìn)行了類型變量的向量表示的計(jì)算,并且提出類似指針網(wǎng)絡(luò)的方法對(duì)用戶定義的類型進(jìn)行預(yù)測(cè)癣朗。
(3)實(shí)驗(yàn)證明了LambdaNet的有效性以及和之前的方法相比的優(yōu)越性拾因。
3 動(dòng)機(jī)舉例和問題設(shè)置
————————————————
版權(quán)聲明:本文為CSDN博主「byn12345」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議旷余,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明绢记。
原文鏈接:https://blog.csdn.net/byn12345/article/details/105291133