Wasserstein距離

上級

4.4.3

Wasserstein距離

最終更新 2020-04-08 読了時間 2 分
まとめ
  • ワッサースタイン距離は、質量を移動させるコストとして分布間の差を測ります。
  • 1 次元の例で計算手順を確認し、多次元での近似手法も紹介します。
  • 正規化や計算コストなど実務での注意点を整理します。

1. 定義と直感 #

1 次元離散分布 \(P\) と \(Q\) の 1-Wasserstein 距離は、累積分布関数 (CDF) の差を積分した量として表せます。

$$ W_1(P, Q) = \int_{-\infty}^{\infty} |F_P(x) - F_Q(x)| \, dx $$

多次元の場合は最適輸送問題として定式化され、分布をもう一方へ移す最小コストを求めます。単に平均が異なるだけでなく、ばらつきや形状の違いも反映されます。


2. Python による計算例 #

1
2
3
4
5
6
7
8
9
import numpy as np
from scipy.stats import wasserstein_distance

x = np.random.normal(0, 1, size=1_000)
y = np.random.normal(1, 1.5, size=1_000)

dist = wasserstein_distance(x, y)

print(f"Wasserstein distance: {dist:.3f}")

scipy.stats.wasserstein_distance は 1 次元の距離を計算します。多次元の場合は pot(Python Optimal Transport)ライブラリの Sinkhorn 距離などの近似解法が実務でよく使われます。


計算例(1D 離散分布) #

2 つのヒストグラム \(P = [0.4, 0.3, 0.2, 0.1]\) と \(Q = [0.1, 0.2, 0.3, 0.4]\) の Wasserstein 距離を CDF 差の絶対値として計算します。

| ビン | \(P\) | \(Q\) | CDF(P) | CDF(Q) | |CDF差| | | — | —: | —: | —: | —: | —: | | 1 | 0.4 | 0.1 | 0.4 | 0.1 | 0.3 | | 2 | 0.3 | 0.2 | 0.7 | 0.3 | 0.4 | | 3 | 0.2 | 0.3 | 0.9 | 0.6 | 0.3 | | 4 | 0.1 | 0.4 | 1.0 | 1.0 | 0.0 |

$$W_1 = 0.3 + 0.4 + 0.3 + 0.0 = 1.0$$
1
2
3
4
from scipy.stats import wasserstein_distance
print(wasserstein_distance([1,2,3,4], [1,2,3,4],
                           [0.4,0.3,0.2,0.1], [0.1,0.2,0.3,0.4]))
# 1.0

他の分布距離との比較 #

指標特徴サポート不一致時
Wasserstein形状+位置の差を直感的に測る有限値(安定)
KL ダイバージェンス情報量的な距離、非対称無限大になりうる
JS ダイバージェンスKL を対称化常に有限
ヘリンガー距離平方根で 0〜1 に正規化常に有限

Wasserstein は KL と異なり、分布のサポートが重ならなくても有限値を返すため、生成モデル(WGAN)の損失関数に採用されています。


3. 特長と比較ポイント #

  • 形状の違いに敏感:平均が同じでも分散やモードの数が異なれば距離が大きくなります。
  • ロバスト性:KL のようにサポートがずれて無限大になることがなく、外れ値にも比較的強い指標です。
  • 計算コスト:高次元では最適輸送の計算が重いため、Sinkhorn 正則化などの高速化手法を活用します。

4. 実務での活用例 #

  • 生成モデル評価:生成分布と実データの差異を総合的に把握。
  • 品質検査・シミュレーション:ヒストグラム全体の違いを捉えたい場面で有効。
  • 時系列モニタリング:期間ごとの分布変化を追跡し、閾値を超えたらアラートを出す。

5. 注意点 #

  • 数値スケールが大きいと距離も大きくなるため、標準化や正規化を行ってから比較すると解釈しやすくなります。
  • 距離が小さくても平均や分散の差が残る場合があるため、他指標との併用が推奨されます。
  • Sinkhorn 距離は正則化パラメータの設定で結果が変わるため、比較目的に応じてチューニングしましょう。

まとめ #

ワッサースタイン距離は、位置と形の両方を考慮して分布の違いを測る指標です。1 次元では手軽に計算でき、多次元でも近似解を活用すれば実務に取り入れられます。KL や JS など他の距離と組み合わせて、分布比較を多角的に行いましょう。


よくある質問 #

KLダイバージェンスとWasserstein距離の使い分けは? #

KLダイバージェンスは分布の重なりがない(サポートが異なる)場合に無限大になるため、GANの学習など分布が離れた状況では不安定です。Wasserstein距離は分布が重なっていなくても有限の値を返し、分布間の「地理的な距離」に敏感です。ドリフト検知やGAN評価ではWasserstein距離が安定して機能します。ただし計算コストはKLよりも高くなります。

高次元データでWasserstein距離を計算するには? #

高次元ではOT(最適輸送)問題の計算量が爆発するため、以下の近似手法が実用的です。

  • Sinkhorn距離:エントロピー正則化を加えて計算量を削減。potライブラリ(Python Optimal Transport)で実装可能
  • スライスドWasserstein距離:ランダム1次元投影の平均として近似。高次元でも効率的
  • 次元圧縮後に計算:PCAやオートエンコーダーで低次元に圧縮してから計算

GANの学習でなぜWasserstein距離が使われる? #

WGAN(Wasserstein GAN)はバニッシンググラジエント問題を緩和するためにWasserstein距離を損失関数として使います。Wasserstein距離は生成分布と実データ分布が重なっていなくても滑らかな勾配を提供するため、学習が安定します。

データドリフト検知での使い方は? #

本番環境でのデータドリフト監視に活用されています。訓練データと本番データの特徴量分布を定期的に比較し、Wasserstein距離が閾値を超えたらアラートを発する仕組みが一般的です。evidentlyalibi-detectなどのドリフト検知ライブラリが内部で使用しています。


分布の差と Wasserstein 距離 #

2 つの分布の差を変えると各距離指標がどう変化するか確認できます。