Ref.: Training Neural Networks
影片中講到Backpropagation,它是一種利用chain rule連鎖率這個數學法則,達成有效率的梯度計算方法,跟之前講到的SGD角色不太一樣。
差異可以看這裡:What is the difference between SGD and back propagation?
實際視覺化的執行可以邊看邊往下滑:Backpropagation algorithm
TensorFlow已經在內部做好backpropagation,我們倒是不用太傷腦筋。
今天這邊要講的是一些Neural Network的一些best practices,並會講一些backpropagation的failure cases。
Lower layer(靠近input的layer)它的Gradients會變得很小,用它們計算時會產生很小的term,讓train變得非常慢。
而ReLU activation function可以防止這個問題發生
這篇文章可以看到詳細解釋:The vanishing gradient problem
跟上面相反,太大的Gradient也會造成問題,讓model很難converge。Batch normalization可以避免這個問題,同時降低learning rate。
這裡有解釋:Batch Normalization
使用ReLU時,只要它加權總合的input小於0,它就很難再加到大於0,也就不會再對這個Neural Network有貢獻。降低learning rate可以防止ReLU dying。
Dropout是對Neural Network有用的一種Regularization,是透過隨機捨去一些unit達成的。可以定義一個0到1的捨去比例:
實際概念可以看這裡:Dropout in (Deep) Machine learning
今天的文章有點少,但今天的程式練習很重要。
這次的練習用了很多normalize input的方法:
def linear_scale(series):
min_val = series.min()
max_val = series.max()
scale = (max_val - min_val) / 2.0
return series.apply(lambda x:((x - min_val) / scale) - 1.0)
def log_normalize(series):
return series.apply(lambda x:math.log(x+1.0))
def clip(series, clip_to_min, clip_to_max):
return series.apply(lambda x:(
min(max(x, clip_to_min), clip_to_max)))
def z_score_normalize(series):
mean = series.mean()
std_dv = series.std()
return series.apply(lambda x:(x - mean) / std_dv)
def binary_threshold(series, threshold):
return series.apply(lambda x:(1 if x > threshold else 0))
還多用了兩個Optimizer: AdagradOptimizer, AdamOptimizer,跟我們之前用的GradientDescentOptimizer, FtrlOptimizer一樣都是優化函數,詳細比較可以看下面兩篇: