こんにちは、作者です!
先日、「Open QA4AI Conference」というAIプロダクトの品質保証についてのカンファレンスが開かれました。
ここで「AIプロダクト品質保証ガイドライン」が公開されました。
以下からダウンロードができますのでご興味ある方は是非ご一読ください。
作者も5章部分の執筆を担当しています。
ガイドラインでは、「こういった軸で考えればいいよ!」ということが提示されました。
けど「どうテストすればいい」という事が言われたわけではありません。
「機械学習を含んだマイヤーズの三角形問題」を作ってみた
機械学習を含んだプロダクトのテストは難しい……
と言われても、関わっていない人はいまいちピンとこないかと思います。
なので、「どうテストしよう」の検討材料……ちょっとした機械学習を含むプログラムのテストの練習……遊び道具……のために「機械学習を含んだマイヤーズの三角形問題」を作ってみました。
教育素材といったところですw
どなた様もご自由に使って大丈夫です。
以下からダウンロードができます。
特にセットアップしなくても「ML_myers.exe」を実行すると動くようになっています。(実行ファイルがまさかの500MB超えなので、実行が遅いです。。。)
マイヤーズの三角形は何かというと……
このプログラムは入力ダイアログから3つの整数を読む。
この3つの値は、それぞれ三角形の3辺の長さをあらわすものとする。
プログラムは、三角形が不等辺三角形、二等辺三角形、正三角形のうちどれであるかを示すメッセージを表示する。
こんな感じです。
今回は特にUIは用意していないので、実行するとこんな画面になります。
黒い画面で辺の長さを一つずつ打ち込んでいく感じです。
あ、今英語の勉強中なので英語で作っています!(爆
試してみるとこんな感じになります。
正三角形だと「equilateral triangle」
二等辺三角形だと「isosceles triangle」
不等辺三角形(全部の辺が違う長さ)だと「scalene triangle」
三角形が成立しない(一辺の長さが二辺の合計より長い)だと「It's not a triangle」
と表示されます。
機械学習による分類の問題点
さて、このプログラムは機械学習を使って三角形を分類するものですが、どうテストをすればよいでしょうか?
普通にテストを……
普通に……
これがまた難しい。
例えば。
「1000, 7, 1000」の値を確認したら「isosceles triangle」と出ました。
なるほど。
ならば
「1000,6,1000」も7が6に変わっただけなのだから当然「isosceles triangle」と出るはずです。
そう、確かに今までの「ルールベース」で書かれたプログラムでしたらその通りなんです。
では機械学習の場合はどうでしょうか?
なんと「1000,7,1000」は「isosceles triangle」で判断されたのに、7を6にしただけで「It's not a triangle」になってしまいました!
どうしてこうなるかというと。
今まではルールをプログラムに書いてしまえばそれに沿って動いていました。
例えばaとbとcが同じなら正三角形にしましょう、といった感じです。
なので、どれか一つのルールを確認できれば、同じルールが適用される他のものについては確認しなくても同様の動きをするだろう、と想定できたわけです。
機械学習による分類では「教師データ(この場合はこうなるよ、ということが書かれたデータ)」をたくさん覚えることによって、それっぽいルールを作って分類します。
教師データを一つ一つ独立したルールとして勉強しているため、人からすると例えば1,2,3は連続なのですが、機械学習としてはそれぞれ特に繋がっていない形で学習されます。
連続ではないということは、例えば教師データが間違っていたりして1,2,3の2の時はおかしくなってしまったりがあり、よく使う同値分割の考え方が使えなくなります。
では、こういうプログラムがあったときどうテストをすればよいのでしょう。
いくつか値をピックアップして正三角形、二等辺三角形、不等辺三角形、成立しない、を見てOK……。
もちろんそういう考え方もあるし、いやいやモデル精度が〇%以上でOKとするもあるし、ロジック部分は今までのテストで確認して機械学習部分はモデルの精度で確認するというハイブリッドプラン……もあるかもしれません。
先方からexeファイルだけわたってきてモデルの確認ができない……システムテストしかできないけどどうする!?なんてシチュエーションもあるかもしれません。
内容
参考資料として、どんな内容となっているか記載しておきます。
・教師データは1万件(teacher_data.csv)
・データの行は、最初の3つがそれぞれ辺a, b, cの長さ、4個目が正解データ
・1は正三角形
・2は二等辺三角形
・3は不等辺三角形
・0は三角形が成立しない
・データの重複チェックはしていない
・判別はロジック部分と機械学習部分に別れる
・三角形の判別のみ機械学習
・入力チェック(マイナスとか日本語だとか小数だとかを弾く)はロジック
・4層のニューラルネットワーク
・入力は3つのノード
・学習の時は数字をそのまま使わず正規化
(長い辺を1として、他の辺は割合。例えば10,5,5なら1,0.5,0.5で学習)
・出力は4つのノード
・1は正三角形
・2は二等辺三角形
・3は不等辺三角形
・0は三角形が成立しない
・中間層は2層
・ノードはどちらも64
・学習済みモデル(test.hdf5)の精度は83%ほど
github
githubもおいておきます。
chainerを使っていますのでインストールが必要です。