深層学習 -- モデルの過学習の問題を解決する

記事ディレクトリ
1. 過学習
1. 過学習とは
2. モデルが過学習を引き起こすのはなぜですか? その理由は次のとおりです。
3. パラメータ調整トレーニング モデルの目的:
4. アンダーフィッティングの説明
2. オーバーフィッティングを軽減する方法
1. より多くのトレーニング データを取得します。
2. ネットワーク サイズを削減する
3. 重み正則化を追加する
4. ドロップアウト正則化を追加する (一部の出力データを破棄する)
3. 過学習を減らす実際の操作 1.
ネットワーク サイズを削減する
2. 重み正則化を追加する
3. ドロップアウト正則化を追加する
1. 過学習
1.オーバーフィッティング
? 設定された検証データでトレーニングしたばかりのモデルのパフォーマンスは、常に数ラウンド後に最高点に達し、その後低下し始めますか。
以下の図に示すように、トレーニング セット上のモデルの精度は向上していますが、検証セット上のモデルの精度は 2 ラウンド目に最高点に達し、その後低下し始めています。トレーニング データに過剰適合し始めた: トレーニング データにのみ関連するが、新しいデータには誤っているか無関係なパターンをモデルが学習し始める現象。

2. モデルが過学習を引き起こすのはなぜですか? その理由は次のとおりです。
(1) 多くのデータにはノイズが含まれています。モデルはノイズ ポイントをできる限りカバーしようとするため、データへのオーバーフィッティングが発生します。
(2) トレーニング データが不十分な場合、モデルは予測方向に関係のない特徴を過剰に抽出します。
(3) 構築されたモデルが複雑すぎて訓練データの特徴を過剰に抽出しており、テストセットとしては不適切である。

3. トレーニング モデルを調整する目的:
モデルをトレーニングする目的は、優れたニューラル ネットワークを取得することです。優れたネットワークには、データの高い予測精度が必要です。これには次のことが必要です。 1. 最適なトレーニング
データを取得するようにモデルを調整します。パフォーマンス、つまり最適化は十分に達成されています。
2. しかし同時に、訓練されたモデルがこれまでに見たことのないデータに対して良好なパフォーマンスを発揮するように、つまり優れた汎化能力を得るために、訓練データに基づいてモデルを調整することは、モデルの汎化能力を向上させることになります。
深層学習モデルは多くの場合、トレーニング データの適合に非常に優れていますが、本当の課題は適合ではなく一般化です。

4. アンダーフィッティングの説明
学習済みモデルの場合、トレーニング セットのパフォーマンスが悪い場合、テスト セットのパフォーマンスも悪くなります。これはアンダーフィッティングが原因である可能性があります。アンダーフィッティングとは、モデルのフィッティング度が高くないこと、データがフィッティング曲線から離れていること、またはモデルがデータの特性をうまく捉えておらず、データをうまくフィッティングできないことを意味します。トレーニング データの損失が小さければ、テスト データの損失も小さくなります。現時点でのモデルは、一般にネットワークが小さすぎて、トレーニング データ内のすべての関連パターンをモデル化していないため、適合が不十分です。ネットワークの隠れユニットまたは層の数を適切に増やすことで、基本的に問題を解決できます。 。

2. 過学習を軽減する方法
1. より多くのトレーニング データを取得します。
モデルがトレーニング データから間違ったパターンや無関係なパターンを学習するのを防ぐための最適な解決策は、より多くのトレーニング データを取得することです。モデルに含まれるトレーニング データが多いほど、一般化能力が向上します。

これ以上データが利用できない場合、次善の解決策は、モデルが保存できる情報の量を規制するか、モデルが保存できる情報に制約を課すことです。ネットワークが少数のパターンしか覚えていない場合、最適化プロセスにより、モデルは、一般化できる可能性がより高い最も重要なパターンの学習に集中するようになります。
過学習を軽減するこの方法は、正則化と呼ばれます。


2. 過学習を防ぐためにネットワークのサイズを減らす最も簡単な方法は、モデルのサイズを減らすことです。つまり、モデル内の学習可能なパラメーターの数を減らすことです (これは、層の数と層の数によって決まります)。各層のユニット)ただし、同時に使用するモデルには、アンダーフィッティングを防ぐのに十分なパラメーターが必要であり、このバランスを見つける必要があります。
このバランスを見つけるには、データに最適なモデル サイズを見つけるために、さまざまなネットワーク アーキテクチャ (検証セットで評価) を評価する必要があります。適切なモデル サイズを見つけるための一般的なワークフローは、比較的少数のレイヤーとパラメーターで開始し、その後、検証損失にほとんど影響がなくなるまで、レイヤー サイズを徐々に増やすか、新しいレイヤーを追加することです。

3. 重みの正則化を追加する
単純なモデルは、複雑なモデルよりも過学習の傾向が低くなります。単純なモデルとは、パラメーターが少ないモデルを指します。過学習を軽減するもう 1 つの一般的な方法は、モデルの重みに小さな値のみを強制的に取り込み、それによってモデルの複雑さを制限し、重み値の分布をより規則的にすることです。この方法は重みの正則化と呼ばれます。
これは、より大きな重み値に関連するコストをネットワーク損失関数に追加することで実現されます。このコストには 2 つの形式があります。
L1 正則化: 追加コストは重み係数 (重みの L1 ノルム) の絶対値に比例します。
L2 正則化: 追加コストは重み係数 (重みの L2 ノルム) の 2 乗に比例します。ニューラル ネットワークの L2 正則化は、重み減衰とも呼ばれます。

4. ドロップアウト正則化の追加 (一部の出力データを破棄)
ドロップアウトは、ニューラル ネットワークで最も効果的で一般的に使用される正則化手法の 1 つです。特定の層にドロップアウトを使用すると、トレーニング プロセス中に層の出力特徴の一部がランダムに破棄されます ( に設定) 0)。トレーニング中に、特定の入力サンプルに対する特定の層の戻り値がベクトル [0.2, 0.5, 1.3, 0.8, 1.1] になるとします。ドロップアウトを使用すると、このベクトルのいくつかのランダムな要素 ([0, 0.5, 1.3, 0, 1.1] など) が 0 になります。ドロップアウト率 (ドロップアウト率) は、0 に設定された特徴の割合であり、通常は 0.2 ~ 0.5 の範囲になります。テスト中にユニットがドロップされることはありません。トレーニング中よりも多くのユニットがアクティブになり、バランスを取る必要があるため、この層の出力値はドロップアウト率によってスケールダウンする必要があります。

3. 過学習を軽減するための実際の操作
以下では、モデルの過学習を軽減する方法を検討するために、実際の戦闘データセットとして IMDB データセットを使用します. これには、インターネット ムービー データベース (IMDB) からの 50,000 件の激しく二極化されたコメントが含まれています. IMDB データセットは、 Keras ライブラリに組み込まれています。これは前処理されています。レビュー (単語のシーケンス) は整数のシーケンスに変換されており、各整数は辞書内の単語を表します。

from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
# 数据标签向量化
x_train = np.asarray(train_data).astype('float32')
x_test = np.asarray(test_data).astype('float32')
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')


トレーニング プロセス中に未確認データのモデルの精度を監視し、モデルを調整するには、元のトレーニング データの 10,000 サンプルを検証セットとして確保する必要があります。モデルの調整プロセスでは、最終モデルが形成される前にテスト セットからデータを学習することはできません。

x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]


512 サンプルのミニバッチを使用して、10,000 サンプルのセットアウトで損失と精度を監視しながら、モデルは 20 エポックにわたってトレーニングされます。

训练一个网络
from keras import models
from keras import layers
original_model = models.Sequential()
original_model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
original_model.add(layers.Dense(16, activation='relu'))
original_model.add(layers.Dense(1, activation='sigmoid'))
original_model.compile(optimizer='rmsprop',
                       loss='binary_crossentropy',
                       metrics=['acc'])
original_hist = original_model.fit(partial_x_train,
                                   partial_y_train,
                                   epochs=20,
                                   batch_size=512,
                                   validation_data=(x_val, y_val))

反復ごとに、トレーニング セットの損失がラウンドごとに減少していることがわかります。しかし、これは検証精度には当てはまりません。検証精度が最低値に達するのはラウンド 4 だけです。5 ラウンド目以降は、トレーニング データの過剰な最適化により、最終的に学習された表現はトレーニング データのみを対象とし、トレーニング セット外のデータに一般化できなくなります。

1. ネットワーク サイズを削減する
以下のより小さなネットワークに置き換えてみてください。

smaller_model = models.Sequential()
smaller_model.add(layers.Dense(4, activation='relu', input_shape=(10000,)))
smaller_model.add(layers.Dense(4, activation='relu'))
smaller_model.add(layers.Dense(1, activation='sigmoid'))
smaller_model.compile(optimizer='rmsprop',
                      loss='binary_crossentropy',
                      metrics=['acc'])
smaller_model_hist = smaller_model.fit(partial_x_train,
                                   partial_y_train,
                                   epochs=20,
                                   batch_size=512,
                                   validation_data=(x_val, y_val))
                                   epochs = range(1, 21)
epochs = range(1, 21)
original_val_loss = original_hist.history['val_loss']
smaller_model_val_loss = smaller_model_hist.history['val_loss']
import matplotlib.pyplot as plt
plt.plot(epochs, original_val_loss, 'b+', label='Original model')
plt.plot(epochs, smaller_model_val_loss, 'bo', label='Smaller model')
plt.xlabel('Epochs')
plt.ylabel('Validation loss')
plt.legend()
plt.show()

小規模なネットワークは、基準ネットワークよりも遅くオーバーフィットし始め、オーバーフィットし始めた後は、パフォーマンスの低下が遅くなります。

2. 重みの正則化を追加します。
kernel_regulatoryizer パラメーターをレイヤーパラメーターに追加します。

from keras import regularizers
l2_model = models.Sequential()
l2_model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                          activation='relu', input_shape=(10000,)))
l2_model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),
                          activation='relu'))
l2_model.add(layers.Dense(1, activation='sigmoid'))

2 つのモデルのパラメーターの数が同じであっても、L2 正則化を使用したモデル (ドット) は参照モデル (十字) よりも過学習の傾向が低いことがわかります。

3. ドロップアウト正則化の
追加 ネットワークにlayers.Dropout(0.5)層を追加します。

dpt_model = models.Sequential()
dpt_model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
dpt_model.add(layers.Dropout(0.5))
dpt_model.add(layers.Dense(16, activation='relu'))
dpt_model.add(layers.Dropout(0.5))
dpt_model.add(layers.Dense(1, activation='sigmoid'))

dpt_model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['acc'])

繰り返しますが、この方法のパフォーマンスは、元のネットワークと比較して大幅に向上していることがわかります。
上記は過学習を軽減する一般的な方法です。
———————————————
著作権に関する声明: この記事は CSDN ブロガー「Mario w」のオリジナル記事であり、CC 4.0 BY-SA 著作権契約に従い、オリジナルのソース リンクを添付してください。この文。
元のリンク: https://blog.csdn.net/weixin_45949840/article/details/124251900

おすすめ

転載: blog.csdn.net/modi000/article/details/130380277