轉自:https://blog.csdn.net/sparkkkk/article/details/72598041,感謝分享!
先給一個直觀的例子,這個是在我們訓練GAN的時候經常出現的
這就是所謂的Mode Collapse
但是實際中ModeCollapse不能像這個一樣這么容易被發現(sample中出現完全一模一樣的圖片)
例如訓練集有很多種類別(如貓狗牛羊),但是我們只能生成狗(或貓或牛或羊),雖然生成的狗的圖片質量特別好,但是!整個G就只能生成狗,根本沒法生成貓牛羊,陷入一種訓練結果不好的狀態。這和我們對GAN的預期是相悖的。
如上圖。PdataPdata是八個高斯分布的點,也就是8個mode。
我們希望給定一個隨機高斯分布(中間列中的最左圖),我們希望這一個隨機高斯分布經過G最后可以映射到這8個高斯分布的mode上面去
但是最下面一列的圖表明,我們不能映射到這8個高斯分布的mode上面,整個G只能生成同一個mode,由於G和D的對抗關系,G不斷切換mode
李宏毅原話:
在step10k的時候,G的位置在某一個 Gaussian所在位置,然后D發現G只是在這個Gaussian這里了,所以就把這個地方的所有data(無論real還是fake)都給判定為fake
G發現在這個Gaussian待不下去了,只會被D永遠判定為fake,所以就想着換到另一個地方。在step15k就跳到了另一個Gaussian上去
然后不斷跳跳跳,不斷重復上述兩個過程,就像貓捉老鼠的過程一樣,然后就沒有辦法停下來,沒法達到我們理想中映射到8個不同的Gaussian上面去
為什么會出現模式坍塌
參考資料:https://blog.csdn.net/Forlogen/article/details/89608973
李宏毅原話:
在step10k的時候,G的位置在某一個 Gaussian所在位置,然后D發現G只是在這個Gaussian這里了,所以就把這個地方的所有data(無論real還是fake)都給判定為fake
G發現在這個Gaussian待不下去了,只會被D永遠判定為fake,所以就想着換到另一個地方。在step15k就跳到了另一個Gaussian上去
然后不斷跳跳跳,不斷重復上述兩個過程,就像貓捉老鼠的過程一樣,然后就沒有辦法停下來,沒法達到我們理想中映射到8個不同的Gaussian上面去
對於左邊的KL散度,出現無窮大的KL散度是因為PdataPdata有值而PGPG沒有值
也就是說當我們PdataPdata有值的時候,我們必須保證PGPG也有值,這才能保證KL散度不會趨於無窮大。
假設我們的G的capacity不夠,只能產生一個Gaussian的時候,那么這個時候的G就會傾向去覆蓋所有PdataPdata存在的地方,PdataPdata有值的地方PGPG也要有。
當然,即使PdataPdata沒有的地方,有PGPG也無所謂(畢竟這個時候KL散度趨於0,懲罰很小)
雖然這個時候基本上不會出現mode collapse的情況,但是會出現很多無意義的樣本
對於右邊的reverse KL散度,如果出現了PGPG在某一個沒有PdataPdata(Pdata≈0Pdata≈0)的位置產生了值,那就會使得這個reverse KL散度變得特別大。
所以對於在minimize KL散度這個training過程中,就會出現很高的懲罰。為了安全起見,PGPG就會更加傾向於生成同一張安全的一定會被認為是real的image,也不冒險去產生一些不一樣的image
而由於我們這里假設PGPG只是一個單一的Gaussian而不是多個Gaussian疊加(如圖中的PdataPdata),所以就會趨向於去完全擬合其中一個真實的Gaussian,這樣就出現了mode collapse