TensorFlow 筆記(4): 改善 simple logistic regression model

Source: Deep Learning on Medium

TensorFlow 筆記(4): 改善 simple logistic regression model

在前一篇筆記裡, 做了一層的logistic regression model

接著要作一些調整來改善

variable scope

原本的模型裡, 只有一層hidden layer, 如果改成兩層hidden layer, 在變數的使用上會變得冗長:

def build_model(X, num_input, num_output):
n0 = num_input # MNIST data input (img shape: 28*28)
n1 = 256 # number of neurons in 1st hidden layer
n2 = 256 # number of neurons in 2nd hidden layer
n3 = num_output # output layer
W1 = tf.Variable(tf.random_normal([n0, n1]))
B1 = tf.Variable(tf.random_normal([n1]))
W2 = tf.Variable(tf.random_normal([n1, n2]))
B2 = tf.Variable(tf.random_normal([n2]))
W3 = tf.Variable(tf.random_normal([n2, n3]))
B3 = tf.Variable(tf.random_normal([n3]))
Y1 = tf.add(tf.matmul(X, W1), B1)
Y2 = tf.add(tf.matmul(Y1, W2), B2)
yhat = tf.add(tf.matmul(Y2, W3), B3)

可以看到W與B的使用上相當重複, 再加上今天只是簡單的logistic regression, 如果要再加上其他操作, 那麼會有非常多的變數要命名

這時候我們可以為 variable 加上 variable scope, 這裡會用到兩個 function, get_variablevariable_scope

get_variable 的作用是當 variable 存在時就取出 variable, 若 variable 不存在則創建 variable

於是我們以層為單位創建 variable

這裡可以看到第二個參數帶 shape, 最後一個參數是帶 initializer

接著我們將建立所需的每一層, 並加上 variable scope

Activation Function

Activation Function 在 Deep Learning 裡的作用主要是加上非線性的因素。因為如果我們加的每一層都是 logistic regression, 那麼結果等同於只有一層 logistic regression。

Activation Function 有很多種, RELU是其中一個非常常見的一個, 它的定義很簡單

當值小於0就輸出0, 當值大於0就輸出原本的值

我們將每一層都加上relu

這裡順帶一提的是, 原本我在做測試時, W的initializer只有使用預設值, 其中standard deviation 在1.11.0版的預設值是1, 太大了, 容易造成overflow, 改成 sqrt(2/input_size)之後就好多了

Optimizer

原本使用 Gradient Descent Optimizer 有一些問題, 在 deep learning 的 model 裡, 存在許多 local optimization, 這些解就像是山谷一般, 除非靠某些方式跳出這個山谷, 不然無法難以到達最佳解

現在比較流行的方式有兩個考慮的點, 第一個是根據歷史狀況調整 learning rate, 這樣可以在初期的時候快速收斂, 也比較容易在初期跳出區域最佳解。第二個是加入動量, 物理的動量就像是一顆行進中的球, 經過山谷時他不會立刻停下, 而是會根據當前速度以及等加速度來更新速度,這種方式也比較容易跳出山谷之中。

AdamOptimizer是結合這兩種的做法, 也是相當流行的作法, AdamOptimizer的 default learning rate 已經是還不錯的選擇, 當然我們也可以自己設定 learning rate

文章寫到這裡時, 又反覆測試了幾次, 發現仍然會有停在 local optimal 的情況。同時也測試網路或書上的一些範例, 也有相同的狀況, 有時訓練狀況很好, 有時卻很差, 似乎是 logistic regression 的坑相當多, 容易停在 local optimal