1. 程式人生 > >基於樣例的遷移學習——Covariate Shift——原始文章解讀

基於樣例的遷移學習——Covariate Shift——原始文章解讀

Covariate Shift 是遷移學習下面的一個子研究領域, 對它的研究最早起源於統計學領域的一篇文章 “Improving predictive inference under covariate shift by weighting the log-likelihood function”. 本文將從機器學習的角度來解讀這篇原始文章[1], 並著重提取那些比較適用於機器學習領域的要點. 因為Covariate Shift 目前還沒有比較合適的中文翻譯(有文獻翻譯成協方差轉變, 但個人認為這不是很恰當), 故下文仍然使用這個英語表述.

1 Covariate Shift

Covariate Shift 定義:

設源域(source domain)和目標域(target domain)的輸入空間均為X, 輸出空間均為Y. 源域的邊際分佈P_{S} (x)與目標域的聯合分佈P_{T} (x)不一致, 即P_{S}(x)\ne P_{T}(x), 但兩個域的條件分佈一致, 即P_{S}(y|x)=P_{T}(y|x).

2 文獻[1]的動機

文獻[1]的出現是為了解決錯定模型(model misspecification)和Covariate Shift 共同發生的情形下使用極大似然估計(Maximum Likelihood Estimation, MLE)法估計引數所帶來的問題.

在機器學習中, 一定是先假設資料是由潛在的模型產生, 這樣學習才有意義. 從概率的視角, 我們會對條件分佈P(y|x) 進行建模:(1)假設對x進行標記的概率模型P(y|x)來自某個模型空間F=\left\{ P(y|x;\theta)|\theta\in \Theta \right\}

; (2)利用資料集D=\left\{(x^{(i)},y^{(i)})\right\}_{i=1}^{m}擬合出這個概率模型P(y|x;\hat{\theta} ), 作為對真實概率模型P(y|x) 的估計. 對於引數\theta的學習是通過極大似然估計法: \hat{\theta} =argmin_{\theta \in\Theta}\sum_{i=1}^{m}{logP(y^{(i)}|x^{(i)};\theta)}.

只要我們假定的模型空間F能夠把真實的概率模型P_{S}(y|x)包含在裡面, 並且P_{S}(y|x)=P_{T}(y|x), 那麼這時候不管P_{S}(x), P_{T}(x)是否相等, 我們都可以利用源域的標記資料D_{S}=\left\{(x^{(i)},y^{(i)})\right\}_{i=1}^{m_{s}}擬合出源域真實模型P_{S}(y|x)的估計模型P_{S}(y|x;\hat{\theta}), 再把P_{S}(y|x;\hat{\theta})應用到目標域中去. 注意模型擬合時只需要源域的標記資料即可. To verify this argument, 下面對迴歸問題做個實驗(實現細節見附錄python程式): 設P(y|x)=P_{S}(y|x)=P_{T}(y|x), P_{S}(x)\ne P_{S}(x)y|x\sim N(-x+x^{3},0.3^{2}) ...................(I)

源域:x\sim N(0.5,0.5^{2})...............(II) 目標域:x\sim N(2.0,0.3^{2})...............(III)

由(I)和(II)產生源域的一個包含1000個訓練樣例的集合D_{S}=\left\{(x^{(i)},y^{(i)})\right\}_{i=1}^{1000}(圖1中藍色的點), 我們希望利用這些資料, 學得一個模型, 使得該模型在目標域有儘可能小的測試誤差. 由(I)和(III)產生目標域的一個包含100個測試樣例的集合D_{T}=\left\{(x^{(i)},y^{(i)})\right\}_{i=1}^{100}

(圖1中紅色的點), 用來測試所學模型在目標域的效能. 我們選用5個模型空間:第1個模型空間是1階多項式空間F_{1}=\left\{P(y|x;\theta)|y|x\sim N(\theta_{0}+\theta_{1}x,\sigma^{2}))\right\}, 第2個模型空間是2階多項式空間F_{2}=\left\{P(y|x;\theta)|y|x\sim N(\theta_{0}+\theta_{1}x++\theta_{2}x^2{},\sigma^{2}))\right\}, 依次類推. 後一個模型空間同時包含了前一個模型空間. 可見, 從第3階開始以後的模型空間都包含了真實的模型, 而且從這3個模型空間擬合出來的模型對紅色的點都擬合得很好, 即從F_{3},F_{4},F_{5}這3個模型空間中分別挑出的3個模型, 在測試域都有比較低的測試誤差. 而從F_{1},F_{2}這2個模型空間中分別挑出的2個模型(綠色和紅色的線條), 在測試域卻表現得很差.

_ 圖1 不同階數多項式迴歸對比圖


如果我們選擇的模型空間F沒能把潛在的真實的模型覆蓋住, 那麼我們實際上就是用了一個錯定的模型(model misspecification), 這個時候, 如果P_{S}(x)\ne P_{S}(x), 那麼只用源域的標記資料, 利用普通的極大似然估計去學習一個模型, 那麼這個模型在目標域的表現就會變得很差(設P_{S}(x), P_{S}(x)的差異較大). 文獻[1]正是考慮了錯定模型和P_{S}(x)\ne P_{S}(x)的情形下, 如何去改進我們的引數估計方法, 即改進極大似然估計.

事實上, Covariate Shift 與錯定模型這個兩個事件的發生與否在很大程度上影響著我們對真實模型的學習. 具體地, 可以考慮表1中的4種情況:

_ 表1 Covariate Shift 與錯定模型的所有可能組合

文獻[1]要解決的是case 1 情形下的引數估計問題. 對於case 2和case 4, 由前面的論述和多項式迴歸的實驗可以證明, 這2種情況下使用極大似然估計法去估計模型引數依然是沒有問題的. Case 3只涉及到模型空間的選擇問題, 這是關於先驗知識或歸納偏好的問題, 文獻[1]沒有去討論這種情況.

3 文獻[1]的結果(主要貢獻)

在case 1 發生的情形下, 已經不能直接使用極大似然估計法進行引數估計, 而應該使用加權的極大似然估計法. 具體地, 當我們選定模型空間F之後, 模型的引數應該這樣估計:

\hat{\theta}_{w} =argmin_{\theta \in \Theta}\sum_{i=1}^{m}{w(x^{(i)})logP(y^{(i)}|x^{(i)};\theta)} ............(IV)

而且權重w(x)與模型空間F的選擇可以通過一個準則——AIC資訊準則的變種:

IC_{w}=-2\sum_{i=1}^{m_{s}}{\frac{P_{T}(x^{(i)})}{P_{S}(x^{(i)})}logP(y^{(i)}|x^{(i)};\hat{\theta}_{w}) } + 2tr(\hat{J}_{w}\hat{H_{w}}^{-1} )...............(V)

在選定了權重函式w(x)以及模型空間F之後, 只利用源域的標記資料, 就可以對(V)進行計算. 假設有若干個權重函式以及若干個模型空間, 我們最後選擇那個IC_{w}值最小的組合. 需要說明的是, 文獻[1]中所考慮的w(x)的形式是w(x)=(\frac{P_{T}(x)}{P_{S}(x)})^\lambda, \lambda \in [0,1] ,對w(x)的選擇實際上變成了對超引數\lambda的選擇. 而且文獻[1]還做了一個在機器學習領域看起來不實際的假定: 假定P_{T}(x), P_{S}(x)事先已知.

4 文獻[1]的過程(文章脈絡)

文獻[1]的一條主體線索是:(1)\rightarrow(2)\rightarrow(3)\rightarrow(4)\rightarrow(5)\rightarrow(6)\rightarrow(7)\rightarrow(8)

(1)學習場景設定: Covariate Shift和錯定模型同時發生. P_{T}(x),P_{S}(x)事先已知.

\downarrow

(2)用一個簡單的線性迴歸例子, 說明使用極大似然估計法學習模型引數的危害

\downarrow

(3)藉助importance sampling identity,大數定律說明學習模型的引數要使用加權極大似然估計法

考慮log損失, 由importance sampling identity:

E_{(x,y)\sim P_{T}}(-logP(y|x;\theta))=-\int_{(x,y)}P_{T}(x,y)logP(y|x;\theta)dxdy\\=-\int_{(x,y)}P_{S}(x,y)\frac{P_{T}(x)}{P_{S}(x)} logP(y|x;\theta)dxdy\\=E_{(x,y)\sim P_{S}}(-\frac{P_{T}(x)}{P_{S}(x)} logP(y|x;\theta)) ......(VI)

根據大數定律:

\lim_{m_{s} \rightarrow \infty}{\frac{-1}{m_{s}} \sum_{i=1}^{m_{s}}{\frac{P_{T}(x^{(i)})}{P_{S}(x^{(i)})} logP(y^{(i)}|x^{(i)};\theta)}} = E_{(x,y)\sim P_{T}}(-logP(y|x;\theta)).............(VII)

所以要學得一個在目標域期望損失小的模型, 需要在源域訓練一個加權經驗最小化的模型:

\hat{\theta}_{w}=argmin_{\theta \in \Theta}\frac{-1}{m_{s}} \sum_{i=1}^{m_{s}}{\frac{P_{T}(x^{(i)})}{P_{S}(x^{(i)})} logP(y^{(i)}|x^{(i)};\theta)}.............(VIII)

從(VI)到(VII)的過程中應用了大數定律, 這決定了(VIII)只能適用於m_{s}取值很大的情形, 即我們擁有非常多的來自源域的標記資料. 否則, 如果m_{s}不夠大, 就要對權重進行選擇, 即對w(x)=(\frac{P_{T}(x)}{P_{S}(x)})^\lambda, \lambda \in [0,1] 進行選擇. 文獻[1]從理論和實驗兩個角度詳細探討了w(x)的選取. 因為遷移學習通常假定我們能夠很容易地獲得大量來自源域的標記資料, 所以在遷移學習領域一般直接選擇w(x)=\frac{P_{T}(x)}{P_{S}(x)}.

這一部分論述得比較詳細, 因為機器學習領域的Covairate Shift 工作引用最多的就是這篇文獻的這一部分的內容.

\downarrow

(4)考慮加權極大似然估計法所學模型的平均泛化誤差, 通過平均泛化誤差的展開式研究權重w(x)應該如何選取(肯定是選擇w(x)使得模型的平均泛化誤差最小)

\downarrow

(5) 由於(4)中的計算需要知道真實模型q(y|x)(4.1等式右端第一項的計算需要), 而真實模型q(y|x)是不知道的, 導致無法計算所學模型的平均泛化誤差. 於是文獻[1]推匯出一個新的資訊準則

該資訊準則是模型平均泛化誤差(4.1)的近似無偏估計, 可以作為選權重函式w(x)以及模型空間F的依據. 闡述了新提出的資訊準則與AIC資訊準則的聯絡.

\downarrow

(6)針對提出的資訊準則IC_{w},做實驗驗證該資訊準則的有效性.

\downarrow

(7)實驗驗證當源域資料很多時, (5.1)可以近似代替(4.1), 即驗證了

用實驗進一步驗證了資訊準則IC_{w}的有效性.

\downarrow

(8)說明了幾點: 1,P_{S}(x)可以是事先已知, 也可以從資料中估計; 2, 權重函式w(x)的選取存在其他方式; 3, 說明加權極大似然估計也可以看成魯棒迴歸.

參考文獻

[1] H. Shimodaira, “Improving predictive inference under covariate shift by weighting the log-likelihood function” ,Journal of Statistical Planning and Inference, vol. 90, pp. 227–244, 2000.

附錄

圖1 不同階數多項式迴歸對比圖的python程式

import random
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as linalg
from sklearn.linear_model import LinearRegression

print 'standard weights (w0,w1,w2,w3) = (0,-1,0,1)'

n = 1000

X_src = np.empty(n)
Y_src = np.empty(n)
X_tgt = np.empty(n / 10)
Y_tgt = np.empty(n / 10)

for i in range(n):
    X_src[i] = random.gauss(0.5,0.5)
    Y_src[i] = -X_src[i] + np.power(X_src[i],3) + random.gauss(0.0,0.3)
for i in range(n / 10):
    X_tgt[i] = random.gauss(2.0,0.3)
    Y_tgt[i] = -X_tgt[i] + np.power(X_tgt[i],3) + random.gauss(0.0,0.3)

reg = LinearRegression()
reg.fit([[v] for v in X_src],Y_src)
W1 = reg.intercept_,reg.coef_[0]

print 'W1 :',W1

reg = LinearRegression()
reg.fit([[v,v ** 2] for v in X_src],Y_src)
W2 = reg.intercept_,reg.coef_[0],reg.coef_[1]
print 'W2 :',W2

reg = LinearRegression()
reg.fit([[v,v ** 2,v ** 3] for v in X_src],Y_src)
W3 = reg.intercept_,reg.coef_[0],reg.coef_[1],reg.coef_[2]
print 'W3 :',W3

reg = LinearRegression()
reg.fit([[v,v ** 2,v ** 3,v **4] for v in X_src],Y_src)
W4 = reg.intercept_,reg.coef_[0],reg.coef_[1],reg.coef_[2],reg.coef_[3]
print 'W4 :',W4

reg = LinearRegression()
reg.fit([[v,v ** 2,v ** 3,v **4,v ** 5] for v in X_src],Y_src)
W5 = reg.intercept_,reg.coef_[0],reg.coef_[1],reg.coef_[2],reg.coef_[3],reg.coef_[4]
print 'W5 :',W5


X_plot = sorted(np.concatenate((X_src,X_tgt)))
plt.figure()
plt.plot(X_plot,[-i + np.power(i,3) for i in X_plot],label = 'noiseless target')
plt.plot(X_src,Y_src,'bo')
plt.plot(X_tgt,Y_tgt,'ro')

plt.plot(X_plot,[W1[0] + i * W1[1] for i in X_plot],label = 'order 1')
plt.plot(X_plot,[W2[0] + i * W2[1] + (i ** 2) * W2[2] for i in X_plot],label = 'order 2')
plt.plot(X_plot,[W3[0] + i * W3[1] + (i ** 2) * W3[2] + \
          (i ** 3) * W3[3] for i in X_plot],label = 'order 3')
plt.plot(X_plot,[W4[0] + i * W4[1] + (i ** 2) * W4[2] + \
          (i ** 3) * W4[3] + (i ** 4) * W4[4] for i in X_plot],label = 'order 4')
plt.plot(X_plot,[W5[0] + i * W5[1] + (i ** 2) * W5[2] + \
          (i ** 3) * W5[3] + (i ** 4) * W5[4] + \
          (i ** 5) * W5[5] for i in X_plot],label = 'order 5')

plt.legend(loc="best")
plt.show()

output:
standard weights (w0,w1,w2,w3) = (0,-1,0,1)
W1 : (-0.29578843795357851, 0.60680756922840728)
W2 : (-0.24137839883077888, -1.118596466841606, 1.6175250868307449)
W3 : (0.014386018101656139, -0.97736257687681483, -0.094743118854225233, 1.0393479036121429)
W4 : (0.015342798845553927, -0.98215866187620304, -0.097515221286365028, 1.0522118734968753, -0.0057473254710901367)
W5 : (0.01562503337882579, -0.97914406740220483, -0.10422149623464838, 1.0477376702208572, 0.005522699171098433, -0.003975707670178269)

編輯於 2017-04-17