基於圖嵌入的高斯混合變分自編碼器的深度聚類
Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding, DGG
作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/
1. 引言
這篇博文主要是對論文“Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding”的整理總結,這篇文章將圖嵌入與概率深度高斯混合模型相結合,使網絡學習到符合全局模型和局部結構約束的強大特征表示。將樣本作為圖上的節點,並最小化它們的后驗分布之間的加權距離,在這里使用Jenson-Shannon散度作為距離度量。
閱讀這篇博文的前提條件是:了解高斯混合模型用於聚類的算法,了解變分推斷與變分自編碼器,進一步了解變分深度嵌入(VaDE)模型。在知道高斯混合模型(GMM)與變分自編碼器(VAE)之后,VaDE實際上是將這兩者結合起來的一個產物。與VAE相比,VaDE在公式推導中多了一個變量c。與GMM相比,變量c就相當於是GMM中的隱變量z,而隱層得到的特征z相當於原來GMM中的數據x。而基於圖嵌入的高斯混合變分自編碼器的深度聚類(DGG)模型可以看做在VAE的基礎上結合了高斯混合模型與圖嵌入來完成聚類過程,公式推導中同樣增加了表示類別的變量c,同時,目標函數后面加了一項圖嵌入的約束項。比起VaDE來說,可以理解為多了一個約束項——圖嵌入,當然目標函數還是有所不同。
下面主要介紹DGG模型目標函數的數學推導過程。推導過程用到了概率論與數理統計的相關知識,更用到了VaDE模型推導里面的知識,如果想要深入了解推導過程,請先看變分深度嵌入(VaDE)模型的“前提公式”。
2. 目標函數的由來與轉化
3. 目標函數具體推導
用Siamese網絡來度量數據點之間的相似度,從而選出數據點xi的鄰居。
其中,D是數據x的維度,M是隱層z的維度,K是聚類數。
第二項和第四項最后一步怎么來的?用到了一個公式,公式的具體推導見:變分深度嵌入(VaDE)模型的“前提公式”。
4. 參數更新過程及聚類結果
我也搞不明白哪個圖正確,或者都不正確,望指正。
5. 我的思考
- 在推導過程中我與原文中的推導有不一樣的地方。
1)我的推導過程中變分下界L中第二項系數是1/2,原文直接是1,而在支撐材料里面仍然是1/2,因此可以認為是作者筆誤造成的。
2)我的推導過程中變分下界L中的第二項與第四項都有常數項(藍框框標出的),這兩項正好正負抵消,才沒有這個常數項,而在原文支撐材料里面直接第二四項都沒有常數項。不過這只是支撐材料的內容,在原文中沒有太大影響。
-
這里有一點和VaDE不一樣,VaDE聚類結果是由${{\gamma }_{ik}}$后驗概率通過貝葉斯公式得到的,中間過程並沒有參與梯度下降的更新,而DGG這里是構建了一個分類器網絡f2,從而得到聚類結果。
1)DGG這里有三個網絡,f1是編碼器,g是解碼器,而f2是分類器。
2)這種架構和蘇劍林博客中提到的VAE用於聚類的算法"變分自編碼器(四):一步到位的聚類方案 - 科學空間|Scientific Spaces"的網絡架構有異曲同工之妙,不過蘇劍林博客中的網路框架還多了一個自定義的Gaussian層,有興趣的可以看看蘇劍林那篇文章及代碼。
-
原文中分類器的輸入應該是VAE模型得到的隱層z,而代碼里面是VAE得到的x_mean,沒有經過采樣得到z,直接用x_mean作為分類器的輸入,這一點不知道是我理解有誤,還是代碼問題。
- 關於預訓練:首先訓練DAE作為VAE的初始化,訓練VAE得到隱層參數${\mu}_{i}$,用K-means對${\mu}_{i}$進行聚類,得到聚類中心作為GMM的初始類均值,K-means得到類標簽,計算樣本方差作為GMM初始類協方差矩陣。分類器部分用SGD進行微調,將${{\gamma }_{ik}}$作為分類器輸出,並用${{\gamma }_{ik}}$得到的聚類結果與K-means得到的初始標簽之間的交叉熵作為分類器的損失函數,從而預訓練分類器的參數。
- 關於Siamese網絡找鄰居:通過神經網絡訓練得到10維的隱層特征,對隱層計算相似性,代碼中是用Siamese網絡找到數據點的前100個鄰居,但后來又從這100個鄰居中隨機取20個作為數據點的20個鄰居,為什么不是先對100個鄰居排序,取最近的前20個?或許我代碼理解問題,求指教。
-
關於鄰居:預訓練階段自己算自己的,不涉及鄰居。正式訓練時,代碼中將自己本身的數據與20個鄰居的數據放在一起,形成一個三維矩陣,第一維代表樣本個數,第二維代表數據的維度,第三維代表自己+鄰居的ID。例如:image_train[:,:,0]代表數據本身,image_train[:,:,1]代表數據的第一個鄰居。這樣將數據本身與鄰居整合在一起,整體作為輸入數據,送進網絡進行訓練。這種設計相當巧妙,相當於以空間換時間,減少訓練過程中用來查找鄰居的時間。同時,DGG總體損失函數$\underset{\phi ,\theta }{\mathop{\max }}\,\frac{1}{2}\sum\limits_{i=1}^{N}{\sum\limits_{j=1}^{N}{{{w}_{ij}}(L(\theta ,\phi ;{{x}_{i}})+L(\theta ,\phi ;{{x}_{i}},{{x}_{j}}))}}$可以將這兩項合並成一項,既計算了自己與自己的損失函數,也計算了自己與鄰居的損失函數。
-
關於${{\pi }_{ik}}$:這篇文章中參數${{\pi }_{ik}}$與GMM中的混合比例不太一樣,計算${{\pi }_{ik}}$時是通過拉格朗日乘數法進行求解的${{\pi }_{ik}}=\frac{\sum\limits_{j\in {{\Omega }_{i}}}{{{w}_{ij}}{{\gamma }_{ik}}}}{\sum\limits_{j\in {{\Omega }_{i}}}{{{w}_{ij}}\left( {{\gamma }_{ik}}+{{\gamma }_{jk}} \right)}}$,但在代碼中定義的${{\pi }_{ik}}$的更新公式與原文提到的更新公式不一致。
-
同時,在定義GMM類的時候,計算后驗概率${{\gamma }_{ik}}$時並沒有出現混合比例${{\pi }_{k}}$,沒有用GMM中${{\gamma }_{ik}}$的更新公式${{\gamma }_{ik}}=\frac{{{\pi }_{k}}N({{x}_{i}}|{{\mu }_{k}},{{\Sigma }_{k}})}{\sum\limits_{k=1}^{K}{{{\pi }_{k}}N({{x}_{i}}|{{\mu }_{k}},{{\Sigma }_{k}})}}$進行計算。
- 代碼中計算相似度矩陣${w}_{ij}$時,窗口大小sigma的選取有歧義,函數中已經有了輸入變量sigma,但是里面又重新定義了sigma=dist_temp[11],這樣的話輸入sigma還有什么意義?無論輸入多少都無所謂,因為會被新定義的覆蓋掉。同時,sigma為什么要這樣定義?為什么是[11]?
-
DGG原作者給的代碼里面說預訓練的參數是從VaDE代碼里面獲得的。這里VaDE與DGG在訓練同一組數據用的VAE網絡架構是一致的,因此可以直接拿來用。如果數據是新的,首先需要訓練Siamese網絡來找數據點的鄰居,然后自己構建深度自編碼器或者變分自編碼器預訓練模型參數。
6. 參考文獻
[1] Linxiao Yang, Ngai-Man Cheung, Jiaying Li, and Jun Fang, "Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding", In ICCV 2019.
[2] 論文補充材料:Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding - Supplementary
[3] DGG Python代碼:https://github.com/ngoc-nguyen-0/DGG
[4] 變分深度嵌入(Variational Deep Embedding, VaDE) - 凱魯嘎吉 - 博客園
[5] 變分推斷與變分自編碼器 - 凱魯嘎吉 - 博客園