影響関数について

Takuma Kitamura
KARAKURI Techblog
Published in
10 min readMay 21, 2020

こんにちは!カラクリ株式会社 R&D チームの北村です。
この記事では、以下の論文にある影響関数 (Influence Function) について、実際に実装し、その挙動についてまとめました。

論文:P. W. Koh & P. Liang ”Understanding Black-box Predictions via Influence Functions”

影響関数とは、ざっくりいうと「機械学習において、個々の訓練データが(学習済みモデルによる)推論に与えた影響を定量的に測ったもの」です。訓練に用いたデータが学習に正の貢献をするのか負の貢献をするのか、またその度合いが強いのか弱いのか、といった情報を知ることで、学習の振る舞いの理解につながります。

応用例はいくつか考えられますが、直接的には学習への影響度合いをデータの「質」とみなすことで、データを用意するアノテーターの貢献の可視化が可能になるでしょう。

1. 動機と定義

人間的な感覚

定義に入る前に、データの学習への影響とはどういうものか考えてみます。具体例として、データセットに MNIST (手書き数字の判別) を用いて教師ありの機械学習を行うことを考えましょう。すなわち、各データは数字の画像と表している数の組で、その対応づけを予測することになります。ひとつのテストデータに対する訓練データの貢献度合い=影響を考えると、直感的には

  • テストデータと同じ数字を表していて、かつ形も似ているような訓練データは、学習に正の貢献をしそう
  • 同じ数字を表していて、かつ形が全然違うものは、負の貢献 (学習の邪魔) をしそう
  • 異なる数字を表していて、かつ形が似ているものは、紛らわしいという意味で負の貢献をしそう

などと予想できます。

これらの考察はもちろん人間の感覚でしかないですが、データの貢献度合いを数値で表すことができれば、学習がどのように行われるかの理解につながるでしょう。

原始的な定義

影響の定量化について最も単純な方法としては、一つの訓練データを取り除いて再学習し変化を見る、というものが考えられます。

そもそも学習とは、訓練データに対する損失の和 (経験損失) を考え、それを最小にするパラメタを発見する手続きといえます。一つの訓練データを除去すると、最適化したい損失の和が変化し、それに応じて最適なパラメタが変化し、さらにあるテストデータに対する損失も変化します。

この最終的な損失の変化が、訓練データのテストデータに対する貢献度合い・影響と呼べるでしょう。訓練データの除去によって損失が増えれば、もともと学習に正の貢献をしていたといえるし、逆に損失が減れば、もともと負の貢献をしていたといえます。

近似

しかし、いちいち訓練データを取り除いて変化を計算していては、計算コストがかかりすぎてしまいます 。そこで、適切な仮定のもとで変化の値の近似を行います。学習に対する仮定は次の通りです:経験損失は、パラメタについて二回微分可能かつ強凸 (★)

この仮定を用いることで、パラメタの変化の一次近似が計算でき、それを用いてテストデータの損失の一次近似も計算できます。その近似係数を影響関数と呼びます。計算結果は次の通りです (計算手順は割愛):

数式の左辺が、訓練データ z のテストデータ z_test に対する影響関数を表す関数です。計算結果に触れておくと、影響関数の値は、テストデータに対する損失の勾配・経験損失の hessian の逆行列・除去する試験データに対する損失の勾配、の 3 つを掛け合わせたものになっています。勾配同士の純粋な内積とは異なること、仮定より hessian が可逆なこと (hessian の正定値性による) に注意しましょう。

計算量削減

パラメタ・損失の変化の近似により、テストデータに対する各訓練データの貢献度合い=影響関数の計算が可能になりました。ただし、それでもなお計算のコストは高いです。具体的には、訓練データの個数を n, パラメタの個数を p として O(np²+p³) かかってしまいます。この計算の重さは、経験損失の hessian を求め、さらに逆行列を計算する、という二つの手順に起因するものです。

論文では、計算量削減の工夫がいくつか挙げられています。作戦は次の通りです:

  • hessian そのものを求めるには O(p²) かかるが、実は hessian とベクトルの積は O(p) で計算できる。
  • 今回は hessian の逆行列と勾配ベクトルの積を求めたかった。計算法は以下の二つ。
  • ひとつは共役勾配法、つまり求める積をある二次形式の最適解と思って近似する。訓練データ近似のためのステップが t 回必要なら、計算量は O(npt) となる。
  • もう一つは確率的予測によるもの。経験損失の hessian だと、各訓練データの損失に対し hessian を計算して足し合わせる必要があった。そこでその部分を訓練データのランダムサンプリングにより近似する。正確には、逆行列をテイラー展開して逐次計算で求まる形にし、その計算にサンプリングした訓練データを使用する。ただしサンプリングだけだと分散が大きくなるため、何度か行って平均をとる。逐次計算を行う回数 r や平均をとる回数 t を選べるが、その積 rt がだいたい O(n) だとうまくいくと論文で言及されており、結局計算量は全部で O(np) となる。

以上の工夫により、適切な仮定のもとで影響関数を実用的な時間で求めることが可能になります。

2. 実験

ここからは、実際に影響関数の計算を実装し、実験した様子を書いていきます。今回扱った論文については、著者が実際に作成したコードをこちらで公開していますので、参考にどうぞ。なお、著者は Tensorflow を用いて実装していますが、今回は Pytorch を用いて実装を行いました。

実験1

上で定義した影響関数と、再学習による損失の変化の両方を計算し、相関を調べ、影響関数が貢献度合いを正しく計算・近似できているかを確認します。

まずはデータセットとして MNIST を用いて、ロジスティック回帰により学習を行いました。これは論文内でも考えられていた設定です。ここでは適当に抜き出した数 (3 と 8) による 2 値分類を行いました。

影響関数については、隠れ層のないニューラルネットをロジスティック回帰とみなし、その学習についての勾配・二回微分を計算することで導出しました。

一方、誤差の再学習には sklearn のロジスティック回帰を用いました。なお論文にもある通り、LBFGS 法を指定しています。

テストデータとしては学習に失敗したものをひとつ選んで固定して、各訓練データに対する影響関数を計算し、影響の大きかった上位のものについて再学習を行いました。

影響関数と実際の変化量の相関を表したものが次の通りです:

確率的予測. scaling = 10, r = 300, t = 200
共役勾配法. damping = 0.01

縦軸が影響関数の値、横軸が実際の誤差です。影響関数の計算手法として、上で紹介した確率的予測と共役勾配法の両方を試しましたが、どちらの手法でも強い相関を見せています。相関係数はそれぞれ 0.934, 0.995 となっていて、特に共役勾配法ではかなり正確に値を近似できています。

なお、影響関数の計算において scaling, damping を行っています。前節で学習に対する仮定 ★ をおきましたが、その仮定のもとでは hessian は正定値になって逆行列を持ちます。しかしこの事実は一般には成り立たないため、具体的なケースでは hessian に補正が必要となります。scaling は、hessian の固有値が小さくなるよう定数倍する操作で、確率的予測で値を収束させるために用います。一方で damping は、ランクの落ちた hessian について固有値を 0 から定数ずらす操作で、共役勾配法で用います。

なお、上の 2 例では比較的うまく相関がみられたのですが、scaling, damping, 確率的近似の際の r, t, といったハイパーパラメタを変化させると、近似がうまくいかないことが多々ありました。なのでハイパーパラメタの適切な選択が求められるようです。

確率的手法. scaling = 10, r = 1500, t = 40

さて、この貢献度合いが人間の直感と合致するのかも確認してみました。図は、テストデータの画像と、影響関数の絶対値の大きい訓練データを比較したものです。

左:正の貢献を示した画像、右:負の貢献を示した画像

それぞれ左上がテストデータの画像で 3 を表しています。

なんとなくですが、正の貢献を示した方ではテスト画像に形の似た 3 が多いような気がするし、負の貢献を示した方では形の似ている 8 が多いような気がします。また似てる似ていない以前に、人間にとって判定しづらい外れ値のようなデータもいくつか混ざっているように見えます。

実験2

実験 1 では、学習にロジスティック回帰という計算上単純な手法を用いていました。そこで、実験 2 では一般のニューラルネットで学習した際の挙動を確認します。再学習のコストを軽くするため、データセットにはサンプルの少ない Iris を用いて、品種の分類問題を学習させました。

学習には 10 個のニューロンを持つ隠れ層を挿入した 2 層のニューラルネットを用いました。実験1と同様、影響関数と実際の誤差をそれぞれ計算し、相関を調べたものが次の図です:

確率的予測. scaling = 30, r = 50, t = 10
共役勾配法. damping = 0.05

全てのテストデータについてプロットしており、縦軸が影響関数の値、横軸が実際の誤差です。どちらの手法でもうまく近似が行えていませんね。。。とくに影響関数の値のほとんどが 0 になってしまいました。

ハイパーパラメタを変化させた実験も試みましたが、うまく近似ができているものは発見できませんでした。。。

3. 考察

最初の実験では近似がうまくいくケースが見つかりましたが、後者の実験では近似がうまくいきませんでした。

どちらの実験についても、誤差の近似の際の仮定 ★ から外れるケースのため、正しい近似を行うのが難しいのかもしれません。論文でも非凸なケースに少しだけ触れていますが、一般の学習においてはほとんどが非凸であると考えられるため、このままだと実用に耐えられるか怪しいでしょう。近似手法の見直し、およびハイパーパラメタの考察を進める必要がありそうです。

4. まとめ

  • 機械学習において訓練データの学習への貢献度を定量化する手法である影響関数を、提案された論文に沿って実装し、正当性を確かめる実験を行った。
  • MNIST のロジスティック回帰ではほぼ正確に定量化できていた一方、Iris の 2 層ニューラルネットを用いた分類では正確な定量化が行えなかった。
  • 近似手法やハイパーパラメタの選択など、今後考察するべき課題が見つかった。

以上です。最後まで読んでいただき、ありがとうございました!

--

--