質問: 現在、CNNのモデル3層レイヤ程度の小規模なもの(しかし各層でもつフィルタ数は多い)に対し、データ数(500枚程度)で学習させた結果認識率が100%(エラー0%)という結果になりました。データ数や、それに対するネットワークの複雑性から過学習が引き起こされました。これについて調べ、検証データを使用し学習と検証の曲線を調べればわかるということでした。 質問は、 ・検証データとはハイパーパラメータが正しいか確認するものであり、それはどのようにして行われるのか。 ・検証と学習データの曲線の離れ具合をみたとき、これは本来一致するべき(どのデータでやっても汎化性能は変わらないとかんがえられるから。)であるという認識でよろしかったのでしょうか。 わからないことが多く、また非常に拙い文章で申し訳ないのですが、ご回答いただけと大変感謝します。
回答: 検証データは基本的にハイパーパラメータが正しいか確認するためのものではありません。どのハイパーパラメータの値が最も良いかを探索するために用いられます。すなわち、複数のハイパーパラメータでモデルをそれぞれ学習させ認識精度を比較することで、最も適合するハイパーパラメータを探索するためのデータとして用いられます。 学習による認識モデルは学習を繰り返すと学習データに対して認識精度が100%になるものの、学習データに含まれていない未知のデータに対しては認識精度が学習の途中のモデルよりもむしろ悪くなってしまうという現象が起こります。これを過学習といいます。特にCNNを含むNNのモデルは表現能力が高く、学習データに対して容易に過学習を起こしてしまいます。 このため、認識モデルの学習は過学習が始まる前に打ち切るのが基本となります。 実際は学習のイテレーションを回しながら随時モデルを保存しておき、十分と思われる回数学習させた後に、検証データに対する認識精度が最大となるモデルを保存したモデルの中から抜き出して最終的な学習済みモデルとすることが一般的です。 そして最終的な認識精度の算出は、学習データでも検証データでもなく、テストデータに対して認識を行った結果から行います。 テストデータではなく、検証データに対して認識精度が最大になるモデルを抜き出すのは、抜き出すモデルがテストデータに対して過学習することを防ぐためです。 学習のイテレーションの途中で保存したモデルの中から特定のデータに対して認識精度が高いようなモデルを抜き出すことは、そのデータに対する学習の一種と考えることができます。この学習時にテストデータを用いることは学習データとテストデータを分離できていないということになり、好ましくありません(大前提として、学習用のデータとテスト用のデータは完全に分離することが必須です。こうしておかなければ、テストデータに対して過学習したモデルが最も認識精度の高いモデルということになってしまい、テストデータに対する正しい認識精度を計算することができなくなります)。かと言って学習データで打ち切りのタイミングを見計らうことはできません(学習データに対して過学習したモデルが最も認識精度の高いモデルということになってしまいます)。そこで学習データともテストデータとも異なる検証データを用意するわけです。 ハイパーパラメータの探索にも同じことが言えます(ハイパーパラメータの探索は学習の一種と考えることができる)。どのハイパーパラメータが良いパラメータなのかを判別するためにテストデータではなく検証データを用いるというわけです。 学習データに対する認識精度の曲線と検証データに対する認識精度の曲線は基本的に一致しないと考えたほうが良いと思います。これは学習データにのみたまたま偏って現れた特徴をモデルが学習する場合がありえるためです。