Monday, May 15, 2017

DL Overview

RNN- recurrent neural network

Why?


重複利用函數f運算輸出,換言之h(t)就是時間從1到t-1經過t-1個f函數構成的一個超級深度網路。CNN (Convolution Neural Network)就好比只是其中一個時間點的網路而已。
這邊的函數f是學習來的,學習的過程中,所有時間點的輸入共享這個函數中的weights (parameters sharing),這樣有兩個優點:1. 讓模型可以接受任意長度的輸入,不需要為不同的長度進行訓練。2. 訓練需要的資料可以少很多,因為每次的訓練成果是共享的。

圖靈機(Turing Machine): 任何可計算其值的函數都存在相應的圖靈機,圖靈將算法看做一個機械的過程,或者是一組規則,它規定了人們在任何情況下必須執行的某類操作的指令。機器的運作是按逐步進行的方式,每一步由三個不同的動作組成:在任一確定時刻,讀寫頭對準帶子上的一個方格,根據該格上的內容和機器的狀態決定自己的動作;機器可以抹去帶上的原有符號,使方格保持空白或者寫上另外的(也可以與原來相同的)符號;然後讓帶子通過讀寫頭,朝兩個方向之一移動一個方格。機器的行為自始至終是由一個指令集所決定,它明確地指示機器每一步應該執行哪三個動作。整個運作從讀寫頭視讀第一個方格數據開始,一旦計算結束,機器就進入一個特別的停止狀態。運算過程的任何結果都被紀錄在帶子上。
原文網址:https://read01.com/78e2a6.html

RNN (Recurrent Neural Network),Recurrent直接表達了重複的概念,也就是說將同一個model重複使用。

LSTM (Long Short-Term Memory),是RNN的延伸,透過額外得Cell空間來記憶比較長的序列。
如何計算LSTM裡面的參數數量?
















BRNN- Bidirection Recurrent Neural network
適合recognition, 不適合prediction(因為如果看到未來那何必預測)
兩個方向的資訊流匯聚成一個output輸出(看的範圍更廣,效能更好)

如何train:
通常會包成一個一個batch,每個batch會有固定長度(也就是說rnn會有固定長度),每一筆data訓練時,RNN的hidden memory都會被重新初始化,train的目標是weight。

GRU:
參數更少,比較不容易overfit,performance也不一定比較差!


Ref:

  1. Understanding LSTM Network
  2. RNN Effectiveness

Auto Encoder:













































Unsupervised Learning - Deep Generative Model

這種創造的模型結果很難evaluate
  1. PixelRNN
    利用RNN根據已知的pixels預測下一個pixel的顏色
  2. VAE
    auto encoder的變形,利用訓練出的code來產生新的目標。
    差別在於encode出來的結果多加上了noise的機制,並且在loss function上加一些函數,讓variance不要變成0(因為traning過程會自然希望把variance降成0,這樣noise比較小,但VAE就是故意想要讓code增加noise)
















由於不同的input因為noise可能會對應到相同的output,這時候該output就會綜合兩種結果產生符合現實的output。直覺的來看就是VAE因為這些noise,所以decode出來的結果會比AE更加真實。

















其實VAE就是一種Distributed Gaussian Mixture Model (就是很多Gaussian透過不同的weight組合而成,可以表達任何特別的分佈)。在VAE裡面,直覺的想法就是透過NN找出各種不同的Gaussian權重來組成一個可以描述output的分佈。(如下的分佈)











(機率高的地方就是真實存在的神奇寶貝,機率低的地方就是混何生成的結果)

VAE有兩部份:
1. Encoder
利用NN找出一個分佈z的mean和variance
2. Decoder
利用NN找出從分佈z中sample出來的各種Gaussian的權重,重組出output的分佈結果






VAE有一個問題,model學出來的是模仿資料的分佈,並不是真的去學習資料背後的真實意義。(否如說產生數字,同樣都是數字7,它並不知道什麼樣的結果是7,只知道要模仿資料產生相似的圖片,所以衍生了之後GAN(2014)的方法)


GAN:
generator是沒有看過任何data的,從隨機的vector產生,一但train成功,就可以藉由操控vector達到任意想要生成的結果。
目前還是非常難train,要讓generator和discriminator處於互相競爭的狀態。
假如generator剛好產生一個discriminator分辨不了的,就failed。


Transfer Learning
假設有
資料A (A domain的資料,很多)
資料B (B domain的資料,很少)

簡單來說就是資料B太少,只好想辦法用資料A來train,然後在用資料B去調整,看能不能利用資料A train出一些資料B共同的特徵。
有時候會把train A中的部份層數複製,用B去train那些沒複製的層數。
(i.e., image: 複製前面幾層抓基本特徵,語音:複製後面幾層抓語意結構)



















研究發現,在差不多的data domain測試,其實copy全部的layer然後作fine tune效果最好,如果把copy來的layer fixed住,效果也有可能變差,換句話說每一層的layer彼此是互相關聯的,不應該隨意fixed。

- Domain-adversarial Training













直覺想法:不同的dataset會有不同的domain,在作transfer learning的時候,我們會希望feature extractor找出的feature分佈在兩個domain上不要差太多,這樣才能讓原本dataset的訓練幫助到目標dataset的學習。所以就設計一個domain classifier對抗feature extractor(騙過domain classifier,input是domain A卻誤判成domain B,但domain classifier必須盡可能的判斷正確),同時feature extractor也必須正確的透過label predictor來預測結果。

- Zero-shot Learning
直覺想法:找出兩個dataset的共通attribute (embedding spcae),要learning的是attribute而非domain,找出attribute以後在根據查表得到答案。(loss function: 讓相近的atrribute在embedding space相近,反之則相遠)








Reinforcement learning

R = reward
τ = trajectory ([state, action, reward]_1, [state, action, reward]_2, ...)
θ = parameter of actor (就是各種weights)
簡單想法:Actor玩一個遊戲時會根據當前的state來決定執行某個action,這個過程會產生一個trajectory,可以把這個trajectory當成一個機率式來表達(the probability of trajectory given actor),所以加總全部有可能的trajectory在當前的actor條件下,獲得全部reward的期望值。







然後在用這個期望值(分數)作偏微分去更新actor的參數θ(使得它之後根據state會採取比較好的action)。
(log微分的特性,造成p的微分值除以p,也就是說,讓出現機率高的不會影響結果,找出真正提高reward的trajectory)


為什麼要全部的reward呢?否則就只會根據短期獲益的結果去更新actor(譬如說涉及遊戲中的射擊動作,因為只有射擊才會得分,移動只是射擊的準備)
但實務上不可能窮舉全部的trajectory,所以就sample產生N個τ來近似。

No comments:

Post a Comment