當前位置:
首頁 > 新聞 > Facebook AI:利用機器學習推薦優秀代碼

Facebook AI:利用機器學習推薦優秀代碼

隨著軟體開發和開源社區愈發普及,程序員這一群體正在飛速壯大,即便不是專業從事編程的人,會寫或能看懂代碼,幾乎已經不是什麼稀罕事。

然而再有經驗的程序員,面對數十種風格迥異且分工不同的主流編程語言,難免會偶爾混淆不常用的語義和方法(Method),更別說這些語言的版本還會不斷進化(Python 2.X到Python 3.X),甚至冒出一種全新語言,專門針對特殊領域,比如專門用於機器學習的Julia。

針對這一問題,Facebook的工程師採用了機器學習技術,開發出了一款名為Aroma的代碼搜索和推薦工具。它可以拆解一段代碼,分析其語義,然後在大型代碼庫中即時匹配出類似段落,按照相似程度推薦其他類似的代碼寫法,促進代碼標準化和規範化。

研究人員認為,相比傳統的代碼搜索工具,Aroma具有以下幾個優勢:

不局限於代碼中變數和參數的命名方式,因為Aroma並不是以字元串為單位搜索,只要大致語義相同,比如對象調用的方法相同,就會被捕捉到,而且多餘的無關代碼還會被省略,增加可讀性。

Aroma會集合多組類似的搜索結果,用來生成一套代碼建議,比單獨呈現搜索結果更易理解。

面對超大規模的代碼庫,Aroma也能夠做到及時反饋搜索結果,無需提前搜索代碼規律。

Aroma的核心演算法與編程語言無關,Facebook在Hack,JavaScript,Python和Java內部代碼庫中都部署了Aroma。

舉個例子

為了更好地理解Aroma的原理,我們可以參考Facebook AI給出的例子。

假設我們想要在安卓系統中解碼點陣圖(bitmap),最基礎的代碼實現是這樣的:

但是在實際應用中,只有這一行代碼遠遠不夠,最起碼還要有用來處理異常的IOException,優化傳遞到decodeStream方法中的可選參數等等。

對於不熟悉安卓開發的新手來說,他需要去代碼庫或者開發者社區中搜索類似功能的實現方法,學一學大神的寫法。這就輪到Aroma上場了。

按照Facebook軟體工程師的描述,Aroma可以及時搜索與上述代碼類似的代碼段落。找到的一些代碼是這樣的:

仔細一看,三個搜索結果中的變數和參數的名字都不一樣,但整體的確是符合代碼語義的,具有一定的借鑒意義。

在此基礎上,Aroma還會自動優化和整合這些結果,去掉對方法主體沒有幫助的部分,使其更加泛化,最終成為一條有價值的代碼寫法推薦,像下面這段一樣:

可以看出,推薦結果保留了上面三段代碼中的相似部分,比如變數初始化和方法調用,但省略了異常處理和While循環等不同之處。

值得一提的是,Aroma會提供多組不同的代碼推薦,因此其中仍然包括了異常處理的寫法。

Aroma的實現方法

具體來說,Aroma的工作流程可以分為三大流程:特徵提取和搜索,重新排名和聚類,組合併創建代碼推薦。

首先,Aroma會為代碼語料庫中的每一個方法創建索引和解析樹,從中提取出很多結構性的特性。這些特徵都經過特殊挑選,而非一股腦地獲取所有特徵,反映出的信息包括變數用法,方法調用和控制結構等等。

最後它會基於特徵,為每個方法創建一個稀疏向量,將所有向量組合起來,就成為了一個索引矩陣,可以用來搜索代碼。

如果程序員編寫了一段新的代碼,Aroma就會用以上方法創建一個稀疏向量,然後對它和索引矩陣執行點積運算。這樣一來,點積結果最高方法就是與新代碼重合度最高的片段。Aroma的演算法會選取排名前1000的方法,作為候選建議集合,進入下一流程。

在Aroma拿到相似的方法候選集之後,會將它們重新排名,然後聚類。由於之前的向量只能表示出特徵存在與否的抽象信息,會包含一些與所搜代碼本身不相關的段落,進而低估了代碼片段與搜索結果的相似程度。

因此,機器學習演算法會在方法解析樹上修剪,去掉結果中與被搜索代碼的不相關部分,僅保留最匹配的,並且將所有方法(搜索結果)重新排名。在這之後,Aroma會根據新的排名運行迭代聚類演算法,找到多組相似的代碼段落,將它們組合成一個個代碼推薦集群。

有了集群之後,Aroma就可以執行最後一步——創建代碼推薦了。簡單來說,這一過程由一套交叉演算法完成。它在一個代碼片段的基礎上,將同一集群中的多個代碼片段迭代修剪,找到它們之間的共同點,整合成最終的代碼推薦。

因為搜索結果可以分成若干個集群,最終的代碼推薦也會有若干種不同風格,對應不同的實現過程,從而為程序員提供多樣化的代碼選擇。

可以看出,Aroma的目的並非取代程序員,而是幫助他們從現有代碼庫中快速找到和學習優秀代碼,加快編程速度和軟體迭代速度,讓機器學習,這個程序員創造出的產物,回過頭來幫助自身進步。

在未來,編程或許將變成一個人機共同完成的任務,由人類提出高層次的,抽象的想法,具體的實現和代碼編寫則交給AI系統完成,實現效率的最大化。

-End-


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 DeepTech深科技 的精彩文章:

錯了!區塊鏈也將帶來新的中心化,但這不是壞事
一個簡單數學遊戲啟發新物理模型,華人科學家接近鐵磁性原理的最終答案

TAG:DeepTech深科技 |