こんにちは! 私です。
今年のJaSST TokyoではAIの話があるわけですが、AIの話と言っても「AI"で"テストする」ことと「AI”を"テストする」ことの2つの事柄があるわけです。
JaSSTではその2つの事柄についてのセッションがあります。
AIでテスト
AIをテスト
AI全般
- 招待講演)「人工知能は何ができて何ができないのか」
- クロージングパネル)「人工知能の未来~その未来をどうテストし、どうテストに活用するのか~」
AI!
なんとも近未来な響き!
AIと聞くとなんでもできてしまいそうな気がします。
JaSST Tokyoではその辺のお話も聞けるかと思います。
さて、今日は私――昨年までAIのテストをしたりQA4AI(AIのための品質保証のためのコンソーシアム)に参加してたりする人ですが、AIでテスト、AIをテスト、について書いてみたいと思います。
そもそもAIって?
AIは、人工的に作られた人間のような知能、といったところです。
みんなAIと聞くと、例えばドラえもんといった人間と大差ないロボットを思い浮かべるかと思います。
なのでAI = 人と同じレベルで色々できる、みたいに思われることが多いです。
では今の技術レベルはそんな汎用レベルにあるかというと、そのレベルではありません。
現在は例えば将棋ができる、海外セレブの合成顔写真を作るといった特定機能に特化した形です。
海外セレブの合成写真を作れても、将棋は打てないのです。
ちなみに汎用性を持ったAIはAGI(汎用人工知能)と言います。
AIというからややこしい
AIと言ってしまうから「なんでも」感が出てしまう気がしています。
ただ講演のタイトルを付けるときはどうしてもキャッチーにするために「AI」はつけたくなる言葉でもあります(笑)
今よく言われるAIは、ほとんどがAIへのアプローチ手段として機械学習を用いたシステムを指しています。(AIへのアプローチとしては他に遺伝的アルゴリズムなどがある)
なので「AIでテスト」「AIをテスト」については、「機械学習が利用されたシステム(ツール)でテスト」「機械学習が利用されたシステムをテスト」といった言い換えができそうです。
機械学習って何?
機械学習はさらに以下3つのジャンルに別れます。
教師あり学習は、正解データをたくさん用意して学習させるタイプです。
よく数字の画像をいっぱい覚えさせて、1や2などのラベルに分類(クラス分類)させるやつです。
思い浮かぶ例としてはボタンの画像をいっぱい覚えさせて「これは戻るボタンだ」といったクラス分類をする機能です。
教師なし学習は、データを大量に突っ込んで、それっぽい共通点を見つけるような機械学習です。クラスタリング(データの中で集まりを見つける手段)に使われることが多いです。
思い浮かぶ例としてはバグ票のクラスタリングなんかがあります。
強化学習は、これはできたら報酬を与える、といった学習方法です。犬にお手を覚えさせるような学習です。
「手続き」の学習に向いています。
機械学習は基本的には「データから推論された出力を吐き出す」といった形です。
機械学習が利用されたツールでテスト
機械学習のシステムの出力は、入力された未知データから推論された出力であり精度は100%にはなりません。
(100%の数字が出ているなら元データを過学習してる可能性&同じデータを使用している可能性があります)
さて、話は変わり自動テストについて考えてみます。
リグレッションテストをCIで毎日回しているところは毎朝結果を確認しては
「オールグリーンで今日も安泰!」
とかやってると思います。
エラーが出ていたらデグレっていないか見に行って
「あーなんともないや。たまたまコケただけかぁ。タイミング問題か~」
とか
「うへー仕様変更入ってるやん自動テストのメンテせにゃ」
とやると思います。
機械学習が利用されたツールで自動テストを考えてみます。
仮にリグレッションテスト用のツールだったとします。
精度は100%にはなりませんので
「よくわかんないけどなんかコケてる」
というフレーキーな状況は増えそうです。
メンテの方は、今流行りの機械学習系の自動テストツールはオートヒーリング(自動修正機能)がありますので、コストはちょっとは減りそうです。
ただオートヒーリングもまだ…のが現状。
直らない場合は大変そうです。
今までの自動化だったら1行2行変更すればよかったのに、教師あり学習のツールだった場合は教師データが命なわけですから、教師データを再確認して"正しい"データに置き換えて再学習させてあげる必要性が出てきそうです。
"正しい"って何よ、という問題もありそうです(^-^;
こうなってくると利用には工夫が必要となりそうです。
工夫って?
自動テストがseleniumを使っていようが機械学習を使っていようがテストコードによるユニットテストだろうが、テスト実行の一手段にすぎないと私は考えます。
「それを使って何を確認することが最も効果効率が高いか」
です。
よって、テストの組み立てにより「適材適所」の使い方になると思います。
ユーザーフローを見られるような機械学習のテストツールがあったのならば、
「バリデーション系はユニットテスト、ここの絶対外せない導線はseleniumを使った自動テストで確認して、ここのユーザーフロー部分のテストは機械学習側の自動テストで確認、この機能の例外確認は手動確認しかないなー」
といった組み立てになるかもしれませんね。
他、昨年私が作った機械学習のテストツールは「テストクエリを自動生成」するツールでした。
AIをAIでテストする、というハイブリッドな試みですね(笑)
スマートスピーカーのテストをするときに基本的なクエリ以外に「いいそうなクエリ」を作ってテスト、問題点をあぶりだすために開発しました。(大量にクエリを投げてやって、ミスったところを見に行けばいいという案。ちなみに大量にクエリ投げたら怒られたのもいい思い出。この開発後、探索的テストできるようにするつもりだったけど、今は会社辞めちゃったのでやっていませんw)
https://www.slideshare.net/mineomatsuya/smart-speaker-qa/52
もしツール開発から入るのであれば、スクリプトテストの自動実行といったところ以外に目を向けて機械学習を活用できそうな場所を見つけるのもよいかもしれません。
機械学習を利用しているシステムのテスト
こちらのほうが、明日にでも我々に降りかかってきそうな話です。
今や機械学習を使ったシステムはあふれています。
「あなたにオススメ!」みたいなリコメンド機能が良い例です。
これをテストしようとしても「私にはコレがオススメ……でいいの?」となるかと思います。
ブラックボックステストは入力に対して何かしらのロジックを通って出力があります。
なので例えば、マイヤーズの三角形だったら辺の長さに3,3,3と入力するとロジックを通って「正三角形」と出力されます。
教師あり機械学習が用いられている場合は、まず大本の教師データの入力があって、それでモデルが作られて、そのモデルにユーザーからの入力があって、出力があります。
例えばマイヤーズの三角形が教師ありの機械学習がされているとして「3,3,3 = 二等辺三角形」みたいなことを覚えていると「3,3,3」とユーザーが入力しても「二等辺三角形」と出てきてしまいます。
三角形の場合はおかしいと気づけるけど……。
例えば映画をオススメする機械学習の機能があったとして
「ホラー,ゾンビ,シャーク = B級映画」みたいな機械学習が本当は正しいのに、
「ホラー,ゾンビ,シャーク = コメディ」みたいなゴミデータが混じって学習されちゃったとしましょう。
テスターはゾンビ映画をいれたらコメディをオススメされたりしますが「ゾンビってコメディ色も強いしなぁ…」となるわけです。
教師データを集めた人が「ゾンビが履歴にあるなら次もB級がリコメンドされるはずだよ」とわかればよいのですが……。
「これが入ったらこれが出る」とわかるようなシステムなら今まで通りのテストです。
けどユーザーデータを大量に集めたデータから推論された出力が正しいのか……というのはとても難しい問題です。
この場合「喰わせた教師データが意図に沿ったものか(ゴミデータが混じっていないか)」という観点が必要になるかと思います。
大本のデータ品質の確認です。
こうなってくると、今までテスト実行領域を専門としてやってきたテストチームは大変になってきそうです。
(ユーザーデータを見せてくれ、大本のデータの検証から入りたいんだけど……となってきそうです)
あと、大本のデータ確認となると「確かに正しいラベルがついている」みたいに全部の教師データ見るのか……というのも思うところです。
私が思い浮かんだことをベラベラと書いてみました。
JaSST Tokyoでは今私が書いたことよりも断然面白い話が聞けるかと思いますので、ご興味がある方は是非いらしてください!