0
本文作者: 恒亮 | 2017-04-24 17:11 |
在過去的幾十年中,無論在硬件組織還是軟件架構(gòu)上,計算機行業(yè)已經(jīng)發(fā)生了翻天覆地的變化,各種軟硬件產(chǎn)品的性能和用戶體驗均得到了顯著提升。
但對程序員而言,軟件編碼的本質(zhì)似乎并沒有什么本質(zhì)的改變:無論哪種編程語言,仍然需要程序員根據(jù)算法邏輯和實現(xiàn)步驟一步一步地手動敲入代碼。雖然近幾年隨著編碼工具的改進(jìn)和編程語言的版本更新,對于程序員而言,這一過程已經(jīng)相當(dāng)方便了,但學(xué)習(xí)如何編程仍然是諸多計算機用戶不得不面對的一道難題。
雷鋒網(wǎng)消息,近日,微軟在論文中公布了一項最新的代碼合成系統(tǒng):RobustFill。它基于深度學(xué)習(xí)技術(shù),可以根據(jù)用戶指定的輸入輸出樣例進(jìn)行特征提取,然后自動合成能夠?qū)崿F(xiàn)相應(yīng)功能的軟件代碼,大大縮減了程序員的編碼工作量。
舉例來說,假設(shè)用戶需要編碼實現(xiàn)如下功能:將輸入的人名信息進(jìn)行規(guī)范化縮寫后輸出。具體如下圖所示,當(dāng)輸入人名為 “jacob daniel devlin” 時,系統(tǒng)應(yīng)該輸出 “Declin,J” ?;?RobustFill,用戶只需要提供一些簡單的輸入輸出樣例(圖中前三行黑色字體),系統(tǒng)就能自動合成實現(xiàn)這一功能的軟件代碼,并輸出正確結(jié)果(圖中后三行灰色字體)。如果用戶需要處理的人名有成千上萬個,這就能節(jié)約大量的處理時間。
RobustFill 系統(tǒng)生成的代碼基于 DSL(Domain Specific Language),即領(lǐng)域特定語言。雷鋒網(wǎng)獲知,用戶并不需要理解 DSL 的編程細(xì)節(jié),實際上,用戶根本看不到 DSL 代碼,而只需要關(guān)注具體的功能實現(xiàn)就行了。對應(yīng)上述人名縮寫樣例,RobustFill 生成的 DSL 代碼如下所示:
Concat(
ToCase(
GetToken(
input,
Type=Word,
Index=-1),
Type=Proper),
Const(", "),
ToCase(
SubString(
GetToken(
input,
Type=Word,
Index=1),
Start=0,
End=1),
Type=Proper),
Const("."))
自動代碼合成的難點主要有兩個:
一是系統(tǒng)可以自動合成萬億級的不同的 DSL 代碼組合,如何判斷哪一種是正確結(jié)果;
二是用戶提供的輸入輸出樣例一般都是人工輸入,難免會出現(xiàn)一些筆誤(例如上面人名縮寫的例子中,表格第二行,用戶把“Useato”寫成了“uesato”),系統(tǒng)如何避免這些筆誤的不良影響。
針對這兩個問題,此前的解決方案是微軟 Excel 軟件中的 FlashFill 系統(tǒng)。該系統(tǒng)憑借開發(fā)人員手動設(shè)置規(guī)則和啟發(fā)式搜索(Heuristic Search)的方式,為用戶輸出特定功能的代碼。但 FlashFill 系統(tǒng)嚴(yán)重弱化了 DSL 語言的擴展能力,并且需要開發(fā)者大量的人工輸入,同時對人工輸入的筆誤也非常敏感,因此并不是最優(yōu)的解決方案。
與 FlashFill 不同,在深度學(xué)習(xí)技術(shù)的支持下,RobustFill 可以利用數(shù)據(jù)驅(qū)動的方式進(jìn)行代碼合成,而無需開發(fā)者手動設(shè)置規(guī)則。此外,RobustFill 還使用了此前用于自然語言翻譯的一種名為“attentional sequence-to-sequence neural network”(注意力序列到序列神經(jīng)網(wǎng)絡(luò))的技術(shù),因此才能基于用戶給定的輸入輸出樣例,自動合成代碼。RobustFill 的大體結(jié)構(gòu)流程如下圖所示。
微軟用數(shù)百萬隨機生成輸入/輸出和對應(yīng)的編碼來訓(xùn)練該系統(tǒng)。由于 RobustFill 能學(xué)會 DSL 的語法,微軟認(rèn)為它在真實數(shù)據(jù)上會有良好表現(xiàn)。雷鋒網(wǎng)了解到,總的來說,微軟 RobustFill 在真實測試中達(dá)到了 92% 的精確度。最讓人感到鼓舞的是,即便輸入/輸出樣例包含大量噪音,RobustFill 仍能夠保持高水準(zhǔn)的精確度。
在 FlashFill DSL 這樣的強大函數(shù)語言上,成功地訓(xùn)練神經(jīng)架構(gòu)學(xué)習(xí)編程,是神經(jīng)代碼合成的一項了不起的成就。微軟表示,這同時也是邁向通用 AI 的一小步。RobustFill 解決了加入可編譯性( interpretability)的核心難題,并探索了用知識的符號表示連接分布式表達(dá)( connecting distributed representations with symbolic representations of knowledge)這一課題。
微軟最后在官方博客宣布:
“我們正在開發(fā)這些架構(gòu)的擴展,用變量和控制流來學(xué)習(xí) DSL 中的代碼,以生成更豐富的代碼類。我們相信,照這個方向走下去需要我們研究、解決代碼合成和歸納問題中的關(guān)鍵技術(shù)難關(guān)?!?br/>
via microsoft
相關(guān)文章:
機器學(xué)習(xí)的出現(xiàn) 會讓程序員這個工種發(fā)生什么變化?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。