1. 符號約定
- [],中括號表示與層相關,如[1]表示第一層,以此類推,輸入層表示為[0]層,一個神經網絡的層數不包括輸入層;
- (),仍然表示和樣本相關,如(1)表示第一個樣本點;
- 每一層都計算
和
,最后輸出層計算出來的
就是輸出
;
- 特征矩陣
,參數
,類似的,
表示第二隱層的參數矩陣;
-
,即特征向量(自變量);
-
,第一個隱藏層第
個節點的輸出值;
- 隱藏層與輸出層有參數,如隱藏層的參數
2. 只有一個隱層的神經網絡
2.1單隱層神經網絡
- 輸入層
- 輸出層
-
隱藏層,之所以叫隱藏層是因為中間層的數值在訓練集看不到。
如下圖所示,相關符號的意義參見符號規定節。
單隱層神經網絡圖
2.2 計算神經網絡的輸出——單樣本點
圖例中的隱藏層有4個節點,在每個節點處進行如下的計算。
節點計算示意圖
- 計算步驟(以第一個節點為例,第幾個節點只需要修改上標[]內的對應數值)
- Step1 計算
;
- Step2 利用激活函數(sigmoid函數),計算
即得到如下的計算式
- Step1 計算
- 向量化
,即為
的列向量
所以有
考慮到可以記作
,從而有如下單隱層神經網絡的計算公式:
2.3 計算單隱層神經網絡的輸出——多樣本訓練集
- 如果訓練集有
個樣本,需要對每個樣本都計算上面4個式子。
for i=1 to m:
- 向量化
仍然采用前面的記號
,即為
矩陣,一列代表一個樣本。
,即為
矩陣,一列代表一個樣本在不同節點的
值。
,即為
矩陣,一列代表一個樣本在不同節點的
值。
即一列是同一層不同的節點,一行是同一層同一節點的不同樣本。
從而有向量化結果:
考慮到,所以可以寫成如下對稱的形式:
3 激活函數
3.1 激活函數
在前面的推導中,我們的激活函數一直用的 sigmoid函數,還有其他的激活函數
可以用(一般是非線性函數,后面會解釋為什么是非線性函數)。
- 雙曲正切函數(hyperbolic tangent function)
,函數值在-1與1之間,函數圖像為
雙曲正切函數 - 在隱藏層,如果激活函數取為雙曲正切函數
效果基本都比sigmoid函數好。因為雙曲正切函數的均值是0,從而有類似數據中心化的作用,從而讓下一層的學習更方便一點。所以幾乎大部分情況都用此激活函數
- 有一個例外,二分類的輸出層用sigmoid函數作為激活函數效果更好。
即
-
sigmoid函數和tanh函數都有的一個
就是如果
非常大或者非常小,導數就接近于0,從而拖慢梯度下降方法。另一個常用的激活函數就是ReLU函數(rectified linear unit)
,函數圖像為
ReLU函數圖像-
,導數為1
-
,導數為0
-
,導數不存在,可以定義為0或1,并不影響
-
-
選擇激活函數的經驗
- 二分類,即輸出為0或1,用sigmoid函數;
- 其他都用ReLU函數。ReLU已經成為激活函數的默認選擇了,尤其如果你不知道用什么激活函數那就用ReLU函數!
-
ReLU函數的
就是
是導數為0,為此有leaky ReLU函數,修改
是函數取值不為0,例如可以定義為
,即
。函數圖像為
leaky ReLu函數圖像 ReLU與leaky ReLU的
就是沒有斜率離0很遠,從而梯度類方法很快。
3.2 為什么需要非線性激活函數?
- 為什么在神經網絡中不簡單的使用線性函數作為激活函數?讓我們來看一下。
從而有
所以無論你的神經網絡有多少層,實際上效果仍然是去掉中間所有隱層的線性回歸,類似的,如果,那么無論有多少層都效果都是logistic回歸。
- 有一種情況可以使用線性函數,就是回歸問題(預測值是實數)的輸出層,此時的隱藏層仍然不用線性函數。
3.3 激活函數的導數
- Sigmoid激活函數
sigmoid函數
實際上,前面已經計算過了
- 當
比較大時
,從而
,與圖像吻合;
- 當
比較小時
,從而
,與圖像吻合;
當,
,從而
,與圖像吻合。
-
只要計算出
的值就能很快算出來導數為
。
- 當
- tanh激活函數
tanh激活函數
- 當
比較大時
,從而
,與圖像吻合;
- 當
比較小時
,從而
,與圖像吻合;
- 當
,
,從而
,與圖像吻合;
-
只要計算出
的值就能很快算出來導數為
。
- 當
- ReLU激活函數與Leaky ReLU激活函數
- ReLU激活函數
ReLU與leaky ReLU激活函數
事實上,借助一次梯度的概念,可以定義為
- leaky ReLU 激活函數
事實上,借助一次梯度的概念,可以定義為
- ReLU激活函數
4. 神經網絡的梯度下降法
目的:學習神經網絡的參數
參數:
cost function:
前向傳播(Forward Propagation):
-
反向傳播(Backward Propagation):
,
-
,
- 上式第一個乘積是矩陣乘積,得到
維矩陣,
是
維,所以后面的是逐個元素乘積。
- 上式第一個乘積是矩陣乘積,得到
,keepdims參數可以不用,但為了防止出現秩為1的奇怪數組,需用reshape命令。
隨后迭代
-
小結:正向與反向傳播的主要公式如下
正向與反向傳播主要公式
5. 參數初始化
- Logistic回歸可以把參數初始化為0
- 但除Logistic回歸外,一般參數會隨機初始化,而不是初始化為0。
如果把神經網絡的全部參數都初始化為0,再使用梯度下降法,則會失效。
此時會出現完全對稱話,影響主要是權重參數,事實上,如果把偏置參數
都初始化為0是可以的。但是對權重參數如果都初始化為0,那么無論你的隱層有多少個節點,事實上它們計算的都是同一個函數,和只有一個節點是一樣一樣的,如下圖所示:
權重初始化為0示意圖 - 解決方法
W^[1] = np.random.randn(n^[1],n) * 0.01
b^[1] = np.zeros(n^[1],1)
W^[2] = np.random.randn(n^[2],n^[1]) * 0.01
b^[2] = np.zeros(n^[2],1)
之所以要乘以一個很小的0.01,是考慮到如果激活函數使用的是sigmoid函數或者tanh函數,很大時,此時梯度下降算法很慢,會減慢學習速度。