機械学習の品質問題(3.2〜3.3)

3.2までは主に入力に対応する出力がわかっている場合に、テストをどう実施するかについて説明がされてきた。3.2以降では、機械学習システムのように入力に対する出力が必ずしもわからないシステムで、どんなテストができるのかについて説明する。  

紹介されている手法は下記の二つ。  

  1. メタモルフィックテスティング  
  2. 統計的なテスティング  

以降、それぞれの方法について見ていく。  

1. メタモルフィックテスティング

概要

メタモルフィックテスティングは3.1.7で説明があった部分オラクルを利用したテスト方法。  

同じく部分オラクルを利用したテスト方法のデザイン多様性では同じ機能仕様を実現した複数のプログラムを利用して出力の一致をとることでテストを実現したのに対して、メタモルフィックテスティングでは一つのSUT (System Under Test)を利用するため、開発コストを下げられるという特徴がある。

メタモルフィックテスティングでは、まず検査対象fの2つの異なる実行結果が満たす関係性Relを満たす様な入力の変換Tを見つけ、この変換Tを用いて新たなな入力を生成する。このとき、元となる入力xと変換して獲得した入力x’で生成した出力の関係性がRelを満たさなかったとき、fに欠陥があるとする。

数式で書くと下記のようにまとめられる。

f:id:okehara_aoi:20210602182634p:plain:w300 f:id:okehara_aoi:20210602182715p:plain:w220

なお、変換Tを用いて生成された新たな入力をフォローアップ・テスト入力と呼ぶ。

わかりにくいので例

三角関数sin(x)を級数展開を利用して近似計算するプログラムを考える。

f:id:okehara_aoi:20210602182733p:plain:w200

ここでは上記を利用して得られた、有限の多項式をプログラム化してsin(float x)とする。 通常テストする場合、三角関数が持つ周期性を利用して、x=0, π/2, π, 3π/2, 2πを入力とし、それぞれ出力に0, 1, 0, -1, 0を期待するテストが考えられる。ただ、これらの境界値を検査したとしても、特徴的な値のみを調べただけのため、テストとしては幾分心許ない。

そこで、メタモルフィックテスティングを利用することでテストに幅を持たせることをかんがえる。

メタモルフィック性(関係性Rel)の例

この例では三角関数の数学的な性質から関係性を求めることができる。例えば、下記の性質が利用できる。

f:id:okehara_aoi:20210602182802p:plain:w200

この性質から変換Tと関係性Relを求めると下記のようになる。

f:id:okehara_aoi:20210602182830p:plain:w300

実際にテストをしてみる

得られた変換Tと関係性Relを利用してテストを実施する。
変換前の初期値としてx_0 = 7π/13と利用すると、変換後のフォローアップ・テスト入力x_1は20π/13になる。こうして得られた入力から関係性Relでえられる正解値は0となる。同様にしてプログラムに入力し得られる値を求め、この値が0にならなければプログラムに欠陥があると判断することができる。

フォローアップ・テスト入力生成について

  • メタモルフィック関係は無数にあるが、適当なものを1つ利用してもいいし、複数利用してもいい。網羅性の基準をもとに判断すればよい

  • メタモルフィック関係から得られた変換関数Tを多重適用するなどして、様々なテスト入力を系統的に自動生成できる。具体的には4.3節で説明する

    どんなところで利用されるか

    入力に対する計算結果の正解値を予め知るのが難しいプログラムに対して適用される

  • 数値計算

  • コンパイラ
  • トランスレータ
  • セキュリティシステム
  • 機械学習ソフトウェア etc

2. 統計的なテスティング

概要

同一の入力データに対して同じ計算結果を得ることができないような確率的振る舞いをするプログラムも、入力と出力を1:1で対応づけることができないため、テストが難しい。
こういったプログラムには下記のようなものがある。

  • サイコロの出目を決めるプログラム (本質的に挙動が確定しないもの)
  • 都市交通の道路混雑状況シミュレータ(時間経過とともに確率変数が変化するもの)
  • 自然界データの解析プログラム  (データ取得の不確かさによるもの) etc

こういったプログラムでは統計的なオラクルを用いることでテストをすることができる。

この方法はプログラムの出力結果を測定値と考えて、データ分析をすることと捉えられる。検査に利用できる統計指標をもとめ、その統計指標が期待通りであるかを検定で確認することでプログラムのテストを実現している。

たとえば、実行結果の集まりが正規分布に従うと仮定でき、期待できる平均値がわかっている場合、t検定を用いて統計的なテスティングを実現できる。

仮説検定

釈迦に説法だとおもうので割愛

ソフトウェアテスティングと仮説検定

統計的なオラクルはソフトウェアテスティングの標準的な教科書の内容を超える新しいテーマらしい。

ただ、基本とする仮説検定にはショフトウェアテスティングと共通する考え方が見られる 仮説検定による議論では、正解に一致して帰無仮説が棄却できなかったとしても欠陥がないと断言しない。この点についてソフトウェア・テスティングも同様で、テストが全て通ったからと言って欠陥がないとはいいきない。

こういった考え方の類似性から、ソフトウェアテスティングに仮説検定を応用するのは自然な流れ。(たぶん、これから流行っていく、と言いたいんだと思う)

所感

機械学習システムまわりで、この辺りをできている人たちはどれくらいいるんだろうか?信頼性の高いシステムを作る上で、この辺りをやっていくのは重要だが、手軽にできる様にならないとなかなか進まない気がする。変換関数を見つけて、データ増やしてくれたりする簡単にできるライブラリとかあるんだろうか?

参考

機械学習システムのためのメタモルフィックテスティング入門 - Qiita

AIプロダクト品質保証ガイドライン2019まとめ - 02 - Qiita

Metamorphic Testing of Machine-Learning Based Systems | by Teemu Kanstrén | Towards Data Science