人工智慧是目標,機器學習是手段,深度學習是方法

智慧:天生本能與後天學習

天生本能:設計者事先設計之功能(hand-crafted rules)
缺點:
須考慮所有可能性
永遠無法超越創造者
耗費大量人力

後天學習:machine learning = Looking afor a function from data
架構:
    1. 找一個model -> a set of function = model
    2. 找一個機器可被衡量好壞的方法
    3. 一個好的演算法挑出最好的function

regression:輸出數值
classification:輸出類別
semi-supervised leaarning : 有一些照片有標記,大部分沒有標記,沒標記的資料也能對學習有幫助
transfer learning : 本來辨識貓狗的模型,餵進其他類別的資料,有些有標記,有些沒有 
unsupervised leaarning : 只給function的output,沒給input,機器要學會如何自己生成output
structure learning : 機器要輸出一個複雜的物件,例如輸入一段音頻,輸出文字(語言辨識),或機器翻譯、人臉辨識_要輸出有結構性的東西_用GAN
reinforcement learning : 機器不會拿到答案,而是每次輸出都有一個評分
(監督式:learn from teacher、強化學習:learn from critics)

Regression

例如:股票預測、自駕車、推薦系統

step1. MODEL

y = b + w * x
b : bias
w : weight
x : features
Loss function 用於衡量一組參數的好壞,input是function,輸出好壞程度

step2. Goodness of Function

step3. 挑出Loss最小的function

窮舉所有w, b組合使Loss最小
只要Loss function是可微分的,gradient descent都可以用於求解argmin Loss
微分結果是 negative -> w++, positive -> w-- 
微分結果(dL/dw)越大,走越大步
(所以是 -learning rate * 微分值大小) 

gradient就是那個倒三角L,w & b 對L的偏微分結果放成一個vector,可看做Loss的等高線法線向量

gradient descent有個麻煩,會根據初始值選取不同,會找到不同的best function
不過在線性模型中loss function是convax,不管從哪走都會落到最小

gradient descent怎麼算

gradient descent重點一

影響gradient descent的一個很重要的因素是learning rate,太小走很慢,太大可能反而Loss越來越大,或是卡住
因此實作上如果要用gradient descent就要把右邊這張圖畫出來,觀察哪一個learning rate比較合適

手調麻煩,有沒有辦法自動調learning rate?
最簡單的方法就是一開始走大步(因為離目標還很遠),隨著時間越走越小步(比較靠近時就走小步)
另一個方法是給不同參數不同的learning rate:Adagrad
每一個參數的learning rate都把他除上過去所有算出來的微分值的root mean square
Vanilla(原本的)learning rate同一個,隨時間變化
Adagrad是每個參數有自己learning rate的調整步伐

矛盾?
gradient越大,一個是效果越大,一個是效果越小

如何解釋?
1.反差

2.
現在考慮一個二次式的參數
最低點式-b/2a,假設起始點x0則最好的步伐大小就是x0+b/2a,整理完就是(2ax0+b)/2a,樓上那項就是x0那點一次微分的結果
因此微分結果越大表示離原點越遠,則learning rate踏出去的步伐跟微分結果成正比是比較好的
但若有多個參數就不能這樣考慮

2.
現在考慮一個二次式的參數
最低點式-b/2a,假設起始點x0則最好的步伐大小就是x0+b/2a,整理完就是(2ax0+b)/2a,樓上那項就是x0那點一次微分的結果
因此微分結果越大表示離原點越遠,則learning rate踏出去的步伐跟微分結果成正比是比較好的
以上是只考慮一個參數時才成立

今天有多個參數時:gradient越大就離原點越遠這件事不見得成立
如下圖,若是跨參數a&c做比較,c的微分值比a大,但是c離目標的距離比a短

那今天如果要考慮跨參數,我們應該怎麼想?
剛剛我們忽略分母的2a,此剛好是y的二次微分
因此最好的step不僅要和一次微分成正比,也要和二次微分大小成反比
如下圖,在w1方向上二次微分比較小(曲線較平滑)在w2方向上二次微分比較大(曲線較尖),光比較ac的微分值不夠,要a的微分值除掉二次和c的微分值除掉二次再去比

再Adagrad如何呈現?
由於在參數量大時算微分超久,因此用另一種沒有增加運算量的方式去估計二次微分的值
之前我們只會在一次微分上sample一個點,但這樣看不出二次微分值是多少,但是如果sample夠多點,就會發現比較平滑的曲線他的一次微分通常比較小,反之
因此Adagrad分母就是在一次微分上做sampling,用來反應二次微分

gradient descent重點二

Stochastic gradient descent:可以使traning更快一點
他不是像原本加總所有sample,他一次只算一個sample,在更新參數時只關心那一個example,所以Stochastic gradient descent就是看一個example就更新一次
若有20個example,遠本的是只update一次參數,Stochastic則已經update 20次參數,走得比較快

### gradient descent重點三

Feature scaling
若是不同參數有不一樣的尺度,則希望可以縮到同一個尺度,以防scale比較大的參數對y有較大影響,如右圖,w1的scale比較小,曲線較平滑,對y的影響比較小
這樣的好處是,若是橢圓形,則不同參數就要有不同的learning rate(走的方向一定會繞,不是一開始就朝著圓心走),正圓形就不用(一定是朝著圓心走),因此做scaling再參數update時會比較有效率

Feature scaling常見做法(有很多種):
假設有R個example,每個example裡面都有一組feature
做法是對每個做法是對每個dimension i都去算mean & sd
對第r個example的第i個component做標準化

gradient descent的原理

拿到一個error function,我們無法直接說出最低點在哪裡,但是如果是給一個error function加上起始點,以它為圓心畫一個圓,可很容易找到紅色圈圈內最低點,接著以最小點為圓心畫圓最低點,等等等

用到泰勒展開式
當x很靠近x0時,h(x)可寫成右下那樣子(只考慮一個變項)
若今天有多變項時,則為右邊那張圖

回到gradient descent

想像淺藍深藍為一向量,則若要讓loss最小(minimize L(theta))就是選和(u,v)相反的向量,並增長到紅色圈圈的邊緣(*eta)
因此theta向量就是中心點減掉樓上那串

u, v丟回來,就是gradient descent
我們可以用這個方法找最小值前提就是那個泰勒展開式的Loss function的近似要成立(夠精確),而圈圈(learning rate)要夠小泰勒展開式給我們的近似值才夠精確
以上是只考慮一次式的泰勒展開式,要採用二次式三次式都可以,但今天若是要做deep learning幾乎無法承受(算二次微分太久),因此大部分深度學習還是採用gradient descent

gradient descent的限制

會卡在local minimum & saddle point (微分值是零)
更甚的是,可能跑到微分值是零的地方以為是local minimum,但其實是卡在高原,連local minimum都還沒接近

Result

## 如何變得更好?

引入二次式作為模型?三四、四次等等依次嘗試

模型越複雜,結果不一定越好,會有overfitting問題
為何模型越複雜,training error會越來越低?
因為四次式function包含三次式,五次式包含四次式
如果今天你有一個越複雜的medel,裡面包含越多的function,
理論上就可以找到一個function可以讓你的error rate越來越低
(前提是gradient descent能夠真正找出best function)
但是在testing data上看起來是不一樣的,即overfitting

收集更多資料,發現物種對CP值有很大的影響
對不同物種給予不同參數 w,一樣是線性模型

## 再變更好?

弄一個超複雜的模型?
太複雜,overfitting,需要domain knowledge加入,刪除不必要資訊

若沒有domain knowledge怎麼辦?
Ans. Regularization(重新設計Loss function

*加入lambda*sum(wi^2)(lambda手調)
此代表我們更傾向用參數較小(接近零)的function,why?
參數越接近0,function是越平滑的(output對變化比較不敏感

*在做Regularization不需要考慮bias這一項,why? 
1. performance比較好 
2. bias對一個function的平滑程度是沒有關係的(加bias只是把function上下移動)

假設我們的input有bias(三角xi),輸出就會產生變化(加上wi*三角xi)
因此若wi->0,輸出對輸入就越不敏感,越平滑

也不是lambda越大結果越好,因此要調整

Error

Error來自哪裡?

error 來自 bias & variance
今天做了一個模型,得到一個error rate,若不知道error來自哪裡,就無法有效率improve model

Error是什麼?

今天我們要預測寶可夢進化後的CP值,有一個理論上最佳的function f^
我們用一堆訓練資料,去學出一個最好的function f*(可視為f^的estimator)
f^和f*的距離來自bias+variance

Error受到什麼影響

bias:實驗次數越多,結果越來越集中,bias越小
      比較簡單的model可獲得比較大的bias,反之
      why?
      (藍色線為紅線的平均)
      比較小(簡單)的function set可能其實沒有包含target function,頂多只能在哪小塊區域找到離target最近的,如果是複雜的function set,他就比較可能包含target function,只是不一定可以找到,因為給的training data不夠或不一樣,找到的f*都不一樣,但都是散落在target附近的

variance:比較簡單的model可獲得比較小的variance,反之
  why?
  比較簡單的model比較受到不同的資料的影響較小
  舉極端例子,f(x)=c,則不管跑幾次跑出來的model都會是一模一樣的,varaince=0,在這樣的例子用比較簡單的model預估出來就會有較小variance 

Error對模型的影響

若今天model的error是來自很大的variance就是overfitting(model無法fit testing data)_future work: 增加data set(不會增加bias)、regularization(使function變平滑,可能會增加bias_因為強制平滑,導致變成不包含target function)
若今天model的error是來自很大的bias就是underfitting(model無法fit training data)_future work: redesign model