2017年11月9日木曜日

Adversarial Example

Adversarial Exampleというものがあるらしい。これは、機械学習において、分類器へ提示する入力に、人間にはほとんどノイズのようにしか思えないような信号を足して、分類器に誤分類をさせるというものである。詳しく知りたい方は、Googleなどで調べてみてほしい。

これを防ぐ方法を考えてみたのだが、ニューラルネットワークの活性化関数のReLU(Rectified Linear Unit)を、max(0, x)からmax(0, x-ε)に変更するという方法はどうであろうか。εは微小な正の数である。こうすると、ノイズのような信号には反応しなくなり、分類の結果にも大きな影響は表れないように思う。

自分でプログラミングをする程の余裕と実力はないので、プログラミングして試すことはできないのだが、誰かプログラミングすることのできる人がいれば試してみてほしい。すでにDeep Learningなどのプログラミングしている人であれば、簡単な変更で試すことができるように思う。分類器をプログラミングすることは、様々なヒューリスティックに決定されている定数などを決定しなければならないので、詳しく知らない者にとっては、むずかしい。

Adversarial Exampleの起こる本質的な原因を考えてみたい。Adversarial Exampleが起こるのは、分類集合より大きな集合を学習しているためだと考えられるように思う。これは、過学習の逆である。だから、分類集合の数を増やすことが、解決策の一つになるように思う。特に、Adversarial Exampleのクラス自体を学習してしまうという方法は、良い方法なのではないだろうか。先の方法もそうだが、既知の研究について調べてはいないので、すでに提案されている方法かもしれない。

もう一つ、理由として考えられるのが、Sigmoid関数の利用である。まさに正解が表れたとき、1に近い数字を出力するように、Sigmoid関数が学習されれば良いのであるが、通常の勾配による学習では、そうはならないであろう。小さな入力でも、1に近い出力を出すように学習してしまっている可能性があるように思う。Sigmoid関数を使うのであれば、そのあたりを考慮しなければならないように思う。