這不是 bug, 是 feature (誤)

手刻 Deep Learning — 第零章 — 微分觀念入門

如果你不懂微分沒關係,我們利用國中數學知識來說明微分如何在 Machine Learning 中運作

Seachaos
tree.rocks
Published in
8 min readApr 24, 2021

--

前言

本文接續上篇線性回歸概念,我們現在要來看看誤差的修正怎麼運作的,這邊就需要微分的觀念

讓數學的高牆倒下

微積分這個概念在 Machine Learning / Deep Learning 非常重要
微分猶如指南針,幫助我們在數學中找到方向,有了方向我們就可以修正答案。 ( 例如下圖 )

用微分概念尋找高低點

想要知道 Deep Learning 如何運作,就要瞭解微分觀念,不需要什麼艱澀難懂的數學,不會算沒關係,電腦會幫我們算;但是觀念與概念我們要有,我們不用奇怪的數學符號或是公式,我們的目標就是要讓數學的高牆倒下,用加減乘除來說明他。

人一定要有知識,知識就是力量

知道概念很重要,例如微波爐,我們可能不會去動手製作 2.4G 微波的設備,但是你知道微波爐的原理後就不會把 純水/ 金屬製品 放入微波爐;又或說你了解某些商品原理,在購買商品時也比較不會吃虧。

大多數的數學公式實在令人費解,什麼 無窮接近、斜率、區間變數、dX、變量、集合這些名詞實在距離一般人太遙遠了。
(也可能是本人胸無點墨,無法悟透,大家都是強者所以覺得這些名詞與符號淺顯易懂?)

例如下圖也是本人亂打的公式範例,本人覺得這種東西是拒初學者於千里之外,我們不講這些怪符號,看看笑笑就好

Machine Learning 的公式之本人隨便亂打

什麼是微分

我們用哲學一點的方式來說

如果你微分你現在的人生,就可以預知你的未來

白話文這樣說:
你觀察你自己的生活,就可以預測你未來的生活
就是今天的你,相比昨天的你,進步了多少?

保持進步:你未來正在往好方向移動
沒有長進:大概也就這樣
持續退步:呃…

現在我們回到數學的觀點

微分的意義

我們前面說過,微分就是指南針的概念,它可以幫助我們找出任意數學公式的變化量,我們先用記者最愛的「重力加速度」來舉例…

假設一顆球落下的距離公式是 h = 1/2 (gt² ) ,公式複雜,看下圖翻譯一下

所以我們寫個 python 程式來看

def height(x):
return (1/2) * (9.8 * (x ** 2))
x = np.arange(0, 10, 0.01)
plt.plot(x, height(x))

現在我們可以知道第幾秒球在哪個高度,例如:

print('第', 6, '秒球位置', height(6))
# 第 6 秒球位置 176.4

那我們怎麼知道速度多少? 這個速度就是變化量,就是微分可以幫忙找出來的

  1. 我們回想一下怎麼計算速度? 就是「移動的距離」除以「移動的時間」
  2. 要如何剛好知道第 6 秒「目前」的速度 ? (我們只知道位置)
  3. 「目前」,其實我們可以看作是一瞬間,我們先假設 0.001秒
  4. 所以我們是不是只要知道 0.001 秒的差距就好 ? (實際上是非常小值,這就是為什麼微積分會有極限的概念)

整理一下

來寫 python 程式碼驗證一下:

pos = height(6.001) - height(6)
t = 6.001 - 6
print('速度:', pos/t)
# 速度: 58.80490000002138

看來可以得出「速度」沒錯,然後我們看一下圖,概念比較清楚

可以看到我們測量在 (X1 ~X2 ) 之間的時間越小,速度就越精準

接下來我們寫個微分函數
然後我們現在把 0.001 改成更小的數值(這樣更精準 ),如此我們就可以找出任意時間的距離變化量(就是速度)

def df(x):   # 微分函數
# 因為 [ 任何數.001 - 任何數 = 001 ]
d = 0.000001
pos = (height(x + d) - height(x))
return pos / d
print('第一秒速度:', df(1))
print('第二秒速度:', df(2))
print('第六秒速度:', df(6))
# 第一秒速度: 9.80000490002908
# 第二秒速度: 19.60000490441871
# 第六秒速度: 58.800004893555524

有沒有發現 ? 第 T 秒的速度竟然就是 9.8 x T ? ( 可能有誤差)
假設大家沒看過這公式,就可以由此得到證明,傳說中的重力加速度 9.8
( 第一秒 9.8,第二秒 9.8 x 2 = 19.6, 第 6 秒 9.8 x 6 = 58.8 )

找出變化量可以幹嘛?

如同我們前面所說,微分可以找到變化量,而這個變化量就是指南針的用途,有了這個值我們就可以知道目前的「速度」,然後我們還可以知道什麼時候是停止點,可以用來尋找數學公式 ( Machine Learning / Deep Learning )的答案。

類似 Machine Learning 的使用範例

我們假設今天有顆神秘的飛行器靠近地球,他的距離地球的公式由神秘外星人給我們了( 假設是一個 Machine Learning 神秘機器 ),但是我們解不出來,只知道把時間丟入那個公式就可以得到距離,假設神秘公式的 Python 程式碼 :

def func(x):
return (18 - x ) ** 2

那我們怎麼知道,他在那個時間點最靠近地球,然後開始遠離 ( 即速度等於 0 ) ?

我們只要透過微分就可以找到線索,寫一個微分函數:

def df(x):
d = 0.000001 # 觀察極小變化
return (func(x+d) - func(x)) / d

然後不停的修正我們的測量點,找到速度等於 0 的時間點

t = 32  # 隨便挑一個測量時間
learning_rate = 0.01
for _ in range(1000): # "訓練" 跑 1000 次
v = df(t) # 變化量(速度)
t = t - v * learning_rate # 修正我們測量時間
print('測得時間: {:.2f}'.format(t), ' 飛行器的速度: {:.2f}'.format(v))
print('距離地球: {:.2f}')

Learning rate 我們一般會設定一個小值,因為這是修正的速度 ( 中文應該叫做學習速率 ),後面會有示意圖,如果太大我們會距離答案太遙遠,太小會太慢,大家可以玩看看這個數值

我們整理一下程式碼

如下圖,我們從任意時間點 ( 32 秒)開始測量

或是從 5 秒處開始測量

我們只要把速度用來修正我們的測量時間 ( 速度 x learning rate ),不管我們從哪個時間點開始預測,找到速度 = 0 的時間,就是靠近最低點 (應該是 18 左右 )

就是因為微分還有可以找出靜止這個點的特殊能力
所以我們在 Deep Learning / Machine Learning / 線性回歸 之類方法中找到適合的參數有非常大的幫助

同場加映一下不同 Learning rate 的差別 ,讓大家知道這個數值的用途:
這是 0.03 的 :

這是 0.8

這是 0.9

可以看到 Learning Rate ( 學習速率 ),大雖然快,但是答案會震盪
所以選擇適合的方式很重要

結語

今天我們講了微分的概念
這也是為什麼線性回歸可以找到答案的原因

而上一章講到的

a -= optimizer(-2 * X, loss)

這是微積分數學公式推導回來的結果
有興趣的朋友可以去翻微積分的書籍,有更詳細的計算方式,可以透過數學公式簡化得到答案,不用像本文範例使用極小數值去計算 (真的不會算也沒關係,我們日後會再介紹 PyTorch,他可以幫我們自動追蹤與計算)

下一篇文章是矩陣的簡單概念說明

--

--