Neural Network Representation
一個 nn 會有 input, hidden, output layer
因為 training set 不包含 hidden layer 的資訊所以得名
在說明 layer 數時,通常不會包含 input layer
Notation a
所有 superscript [i] 用來表示第 i layer
第一層的 a 就是 a1[1],a2[1],a3[1],a4[1]
input x 會用 a[0] 表示
Notation w,b
除了 input 以外,每一層都會有 w,b 這些 parameters
parameter w 的 dimension 會是 current layer nodes by parent layer nodes
w[1]=(4,3)
parameter b 的 dimension 會是 current layer nodes by 1\
b[1]=(4,1)
Computing a Neural Network's Output
一個 4 unit 的 layer 就要算四次 z 和四次 a
Vectorizing Across Multiple Examples
我們有 1 到 m 個 training examples
縱軸的 n 代表有 n 筆 hidden units
整個 vectorize 的 forward propogation 過程
Activation Functions
Activation function 會影響到 gradient descent 的速度
例如 sigmoid 在大於或小於一定數字後 slope 就會接近 0
所以 sigmoid 並不是最好的 activation function
但 sigmoid 可以用於 logistic regression 的最後一層 output (0, 1)
tanh 是一個可以取代 sigmoid 的選擇
他就是 sigmoid 的位移,區間變成 [-1, 1]
因為平均值變為 0 的關係,有集中 data 的效果
ReLU 是現在所有人公認最好的 activation function
如果你不知道該用什麼在 hidden layer,用 ReLU 就對了
他解決了 sigmoid 在一些數字越大時,slope 越小的問題
Why Non-linear Activation Functions
若你把某一層 hidden layer 的 activation function 全部取消掉
輸入會永遠等於輸出,這稱為 linear activation function
若使用 linear activation function 則該層的運算會跟沒算一樣
甚至在所有 hidden 使用 linear,而最後一層使用 sigmoid 時
算出來的效果比 logistic regression 還要差
Derivatives of Activation Functions
為了能夠計算 gradient descent (backpropogation),需要知道每個 activation function 的導數為何
Gradient Descent for Neural Networks
所以 Gradient Descent 大致上運作如下
所以以下是一個已經 vectorized 的 backpropogation formula
See the full derivatives here:
Random Initialization
所以在初始化 nn 的 weights 時,會使用隨機取值
以下是用 python 進行 random initialization 的動作
w1 = np.random.randn(2, 2) * 0.01
b1 = np.zeros(2, 1)
w2 = ...
b2 = ...
...
z[1]=(w[1]T)X=w1[1]Tw2[1]Tw3[1]Tw4[1]Tx1x2x3+b
裡面的 w[1] 就是一個 4 * 3 的矩陣
a[1]=σ(z[1])
另外我們可以用 a[0] 來表示 X
所以計算 y^ (forward propogation) 的運算如下
z[1]a[1]z[2]a[2]=W[1]a[0]+b[1]=σ(z[1])=W[2]a[1]+b[2]=σ(z[2])
若用 for-loops 來計算每一個 example 對應的 y^
裡面的 a[2](1) 代表第 1 筆 example 的 layer 2 的 a 向量
⋮x(1)→a[2](1)=y^(1)x(2)→a[2](2)=y^(2)x(m)→a[2](m)=y^(m) 我們的目標其實就是用 nx * m 的 X 矩陣
來算出 1 m 的 Z 矩陣,再求出同樣為 1 m 的 A 矩陣
Z[1]A[1]Z[2]A[2]=W[1]X+b[1]=σ(Z[1])=W[2]A[1]+b[2]=σ(Z[2]) ez+e−zez−e−z
Sigmoid 為 g(z)=1+e−z1
dzdg(z)g′(z)=1+e−z1(1−1+e−z1)=g(z)(1−g(z))
Tanh 為 g(z)=ez+e−zez−e−z
g′(z)=1−(tanh(z))2
在 nn 中我們會以 a=g(z) 表示,所以微分也可寫成以下
g′(z)=1−a2
ReLU 為 g(z)=max(0,z)
g′(z)={01if z<0if z≥0
當 z=0 時雖然為 undefined,但在電腦中可以自行決定要等於 0 或 1
Leaky ReLU 為 g(z)=max(0.01z,z)
g′(z)={0.011if z<0if z≥0
input, hidden, output units 的數量,分別為 n[0],n[1],n[2]
Parameters 有 w[1],b[1],w[2],b[2]
w[1]=n[1]×n[0]
b[1]=n[1]×1
w[2]=n[2]×n[1]
b[2]=n[2]×1
然後 Cost Function 為 m1∑i=1nL(y^,y)
Repeat : Compute predicts (y^(i),i=1⋯m)dw[1]=∂w[1]∂J,db[1]=∂b[1]∂Jw[1]=w[1]−αdw[1],b[1]=b[1]−αdb[1]dw[2]=∂w[2]∂J,db[2]=∂b[2]∂Jw[2]=w[2]−αdw[2],b[2]=b[2]−αdb[2] 接著我們要深入一點,在公式中解出 dw[1]=∂w[1]∂J 這些導數
dZ[2]dW[2]db[2]dZ[1]dW[1]db[1]=A[2]−Y(sigmoid)=m1dZ[2]⋅A[1]T=m1np.sum(dZ[2],axis=1, keepdims=True)=W[2]TdZ[2]⋅∗g[1]′(Z[1])=m1dZ[1]⋅XT=m1np.sum(dZ[1],axis=1, keepdims=True)Y=[y(1)⋯y(m)] 第四行的 dZ[1]=W[2]TdZ[2]⋅∗g[1]′(Z[1]) 是怎麼來的
∂Z[1]∂L=∂A[2]∂L⋅∂Z[2]∂A[2]⋅∂A[1]∂Z[2]⋅∂Z[1]∂A[1] 紅色部份就是 dZ[2]dL=dZ[2]
綠色部份就是 Z[2] at A[1] 的導數,等於 W[2]
最後藍色部份是 A[1] at Z[1] 的導數,等於 g[1]′(Z[1])
在 machine learning 中提過,若 weights 初始全為 0