密度比推定としてのAdversarial Validation

Link to English page


Adversarial Validationとは

Adversarial Validationとは、主にKaggleの文脈で使われる言葉です。 TrainデータとTestデータの分布が大きく異なる時に、出来るだけTestデータでの密度が高いデータをTrainデータから選んでValidationデータとして使うための技術です。(適当にValidationを作るとPublic LBと相関が低いValidationデータを作ることになってしまう)

手順としては、

  1. trainデータに仮のラベル-1、testデータに仮のラベル+1をつける。
  2. trainデータとtestデータを分類する2値分類器を訓練する。(cross-validation等で)
  3. 先ほどの分類器にtrainデータを推論させ、trainデータの中でtestデータである確率が高いtopN件をValidationデータとして採用する。

というようなものです。

(参考)

密度比(density ratio)

ここで、次のような式で定義される密度比(density ratio) : r(x)を導入することにします。

density ratio \displaystyle{
r(x) = \frac{q(x)}{p(x)}
}

また、密度比は、ベイズの定理を使って以下のように変形できます。

\displaystyle{
r(x) = \frac{q(x)}{p(x)} = \frac{p (x | y = +1)} {p (x | y = -1) } = \frac {p(y=-1)p (x , y = +1)} {p(y=+1)p (x , y = -1)}  = \frac {p(y=-1)p (y = +1|x)} {p(y=+1)p (y = -1|x)}
}

ここで、trainデータに仮のラベル-1、testデータに仮のラベル+1を振れば、 p (y = -1|x)p (y = +1|x)はちょうどtrainデータとtestデータを分類する2値分類器によって近似することができます。 また、p(y=-1)p(y=+1)は定数で、それぞれtrainデータの数とtestデータの数の割合で近似できます。

結局、密度比は

density ratio \displaystyle{
r(x) =\frac{N}{M}  \frac{f(x)}{1-f(x)}
}

となります。 NとMはそれぞれtrainデータの数、testデータの数です。また、f(x)はtrainデータとtestデータを分類する2値分類器が出力する、データxのクラス+1(targetデータ)の確率です。

ここで重要なのは、密度比推定は結局2値分類問題として帰着できることです。

Density Ratio Estimation for KL Divergence Minimization between Implicit Distributions | Louis Tiao (わかりやすい説明がのっています)

密度比r(x)f(x)に対して単調増加関数で、f(x)=0.5\frac{N}{M}の値をとります。以下では簡単のためN=Mを想定します。密度比は以下のような形をしています。

f:id:daiki-yosky:20191028082734p:plain
横軸:f(x)、縦軸:密度比

Adversarial Validationと密度比の関係

よって、Adversarial Validationが行なっているのは、密度比が高い点をtrainデータから抽出していることになります。

確かに、f(x) > 0.5のようなデータはtestデータの密度が高く、trainデータの密度が低いデータで、「trainデータにはあまり現れないが、testデータにはよく現れるデータ」であると言え、Validationデータとしての価値はかなり高いです。

そして、f(x) = 0.5付近の点はモデルがtrainデータ由来なのかtestデータ由来なのかを見分けることができなかったデータであり、こちらもValidationデータとしての価値があると思われます。

逆に、 0.5 > f(x)のようなデータは「trainデータにはよく現れるが、testデータにはあまり現れないデータ」であり、これをValidationデータとして利用するのは危険です。