💬

A.訓練データ、検証データ、テストデータと過学習

に公開

この記事では、データを訓練データ、検証データ、テストデータの三つに分ける必要性を解説します。

機械学習の目的を振り返って

機械学習の目的は、与えられたデータを学習してそこに一般法則を見出し、未知のデータを予測できるようになることです。決して、学習に使うために用意されたデータに対してのみ正しく判定ができるアルゴリズムを作りたい訳ではありません。

学習に使うように集められたデータは飽くまで未知のデータを予測するときに参考にするデータに過ぎません。ですので、学習のために使用するデータを学習しすぎて、未知のデータに対しての性能が低下する事態は避けなければなりません。

学習に使用したデータにとどまらない汎化性能をもつことを保障するのにはどうすればいいでしょうか?

データの分割の概要

学習のために与えられたデータを 訓練データ検証データテストデータ に分けるのがその答えです。訓練データ とは、実際に学習に用いるデータのことです。また、 検証データ は訓練データで学習されたモデルの性能の判定やハイパーパラメータのチューニングに使います。 テストデータ は、訓練データで学習したデータの汎化性能を実証するために、モデルの性能評価のためだけに使われます。検証データはニューラルネットワークの学習の必須事項ではないので、参考書や記事によっては省かれていることもあります。

下の図はデータの分割のイメージ図になります。

例えるなら...

理論的な説明だけではイメージがわきにくいので、たとえを使って考えてみます。

データの分割は受験勉強に例えることができます。訓練データは普段の勉強、検証データは模擬試験、テストデータは本番試験に対応します。ただただ漫然と勉強をしているだけでは、学習がしっかりできているかどうかを判定することが難しいため、現在の実力を判定したり、普段の勉強の方針が正しいかどうかを知るために模擬試験を定期的に受けることでメンテンナンスをしないと、間違った方向に進んでしまっていてもそれに気付く術がなくなってしまいます。本番の試験に向けて効率的に勉強を進めるための鍵は、普段からの勉強と模擬試験を受けることをうまく両立することです。

それぞれのデータを使用する段階

上の受験勉強の例を使って考えると、それぞれのデータがどのタイミングで使用されるかについても理解しやすくなります。普段の勉強をしているだけでは、客観的に自分の勉強方法などを改善することは難しいので、模擬試験は定期的に受けるべきでしょう。また、本番の試験をするのは勉強や模擬試験が全て終わったときの一回きりです。

これを機械学習の言葉に書き直すと、検証データによる検証は訓練データの学習をしているときに適宜実行されるもので、テストデータによる検証は訓練データと検証データの検証が全て終わった後に一度だけ実行するものです。

それぞれのデータのまとめと注意事項

訓練データ、検証データ、テストデータの関係を下の表にまとめました。

データの種類 受験勉強のたとえ 役割 データを使用する段階
訓練データ 普段の勉強 重みやバイアスのパラメータを学習する 通常の学習時
検証データ 模擬試験 ハイパーパラメータの値を調整する 訓練データの学習の間に適宜
テストデータ 本番試験 学習済みのモデルの精度をテストする 訓練データ、検証データによるパラメータ調整が終わった後

過学習とそれぞれのデータの正解率の変動

訓練データ、検証データ、テストデータの値が過学習が発生の有無に応じてどう変化するかをまとめます。ここでは、検証データの検証は訓練データの学習が進められている最中に一定間隔で行われるものとします。

過学習が起きていないとき

過学習が起きていないときには、それぞれのデータの正解率は次のように変化します。

  • 訓練データ → だんだんと上がる
  • 検証データ → 訓練データと同じようなペースで上がる
  • テストデータ → 検証データと同じような程よい値

過学習が起きていないということは、訓練データで学習したことのが他のデータに対しても使えるということなので、上の全てのデータの正解率の足並みが揃っています。

過学習が起きているとき

一方、過学習が起きているときには、それぞれのデータの正解率は次のように変わります。

  • 訓練データ → だんだんと上がる、訓練データの学習が急激に進んでしまうことも
  • 検証データ → あるときまでは上昇しているが、途中から下降する
  • テストデータ → 検証データと同じく、あまり正解率が高くない値

まとめ

このように、検証データおよびテストデータの結果を見ることで過学習の発生の有無を判定することができるのです。検証データの正解率と訓練データの正解率の乖離が大きい場合、途中で学習をストップすることもあります。過学習が起きていないことを学習途中の段階で判定することは、検証データの重要な役割の1つです。

最後に

この記事では、与えられたデータを訓練データ、検証データ、テストデータに分割することの必要性と、これをすることで過学習が起きていることを検知できることについて解説しました。

この記事は下の図のように体系化された記事の1つとして執筆されています。

対応するそれぞれの記事には下のトグルを開いて見たい記事をクリックすることで飛ぶことができます。

記事一覧

ニューラルネットワークの学習の全体像
https://zenn.dev/logeeeeee/articles/a3119f68fa261c

A.訓練データとテストデータ、過学習
https://zenn.dev/logeeeeee/articles/78d1a686f4397d

B.ミニバッチ学習
https://zenn.dev/logeeeeee/articles/ca5c607197d183

C.誤差逆伝播法
https://zenn.dev/logeeeeee/articles/a5aa7a7a0b6c5f

D.損失関数と勾配降下法
https://zenn.dev/logeeeeee/articles/b972b5bb03c173

E.勾配消失問題
https://zenn.dev/logeeeeee/articles/6d8784473faaf2

F.パラメータの更新
https://zenn.dev/logeeeeee/articles/e89c1cc09008ed

G.学習アルゴリズムの工夫
https://zenn.dev/logeeeeee/articles/b7a4798fac2a2b

次の記事では、訓練データをさらに分割してパラメータの更新を行うことについて説明しています。
この記事には、下のブックマークをクリックすることで飛ぶことができます。

https://zenn.dev/logeeeeee/articles/ca5c607197d183

最後までご覧いただきありがとうございました!

Discussion