シミュレーションに戻る
# 導入
以前の err_driven_hidden プロジェクトは、難しい問題を解決するには、隠れ層を使用したエラー駆動学習が必要であることを示しました。このシミュレーションは、一般化をサポートするためにエラー駆動学習と組み合わせた場合のヘビアン学習の相補的な利点を示しています。
このプロジェクトでは、より豊富な入力セット、特に self_org で見た水平線と垂直線の同じ組み合わせを含む入力セットに対応するために、すべてのレイヤーのサイズを拡張しました。ただし、この場合、ネットワークにタスクの実行を依頼しているため、出力層もあります。タスクは、入力に存在する行の組み合わせにラベルを付けることであり、それを学習する必要があります。出力ユニットの 1 列目は垂直ラインに対応し、2 列目は水平ラインに対応します。たとえば、一番左の縦線と下から 2 番目の横線を組み合わせたイベント V0_H1 は、V0 の左列の下から 2 番目のユニット、H1 の右列の下から 2 番目のユニットの出力層ターゲットを持ちます。 Lines2 をクリックして、これらのパターンを理解してください。
-
[[[sim:Init]]] および [[[sim:Step]]: トライアル] をクリックして、ネットワークに提示されたパターンの 1 つを確認します。ネットワークに正しいターゲット パターンが表示されるため、トライアルの最後には出力層に正しいターゲットが表示されるはずです。 Netview で Act の代わりに [[sim:Phase]] -> [[sim:Phase/ActM]] をクリックすると、正しいラベルが何であるかを通知される前に、ネットワークがマイナス フェーズでラベルを「推測」した内容が表示されます。ネットワークにはまだラベルを学習する機会がないため、これは通常は間違っているはずです。
-
Step を Run および [[sim:Step]] に設定をクリックし、[[sim:Train Epoch Plot]] に切り替えて、トレーニング エポックにわたるエラーの割合を表示します。デフォルトの学習ルールが Hebbian であるため、ネットワークの学習に問題があることがわかります。次に、コントロール パネルの学習ルールを Error Driven に変更し、再度 [[sim:Init]] および Step Run をクリックします。ネットワークが純粋なエラー駆動学習を使用してラインのさまざまな組み合わせにラベルを付けることを学習するため、数エポック以内にエラーがゼロになることがわかります。 Netview に切り替えて、Phase -> ActM を確認しながらいくつかのトライアルを実行して、これらが実際に学習されたことを確信できます。 [[sim:Wts]] -> [[sim:Wts/r.Wt]] をクリックし、いくつかの非表示ユニットを見て、体系的な表現を学習しているかどうかを確認します (または、Weights タブに切り替えて、self_org と同様に、すべてのシナプス重みのグリッド ビューを表示します)。
質問 4.10: 隠れユニットは、self_org で行ったように、個々の行を表すことを学習しますか?なぜ、あるいはなぜそうではないのでしょうか?誤差を最小限に抑える際に重みを調整するための学習ルールがどのように設計されているかを説明します。
* このプロジェクトでは、水平線と垂直線のすべての可能な組み合わせを使用してネットワークを実際にトレーニングしたわけではありません。これまでに見たことのない、いくつかの斬新なラインの組み合わせを意図的に省略しました。これらを使用してネットワークをテストし、ネットワークがこれらの新しい組み合わせを記憶することなく正しく一般化できるかどうかを確認できます。新しいネットワークが実行されるたびに、プログラムは回線の組み合わせの 15% (ランダム) を自動的に選択し、それらをテスト テーブルに置きます。
* ネットビューで [[sim:Act]] を表示しているときに、実行モードを `Train` ではなく `Test` に設定し、次に `Init` および `Run` を設定します。これにより、ネットワークがこれまで一度も見たことのない回線の新しい組み合わせをすべてステップ実行します。 (必要に応じて、一度に 1 つずつステップ実行することもできます)。 ネットワーク上の出力パターンを確認し、ターゲット (ネットワークが応答すべき内容) を示す [[sim:Act]] / [[sim:Act/Targ]] 値と比較します。 また、[[[sim:Test Trial]]] タブに切り替えて、すべてのテスト試行と、最後の列の正解 (ターゲット) と比較したネットワークの推測 (出力アクティベーションとして最後から 2 番目の列に表示) を確認することもできます。複数のネットワークにわたるパフォーマンスをより広範に把握するには、`Train` モード `Run` をクリックし、異なる初期重みとトレーニング/テスト パターンの異なる順列を使用して 10 個のネットワークで実行させます。 [[[sim:Test Epoch Plot]]] タブの表示に切り替えると、10 個のネットワークのそれぞれが学習しているときの、トレーニングの 5 エポックごとのテスト データのネットワーク エラー パーセントのグラフが表示されます。 (ここでも、[[sim:Train Epoch Plot]] を見ることで、ネットワークがトレーニング パターンを学習していることを確認できます)。
> **質問 4.11:** テスト試行および学習と実行のエポックにおける出力に表示された内容を報告してください。平均して、ネットワークは、これらの新しいパターンに対する正しい行の組み合わせを報告することによって、その学習を一般化しますか?前の質問で隠れ層によって学習された内部の隠れ表現の観点から、これがなぜ起こるかを考えてみましょう。
* 次に、学習ルールを `ErrorDriven` から `Hebbian` に戻し、`Init`、[[sim:Step]] `Run` を再度クリックします。ネットワークはタスクを学習できませんが、[[sim:Weights]] タブ (またはネットビューの [[sim:Wts/r.Wt]]) をクリックすると、隠れユニットが `self_org` で見たものと同様の学習されたライン表現を示していることがわかります。したがって、たとえヘビアン学習が出力ラベル付けタスクの学習に失敗したとしても(つまり、出力にどの行が表示されるかを「報告」することができません)、ヘビアン学習が開発する内部表現は依然として独立コンポーネントの影響を受けます。
* この学習を活用して一般化を改善できるかどうかを見てみましょう。学習ルールを `ErrorHebbIn` に切り替え、[[sim:Init]] をクリックします。これにより、入力から非表示への投影における純粋なヘビアン学習が維持されます (`Learn.XCal` LLrn=1、MLrn=0 に設定、ここで、L = BCM の長期移動平均の量、M = エラー駆動の中期)。ただし、Hidden と Output (LLrn=0、MLrn=1) の間の接続では純粋なエラー駆動学習が行われるようになります。 「TrainRun」をクリックして、10 個のネットワークのフルセットを実行します。まず、ネットワークがトレーニング セットを学習できることを確認します ([[sim:Train Epoch Plot]] を見て、エラーがゼロになるかどうかを確認します)。次に、[Test Epoch Plot] タブを確認します。このタブには、トレーニングの 5 エポックごとに、各ネットワークのラインの新しい組み合わせのエラー率が再び表示されます。 ([[[sim:Test Trial ]]] タブを再度クリックして、各トライアルで個別のネットワークが一般化しているかどうかを確認することもできます)。
> **質問 4.12:** 平均して、隠れ層でのヘビアン学習は、ネットワークが新しい項目に一般化する際のパフォーマンスを向上させるのに役立ちますか?なぜ、あるいはなぜそうではないのでしょうか? 学習ルールの組み合わせが脳にとってどのように役立つかをより一般的に考えてみましょう。
</section>