您的位置:首頁>正文

讓程式設計小白也能瞭解神經網路和深度學習

前段時間一直在Coursera上學習Andrew NG的深度學習課程, 現在總算把最基礎的課程學完了。 今天把這些內容做個簡單的總結, 本文內容能夠從零瞭解深度學習和神經網路的基本常識。

為什麼深度學習突然火了

深度學習背後的理論基礎與技術概念已經出現了有數十年, 為什麼會在最近幾年發生爆炸性的增長, 主要是因為兩個原因, 一是現代的設備和互聯網讓我們產生了大量的資料, 另一個原因是計算能力的大幅提升。

之所以說大量的資料是推動神經網路興起的原因, 是因為當資料量沒有達到一定規模的時候,

傳統的機器學習演算法也同樣可以完成我們的任務。 對於經典的機器學習演算法, 在資料量還比較小的初始階段, 其性能會隨意資料量的增加而穩步的得升, 但很快就會遇到瓶頸。 而伴隨著移動互聯網時代的到來, 我們能夠從網站、移動應用或者其他安裝在電子終端設備上的感測器中獲取到海量的資料, 這時經典的機器學習演算法就不夠用了。 從下圖中可以看出, 越是大型的神經網路隨著資料量的增加, 其性能提升是越快的, 並且其性能的上限也越高。

深度學習興起的另一個重要原因就是計算能力的提升。 計算能力的提升不僅新興的 CPU 或者 GPU 這樣的硬體的提升, 還包括計算演算法上的革新, 使得我們能夠更快地訓練出神經網路。 例如之前我們會使用 Sigmod 函數作為神經網路的啟動函數, 隨著 x 的增大其梯度會逐漸趨近於零, 這就導致了模型收斂變得相對緩慢;而 ReLU 則能較好地避免這個問題, 其在正無窮大時梯度值依然保持恒定。 簡單地從 Sigmod 函數遷移到 ReLU 即能夠為模型訓練帶來極大的效率提升,

這也方便了我們構建出更複雜的神經網路。

神經網路怎麼構建

在構建一個神經網路之前, 可能很多同學之前就聽說過梯度下降法, 聽說過正向傳播, 反向傳播這些術語, 其實這些聽起來好像很複雜, 其實過程非常簡單。

在介紹具體的構建步驟之前, 先介紹幾個名詞是的含義。

神經網路:神經網路是由多個神經元組成的, 神經元可以理解成由若干個輸入並產生一個輸出的單位, 好比神經末梢感受各種外部環境的變化, 最後產生電信號。 下圖就是一個預測房價的神經網路, 輸入的4個x特徵並由兩層神經網路計算出輸出y, 也就是預測值。

損失函數:Google上有個定義, 目標函數是最終需要優化的函數, 其中包括經驗損失和結構損失。 經驗損失(loss)就是傳說中的損失函數或者代價函數。 結構損失(Ω)就是正則項之類的來控制模型複雜程度的函數。 通俗的說, 損失函數可以理解成當前的參數通過模型計算之後得到的估計值和真實值之前的差距。

梯度下降:梯度下降法, 我在網上有看過一個比較有意思的解釋, 將函數比作一座山, 我們站在某個山坡上, 往四周看, 從哪個方向向下走一小步, 能夠下降的最快。 (通過下面的說明, 應該會對梯度下降有更深入的理解)

有了上面這些概念, 接下來就可以把構建神經網路的過程總結成這幾個步驟:

1. 定義神經網路的結構(包括輸入層, 隱藏層等)

2. 初始化模型參數

3. 迴圈以下步驟:

3.1 通過正向傳播計算loss

3.2 通過反向傳播計算出要更新的梯度(gradients)

3.3 更新模型參數

3.4 反覆運算第3步

引用之前寫內容(深度學習筆記), 我們把邏輯回歸表示成y^=wx+b的形式, 這裡的w和b就是輸入的參數, 也就是每次反覆運算之後要調整的值。 之前我們的梯度下降法概況起來就是,將邏輯回歸表示成y^=wx+b,因為這個函數是個線性函數,我們期望的y取值是0到1之間(因為是二分類問題),所以這裡用了一個sigmoid啟動函數,把y取值映射到了0到1之前,之後再計算損失函數。計算損失函數的過程就是正向傳播。計算出了損失函數的值,就需要再利用反向傳播計算梯度,也就是下一次反覆運算中,我們需要如何調整輸入的w和b這兩個參數。這個調整的過程也就是學習的過程。因為我們希望損失函數的取值越小越好,所以這裡用了求導數的操作來計算梯度,取了損失函數取值下降最快的方向來更新我們的輸入參數。上述步驟是一層神經網路的正向傳播和反向傳播的過程,多層神經網路下就是把這個步驟同樣的推廣過去。因為之前有寫過,這裡就不贅述了。

上面步驟中的第一步,確定神經網路結構,可以簡單的理解成,確定神經網路所需要的hyperparameters。不同的hyperparameter對神經網路會有非常大的影響。什麼是hyperparameters呢?比如神經網路的層數,每層的神經元數量,啟動函數的選擇,反覆運算的次數以及learning rate。具體要怎麼根據任務來調整這些hyperparameters會在後面的內容裡做詳細的介紹。

適合做什麼

神經網路適合做什麼呢?其實目前神經網路已經有很多應用場景了,甚至在有些場景下神經網路已經有不了可替代的作用,如線上廣告點擊預測,圖像打標籤, 音訊檔轉文本,機器翻譯以及自動駕駛等。這些應用可以將神經網路分成Standard NN(房價預測,線上廣告點擊預測), Convolutional NN(圖像打標籤), Recurrent NN(序列資料,譬如隨時間播放的音訊流,一個一個的文本)。自動駕駛的情況比較複雜,需要同時處理圖像、雷達等資料,所以用到的是更為複雜的混合神經網路架構。

結構化非結構化資料

從訓練資料本身出發,我們可以將資料分為結構化的資料和非結構化的資料。例如房價預測中的輸入資料這類每個特片都有清晰定義的資料,我們稱之為結構化的資料;語音、圖像這類問題中,通常會使用的圖元值,並沒有明確可解釋的實際意義的資料,我們稱之為非結構化的資料。深度學習技術可以提升我們處理非結構化資料的能力,這也是為什麼近幾年在語音圖像領域經常出現突破,在我看來深度學習之所以提升了處理非結構化資料的能力,很大程度是因為神經網路是自動構建出了前文中提到的隱層,而且每個神經元的含義也是不需要去瞭解的。

為什麼深層神經網路會有更好的效果

以人臉識別舉例,神經網路的最最始的層可能是用於處理面部邊界的,其後的層可以在初始層的識別出的邊界上進一步發掘出面部的組件,比如鼻子、眼睛、嘴等,再之後層可以將前面識別出來的元件整合到一起識別出人的身份。這個例子就很直觀的表現出為什麼深層的神經網路會比淺層的神經網路要好。

如果你堅持看到這裡了,對深度學習和神經網路還是一點概念都沒有的話,我只能說,可能深度學習真的不適合你。開個玩笑,深度學習的內容後面還會繼續分享。有問題歡迎回復討論。

之前我們的梯度下降法概況起來就是,將邏輯回歸表示成y^=wx+b,因為這個函數是個線性函數,我們期望的y取值是0到1之間(因為是二分類問題),所以這裡用了一個sigmoid啟動函數,把y取值映射到了0到1之前,之後再計算損失函數。計算損失函數的過程就是正向傳播。計算出了損失函數的值,就需要再利用反向傳播計算梯度,也就是下一次反覆運算中,我們需要如何調整輸入的w和b這兩個參數。這個調整的過程也就是學習的過程。因為我們希望損失函數的取值越小越好,所以這裡用了求導數的操作來計算梯度,取了損失函數取值下降最快的方向來更新我們的輸入參數。上述步驟是一層神經網路的正向傳播和反向傳播的過程,多層神經網路下就是把這個步驟同樣的推廣過去。因為之前有寫過,這裡就不贅述了。

上面步驟中的第一步,確定神經網路結構,可以簡單的理解成,確定神經網路所需要的hyperparameters。不同的hyperparameter對神經網路會有非常大的影響。什麼是hyperparameters呢?比如神經網路的層數,每層的神經元數量,啟動函數的選擇,反覆運算的次數以及learning rate。具體要怎麼根據任務來調整這些hyperparameters會在後面的內容裡做詳細的介紹。

適合做什麼

神經網路適合做什麼呢?其實目前神經網路已經有很多應用場景了,甚至在有些場景下神經網路已經有不了可替代的作用,如線上廣告點擊預測,圖像打標籤, 音訊檔轉文本,機器翻譯以及自動駕駛等。這些應用可以將神經網路分成Standard NN(房價預測,線上廣告點擊預測), Convolutional NN(圖像打標籤), Recurrent NN(序列資料,譬如隨時間播放的音訊流,一個一個的文本)。自動駕駛的情況比較複雜,需要同時處理圖像、雷達等資料,所以用到的是更為複雜的混合神經網路架構。

結構化非結構化資料

從訓練資料本身出發,我們可以將資料分為結構化的資料和非結構化的資料。例如房價預測中的輸入資料這類每個特片都有清晰定義的資料,我們稱之為結構化的資料;語音、圖像這類問題中,通常會使用的圖元值,並沒有明確可解釋的實際意義的資料,我們稱之為非結構化的資料。深度學習技術可以提升我們處理非結構化資料的能力,這也是為什麼近幾年在語音圖像領域經常出現突破,在我看來深度學習之所以提升了處理非結構化資料的能力,很大程度是因為神經網路是自動構建出了前文中提到的隱層,而且每個神經元的含義也是不需要去瞭解的。

為什麼深層神經網路會有更好的效果

以人臉識別舉例,神經網路的最最始的層可能是用於處理面部邊界的,其後的層可以在初始層的識別出的邊界上進一步發掘出面部的組件,比如鼻子、眼睛、嘴等,再之後層可以將前面識別出來的元件整合到一起識別出人的身份。這個例子就很直觀的表現出為什麼深層的神經網路會比淺層的神經網路要好。

如果你堅持看到這裡了,對深度學習和神經網路還是一點概念都沒有的話,我只能說,可能深度學習真的不適合你。開個玩笑,深度學習的內容後面還會繼續分享。有問題歡迎回復討論。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示