Introduction & Linear regression
講師 Suzy (蘇西)
技能點:
寶寶蘇西
機器學習是一個研究領域,旨在賦予電腦無需經由明確指令就能具備學習的能力。- Arthur Sameul (1959)
他的電腦跳棋程式是世界上最早能成功進行自我學習的電腦程式之一。
對於某類任務 T 和 表現 P,如果一個電腦程式在處理任務 T 時的性能(以 P 為量測標準)隨著經驗 E 而改善,則稱該程式從經驗 E 中學習。- Tom Mitchell (1998)
他領導開發了一個非常有名的系統,叫作 NELL (Never-Ending Language Learner)
例:
監督式學習
非監督式學習
強化學習
人工智慧
【條件】一組數據有 m 個範例
【目標】給定 x 值,預測 y 值?
坪數
房價
坪數
房間數
房價
其實可以弄成很多維度
考量不同特徵
Regression vs Classification
分類
迴歸
監督式學習 & 圖片識別 Image Classification
x = 圖片像素
y = 圖片中的主要物件
監督式學習 & NLP 自然語言處理
機器翻譯
x
y
【條件】一組數據但沒有標記(沒有先給標準答案)
【目標】找看數據點的分佈有沒有什麼有趣的現象
"You shall know a word by the company it keeps."
- John Rupert Firth (1957)
一個詞的意義在於它語其他詞之間的差異與關係。
強化學習是機器學習中的一個領域,強調如何基於環境而行動,以取得最大化的預期利益。
其靈感來源於心理學中的行為主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能獲得最大利益的習慣性行為。
- Wikipedia
Data
Collection
Training
嘗試策略
蒐集反饋
根據反饋
改良策略
簡言之,
坪數
房價
畫線。
坪數
房價
訓練資料
學習
演算法
假設
函式
我們把預測函式
或者是,如果你有多個特徵的話
預測房價
坪數
房間數
寫出來吧
(令有
筆資料)
(令
)
(令
)
聽說也可以寫成這樣
【目標】 最小化
坪數
房價
目標就是要找到一條線,
讓點到線的距離總和最小。
預測值 - 實際值
啊找線其實就是在找
它是我們的 損失函數 (loss function)
m 是特徵數,不然特徵數越大損失越大好像怪怪的
因為大減小或小減大都是距離(損失)
好問題,下集待續。
所以說到底要怎麼找
想像我們的
長這樣
或是這樣
那我們的目標應該是要走到最低點
因為這樣可以確保
達到最小值(損失最少=函數最準)
斜率為正
我們先找個簡單的函式舉例一下
斜率為負
我們先找個簡單的函式舉例一下
斜率為零
我們先找個簡單的函式舉例一下
這就是我們要找的點。
(實作時只要夠接近 0就好)
所以找斜率我們會需要來點
其實不難,我們只需要會兩個東西
第一個東西:the power rule (冪次規則)
就是次方項拉到前面(當係數乘上去),然後次方項 -1
舉例:
微分
第二個東西:the chain rule (連鎖律)
舉例:
就是一種剝洋蔥,一層一層微進去的概念
所以是這樣的:我們要根據斜率,不斷更新
直到
夠接近其最小值為止
(=它的斜率夠接近 0)
learning rate (學習率,一次調整多少 / 走多遠)
學習率是一個 hyperparameter 「超參數」,是機器學習模型訓練前人工設定的外部配置參數,用於控制學習過程,無法從訓練資料中自動學習得到。
(根據冪次法則把 2 乘到前面,然後因為連鎖律所以產生一個 )
我們把它打開,變成
註 1: 這樣知道為什麼 前面乘一個 1/2 了吧
註 2: 該特徵值影響越大,則移動越多
如果今天訓練資料量很大,
每次移動都要考慮 n 筆資料的話,
會算很久(而且很貴)
隨機梯度下降:每次只考慮一筆資料(由 1 到 n 循環)
所以向各位介紹
SGD 沒辦法達到真正的 最小值
但也夠好了(可以透過調整學習率來提升準度)
另外還有 mini-batch gradient descent(批次訓練)
每次移動考慮一批資料(例: 100 筆)
import numpy as np
#the training data
x = np.random.randn(50, 1) # 50 筆資料
y = 2*x + np.random.randn(50, 1)
theta_1 = 0.0
theta_0 = 0.0
# hyperparameter
alpha = 0.01 #學習率# 梯度下降
def descend(x, y, theta_1, theta_0, alpha):
dl_theta_1 = 0.0
dl_theta_0 = 0.0
m = x.shape[0]
# loss = (y - (theta_1 * x + theta_0)) **2
for xi, yi in zip(x,y):
dl_theta_1 += -2 * xi * (yi - (theta_1 * xi + theta_0))
dl_theta_0 += -2 * (yi - (theta_1 * xi + theta_0))
theta_1 = theta_1 - (1/m) * dl_theta_1 * alpha
theta_0 = theta_0 - (1/m) * dl_theta_0 * alpha
return theta_1, theta_0
# 執行梯度下降
for epoch in range(800):
theta_1, theta_0 = descend(x, y, theta_1, theta_0, alpha)
hx = theta_1 * x + theta_0
loss = np.mean((y - hx)**2)
print(f'{epoch} loss is {loss}, parameters theta_1 :{theta_1}, theta_0: {theta_0}')
print(theta_1, theta_0)