n=e.querySelector(".line-numbers-rows"),r=parseInt(e.getAttribute("data-start"),10)||1,s=r+(n.children.length-1);tAIお助けボックスAIで楽しいこと、便利なことを何でもするサイト。最後に初めにイムちゃんディープラーニングのお悩みに回答するねこの記事では、ディープラーニングで訓練データの正解率(Actually)は高いのに、テストデータの正解率(Actually)が極めて低いという悩みに焦点を当て、その原因と対策を解説します。筆者が実際に経験した事例も交えながら、わかりやすく説明していきます。訓練データとテストデータの正解率とは?ディープラーニングでは、モデルの性能を評価するために、訓練データとテストデータの2種類のデータセットを使用します。モデルの学習に使用されるデータセットです。モデルの学習には使用されず、学習済みのモデルの性能を評価するために使用されるデータセットです。訓練データの正解率は、モデルが学習に使用したデータに対する正解率です。テストデータの正解率は、モデルが学習に使用していないデータに対する正解率です。例えるなら、訓練データは模擬試験、テストデータは本試験です。モデルは、訓練データを使って何度も学習し、模擬試験で良い点を取れるように訓練されます。学習済みのモデルは、テストデータを使って、実際にどの程度の知識を習得しているのか、つまり本試験でどの程度の点数が取れるのかが評価されます。テストデータの正解率が低いのは問題なのか?ディープラーニングモデルの目的は、未知のデータに対しても高い精度で予測することです。訓練データの正解率が高くても、テストデータの正解率が低いということは、モデルが訓練データに特化してしまい、汎化性能が低いことを意味します。例えるなら、訓練データは模擬試験、テストデータは本試験です。模擬試験で良い点を取れても、本試験で良い点が取れなければ意味がありません。テストデータの正解率が低いディープラーニングのモデルは、あまり実用性の無いモデルになります。訓練データの正解率が高いのにテストデータの正解率が低い場合、その原因は大きく3つに分類できます。データに隔たりがある訓練データとテストデータの間にデータの偏りがあると、モデルは訓練データの偏った特徴に特化して学習してしまい、テストデータに対してはうまく予測できなくなってしまいます。犬と猫の分類において、訓練データの犬と猫の比率が9対1であった場合、常に犬と答えれば正解率は90%になりますので、ディープラーニングのモデルが常に犬と答えるように学習することがあります。この場合、テストデータの犬と猫の比率が1対1であれば、正解率は50%にしかなりません。汎化出来ていないモデルが訓練データに特化しすぎてしまい、訓練データ以外のデータに対してはうまく対応できない状態を「汎化できていない」といいます。これは、過学習と呼ばれる現象によって起こります。模擬試験をひたすら勉強し模擬試験は満点を取れたけど、応用が出来なくて本試験の点数が良くなかった。既出のデータに対する結果は丸暗記したけど、応用力(汎化)が出来てなくて、新しいデータに正しく答えられないのが過学習です。この場合もテストデータに対する正解率は低くなります。入力と出力に因果関係が無い入力データと出力データ間に本来の因果関係がない場合、訓練データの正解率は高くなる可能性がありますが、テストデータでは意味のない結果になる可能性があります。じゃんけんの過去の結果(グー、チョキ、パー)を学習し、次の手を予測するモデルを考えます。訓練データに「グーが3回続いたら次はパーが出る」というパターンが含まれていると、モデルはこのパターンを学習し、訓練データの正解率は高くなります。実際にはじゃんけんの結果に過去の結果との因果関係はなく、次の手はランダムに決まります。そのため、テストデータでは正解率は低くなるでしょう。dall-e-3各原因に対する対策それぞれの原因に対して、具体的な対策方法を以下に示します。データに隔たりがある場合の対策データの隔たりを解消するために、以下の方法を試してみましょう。データ収集やデータ作成を行い、少ないデータのサンプルを増やしましょう。データ収集が難しい場合は、既存のデータのコピーと改変(回転、ぼかし、色調変更など)によってデータを増幅することも有効です。多いデータのサンプルを減らすことで、データの偏りを解消することもできます。データ量が減ると学習不足になる可能性もあるため、注意が必要です。学習時に、少ないデータのサンプルに対して重みを大きく設定することで、少ないデータの影響を大きくすることができます。過学習を防ぎ、汎化性能を高めるために、以下の対策を検討しましょう。画像分類では畳み込みニューラルネットワーク(CNN)が有効です。CNNは画像の空間的な特徴を捉えることに長けており、汎化性能が高いモデルです。正則化手法は、モデルのパラメータの大きさを制限することで、過学習を防ぐ効果があります。代表的な手法として、L1正則化、L2正則化、ドロップアウトなどがあります。学習の途中で、テストデータに対する性能が向上しなくなったら学習を停止する手法です。過学習を防ぎ、汎化性能を向上させる効果が期待できます。因果関係がないデータで学習しても意味がないため、データ自体を見直す必要があります。じゃんけんの例では、過去の結果だけでなく、対戦相手の情報(性別、年齢、過去の対戦成績など)も入力データに加えることで、因果関係を構築できる可能性があります。少ないデータのサンプルを増やすデータ収集:WebスクレイピングやAPIを利用して、足りないデータを取得する。実験やアンケートを実施して、新しいデータを作成する。データ作成:画像データであれば、画像編集ソフトやライブラリを用いて、既存の画像を加工する。テキストデータであれば、既存の文章を改変したり、新しい文章を生成する。少ないデータをコピーし増幅する画像データの場合:画像の回転、反転、スケール変更、色調変更などを施す。KerasのImageDataGeneratorを使用すると、これらの変換を簡単に適用できる。データセットからランダムにサンプルを抽出する。データの偏りを解消するために、特定の種類のデータを削除する。各クラスのサンプル数に反比例する重みを設定する。Kerasのclass_weightパラメータを使用する。画像データの場合、畳み込みニューラルネットワーク(CNN)は空間的な特徴を捉えることに長けており、汎化性能が高い。時系列データの場合、再帰型ニューラルネットワーク(RNN)が有効。自然言語処理の場合、Transformerは文脈を理解する能力が高く、汎化性能が高い。モデルのパラメータの絶対値の合計を最小化する。モデルのパラメータの2乗の合計を最小化する。学習時に、ランダムにニューロンを無効化することで、過学習を防ぐ。KerasのEarlyStoppingコールバックを使用することで、テストデータに対する性能が向上しなくなったら学習を停止できる。データに因果関係が含まれていない場合は、データの取得方法や内容を見直す必要がある。じゃんけんの例では、対戦相手の情報(性別、年齢、過去の対戦成績など)を追加する。Gemini等を使うのもひとつの方法です。Gemini等を使い対策前進出来ると思います。Geminiを活用すると何とかなることが多いです。最後に本記事が少しでも皆さまの役にたてたら幸いです。一緒に楽しくAIについて学びましょう。Pythonライブラリで無限の可能性!プロフィールプロフィール84(ばっしーぃ⤴)システムエンジニア歴20年の二児の父。世間の荒波にもまれ生きてきて、AIで人手不足の分野が改善することを切に願っています。