「機械学習が使われたレコメンド機能」のテストのやり方
こんにちは! 作者です。
この記事はソフトウェアテスト Advent Calendar 2019の23日目です。
昨日の記事はにしさんのおねだり ~オープンソースのテスト観点図エディタを一緒につくりませんか?~ でした!
バトン、しかと受け取りました!
今回はAI…もとい機械学習が使われた機能のテストについて描いてみました。
(AIという言葉は作者あんまり好きじゃないんですが、最近は一般的だし、マンガのセリフ文字数のため使ってますw)
機械学習の基本的なお話は以下で書いたりしています。
また機械学習を使った教育用プログラムも配布していたりします。
テストをどうやれば良いか考える練習に使えるかもしれませんw
では、いつものようにマンガの内容の補助的な説明をしています~!
テスト不可能プログラム
テストは通常はテストオラクル(テスト結果を比較するための期待結果のソース)を用意して、それと比較することによって「これとあってるから大丈夫!」と確認を行います。
なのですが、具体的な正解を準備できないようなプログラムがあります。
これをテスト不可能プログラムといいます。
機械学習もこの一つだと言われています。
ちなみに。
機械学習は、「出てくる値がランダムでムズイ」みたいに言われる場合がありますが、そうじゃないです。間違いです。
入力する値が全く一緒で、学習済みの固定したモデルに通せば、同じ出力になります。
なんですがこの「全く同じ入力」が難しい。というか実運用だとほぼないものが多いです。
例えば物体認識とか。
録画したデータならできそうですが、普通はカメラでリアルタイムの入力があって、それが全く同じデータになることはほぼなかったりします。
で、入力がちょっと変わると出力も変わってきます。
「ちょっと変わったくらいでまたまた~」と思う人も多いかと思いますが、以下のようなパンダにちょっとノイズを加えただけでテナガザルになっちゃう例が有名だったりします。
出典:http://research.nii.ac.jp/~f-ishikawa/work/1712-JEITA_QA4ML.pdf
機械学習=テストできない?
上述のテスト不可能プログラムの認識で、「機械学習=テストできない!」と思ってる人もたまにいます。
結果「とりあえずなんか出ればそれでOK」なんていう思考停止状態になっている人も…!
これ、マンガに描いた通り「どんなデータを使ってる」とか「こういう傾向を出している」といった情報は得られたりします。
そこからテストした方が良いポイントなども出てくるでしょう。
出力の精度については、基本的には開発側で保証されています。
(精度を見ながらモデル作りなどがんばるので……)
なのですが見落としをしているデータもあるかもしれません。
その昔に作者が音声認識系のQAをやっていた時は、成人の声は集めていたけれど、子どもの声がなかったので認識ができない!なんていうことにも遭遇したことがあります。
あと、機械学習もひとつのモジュールにすぎません。他のシステムとつながって動きます。
こうなってくると普通のシステムのテストと同じです。
他のモジュールとつなげてインテグレーションテストでは大丈夫かとか、システムテストとして通してみたとき大丈夫かとか、イレギュラーな観点……例えば履歴が残らないシークレットブラウザで見たときはどうなるの?など普段のテスト観点が出てくるかと思います。
メタモルフィックテスティング
「入力を変えると出力はこう変わるはず」という関係を検証するテスト方法です。
実践例がJaSST'19 hokkaidoで講演されていましたね!
http://www.jasst.jp/symposium/jasst19hokkaido/pdf/S3-1-2.pdf
例えば、入力された数字を小さい順に並べるプログラムがあったとすれば…
{5,2,4,3,1} →プログラム→{1,2,3,4,5}
これの{2}を削ったとしましょう。
そうすると「1,3,4,5になりそうだなー」と予測がつくわけです。
んで、実際にやってみて確かにそうなることを確認できればOKです。
{5,4,3,1}→プログラム→{1,3,4,5}
こんな感じで、既存のテストケースから新しいテストケースを多数生成する手法です。
マンガで描いたように、ごく一部にしか適用できない法則ではなく、全体的に言えそうな関係でテストします。
この関係をメタモルフィック関係と言います。
ザックリ説明しましたが、大枠はこんなところ。
以下のサイトがわかりやすくより細かく書いています。
海外の最近の流れというか「いっぱいテストケースを用意してそれらをクリアできれば大丈夫っしょ!」みたいなところがある気がします(そう言ったら怒られそうだなぁ
ペルソナを使った確認
最終的に「ユーザーが求めているものが作れているか」といった確認をするときは、ペルソナを用意して確認するのも一案かと思います。
ペルソナについては、システムを使っているユーザーを分析してカテゴライズして像を出すとか、企画者などを含めみんなでペルソナを作るなど、オレオレペルソナにならないように作っていきましょう。
ペルソナについてはonlineTestConfでGerie Owenさんの講演がありましたね!
n段階評価
作者は文章生成の機械学習のテストをした時があります。
その出来上がった文章を見て……うん、Pass/Failの2択での結果はなかなか難しい。
「この文章、まったく文章になってない」
という完全アウトもあれば
「ほとんどあってるけど、イオンをジャスコって言っちゃってるところだけ間違ってる。おしいなぁ」
みたいなちょっとした間違いの場合もあります。
Pass/FailだとどちらもFail。
なのですが、間違いにも差はあったりするのですよね。
この差によって「これくらいの精度だったらリリースいける……!」みたいな判断もあったりするわけです。
そういったとき活躍するのが、よくアンケートで見たりするようなn段階評価。
生成系の機械学習の結果判定などに重宝しています。
AIプロダクト品質保証ガイドラインの66Pでこの話が記載されていたりします。
http://www.qa4ai.jp/QA4AI.Guideline.201905.pdf
(いやまぁ、書いたの作者だけどさ…)
再学習
何か問題があったときや、次のリリースなどで発生するのが再学習です。
再学習によって、狙っているところの精度が上がります。
その部分の精度を見ながらアレコレするのでそうなります。
なのですが!
再学習で狙ってるところがパワーアップして終わりかというとそんなことはないのです!!
再学習をしたことによって、精度が落ちてしまう部分も発生してくる場合があります。
これも影響範囲がわかっている普通のプログラムのデグレと違って、教師データをいっぱい用意したけどそのうちのどれかの質が悪くてそのせいで……みたいな、影響範囲がわからないデグレが発生したりします。
結果、デグレ箇所がわからないので全体リグレッションテストが発生したりします。
これらは自動化していないとツライ。かなりツライ。とてもツライ!!
絶対これは通ってなきゃダメ、みたいなスモークテストを用意しておくのも一つの手。
モデルの精度の指標
指標についてはモデルを作るときに開発側でガッツリ検証されているかと思いますので、あんまりテストエンジニアが別で見ることもないと思います。
(とはいえ「おや?」と思った場合は数字で伝えることができるのでよいかもしれません)
分類の指標として、Precision / Recall
ランキングの指標として、MRR / MAP
を紹介します。
Precision(適合率)
これは「これ好きでしょ?」とレコメンドしたアイテムのうち、実際にユーザーが好きだったものの割合です。
Precision = ユーザーが好きなアイテム / レコメンドしたアイテム
正解率みたいなものです。
Recall(再現率)
これは顔認証とかの方がわかりやすいかも。
写真に5人写っているけど「これ顔でしょ?」と予測できたのが3つだけ。
この場合以下になります。
Recall = 3 / 5
レコメンドで考えてみると
本当はユーザーは洋楽とアニメとクラシックが好きだからその3つをレコメンドしないといけないんだけど、アニメしかレコメンドしてなかった。
この場合。
Recall = 1 / 3
言葉にすると以下のような感じ。
Recall = ユーザーが好きなアイテム / ユーザーが好きなアイテム全体
網羅率って言いかえられそうです。
MRR(Mean Reciprocal Rank)
まずはRR。
これはユーザーが好きなアイテムが、ランキングの何番目に最初に出てくるかです。
なので最初に好きなアイテムが2位で出てきたら
RR = 1/ 2
になります。
MRRはRRの平均値です。
例えばジャンルそれぞれで見て洋楽が1/2、アニソンが1/4、クラシックが1/2だったとしたら、MRRはそれらの平均値になります。
MRR = (1/2 + 1/4 + 1/2) ÷ 3 = 5/12
MAP ( Mean Average Precision)
まずはAP。こんな感じ。
AP = (そこまでの正解数 / ランキング)÷ 正解数
マンガの例だと、2位と4位で正解しているので
2位の部分が、それまでの正解が2位の1つだけなので 1/2
4位の部分が、それまでの正解が2位と4位の2つなので 2/4
となります。
そしてこれの平均を取ればAPになります。
AP = (1/2 + 2/4) ÷ 2 = 1/2
MAPはAPの平均値です。
例えばジャンルそれぞれで見て洋楽が1/3、アニソンが1/2、クラシックが1/5だったとしたら、MAPはさらにそれらの平均を取ればよいです。
MAP = (1/3 + 1/2 + 1/5) ÷ 3 = 31/90
②のオススメ曲
どの曲をピックアップして書こうかなーと1時間くらい考えました(爆
Z推しみたいになっちゃったけど、サイレントヴォイスの方が好きかなぁ。
ピックアップしてない曲でも好きなものが多数。
哀戦士も好きなんですよねー
ポケ戦のOPも好きだし、ED聞くと泣きそうになるんですよねー
ターンAの月の繭も入れたかった!月の繭は英語版のMoonがヤバイ!!
逆シャアのTMNは有名どころすぎるのであえて抜いた感じです。
……古いガンダムしか知らないのです……。
どうでもいいですが、曲を考えていた時にファがひたすら走る動画を見ていました。
キュアレモネード
ごめんなさい!
実は見たことないのにネタにしました!
ごめんなさい!!
明日12/24、クリスマスイブはぞのさんにバトンタッチ!
お楽しみに!