書-Deep Learning 用Python 進行深度學習的基礎理論實作
★梯度
☆梯度法
梯度
找出函數值遞減最多的方向。
下面這張圖可以看到在(0,0)點沒有箭頭,就是'最低位置',越往外箭頭就越大,而具有方向性。
圖程式:https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/gradient_2d.py
梯度法
要找出適合的參數(權重、偏權重),經過損失函數的值要小,是很複雜的,參數空間大,唯有善用梯度,找出函數最小值的方法稱'梯度法'。
梯度法是往減少最多函數的方向,但是有時得出來是區域最小值,而不是全域最小值(無法保證每次都是)。
稱函數最小值為鞍點(saddle point),就跟我下面的圖一樣你在不同位置所看到的最低點,並不一定是真正的最低點。
當函數形成扭曲的形狀,找不出最低點,就是進入了無法學習的狀況,稱「停滯期」。
這個就是梯度法的算式。
η :代表更新的量,在深度學習中稱為學習率(learning rate),決定一次的學習中要更新多少參數量。
學習率太大或太小都「無法達到適當的位置」,在神經網路學習中,通常會一邊調整學習率,一邊確認是否正確學習。
學習率:0.1
幾乎無限接近(0,0),下面來看學習率太高、太低。
學習率:10.0
學習率:1e-10
-----
程式,修改青色部分直接執行。
----------------------------------------------------
import numpy as np
import matplotlib.pylab as plt
def _numerical_gradient_no_batch(f, x):
h = 1e-4 # 0.0001
grad = np.zeros_like(x)
for idx in range(x.size):
tmp_val = x[idx]
x[idx] = float(tmp_val) + h
fxh1 = f(x)
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2*h)
x[idx] = tmp_val
return grad
def numerical_gradient(f, X):
if X.ndim == 1:
return _numerical_gradient_no_batch(f, X)
else:
grad = np.zeros_like(X)
for idx, x in enumerate(X):
grad[idx] = _numerical_gradient_no_batch(f, x)
return grad
def gradient_descent(f, init_x, lr=0.01, step_num=100):
x = init_x
for i in range(step_num):
grad = numerical_gradient(f, x)
x -= lr * grad
return x
def function_2(x):
return x[0]**2 + x[1]**2
init_x = np.array([-3.0, 4.0])
print(gradient_descent(function_2, init_x=init_x, lr=1e-10, step_num=100))
-------------------------------------------------------------------------------
lr:學習率
step_num:執行次數
----------
這個就是學習率是0.1的狀況,可以看到前面可以很快地一直往最低點去,到後面就慢慢地到了最低點,那他為甚麼知道要往右下呢?看第一章有箭頭的圖,會根據箭頭的方向往最低點去。
圖程式:https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/gradient_method.py //更改lr改變學習率
學習率也稱為「超參數(hyperparameter)」,跟其他參數(權重、偏權重)不同,超參數只能以人工的方式去修改,要經過測試才可以順利的訓練。
留言列表