自己接觸的一些東西不夠深入,整個體系的結構也不夠清晰,所以回頭從一些入門經典資料進行重新梳理。以下內容圖片均來自Deep learning tutorial(李宏毅),其他內容均為本人自己的理解而做的一些記錄,不代表原文觀點,不保證准確性。
一、深度學習介紹
1.1 深度學習的介紹
先來看看機器學習是什么,可以看做尋找一個能夠得到我們期望解的函數。通過訓練數據,我們可以找到包含若干函數的集合,在其中找一個對問題有良好響應的函數(對給定的輸入,都能得到一個正確的解)。
有監督的學習指訓練的時候對每一個輸入,我們都已知其應該的輸出(標簽),我們的目的是學到一個函數,能夠滿足所有訓練集的輸入,都會得到其對應正確的輸出。這么說吧,我們有一組(x,y),我們要找到一個函數,對應每一個x,都會得到其對應的y值。
步驟:
- 定義一個函數的集合————-對應神經網絡
給出一個參數,來定義一個函數;對應給出一個網路結構,定義一個函數集合(權重和偏置是網絡的參數)。
單個神經元
這里需要重點引入一下softmax layer,文章中指出,一般來說,神經網絡的輸出可能是任意值,May not be easy to interpret。這里看來似乎是對輸出做了一個歸一化。
需要找到一個網絡結構使得你的函數集合中有一個好的集合
- goodness of function(我想這里就是找一個好的函數集合)
目的:損失最小即網絡輸出與目標之間的距離最小化,找一組參數最小化整個的損失。
- 找一個最優的函數(去優化函數)
找網絡參數使得損失最小化。窮舉總是不可能滴。反向傳播很經典,居然在推導以后我已經忘記了為什么要選擇梯度了。。。。重新溫習一下,為什么是負梯度方向。梯度方向是函數變換最快的方向,方向導數推出負梯度方向是函數在該點處減少最多的方向(方向導數最小那部分推導),梯度方向是函數增長最快的方向。所以在設置激活函數時,要求可微,即可求偏導數,即可得到負梯度方向,從而知道該點使函數下降方向,逐步使得損失函數最小的參數。(下圖中,對x求偏導數是關於各變量的偏導數,得到的是梯度。而對p求導,則是方向導數。)
上圖中,得到的梯度值本身為負值,負梯度即變成正值,即w增大的方向為函數下降的方向。反向傳播是一個有效計算梯度的方法。
1.2 why deep?
任何一個連續函數都可以用帶一個隱含層(足夠多隱含神經元)的網絡來實現。
為什么網絡是要越來越深而不是越來越胖?
基於邏輯電路為背景來說,邏輯電路由門組成,兩個邏輯門可以表示任何的布爾函數,使用多層的邏輯門較為簡單的建立一些函數(需要更少的門)。神經網絡由神經元組成,包含一個隱含層的神經網絡可以表示任何連續函數,多層神經元表示函數更加簡單(需要更少的參數)。
Deep與Modularization
后面層使用前面層作為模塊進行建立新的分類器(只需要少量的數據就可以訓練獲得)
1.3 進入深度學習
這里推薦的keras。
二、 訓練DNN的tips
2.1 深度學習的方法
訓練數據上取得好的結果
- 選擇合適的損失函數(均方誤差,交叉熵)
- mini-batch (minimize mini-batches loss 而不是total loss)
- 新的激活函數
網絡並不是越深越好,會出現梯度消失的問題,輸入端的梯度較小,學習的慢,幾乎是隨機的;輸出點的梯度較大,學習的較快,收斂的快。
如何去解決這樣的問題?在2006年開始,使用RBM做預訓練。2015年,開始使用ReLU(Rectified Linear Unit)作為激活函數,原因有:快速計算,生物學原因,無限的激活函數有不同的偏置,尤其是其解決了梯度消失的問題。一張圖來解釋所有:梯度沒有減少,並且得到了一個更瘦的網絡。
ReLU有多個變形形式,還可以看到ReLU是Maxout的特例,maxout network的激活函數可以是任何分段線性凸函數,一共有多少段,取決於這個網絡中有多少個元素。
- 自適應學習率
學習率如果很大,那么可能會一直錯過最小極值點(步長太大)。如果設定很小,訓練速度會很慢。流行的簡單方法是在每隔幾個epochs,以一定比例進行減少學習率。在訓練開始的時候,我們希望學習率要大一些,在幾個epochs以后,我們對學習率進行減少。學習率不太可能能夠通用,不同的參數,有不同的學習率。
各種改變學習率的算法(Adagrad、RMSprop、Adadelta、AdaSecant、Adam、Nadam)
- Momentum(動量)
找最優的網絡參數是困難的,可能只到近似平坦的地方、鞍點或者陷入局部最優。把物理中的動量現象放到梯度下降找最優點會怎么樣呢?
加上動量,能夠在平坦的地方或者鞍點繼續“運動”“順勢”找最優點,同時在局部最優的地方,會(添加)有一個動量,似乎是在努力看看能不能越過這個小山坡,指不定山坡的另一邊才是最優點。
測試數據上能取得好結果
- 及早停止:防止過擬合,防止過擬合的方法:大量的訓練數據,創造更多的訓練數據。增加驗證數據集(validation set)使網絡及早停止
- 正則化(權重衰減,weight decay是一種正則化的方式)
大腦的剪掉了神經元之間無用的連接,這里對機器的大腦做同樣的事情,去提高性能。
- Dropout
訓練時,對於每一次更新參數時,有一定比例的神經元被“拋棄”,也就是說網絡結構是改變的,使用新的改變的網絡結構去訓練,對於每一個mimi-batch,我們對從新采樣(選擇)要拋棄的神經元。測試時,選用全部的神經元進行預測,在訓練時,按照一定比例p舍棄神經元,即保留了(1-p)比例的神經元個數。那么測試的時候,就要將權重乘以(1-p),即保證了最終輸出大小一致。
這里的隨機Dropout,原文舉例類比其作用,在整個團隊都工作的,假如每個人都期望小伙伴能把工作做好,那么最后工作必然做不好,如果你知道你的小伙伴已經無法起作用(dropout),那就只能靠自己好好做好,激發每一個人最大的潛力,同時隨機性,又能保證一定的適應能力,意思是你和他能把事情做好,沒了他,你和她也能把事情做好,消除了神經元之間的依賴關系。還有一些觀點從動物的繁殖的基因重組比植物的無性生殖具有更強大的適應環境的能力方面進行類比解釋。
dropout是一種ensemble,最后的結果相當於多個網絡的輸出的平均。
- 網絡結構
CNN是一個非常好的例子。
三、神經網絡的變體
3.1 卷積神經網絡(廣泛用在圖像處理中)
why CNN for Image?
圖片中的一些模式比整張圖片要小,一個神經元不需要去看見整個圖片來發現這種模式,只用少量的參數來去連接小的區域即可。卷積網絡的特性:某些模式比整個圖片小,相同的模式出現在不同的區域。下采樣像素不會改變目標。
3.2 遞歸神經網絡(Recurrent Neural Network)