領域自適應問題一般有兩個域,一個是源域,一個是目標域,領域自適應可利用來自源域的帶標簽的數據(源域中有大量帶標簽的數據)來幫助學習目標域中的網絡參數(目標域中很少甚至沒有帶標簽的數據)。領域自適應如今是遷移學習的一個火熱分支。
- CVPR2018
- Residual Parameter Transfer for Deep Domain Adaptation
CVPR2018
Residual Parameter Transfer for Deep Domain Adaptation
如果筆記不正常顯示,請到https://github.com/FangYang970206/PaperNote/tree/master/domain%20adaptation查看
這篇文章給出的是一個基於雙流不共享參數的領域自適應解決方案,分為源流(source stream)和目標流(target stream) ,目標流的參數是源流的參數通過殘差轉換得到的,如下圖所示:
下面的框給出了殘差轉換的具體做法,先通過一個低維映射(這個低維映射是可訓練的),然后通過一個非線性激活函數,緊接着重建(重建矩陣大小是低維映射可訓練權重矩陣的轉置大小),最后再加上源流參數得到目標參數。可將轉換過程抽象成如下公式:
其中\(\Omega\)是網絡層的集合,\(\theta_{i}^{s}\)和\(\theta_{i}^{t}\)對應的是源域和目標域參數第\(i\)層的參數(對於卷積層,參數\(\mathbf{W} \in \mathbb{R}^{N_{o u t} \times N_{i n} \times f_{x} \times f_{y}}\),所以\(\theta_{i}^{s}\)和\(\theta_{i}^{t}\)這里是對參數\(W\)進行了reshape,變為二維矩陣\(N_{o u t} \times N_{i n} f_{x} f_{y}\)),\(\mathbf{A}_{i}^{\top}\)是低維映射的矩陣,\(\mathbf{B}_{i}\)為重構矩陣,\(\mathbf{d}_{i}\)是偏置。更加具體看下圖:
上述公式有一個問題,\(k_{i}\)(轉換矩陣的秩)如果增大1,意味着多了一行,一行由\(M_{i}\)個元素,\(A_i\)和\(B_i\)一起就是\(2M_{i}\),加上偏置就是\(2M_{i}+1\), 這會\(M_i\)是很大的數,矩陣的秩沒控制好,將會造成巨大的轉換矩陣,特別是在處理全連接層的時候更加嚴重,作者由此提出了一個新的轉換公式,公式如下:
與之前公式差不了多少,公式符號解釋如下所示:
在激活函數內部,去除了\(M_i\)的維度,大大簡化計算量,然后在激活函數外進行復原。原公式參數量為\(\left(2 N_{i} C_{i}+1\right) k_{i}\),現在的公式參數量為\(2\left(N_{i} r_{i}+C_{i} l_{i}\right)+r_{i} l_{i}\),\(\left\{N_{i}, C_{i}\right\}\)是遠遠大於\(\left\{l_{i}, r_{i}, k_{i}\right\}\)的。
下面介紹訓練過程,用論文中的圖來說明:
第一步訓練(Pre-training on Source)是簡單的分類問題,對源域數據通過源流網絡進行訓練,訓練的loss是交叉熵。第二步(Domain Adaptation)是最關鍵的地方,訓練的是源流的參數以及轉換矩陣的參數,有三個loss,第一個loss還是交叉熵損失(Classification Loss),不過這里不僅是源流數據還會有帶標簽的目標流數據,如果目標流數據沒有標簽,則不計算目標流的交叉熵損失,第二個loss是差異損失(Discrepancy Loss),使用的是對抗性域混淆損失,傳統的交叉熵的公式如下:
其中\(y_{n} \in\) \([0,1]\),\(\hat{y}_{n}=\phi\left(\theta^{D C}, \mathbf{f}_{n}\right)\),\(\mathbf{f}_{n}\)為特征表示(送到分類器的特征圖),\(\theta^{D C}\)是分類器\(\phi\)的參數,一般是要最小化這個損失,但由於對抗域混淆損失不一樣,它是要欺騙分類器,所以是最大化損失,即:
最后還有一個正則化損失,公式如下:
其中\(\mathcal{L}_{\omega}\)為\(\mathcal{L}_{\omega}=\sum_{i \in \Omega}\left\|\mathcal{B}_{i}^{1} \sigma\left(\left(\mathcal{A}_{i}^{1}\right)^{\top} \Theta_{i}^{s} \mathcal{A}_{i}^{2}+\mathcal{D}_{i}\right)\left(\mathcal{B}_{i}^{2}\right)^{\top}\right\|_{F r o}^{2}\), \(\mathcal{Z}\)使用的是\(\log (\cdot)\)。這個損失有兩個目的,第一個是防止網絡學習到平凡轉換解\(\mathcal{L}_{\omega} \equiv 0\),第二個是防止源流權重和目標流權重差別太大。合起來的loss如下:
第三步測試就是將訓練好的源流參數通過訓練好的轉換矩陣得到目標流的參數,再將目標域的數據傳入到目標流,通過源流的分類器(注:源流和目標流使用的分類器是同一個)
那這篇文章就到此結束了嗎?其實還沒有,作者還提出了一個自動選擇復雜性的方法(Automated Complexity Selection),在上述中,我們假設轉換矩陣中的\(l_i\)和\(r_i\)是已知的,但是實際上,這個是需要手動去選擇的,當網絡較淺的時候,這種選擇算是可能的,但當網絡很深的時候,這種手動選擇就很不實際了,為此,作者提出了一種自動選擇機制,通過添加添加一個正則化。公式如下:
其中\(\mathcal{T}_{i}= \left(\mathcal{A}_{i}^{1}\right)^{\top} \Theta_{i}^{s} \mathcal{A}_{i}^{2}+\mathcal{D}_{i} \in \mathbb{R}^{l_{i} \times r_{i}}\),可以看到是轉換公式中激活函數的內部部分。這個正則化是一種“組Lasso形式”,組對應的是\(i^{th} layer\)中轉換矩陣\(T_i\)的列, 正則化器鼓勵將整個\(T_i\)的列清零,從而自動確定\(r_i\),前提是我們從足夠大的值開始。同樣的,可以構建類似的正則化\(R_r\)確定\(l_i\), 最后的總loss為:
訓練過程並不是直接使用總loss進行反向傳播,作者采用的是用\(Adam\)優化器最小化\(\mathcal{L}_{\text { fixed }}\),迭代次數提前定義好了,通過這樣迭代,得到估計的轉換矩陣\(\hat{T_{i}}\),作者對自動選擇復雜度的方法分為了兩步:
先自動選擇\(r_i\),然后再自動選擇\(l_i\).