DNNモデルに対するテストの網羅度を示す一つの指標として、ニューロンカバレッジというものが提案されています。
ざっくりいうと、ニューラルネットワークを構成するニューロンがどの程度網羅的に発火したかを示す指標です。
その有効性については議論がさまざまあり、例えば「AIプロダクト品質保証ガイドライン 2021.09 版」では以下のように述べられています。
これに対し、ニューラルネットワーク内における様々な計算部品(ニューロン)の数値大小を用いて、テストの多様性に関する評価や多様なテストの生成を行うことが考えられている〔Pei 2017〕〔Ma 2018〕。ただし、必ずしも求められる品質と強い相関があるわけではないことも報告、議論されており〔Harel-Canada 2020〕、少なくとも盲目的に従来のプログラムに対するカバレッジ指標と同等に安易に解釈、運用すべきではない。
また、「機械学習品質マネジメントガイドラインrevision 2.1.0」では、以下のように述べられています。
NCの値は、不具合の状況よりも、モデル・キャパシティとの相関が大きい。例えば、NCが小さくても正解率が高くなったり、逆に、正解率が悪くてもNC値が大きくなったりすることがある
つまり、ソフトウェアの構造ベースのテスト技法から着想を得ている点ではなんとなく意味がありそうだけれども、意味を理解しつつ使いどころを選ばなければならない、という話ですね。
というわけで、やってみた
今回使ったのは以下です。
対象にしたモデルは手元で実験的に作ったものです。
Keras:DNNエンジン
https://keras.io/
EvalDNN:機械学習モデル評価用のToolbox
https://yqtianust.github.io/EvalDNN-benchmark/
seaborn:ニューロンカバレッジのビジュアライズ
https://github.com/mwaskom/seaborn
生データ
こんな感じで各レイヤーでニューロンカバレッジが出ます。
計算の対象外になるレイヤーもあるようです。
可視化
seabornを使って活性化度合いを可視化してみた結果がこちらです。色が濃いほど、活性化した度合いが高いことを示します。
テストデータを追加してみて、活性化度合いが上がることも確認してみました。何となく色が濃くなっていますよね。
ニューロンカバレッジの計算をする場合には、閾値を設定して活性化度合いが一定以上であればカバレッジされたと判断するようになっています。
考察
実験結果を受けて考えたことを記します。
・(わかっていたけど)活性化度を上げても、モデルが妥当であることを示すことは難しい
・学習データの十分性(機械学習マネジメントガイドラインで言う「モデル・キャパシティとの相関」)を示すことには使える可能性があるのでは
・Explainableなモデルになると、もう少しニューロンカバレッジの解釈ができるようになる?
まとめ
ニューロンカバレッジはソフトウェアでいうところのステートメントカバレッジ的な扱いだと理解していますが、ソフトウェアにブランチやコンディションを考慮したカバレッジがあるように、DNNの世界でももう少し複雑なカバレッジも提案はされています。テストエンジニア(QAエンジニア)としてカバレッジという指標があると判断の拠り所になるため、盲目的に使いたくなりがちですが、どんなカバレッジも意味を理解して適材適所で使うことが大事ですね。それは、通常のソフトウェアにおけるコードカバレッジ然り、です。