1. 程式人生 > >深度學習:基本概念深度解析

深度學習:基本概念深度解析

我們前面經過了三個實際專案的歷練,在專案實踐中我們其實在不自覺中經歷了深度學習的重要步驟,以及踐行了深度學習過程中的一些重要概念,再此我們把這些概念提煉出來加以闡述和理解,這能為我們後面進行難度更大的專案打下紮實的基礎,我們需要搞清楚三個概念,分別是資料預加工,特徵工程,以及特徵學習。

資料預處理其實就是要根據專案特點,把相應的資料向量化。在絕大多數數情況下,神經網路的輸入資料格式都是向量,只不過不同的需求,輸入向量的維度不同而已。無論我們要處理的物件是聲音,影象,我們都需要把相關資料抽取出來,合成向量,例如前面專案中我們使用一種向量叫”one-hot”,也就是一個大向量,所有元素都是零,除了其中某一個是1.

我們還要注意的是,向量數值的正規化。在前面我們處理數字圖片時,它是灰度圖,每個畫素點取值在0到255之間。我們先是把整個圖片轉換成一個含有756個元素的向量,然後把向量中的整數先轉換成float32,然後把所有數都除以255。這樣我們把向量變成所有元素都在0-1之間的浮點數。在房價預測的案例中,我們做了更復雜的統計學處理,把各項數值處理成期望為0,標準方差為1的資料分佈。

在通常情況下,我們要儘量把輸入網路的向量中的數值“變小”。對於那些取值範圍不同的標量,例如在房價預測中,有些標量取值範圍在0-1之間,有些取值範圍在100-200之間,這種情況下更需要把所有標量做統一化處理。因此資料預處理可以總結為以下幾點:
1,把數值都變小,通常把陣列轉換到0和1之間。
2,統一化,把數值處理成在一個取值範圍之內。
3,統計化處理,把數值處理成期望為0,方差為1的分佈。

第三點看似複雜,但用python程式碼實現很簡單,如下:

x  -= x.mean(axis=0)
x /= x.std(axis=0)dddd

有時候我們還需處理的是資料缺失,本來需要100個數據,但實際獲得的只有90個,還有10個因為各種原因遺漏了,這在真實專案實踐中幾乎是必然發生的事情。通常情況下,我們可以用0填充遺漏的資料,要注意的是遺漏發生在測試資料集裡,處理這中情況的辦法是,在訓練資料集中做一些複製,營造出像測試資料集那樣有資料缺失的樣子,後面我們會詳細討論相應做法。

特徵工程。特徵工程是絕對整個專案成敗極為關鍵的一步,也是人工智慧中很大程度上需要人來完成的地方。特徵工程就是根據要處理物件的特點,找出那些具有決定性的特徵進行數量化。假定我們要做一個專案是,給定一張鬧鐘圖片,網路識別圖片後給出圖片中的鬧鐘表示的時間,原始資料就是如下一張灰度圖:

螢幕快照 2018-07-16 上午10.10.13.png

一般情況下,我們不會直接把圖片輸入到網路,而是做一些特徵抽取。第一步抽取是把時針和分針末端的座標抽取出來,例如[[x1:0.7, y1:0.7], [x2:0.5, y2:0.5]],更好的特徵抽取是記錄時針和分針與水平方向夾角,例如[[theta1: 45, theta2: 0],[theta: 90, theta: 140] ]

如果直接把圖片輸入網路,那麼我們就得考慮很多影象處理的因素,這就使得專案的實施難度陡然加大。處理圖片需要特殊的網路叫卷積網路,後面我們會專門介紹。特徵抽取得越好,我們處理起來就越簡單,而且最後判斷的效果也越準確。特徵抽取的好壞取決於人對問題的理解程度,理解得越深入,越能把握最關鍵的特徵。在深度學習出現以前,決定專案成本的就是特徵工程,當深度學習演算法足夠完善後,特徵抽取的好壞對專案的影響才減弱下來,因為深度學習具備一個特點就是能從大量若資料中提取出關鍵特徵。但儘管如此,特徵工程的重要性依然無法忽略,主要出於兩個理由:
1,抽取出好的特徵,能夠減少運算時所需的資源和時間,例如上面例子中,要使用卷及網路是很沒有必要的,因為後者消耗的資源太多。
2,好的特徵能夠讓我們消耗更少量的資料。在具體專案實踐中,資料量的大小至關重要,足夠大的資料量很難獲取,當資料量有限時,好的特徵才能夠提高網路的準確率。

過度擬合。從前面例子可以看到,當訓練網路時,迴圈超過一定次數後出現一個現象是,網路對訓練資料的判斷越來越準確,但對校驗資料的判斷越來越差,這種情況就是過度擬合。幾乎任何機器學習專案都得處理過度擬合問題。由於網路需要從訓練資料中抽取出規律性,但訓練資料總是有限的,所以它只能在區域性上展現問題的本質規律,當網路過度的學習訓練資料時,就會以為訓練資料所展現的區域性規律就是全域性規律,當測試資料展現全域性規律的另一部分時,網路就無法處理。

處理過度擬合的一個好方法就是增加資料量,因為資料量越大,對本質規律的展現就越完善,除此之外,處理過度擬合的方法還有,一是減少網路的大小或層次,網路層級越大,鏈路引數越多,對訓練資料的記憶就越深入,因此擬合就會越容易過度,但如果網路的層次過少,鏈路引數不足,那麼網路就越難以把資料背後的規律給抽取出來。

問題就在於網路的大小沒有固定的方法來確定,只能依靠人的經驗判斷,這一步是人工不智慧的地方。通常做法是一開始先讓網路的層次比較少,然後再慢慢增大看效果如何,慢慢增大網路層次,直到網路對校驗資料的判斷錯誤率上升為止。下圖展示了網路層次減少前後的效果,交叉表示網路層次減少前對資料判斷的錯誤率,圓點表示網路層次減少後的錯誤率:

螢幕快照 2018-07-16 上午10.54.57.png

從上圖可以看到,減少網路層次後,出現過度擬合的情況比減少前要晚。以交叉為代表的網路在2.5次迴圈後出現過度擬合,而以圓點為代表的網路要在5次迴圈後才會過度擬合。

除了減少網路層級能預防過度擬合外,限制鏈路權重變化的範圍也能產生作用。通常做法是為每個權重的增加引入一個成本函式,當權重增加越大,導致引入的成本越大,這樣網路就會在訓練過程中注意把權重的增加幅度控制在一定範圍內。成本函式有兩種,一種叫L1,也就是成本的增加與權重jueduizhi 成正比關係。第二種叫L2,成本的增加與權重的平方成正比關係。例如我們通過下面程式碼可以引入L2成本函式:

model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu',))

l2(0.001)表示在計算損失時,把該層權重值平方的0.001增加進去,有了上面方法後,我們再看看效果:

螢幕快照 2018-07-16 上午10.54.57.png

交叉表示引入L2成本前的情況,圓點表示引入L2成本後的情況,可以看到引入L2成本前它過度擬合的嚴重程度比引入L2後要強很多。

第三種方法叫輸出結果隨機清零。這種方法對處理過度擬合很有效果,假設某一層網路輸出一個結果向量:[0.2, 0.5, 1.3, 0.8, 1.1] ,在把這個結果提交給下一層神經元時,我們隨機把裡面一些元素清零,例如把向量變成[0, 0.5, 1.3, 0, 1.1],利用keras框架,我們很容易實現這個功能:

model.add(layers.Dropout(0.5))

以上就是我們要澄清和理解的一些概念。深度學習最常用的就是預測,但很多問題是預測不了的,例如股價就沒法預測,因為單靠以往的股價資料不能提供足夠的資訊量給網路,你要想預測股價,你需要做很複雜的特徵工程,而這種工程很可能是實現不了的。另外在使用神經網路進行預測時,要注意資料的永續性,例如你要做一個推薦系統,用於推薦衣服,如果你有夏天衣服購買的資料,拿這些資料訓練處網路後,它根本就不能用於在冬天給使用者推薦衣服。

從下節起,我們進入到影象識別階段。

更多技術資訊,包括作業系統,編譯器,面試演算法,機器學習,人工智慧,請關照我的公眾號:
這裡寫圖片描述