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