26

このようなHebb学習を使用するように、進化シミュレーターをアップグレードしたいと思います。私は基本的に小さな生き物が食べ物を見つける方法を学ぶことができるようにしたいと思っています。私は基本的なフィードフォワードネットワークでそれを達成しましたが、Hebb学習でそれを行う方法を理解することに固執しています。ヘッブ学習の基本原理は、2つのニューロンが一緒に発火した場合、それらは一緒に配線されるということです。

したがって、重みは次のように更新されます。

weight_change = learning_rate * input * output

これがどのように役立つかについて私が見つけた情報はかなり不足していて、私はそれを理解していません。

私の現在のバージョンのシミュレーターでは、クリーチャーが食べ物を食べると、アクションと入力(動き、目)の間の重みが大きくなり、それがこの新しいモデルにどのように変換されるかわかりません。パラメータは入力と出力のみであるため、ここで何かが正しいか間違っているかを判断する余地はありません。基本的に、1つの入力が一方向の動きをアクティブにすると、クリーチャーが何かを食べているかどうかに関係なく、体重は増え続けます!

私はHebb学習を間違った方法で適用していますか?参考までに、Pythonを使用しています。

4

4 に答える 4

19

Hebbs lawは素晴らしい洞察ですassociative learningが、それは全体像のほんの一部です。そして、あなたは正しいです、あなたがしたように実行されます、そしてチェックされないままにされると、重みはただ増加し続けます。重要なのは、何らかの形で正規化または制限プロセスを追加することです。これは、オヤの法則のwikiページによく示されています。私が提案するのは、post-synaptic divisive normalisationステップを追加することです。これは、同じシナプス後ニューロンに収束するすべての重みの合計で重みを除算することを意味します(つまり、ニューロンに収束するすべての重みの合計は次のように固定されます。1)。

を利用したネットワークを構築することで、やりたいことができますHebbian learning。システムへの入力として何を渡しているか、またはどのように設定したかについてはよくわかりません。LISSOMしかし、SOMのヘッブの拡張(自己組織化マップ)はどれであるかを見ることができます。

この種の層では、通常、すべてのニューロンが相互接続されている可能性があります。入力ベクトルを渡し、ネットワーク内のアクティビティを解決できるようにします。これは、いくつかの解決手順です。次に、重みを更新します。これはトレーニングフェーズで行います。トレーニングフェーズが終了すると、入力スペースの関連アイテムは、出力マップでグループ化されたアクティビティパッチを形成する傾向があります。

また、脳は大規模に相互接続されており、再帰性が高いことにも注意してください(つまり、フィードフォワード、フィードバック、横方向の相互接続、マイクロ回路、その他多くのものがあります)。

于 2012-05-20T19:51:37.090 に答える
2

ヘッブの学習は、一般的な概念として、バックプロパゲーションを含む多くの学習アルゴリズムの基礎を形成しますが、使用する単純な線形方程式は非常に限られています。ネットワークがすべてのパターンを学習した場合でも、重みが無限に増加するだけでなく、ネットワークは直交(線形独立)パターンのみを完全に学習できます。

線形ヘッブ学習は生物学的にもっともらしいものではありません。生物学的ニューラルネットワークはあなたのものよりはるかに大きく、ニューロンとそれらの間のシナプスの両方で非常に非線形です。大規模な非線形ネットワークでは、パターンが直交に近い可能性が高くなります。

したがって、ニューラルネットワークの使用を主張する場合は、ニューロンの隠れ層を追加し、重み(たとえばフラクセルが提案したように)とニューロンの発火の両方に非線形性を導入することをお勧めします---ここではシグモイド関数を使用できます、のようにtanh(はい、「非発射」に負の値を使用すると、重量が減る可能性があるため、適切です)。その一般化された形式では、ヘッブの法則は次のように表すことができます。

weight_change = learning_rate * f1(input, weight) * f2(output, target_output)

ここでf1f2はいくつかの関数です。あなたの場合、はありませんtarget_outputので、f2無視してかまいません。

隠れ層のニューロンを発火させ、入力と出力を接続するために、重みをランダムな値に初期化できます。

しかし、ニューラルネットワークは本当に必要ですか、それともあなたの問題に適していますか?単純な相関関係を検討しましたか?つまり、Hebbは、可能な限り最高の機械学習アルゴリズムとしてではなく、生物学的システムで学習がどのように機能するかを説明するために彼のルールを導き出しました。

于 2012-05-23T21:27:26.510 に答える
1

私はこのタイプのニューラルネットワークにあまり精通していませんが、教師なしの更新方法のように機能することを期待しているようです。これは、あなたがそれに何が正しいかを教えることができないことを意味します、それは連想によって、何が違うかを学ぶだけです。つまり、最終的にアクションを特定の入力クラスターに関連付けます。フィードバックによって意思決定を改善したいという状況では、ヘッブの更新だけでは不十分だと思います。ただし、それをある種のバックプロパゲーションと組み合わせることができます。

于 2012-05-20T01:51:05.803 に答える
-1

私のコードで試すことができます。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package modelhebb;

/**
 *
 * @author Raka
 */
public class ModelHebb {
    public static void main(String[] args) {
        Integer xinput[][]  = new Integer[][]{
            {1, 1},
            {1, -1},
            {-1, 1},
            {-1, -1}
        };
        Integer xtarget[]   = new Integer[]{
            1,
            -1,
            -1,
            -1
        };
        Integer xweight[]   = new Integer[xinput[0].length];
        System.out.println("\t Iterasi \t");
        Integer bayes   = 0;
        for (int i = 0; i < xtarget.length; i++) {
            for (int j = 0; j < xinput[i].length; j++) {
                int temp    = xweight[j]==null?0:xweight[j];
                xweight[j]  = temp + (xinput[i][j] * xtarget[i]);
                System.out.print("W"+j+": "+xweight[j]+"\t");
            }
            bayes   = bayes + xtarget[i];
            System.out.println("Bobot : " + bayes);
        }
    }
}

于 2017-03-16T07:38:30.210 に答える