パンツシルエットをAIは判別できるのか?(2)|学習率と精度の関係性を調べてみた
こんにちは。株式会社ヒューマノームでインターンをしている井上と申します。
筆者は冬が終わって春がきたと思ったら、あっという間に夏のような気温でもうてんてこまいになっております…。相変わらず、気候の変化に合わせた服選びはとても大変です。
ということで今回は、前回書いたパンツスタイルのシルエットはAIで判別できるのかという記事の第2回になります!
シルエットを判別するAIは当社が開発しているノーコード物体検知AI構築ツール「Humanome Eyes (以下Eyes)」を用いて作成していきます。
Eyesは、無料で大部分の機能が利用できます。まだ使ったことないよ?という方はぜひお試しください!
前回の記事ではなんとなく「学習率下げたら、検出の精度上がるんじゃない!?」というノリでAIをつくっていました。今回はこの「なんとなく」を、実際に学習率を変更してみることで、「根拠あるもの(明確に数値として見える形で結果を比較する)」にしていこうと思います。
1. そもそも学習率とは?
学習率とは、「機械学習の最適化において、どのくらい値を動かすか、というパラメーター」のことらしいです。
この説明文では、イメージが全然沸かない…(´・ω・) 学習率を大きくするとか小さくするとかどういうこと?って筆者はなってしまいました…
そこで今回は機械学習を山登りに例えてみようと思います⛰️
時間内に、ものすごく頂上が尖っている山を登るゲームをイメージします。山頂を目指して登るキャラクターは、歩幅の設定ができ、山頂を目指して歩いていきます。
このゲームを想定した場合、各項目は以下のように考えることができます。
ちょうど山の頂上に到達する=AIの精度が一番良くなる
キャラクターの歩幅=学習率
では、キャラクターの歩幅を変更して、どうすれば効率よく山頂に達する(精度が一番よくなるAIを作る)ことができるでしょうか?
キャラクターの歩幅を極端に大きくした場合
では、キャラクターの歩幅を極端に大きく設定して、山を登ってもらいましょう。
するとどうでしょう。画像のように、すぐに山頂を越えてしまいました!
これは、一番精度の良いAIとなる点を飛び越えてしまい、最適な学習結果が得られないことを表しています。
それでは次に、歩幅を極端に小さくしてみましょう。
歩幅を極端に小さくした場合
山の大きさに対して、一歩がとても小さいですね!正確に頂点に達することはできそうですが、あまりに非効率と言えるでしょう。
これを元に歩幅(学習率)を大きくした場合、小さくした場合それぞれのメリット、デメリットを挙げてみようと思います。
歩幅(学習率)を大きくした場合
メリット😆・・・学習が速く進むため、効率的に精度を上げられる
デメリット😢・・・正確な頂点への調整が困難
歩幅(学習率)を小さくした場合
メリット😆・・・正確な頂点への調整がしやすい
デメリット😢・・・時間がかかる
なんとなく、学習率とはどんなもの?についてお伝えできたでしょうか。
2. いざ実践
それでは実際に、前回の設定から学習率を変更していきます。
前回の記事では、学習回数が900回の時に最もAIの精度がよくなりました。
このため、今回の記事では学習回数は900回と固定し、学習率のみを変更し、結果を見ていこうと思います。
学習率0.0001 の場合(デフォルト)
まず、Eyesでのデフォルト値(何も変更をしない場合に設定される値)である学習率0.0001で学習を実行してみます。
学習結果は以下の画像のような結果になりました。
Total Loss, Precision, Recall が何をさしているかは、以下の記事で詳しく紹介されていますが、本記事でも軽く説明します。
Total Lossは、予測されたものと正解のズレを指します。つまり0に近づくほど良い値となります!
PrecisionとRecallは、どちらもAIの正答率を表します。つまり1に近いほど精度が良く、0に近いほど精度が悪いと言えます。
上のグラフを確認すると、Total Lossは0.75まで徐々に下がっていきましたが、Precisionは0.1程度のため、0に近く精度がよくないということがわかります。
このAIを利用して、それぞれのパンツのシルエット判定を行いました。結果は以下の図の通りです。
テーパードとショートとワイドではそれぞれ、正しく70%以上の数値が出ていますが、ひとつの被写体に対し枠が2つ出ていたり、検出されなかったりと精度がいいとは言えません。
学習率0.001 の場合(デフォルトの10倍)
それでは、学習率を先程の10倍・0.001に設定して、もう一度AIを学習してみます。
結果は…
Eyesでのデフォルト値である学習率(0.0001)を利用した時と比べ、Total Lossの値は上がってしまいましたが、PrecisionとRecallの値は改善がみられました。
では、このAIを使ってパンツのシルエット判定を実施してみます。
正しく判定されたものはスキニーのみ、フレアに関してはテーパードと誤認している枠が5つも出てしまいました…
精度をあげるのって難しい…😒
学習率0.01 の場合(デフォルトの100倍)
それでは、学習率を100倍の0.01にしてみましょう。
結果は…
Total Lossの値は、他のすでに作成したAIよりも悪くなってしまいましたが、PrecisionとRecallの精度は1に近づきました。
AIによるシルエット判定結果についても確認してみます。
PrecisionとRecallがよくなっていても、実際にシルエット判定をしてみた結果は、よくなったとは言えない結果でした…😞
スキニーとワイドでは正しく判定されていますが、その他は異なる判定が出てしまっていたり、2枠で判定されてしまっています。
学習率0.00001 の場合(デフォルトの1/10)
ここまでは学習率をどんどん上げていきましたが、逆に、学習率を下げ、デフォルト値(0.0001)の1/10・0.00001 で試してみます。
結果のグラフは以下の通りです。
なんと、PrecisionとRecallに関してはグラフすら表示されませんでした。低すぎたのでしょうか...。
念の為、シルエット判定も実施してみます。
なるほど…今回の結果からは、学習率に小さすぎる値を入れてしまうと、精度が出ず、何も検出されないAIができてしまうことがわかりました。
山登りで考えてみると、まだ山頂には達していない、つまり、精度が一番良い状態には達していないと考えられます。
学習率と予測精度に関する考察
ここまで実験してきた学習率とPrecision/Recallの予測精度の変化を下記のグラフに示しました。今回のデータを使ったAIの場合は、学習率をかなり高くしても、より高い精度が出ることがわかりました。
ただし、学習率を上げると精度が出るといってしまって良いかは、シルエット判定の結果をみる限り、首を傾げてしまいます。シルエット判定でうまくいっていない状況をみると、そもそも学習画像枚数が少ないため、過学習を起こしている可能性は十分あるのでは?、と考えています。
3.あとがき
今回は、同じ学習画像を使って、学習率を変化させた時のAIの予測精度の変化について検証してみました。学習率をかなり上げても、精度が比例的に高まっていったことにはびっくりしました😳
とはいえ、シルエット判定の精度を高くするには学習率をあげるだけでは、足りなかったようです… それじゃあ、次は何を変えようかなぁと悩みながらこのあとがきを書いています。
私はシルエットの判定ができるようにしてみせる💪
データ解析・AI構築の初学者向け自習テキスト
表データを利用したAI学習テキスト(Humanome CatData)
画像・動画を利用したAI学習テキスト(Humanome Eyes)
AI・DX・データサイエンスについてのご質問・共同研究等についてはお気軽にお問い合わせ下さい!