書-Deep Learning 用Python 進行深度學習的基礎理論實作

image

★梯度

☆梯度法

梯度

找出函數值遞減最多的方向。

下面這張圖可以看到在(0,0)點沒有箭頭,就是'最低位置',越往外箭頭就越大,而具有方向性。

圖程式:https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/ch04/gradient_2d.py

image

梯度法

要找出適合的參數(權重、偏權重),經過損失函數的值要小,是很複雜的,參數空間大,唯有善用梯度,找出函數最小值的方法稱'梯度法'。

梯度法是往減少最多函數的方向,但是有時得出來是區域最小值,而不是全域最小值(無法保證每次都是)。

image

稱函數最小值為鞍點(saddle point),就跟我下面的圖一樣你在不同位置所看到的最低點,並不一定是真正的最低點。

當函數形成扭曲的形狀,找不出最低點,就是進入了無法學習的狀況,稱「停滯期」。

image

這個就是梯度法的算式。

image

η :代表更新的量,在深度學習中稱為學習率(learning rate),決定一次的學習中要更新多少參數量。

學習率太大或太小都「無法達到適當的位置」,在神經網路學習中,通常會一邊調整學習率,一邊確認是否正確學習。

學習率:0.1

image

幾乎無限接近(0,0),下面來看學習率太高、太低。

學習率:10.0

image

學習率:1e-10

image

-----

程式,修改青色部分直接執行。

----------------------------------------------------

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改變學習率

image

學習率也稱為「超參數(hyperparameter)」,跟其他參數(權重、偏權重)不同,超參數只能以人工的方式去修改,要經過測試才可以順利的訓練。

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()