0

ここで受けて調査した支援のおかげで、C# で単純なパーセプトロンを作成することができました。そのコードは次のようになります。

       int Input1 = A;
       int Input2 = B;
        //weighted sum
        double WSum = A * W1 + B * W2 + Bias;

        //get the sign: -1 for negative, +1 for positive
        int Sign=Math.Sign(WSum);

        double error = Desired - Sign;
        //updating weights
        W1 += error * Input1 * 0.1; //0.1 being a learning rate
        W2 += error * Input2 * 0.1;
        return Sign;

ここでは Sigmoid を使用せず、-1 または 1
を取得します。2 つの質問があります
。1) 重みが -5 などの値を取得するのは正しいですか? 入力が例えば 100,50 の場合、次のようになります: W1+=error*100*0.1
2) より深く進み、より多くの接続されたニューロンを作成したい - 3 番目に入力を提供するには、少なくとも 2 つ必要だと思います。3 番目の値が -1..1 だけで供給されるというのは正しいですか? 単純なパターン認識を目指していますが、これまでのところどのように機能するかわかりません。

4

2 に答える 2

0

ウェイトを 2 倍に設定してみてください。

また、特にニューラルネットワークでは、配列を使用する方がはるかに優れていると思います。パーセプトロンが唯一の方法です。

また、目的を達成するには for または while ループが必要です。

于 2013-03-28T08:15:17.430 に答える
0

重みの値が -Infinity から +Infinity までの範囲であることは完全に有効です。常に整数の代わりに実数を使用する必要があります (上記のように double が機能します。ニューラル ネットワークには 32 ビット浮動小数点数の精度で十分です)。

さらに、学習ステップごとに学習率を下げる必要があります。たとえば、更新ごとに 0.99 ずつ減らします。そうしないと、最適値に近づくとアルゴリズムが振動します。

「より深く」行きたい場合は、多層パーセプトロン (MLP) を実装する必要があります。単純なしきい値ニューロンと複数の層を持つニューラル ネットワークには、常に 1 つの層だけで同等のものがあるという証明が存在します。これが、数十年前に研究コミュニティが一時的に人工ニューラル ネットワークのアイデアを放棄した理由です。1986 年、Geoffrey Hinton が Backpropagation アルゴリズムを普及させました。それを使用すると、複数の隠れ層で MLP をトレーニングできます。

XOR などの非線形の問題や、パターン認識などのその他の複雑な問題を解決するには、非線形活性化関数を適用する必要があります。手始めに、ロジスティック シグモイド活性化関数を見てください。f(x) = 1. / (1. + exp(-x))。これを行うときは、入力値と出力値を [0.0; 0.0] の範囲に正規化する必要があります。1.0]。これは、ロジスティック シグモイド活性化関数の出力が正確にこの範囲で定義されるため、出力ニューロンにとって特に重要です。

配列を使用したフィードフォワード MLP の単純な Python 実装は、この回答にあります

編集: XORなどを解決するには、少なくとも1つの隠しレイヤーも必要です。

于 2013-03-28T12:19:01.017 に答える