Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【ML Tech RPT. 】第10回 機械学習のモデルの評価方法 (Evaluation Metrics) を学ぶ (1)

f:id:ssatsuki040508:20181210005017p:plain
DSOC研究員の吉村です. 先日, 会社の同僚らと御岳山に登山へ行きました. 私は普段から登山に行く趣味があるわけではないので, 不安を抱えつつ山に向かったのですが, 案外何事もなく無事に帰ってこれました. (山への移動の電車の中で, 話し込みすぎて降りる駅とは別の駅まで来てしまうというプチアクシデントはありました.)

さて, 今回からは「機械学習のモデルの評価方法を学ぶ」というタイトルで記事を書いていこうかと思います. 以後, 本記事ではモデルという言葉を機械学習のモデルという意味で用います. 今回このテーマについて記述しようと思ったのは, 実際に業務で機械学習に基づく処理を本サービスに載せるかどうかの判断をする際に、どのような評価方法による評価が適切な判断材料になるのかについて毎回悩むためです. そこで, 今回からの数回は特に各種問題設定で用いられる評価指標について, それらを用いることでどのような判断ができるのか考察していこうと思います. なお, 今回からの記事では暗黙の上で「教師あり学習」を仮定しています. ただ, 一部「教師なし学習」の評価についても書く予定ですので, その場合は教師なし学習についてである旨を明記します.

モデルの性能の良さ

まずはじめに考えたいのは, モデルの性能の良さにはどのような観点が挙げられるかということについてです. モデルの性能の良さと一言で言っても, そこには様々な観点があると考えられます. モデルの性能という言葉に包含される観点としては, 下記のようなものがあると考えられます. 下記に示したものは, それぞれが完全に独立した事象ではなく, 相互に影響し合うものであることには注意が必要です.

精度の良さ

機械学習のモデルを評価するときに一番興味があるのは精度の良さについてだと思います. この "精度" という単語は, 機械学習のモデルの性能評価を行う上ではかなり危険な言葉だと私は思っています. それは, "精度" と単に発した場合に聞き手のバックグラウンドやその時々によって, 想起されるものが多種多様である可能性があるためです. 例えば私の場合だと, 単に "精度" と言われるとほとんどの場合で Accuracy のことを言っているのかなと思います. しかし必ずしも, "精度" という言葉が Accuracy を表すとは限りません. Precision や AUC の意味で用いられることも多々あります. そのため, この精度の良さを論じる際には, 齟齬が発生しないように気をつける必要があります. つまり, その時々で発せられる "精度" という言葉が, どのような状況を評価しているのかを明確に示してあげる必要があります. この記事の中では, 精度と言う言葉を「モデルの出力の良さの度合い」と言う広い意味で用いることとします. それが具体的にどのような観点からの良さなのかについては, 触れる必要があるときに詳述します.

モデルの頑健性

モデルの性能評価においては, 頑健性能も一つの重要な観点です. 頑健性と一言で言っても, それが何に対する頑健性かということを考えると細かい観点はたくさんあります. 例えば, ハイパーパラメータの変化に対してどの程度出力結果が変わるか, 外れ値のような入力に対してどのような挙動をするか, 敵対的な攻撃があったときにどの程度なら耐えられるか, データの欠損が発生した場合にも大きく出力が変わらないか, などの観点が考えられます. これらも要件に合わせて評価していく必要があります.

処理速度

機械学習のモデルを実際に何らかのサービスの運用に乗せようとする場合, 処理速度も重視されると思います. この処理速度については更に細かく, 二つの観点を考える必要があります. 一つが学習時の処理速度, もう一つが予測/推論時の処理速度です.

学習時の処理速度は, 更新頻度を決定する際に必要な観点です. また, 予測/推論時の処理速度は, どの程度の速度までなら新たな入力が来ても処理できるかを知る上で重要な観点です. 処理速度を測定する上では, その処理が何に依存しているのかを見極める必要もあります.

メモリ使用量

大規模なモデルを構築するときにはメモリの使用量も評価する必要があります. このとき, 必要なメモリが何にどのように依存するかは注視した方がいいかもしれません. なぜなら, 例えば, 定期的に学習をやり直すような運用をしている場合, 学習に用いるデータの数は増えていくはずです. そのとき, もし仮にデータ数に対して指数的にメモリが必要になるようなモデルの場合には, 予期せず学習が行われなくなることが考えられるためです. メモリ使用量は多くの場合処理速度とのトレードオフになるので, どちらをどう許容できるのかについても評価の余地がありそうです.

モデルサイズ

深層学習などの非常にパラメータが多いモデルの場合には, そのモデル自体のサイズも問題になる場合があります. 例えば, 組み込み系のサービスにモデルを載せる場合には, そのサイズを抑えることで必要な計算資源を削減できることがあるためです.

モデルの性能評価における注意点

モデルの性能評価をする場合には, 注意する点がたくさんあります. まず, 複数のモデルを比較する場合には, できるだけモデル以外の条件を同じにすることが非常に重要です. よくない評価の例として, 例えば, 評価するときにモデルごとに用いるテストデータが異なるということが挙げられます. これはうっかりするとやってしまいがちな誤りですが, この場合に得られた結果からは何の情報も得られません. (もちろん, テストデータが常に同じ分布から生成されていれば, ある程度は参考になるかもしれませんが, それでもやはり評価方法としては不適切です.) また, Leakage にも注意する必要があります. 他にも, パラメータチューニングをするときにはテストデータとは別で作成した検証用データを用いて決定することなども重要です.

速度面の比較の際には, 処理環境の状況によっても結果が変わるので, 厳密にやるのであれば複数回実施して出来るだけ誤差をならす必要もあります. その際には, マシンスペックについても併記しておくとより厳密さが増します. また, 何に影響して計算時間が変わるのかを明らかにするときには, 計算量 (Computational Complexity) を算出するという手もあります. 計算量は計算時間の概算 (厳密には違いますが) と捉えて, 計算時間の評価にどの程度の時間がかかるかの参考にするとよいと思います.

もう一つの重要なことは, 特定の評価手法を用いた場合にその結果をどのように解釈するかです. 前置きがかなり長くなりましたが, 今回からの記事はこの話がメインとなります. しかし, 記事が長くなりすぎるので今回はここまでとします.

まとめ

今回からは「機械学習のモデルの評価方法を学ぶ」というテーマでブログ記事を書いていくことにしました. そこで, まず, モデルの性能の良さとは何かについて私の考えを書きました. 様々列挙しましたが, ここで重要なことは, そのモデルに期待していることを漏れなく測定することで, 全てを評価する必要はないと思われます. モデルの性能評価をする際に気をつけることについても, いくつか述べました. 今回の記事はその多くが, 私の考えに基づいているため, 何か他にも注意するべき観点や視点が抜けているかもしれませんので, お気をつけください. さて, 本シリーズの本題は, 「特定の評価手法を用いた場合にその結果をどのように解釈するか」です. 次回からはこの本題に入っていきます. 次回扱うのは, 二値分類・マルチクラス分類・回帰問題を扱う際の各種評価手法についてです. 次回以降もお付き合いくださいませ.

© Sansan, Inc.