10個の入力変数に基づいて7000個の製品を7つのクラスに分類する小さなANNを作成しています。
これを行うには、k分割交差検証を使用する必要がありますが、混乱が生じます。
プレゼンテーションのスライドからの抜粋を次に示します。
検証とテストセットは正確に何ですか?
私たちが理解しているのは、3つのトレーニングセットを実行し、重みを調整することです(単一エポック)。次に、検証で何をしますか?私が理解しているのは、ネットワークのエラーを取得するためにテストセットが使用されているからです。
次に起こることも私を混乱させます。クロスオーバーはいつ行われますか?
質問しすぎない場合は、ステップの箇条書きリストをいただければ幸いです
あなたは少し混乱しているようです(私も覚えています)ので、私はあなたのために物事を単純化します。 ;)
ニューラルネットワークの考案などのタスクが与えられるたびに、トレーニングの目的で使用するサンプルデータセットもしばしば与えられます。単純なニューラルネットワークシステムY = W · X
をトレーニングしていると仮定します。ここで、Y
は、与えられたサンプルベクトルと重みベクトルW
のスカラー積(・)の計算から計算された出力です。 X
。さて、これを行うための単純な方法は、たとえば、1000サンプルのデータセット全体を使用して、ニューラルネットワークをトレーニングすることです。トレーニングが収束し、体重が安定すると仮定すると、ネットワークがトレーニングデータを正しく分類すると安全に言うことができます。 しかし、以前に見えなかったデータが提示された場合、ネットワークはどうなりますか?明らかに、そのようなシステムの目的は、トレーニングに使用されるデータ以外のデータを一般化し、正しく分類できるようにすることです。
ただし、現実のどのような状況でも、以前は見えなかった/新しいデータは、ニューラルネットワークが運用環境に展開されて初めて利用可能になります。しかし、あなたはそれを適切にテストしていないので、おそらく悪い時間を過ごすでしょう。 :)学習システムがそのトレーニングセットにほぼ完全に一致するが、目に見えないデータで常に失敗する現象は、 過剰適合 と呼ばれます。
アルゴリズムの検証とテストの部分について説明します。元の1000サンプルのデータセットに戻りましょう。あなたがすることは、3つのセットに分割することです-training、validationおよびtesting(Tr
、Va
およびTe
)-慎重に選択した比率を使用します。 (80-10-10)%は通常、適切な割合です。ここで、
Tr = 80%
Va = 10%
Te = 10%
これで、ニューラルネットワークがTr
セットでトレーニングされ、その重みが正しく更新されます。次に、検証セットVa
を使用して、トレーニングから得られる重みを使用して分類エラーE = M - Y
を計算します。ここで、M
は検証セットから取得される予想出力ベクトル、Y
は、分類(Y = W * X
)の結果として計算された出力です。エラーがユーザー定義のしきい値よりも高い場合、 training-validation Epoch 全体が繰り返されます。このトレーニングフェーズは、検証セットを使用して計算されたエラーが十分に低いと見なされると終了します。
さて、ここでのスマートな策略は、各エポックの繰り返しで合計セットTr + Va
からトレーニングと検証に使用するサンプルをランダムに選択することです。これにより、ネットワークがトレーニングセットに過剰に適合しないことが保証されます。
次に、テストセットTe
を使用して、ネットワークのパフォーマンスを測定します。このデータは、トレーニングおよび検証段階で使用されたことがないため、この目的に最適です。これは事実上、目に見えないデータの小さなセットであり、ネットワークが実稼働環境に展開された後に何が起こるかを模倣することになっています。
上記で説明したように、パフォーマンスは分類エラーの観点から再び測定されます。また、パフォーマンスは 精度とリコール の観点から測定することもできます(エラーがどこでどのように発生するかを知ることができますが、それは別のQ&Aのトピックです)。
このトレーニング検証テストメカニズムを理解したら、 K-fold cross-validation を実行することで、過剰適合に対するネットワークをさらに強化できます。これは、上で説明したスマートルーゼの進化です。この手法には、トレーニングバリデーションテストのKラウンドを実行し、異なる、重複しない、均等に配分されたTr
、Va
、およびTe
sets。
k = 10
が与えられた場合、Kの各値に対して、データセットをTr+Va = 90%
とTe = 10%
に分割し、アルゴリズムを実行してテストパフォーマンスを記録します。
k = 10
for i in 1:k
# Select unique training and testing datasets
KFoldTraining <-- subset(Data)
KFoldTesting <-- subset(Data)
# Train and record performance
KFoldPerformance[i] <-- SmartTrain(KFoldTraining, KFoldTesting)
# Compute overall performance
TotalPerformance <-- ComputePerformance(KFoldPerformance)
以下の世界的に有名なプロットを wikipedia から取得して、検証セットが過剰適合を防ぐ方法を示しています。青のトレーニングエラーは、エポックの数が増加するにつれて減少する傾向があります。したがって、ネットワークはトレーニングセットと正確に一致しようとしています。一方、赤色の検証エラーは、異なるU字型のプロファイルに従います。曲線の最小値は、トレーニングと検証エラーが最小になるポイントであるため、理想的にはトレーニングを停止する必要がある場合です。
より多くの参照については、 この優れた本 は、機械学習といくつかの片頭痛の両方の適切な知識を提供します。価値があるかどうかはあなた次第です。 :)
データを重複しないK個のフォールドに分割します。各折り畳みKにm個のクラスのそれぞれから同数のアイテムを含めます(層別交差検証。クラスAから100アイテム、クラスBから50アイテムがあり、2折り畳み検証を行う場合、各折り畳みにはランダムな50アイテムが含まれます。 Aから、Bから25)。
1..kのiの場合:
これで、すべてのフォールドの集計結果が収集されました。これが最終的なパフォーマンスです。これを実際に適用する場合は、実際には、グリッド検索の最適なパラメーターを使用して、すべてのデータをトレーニングします。