自動機器學習,神經網路自主編程
新智元推薦
來源:KDnuggets,Medium
作者:Matthew Mayo,Thibault Neveu
編譯:文強
【新智元導讀】自動機器學習(AutoML)是近來很活躍的研究方向。KDnuggets 的主編 Matthew Mayo 寫了一篇文章介紹了 AutoML 的概念,以及為什麼要做自動機器學習。本文後附 AI 軟體工程師 Thibault Neveu 發表在 Medium 的文章,介紹他如何訓練神經網路自動編程。
在過去幾年,自動機器學習(AutoML)成了一個研究的熱點。在繼續接下來的話題之前,我們先簡單介紹什麼是 AutoML,它為什麼重要。然後,我們將介紹一個訓練神經網路自動編程的項目,附上代碼,你可以自己練習。
看著神經網路自己編程是件很令人興奮的事情,我們強烈推薦你自己動手實踐。
首先,什麼是自動機器學習(AutoML)?
AutoML 不是自動數據科學(automated data science)。當然,兩者有所重疊,但機器學習只是數據科學中眾多工具的一種,而且機器學慣用在預測很好,但描述性分析等任務里根本不會用到機器學習。
不過,就算是預測任務,數據科學涵蓋的也不僅僅是實際的預測模型。數據科學家 Sandro Saitta 在討論 AutoML 與自動數據科學間的潛在混淆時曾經說過:
誤解來自於整個數據科學過程(參見例如CRISP-DM)與數據準備(特徵提取等)和建模(演算法選擇、超參數調整等)的子任務之間的混淆。……
在閱讀有關自動數據科學和數據科學競賽的工具的消息時,沒有行業經驗的人可能會感到困惑,認為數據科學只是建模,並可以完全自動化。
他是對的,這不僅僅是一個語義問題。此外,數據科學家和自動機器學習支持者 Randy Olson 指出,有效的機器學習設計需要我們:
總是調整模型的超參數
總是嘗試許多不同的模型
始終為數據探索大量的特徵表徵
綜上,我們可以認為 AutoML 是演算法選擇、超參數調優、迭代建模和模型評估的任務。當然,這個定義並不完全精準,但讓我們先從這裡開始。
為什麼要做 AutoML?
AI 研究員和斯坦福大學博士生 S.Zayd Enam 在一篇名為《為什麼機器學習「難」》的博客中寫道(加粗強調部分是原文就有的):
機器學習仍然是一個相對「困難」的問題。毫無疑問,通過研究推進機器學習演算法的科學是困難的。它需要創造力、實驗和韌性。實現現有的演算法和模型去適應新的應用程序時,機器學習仍然是一個難題。
注意,雖然 Enam 主要指的機器學習研究,但他也講到現有演算法在用例中的實現(見加粗部分)。
接下來,Enam 繼續闡述了機器學習的難點,著重於演算法的本質(強調也是原文就有的):
困難的一個方面涉及要靠直覺去想用什麼工具解決問題。這需要知道可用的演算法和模型以及每個演算法和模型的利弊和約束。……
困難在於機器學習在根本上是很難調試的問題。機器學習需要調試的話有兩種情況:1)演算法不起作用,或2)演算法運行不夠好……很少有演算法一次就行,因此最終大部分時間都用於構建演算法。
然後,Enam 從演算法研究的角度闡述了這個問題。如果一個演算法不起作用,或者做得不夠好,而且選擇和優化的過程是迭代的,這就給自動化提供了機會,從而有了自動機器學習上場的餘地。
我在之前的一篇文章里曾經寫過,AutoML 的本質是:
正如 Sebastian Raschka 所描述的那樣,計算機編程是關於自動化的,而機器學習是「將自動化自動化」,然後自動機器學習是「自動化自動化自動化」。
編程通過管理重複的任務來減輕我們的勞動;機器學習讓計算機學習如何最好地執行這些重複的任務;而自動機器學習讓計算機學習如何優化學習如何執行這些任務的結果。
以前我們需要花大力氣調整參數和超參數,而自動機器學習系統可以通過多種不同的方法,學習如何以最佳的方式來調整這些結果。
AutoML 源自於這個想法:如果必須建立大量機器學習模型,使用各種演算法和多個不同的超參數配置,那麼這種模型構建的過程,還有比較模型的性能和精度都能自動化。
簡單吧?
實踐:訓練一個能自動編程的神經網路
要求
Tensorflow + 基本的深度學習技巧
項目的 Github 庫:https://github.com/thibo73800/deep_generation/tree/master/c_code
下文將快速回顧循環神經網路( RNN)相關要點,雖然不會把項目操作從頭到尾過一遍,但會著重記述核心要點。花時間把每塊代碼都跑一邊,能讓你更好地理解整個邏輯。動手很關鍵。
好,我們這就開始吧!
數據集
做任何監督學習都需要一個訓練數據集,我們這個網路也一樣。項目的代碼全部基於 C 語言(用太簡單的語言就沒意思了)。因此,我們的訓練數據集將是 Github Linux 庫里的 C 語言腳本。我已經預先提取了相關的.c代碼。
第一個問題:
神經網路只處理數字,其他信息都不知道。因此,數據集中的每個字元都需要表示成以下形式:
由上圖可見,字元 「=」 被分配給了數字 7。稍後我們會用熱編碼表示每個數字,這樣能在反向傳播的過程中更好地收斂。
這裡需要記住 3 個重要的變數:vocab_to_int、int_to_vocab和encoded。前兩個讓我們能夠在字元和數字間自由轉換,最後一個則是所有數據集的 encoder 格式。
第一個批次
先來生成一個簡單的批次,含有兩個序列,每個序列由 10 個數字組成。這個批次也將作為下面文章的樣本。
這個批次看起來是這樣的。也可以顯示成:
好,現在我們有了需要處理的第一批值。我們的神經網路需要做的事情是,在知道已經輸入的 n 個字元(而不是僅僅前一個字元)後,能夠預測接下來要輸入的字元是什麼。比方說,如果我告訴網路,最後一個輸入的字元是「e」,那麼進化的可能有很多種。但是,如果我說最後的輸入是「w」「h」「i」「l」和「e」,那麼接下來要輸入的字元是「(」就顯而易見了。
因此,我們的神經網路必須要能考慮到字元類型的時空特徵。
而為了實現這一點,我們需要用到一個循環神經網路。
循環神經網路
為了說明最後一個例子,一個經典的分類器(上圖的左邊)接收前面的字母;這個字母會被傳入隱藏層(用藍色表示),網路會推導出一個輸出。一個循環的神經網路在結構上是不同的。每個單元(用紅色表示)不僅連接到輸入,還與時刻t-1的單元相連。為了解決我們的問題,我們將使用 LSTM(長短時內存)單元。
開始建模!
下面我們將詳細介紹這篇文章的 5 個主要部分。佔位符作為模型的一個 entry。LSTM 單元的初始化用於創建 RNN。
輸出層與每個單元相連。相關運算用於測量模型的誤差。最後,我們會定義訓練的運算。
1)Graph 輸入
批次由兩個大小為 10 的輸入組成,因此我們輸入的形狀大小為 [2,10],這個批次的每個 entry 與單個輸出相關聯,可以將我們的目標也定義為相同的形狀。最後,我們定義一個佔位符,用於將來 dropout 概率的值。
2)LSTM 輸出
我們依次來看這段代碼:
create_cell()用於創建一個 LSTM 單元,這個 LSTM 單元由 4 個隱藏神經元組成。這個函數會在將結果返回給我們前,在輸出上添加一個 dropout。
tf.contrib.rnn.MultiRNNCell負責將 RNN 實例化。我們給create_cell()一個參數,因為我們想要 RNN 由多個層組成,在這裡是 3。
initial_state:知道了 RNN 的每個單元都取決於先前的狀態,我們就必須將要作為我們批次第一批 entry 輸入的那些為 0 的初始狀態實例化。
x_one_hot將批次轉換成一個熱編碼
cell_outputs給出了 RNN 每個單元格的輸出。這裡,每個輸出將由 4 個值(隱藏神經元的個數)組成。
final_state返回最後一個單元的狀態,這個狀態可以在訓練期間作為下一批次的新初始狀態使用(假設下一批次在邏輯上緊連著上一批次)。
3)Graph 輸出
單元的輸出值存儲在一個三維的表格中 [序列數,序列大小,神經元數],或者說是 [2,10,4]。我們不再需要按序列將輸出間隔開來。我們之後會調整輸出的大小,得到維數 [20,4] 的數組,存儲在變數seq_out_reshape當中。
最後,用一個簡單的線性運算:tf.matmul(..) + b。在最後整個再跟一個 softmax,把輸出表示為概率的形式。
4)Loss
為了做誤差運算,批處理的目標必須用與模型輸出相同的方式和相同的維度來表示。我們使用tf.one_hot表示輸出與輸入有相同的編碼。然後,將數組(tf.reshape ())調整到與線性輸出tf.matmul(..) + b相同的維度。現在,就可以使用這個函數來計算模型的誤差了。
5)訓練
用 AdamOptimize 將誤差最小化即可。
訓練結果!
好,終於走到結果了。這是最有成就感的一部分。我使用的參數是:
序列大小:100
批量大小:200
每個細胞的神經元數量:512
RNN 深度(層數):2
學習率:0.0005
Dropout:0.5
下面是在我的 GPU (GeForce GTX 1060)訓練大約 2 個小時後獲得的結果。
我們從誤差演變開始:
最後,我們來看模型能夠生成的代碼:
看到模型能夠清楚地了解一個程序的一般結構,感覺真是太酷了。
注意,在數據集中沒有什麼名為「super_fold」的函數。所以,我花了很長時間理解這個函數的功能。
不得不說,這個模型可能比我更聰明……
編譯來源
http://www.kdnuggets.com/2017/01/current-state-automated-machine-learning.html
https://becominghuman.ai/how-to-train-a-neural-network-to-code-by-itself-a432e8a120df


※Hey Oculus!機器學習團隊主管解密Facebook語音識別戰略
※吳恩達新成果:機器學習模型能比醫生更精確診斷心律失常
※一節1000+人報名的機器學習課,究竟長什麼樣?
※劉鐵岩團隊ICML論文提出機器學習的新範式:對偶監督學習
※2017 知乎·看山杯機器學習挑戰賽開始了!
TAG:機器學習 |
※機器學習—神經網路
※機器學習與神經網路
※特斯拉AI總監自曝自動駕駛系統秘密:用神經網路編程
※神經網路進化能否改變機器學習?
※自己動手寫深度學習模型之全連接神經網路
※輕鬆機器學習-神經網路的歷史
※使用機器學習神經網路預測電影利潤
※機器學習中的人工神經網路
※機器學習的8大神經網路架構
※機器學習研究者必知的八個神經網路架構
※機器學習新突破:谷歌研究人員利用AI自動重構大腦神經元
※以線蟲為模型模擬的神經網路,讓機器人無需訓練即可自動避開障礙物
※年底啟動自動駕駛運營,電眼科技純視覺神經網路挑戰激光雷達
※深度神經網路實戰技巧,來自一名演算法工程師的經驗!
※輕鬆機器學習-兩層神經網路
※手機晶元霸主ARM革新了機器學習和神經網路的新功能
※麻省理工研究人員推出基於神經網路的晶元設計,助力人形機器人和自動駕駛技術發展
※用神經網路打造專屬於你的豆瓣電影推薦系統
※如何提高自組織機器人的「協同能力」?專家提出「進化」神經網路控制器
※機器學習、深度學習、神經網路、深度神經網路之間有何區別?