梯度下降
梯度下降,就是對函數進行微分求取切線的斜率。
其實這個不好懂,所以換個角度來思考。牛頓告訴我們,當有加速度時,瞬間速度的公式是 $(v=at)$,v 是速度,a 是加速度(感受一下加速度,當車子一加速,人會往後傾,油門加愈大,感覺往後傾的力道愈大),t 是時間。
比如 a=2,那就是每秒鐘增加 2 m/s 的速度,第 0 秒的速度是 0 m/s,第 1 秒的速度是 2 m/s,第 2 秒的速度是 4 m/s, 那麼第 10 秒的速度就是 20 m/s。
再思考一個問題,第 1 秒車子會移動到多少公尺 ? 第 2 秒車子會到那裏? 公式是 $(S=\frac{1}{2}at^{2})$。如下的程式
import pylab as plt import numpy as np t=np.linspace(0,10,100) a=2 v=a*t S=(1/2)*a*t**2 fig, axes=plt.subplots(1,2, figsize=(12,6)) axes[0].plot(t, v) axes[0].set_title("Speed") axes[0].set_xlabel("Time") axes[0].set_ylabel("Speed") axes[1].plot(t, S) axes[1].set_title("Distance") axes[1].set_xlabel("Time") axes[1].set_ylabel("Distance") plt.savefig("accele_1.jpg") plt.show()
上面右邊的圖,可以看到 x 軸是 time,y 軸是距離,而 $(S=\frac{1}{2}at^{2})$ 微分後產生的那一個直線斜率就是速度,也就是 $(v = at)$。
那麼換成 $(y = \frac{1}{2}ax^{2})$ 呢,那麼請問微分後 $({y}’ = ax)$,這個 $({y}’)$ 是什麼? 我們都知道 $({y}’)$ 是斜率,但這斜率到底代表著什麼意思?? 一頭霧水,所以沒有物理學的運動定律公式就很難理解。
梯度下降的目的
梯度下降的目的,就是在曲線中找到極值。所以必需在特定的軸中一步一步逼進,進而找到斜率最接近 0 (水平斜率) 時的值。比如在底下的 $(y=x^{2})$ 函數中,要找到 y 的最小值,就必需沿著 x 軸一步一步逼進,求出 f(x) 的微分 $(\bigtriangledown f(x))$ 何時最接近 0 ,進而求出 y 值。
一階微分找極值
$(y=x^{2})$ 這個函數要找極值其實很簡單,根本不用什麼逼近法。 只要 y 對 x 作一階微分 $(y’=2x)$,然後求取 y’=0,也就是說 2x =0,自然就會知道 x=0 時有極值。
逼近法是在不知函數是多少時的解法!? 怪怪的喔,不知道函數是多少,那又怎麼對函數微分!!! 其實我們微分的對象是損失函數。
再度複習迴歸線
先使用以下的代碼產生亂數
import numpy as np import pylab as plt n=100 x=np.linspace(0,100,n) y=3*x+5-np.random.randint(0,100,n) plt.scatter(x, y) plt.show()
由上面這些點(資料),要去找 f(x) = y = ax + b 的迴歸線。x 及 y 都知道了,也就那 100 個點的 x 軸及 y 軸的座標。問題來了, a 及 b 是多少。f(x) 都不知道,怎麼微分啊。