• 文章總列表
  • 統計分析
    • R SAS All
      R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      統計分析

      [SAS] Ma…

      2026-01-21

      統計分析

      什麼是meta-…

      2024-11-05

      統計分析

      Test-ret…

      2024-06-07

      統計分析

      [SAS]傾向分…

      2020-10-28

  • SAS
    • SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      SAS

      [SAS]線性迴…

      2020-02-26

  • R
    • R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      R

      [SAS][R]…

      2019-07-08

  • 機器學習
    • 機器學習

      Unsuperv…

      2021-07-22

      機器學習

      Unsuperv…

      2021-07-12

      機器學習

      Unsuperv…

      2021-05-20

      機器學習

      Unsuperv…

      2021-05-12

      機器學習

      Matrix F…

      2021-04-30

  • 閱讀筆記
    • 閱讀筆記

      [閱讀心得 #2…

      2025-02-05

      閱讀筆記

      [閱讀心得#20…

      2024-10-25

      閱讀筆記

      [閱讀心得#19…

      2024-08-16

      閱讀筆記

      [閱讀心得#18…

      2024-05-10

      閱讀筆記

      [閱讀心得#17…

      2022-01-22

Wenwu's blog
wenwu's blog
  • 請我喝珍奶

Popular Posts

[R]散佈圖...

2019-12-31

[SAS]L...

2020-06-10

[SAS][...

2019-07-08

[R]Log...

2019-10-31

[SAS] ...

2020-01-22

[SAS]線...

2020-02-26

[SAS]存...

2019-12-18

[SAS]迴...

2020-02-28
機器學習

機器學習自學筆記09: Keras2.0

by wenwu 2020-07-17

機器學習自學筆記09: Keras2.0

今日的課程來自於: https://youtu.be/5BJDJd-dzzg
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/10_Keras.pdf

Keras 介紹

Tensorflow 是目前最流行的machine learning庫之一。但是他沒有這麼好用tensorflow 和另一個功能相近的toolkit theano,這兩個都非常flexible ,可以做很多事情,deep learning 或是只做微分也行,也可以算gradient descent等等,但是這麼flexble 的toolkit 學起來是一定有難度的,沒辦法在半小時內學會。

Keras 是很容易學習且有足夠的彈性的,可以用來implement 一個自己的deep learning, Keras 其實是tensorflow和theano 的interface,所以用Keras 就等於在用tensorflow,只是有人幫你把操作tensorflow 這件事情幫妳寫好了。

多數想得到的nerwork,在 Keras 都有現成的function可以使用;因為它背後就是tensorflow or theano,所以如果你想要精進自己的能力的話,你永遠可以去改Keras背後的tensorflow 的code,然後做更厲害的事情


Keras 實作

現在Keras已經成為Tensorflow 的官方API,就像樂高一樣簡單
使用的data是MNIST的Data:http://yann.lecun.com/exdb/mnist/
Keras提供了自動下載MNIST data的function:http://keras.io/datasets/

接下來就依照之前machine learning 的三個步驟 :

首先要先導入keras套件:

from keras.models import Sequential

Step 1: define a set of function — neural network

先建立一個model

model=Squential()
  • 第一層 hidden layer

之後我們要決定neural network要長甚麼樣子: 假設我們想建立的有兩個hidden layer,每個hidden layer 都有500個neuron

model.add(Dense(input_dim=28*28,units=500,activation='sigmoid'))

Dense 表示加一個Fully connected 的layer ( 也可以加別的layer)
input_dim=28*28 表示輸入的是一個28*28=784長度的vector,表示image
units=500 表示該層的hidden layer 要有500個neuron
activation=’sigmoid’ 表示激活函數使用sigmoid function ( 還可以選其他activation function,比如softplus, softsign, relu, tanh, hard_sigmoid, linear …)

  • 第二層 hidden layer

如果要在model裡再加一個layer,就用model.add增加一個dense 全連接層,包誇units和activation參數

model.add(Dense(units=500,activation='sigmoid'))

這裡不用設定input_dim,因為新增的layer的input就等於前一個layer 的output
所以直接設定新加的layer有500的neuron就好了

  • 最後一層 output layer

最後,我們希望的output為10維,所以units=10

model.add(Dense(units=10,activation='softmax'))

如果把output layer當作一個Multi-class classifier 的話,那activation function就用softmax(這樣可以讓output每一維的機率和為1)

Step 2: goodness of function — cross entropy

使用model.compile 去定義你的loss function 是甚麼
比如你要用cross entropy 的話,那你的loss 參數就是 categorical_crossentropy(keras 裡的寫法)

model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

Step 3: pick the best function

  • configuration(決定好怎麼做gradient descent)

在training之前,你要先下一些configuration 告訴她training 的時候,你打算要怎麼做

你要定義的第一個東西是optimizer,也就是說你要用什麼樣的方式來找最好的function,雖然optimizer後面可以皆不同的方式,但是這些不同的方式,其實都是gradient descent 類似的方法

有一些方法machine 會自動的,根據經驗決定learning rate的值應該是多少,所以這些方法是不需要給它 learning rate的

model.compile(loss='categorical crossentropy',optimizer='adam',metrics=['accuracy'])

optimizer 也可以使用: SGD(gradient descent), RMSprop, Adagrad, Adadelta, Adam, Adamax, Nadam 等方法,這些都是gradient descent

  • training

決定好怎麼做gradient descent 之後,就是實際去做training 了
跑gradient descent 找最優參數,這裡使用的是model.fit 的方法,要給他4個input (假設我們給了10000張image做 Training data )

model.fit(x_train, y_train, batch_size=100, nb_epoch=20)
  1. x_train ( training data)
    在這個case裡,Training data 就是一張一張的image,需要把它存到numpy array裡面,這個numpy array 是兩個維度的matrix。第一個維度,表示有多少個example;第二個維度,表示你的image有多大,有幾個pixel。
    所以這裡面前的狀況是,有一萬個image 做training data,並且每個image有28*28=784個pixel = 10000行*784列
  2. y_train (training data 對應的label)
    我們期望這些image經過training ,機器可以跟我們說這張image 是0~9所對應其中的一個數字,所以y_train的第一個維度應該是example的數量(也就是10000),第二個維度是output的維度(也就是10)
  3. batch_size (告訴Keras我們的batch要多大)
    這裡 batch_size=100 ,表示我們要把100張隨機選擇的image放到一個batch裡面,然後把所有的image分成一個個不同的batch,Keras 會自動幫你完成隨機選擇image的過程,不需要自己coding
  4. nb_epoch (對所有batch的訓練要做幾次)
    這裡 nb_epoch=20,表示要對所有的batch進行20遍gradient descent 的訓練。每看到一個batch就update一次參數,假設現在每一個epoch裡面有100個batch,就對應著update 100 次參數,20個epoch就是update 2000 次參數。

下面有更仔細的batch & epoch的介紹

注意: 若batch_size=1,那就是Stochastic Gradient Descent (隨機梯度下降法),這個在gradint descent有提到,就是每次拿到一個樣本點就update一次參數,而不是每次拿到一批樣本點的error之後才去update參數,因此stochastic gradient descent的好處就是速度比較快,雖然每次update參數的方向是不穩定的,但是天下武功,唯快不破,在別人出一拳的時候,它就已經出了100拳,所以它是比較強的。


Mini-batch

這裡有一個秘密,就是我們在做deep learing 的gradient descent 的時候,並不會真的去minimize total loss,那我們做的是什麼呢? 我們會把Training data分成一個一個的batch,比如training data 有10000張image,每次random選100張image作為一個batch

  • 像gradient descent 一樣,先隨機initialize network的參數
  • 選第一個batch出來,然後計算這個batch裡面的所有element的total loss L’,接下來根據 L’ 去update參數,也就是計算 L’ 對所有參數的偏微分,然後update參數
  • 在選第二個batch出來,現在這個batch 的 total loss 為 L’’ ,接下來根據 L’’ 對所有參數的偏微分,然後update參數
  • 反覆做上面的動作,直到所有的batch都選過一次。所以假設你有100個batch的話,你就把這個參數update 100次,把所有的batch看過一次,這就叫做一個 epoch (全部的batch 為一個epoch)
  • 重複epoch的過程,所以你在train network 的時候,你會需要好幾個epoch,而不是只有一個epoch

整個訓練的過程類似於stochastic gradient descent ,不是將所有數據讀完才開始做gradient descent 的,而是拿到一部份數據就做一次gradient descent


Batch size and Training Speed

接下來來討論設定batch size對training speed 的影響


batch size 太小會導致不穩定,速度上也沒有優勢

前面提到stochastic gradient descent,速度快,表現好。那為何還要使用Mini-batch? 這就提到了一些操作上的問題,我們必須使用Mini-batch

舉例來說現在有50000個example,分成兩種狀況。
如果 batch size = 1 ,也就是stochastic gradient descent,那在一個epoch裡面,就會update 50000次參數。
如果 batch size = 10 ,在一個epoch裡面,就會update 5000次參數。

看起來stochastic gradient descent的速度會比較快,實際上batch size 設置不一樣的話,一個epoch需要的時間是不一樣的。以GTX 980 為例,下圖是對總是為50000筆的training data 設置不同的batch size時,每一個epoch所需的花費時間

  • case1: 如果batch size=1,也就是stochastic gradient descent,一個epoch要花費166秒
  • case2: 如果batch size=10,一個epoch要花費17秒

而第二個需要跑10個epoch ,花費時間約為170秒。如果不同batch size的情況,update參數的次數幾乎是一樣的。

在這個case中,會更傾向選擇 batch size=10,因為會比batch size=1 更穩定(較穩,又update次數多)。因為由更大的數據集計算的梯度能更好的代表樣本總體,從而更準確的朝向極值所在的方向。


Batch size 會受到GPU平行加速的限制,太大可能導致在train的時候卡住

上面的例子的現象產生的原因是我们用了GPU,用了平行運算,所以batch size=10,這十個example是同時運算的,所以你在一個batch裡算10個example的時間跟算一個example的時間幾乎可以是一樣的

那你可能會問,既然batch size越大,它會越穩定,-而且還可以平行運算,那為什麼不把batch size變得超級大呢?這兩有兩個說明:

  1. 如果你把batch開到很大,最終GPU會無法平行運算,它是有極限的。
    也就是說同時考慮10個example和1個example的時間是一樣的。但是跑10000個就不可能跟一個example一樣。因為batch size 需要考慮到硬件限制。
  2. 如果把batch size設的很大,在train gradient descent 的時候,可能跑兩下network就卡住了,就縣道saddle point 或者local minimal
    因為在neural network的error surface 上面,如果你把loss 的圖像可視化出來,它並不是一個convex的optimization problem,不會像理想中那麼光滑
    如果batch size 很大,甚至是full batch,那你走過的路徑會是比較平滑連續的,可能這一條平滑的曲線在走向最低點的過程中就會在坑洞或緩坡上卡住了;如果batch size沒有這麼大,意味著你走的路線沒有這麼光滑,有些步伐是隨機性的,路徑會有一些曲折和波動
    可能在你走的過程中,它的曲折和波動剛好使得你“繞過”了那些saddle point或是local minima的地方;或者當你陷入不是很深的local minima或者没有遇到特别麻煩的saddle point的時候,它步伐的隨機性就可以幫你跳出這個gradient接近於0的區域,於是你更有可能真的走向global minima 的地方

對於 Full batch 的情况,它的路徑是没有隨機性的,是穩定朝著目標下降的,因此在這個時候去 train neural network 其實是有問題的,可能 update兩三次参數就會卡住,所以mini batch是有必要的


不同batch size在梯度下降上的表現

如下圖,左邊是full batch( 全部的training data 做一個batch) 的梯度下降效果,可以看到每一次跌代成本函數都呈現下降趨勢,這是好的現象,說明我們的w和b的設定一直再減少誤差,這樣一直跌代下去就可以找到最佳解;右邊是mini batch的梯度下降效果,它是上下波動的,成本函數的值有時高有時低,但總體還是呈現下降的趨勢,這個也是正常的,因為我們每一次梯度下降都是在mini batch上跑的而不是在整個數據集上,數據的差異可能會導致這樣的波動,但沒關係,因為它整體是呈下降趨勢的。

把下圖看做是梯度下降空間:藍色部分是full batch而紫色部分是mini batch,就像上面所说的mini batch不是每次迭代損失函數都會減少,所以看上去好像走了很多彎路,不過整體還是朝著最優解迭代的,而且由於mini batch 一個 epoch就走了5000步(5000次梯度下降),而 full batch一個epoch只有一步,所以雖然 mini batch走了彎路但還是會快很多

mini batch在update的過程中,步伐具有隨機性,因此紫色的路徑可以在一定程度上繞過或跳出 saddle point、local minima 這些gradient 趨近於0的地方;而藍色的路徑因為缺乏隨機性,只能按照既定的方式朝著目標前進,很有可能就在中途被卡住,永遠也跳不出来了

當然,就像之前討論的一樣,如果batch size太反而會造成速度不僅没有加快反而會導致下降的曲線更加不穩定的情况產生

因此batch size既不能太大,因為它會受到硬體GPU平行加速的限制,導致update次數過於緩慢,並且由於缺少隨機性而很容易在梯度下降的過程中卡在saddle point或是local minima的地方(極端情况是Full batch);而且batch size也不能太小,因為它會導致速度優勢不明顯的情况下,梯度下降曲線過於不穩定,算法可能永遠也不會收斂(極端情况是Stochastic gradient descent)


GPU是如何平行加速的

整個network,不管是Forward pass還是Backward pass,都可以看做是一連串的矩陣運算的结果

那今天我們就可以比較 batch size等於1(stochastic gradient descent)和10(mini batch)的差别

如下圖所示,stochastic gradient descent就是對每一個 input x 進行單獨運算;而 mini batch,則是把同一個 batch 裡面的input全部集合起来,假設現在我們的 batch size是2,那mini batch每一次運算的 input就是把黃色的vector和綠色的vector拼接起來變成一個matrix,再把這個 matrix乘上w1 ,你就可以直接得到 z¹ 和 z²

這兩件事在理論上運算量是一樣多的,但是在實際操作上,對GPU來說,在矩陣裡面相乘的每一個 element都是可以平行運算的,所以圖中stochastic gradient descent 運算的時間反而會變成下一mini batch使用GPU運算速度的兩倍,這就是為甚麼我們要使用mini batch的原因


Save and Load Models

Keras 也是可以幫你save 和load model 的,你可以把train好的 model 存起來,以後再用另一個程式讀出來,它也可以幫你做testing

那要如何用neural network去testing 呢? 有兩個case:

  • case1: Evaluation。比如今天有一組testing set,testing set的答案也是已知的,那 Keras 就可以幫你算現在的正確率有多少。
    這個model.evaluates有兩個input,就是testing的image(x_test) 和testing 的label(y_test)
score = model.evaluation(x_test, y_test)
print('Total loss on Testing Set:',score[0])
print('Accuracy of Testing Set',score[1])
  • case2: Predicion。這個時候model.perdict 函數的input 只有image data 而沒有任何的 label data,output就直接是分類結果
result = model.predict(x_test)
2020-07-17 0 comment
1 FacebookTwitterPinterestEmail
SAS

[SAS]Logistic regression 羅吉斯迴歸 單變項與多變項羅吉斯迴歸

by wenwu 2020-06-10

[SAS]Logistic regression 羅吉斯迴歸 單變項與多變項羅吉斯迴歸

在去年十月時寫了[R]Logistic regression,文章中提到Logistic 的使用條件,Logistic regression(羅吉斯迴歸) vs Linear regression(線性迴歸)的差別,介紹什麼是勝算比,最後有R 的logistic regression 的範例

今天補上SAS版的Logistic regression範例,順便介紹單變項(univariate logistic regression)與多變項(multivariate logistic regression)的不同
如果要看羅吉斯迴歸的使用時機,記得先去看這一篇喔


多變項羅吉斯迴歸(multivariate logistic regression)

上次[R]Logistic regression的文章中,示範的就是多變項羅吉斯迴歸
這次我們也用相同的資料,用SAS做一次示範

example for SAS 
這次我們使用同樣的資料,也就是768位病人的糖尿病資料[資料在這裡]
每一項變數的意思如下:

1.懷孕次數
2.口服葡萄糖耐量測試中2小時的血漿葡萄糖濃度
3.舒張壓(mm Hg)
4.三頭肌皮膚褶皺厚度(毫米)
5. 2小時血清胰島素(mu U / ml)
6.體重指數(體重(千克)/(身高(米))²)
7.糖尿病譜系功能
8.年齡(年)
9.糖尿病(0或1)

第九個糖尿病為二元的類別變項,1表示病人有糖尿病,0表示沒有


程式範例

首先是讀資料,將資料複製下來,存在txt文字檔裡面之後,將第一行換成:
pregnant,glucose,blood_pressure,triceps,serum_insulin,mass,pedigree,age,diabetes,就可以用SAS來讀資料了

/*read data */
PROC IMPORT
DATAFILE="C:\20200609_SAS_logistic.txt" /*記得換成你的txt文字檔位置*/
OUT=MYDATA /*data name */
DBMS=DLM
REPLACE;
DELIMITER=","; /*資料以逗點為分隔*/
GETNAMES=YES;
RUN;

同樣我們的目標是使用 pregnant 、glucose、triceps、mass 欄位預測 diabetes,

proc logistic data=MYDATA plots=(ROC);
model diabetes(event='1')=       /*這是我們的依變項(Y)*/
pregnant glucose triceps mass / CLODDS=wald;  /*放入有興趣的變項*/
/*如果有類別變項可以使用class,記得給參考組(括號內為參考組)*/
/*class AGE_GP(param=ref ref='1');*/
run;

首先可以看到Model information,依變項(Y)(Response Variable)是diabetes,資料個數為768,diabetes=0共有500位,diabetes=1共有268位

再來可以看到(下圖)model 的表現,Model Fit Statistics中有不同的criterion,方便與不同的模型比較(ex: AIC 越小越好)

Testing Global Null Hypothesis 中,可以看到Likelihood ratio 的p-value < 0.0001,表示拒絕H0虛無假設,模型是有效的

最後可以看到下圖中最後一個表格: Analysis of Maximum Likelihood Estimates ,分別列出每個變項的估計值與p-value
intercept (截距)\ pregnant \ glucose \ triceps \ mass 的估計值分別為:
-8.1542 \ 0.1357 \ 0.0342 \ -0.00429 \ 0.0854 (可以發現跟上一篇文章 使用R的估計值是一樣的喔)

而我們可以將邏輯迴歸模式寫為下:
logit(p)=-8.1542+0.1357 pregnant +0.0342 glucose -0.00429 triceps+ 0.0854 mass

並且可以看到p-value,也是只有triceps 沒有顯著,其他三個變項都有顯著,代表這三個變項與Y有關係

而勝算比(OR)=exp(b)

而勝算比SAS已經算好給我們了,在最後一個表格中(Odds Ratio Estimates and Wald Confidence Intervals ) 分別有pregnant \ glucose \ triceps \ mass的Odds Ratio,並且有Odds Ratio的95%信賴區間

就 pregnant 而言,勝算比=exp(0.1357)=1.145
表示每增加一次懷孕次數,得到糖尿病的勝算提高1.145倍;
就 glucose而言,勝算比=exp(0.0342)=1.035 
表示每增加一血漿葡萄糖濃度,得到糖尿病的勝算提高1.035倍;
就 mass 而言,勝算比=exp(0.0854)=1.089
表示每增加一體重指數,得到糖尿病的勝算提高1.089倍;

好~ 多變項的羅吉斯迴歸就講到這裡,接下來要介紹單變項的羅吉斯迴歸


單變項羅吉斯迴歸(univariate logistic regression)

使用同樣的資料,這次我們想要看 pregnant \ glucose \ triceps \ mass 這幾個變項單獨對資料的影響

其實只要將資料單獨丟到proc logistic 就可以了,但這邊當然不會這邊簡單

下面的程式使用macro ,macro 在SAS中可以執行重複的程式,這樣就可以省一點程式,看起來也比較乾淨喔

macro 的第一句和最後一句,必須放上 %macro 和%mend; 
%macro 後的uni1 為macro 的名字,var 為變項(在程式中的var前面要加 &var 喔)

%macro uni1(var);
proc logistic data=MYDATA ;
model diabetes(event='1')=&var/CLODDS=wald;
run;
%mend;

寫好macro 之後,就可以使用了,執行macro時,記得前面要加%喔

%uni1(pregnant);
%uni1(glucose);
%uni1(triceps);
%uni1(mass);

這邊就只印出 %uni1(pregnant); 的結果,與上面一樣的就不重複印出來了

如果只有一個變項(pregnant)在模型中,intercept (截距)\ pregnant 的估計值分別為:-1.1766 \ 0.1371 ,並且pregnant是顯著的(因為p-value <0.0001)

pregnant的Odds Ratio 是1.147 ,95%CI = (1.097,1.200)
就 pregnant 而言,勝算比=exp(0.1371)=1.147
表示每增加一次懷孕次數,得到糖尿病的勝算提高1.147倍


單變項羅吉斯迴歸 vs 多變項羅吉斯迴歸

(univariate logistic regression vs multivariate logistic regression)

有發現嗎? 其實將變項單獨丟到proc logistic 就可以算單變項的羅吉斯迴歸了,[R]也是一樣的方式 (將單獨的變項都到模型裡面,就可以算了)

那位什麼需要做單變項或多變項的羅吉斯迴歸呢?

第一,單變項羅吉斯迴歸可以看到單個變項對自變項(Y)的影響,還有Odds ratio (勝算比)
第二,可以利用多變項羅吉斯迴歸看到所有變項互相影響後對自變項(Y)的影響與Odds ratio (勝算比)

最後,我們可以知道單個變項與多個變項對於自變項(Y)的影響,這當然有利我們挑選模型,可以做stepwise 等等相關的logistic regression


好了,今天的[SAS] logistic regression就講到這裡,也順帶講到了單變項羅吉斯迴歸 vs 多變項羅吉斯迴歸,如果這篇反映不錯的話,之後可以來介紹如何使用stepwise的羅吉斯迴歸

謝謝收看

2020-06-10 1 comment
2 FacebookTwitterPinterestEmail
機器學習

機器學習自學筆記08: Backpropagation

by wenwu 2020-06-09

機器學習自學筆記08: Backpropagation

今日的課程來自於: https://youtu.be/CXgbekl66jc
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/8_Deep%20Learning.pdf

Backpropagation(反向傳播)是一種 gradient descent,也是一種演算法。Backpropagation 就是告訴我們用 gradient 吃來 train一個 neural network 的時候該怎麼做,他只是求微分的一種方式,而不是一種新的算法。

我們在使用 gradient descent 的時候可能會用到上千萬筆的參數,而我們可以使用backpropagation有效率的算出來。backpropagation並不是一個和gradient descent 不同的方法,他就是gradient descent ,他只是一個比較有效率的算法。

Chain Rule

backpropagation裡面並沒有什麼高深的數學,只需要記得的就是chain rule
對整個neural network,我們定義一個 loss function: L(θ) 等於所有的training data的loss總和

對L(θ)偏微之後,可以得到下面的式子:

接下來我們就不用計算 ∂L(θ)/∂w ,可以計算所有的∂l^n(θ)/∂w ,最後再總和起來

而現在的問題是∂l/∂w 該怎麼算,我們可以把它拆成兩項: ∂l/∂w=∂z/∂w * ∂l/∂z

前面這項比較簡單 (∂z/∂w) ,方法叫做Forward pass; 而求後面這項的方法比較複雜(∂l/∂z),稱之為Backward pass

Forward pass

∂l/∂w=∂z/∂w * ∂l/∂z 中,考慮前面這項∂z/∂w,他的結果可以馬上算出來。因為 z=x1w1+x2w2+b,所以z的偏微是: ∂z/∂w1 = x1,∂z/∂w2 = x2。

其實他有一個規律,就是∂z/∂w=w前面連結的input值。

(好了 forward pass 講完了)

Backward pass

再考慮∂l/∂z這一項,它是比較複雜的,這裡假設activation function 是sigmoid function

在下圖中,z 通過 activation function 得到 a ,這個neuron的output 是 a = σ(z),a 乘上 weight w3 得到 z’,a 乘上 weight w4 得到 z’’

我們想要求的 ∂l/∂z可以寫成 : ∂l/∂z = ∂a/∂z*∂l/∂a 
 ∂a/∂z 實際上就是 activation function 的微分(在這裡就是sigmoid function 的微分)。a = σ(z),而 ∂a/∂z = σ’(z) ,而σ’(z) 就是一個常數。

再來就是求∂l/∂a ,因為 a 會影響 z’ 和 z’’,z’ 和 z’’會影響 l ,所以通過chain rule 可以得到

這裡的 ∂z’/∂a =w3,∂z’’/∂a =w4,而 ∂l/∂z’ 和 ∂a/∂z’’ 就要再最後面解釋了。假設我們知道∂l/∂z’ 和 ∂a/∂z’’,就可以將 ∂l/∂z寫成下面的形式 :

最後我們需要解決的問題是: ∂l/∂z’ 和 ∂a/∂z’’這兩項 ,假設兩種不同的case

Case1: output layer

假設藍色的neuron已經是hidden layer 的最後一層了,也就是說連接在z’ 和 z’’ 後的這兩個紅色的neuron已經是output layer ,它的output就已經是整個network 的output 了,這時候就會比較簡單。

因為最後的output 為 y1 & y2 ,所以可以將∂l/∂z’ 寫成∂y1/∂z’ * ∂l/∂y1 
其中,∂y1/∂z’ 就是output layer 的activation function (softmax) 對 z’ 的偏微分
而∂l/∂y1就是loss 對 y1的偏微分,他取決於你的loss function是怎麼定義的,也就是你的output和target之間是怎樣evaluate 的,你可以用cross entropy,也可以用mean square error ,用不同的定義,∂l/∂y1的值就不一樣。

這時我們已經可以算出l對w1 &w2 的偏微分值了

Case2: Not Output Layer

假設現在紅色的neuron並不是整個network的output,那 z’ 經過紅色neuron的activation function 得到 a’ ,然後 a’ 乘上w5、w6,得到 za、zb ,如下圖所示:

和先前的方法類似,如果知道 ∂l/∂za 和 ∂l/∂zb,我們就可以計算∂l/∂z’。並且知道z’和z’’就可以知道z ……,這個過程反覆進行下去,直到找到output layer 就可以算出確切的值,在一層一層反推回去

聽起來很驚人,要一層一層算要算到何時??

只要算一個方向,從output layer 的 ∂l/∂z 開始算,你就會發現它的運算輛跟原來的network的Feedforward path 其實是一樣的


Example

假設我們現在有6個neuron,每一個neuron的activation function的 input 分別為 z1~ z6,我們要計算 l 對這些 z 的偏微分,按照原來的思路,我們想知道z1 的偏微分,要去算z3 和 z4 的偏微分,想要知道z3 和 z4 的偏微分,就要在算z5 和 z6 的偏微分才能知道z1 的偏微分

反觀,若是先計算z5 和 z6 的偏微分,這個過程就變得有效率了。我們先計算z5 和 z6 的偏微分,就可以算出z3 和 z4 的偏微分,最後就可以得到z1 和 z2 的偏微分。這一整個過程,就像下圖:

在做backward pass 的時候,實際上的做法就是件另一個neural network,本來正向neural network 裡面的activation function 都是sigmoid function,而現在backward pass 的時候,就是建一個反向的neural network ,它的activation function就是一個運算放大器op-amp,每一個反向neuron的input 是loss l 對後面一層layer的z 的偏微分 ∂l/∂z ,output則是loss l 對這個neuron的z 的偏微分 ∂l/∂z,做Backward pass 就是通過這樣一個反向neural network 的運算,把loss l 對每一個neuron的z 的偏微分∂l/∂z 都給算出來


Summary

最後,我們總結一下Backpropagation 是怎麼做的,Backpropagation分成兩個步驟:

Forward pass 每一個neuron 的activation function 的output,就是他所連結的weight 的 ∂z/∂w

Backward pass 建一個與原來方向相反的neural network,它的三角形neuron的output 就是 ∂l/∂z,把通過forward pass 得到的 ∂z/∂w 和通過backward pass 得到的 ∂l/∂z 乘起來就可以得到 l 對 w 的偏微分 ∂l/∂w

今天的筆記就到這裡,我覺得老師講的很清楚

2020-06-09 0 comment
0 FacebookTwitterPinterestEmail
機器學習

機器學習自學筆記07: Deep Learning

by wenwu 2020-05-27

機器學習自學筆記07: Deep Learning

今日的課程來自於: https://youtu.be/CXgbekl66jc
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/8_Deep%20Learning.pdf

實際上,Deep learning跟machine learning一樣,也是“大象放進冰箱”的三個步驟:在Deep learning的step1 和 define的function,就是neural network


Neural Network

把多個Logistic Regression前後連結在一起,然後把一個Logistic Regression稱之為neuron,整個稱之為neural network
我們可以用不同的方法連接這些neuron,就可以得到不同的structure,neural network里的每一個 Logistic Regression 都有一組weight和bias,這些weight和bias集合起来,就是這個network的 parameter,我們用θ來描述


Fully Connect Feedforward Network

該怎麼把他們連接起來呢? 這是需要你手動去設計的,最常見的連接方法叫做Fully Connect Feedforward Network (全連接前饋網路)

如果一個neural network的參數weight和bias已知的話,它就是一個function,它的input是一個 vector,output是另一個 vector,這個 vector裡面放的是樣本點的feature,vector的dimension就是feature的個數

如果今天我們還不知道參數,只是定出了這個 network的structure,只是決定好這些 neuron該怎麼連接在一起,這樣的一個 network structure其實是define了一個 function set(model),我們给這個 network設不同的参数,它就變成了不同的function,把這些可能的function集合起來,我們就得到了一個function set

只不過我们用neural network決定 function set的時候,這個 function set是比較大的,它包含了很多原來你做 Logistic Regression、做linear Regression所没有辦法包含的function

上圖中,每一排表示一個layer ,每一個球都代表一個neuron

  • layer 和 layer 之間 neuron是兩兩互相連接的,layer 1的neuron output 會連接给 layer 2的每一個 neuron作為 input
  • 對整個 neural network 來說 ,它需要一個 input,這個 input就是一個feature的vector,而對 layer 1的每一個 neuron來說 ,它的input就是input layer的每一個 dimension
  • 最後的layer L,由於它後面没有接其它東西了,所以它的output就是整個network的output
  • 每一個layer 都是有名子的,最前面叫做 input layer ,中間的叫hidden layer ,最後面叫做output layer
  • 每一個neuron裡面的sigmoid function ,在deep learning 被稱為activation function (激勵函數)(事實上不一定是sigmoid function ,還可以是其他function)
  • 很多層layers 的neural network,被稱為DNN(deep neural network)

Fully connected 的network : layer和layer 之間,所有的neuron都是兩兩相接
Feedforward network : 傳遞的方向是從layer 1→2→3 ,由後往前傳


Matrix Operation

network的運作過程,我們通常會用matirx operation來表示,以下圖為例,假設第一層 hidden layers 的兩個 neuron,它們的 weight 分别是w1=1, w2=-2 ,w1’=-1, w2’=1,那就可以把它們排成一個 2*2 matrix
而我們的input 又是一個 2*1的vector:[1,-1]’ ,將w和x相乘,再加上bias的vector:[1,0]’ ,就可以得到這一層的vector z,再經過activation function得到這一層 的output:

(activation function可以是很多類型的function,這裡還是用Logistic Regression遷移過來的sigmoid function作為運算)

這裡我們把所有的變量都以matrix的形式表示出来,注意W^i的matrix,每一行對應的是一個neuron的weight,行數就是neuron的個數,而input x,bias b和output y都是一個列向量,行數就是feature的個數(也是neuron的個數,neuron的本質就是把feature transform到另一個 space)

把這件事情寫成矩陣運算的好處是,可以用GPU加速,GPU對matrix的運算是比CPU要來的快的,所以寫neural network的時候,習慣把它寫成matrix operation,然后call GPU來加速它


Output Layer (Multi-class classifier)vs Hidden Layer (feature extractor)

我們可以把 hidden layers看做是feature extractor(特徵提取器),feature extractor就取代了我們之前手動做feature engineering or feature transformation,經過這個feature extractor得到的就可以被當作一組新的feature

output layer做的事情,其實就是把它當做一個Multi-class classifier,它是拿經過feature extractor轉換後的那一組比較好的feature(能夠被很好地分類)進行方類的,由於我們把output layer看做是一個Multi-class classifier,所以我們會在最後一個 layer加上softmax


Example Application

Handwriting Digit Recognition

這裡舉一個手寫數字識別的例子,input是一張圖片,對機器來說一張image實際上就是一個 vector,假設這是一張16*16的image,那它有256個pixel,對machine来说,它是一個256维的vector,圖中的每一個都對應到vector中的一個dimension,簡單來說,我們把黑色的pixel的值設為1,白色的pixel的值設為0

而neural network的output,如果在output layer使用了softmax,那它的output就是一個突出極大值的Probability distribution,假設我們的output是10維的話(10個數字,0~9),這個output的每一維都對應到它可能是某一個數字的機率,實際上這個neural network的作用就是計算這張image成為10個數字的機率各自有多少,機率最大(softmax突出極大值的意義所在)的那個數字,就是機器的預測值

在這個手寫字體識別的demo裡,我們唯一需要的就是一個function,這個function的input是一個256維的vector,output是一個10維的vector,這個function就是neural network(這裡我們用簡單的Feedforward network)

input固定為256維,output固定為10維的feedforward neural network,實際上這個network structure就已經確定了一個function set(model)的形狀,在這個 function set 裡的每一個 function 都可以拿來做手寫數字識別,接下来我們要做的事情是用gradient descent去計算出一組參數,挑一個最適合拿来做手寫數字識別的function

input、output的dimension,加上 network structure,就可以確定一個model的形狀,前兩個是容易知道的,而決定這個 network的structure則是整個Deep Learning中最關鍵的步驟

如果你的network structure設計的很差,這個function set裡面根本就没有好的function,那就會像大海撈針一樣,結果針並不在海裡


Step 1: Neural Network

input 256維,output 10維,以及自己design的network structure →function set(model)

Step 2: Goodness of function

定義一個function的好壞,由於現在我們做的是一個Multi-class classification,所以image為數字1的 label “1”告訴我們,現在的target是一個10維的vector,只有在第一維對應數字1的地方,它的值是1,其他都是0

input這張image的256個pixel,通過這個neural network之后,會得到一個output,稱為y;而從這張image的label中轉化而來的target,稱為y^,有了output y 和target y^ 之後,要做的事情是計算它們之間的cross entropy(交叉熵),這個做法跟我們之前做Multi-class classification的時候是一樣的

Step 3: Pick the best function

接下來就去調整參數,讓這個cross entropy越小越好,當然整個training data裡面不會只有一筆data,你需要把所有data的cross entropy都sum起来,得到一個total loss L ,得到loss function之後你要做的事情是找一組network的parameters: θ*,它可以minimize這個total loss,這組 parameter對應的function就是我們最終訓練好的model

那怎麼去找這個使total loss minimize的呢?使用的方法就是我們的老朋友 — — Gradient Descent
實際上在deep learning裡面用gradient descent,跟在linear regression裡面使用完全没有什麼差别,只是function和parameter變得更複雜了而已,其他事情都是一模一樣的

现在你的θ裡面是一大堆的weight、bias參數,先random找一個初始值,接下来去計算每一個參數對 total loss 的偏微分,把這些偏微分全部集合起来,就叫做gradient,有了這些偏微分以後,你就可以更新所有的參數,都減掉learning rate乘上偏微分的值,這個process反覆進行下去,最終找到一组好的參數,就做完deep learning的training了


Why Deep?

為什麼我們要deep learnings呢?一個很直覺的答案是,越deep,performance就越好,一般來說,隨著deep learning中的layers數量增加,error率不斷降低

結果是可想而知的,因為本來model的parameter越多,它cover的function set就越多,它的bias就越小,如果今天你有足夠多的training data去控制它的 variance,一個比較複雜、參數越多的model,它performance比較好,是很正常的,那變deep有什麼特别了不起的地方?

甚至有一個理論是這樣說的,任何連續的function,它input是一個N維的vector,output是一個M維的vector,它都可以用一個hidden layer的neural network來表示,只要你這個hidden layer的neuron夠多,它可以表示成任何的function,既然一個hidden layer的neural network可以表示成任何的function,而我們在做machine learning的時候,需要的東西就只是一個function而已,那做deep有什麼特殊的意義呢?

所以有人說,deep learning就只是一個噱頭而已,因為做deep感覺比較潮,如果你只是增加neuron把它變寬,變成 fat neural network,那就感覺太“虛弱”了,所以我们要做deep learning,给它增加 layers而不是增加 neuron:DNN(deep) is better than FNN(fat)

真的是這樣嗎? 後面的章節会解釋這件事情


Design network structure V.s. Feature Engineering

最後李宏毅老師與我們討論 Design network structure V.s. Feature Engineering的經驗談

其實network structure的design是一件蠻難的事情,我們到底要怎麼決定layer的數量和每一個layer的 neuron的數目呢?
其實這個只能夠憑著經驗和直覺、多方面的嘗試,有時候甚至會需要一些domain knowledge(專業領域的知識),從非deep learning的方法到deep learning的方法,並不是說 machine learning比較簡單,而是我們把一個問題轉化成了另一個問題

本來不是deep learning的model,要得到一個好的結果,往往需要做feature engineering(特徵工程),也就是做feature transform,然後找一組好的feature;一開始學習deep learning的時候,好像會覺得 deep learning的layers之間也是在做feature transform,但實際上在做deep learning的时候,往往不需要一個好的feature ,比如說在做影像辨識的時候,你可以把所有的pixel直接丢進去,但是在過去做圖像識別,你是需要對圖像抽取出一些人定的feature出來的,這件事情就是feature transform,但是有了deep learning之後,你完全可以直接丢pixel進去硬做

但是,今天deep learning製造了一個新的問題,它所製造的問題就是,你需要去design network的structure,所以你的問題從本來的如何抽取feature轉化成怎麼 design network structure,所以deep learning是不是真的好用,取決於你覺得哪一個問題比較容易

2020-05-27 0 comment
0 FacebookTwitterPinterestEmail
機器學習

什麼? 一連串的Logistic regression 就是類神經網路(Neural Network),也就是Deep Learning !

by wenwu 2020-05-22

什麼? 一連串的Logistic regression 就是類神經網路(Neural Network),也就是Deep Learning !

好吧! 原諒我下的標題,但這就是我剛剛聽完 這堂課logistic regression 的反應。 

寫了文章快一年,版上最受歡迎的文章就屬於 [R]Logistic Regression 羅吉斯迴歸 ,相信有很多想學習Logistic regression 並且想了解如何應用它
如果你已經學會了Logistic regression,那麼代表你很有可能已經會使用Deep Learning 了 !


在 機器學習自學筆記06: Logistic regression 中提到該如何使用 Logistic regression 進行Machine Learning 的三個步驟,如果你會Logistic regression的話,就可以使用Machine Learning並進行分類

但是Logistic regression 是無法用在每一種情形的,我們知道Logistic regression 劃出來會是一條直線,很自然我們可以用這條線來分類,但是如果資料長的像下面這樣,可以使用Logistic regression 嗎?

Class 1 剛好在右下和左上, Class 2 剛好在左下和右上,我們無法找到一條”直線”來將這些資料分類。

但是想一想,可能剛好這組資料的feature 不方便我們使用,我們可以tranform 一下 !!

假設新的x1′ 是原本的點到 [ 0, 0] 的距離,x2′ 是原本的點到 [ 1, 1] 的距離,重新映射之後如下圖右側(紅色兩點重疊),此時就可以用Logistic regression 來分類

有了新的feature,是不是就可以用 Logistic regression 來分類了

但麻煩的是,我們並不知道怎麼做feature transformation,如果在這上面花費太多時間就太可惜了,於是我們會希望這個 Transformation是機器自己產生的,怎麼讓機器自己產生呢?
我們可以讓很多 Logistic regression cascade (連接)起來

我們讓一個input x 的兩個feature x1、x2 經過兩個logistic regression的 transform ,得到新的feature x1’、x2′ ,在這個新的feature space 上, class 1 和 class 2 是可以用一條直線分開的,那麼最後只要再接上另外一個logistic regression 的 model ,根據最新的feature ,就可以將 class 1 和 class 2分類

因此這整個流程是,先用n個 logistic regression 做feature Transformation(n 為每個樣本點的feature數量) ,生成 n 個新的feature,最後再用一個logistic regression做分類

下圖是二維feature 的例子,分別表示四個點經過transformation之後的 x1’、x2’,在新的feature space 中可以通過最後logistic regression分類

通過上面的例子,我們發現: 多個 Logistic Regression連接起来會產生powerful的效果
我們把每一個 Logistic Regression叫做一個 neuron(神經元)
把這個 Logistic Regression串起來所形成的 network,就叫做 Neural Network
就是類神經網路,而這個東西 就是Deep Learning!

原來 一連串相連的 Logistic regression 就是 Deep Learning !!


不知道大家看完有什麼想法呢? 歡迎與我分享 
也可以參考我之前寫的 [R]Logistic Regression 羅吉斯迴歸
或是這篇文章的出處 機器學習自學筆記06: Logistic regression

2020-05-22 0 comment
0 FacebookTwitterPinterestEmail
機器學習

機器學習自學筆記06: Logistic regression

by wenwu 2020-05-22

機器學習自學筆記06: Logistic regression

前一篇講到Classification 分類, 今天就要來講Logistic regression ! 我們就從machine learning 的三個步驟開始吧!


Three Steps of machine learning

  • step 1: Function set
    這裡使用的function set 就是 Logistic regression! 
    wi: weight , b: bias , σ(z): sigmoid function 
    xi: input , P(C1|x): output (是一個機率)
  • step 2: Goodness of a function
    假設我們有一組training data: x1, x2,x3 … xN,並且知道它們的類別(C1, C2) 假設這筆training data 是從我們的function 所定義的posterior probability 所產生的,而w和b就決定了這個posterior probability ,所以就可以計算這組(w,b)產生N筆 training data 的機率。利用最大估計法,最好的參數就是使likelihood 值最大的最佳解。

經過一番整理之後,我們可以將要minimize的對象寫成下面的形式

這裡的X^n ,表示第一個樣本點,y^n表示第n個樣本點的class標籤,最終這個summation的形式,裡面其實是兩個Bernouli distribution的cross entropy(交叉熵),把f(X^n) & y^n 都當成Bernoulli distribution,兩者的cross entropy, 就是我們要minimize 的對象。

cross entropy的含意就是這兩個distribution 有多近,如果 p和 q 兩個distribution 一模一樣的話,那他們的 cross entropy 就是0。這裡的 f(X^n)就是function 的 output ,y^n 表示預期的target,因此 cross entropy 實際上表達的是希望這個function 的 output 和他的 target 越接近越好。

最後,我們要找的參數實際上就是 :

  • step 3: find the best function
    實際上就是去找到使 loss function(也就是cross entropy) 最小的那組 w* & b*,這裡用gradient descent 的方法進行運算就行了
    這裡sigma function 的微分可以直接作為公式記下來: ∂σ(z)/∂z = σ(z)(1-σ(z)) ,sigma 和他的微分的圖像如下:

偏微之後,可以得到的式子如下,表示gradient descent 每次update 只需要做:

代表現在我們的update 取決於三件事情:

  1. learning rate η,是自己設定的
  2. xi: 來自data
  3. y^n-f(x^n) ,代表function的 output與理想的target的差異大小
    如果離目標越遠,update 的步伐就要越大

Logistic Regression vs Linear Regression

在第二篇自學筆記中,有提到使用Linear regression的model 套用在 Machine Learning 的三個步驟。現在來比較Logistic regression 和 Linear regression 的不同。

  • compare step 1 
    Logistic regression 是把每一個feature xi 加權相加,加上bias ,再通過sigma function,當作function 的output 
    因為Logistic 的output 是通過sigma function 產生的,因此一定是介於0~1之間;而linear regression 的output 可以是任何值
  • compare step 2
    Logistic regression 中,我們定義的loss function,即要去minimize 的對象,是所有樣本的output和實際target 在 Bernoulli distribution 下的 cross entropy總和
    在Linear regression 中,loss function 的定義相對比較簡單,就是單純的function 的output 和實際target 在數值上的平方和的均值
  • compare step3
    Logistic regression 和 Linear regression 的wi update的方式是一模一樣的,唯一不一樣的是Logistic regression 的target 和output 都必須在0~1之間,而linear regression 的target 和output 的範圍可以是任意值

如果Logistic regression 的 loss function 使用square error?

假設現在第 n 個點的目標是class 1 (y^n=1),此時如果function 的 output f(x^n)=1的話,表示已經離target 非常接近,f(x^n)-y^n = 0,而 ∂L/∂w 就會變成0 ; 假設y^n=1 ,且f(x^n)=0 ,兩項相減=1,表示距離target很遙遠,而這時∂L/∂w也=0

如果我們把參數的變化對total loss 作圖的話,loss function 選擇 cross entropy or square error ,參數的變化跟loss 的變化情況如下圖顯示: (黑色的是cross entropy ,紅色是 square error)

假設中心點是我們的目標。可以發現cross entropy 比較有起伏一點,而square error 則相反。
Cross entropy在距離目標遠時,微分值大,參數update 的變化量也大,跨出去的步伐也大,就會比較快找到我們的目標。
若使用Square error 的話,有可能一開始就卡住了,不容易找到目標。

所以儘管square error 可以使用,但是會非~ 常~ 慢 ~~


Discriminative vs Generative

logistic regression 的方法,我們把它稱之為 Discriminative ;
之前用gaussian 來描述posterior probability 這件事,我們稱之為 Generative

實際上他們兩個使用的model(function) 是一樣的。
Logistic regression可以用gradient descent 的方法直接把b 和 w 找出來;如果用Generative model 的話,我們要先去算 u1\u2\Σ ,然後算出b 和 w

而兩個方法找出的b 和 w是不一樣的。就算我們的function set 是同一個,但是做了不同的假設,所以同樣training data 找出的參數會是不異樣的

在Logistic regression 中,我們沒有做任何實質性假設,沒有對probability distribution 有任何描述,只是單純的找b 和 w
而在Generative model 裡面,我們對probability distribution有實際性的假設。之前是假設Gaussian,甚至假設在相互獨立的前提下是否可以是naive bayes ,根據這些假設我們最終才找到b 和 w

哪一個假設的結果是較好的呢? 下圖是兩個的結果

實際上Discriminative 的方法常常會比Generative 的方法表現的較好,下面舉一個例子:

toy exmaple

假設總共有兩個class ,training data 如下: 每一筆 data 有兩個feature , 總共有13筆data

如果現在有一組testing data ,兩個feature 都是1 ,憑直覺來說他肯定是class1 ,但是若用naive bayes 的方法,得到的結果如何呢?

通過naive bayes 的結果竟然這筆testing data 屬於class 2 的可能性更大,這跟我們的直覺相反。
對naive bayes 來說,他是不考慮不同dimension之間的correlation ,naive bayes 認為在dimension相互獨立的前提下,class 2 沒有sample 出都是1 的 data , 因為sample 的數量不夠多,如果sample 夠多,他認為class 2 觀察到都是1的data 可能性會比class 1要大

因為naive bayes 認為從class 2 中找到樣本點 x 的機率是 x 中第一個feature 出現的機率與第二個feature 出現的機率的乘積 : P(x|C2)=P(x1=1|C2) * P(x2=1|C2) ;但是直覺告訴自己,兩個feature 之間肯定有某種關聯,P(x|C2)不能夠這麼輕易的被拆分成兩個獨立的機率乘積,也就是: Naive bayes 自做聰明的多設了一些條件

所以Discriminative model 和Generative model 的差別就在於 : 
Discriminative model 是完全不做任何假設的
Generative model則假設你的data來自某個機率模型

Generative model 做的事情就是腦補,他會自己去想像一些事情,於是與我們天然的想法不太一樣。就像在toy example 裡,我們做了naive bayes 這樣一個假設(事實上我們並不知道這兩個feature 是否相互獨立),於是naive bayes 會在class 2 裡並沒有出現兩個feature 都是1的樣本點的前提下,自己去腦補這樣的點

通常腦補不是一件好事,因為你給你的data強加了一些他沒有告訴你的屬性,但是! 在data 很少的情況下,腦補也是有用的。

discriminative model並不是在所有的情況下都可以贏過generative model 
discriminative model 是十分依賴data的,而 generative model 可以在data數量不足或資料本身的label有一些問題時,對資料做假設,反而能將資料不足的問題降低

Discriminative vs Generative 兩種方法的比較

關於分類的問題(主要二元分類),我們一般有兩種方法處理問題: 
Discriminative & Generative ,注意到分類的model都是從bayes 出發的 :

  1. Discriminative
    不會做任何假設,因此無法通過假定的probability distribution 得到P(x|Ci)的表達是,因此使用的是(2),直接利用cross entropy 和 gradient descent 結合maximum likelihood 得到最佳的b & w 解,以確定model 的具體形式 
    Discriminative的優點在於: 在data 充足的情況下,他訓練出來的model的準確率一般是比generative model 來得高
  2. Generative model
    Generative model 會假設一個帶參數的probability contribute ,利用這個假設的機率分布函數帶入(1)中去計算P(x|Ci)&P(x|Cj) ,結合maximun likelihood 估計法最終得到最樣的參數以確定這個Model 的具體形式
    Generative 的好處是: 它對data的依賴並沒有像Discriminative這麼嚴重,在data數量少 或是data本身就存在noise的情況下受到影響會更小,它還可以做到prior 部分與class-dependent 部分分開處裡,如果可以借助其他的方式提高prior model 的準確率,對整一個model是有所幫助的。

Multi-class Classification

softmax

之前都提到二元分類的情況,這裡討論多元的分類問題,其原理的推倒過程與二元分類基本一致

假設有三個class : C1、C2、C3,每一個class 都有自己的weight 和 bias ,這裡w1、w2、w3代表三個vector ,而b1、b2、b3分別代表三個const,input x 也是一個vector (zi=wi*x+bi ,i=1、2、3)

softmax 的意思是對最大值做強化,因為在做第一步的時候,對 z 取 exponential 會使最大和最小值得差距拉得更開,也就是強化大的值

我們把z1、z2、z3丟進一個softmax 的function , softmax 做得事情是這樣三步

  • 取exponential ,得到exp(z1)、exp(z2)、exp(z3)
  • 把三個exponential 相加,得到total sum
  • 將total sum 分別除去這三項

原來的output z 可以是任何值,但是做完softmax ,你的output會限制住,output yi 的值一定是介於0~1之間,並且相加為一。以上圖為例,yi表示input x 屬於第 i 個 class 的機率,比如屬於C1的機率是 y1=0.88,屬於C2的機率是 y2=0.12,屬於C3的機率是 y3=0

而softmax 的output,就是拿來當z 的posterior probability

multi-class classification 的過程 :

在input x 經過三個是式子分別生成z1、z2、z3,經過softmax 轉化成output y1、y2、y3,他們分別是這三個class 的posterior probability ,因為 Σy = 1 所以可以直接將y當作是probability contribution 。
我們在training 的時候還需要有一個target , 因為是三個class ,output 是三維的,對應的target也是三維的,為了滿足cross entropy 的條件,target y 也必須是 probability distribution,這裡我們不能使用1、2、3 作為class 的區分,為了保證所有class 之間的關係是一樣的,這裡使用類似於one-hot 編碼的方式 (下圖底下)

這時候就可以計算一下output y和 target y 之間的 cross entropy (= Σyi lnyi ),同二元分類一樣,多元酚類問題也是通過maximum likelihood 得到最終的 cross entropy 表達式,這裡不再贅述。


Limitation of Logistic Regression

Logistic regression 其實有很強的限制,比如說下面的data,若要用logistic regression 分類,其實是做不到的。因為logistic regression 的boundary 就是一條直線,但是在這個平面上怎麼分都無法將兩個class 分開


Feature Transformation

如果堅持要用logistic regression 的話,有一招就做 Feature transformation ,原本的feature 分布不好劃用,那經過轉化之後,找一個比較好的feature space ,讓logistic regression能夠處理
假設新的x1′ 是原本的點到 [ 0, 0] 的距離,x2′ 是原本的點到 [ 1, 1] 的距離,重新映射之後如下圖右側(紅色兩點重疊),此時就可以用Logistic regression 來分類

但麻煩的是,我們並不知道怎麼做feature transformation,如果在這上面花費太多時間就得不償失了,於是我們會希望這個 Transformation是機器自己產生的,怎麼讓機器自己產生呢? 我們可以讓很多 Logistic regression cascade (連接)起來

我們讓一個input x 的兩個feature x1、x2 經過兩個logistic regression的 transform ,得到新的feature x1’、x2′ ,在這個新的feature space 上, class 1 和 class 2 是可以用一條直線分開的,那麼最後只要再接上另外一個logistic regression 的 model ,根據最新的feature ,就可以將 class 1 和 class 2分類

因此這整個流程是,先用n個 logistic regression 做feature Transformation(n 為每個樣本點的feature數量) ,生成 n 個新的feature,最後再用一個logistic regression做分類

下圖是二維feature 的例子,分別表示四個點經過transformation之後的 x1’、x2’,在新的feature space 中可以通過最後logistic regression分類

注意,這個的Logistic Regression只是一條直線,它指的是“屬於這類”或“不屬於這類”這兩種情況,因此最後的這個Logistic Regression是跟要檢測的目標類相關的,當只是二元分類的時候,最後只需要一個Logistic Regression即可,當面對多元分類問題,需要一到多個Logistic Regression來劃出多條直線劃分所有的類


Powerful Cascading Logistic Regression

通過上面的例子,我們發現,多個 Logistic Regression連接起来会產生powerful的效果,我們把每一個 Logistic Regression叫做一個 neuron(神經元),把這個Logistic Regression串起來所形成的 network,就叫做Neural Network,就是類神經網路,這個東西 就是Deep Learning!

筆記參考 :https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/7_Logistic%20Regression.pdf

2020-05-22 0 comment
0 FacebookTwitterPinterestEmail
Load More Posts

近期文章

  • [SAS] Macro Language 基礎內容
  • ccClub 讀書會推薦,免費學python
  • [閱讀心得 #21]你願意,人生就會值得
  • 理想生活,該長怎麼樣子?
  • 多益330 → 多益785 多益成績棕色到藍色證書

近期留言

  • 「peter」於〈多益330 → 多益785 多益成績棕色到藍色證書〉發佈留言
  • 「wenwu」於〈[SAS]存活分析(2) COX regression model〉發佈留言
  • 「joey53111」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言
  • 「丁柏仁」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言
  • 「peter」於〈Statistical Programmer在CRO工作一年的心得〉發佈留言

免費訂閱

不定期更新文章,點一下追蹤就能夠收到最新文章!

一起加入其他 19 位訂閱者的行列

Statistics

  • 10,814
  • 592,901
  • 73
R 線上課程參考

@2019 - All Right Reserved. Designed and Developed by PenciDesign

Wenwu's blog
  • 文章總列表
  • 統計分析
    • R SAS All
      R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      統計分析

      [SAS] Ma…

      2026-01-21

      統計分析

      什麼是meta-…

      2024-11-05

      統計分析

      Test-ret…

      2024-06-07

      統計分析

      [SAS]傾向分…

      2020-10-28

  • SAS
    • SAS

      [SAS] Ma…

      2026-01-21

      SAS

      [SAS]傾向分…

      2020-10-28

      SAS

      [SAS]Log…

      2020-06-10

      SAS

      [SAS]迴歸分…

      2020-02-28

      SAS

      [SAS]線性迴…

      2020-02-26

  • R
    • R

      [R]散佈圖與相…

      2019-12-31

      R

      [R]Logis…

      2019-10-31

      R

      [SAS][R]…

      2019-09-27

      R

      [R]Chi-s…

      2019-09-19

      R

      [SAS][R]…

      2019-07-08

  • 機器學習
    • 機器學習

      Unsuperv…

      2021-07-22

      機器學習

      Unsuperv…

      2021-07-12

      機器學習

      Unsuperv…

      2021-05-20

      機器學習

      Unsuperv…

      2021-05-12

      機器學習

      Matrix F…

      2021-04-30

  • 閱讀筆記
    • 閱讀筆記

      [閱讀心得 #2…

      2025-02-05

      閱讀筆記

      [閱讀心得#20…

      2024-10-25

      閱讀筆記

      [閱讀心得#19…

      2024-08-16

      閱讀筆記

      [閱讀心得#18…

      2024-05-10

      閱讀筆記

      [閱讀心得#17…

      2022-01-22