# 李宏毅_ML_Lecture_18 ###### tags: `Hung-yi Lee` `NTU` `Machine Learning` [課程撥放清單](https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ/playlists) ## ML Lecture 18: Unsupervised Learning - Deep Generative Model (Part II) [課程連結](https://www.youtube.com/watch?v=8zomhgKrsmQ&list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&index=27) ### VAE  課程提過的VAE,Encoder輸出了兩組向量$m, \sigma$,再生成一個Normal Distribution Vector-$e$,將$\sigma$取exp乘上$e$加上$m$,所得即為code。 ### Why VAE?  上例來說,單純的Auto-encoder所做即是將照片降維到code,再經由decode來還原照片,在滿月與弦月中間如果再找一個點來還原,它所出現的圖不見得是我們所期待的滿月與弦月的中間形態,因為它中間經過的是Non-linear的模型計算。 如果是VAE的話,我們在訓練過程中加入了噪點(noise),因此在噪點範圍內它所還原的照片都應該是原始照片。但是噪點範圍是會重覆並且只能還原一張圖<sub>(上例來看同時重覆段希望還原為滿月與弦月)</sub>,因此訓練過程中會最小化MSE<sub>(mean square error)</sub>,也造成了這重覆噪點區段所還原的照片會介於兩照片之間,此例來看即介於滿月與弦月中間。 ### Why VAE?   **直觀說明VAE** VAE中符號表示說明: * $m$代表原來的code * $c$代表加入噪點之後的code * Decoder根據加入噪點的照片還原為原始照片 * $\sigma$代表噪點的variance * 控制噪點範圍 * 取exponential確保輸出為正值 * 訓練過程中由機器學習自行學習 * 目前為止是不足的,由機器自行學習,那機器學習為0的時候就等同原始的Auto-encoder * 加入限制項,避免學習數值過小 * $\sum_{i=1}^3(exp(\sigma_i)-(1+\sigma_i)+(m_i)^2)$ * $e$代表從Normal Distribution取出的亂數值 1. $exp(\sigma_i)$: 藍色線 2. $1-\sigma_i$:紅色線 3. 兩者相減:綠色線 綠色線的最低點代表$\sigma=0$,即variance=1<sub>(因為0取exponential為1)</sub>,這時候loss最低,因此學習過程中就不會讓variance為0。因為loss最低的時候variance為1。 $(m_i)^2$代表L2正規項(regularization),讓它結果較為稀疏<sub>(sparse)</sub>,避免overfitting ### Why VAE?  **正式說明VAE** 如果我們希望機器做的事情是生成一張寶可夢的圖,那每一張圖都可以想像成是高維空間上的一個點<sub>(範例為20x20照片,即400維)</sub>。 我們要做的就是estimate<sub>(估計)</sub>高維度空間上的機率分佈(P(x))<sub>(x為vector)</sub>,找出這個機率分佈我們就可以產生寶可夢的照片,因為取P(x)的時候會從機率高的地方比較容易被取出。 理論上在機率高的地方它就會是寶可夢的圖,上圖為例,在屬於寶可夢的圖像上機率皆為高,而不屬寶可夢照片的機率皆低。 ### Gaussian Mixture Model  Gaussian Mixture Model:高斯混合模型 上圖說明,黑色是我們的的資料分佈,看起來很複雜,而這個分佈其實是很多的Gaussian<sub>(藍色)</sub>用不同的權重疊合起來的結果,只要Gaussian數目夠多,就可以產生很複雜的分佈。 $P(x)=\sum_mP(m)P(x|m)$ 要從P(x)產生東西的時候要先決定要從那一個Gaussian來產生,舉例來說,有一堆的Gaussian,其背後皆有屬於各自的權重,根據每一個Gaussian背後的權重來決定要從那一個Gaussian來產生資料。 1. $P(m)$:從multinomial<sub>(多項式)</sub>distribution中決定Gaussian<sub>(m:表示第幾個Gaussian)</sub> 2. $P(x|m)$:依據所選擇的Gaussian,由它的$\mu^m$<sub>(mean)</sub>與$\Sigma^m$<sub>(variance)</sub>來產生資料x 我們可以確定每一個x都是由mixture中所產生,就跟classification相似,每一個x都是來自於某一個類別。但是單純的將資料做classification或clustering是不夠的,更好的方式是以distribution的表示,就是每一個x並不屬於某一個classification或cluster,而是它有一個vector來描述自己。 ### VAE  首先,取得一個z<sub>(範例為1維)</sub>,z由normal distribution中取得,並且為向量。有了z之後就可以決定$\mu$與$\sigma$。 z本身有無窮多種可能,而mean與variance也有無窮多種可能,因此我們假設mean與variance都來自一個function,這個function參數是z,給z之後它給你$\mu(z)$與$\sigma(z)$。 在z的空間上,每一個點都可能被取到,只是中間的部份被取得的機率較高,兩邊尾巴的部份機率較低,每一個被取得的點都對應一個分佈空間,這個分佈空間(Gaussian)的mean與variance都由某一個function來決定。 Neural network本身就是一個function,透過訓練一個神經網路來產出$\mu(z)$與$\sigma(z)$,以此決定在空間z上的mean與variance。 $P(x)=\int_zP(z)P(x|z)dz$ 知道$P(z)$以及$P(x|z)$之後再對所有可能的z做積分。 空間分佈並沒有一定要假設為Gaussian,這是可以個人設定,但使用Gaussian是較為合理的假設。 ### Maximizing Likelihood  $P(x)=\int_zP(z)P(x|z)dz$ * $P(z)$: Normal distribution * $x|z$: 知道z之後就可以決定x由那一個mean與variance的Gaussian中取出 * $\mu(z),\sigma(z)$之間的關係未知,等著被取出,取出方式為利用最大似然概率取出 * $L=\sum_xlogP(x)$ * 利用已知的資料計算最大似然概率 * 訓練過程中是由NN所產生 另一個分佈$q(z|x)$,與NN相反,給定x來決定z的mean與variance,兩者之間關係,NN為VAE的Decoder,而NN'為VAE的Encoder ### Maximizing Likelihood  先不管NN,先看$logP(x)$,它由over z的積分計算所得<sub>(任一分佈都可以由此式表達)</sub>。推導過程最後拆分為兩項<sub>(log內相乘拆開為相加)</sub>,後項的部份代表KL divergence<sub>(相對熵,代表兩個distribution相近的程度(之間的距離))</sub>。 $P(z|x)$與$q(z|x)$皆為distribution,給定x,有兩個distribution就可以計算KL divergence,數值愈大代表兩個distribution愈不相似,數值為0的時候代表兩個distribution是一樣的,也代表所得必定大於等於0。 前項的部份就是L的lower bound$L_b$,這是因為後項的KL divergence必定大於等於0,最糟就是0的話那L就等於前項。 ### Maximizing Likelihood  最後我們得到的式子如下: * $logP(x)=L_b+KL(q(z|x)||p(z|x))$ * $L_b=\int_zq(z|x)log(\dfrac{P(x|z)P(z)}{q(z|x)})dz$ 其中$P(z)$是已知的normal distribution,未知的是$q(z|x), P(x|z)$,從原本要找的$P(x|z)$來Maximizing Likelihood變尋找$q(z|x), P(x|z)$來讓$L_b$愈大愈好。 $logP(x)$為$L_b$的upper bound,因此增加$L_b$的同時也可能增加likelihood,但$L_b$與likelihoodd的關係卻不確定,理想上增加lower bound的同時likelihood也會跟著上升,但也有可能增加lower bound的同時likelihood是下降的<sub>(KL divergence愈大代表兩個distribution愈不相近)</sub>,likelihood依然大於lower bound但是可能下降的。 引入$q(z|x)$可以解決上述問題,上圖左可見,$logP(x)=KL+L_b$,透過調整$q(z|x)$來maximize$L_b$的時候會產生上圖右變化。 $q(z|x)$與$logP(x)$是無關的,$logP(x)$只跟$P(x|z)$有關,因此怎麼調整$q(z|x)$都不影響藍色線($logP(x)$),因此當我們最大化$L_b$的時候就是最小化KL divergence,當KL為0的時候就代表lower bound是與likelihood是相同的,這時候lower bound的提升就代表likelihood的提升<sub>(因為likelihood一定比lower bound大)</sub>。 ### Maximizing Likelihood  $L_b$的求解,將log內拆分為兩項,前項來看$P(z), q(z|x)$都是distribution,因此前項所計算是KL divergence,而$q$是一個neural network(NN'),給定x之後會輸出mean與variance ### Connection with Network  因此,最小化$P(z), q(z|x)$的KL divergence就透過模型調參讓產生的distribution與normal distribution越接近越好。 而最小化KL divergence是等價於$\sum_{i=1}^3(exp(\sigma_i)-(1+\sigma_i)+(m_i)^2)$ 另一項積分項的意思,根據$q(z|x)$的機率分佈來取得資料x,要讓$logP(x|z)$愈大愈好,這件事情即是Auto-encoder在做的事。 整個流程即是: 輸入x,產生兩個vector($\mu'$,$\sigma'$),sample出z,再根據z產生另外的vector($\mu$,$\sigma$),而$\mu$要跟原來的x愈接近愈好。 以上數學上的觀念不懂沒關係,參考一開始的直觀說法即可。 ### Conditional VAE  根據某一個條件來產生56相近的資料,上面範例為MNIST所產生。 ### To learn more  ### Problems of VAE  VAE最大的問題在於它從來沒有真正的學習認識image,因此,產生的照片中如果有差異一個pixel,不同的位置對人來說也許意義不同,但對它而言都是一樣的,因為它不懂。 上圖7為例,左右兩圖與7皆差異一個pixel,但是左圖的pixel是接續在後面,而右圖的pixel是在本體之外的一個點,但都是差異一個pixel,對VAE而言是相同的。 也因為這個缺點,延伸出後面的GAN。 ### Yann LeCun's comment   ### The evolution of generation   GAN的過程就有如擬態的演化,蝴蝶為了不被天敵吃掉不斷的演化,而天敵為了吃牠也不斷的演化。 首先,Generator_v1也許亂數產生了一些怪照片,接著Discriminator_v1根據真實的照片來判斷Generator_v1所產生的照片是真的或是由Generator_v1所產生的。 接著Generator_v1依Discriminator_v1變化為Generator_v2產生更真實的照片,而Discriminator_v1再更新參數為Discriminator_v2..... Generator_vn所產生的照片可以騙過Discriminator_vn-1,兩者一同演化進化。 需要注意的是,Generator從來沒有看過真正的image長什麼樣子,但Discriminator是有的,依真實照片比較真實與Generator的差異。 ### GAN - Discriminator  Discriminator是一個Neural network,input為image,output為number(0,1)<sub>(通過sigmoid轉換介於01之間)</sub>,0代表為假的,由Generator所產生,1代表為真照片。 而Generator就如同VAE中的Decoder,也是Neural network,input是一個任意distribution中的vector,output為image。 output出來的image會由Discriminator標記為0,而真實的照片會標記為1,接下來就是一個二分類的問題處理。 ### GAN - Generator  上面有了第一代的Discriminator,在得到結果之後要將第一代的Generator更新為第二代。 第一代Generator由亂數產生的vector騙不過第一代的Discriminator,因此Generator需要調整參數讓第一代的Discriminator認為照片是真的。 直觀來看,將Generator與Discriminator 合起來就是一個非常大的Neural network。這樣看起來的話,要做的事情就是利用梯度下降讓亂數產生的vector輸入經過模型之後輸出為1。 很重要的一點是,在更新參數的時候只能異動Generator的參數,而不能更新到Discriminator,其中一個原因在於,對Discriminator而言,要輸出為1就只要bias為1其它weights為0就可以達成了。 ### GAN - Toy Example  上圖是來自於GAN原始paper的範例。 z是Decoder的input,為one dimensional的vector。經過NN-Generator之後產生一個one dimensional x<sub>(綠色分佈)</sub>。我們希望output x可以愈接近實際資料愈好<sub>(黑色分佈)</sub> 將產生的資料x與實際資料一起丟給Discriminator判斷<sub>(藍色分佈)</sub>,可以發現左二藍色分佈在右邊是往下的,這代表Discriminator覺得在右邊的資料分佈可能是假的,而Generator更新參數之後就會往左移<sub>(左三圖)</sub>,反覆不斷更新之後,Discriminator無法分辨真假。 而目前遇到最大的問題在於,我們並不清楚Discriminator是不是對的,可能Generator太弱,也可能Discriminator太弱,因此訓練過程中會需要坐在電腦旁看Generator所產生的照片,隨時調參。 ### Cifar - 10  左邊是真正的照片,右邊的機器產生的照片 ### Moving on the code space  利用房間照片訓練之後在不同的空間上調整vector來產生不同的房間的照片 ### In practical...   目前GAN而言遇到幾個問題: 1. 非常難訓練 2. 無法明確的知道訓練結果 3. 要讓Generator與Discriminator均衡,因此調參極為重要 4. 很多時候Discriminator fails是因為Generator太弱
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up