當前位置:
首頁 > 新聞 > 「讓調參全部自動化」自動機器學習,神經網路自主編程(代碼與訣竅)

「讓調參全部自動化」自動機器學習,神經網路自主編程(代碼與訣竅)

「讓調參全部自動化」自動機器學習,神經網路自主編程(代碼與訣竅)

新智元推薦

「讓調參全部自動化」自動機器學習,神經網路自主編程(代碼與訣竅)

在過去幾年,自動機器學習(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_intint_to_vocabencoded。前兩個讓我們能夠在字元和數字間自由轉換,最後一個則是所有數據集的 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」的函數。所以,我花了很長時間理解這個函數的功能。

不得不說,這個模型可能比我更聰明……

編譯來源

  1. http://www.kdnuggets.com/2017/01/current-state-automated-machine-learning.html

  2. https://becominghuman.ai/how-to-train-a-neural-network-to-code-by-itself-a432e8a120df

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

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


請您繼續閱讀更多來自 新智元 的精彩文章:

斯坦福新深度學習系統 NoScope:視頻對象檢測快1000倍
「北航新型人工突觸」能模擬人類神經系統基本功能的人工突觸誕生

TAG:新智元 |

您可能感興趣

特斯拉AI總監自曝自動駕駛系統秘密:用神經網路編程
超酷的神經網路合成動物運動動畫,解救動畫師!代碼開源+視頻
如何提高自組織機器人的「協同能力」?專家提出「進化」神經網路控制器
網路自動化正在向網路智能化演進
暢談數據中心網路運維自動化
網路自動化已來!愛立信與軟銀成功實踐RAN自動化
神經網路進化能否改變機器學習?
機器學習與神經網路
揭秘AutoML和神經網路結構搜索,機器學習自動化真能普及大眾嗎?
成功實施自動化系統升級的三要素:項目計劃、無線網路和移動性
自己動手寫深度學習模型之全連接神經網路
SDN之如何改善網路自動化
人工智慧加速虛擬化網路運維自動化
5G網路將成為驅動自動駕駛汽車革命的最大動力
從腦波到機器人運動,使用深度神經網路對大腦活動進行解碼
以線蟲為模型模擬的神經網路,讓機器人無需訓練即可自動避開障礙物
網路安全自主可控發展與推進研討會在京召開
網路社會的互動性
新全光二極體、新型自旋閥結構、新型高效節能深度學習神經網路、「神經網路核磁共振成像」…
MATLAB自帶的自組織神經網路