李宏毅 test
Youtube課程,35堂
各種課的投影片網址
[0] 簡易流程
盡可能增加資料
做feature
新增feature
做feature engineering(多次項)
做regularization
深化模型(模型選擇)
調整模型(先確認問題所在)
Underfitting:連training data都fit不進去。
需要重新設計Model(並沒有包含到最好的那個function)
新增feature,讓他更複雜
(collect更多data並沒有用)
Overfitting:training可以,test data爆掉。
需要更多data讓他更穩定(或是根據我自己知道的規則去fake up一些假的,手寫辨識圖片,向左向右旋轉一下也符合真實情況,但可以視為新資料。影像辨識左右翻轉也可視為新資料,語音辨識使用變聲器或增加合成雜訊)
新增regularization到loss項使得曲線更平滑,那個
項手動調整
畫圖:
把參數變化對Loss變化作圖(error surface),才知道方向和Lr是否正確
[1] Introduction
人工智慧從1950年代就有,1980視機器學習只是一種手段,2010深度學習才開始,這堂課是2017年開的,當今坐在2019年的電腦前。
機器學習的原因:
本能賦予的是無法超越創造者的(使用成千上萬的"IF"判斷式),機器自己學習那些rule是比人設定的rule還要有效率僅此而已,無論是逐行條列或未來擴充。
機器自己去找到一個function,有個input有個output,從大量的input去自己找到內部的轉換過程。
作法:3步驟
訂出function set:準備成千上萬的function(從同一個model裡面延伸的),選擇哪種邏輯的function set,Linear,non-linear,deep-learning。
有效率的挑選分數最好的function:是否有舉一舉一反三的學習功能
課程地圖:(最高位階的是senario,比較無法控制的情境,不像是可以選擇的data,第二層是解的問題種類,我們如何把現實生活的問題重新塑造成機器可以的用武之地,第三層是使用的方法,不同情境仍可以相同方法)
Supervised learning(label成本高)
Regression:輸出一個數值(scalar)
Classification:Binary是非題(垃圾郵件與否),Multification選擇題(新聞分類)
Deep learning
SVM,decision Tree,K-NN
Structure learning:具有結構性的output,語音辨識,語言翻譯,人臉辨識。(獵人的暗黑大陸,才是真的精髓所在,像是GAN對抗式生成)
Semi-supervised learning:只有一點點的label資料
Transfer learning:只有一點點的label資料,但是還有別的跟此任務沒關但是有label的資料,如何求得外援,或借用借用猩猩的脊椎骨來還原人類的血肉。
Unsupervised learning
Machine Drawing:給機器大量圖片,沒有input的情況下,要機器自已創作。
Reinforce learning:Deepmind拿這個東西去玩一些小遊戲,還有AlphaGO。跟supervised的差別就是,透過每次的feedback來學習,這個feedback只有一個好壞的分數,你要自己去學習是哪邊扣了分或加了分,需要有一個對手,所以他自己跟自己下。(比較符合人類社會長大後的學習方式)。這個架構還包括當我們仍不知道reward可以設成什麼的時候,讓機器自己去學到底怎樣比較好。
[2] 為什麼需要Machine Learning
AI訓練師:幫不同的問題挑模型、Loss Function。
神奇寶貝訓練師要選擇相剋的屬性,而且神奇寶貝有時候也不一定聽話(小智的噴火龍),還有些複雜模型的最佳化比較困難,需要有經驗的AI訓練師輔助。
[3] Regression:寶可夢案例研究
舉例:股票市場(明天道瓊指數),無人車(方向盤角度),推薦(狗買某商品的可能性),寶可夢(進化後的CP值)
寶可夢CP預測:
,weight,bias
X
:某個完整東西X裡面的編號。第一個input是
,第一個output是
(hat表示是正確的值,一個input必須該有的output)。
X
:某個完整東西X裡面的某個component。
進化前CP值,
種類,
,
高度,
血量。
進化後CP值。
Loss function(
):告訴我們某一個function有多不好。
。如:估測誤差平均(MAE) … (也可自訂)
Gradient Descent:只要目標Loss可以微分GD就可以解。
Gradient(
):把所有參數對Loss的偏為分寫成向量(就這樣)。
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
偏微分(求導):先隨機初始化,並且找到
的切線斜率
:如果是正的,要減少w值,負的增加w值。移動的效率稱為
(leanring rate),決定收斂速度。
Convex:線性問題的Loss畫出來是凸面的(等高線只有一個圓圈),表示有最佳解。在比較複雜的模型比較會沒有找到global minimum(Linear沒有這個問題)。
AdaGrad:讓不同參數使用不同learning rate
深化模型複雜度:
引入二次項,一樣用GD去優化 …
引入三次項,一樣用GD去優化 …
『注意』:training set上一定會越來越好,test set上就會出現overfitting(駕訓班過度訓練的奇怪技能)。
做regularization:在Loss function裡面加上一項懲罰係數膨脹的
。比較平滑的function,對輸入比較不敏感。
需要自己手動調整
[4] Regression:Demo
畫Cmap來輔助最後的圖
AdaGrad不同參數不同learning rate
[5] Where does error come from?
有可能來自 bias 或 Variance(會引導future work)
Bias:對於training data而言越複雜的模型error下降,瞄別的地方,但是穩定度高
Variance:對於test data而言,越複雜模型error上升,瞄得越準,但是手越抖
簡單Model:囊括function set範圍小,沒有包含到最佳函數
所以bias大。但是範圍集中,受training data影響力小,分散程度小,variance小。
複雜Model:囊括function set範圍大,可能有包含到最佳函數
所以bias小。但是範圍分散,受training data影響力大,分散程度大,variance大。
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
模型好壞
Underfitting:連training data都fit不進去。
需要重新設計Model(並沒有包含到最好的那個function)
新增feature,讓他更複雜
(collect更多data並沒有用)
Overfitting:training可以,test data爆掉。
需要更多data讓他更穩定(或是根據我自己知道的規則去fake up一些假的,手寫辨識圖片,向左向右旋轉一下也符合真實情況,但可以視為新資料。影像辨識左右翻轉也可視為新資料,語音辨識使用變聲器或增加合成雜訊)
新增regularization到loss項使得曲線更平滑,那個
項手動調整
注意事項:可以切validation去挑model,再去public test set去試,但是這個結果如果不好,也不要想說再回頭去給model動手腳,因為真實世界是在private test set上面的,所以那個小部分的public set裡頭的bias不要太認真的考慮進去。(老師的建議)
[6] Gradient Descent
優化:要minimize的叫做Loss,要maximize的叫做Objective func.
Gradient:是一個向量,由每個參數對objective func.做偏微分的結果所排列組成,畫在座標平面上也是一個方向(是假想cmap等高線的髮線方向),update就是乘上負號相反,再乘上lr。
普遍GD的限制:有時候會卡在local minimum的地方(而且微分值為非常接近0的地方還包含saddle point)。
每一組update的參數,一定會使得Loss func.越來越小:微分的Taylor Series,整理到後來,要讓目標點乘gradient的內積最小,所以就是給一個負號,並且透過lr去控制scale(步伐)。不過lr要無窮夠小,假設的那個式子才會夠精確。
Newton:這個是有考慮到二次微分的,但是整體而言的成本不划算。
Learning Rate:慢慢調~可以做參數-Loss的變化,看看Loss下降的速度隨著epoch增加。調整的方式
靜態(fixed):0.0001, 0.001, 0.01, 0.1, 1, …
動態(Adaptive):
1/t Decay:
不同參數不同lr:
AdaGrad:使用上述的Decay lr,再讓每輪lr先除以過去這個參數所有過去微分值的RMS。整理一下
,這個參數到後面會update相當慢。
強調反差:反差萌,因為過去的平均是一種常態,當今的
是當今的。
原理:如果有很多個參數,那“斜率越大就距離最低點最遠”這東西就不成立,我們知道要跟1次微分成正比,並跟二次微分成反比。但2次微分計算比較沒有效率,所以就當作在1次微分曲線上面sample夠多點來代表二次微分的結果。
Adam Optimizer:比較穩定(老師說的)
SGD:Stochastic Gradient Descent,可以讓學習速度更快。一般的GD是把每筆data代進去所產生的loss加總再update,SGD是可依序可隨機的每代入每筆data,就update一次,步伐小,方向凌亂,但是在參數很多時這種隨機步伐小的效果不錯。
Feature Scaling:
讓不同feature有相同的scaling(縮放比例),讓等高線呈現圓形
不然在update時步調不一致(會需要麻煩的分開lr),而且會針對等高線的髮線方向,不會直指最低點
[7] AOE as example
GD永遠不會知道自己是不是在global minimum裡面
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
[8] Minecraft as example
有時候使用GD時loss不減反增(多維度情況),向右/向前是低的,所以你向右前反而是高的。
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
[9] Classification:Probabilistic Generative Model
如果用Regression來代替binary分類的話,regression的loss會去懲罰那些“太過正確”的資料點,而去弄壞了decision boundary。所以要用專門的classification來做,且此外無法面對multiclass的問題
Gaussian Distrubition
假設data是從一個Gaussian Distrubition裡面被sample出來的:input是feature vector,output是一個密度值(跟機率成正比,假設等於機率),如果出來結果大於或小於0.5當作界線。這邊也假設是2-D Gaussian,表示兩兩feature之間有關係。
GD可表示成平均值(
)和共變異數矩陣(
):假設每個feature都是從GD中被sample出來的。把一個沒見過的樣本x帶入一個GD的公式中就會有不同的機率密度值,越接近
的點的機率密度越大。
如何找
和
:使用Maximum Likelihood來找。各種類型的GD去sample出空間中任何點的機率都不會是0,只有Likelihood大小高低。我們要找到一組
和
使得,這個GD去sample出這組training data時的機率最大。
以寶可夢的binary分類舉例:
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
共用cov-matrix:通常不同的class會share同一個covariance martix,比較穩定,也減少計算量(受feature size影響,越多也越容易overfitting)。
。在binary的情況,decision boundary反而會變成一條直線,因為最後簡化成
… 但如果只是要找
何不直接找?(若為直接找,那就變成使用Gradient求Logistic Regression,屬於Discriminative Model了)
別的可能:
Naive-Bayes:也可以假設是feature之間完全獨立的1-D Gaussian,那cov-matrix就會是對角的。通常bias太大 … ,是個baseline
Bernoulli:若feature包含0/1,那就可能要假設從Bernoulli distribution中sample出來的
Sigmoid Function
從後驗機率Posterior Prob延伸出來的,會介在0~1之間。可以說,後驗機率=Gaussian=Sigmoid的邏輯。
[10] Logistic Regression
Sigmoid Function
原理:先讓資料點透過線性回歸(
),再代入Sigmoid就是Losgistic Regression。given
他是屬於
的機率。不過要去優化的東西,是類別,正確得1分,錯誤得0分。
偏微分:
,會介在0~0.25
『重要』綜合提點 :後驗機率的內部假設即是資料會從Gaussian Distribution中被sample出來,再經過整理和約分之後會直接變成,Sigmoid的公式,公式內部包含的z就是一組普通的linear regression,但公式的output會變成0~1之間的數字表示從某組
所展現的Gaussian被sample出來的可能性(而非線性回歸產生的任意值),整個運算可以稱為一個Neuron,神經網路就是無數個Neuron(有加上sigmoid的Perceptron)的不同深度廣度的排列,深度超過3層的稱為深度學習。
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
Logistic Regression
衡量
的好壞:
先整理一下,要讓GD能產生所有這組training data的機率最大(相乘),取個log後則要讓結果最小,假設
為1,
為0,再用
重新整理後,會等於計算兩個Bernoulli Distrobution之間的Cross Entropy(兩個分佈的相似度公式,
,資訊理論有教過)
Objective Function:要讓我們假設的Bernoulli Distrobution和真實答案的Bernoulli Distrobution的Cross Entropy最小(分佈最接近)。
為何分類問題的Loss不用Square Error(跟線性一樣):就在於
的假設為0/1,而把Loss做完微分後的公式,會出現如果如果預測結果跟跟資料很近或很遠時,算出來的微分都為0,使得參數不再更新。(把整個Square error的參數變化對Loss的圖畫出來後,發現離最低點很近或很遠的都是平的,也就是低谷/高原的陷阱)
Optimizer:一樣使用Gradient,微分化簡之後跟Linear再update時一樣
Logistic vs. Linear
Output:0~1之間的小數;任何可能的值
Loss:正確答案為0/1目標是要讓兩個分佈的crossEntropy越小越接近;正確答案為任意數目標是要讓square error最小
Update:兩者相同(3大影響要素)為lr大小、每個data的第i個component真實值、每筆預測值和真實值的差距加總。
Image Not Showing
Possible Reasons
The image file may be corrupted The server hosting the image is unavailable The image path is incorrect The image format is not supported
Learn More →
偷偷摸摸的技巧:先使用Least Square Error找到最佳解,再用那個點初始化
重跑Linear。(作弊 … ),此方法deep learning不適用,無法先看到global optimum
Logistic的限制:decision boundary是線性的,如果資料是非線性的分類。
Feature Transformation:找到規則,把舊的點投影到新的規則上面。但是這樣已經是人的智慧,不是人工智慧。
要讓機器自己做到Feature Transform,就把很多的Logistic接在一起就變深了,就是deep learning!(下一章節)
Discriminative vs Generative
Logistic(判別模型)Gaussian(生成模型):如果把covariance matrix共用,前兩者公式向同。
Discriminative(Logistic)
Generative (Gaussian)
公式相同
找
Gradient直接硬找
先算出
相同function pool
跟生成模型
不同
跟判別模型
不同
對Data的假設
沒有假設,沒有腦補
假設為 Gaussian, Bernoulli, Naive Bayes … 不需要真的看見有某種attribute的組合出現過 自行腦補真的有可能會出現某種組合,因為是分開算出現的機率相乘
優劣
受到Data量影響大,在資料量多時,準確度高 對Noise的敏感度高
受到Data量影響小,在資料量少時,腦補是有效的 對Noise的敏感度低 算式中的
和
可以參考來自不同的source 如:語音辨識使用NN屬於判別模型,但是系統本身屬於生成模型 因為
可以參考全世界的文字資料 Class-depedent的
再參考語音資料即可
Multi-class Classification:
Softmax:有不同線性Class所產生的
,對每個
取
(這個可以讓比較大的設值做強化),然後讓每個
除以所有
的總和(做normalization)。
特色:output會介在0~1之間(跟sigmoid一樣),加總會是1。作為用來估計Posterior Probability。假設每一個class是用dummy做的。
延伸:可以Google一個叫做Maximum Entropy,跟Logistic是一模一樣的東西(從另外的觀點來說明Classifier是SoftMax那樣)。
Objective function:就是計算pred_y和true_y的CrossEntropy。【注意!底下公式Cross_Entropy少一個負號】
[11] Deep Learning
歷史沿革:
1958:Perceptron(純linear Model),海軍project。
1969:Perceptron limitation(非線性問題)
1980:Multi-layer Perceptron。(跟當今DNN技術無所差異,當時又叫做Neural Network
1986:Backpropagation。Hinton。(受限於最多3層)
1989:1 hidden layer is good enough, why deep。(MLP整個臭掉,大家轉向使用SVM)
2006:RBM initialization。Hinton。(Restricted Boltzmann machine做
的初始化,有用的就叫做Deep Learning,換個名字改改運,非常複雜,不是NN-based,是graphical-based, … ,不過最強的地方是重新喚起大家對deep learning的興趣,是石頭湯的故事。)
2009:GPU。(一週的東西縮短到幾個小時)
2011:Exceptionally good in speech recognition
2012:win ILSVRC image competition
2012:AlexNet。8 layer。錯誤率(16.4%)
2014:VGG。19 layer。錯誤率(7.3%)
2014:GoogleNet。22 layer。錯誤率(6.7%)
2015:Residual Net。152 layer。錯誤率(3.57%)。(Fully Connect是train不起來的,要用殘差網路)
NN
DNN(Fully connect Feedforward Network):最傳統
Input layer:data點
Hidden layer:中間那些,負責extract feature取代手動的feature engineering/transformation
Output layer:最後一層nn,如果做multi-class分類就會再加上softmax(強化大的同時縮放在0~1)
Matrix Operation:數學表示式會排成矩陣形狀,然後用activation function(做非線性的轉換,如sigmoid)包住。
簡化:NN就是讓一個vector(乘以matrix再加一個vector,再通過activation,得到一個vector)的n次loop
悖論 tradeoff:
非deep learning:要找到很好的feature,做feature engineering
deep learning:把問題變成要決定多少層,每層多少個。
傾向於不知道要怎們找到好的feature時(語音,影像辨識),人類懂的這些東西的知識過於內隱
但NLP進步量比較少(因為人類在辨識時,比較強,設立if清單的ad hoc很容易)
自動學習structure:Evolutionary Artificial NN,余天立,像是基因演算法可以。
[12] Backpropagation
原則:跟linear的Gradient Descent是差不多幾乎一樣的。問題就在於參數環環相扣且有太多(語音辨識有7,8層,每層1000個的話,倆倆配對),Gradient會是一個上百萬維的vector,Backpropagation則是可以加速gradient計算的方法。
核心:Chain Rule兩條規則
從頭可以用chain rule拆解成一個可以秒解的forward pass和一個要繼續拆解的值。這個值又要繼續拆解成一部分可以秒解的forward pass和一個要繼續拆解的值 … 。直到最後一項才解開,然後順著回去源頭把第一個解開。
統整:
先用正向的傳遞一次
再反向的建立一個neural network一路算回來就可以得到最前面的
對
的偏微分了
[13] Keras 1.0:"Hello world" of deep learning
TensorFlow or Theano:彈性大,不好學,尤其是Theano(ci-e-no)專門算微分的,用來給backpropagation
Keras:作為TensorFlow的介面,作者在Google上班,未來可能作為TensorFlow官方的API。Keras在希臘文為牛角,預言一個夢精靈的故事,如果是通過象牙的門出現夢就不會實現,通過牛角做的門,夢就會實現。
實作:疊積木,把別人寫好的東西疊出來而已。
batch_size:把trainin data隨機的切,然後每次只先加總一個batch的Loss量做參數更新,直到把所有batch都loop過才算一個epoch。每次再選batch都會隨機,使得參數更新不會陷入低端的local minimum
概念:跟SGD(batch_size=1)相同。
數量:主要要用mini batch的理由是因為實作上的issue,他可以在穩定度和速度中達到平衡。而同一個batch使用平行運算,但是GPU的平行運算有自己的數量限制,也不能太多
Full-batch:容易找到local minimum,幾個epoch就卡住了。
提醒:如果沒有用 GPU 運算,那不會變快。或是裝GPU但沒設mini-batch
nb_epoch:就是epoch number,但是參數update的次數還要乘以(data_size/batch_size)(更快)。
好處:可以Save/load model,可以直接算分數evaluate或predict就好
[14] Keras (舊版) [15] Keras 2.0 - 1
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers import Conv2D, MaxPooling2D, Flatten
from keras.optimizers import SGD, Adam
from keras.utils import np_utils
from keras.datasets import mnist
def load_data ():
(x_train, y_train), (x_test, y_test) = mnist.load_data()
number = 10000
x_train = x_train[0 :number]
y_train = y_train[0 :number]
x_train = x_train.reshape(number, 28 *28 )
x_test = x_test.reshape(x_test.shape[0 ], 28 *28 )
x_train = x_train.astype("float32" )
x_test = x_test.astype("float32" )
y_train = np_utils.to_categorical(y_train, 10 )
y_test = np_utils.to_categorical(y_test, 10 )
x_train = x_train
x_test = x_test
x_train = x_train / 255
x_test = x_test / 255
return (x_train, y_train), (x_test, y_test)
(x_train, y_train), (x_test, y_test) = load_data()
model = Sequential()
model.add(Dense(input_dim = 28 *28 , units = 689 , activation = "sigmoid" ))
model.add(Dense(units = 689 , activation = "sigmoid" ))
model.add(Dense(units = 689 , activation = "sigmoid" ))
model.add(Dense(units = 10 , activation = "softmax" ))
model.compile (loss="mse" , optimizer = Adam(lr=0.01 ), metrics=["accuracy" ])
model.fit(x_train, y_train, batch_size = 100 , epochs = 20 )
score = model.evaluate(x_test, y_test)
print ("Accuracy is {}" .format (score[1 ]))
[16] Tips for Deep Learning
CNN裡面的MaxPooling不能微分,畫在座標軸上沒有斜率這東西,
的問題。
NN:不容易overfitting(不像別的演算法),他是連fit進去都有問題的,有時候再training set上面本來就不好了,tune完不能只看test set(別的演算法很容易在training set上拿滿分)。
Underfitting(老師的定義):model不夠複雜所產生的,但如果是參數量增加才train壞那不算
一個論文下來會瞄準解決training set上的問題或解決test set上的問題(overfitting)。
解決training set上的問題(小智噴火龍等級夠卻不願意好好聽話)
換Activation func:
Sigmoid:在很深的網絡中會有梯度消失/爆炸問題,就是越靠近output層的參數的gradient比較大(受到sigmoid壓縮次數較少),update快一下子就收斂了,但前面幾乎還是在初始化的random狀態。(所以最早期RBM就是分層train參數做初始化再疊起來,前面沒update到也不要緊反正pretrain過)
ReLU:Rectified Linear Unit,小於零讓他output零,大於零不變。計算更快速(不像sigmoid還有exp項),跟生物特徵比較像,像是無限多個sigmoid的bias疊加,解決梯度消失問題。他會使得正向參數傳遞變成線性,或者為零(忽略該neuron)。但是這些neuron有時候會傳東西出來有時候不會所以整體而言讓NN仍屬於非線性,因為他們的input會改變他們的operation region。而微分下去正的的傳1,負的就傳0,因為相信input不可能真的為0,所以那點不能微也不理他。
LeakyReLU:把小於0的部分乘上0.01作為output,不歸0。
Parametric ReLU:把小於0的部分乘上
,也是一樣作為參數用GD來更新,每個activation都有自己的
。
Maxout:讓network自動學的activation function,跟MaxPooling很像,他就只是選定好特定數量neuron的output要為一組,選一個大的當代表。這個數量也是要手動調的。所以operation region會很彈性。
使用Adaptive Learning Rate
AdaGrad:讓不同的參數有不同的lr。Learning rate變成,原本的learning rate除上過去所有Gradient的值的開根號加總。但是遇到的問題,會讓他有時步伐大,有時步伐小,不是只有大反差而已,要更dynamic。
Adam:由RMSProp和Momentum所組成,不過最後有做bias correction(這個值很小但是會越來越接近1)。
RMSProp:Hinton線上課程提出的,但是沒有Paper就是。可以動態調整收斂效率的learning rate,跟AdaGrad差距的地方就是有一個
來調整過去gradient的影響力曲線(是要讓過往的驟減快一點或慢一點,而不是像AdaGrad給過去每次的gradient一樣的權重),一樣是算Gradient的RMS但decay速度有差
Momentum:引入慣性定律,讓球球可以搞定local minimum,低點時一樣再多走幾步看遠一點是不是有更低點。移動方向不再只有考慮gradient,而是“現在的gradient的反向乘上lr(新的方向),加上前一個時間點移動的方向乘以
做加權(慣性方向)”。
不過其實他就是把過去的gradient加起來,然後每加一輪就乘上一個權重,讓前面decay。不過就是這個慣性的力量,讓你有機會可以跳出一個不太深的local minimum。
『額外提點』:其實要卡在local minimum, saddle point, plateau在複雜網絡之中是不容易的,yann LeCun在2007年說過local minimum前提是要在每個維度上面都要是local minimum,這機率要同時發生的話太小了,不過參考一下就好。
解決test set上的問題(overfitting)
Early Stopping:假設learning rate正確,training set的loss逐漸變小的情況下,Model最好也是要停在一邊test set的最低值上面,也就是loss以test為主。此外,Early Stopping在有些地方也指當train下去loss下降的速度已經低於某個百分比時,就停止,可以加速epoch。
Regularization:重新定義loss function。加上regularization項乘以1/2再乘以懲罰係數
(自己調),然而所有參數
的集合
是不包括
,因為他不會影響function的平滑程度。,所以這招又叫做weight decay。
Norm:每個參數平方加總,也就是先強化大參數再給予懲罰,而數學細節上就是每次在update的時候會偷偷的乘上0.99的感覺讓他越來越靠近0。對於原先就很大的參數可以下降的幅度很大,會保留很多接近0的值。
Norm:每個參數取絕對值加總,數學細節上就是每次在update的時候會偷偷的讓他以加一/減一的方式靠近零0。結果可能會有很小很小的值,和還是很大很大的值,比較sparse,差異很大。
『補充比較』:通常在做參數initialization時會讓他小一點,然後越update離0越遠,early stopping也是防止他update次數增加,regularization則是偷偷乘上0.999也是相同效果。不過regularization在nn裡面並沒有SVM裡面效果來得大,SVM有可能一步就找到最好結果了(是要解convex optimization),沒有iteration,因此regularization要寫在Loss function裡面。
Dropout:
作法:
Training時:對NN裡面(除了output layer)做隨機sampling(p%被丟掉),此時結構會改變,變得細一點,每次都不一樣,在Training使用的時候一定會變差點,但是test會變好。
直覺來說:平時要增強自己的訓練強度,所有有些招式不使用。traing時如果總是有人會擺爛,那自己會更努力。
Test時:是不做的dropout的,用全部的
下去,但是所有的
要乘上(1-p%)。
直覺來說:只有要在貫徹自己的忍道的時候才使用全部的
。
為何要乘(1-p%)的原因:把Dropout視為一個很大的Ensamble Model,Ensamble這邊原理就是不同NN structure再把結果做平均(雖然variance但是平均bias很小),像是Random Forest就是這精髓。配合mini-batch的隨機性,加上dropout的隨機性,幾次update就train幾種network,但是每個network只train了一個batch,但是不用擔心,這些不同network的參數是share的(所以同一個參數可能被很多次batch去train過),可以看成每次update都是為下一個network做初始化。而testing時,我們剛剛的假設,把每個邏輯上只train一次的network都拿過來跑一次取平均(運算量太大),因此我們乾脆把所有的
去乘上(1-p%)來減少他所產生的力道,這樣結果才不會用力過猛。不過我們只能說這樣直接對
動手腳可以“逼近”傳統ensemble的作法,除非這個NN的activation是線性的,像是 "ReLU", "MaxOut",比起"Sigmoid"更接近線性,效果好很多。
[17] Keras 2.0 - 2
都要先確認training set上的accuracy是多少
更改對於問題類型-loss function。(多重分類問題使用mse會比較不好,要用crossentropy
看看batch_size的影響
看看層數的影響,可以用for迴圈
換一下activation function
換一下Optimizer,可能使用Adam在accuracy的上升會比較快
老師故意在test set上每一個piexl故意加一些noise,而這樣會讓test set結果掉到0.5以下,所以緊接著Dropout的rate可以調大一點(一般設0.5,這邊設0.7),Dropout要加在每個hidden layer後面。提醒一下一定會傷害到training的手腳,但是test會變好。
(以上的微調,有時候沒調好也不定要調回來,試著在深入別的辦法即可)
[18] Fizz Buzz in TensorFlow(sequal)
有一個人,去面試一間公司,要求程式能力 … ,1~100,3的倍數印出Fizz,5的倍數印出Buzz,15的倍數印出Fizz Buzz …
先去網路上找到一些已經標記好的1~1000的數字,數字本身用2進位10維,label有4維,分別是output本身數字/Fizz/Buzz/Fizz Buzz,這樣下去train,把hidden layer size增加就過關了 … ,不一定是增加深度。
[19] Convolution Neural Network(CNN)
原理:為了簡化DNN的架構,而拿掉一些weight,因為domain knowledge知道有些參數用不到。一組filter就等於某"種"特定的neuron,share相同的weight,在做update的時候就是把gradient平均再運算。
上圖:
CNN = (Convolution + Pooling)*n + Flatten + DNN
上圖:
為什麼CNN的小型detector works?3要素
如果要進行偵測的話,只需要看一小塊,不用看整張圖(Convolution)
相同的pattern可以出現在圖片的任何地方,所以共用辨識的neuron即可(Convolution),不過大小嘴和小鳥嘴的辨識,model不一定可以handle這樣的scaling … Deepmind最近發一篇paper說,CNN前面再接一個Network,告訴你這image的哪些地方要坐旋轉和縮放,再丟到CNN裡面。
做影像subsampling其實不會影響影像辨識(Pooling)
Convolution
概念:每個Filter就是一個neuron,一個matrix,matrix內部就是裝
,需要去學的
運算:Filter去跟影像做內積(相乘相加),然後再挪動一個stride的距離,做完Convolution後影像會縮小,變成原本長度減去filter_size再加1的大小。這些被轉換過的value又叫做feature map。總共有多少個filter,每張圖就會得到n倍的image量
彩色圖片:每張圖片都是3 x x的大小,filter也必須是3 y y的立方體。代表相同圖片某pixel點的RGB三元色稱為channel。
『整理』:有多少filter,就會得到幾倍的image量又稱為 feature map ,而每個image的RGB深度則稱為 channel 。image長寬的縮放本長度減去filter_size再加1的大小。
Pooling
進行subsampling,可以自己定以n*n個大小為一組,選最大,最小,平均,出來,跟MaxOut的邏輯相同。
後續概念
更後面的Conv層的pattern複雜度就更高,image也會越來越小
Keras:
跟一般DNN的差別,在Keras的input要改成3D的tensor(高維vector)長 寬 RGB,然後改一下network structure而已。
圖示:
分析CNN的學習效果
Neuron到底學到了什麼:
第一層的filter:weight可以理解,印出來看就知道。
第二層之後的filter:比較難以理解,但是我們可以去計算到底怎樣的image可以讓這個filter被activate的程度最大(加總feature map的值),反向去猜,使用gradient ascent,固定Network的參數去調整input的形況。 … (課程範例是紋路)
DNN中的hidden neuron:也用相同的gradient ascent去找。(課程範例是不規則的圖)
DNN中的output neuron:去逆向gradient ascent,但是發現,讓他最高分的圖,根本不是有“數字”的樣子,因此,Network和我們學到的東西實在是太不一樣了 … 。所以更改一下activate的程度,對x做一些constrain(因為真正有墨水的地方是少的),加上
Norm去懲罰過大的參數。
『補充』Deep Dream:把一張照片送到CNN裡面,接著把某一層layer的output拿出來去放大(大的變大小的變小),再用gradient的方式回去找到真的可以讓這層output值最大的input的image,也就是強化他原本所get到的pattern。
『補充』Deep Style:讓某張圖片附有某些知名畫風。把原image丟給CNN,得到filter的output(表示有哪些content,因為會被filter給強化),再把“名畫”丟到CNN並得到filter的output,針對filter output之間的corelation(代表這張"名畫"的style),並且找到一張image(用gradient)讓他通過filter output的結果像是原image,而filter output之間的corelation卻像"名畫"的。
CNN的應用場景:
AlphaGO某些東西和影像處理是相似的:有些pattern只需要看一小部分的棋面(他的第一層就用5x5的filter)就可以知道,(叫吃、鳥喙)。不同位置都有可能出現叫吃
AlphaGO網絡架構:19x19x48的input,每個落點都以48種處境表示(domain knowledge),一開始有做zero padding(周圍補零),第一層filter是5x5的大小有192個,stride設1,使用ReLU,接下來的2~21層都使用3x3的filter,沒有使用MaxPooling(根據圍棋的CNN我們選擇不使用)
Speech處理:Spectrogram聲音頻譜,但是使用CNN在處理的時候,不會按照sequential的方向,反而只會同一個時間點的範圍去detect,因為通常後續都還會再接上DNN或Lstm已經會考慮,所以要依照應用場景
Text處理:把每個字用embedding表示,而filter大小需涵蓋整個vector並橫向延伸到別的vector,並且在移動時以sequential為主,因為filter的原意是要偵測不同位置的相同pattern,但是embedding的每個維度是獨立的,並沒有可能出現相同pattern(該篇paper作者說)。
視覺化:
讓Machine畫出以假亂真的圖:
[20] Why Deep?
如果要比較深度網路的效果,他要讓短胖vs長瘦的參數量差不多才可以比較。
Deep就是所謂的Modualization,模組化(他可以讓一步到位的傳統模型變簡單,而參數某種程度上是變少的),讓下層的Call上層的模組,原本要一步做到位的的複雜東西,都被上層basic model(每個neuron視為basic classifier,並把上層的都當作basic module)做掉了,也不會受限於資料量太少而train不好的問題。
並不是因為big data讓deep learning可以work:如果我有所有資料,那我就做rule base就好啦,就是因為沒有才要machine去學模式。(跟我們的認知是不一樣的)。
Speech:裡面很多方法啦 … window(250ms)取樣做成acoustic feature,做成phoneme,做成tri-phone,決定state(a-e-i-o-u … 之類的),再用language model找到同音異字問題。
使用CNN在acoustic feature取樣:
傳統:使用GMM,一個state用一個distribution,可以share一些distribution,但是人類舌頭所決定發的聲音之間是有關聯的,發母音只受三件事情影響,舌頭前後/上下位置和嘴形。
上圖:
DNN:Input一個acoustic feature,output屬於每個state的機率,所有的state共用一個DNN,而整體的參數量其實跟傳統的幾十個GMM差不多。把第一層layer output降維印出來,可以看出他想要辨識input的舌頭位置和嘴型的,跟上面那張圖相同。
Universality Function
表示:任何continuous function都可以用一層的NN來表示(只要夠寬)。這個理論其實是沒有效率的,比起hierarchy structure。
Analogy譬喻:
邏輯電路:可以用兩個xor可以表示各種類型的邏輯電路組成,但是會相當沒有效率而已,而且你會需要很多很多的xor才可以達到效果,越多的參數也表示overfitting的可能,而且可以用比較少的data學習到。
窗花:先做模組化的轉換,對折(feature transform),再來操作和分類。
End-to-end Learning:夠deep的網絡才可以做這件事,每一站的參數都用學的,而不用太多domain knowledge介入,像是語音辨識這種古聖先賢智慧的結晶前面的東西幾乎不能改動,但是後半部慢慢的可以被NN給取代 …
上圖:
[21] Semi-supervised Learning
假設unlabel數量(只有input,沒有y)遠大於labeled的數量。又可分成兩種
Transductive Learning:如果偷偷用了test set的feature(但是沒有用到他的label)
Inductive Learning:unlabel的不是test set,而是training set本人或額外的
一些假設:需要依賴你對於data的分佈的假設是不是合理的
大綱:
Semi-supervised的Generative Model
Assumption 1:Low-density Separation
Assumption 2:Smoothness
Better Representation
Generative Model(類EM algo)
如何實作:
初始化生成模型參數(假設為binary-classification)
E-step:根據這組參數模型對unlabel data進行預測並記錄後驗機率
M-step:根據這些後驗機率去Update生成模型的參數
回到E-step,直到收斂,而初始化的參數值會大大影響結果
上圖:
背後理論:
Supervised learning:是要去maximize該label data的log-likelihood(有一個closed-form solution)
Semi-sepervise:是要去maximize該label/unlabel data的log-likelihood。也就是label data的後驗,加上unlabel data被所有distribution產生的機率總和的最大化,需要iterative而且並非convex。
Low-density Seperation
一些假設:世界非黑即白,會有很明顯的交界,而交界的資料點數量會是最少的。就是hard-label的概念。因為如果使用semi-supervised的話,你原本就predict出soft的了,結果還給他soft,那丟進去原本的model算cross-entropy後為1,參數不會去調整到等於沒用。 … 我們應該把[0.7 0.3]以上的直接標成[1 0]回去train,[0.4 0.6]以下的分不清楚交給人工!
Self-training:用label data去train一個model出來,然後去predict那些unlabel的,然後選出一部分(自己決定)出來丟進去label data裡面重train(label就用剛剛predict的)。有點像是Generative Model,不過這邊用的是hard-label,generative用的是soft-label。
Entropy-baed Regularization:同意不要使用非黑即白,但是可能性要夠集中於某個class,把loss function中加入entropy,取entropy比較小的,同時可以對這個進行加權,看是要偏向label或unlabel data,而這個方法也會讓model不會去overfit到label data,所以稱為某種程度的regularization。
Semi-supervised SVM:窮舉所有可能的label可能性,每個可能性都去算svm(找到最寬的margin和最少的error)。不過他的做法是每次改變一筆label,如果讓objective function變大的話就改。
Smoothness
近朱者赤,近墨者黑。蓬生麻中不扶而直,白沙在涅,與之俱黑。但是unlabel data可能要夠多,才會有路徑可以過去
如果
和
有過度的型態,那他們的相似度就會是高的
上圖:
Cluster and then Label:就跟unsupervised一樣,但是尤其時image的pixel通常沒有辦法很好表達,所以沒有先通過auto-encoder的話,通常不會work。
Graph-based:就是把data之間的橋樑,透過別的data特性去紀錄。
特性:label influence will propagate through graph,data點必須夠多才可能把該連的東西都連起來
像是論文之間的citation,或是網頁之間的hyperlink。
K-NN,e-Neighborhood(density-based的半徑距離)
給Edge不同weight,跟GBF(
)成正比,這個式子也是強化極值,而且下降速度很快,所以要相當靠近的點的
才會大。
Smoothness:去計算不同的label之間的weight的加總,相同的話就不考慮,我們想要知道在那些不同class的邊界,weight的總和就可以表示平滑程度大小。smoothness越小,越smooth。也是一樣把這個smoothness考慮進去到loss裡面最小化,然後做手動加權。
『延伸』:這樣的smoothness,可以針對NN裡面任何一層的output,自行設計loss function加到裡面。
Better Representation
去蕪存菁,化繁為簡。
精神:我們看到的世界是很複雜,但是背後有可能是幾個簡單的東西在操控而已,背後的潛在因素(latent factor)就稱為better representation
[22] Unsupervised Learning - Linear 降維
Unsupervised分為兩大類:
化繁為簡:Clustering & Dimension Reduction。只有input,並且做抽象化(generalization)產出
無中生有:Generative。只有output,輸入一段code,機器自動產生相似的output
Clustering:
K-means:隨機初始化k個群,計算距離市中心的距離,assign,update市中心,再assign … 。初始化很重要,並且一開始要決定要幾個k
HAC:一開始所有data自己一個cluster,計算cluster之間兩兩計算相似度,相似度最高的做merge,merge後的data有幾種常見合併方式,再去計算剩餘的cluster兩兩相似度,一路建成完整的tree。最後再決定留下幾群即可。
Dimension Reduction:
又叫做Distributed Representation
Feature selection:直接拿掉一些不要用的feature
PCA:也是一樣讓原本的vector乘上一個metric,屬於線性轉換的範疇
內積:讓原先的vector在新的vector上做投影,我們希望得到的新的分佈是越大越好,歧異度variance要大一點。
降維的維度:新的vector彼此之間要垂直(orthogonal),內積為0,才不會找到的新vector都一樣
Lagrange multiplier:找到包含有所有新vector的矩陣(或也可以用一個linear NN來描述,但是不保證可以有最小的解)。
優化式子如下:找到一個
使得
最大,限制式是
必須為1不然會純粹爆炸,這個
屬於辦正定沒有負值,
就是
的eiganvector(metric)。
降維之後的
的
會是對角矩陣:而這樣做的話,會使得資料符合了某些模型的假設了,像是Generative Model假設每個參數獨立,可以避免overfitting。
弱點:Unsupervised並找到variance最大的,但在classification上面可能會混淆,我們需要supervised的LDA。而且他是linear的沒有辦法做非線性轉換。
到底要取幾個PCA:看看variance佔總variance和的大小。
『提點』:用PCA做人臉辨識和手寫數字,其實找到的Component都不會是一個眼睛一個鼻子或一個斜線一個圈圈,這是人認為的component(此外,再畫PCA的component時要稍微平移,因為負值沒有顏色可以表示),因為PCA允許負值,所以可能先畫一個複雜的東西再把不要的減掉,如果想要從0開始加上去,全部都正數的話,要用NMF(同時如果有些data而言,負數的attribute人類不容易解釋)。
Matrix Factorization:
背後操縱世界的latent pattern:
上圖:
那為什麼會有所見的世界的樣子:因為兩個相近的東西碰撞(做內積),就會得到高的分數。不過不能只用“萌傲嬌-萌天然呆”來描述所有人,至於要用多少個什麼來描述,就看我們了 …
即便遇到missing value,可以先無視,用NN和gradient decent硬train一波,然後再來對missing value進行預測,會用在推薦系統。(Netflex的比賽)
上圖:
可以讓他更精確:各給他加上一點bias … 或是想要讓他的分類更不模糊,就加上
的正規化,最後用gradient硬train一波就行。
Latent semantic analysis(LSA):
把Matrix Factorization用在topic analysis就是Latent semantic analysis。
也是一樣找到每個document和詞彙背後的latent factors。可能是某個主題(財經味道、政治味道、 … )
『常用』:PLSA(Probablistic LSA),LDA(Latent Dirichlet Allocation,跟Linear Discriminant Analysis是完全不一樣的)
跟PCA相近的降維作法:
Multidimensional Scaling(MDS):不需要把每個data表示成feature vector,只需要知道feature vector之間的distance,就可以做MDS。像是城市不容易描述成vector但是兩兩間的距離是容易的。他跟PCA是有關係的,也保留了在高維空間的距離,降到低維時仍存在
Probablistic PCA
Kernel PCA:非線性版本(傳統預設是只有線性)
Canonical Correlation Analysis(CCA):如果有兩種不同source,同時有聲音訊號和唇形,都做降維
Independent Component Analysis(ICA):Source seperation,原本PCA要找到正交(相互垂直的),但是在這邊只要找到independent就可(他定義一個複雜的方法)。
Linear Discriminant Analysis(LDA):屬於supervised的方式
[23] Unsupervised Learning - Word Embedding [24] Unsupervised Learning - Neighbor Embedding
t-SNE(Neighbor Embedding):非線性的降維
Manifold Learning:Data point的分佈其實在比較低維的空間裡面,但是被塞到高維的空間去display,地球模型就是(只有在距離近時畢氏定理"歐式距離"才會有效,不然就會被稍微扭曲),所以就是要把在高維空間裡面的東西攤平(做非線性的轉換)。
Locally Linear Embedding(LLE):假設每個人
都可以用自己的某個鄰居
做linear combination(乘上一個
)來表示。那我們會想要降維之後的兩個點仍
可以用
來做線性轉換,他沒有明確的說降維方法,要好好的挑一下neighbor要選幾個(太小太大都不太好)
Laplacian Eigenmaps:考慮之前smooth等級這件事,就是說要有足夠的過度的點可以連過去,可以用graph-based來做。解出來就是graph Laplacian matrix的eigen vector對應到比較小的eigen value那些。如果先找到了對應的z再做clustering的話,就叫做spectral clustering
t-SNE(T-distributed stochastic Neighbor Embedding)
解決的問題:前面假設"相近的點必須是接近的",但是沒有假設"不相近的點要離遠遠的"。
也是一樣計算兩兩點之間的similarity
,然後需要做一下normalization,
,然後再做降維之後的
的
,前面的normalization就是防止不同空間的距離的scale不同。降維就是要讓
的distribution越接近越好。(用KL divergent,用gradient descent做)。
:RBF這東西可以強化"距離"這件事,只有很近的會有值,然後取負的exp會掉很快,距離一拉開就會掉很多。
T-distribution:可是在降維之後兩兩間的similarity用的是
,他這個T-distribution可以有很多種分佈型態,而這邊這種會使得他尾巴比較長(下降慢,也就是對於距離遠的similarity掉得慢,距離遠的會被拉的更遠,近的會更近)
然而,兩兩間的similarity在t-SNE計算高維度空間時,會跑太久,通常會先降維(用PCA降成50維,再用t-SNE畫圖)。
t-SNE沒有辦法吃新的data,因為similarity那邊要重新計算,純粹拿來一開始做visualization,沒有用在training/test上面的
[25] Unsupervised Learning - Auto Encoder/Decoder
Encoder/Decoder:訓練一個神經網絡(gradient descent),讓原本的input以一個更compact的方式來表示,遠小於input的維度(又稱為bottleneck),而decoder則是透過這些code將data還原,網絡可以很深(就稱為Deep Auto-encoder),不好train,通常要做RBM initialization(2006)。
PCA-related:在做的事情也是相當像的!就是要讓還原後的
失真最少,不過他是很淺的線性轉換,失真大。
兩種比較:
Text Retrieval:
傳統上會用vector space model的bag-of-word,但是語意(semantic)沒有考慮進去。Hinton有次用在一個小的文章集效果很好,降成2維然後畫圖就可以做相似度分類,主題分類,query。LSA的效果也是差的。
Similar Image Search:
以圖找圖:如果只是比較pixel-wise相似度的話,Michael Jackson跟馬蹄鐵是很像的。但如果用Encoder考慮進來再算相似度,效果就會好,而且Encoder-Decoder是unsupervised的,data幾乎無限
CNN:
Convolution -> Pooling
Unpooling -> Deconvolution
Unpooling:需要多紀錄Maxpooling的max-location,才知道怎麼還原,不過Keras好像直接repeat複製4份擴張
Deconvolution:其實就是convolution(只是名字取得不好為讓人誤解),只要在一開始做padding,後面的都跟Conv一樣。
Sequence-to-sequence:
有時候data不適合被表示成vector,語音/文章有長有短,若用bag-of-word表示成等長的vector會失去詞彙之間的前後關係。
Pre-train DNN:
找比較好的initialization,greedy layer-wise
注意如果Auto-encode的bottleneck層反而是比input還要大,那要小心它什麼都沒做(擺爛),Loss要加上regularization(
norm之類的,必須要是sparse的,只有某幾維能有值,其他的必須是0)
這東西就是希望可以逐層的找到最好值,逐層pretrain,每次都去夾著下一個,train好以後fix這層
,再去夾下一層,直到最後要接近bottleneck那層時再用random的初始化,最後只需要去做一點點的fine-tune而已。
『提醒』:現在絕大多數DNN都是不用依賴逐層pre-train了,除非是semi-supervised的,先用unlabel data去pretrain好之後,再用label data做最後的Fine-tuning,一樣使用backpropagation。
De-noising Auto Encoder:
原data是
,先加上一點雜訊
再傳入encoder/decoder並讓output的
盡可能的像
,可以讓model學到如何過濾雜訊
Contractive auto-encoder:在learn的時候加上constraint,當input有變化時,對於結果的影響要是小的(跟加上雜訊效果是一樣的)。
其他:RBM(也是降維方法不過他不是NN,可以拿來初始化),Deep Believe Network(跟RBM一樣是graphic-model就是)
Encoder:如果給一個random的input number,能不能用encoder產生出新的image。先用784維的MNIST(經過標準化讓他集中在0附近)通過hidden layer投射到2維平面上做圖,再透過2維解回來原來image,再把最集中的範圍等間隔的sample點出來(不一定有原本data降維對應),通過encoder去產生數字,就會有驚人效果不同的軸掌管不同東西。
上圖:
[26] Unsupervised Learning - Deep Generative Model (Part I)
OpenAI文章:What I cannot create, I do not understand. 要一直知道如何產生出來才真正懂了。
Pixel RNN
每次點一個點畫出pixel,最後點出整張圖,input是3維(RGB),漸進式增加input(RNN可以處理),跟sequential很像,完全是unsupervised的。在不同的generative model裡面,Pixel RNN出圖最清晰。可以做image或語音的片段都可以,影像的也可以。不過結果很難被evaluate
上圖:
Variational Autoencoder (VAE, 2013) [27] Generative Adversarial Network (GAN,2014)
新的Paper,2014年12月。由Yann Lecun欽點。
擬態演化:枯葉蝶 vs 枯葉 …
Generator vs Distriminator:
Gen從來沒有看過真正的image,他唯一要做的就是要騙過上一代的Dis … ,然而相繼演化,Gen可以產生真的沒有出現在databased裡面的東西,看起很智能。
上圖:
作法:
Dis-er:吃image,output一個vector,通過sigmoid介在0~1(real/fake)
Gen-er:跟VAE的decoder架構一樣,吃一個從任意distribution去sample出來的vector,丟到generator出來假的image
Dis-er:使用Binary Classification去做假的image(標為0),真image(標為1)的discrimination
Gen-er:透過上一代discriminator去update該generator。仍然吃一個從任意distribution去sample出來的vector,是固定住discriminator並調generator的參數使得discriminator的output越接近1越好,整體而言是一個很大的NN,使用gradient descent。
限制:
參數不容易調,可能一下子就偏太多
dis-er好壞不知道:
有時候容易收斂是因為gen-er太強,而是因為dis-er分辨不出來
或是很不容易收斂不是因為gen-er太弱,而是dis-er分辨不出來
現在需要隨時坐在旁邊看gen-er的output圖像好不好才知道方向和參數是不是對的,沒有很明確的signal告訴你現在的generator到底有多好?
在NN只要最小化Loss
在GAN需要使得"well-matched in a contest"(保持動態競合)
[28] Transfer Learning
假設現在有一些跟我們的task沒有直接相關的data,能幫助我現在的task,也就是說有哪些layer的參數是可以共用的,或稍微作為initialization。一樣的domain(分佈相同)或一樣的task(狗,高飛狗)。很少的data(台語語音,醫療資料,特殊法律文件)
四種情況
我們Task相關:Target data。Label,unlabel。
我們Task無關:Source data。Label,unlabel。
Fine Tune:用source去train(做initialization),用target來fine-tune(若回過頭source壞掉也沒關係)。target很少量,Source很大量。像是要train某個人的語音辨識系統,他的話很少,但Youtube上有很多別人的。
『補充』:如果target真的太少,就叫做one-shot training、
小技巧:
Conservative Training:用source做完後在train target時,loss部位加上constraint,使得新的model的output/parameter跟原本舊model的output/parameter不要相差太遠。
Layer Trasfer:只從原model複製部分layer到新的model,而用target去train少量的layer即可,防止overfitting。
哪些layer要被Copy:語音辨識(固定後面,train前面),Image(固定前面,train後面。CNN圖像辨識而言前面是比較基本的pattern比較可以共用) …
Multitask Learning:target的tune完後,還是會繼續考慮考慮source的performance。
如果Input的feature有共通性,則可以讓後面不同的task共用前幾層。或是讓兩個task只共用中間的某幾層。
經常看到的例子是多國語言語音辨識,共用acoustic featuer和前幾層,後面幾個layer各個語言用自己的參數。
Progressive Neural Networks:(不知道怎麼解釋)
上圖:
Domain-adversarial training:原本是打算用target訓練模型,再用source直接跑。但這樣一定是爛的,他們不在同一個corpus內,若把NN前半部視為抽feature,後半部視為classification的問題,那要求"抽feature層"的output把domain knowledge去掉。希望把target和source在抽完feature降維後的結果可以混在一起,這樣後面的classification才會有用。
作法:把feature extractor(作為Generator)的output丟給一個domain classifier,他會分辨目前的data來自target/source(作為Discriminator),而同時把抽feature層的output也要接上label predictor。
上圖:
Zero-shot Learning:假說的部分是一樣的,但Source和target原本要面對的task是很不一樣的。
DeViSE:把Image和word都投影到新的向量空間去。這邊有點事要跳脫input的image的最上層級別的樣貌,把他分解成他的抽象化feature,這東西叫做attribute embedding。
ConSE:Convex Comination of Semantic Embedding,使用NN先做語音辨識的分類(soft classification),再從Semantic Embedding的空間中找到從soft classfication建議的折衷選擇。
『補充』(老師本人):
此外 … 部落格有個新東西:不同語言的input在吃進去後,會把他們project(encoder)到一個相同的只跟semantic有關的vector space當中,會有一個decoder去解回你的目標語言(翻譯)。可以說成,machine自己發明一個secret language作為所有語言的中繼站。
在source沒有label的情況下,如果target有label(self-taught learning),如果連target都沒有label(self-taught clustering)
Self-taught learning:跟semi-supervised有些不一樣的地方為,他在train時就有一半label的data進來,而這些label和unlabel的data的關係是很遠的,原本就是在解不同task。
目標:從source去學一個feature extractor,可能可以是encoder,在用encoder去target data上抽feature
[29] Support Vector Machine(SVM)
使用Hinge Loss和Kernel Method(kernel tree)。
比較:(x軸為
,y軸為Loss)
Ideal Loss:正確的硬分類
Sigmoid + SquareError:在值很大的時候update速度很慢不划算
Sigmoid + CrossEntropy:在loss很大的時候update速度也很快,而且如果已經得到很好的結果還要再更好(盡可能的想要把某一科考到最好,有些會Fail)。也可作為Ideal Loss的upper bound。
Hinge Loss:跟CrossEntropy最大的不同,對於已經做得“好”的example的態度,會覺得大於1已經很棒的及格就好(盡可能的讓所有科目及格,並且歐趴)。也可作為Ideal Loss的upper bound。不過在實作上Hinge並沒有好太多,不過比較不怕outlier(比較robust)
SVM
上圖:
其實他就是一個Logistic regression把loss改成Hinge Loss,而若你有一個NN使用Hinge Loss就會有Deep的版本,而這個Hinge Loss都是Convex的,就像ReLU和Maxout一樣,看起來不可微但是可以用Gradient的
得到最佳解的
:是Data做linear combination來的,而因為使用Hinge Loss的關係,有些operation region可能是0,所以剛剛說的linear combination對有些data來說weight是0,而那些不是0的就是support vector(可以用來決定model長什麼樣子的資料點,只有少數的點可以作為support vector,所以他是比較robust的)。
Kernel Trick:把w寫成是Data做linear combination(Logistic Regression也可以用這樣的技巧)。簡單來說,就是套件內部可以做運算的加速。可以最後簡化成兩個vector先做inner product再做運算,而不是先各別做了feature transform在做運算。所以可以直接去設計kernel function,而不用去理會input的兩個vector做完feature transform後長什麼樣子。而這個東西特別有效在於input並不是一個strcture data(如不同長度的sequence)。
『補充』:kernel function其實就是投影到高維以後的inner product的東西,有點類似在計算兩個vector的similarity
『補充』:RBF kernel可以想像成在無窮多為的平面上去做事情,很容易overfitting。
『補充』:如果今天在logistic regression使用CrossEntropy,他的微分在很多地方是不等於0的,每次update參數都不會有沒貢獻的點,所以參數矩陣不會是sparse的,對於outlier影響小,比較robust。
『補充』:如果我幾天要看看一個聲音訊號屬於哪種情緒,有長有短沒辦法向量化,我們可以直接定kernel。如Dynamic Time Alignment kernel in SVM(金融科技課有,就是只能往右和右上方的爬格子)
『補充』SVM相關方法
Support Vector Regression:Regression是要model output跟正確答案越近越好,SVR就是我近到某個距離就好,少於那個的,loss等於0參數就不再更新,防止outlier
Ranking SVM:考慮排序,如果希望output是一個list,按照output由高到低搜索,但是這樣沒有optimize到問題,可以直接考慮Ranking,而不用管真的值
One-class-SVM:希望屬於positive的集中在某個地方,其餘的隨意散播
Deep Learning和SVM的差別!!
DL的前幾layer看作feature transform,最後面的看作linear classification。
SVM也是先apply一個kernel function把feature轉到高維平面(先做好兩兩的高維內積加總,而不是單筆資料的feature transform而已),再apply linear classifier(通常會用hidge loss),而SVM的kernel也是可以用學的,使用“Multiple kernel Learning”,但是沒辦法像DL做得這麼多,頂多是linear ensemble而已,如果只有一個kernel就是NN只有一個hidden layer。
[30] Recurrent Neural Network(RNN)- 1
Slot Filling:有點像是我們上傳一份履歷表,系統自動讀取幫我們轉成內建的表格,智慧客服也是。如果是用DNN來做,就是把某個文字丟進去,output他屬於每個slot的機率。所以只input單詞的vector是不行的,希望NN有記憶力,記得前面的hint,這種有記憶的NN就叫做RNN,每層hidden layer有output都會另外被存到一個memory的裡,下次可以拿出來使用。因此,RNN就算輸入一樣的東西輸出也是不同的,order也會影響。
種類
Elman Network:分層存output(這東西沒有辦法清楚存在memory中的值,在參數update中他不會被考慮在obkective function裡面)
Jordan Network:存整個NN的output值(傳說效果比較好)
Bidirection RNN:同時train兩個相同input sequence但反向的NN,然後再逐層做output,這樣每個詞彙所考慮的範圍就會比較廣。
LSTM(Long short-term Memory,比較長的短期記憶)
Gate:有3個閘門可以通過學習,input(決定什麼時候打開),output(決定什麼時候打開),forget(決定什麼時候要把過去的東西格式化掉)。整個LSTM的cell有四個input,而控制閘門的運算會用sigmoid轉成0~1好用來當作是否開啟的訊號
人體LSTM:
LSTM需要的參數量很多,跟一般NN比起來的話,在Neuron數量相同的情況下,參數量是4倍。
Keras會支援
LSTM:預設的RNN都是在講他
GRU:簡易版LSTM,據說只有兩個gate,performance差不多,參數量少了三分之一,也比較不容易overfitting
SimpleRNN:最原始的課堂一開始講的那種 …
[31] Recurrent Neural Network(RNN)- 2
RNN中的Target Function
依序丟進去LSTM模型,在坐後做分類,使用CrossEntropy。而Training仍使用Gradient Descent,有一套新的演算法叫做BPTT(Backpropagation through time)
RNN的訓練比較困難,通常他的error surface(參數變化對Loss的影響作圖)很崎嶇,平坦和突然隆起的銜接沒有過度,但是gradient會亂跳,所以要加上"clipping",使得gradient有一個上限。原因就在於RNN在做memory transition時,反覆使用了某個參數,所以變化量是該參數的n次方(取決於sequence長度),使得一點點的變化,後面影響就大,可是learning rate跟不上去平衡他。
為什麼要把RNN換成LSTM
LSTM可以解決低度消失(lr可以設小一點),但是不能解決梯度爆炸。
為什麼可以解決梯度消失:因為對於forget gate那邊,LSTM不會每次都把過去的memory洗掉,而是會乘上一個值然後加上該輪的input,只要forget gate沒有作用,過去的gradient就還有影響力。(跟傳統RNN每輪都清空不一樣)
別的解決梯度消失演算法:Clockwise RNN,SCRN,使用Identity Matrix初始化傳統RNN的transition weight,再用ReLU(傳說可以屌打LSTM)
Many to one:情緒辨識,關鍵詞彙辨識(key term extrraction)。
Many to many:Input和output都是sequence,但是output比較短時,語音辨識(speech recognition),input是acustic vector,output是中文詞彙,trimming和CTC(output可以加入null)可以解決疊字問題,CTC可以解決從來沒有出現過的詞彙,他可能可以知道是人名地名。而Google語音辨識已經採用CTC
Many to Many(No limitation):不確定input和output誰長誰短,就是sequence to sequence leanring
Beyond Sequence:Syntactic parsing tree(文法結構樹)
Auto-encoder Text:在有考慮sequence的情況下 把一個document透過encoder變成一個vector,在透過decoder長回一模一樣的句子 ,不需要Label的data,只需要大量的網路文章即可
Attention-based Model
除了RNN之外有用到memory的Model,把重要的資訊讀出來,把重要的資訊寫回去
Neural Turing Machine(2014年底)
常用在reading comprehension,把每一句話變成vector代表這句話的語意(semantic),可以問一個DNN問題,他會iterative的去對的地方拿東西出來,變成答案
托福聽力:
小小技巧:選答案長度最短的,選那個跟其他三個“語意最像的”
Deep Learning vs Structure Learning
RNN, LSTM:都可以做sequence to Sequence,只看了句子的一部分(除非考慮了bi-direction),Cost function(每個時間點的output和reference的CrossEntropy)和error(兩個seq之間的distance)可能比較沒有關係。但他可以是Deep的(完勝structure learning)
HMM, CRF, Structured Perceptron/SVM:都可以做sequence to Sequence,若使用了Viterbi則會考慮完整個句子(勝)。可以很清楚的考慮label之間的關聯性(可以直接下限制說,同一個label要出現5次以上才算數),Cost是error的upper bound(勝),但structure learning比較只能是linear的(因為evaluation function是linear的)
可以把兩個一起learn,先通過RNN再通過structure
語音辨識:CNN/LSTM/DNN + HMM
語意標籤:Bi-directional LSTM + CRF/Structured SVM
總之,未來Deep和structure一起就會是主流,老師開的課就叫做Machine Learning and have it deep and structure(MLDS)
[32] Ensemble Bagging:
特性
當為regression做平均,或clsasification做投票。Model有點複雜,variance可以降下來且bias本來就很小的情況適用。
Bagging無法使function fit資料,如果本身就不準的話。
Bagging是用在很強很複雜的單體Model
Bagging的model順序沒有關係
製造data
使用resample的方式製造不同的training data(Model)
reweighting(等於直接更改loss)
Boosting
特性
Boosting是用在很若弱很複雜的單體Model
找到的不同classifier必須是互補的,訓練也必須有特定順序
使用resample的方式製造不同的training data(Model)
Adaboosting:
先訓練一個classifier(
)正確率稍微大於0.5即可,但每筆資料的loss的weight不同
這時候再重新weight這些loss,使得loss等於0.5,再用這些data重新train一個(
)。能做到這樣就是把原本答對的權重弄小,把原本打錯的配分弄大,去強化學習錯誤的,這樣新的model的weight就會特別去針對錯誤data的分類加強。數學來表達也就是若分類正確,權重除以
,分類錯誤權重乘以
… (每一輪的weight都是用上一輪的weight下去做權重變化)依這個方法訓練了一大堆classifier
Aggregate
Uniform:對於bi-class而言,就是把預測加起來(soft-classification),如果是正數就是第一類,負數就第二類
Non-uniform:針對這些分類器的正確率,高的就給高的線性組合權重,低的就給低一點。(有個公式)
神奇的地方:即便training dat上面已經得到100%的正確率,增加新的tree到Adaboost裡面仍可以繼續優化testing data,因為每新增一個weak classifier就可以增加一點點margin使得model更robust,SVM也有這樣的效果。
為什麼會繼續increse margin,因為他始終不會使loss等於0而不再更新參數:
一大堆數學:upper bound的證明
此外:對於bagging(投票)而言,深度不夠,是沒有辦法靠三個臭皮匠勝過諸葛亮的,但是boosting的話,一堆互補的笨蛋是可以串起來就得到很好的效果
Gradient Boosting
特性:為Adaboost更general的版本,想要找到一個新的function讓過去所有function的loss總和可以更小一點
如何找到那個新的function:講簡單一點,可以看成另一個gradient descent在update參數的過程,不過這邊是update一個新的function給那個終極function set做boosting,因此也會有learning rate,而要找到的function則可以看成新的一組的參數的集合,就分別對他做偏微分,而那個learning rate(
)就透過gradient來找,找到的learning rate會剛好等於剛剛的adaboost裡面為每個function都乘以的權重
(而這個權重是用個別的error rate算出來的
),就是表現好的權重高,表現不好的權重低,所以才說看成Adaboost的general版本。
Stacking
特性
其實就是跟投票絕對多數制和regression的平均有點像,跟Bagging是差不多的概念,不過後面要再接一個簡單的Model(linear, logistic)即可。
[33] Deep Reinforcement Learning
一些皮毛(scratching the surface)
Google在201502在natural上面發一篇paper用reinforcement learing來玩Atari小遊戲,可以痛電人類。2016年春天的AlphaGO也可以痛電人類。David Silver說,AI就是RL+Dl
Reinforcement Learning:有一個agent有一個environment。而這個agent會對於這個environment有一些觀察observation稱為state,也會有觀察不完全的環境狀態,partial unobserved state(而不是系統本身的state)。而machine(agent)會做出一些action來改變環境,環境再給予reward是一種feedback。
應用
圍棋:只有在少數情況會有reward,因此是很sparse的
其實,人也不知道要下在哪裡,所以人也不知道optimal的,但是reinforcement learning則是從過去的經驗去學習,去找到好壞的細節,需要跟Machine下3000千萬盤之後才會有所進步,AlphaGO一開始是supervised的讓他有一點初始,再去做reinforcement
ChatBot:用LSTM的encoder/decoder,做Sequence to sequencce learning。所以讓兩個Agent自己去對話。始終應該會出現使用GAN來訓練機器人的,試著去騙過discriminator來當作reward
無人車
Google server節電
Text Generation
Video Game:讓AI去玩遊戲是讓machine看到pixel後作出反應,而不是讓machine去讀程式碼。
困難點
Reward Delay:要開火之後才得到reward,如果他知道這件事情就會瘋狂開火,但是現在的左右移動會讓未來的開火有好的效果
Agent的行為會影響環境:要學會持續探索這個世界的所有可能性才可以知道遊戲規則,不能只依賴現有最好的選擇
對於2017年而言,有馬可夫模型,Deep Q-learning沒這麼強,最強的是A3C的agent,reinforcement學習有value-base和policy-based的方法
Asynchronous Advantage Actor-Critic(A3C)
Policy-based(Actor)
跟ML三步驟一樣,Policy也就是Actor也就是Agent …
後面都是數學,崩潰 … 聽說在下學期會繼續補充完
Gradient descent update
Value-based(Critic)
[34] Policy Gradient (Suppplimentary Explaination)
就是Policy-based的gradient … 透過reward去更改要update重複的次數,唯一需要做的是,learn classifier的時候,給training example新的weight。(Keras是有支援的)很花時間,比較麻煩的是蒐集完data之後都要解一次分類問題train一次NN,再去蒐集一次training data,再reapeat
上圖(不筆記):
[35] Reinforcement Learning(Include Q-Learning)
機器和環境做互動,最後得到一個結果,而這個結果會改變下一輪的input。我們通常會覺得外界來的資訊有點複雜,會需要做完摘要再丟給機器,就是state(summarize of observation)
純粹的supervised的learning叫做Behavior Cloning,但是沒有辦法決定到底哪些重要哪些不重要。其實有兩種是推薦的,reinforcement learning和learning by demonstration(加上一些限制讓他不是照單全收,或稱為apprenticeship learning)Inverse reinforcement learning就是 learning by demonstration的一種
每一輪的input叫做observation,每完整完成一次遊戲叫做episode,把最後的reward加總就是total reward(
),希望這個reward越大越好,因此使用gradient ascent,我們無法控制環境和reward,只能控制Agent。他們的關係如下:
其實在80年代就有reinforcement learning(查表的Actor),但現在會紅只是換成DeepNN而已
如果發現有不能微分的地方,就用policy gradient硬train一發
Critic就是能量Actor有多好:Critic就是指說,給他一個input,他會output未來獲勝的機率期望值有多大,他是depends on Actor的,如果是給一樣的input pixel但是Actor不同時,output也不同。
如何評估Critic的好壞
Monto-Carlo:就是去看他每一步預測的勝負跟最終勝負像不像(用regression),需要等到遊戲結束時有那個total reward可以update
Temporal-difference:不用等到遊戲結束就可以update參數
Q-learning(state-action value function):輸入state和action就可以看到得到的分數有多少,用Q function找到一個比較好的Actor。把Q-learning接到上面兩種Critic判斷後面,一定可以找到一個新的
讓Actor更好。(限制就是,如果action有無限多種,是continuous的,那就不能用了)
Rainbow:Q-learning的trick,有七種方法。比較好實作的是DQN …
A3C:讓Actor不要真的去看環境的reward(隨機性),去看Critic就好這方法就叫做Actor-Critic。
Pathwise Derivative Policy Gradient:這個技術就是跟GAN的概念有點像
Limitation Learning:有很多的專家玩給Actor看,機器沒有reward fucntion。其實跟多數的case是沒有明確的reward,就是現實生活無法真的量化。
技術剛好是反過來的,專家玩出來的東西就是我們的Actor,然後根據Environment參數來得到最好的reward function,再去訓練一個reinforcement model找到最好的Actor。
Principle:老師是最好的 …