神經網絡基礎
(預警:本節開始涉及數學符號及必要的微積分、線性代數運算)
本節概要
在上一講中已經提到,“學習”就是要讓計算機自動去實現一個複雜函數,完成從輸入X到輸出Y的映射。機器學習的基本框架如下圖所示。
本節將從神經網絡的角度,應用這個框架。
首先要定義假設函數集合(function hypothesis set),又稱模型(model),然後根據輸入數據做訓練,去找到一個“最好”的函數
要解決的三個問題:
1. What is the model?(這個模型是什麼樣子的)
2. What is the “best” function?(如何定義“最好”)
3. How to pick the “best” function?(如何找到這個目標函數)
本節應用的任務的是分類(classification)問題,即預測輸入是已知類別中的哪一類,對應的是離散的輸出變量。
- 二分類問題(Binary Classification)
- 垃圾郵件過濾(是不是垃圾郵件)
- 推薦系統(該商品需不需要推薦給該用戶)
- 惡意軟件檢測(該軟件是否存在惡意操作)
- 股票預測(股票是漲還是跌)
- 多分類問題(Multi-class Classification)
- 手寫數字識別(圖片寫的是哪一個數字)
- 圖像識別(圖片裏的物體是什麼)
一. What is the model(function hypothesis set)?
換句話說,網絡結構長什麼樣?
對於分類問題,我們要找到這樣的
以手寫數字識別爲例,二值圖像可以統一調整成16*16的大小。輸入向量的每一維表示每個像素是0還是1;輸出向量用one-hot 表示,即對應類別的那一維標記爲1,其餘類別標記爲0。
回到我們要解決的問題,如果只用單層神經元,那麼連異或這種簡單的邏輯操作都很難完成,此處省略證明過程,所以引入多個隱藏層的神經網絡。
神經網絡作爲模型
全連接前饋網絡
最常用的神經網絡架構——全連接前饋網絡(Fully Connected feedforward network)如上圖所示,通常又稱深度神經網絡(Deep Neural Network,因其隱層數目多而冠上“Deep”)。
每一層的每一個節點都用前一層所有節點的輸出做權重和(weighted sum)後作爲輸入,經自身的激勵函數加工後,產生輸出給下一層。
神經網絡的數學標記
規定以下標記用於描述DNN(非常重要!):
- 第
l 層神經元的數目Nl ,除權重外,上標l 代表該神經元所在的層次,下標i 代表是該層的第幾個神經元。 - 兩個神經元之間的權重
wlij ,下標ij 代表從第l−1 層的第j 個神經元通向第l 層的第i 個神經元,上標l 代表後者所在層次。
- 這樣定義看上去很奇怪,但其實是爲了賦予權重矩陣
Wl 和向量x 所做的乘法的意義,很巧妙。
- 這樣定義看上去很奇怪,但其實是爲了賦予權重矩陣
- 神經元的偏置bias
bli ,第l 層神經元的所有bias構成向量bl - 神經元的輸入
zli 。第l 層神經元的所有輸入構成向量zl 。定義zli=∑j=1Ni−1wlijal−1j+bli - 神經元的輸出
ali ,第l 層神經元的所有輸出構成向量al 。定義ali=σ(zli) ,其中σ(·)爲激勵函數。
- 神經元的輸出
注意仔細觀察下面幾張圖!
單個神經元涉及的標記。
相鄰層次涉及的標記(前)。
相鄰層次涉及的標記(後)。
函數總覽
至此,我們就定義好了我們的model的樣子,即DNN式的網絡結構。
但是大量參數就意味着無窮大的假設函數空間,那麼我們怎麼從假設函數空間裏找到我們所需要的那個函數呢?接下來就要解決這個問題。
二. What is the “best” function?
由於不同的參數
定義函數
代價函數
定義代價函數(Cost Function)
那麼我們的問題就轉化爲搜索所有的參數θ,找到一組
實際上,代價函數的真正數學定義與我們的任務高度相關(task-dependant),不同的任務應當採取對應的代價函數。
多分類問題中常用的代價函數形式如下圖所示。
在這裏,代價函數衡量的就是對於所有樣本,模型的輸出
三. How to pick the “best” function?
梯度下降
定義完衡量參數的指標,接下來就是對參數調整來尋找最佳參數,那要如何進行調整呢?
如果用暴力搜索,那麼需要窮舉所有可能的θ,但是這樣做要計算到猴年馬月,所以顯然是不可能完成的任務。
實際的解決方法就是著名的梯度下降(Gradient Descend)。
先以單變量爲例來看梯度下降的概念。
直觀地理解:將一枚小球放在曲線的初始位置,那麼小球收到重力的影響就會沿着當前最陡峭的下降方向往下滾,直到穩定在一個“坑”裏。其中曲線相當於受自變量θ影響的函數值C(θ),最陡峭的下降方向就稱爲梯度(gradient),穩定的“坑”就稱爲局部最小值(local minima)。高等數學裏的知識告訴我們,讓函數曲線對該單變量求導,就可以算出斜率,就是我們要找的梯度。
對於參數優化問題,首先隨機選擇一組
對於多變量的情況,只是把求導換成了對各個變量依次求偏導,再同時更新參數。
上面提到的
接着是用泰勒展開來證明梯度下降的嚴格推導,這裏就不再展開。
總之,在我們搭建的神經網絡裏,我們要更新的θ就是所有參數
由於涉及大量的參數,要實現高效的計算梯度並更新,就要使用反向傳播算法(backpropagation,BP)。(在之後會詳細解釋)
這裏留下了一個問題,當C(θ)的值卡在極小值點處,或者鞍點(saddle point)時,該點的導數值爲0,不對參數進行更新,但實際上並沒有達到我們的目標。關於這個問題的討論留到後面的幾節裏。
訓練時的實戰技巧
參數初始化
參數的初始化(parameter initialization)確實會影響梯度下降的性能,但目前入門階段,我們只要隨機賦值即可,但不要把全部參數都初始化成一模一樣的值。
學習率的調整
上面提到,學習率是決定模型能否正常收斂,以及最終模型好壞的非常重要的因素。
比較理想的情況是,學習率能隨着迭代次數的遞進而變化。但是對於入門階段,李老師的建議是,用嘗試的方法仔細調整這個超參數。
從左邊這張圖上我們看到,隨着迭代的進行:
- 當
η 過大時,更新太劇烈,代價函數的值直接越過我們期望的最小值(error surface上的谷底),代價只會越來越大; - 當
η 偏大時,代價函數的值雖然會很接近最小值,但是依然在“谷底”兩側震盪,進入不了谷底。 - 當
η 偏小時,更新太緩慢,代價函數呈遞減趨勢,雖然會不斷逼近且成功到達最小值,但是需要大量的迭代計算,收斂速度較慢。 - 當
η 合適時,更新幅度比較理想,既保證了能順利收斂,而且收斂速度也比較快。
舉例:雙變量代價函數在不同學習率下的梯度下降圖示:
隨機梯度下降和mini-batch
優化的萬能藥
未完待續。。。