DeepXplore: Automated Whitebox Testing of Deep Learning Systems https://arxiv.org/abs/1705.06640 DNNのテストのために、複数のDNNで予測結果が異なる、もしくは各ニューロンが活性化したかどうかで定義されるニューロンカバレッジを増やすようなテストケースの生成を行うというもの。 「あるDNNだけ予測結果が異なる」ことと「まだ活性化したことのないニューロンが活性化する」ことの2つを組み合わせた目的関数で勾配法で最適化する(ただし、それだとあり得ない入力を生成してしまうので、勾配をそのまま適用する代わりにドメインの制約を反映した形に変更したうえで適用してる)。

DNNの振る舞いのコーナーケースを突くような入力の生成という意味では、敵対的サンプル(adversarial example)を生成などもあったが、敵対的サンプルではシードとなるサンプルから大きく変化させないためニューロンカバレッジの向上は限定的で、提案手法が敵対的サンプルやランダムサンプリングよりも優れているとのこと。 評価はMNIST, ImageNet, 自動運転, Contagio(PDFのマルウェア検知), Drebin(Androidのマルウェア検知)で実施。

比較対象として、ソフトウェアのコードカバレッジしか言及されていないけれど、ニューロンカバレッジの概念やこういったテスト手法は電子回路やFBDのテスト手法(自分の関わっていたものだと[1][2])にむしろ近い。

また、こういうテスト生成の観点でみると、バックプロパゲーションの情報を残しながら計算を行うのは、コンコリッック実行(concolic execution)とある意味で似ているなと思ったり。

Pythonコードのコードカバレッジとの比較はちょっとひどい。 Chainerとかならともかく、TensorFlowとKerasを使っているので、そりゃネットワークを定義するために基本的にはすべてのコードが実行されるに決まっている気がする。

他の応用としてデータセット中で間違ってラベル付けされているサンプルの検出みたいな話にもちょっと触れられている。 これは汚染されていないデータセットで学習したDNNと、汚染されたデータセットで学習したDNNで結果が異なるような入力をDeepXploreで求めて、それと類似度が高いサンプルを探すというもの。 汚染されていないデータセットで十分な学習ができているDNNがあるなら「単にそれを使えばいいじゃん」と思うわけで状況設定に疑問もあるけど、面白い。 例えば、Poisoning Attacks against Support Vector Machines [3] みたいな攻撃を実際に検出できると面白いかも。

しかし、こういうDNN自体を分析するメタなことをしようとすると、Tensorflowだとどうやればよいか自明だけど、Chainerだと結構悩ましい気がする。 「あるDNNだけ予測結果が異なる」方の目的関数は簡単だけど、ニューロンカバレッジの方の目的関数は、中間ノードが活性化済みかどうかを判断するためにノードの同一性を定義するのが自明ではないような(参考: On graph merging in Chainer visualization [4])

[1] "MC/DC-like Structural Coverage Criteria for Function Block Diagrams" http://dx.doi.org/10.1109/ICSTW.2014.27
[2] 「シーケンス制御プログラムのテストに適した新しいカバレッジ基準の提案」 http://id.nii.ac.jp/1001/00090467/
[3] "Poisoning Attacks against Support Vector Machines" http://arxiv.org/abs/1206.6389
[4] "On graph merging in Chainer visualization" https://www.youtube.com/watch?v=jOw0kJe3-vE