機器碼農(nóng):深度學習自動編程

姓名:呂彬? 學號:16130140354

轉載自《程序員》雜志 張俊林

【嵌牛導讀】隨著深度學習技術的快速進展,人工智能時代的序幕已經(jīng)揭起,目前深度學習在圖像處理方面的能力已經(jīng)接近人,甚至在某些方面已經(jīng)超過人的識別能力,在語音識別、自然語言處理等人機交互方面也取得了很大的技術進步。在未來社會,各行各業(yè)的不同類型工種逐步由機器代替人作為一個社會發(fā)展趨勢已經(jīng)開始逐步顯現(xiàn),比如工業(yè)機器人目前已經(jīng)開始在工廠大量使用,特斯拉也已經(jīng)在在售汽車中開始啟用自動駕駛功能,由人工智能代替了傳統(tǒng)的駕駛員的功能。? 目前看人工智能已經(jīng)能夠成功從事一些體力為主的工作崗位,那么程序員作為一個腦力密集型勞動崗位,是否會被機器取而代之?從技術和社會發(fā)展趨勢來看,這個問題在很大程度上可能會是個肯定答案。那么機器碼農(nóng)如何理解需求?如何根據(jù)需求秒速寫出代碼?本文后續(xù)內容即簡介相關技術,尤其是深度學習相關的一些技術思路。? 深度學習介入自動編碼領域是最近兩年的事情,應該說目前深度學習系統(tǒng)自動編碼能夠解決的問題還比較簡單,比如目前能夠做到自動根據(jù)訓練數(shù)據(jù)寫出冒泡排序等排序算法,自己根據(jù)例子會學會十位數(shù)加減法以及字符串正則匹配規(guī)則等,所以短期內機器碼農(nóng)還沒有替代人類程序員的可能。但是也要看到隨著深度學習在自動編碼領域的深入應用,其技術發(fā)展速度是非常快的,極有可能在未來幾年有突破性的技術進展。

【嵌牛鼻子】深度學習自動編程

【嵌牛提問】機器會不斷自主深入學習脫離人類控制?

【嵌牛正文】一.歸納程序綜合問題 如何讓機器自動產(chǎn)生代碼這個問題由來已久,是人工智能一直希望攻克的重大問題之一,傳統(tǒng)上一般將這個問題稱為“歸納程序綜合”(InductiveProgram Synthesis,簡稱IPS)問題。IPS問題的研究目標是: 給定一組<輸入,輸出>數(shù)據(jù)對,如何自動產(chǎn)生一段代碼,這段代碼能夠正確地將這些給定的輸入轉換為給定的輸出。 傳統(tǒng)的研究方法里,建立能自動產(chǎn)生代碼的IPS系統(tǒng)一般主要涉及兩個過程:代碼組合空間搜索以及代碼排序。一般一個編程語言可以形成的程序語句是非常多樣的,那么如果隨機選擇其中一些語句組合起來,就能夠對輸入數(shù)據(jù)完成某種轉換的任務形成輸出。但是這種合法代碼組合出的空間非常大,在這么大的代碼語句組合空間里,到底哪些語句組合起來能夠將給定的那組<輸入,輸出>數(shù)據(jù)進行正確的轉換呢?這就需要在巨大的代碼組合空間中進行搜索,找到那些能夠對給定數(shù)據(jù)都能進行轉換的代碼片段,這些代碼片段就是機器自動產(chǎn)生的程序。很明顯,這里的關鍵是設計高效的搜索算法。另外,在代碼組合空間里搜索,有可能找到很多段程序,這些程序都能夠將輸入數(shù)據(jù)進行準確地轉換,那么到底輸出哪一段最合理呢?這就是代碼排序要做的工作,就是給多段完成相同功能的代碼進行排序,找出最好的那一段,比如一種簡單直觀的方式是輸出代碼長度最短的那段作為自動生成的代碼。 上面介紹的是傳統(tǒng)的IPS系統(tǒng)的設計思路,最近深度學習也開始被頻繁應用到代碼自動生成領域,后面內容主要介紹典型的相關技術思路。二.機器如何使用深度學習學會自動編程? 武俠世界分門別派是個常態(tài),有少林、武當、峨眉、崆峒等派別之分,神經(jīng)網(wǎng)絡自動編程目前的主流技術路線也可以分為兩派:“黑盒派”和“代碼生成派”。盡管都采用了深度學習技術,但是兩者在路線方向上有較大差異,也各有特點。下面我們分述兩派的基本技術思路及其相應的代表系統(tǒng)。2.1黑盒派 “黑盒派”是神經(jīng)網(wǎng)絡編程的一類典型方法,所謂“黑盒”,是指編程系統(tǒng)并不顯示地輸出代碼片段,而是從輸入輸出數(shù)據(jù)中學習轉換規(guī)則,通過這些轉換規(guī)則能夠完成某項任務,正確地把輸入轉化為輸出,所學習到的這些轉換規(guī)則和輸入輸出數(shù)據(jù)中的規(guī)律則以神經(jīng)網(wǎng)絡參數(shù)的方式體現(xiàn),所以并沒有明確的代碼或者規(guī)則輸出,在人類眼中,只能看到能夠完成指定任務的訓練好的神經(jīng)網(wǎng)絡,至于它學到了什么規(guī)律并不清楚,這是為何稱之為“黑盒”的原因。? ? ? ? ? ? ? ? ? ? ? 圖1.“黑盒派”技術思路 圖1展示了“黑盒派”神經(jīng)網(wǎng)絡編程器的基本運行思路,其主體部分包含三個關鍵部件:神經(jīng)網(wǎng)絡控制器、神經(jīng)網(wǎng)絡感知器以及行為器。神經(jīng)網(wǎng)絡感知器用來感知當前的輸入數(shù)據(jù)并抽取輸入數(shù)據(jù)的特征,神經(jīng)網(wǎng)絡控制器則根據(jù)輸入數(shù)據(jù)的特征來判斷當前應該對輸入數(shù)據(jù)實施何種行為(比如對于數(shù)組排序來說可能是交換兩個數(shù)值SWAP(number1,number2)操作),屬于決策機構,也是神經(jīng)網(wǎng)絡編程器中類似于人類大腦的關鍵構件,當確定了采取何種行為后,調用行為器來對輸入數(shù)據(jù)進行實際操作,這樣就將輸入數(shù)據(jù)做了一步變換,形成中間數(shù)據(jù),之后這個新形成的中間數(shù)據(jù)繼續(xù)作為感知器的新輸入,如此循環(huán),就能夠對原始輸入數(shù)據(jù)不斷變換,來完成比如數(shù)組排序等任務。在訓練階段,人類提供完成某項任務的一些輸入及其對應的輸出數(shù)據(jù),并指定對應的行為序列,以此作為訓練數(shù)據(jù),訓練神經(jīng)網(wǎng)絡編程器的學習目標是讓深度學習系統(tǒng)模仿這種針對輸入數(shù)據(jù)的行為過程,最終能夠形成正確地輸出數(shù)據(jù)。當訓練完畢后,這些轉換規(guī)則就被編碼到神經(jīng)網(wǎng)絡的網(wǎng)絡參數(shù)中,當實際應用時,提供一個新的輸入,神經(jīng)網(wǎng)絡感知器對輸入數(shù)據(jù)進行特征提取與表示,神經(jīng)網(wǎng)絡控制器決定采取何種操作,行為器對輸入數(shù)據(jù)進行實際的變換行為,形成中間結果,如此反復,直到神經(jīng)網(wǎng)絡控制器決定終止操作,此時得到的結果就是程序對應的輸出結果。 從上述過程中可知,“黑盒派”神經(jīng)網(wǎng)絡編程器并不產(chǎn)生具體的代碼來完成編程任務,而是學習輸入數(shù)據(jù)和輸出數(shù)據(jù)之間的規(guī)律及其轉換規(guī)則。從廣義上來說,神經(jīng)圖靈機等網(wǎng)絡模型雖然不是專門用于編程,而是用于更通用的任務過程中,但是其實也是符合這種“黑盒派”架構的基本思路。 圖2. 神經(jīng)程序解釋器(NPI)運行機制 神經(jīng)程序解釋器(Neural Programmer Interpreters,簡稱NPI)是Google提交到ICLR 2016的會議論文中提出的神經(jīng)網(wǎng)絡編程模型,這篇論文因新穎的思路及創(chuàng)新應用獲得了ICLR 2016最佳論文獎。神經(jīng)程序解釋器是一種典型的“黑盒派”方法。 NPI的主體控制結構是遞歸LSTM(參考圖2所示),這種遞歸LSTM結構可以體現(xiàn)程序與子程序之間的調用關系。至于什么是遞歸LSTM后文會有解釋,我們先根據(jù)圖2所示內容來說明NPI的運行過程。? 在t時刻,LSTM的輸入包括當前選中的子程序以及此時的輸入數(shù)據(jù),經(jīng)過Encoder編碼網(wǎng)絡對這兩個輸入進行映射,形成t時刻LSTM輸入層的內容。這個過程其實就對應圖1中的神經(jīng)網(wǎng)絡感知器,用來對輸入數(shù)據(jù)進行編碼和特征提取,在NPI中,不同類型的任務可能對應不同的Encoder編碼網(wǎng)絡,因為不同任務的輸入類型各不相同,比如有的是圖片,有的是數(shù)組等,所以很難有公用的輸入編碼器能夠統(tǒng)一處理,但是不同任務會共享LSTM層參數(shù)。 在對輸入進行特征編碼之后,t時刻的LSTM隱層單元對輸入以及LSTM網(wǎng)絡t-1時刻的隱層信息共同進行非線性變換,這是對歷史信息和當前輸入的特征融合;然后,通過三個解碼器來產(chǎn)生t時刻的三種類型的輸出:Decoder_1根據(jù)隱層編碼信息產(chǎn)生一個概率值P,這代表了當前程序結束的可能性,當P高于閾值的時候,當前程序終止;Decoder_2輸出子程序庫中某個子程序的ID,這代表發(fā)生了<主程序,子程序>間的調用關系;Decoder_3輸出新映射到的子程序所需的參數(shù)信息列表,Decoder_2和Decoder_3一起可以觸發(fā)被調用的子程序。可以看出,LSTM結構以及子程序庫其實就是圖1中所示的神經(jīng)網(wǎng)絡控制器,它決定了神經(jīng)網(wǎng)絡所需要做的各種決策。NPI沒有明確的行為器,這些行為隱藏在被調用的子程序中,一般不同的子程序會定義針對輸入數(shù)據(jù)的不同操作,調用子程序會觸發(fā)子程序的操作來改變輸入數(shù)據(jù)內容。? 之所以說NPI是個遞歸LSTM結構,是因為當子程序被觸發(fā)時,子程序自身也形成了類似圖2所示的LSTM結構,所以形成了遞歸LSTM的形態(tài)。當被調用的子程序中的某個時間步輸出的程序終止概率P大于閾值時,會返回調用程序的LSTM結構中,繼續(xù)下一個時間步的類似操作。? 圖3所示是NPI自動學習十進制加法的結構示意圖,其輸入是不斷被子程序變換內容的數(shù)組矩陣,其控制結構其實就是圖2所示內容,只是展示出了被調用子程序的LSTM結構,所以看上去比較復雜,但其運行邏輯就入上文內容所述。 圖3.NPI學習十進制加法2.2代碼生成派? ? ? 圖4. 代碼生成派 “黑盒派”有個很容易被詬病的問題:對于開發(fā)人員來說,對神經(jīng)網(wǎng)絡到底從數(shù)據(jù)中學到了什么規(guī)律所知甚少,所以不利于分析系統(tǒng)存在的問題以及提出有針對性的改進方案。“代碼生成派”在這一點上的思路和“黑盒派”有很大差異,更接近傳統(tǒng)的解決“IPS問題”的思路,期望能夠讓機器碼農(nóng)像人類程序員一樣把解決問題的過程形成代碼片段。目前也有不少深度學習自動編碼系統(tǒng)采用這一技術路線,盡管不同系統(tǒng)具體技術方案有較大差異,但其基本流程都是類似的,圖4展示了從不同方案中抽象出的“代碼生成派”神經(jīng)網(wǎng)絡自動編程的基本思路,分為模型訓練階段和模型應用階段。? 在模型訓練階段,需要使用不同種類編程任務的訓練數(shù)據(jù)來訓練深度學習自動編程模型,一般訓練數(shù)據(jù)包括: 任務的一系列輸入輸出數(shù)據(jù):{<Input_1,Output_1>,<Input_2,Output_2> ......<Input_n,Output_n>,} 任務Task_i對應的代碼片段:Program_i? 這組訓練數(shù)據(jù)的含義是:對于要執(zhí)行的任務Task_i來說,當輸入為Input_j的時候,經(jīng)過任務的代碼Program_i對輸入進行各種變換,形成對應的輸出Output_j。訓練數(shù)據(jù)中可以包含各種不同類型的任務及其對應的訓練數(shù)據(jù),這形成了總體的訓練神經(jīng)網(wǎng)絡模型的訓練數(shù)據(jù)集合。 目前常用的編程語言有很多,比如JAVA,C++,Python,PHP等,對于機器碼農(nóng)來說,也存在著:“PHP是不是最好的語言”這種問題,就是說需要作出應該用什么語言產(chǎn)生代碼的決策。一般不同的深度學習自動編碼系統(tǒng)都會參考“領域特定語言(Domain Specific Language )”自己定義一種編程語言,而不是直接采用人類程序員常用的某種編程語言,這是因為對于機器產(chǎn)生代碼來說,目前常用的編程語言過于復雜,里面包含了循環(huán)、分枝判斷等復雜控制邏輯,而根據(jù)“領域特定語言”定義的語言一般都比較簡單,不包含這些控制邏輯,只包含一些基本原語,比如數(shù)值加一、數(shù)值減一、移動指針位置、讀取某存儲器內數(shù)據(jù)、將數(shù)據(jù)寫入存儲器某位置等基本操作原語。所有代碼片段(包括訓練數(shù)據(jù)對應的程序以及將來要生成的代碼)都采用自定義的領域特定語言,這樣會大大簡化機器碼農(nóng)的學習難度。? 給定了各種任務的輸入輸出數(shù)據(jù)及其對應的代碼片段,深度學習自動編程系統(tǒng)就可以開始使用SGD(隨機梯度下降)算法來訓練模型,一般神經(jīng)網(wǎng)絡的輸入是某個任務對應的輸入輸出數(shù)據(jù),而學習目標則是調整神經(jīng)網(wǎng)絡參數(shù),使得其輸出的代碼片段和訓練數(shù)據(jù)中對應的代碼片段盡可能相同。通過這種方式可以訓練獲得自動編程模型。? 在模型應用階段,為了能夠讓機器碼農(nóng)能夠針對新任務自動編寫出解決任務的代碼P(P能夠正確地將給出的所有輸入轉換為對應正確輸出),需要提供新任務的若干輸入輸出數(shù)據(jù),這其實類似于日常程序員寫代碼的需求說明,只是以數(shù)據(jù)的方式體現(xiàn)的,否則不可能讓機器漫無目的地去生成不知道在干嘛的代碼,任務的輸入輸出數(shù)據(jù)其實是告知機器碼農(nóng)數(shù)據(jù)之間的映射規(guī)律。機器碼農(nóng)在獲得新任務的輸入輸出數(shù)據(jù)后,根據(jù)訓練階段學習到的模型,可以預測出”領域特定語言”中的各種操作原語語句出現(xiàn)在代碼片段P中的概率,可以認為出現(xiàn)概率較高的原語是代碼片段P中應該包含的語句。這里需要注意的是:深度學習系統(tǒng)并不能準確地輸出完整的代碼片段,只能預測代碼片段中DSL原語出現(xiàn)可能性。之后,可以采用某些搜索技術(比如線性動態(tài)編程或者寬度優(yōu)先搜索等技術)在代碼組合空間中尋找代碼片段,這些代碼片段能夠準確地將給定的所有輸入正確地轉換為對應的輸出。從這里可以看出,深度學習預測的結果起到的作用是形成代碼組合空間搜索時的約束條件,能夠大量減少搜索空間的大小,使得后續(xù)代碼搜索過程極大地提速。 層級生成式CNN模型(Hierarchical Generative Convolutional Neural Networks,簡稱HGCNN模型)是Facebook最近提出的一種具備“代碼生成派”典型特點的深度學習自動程序推導方法。其整體工作流程是符合上述“代碼生成派”運行過程的,只是圖4中的“深度學習自動編程系統(tǒng)”模塊采用了具體的HGCNN模型而已。? ? ? 圖5.層級生成式CNN模型(HGCNN) 圖5展示了HGCNN模型的神經(jīng)網(wǎng)絡結構。在模型應用階段,對于需要編碼的新任務,先提供若干滿足任務處理邏輯的輸入輸出數(shù)據(jù)(HGCNN主要對數(shù)組進行各種類型的變換,比如圖5中展示的例子是對數(shù)組進行排序)。對于每個輸入輸出數(shù)據(jù),HGCNN使用四層采用全連接結構的DNN網(wǎng)絡(圖5中標為b的網(wǎng)絡結構)來對其進行特征提取,每層網(wǎng)絡包含512個隱層神經(jīng)元。之后,將若干個輸入輸出數(shù)據(jù)的特征求均值作為輸入輸出數(shù)據(jù)的整體特征表示。可以看出,這個過程是對輸入實例進行編碼和特征提取的階段。然后采用連續(xù)的CNN上采樣(UpSampling)操作不斷形成逐步擴大的二維結構矩陣,上采樣是用來可視化展示CNN隱層所學到的特征所常用的技術,在這里采用上采樣可以將輸入輸出數(shù)據(jù)中的特征規(guī)律以類似二維圖形的方式展示;上采樣形成的二維矩陣每次擴大一倍,直到形成最終的16*16大小的代碼畫布(Code Canvas),這個最終的代碼畫布代表了各種操作原語在最終代碼中出現(xiàn)的可能性。代碼畫布的每一行代表一個操作原語語句,一個操作原語由某個操作符以及對應的兩個參數(shù)構成(參考圖5中的c部分)。GHCNN的“領域特定語言”定義的語言類似于匯編語言,圖5中c子圖展示的是Load 1 2的操作命令,圖6則列出了這個語言定義的操作原語。 圖6.HGCNN的領域特定語言 在獲得了最終程序中可能包含的原語語句概率信息后,HGCNN采用寬度優(yōu)先搜索策略在代碼組合空間中搜索滿足輸入輸出實例約束條件的代碼片段,以此來最終形成輸出的程序代碼,這樣就完成了指定輸入輸出實例后自動產(chǎn)生代碼的功能。 HGCNN有個特色是訓練數(shù)據(jù)包括輸入輸出以及對應的代碼完全自動生成得來,而不像很多其它系統(tǒng)需要提供現(xiàn)成的訓練數(shù)據(jù),從這點上說其運作機制有點類似于無監(jiān)督學習。另外,從上述描述可以看出,本質上HGCNN是一種符合Encoder-Decoder編碼器-解碼器結構的具體模型,這里Encoder的編碼對象是多個<輸入,輸出>數(shù)據(jù),形成特征表示后采用Decoder解碼器來產(chǎn)生DSL原語語句,Decoder解碼器則是利用了上采樣生成二維結構的方式生成DSL原語片段生成概率。 DeepCoder是另外一個采取“代碼生成派”路線的深度學習自動編碼系統(tǒng),其主體思路和HGCNN類似,只不過使用的具體Encoder和Decoder不太相同,其整體運行流程也基本采用了圖4所示的“代碼生成派”典型流程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容