2013-12-18 50 views
1

我一直在關注jeff heaton在線指南,我來到了這一點,我試圖創建一個簡單的NN,它有三個輸入神經元和一個輸出神經元沒有隱藏三層權重與這三個輸入神經元相關聯。簡單的神經網絡與線性層不會產生預期的輸出

神經網絡從總共6個二進制組合中識別出3個比特的兩個二進制組合。

下面的代碼:

class neural{ 
    double weight1=1.0,weight2=1.0,weight3=1.0; 
    double learningRate = 0.000001; 
    public double getOutput(double i1,double i2,double i3,double ideals){ 
     double u = weight1*i1 + weight2*i2 + weight3*i3;  
     double error = 0.0;  
     error = ideals -u;  
     weight1 += error * learningRate * i1; 
     weight2 += error * learningRate * i2 ; 
     weight3 += error * learningRate * i3 ; 

     return u; 
    } 


} 

public class pattern{ 
    public static void main(String argz[]){ 
     neural a = new neural();   
     for(int i = 0; i < 2000; i++){ 
      a.getOutput(0.0, 0.0, 0.0,0.0); 
      a.getOutput(0.0, 0.0, 1.0,1.0); 
      a.getOutput(0.0, 1.0, 0.0,1.0); 
      a.getOutput(0.0, 1.0, 1.0,0.0); 
      a.getOutput(1.0, 1.0, 0.0,0.0); 
      a.getOutput(1.0, 1.0, 1.0,1.0); 

     } 

    } 
} 

我嘗試了學習速率低至0.000001通過@Widdershins指出

任何超過0.5是1且低於任何爲0這樣的輸出是000101而不是011001

+0

對於這種情況,您需要一個隱藏層。它看起來非常像XOR問題。一層將無法工作。 – lennon310

回答

2

所以,讓我們把這個整理在我們的腦海中。

u是您獲得輸入和給定權重的結果。

ideals是您希望實現的輸出。

error然後是數量u出錯了;它應該是從uideals的距離。那就是,它應該是ideals - u。這似乎是正確的。

雖然你的學習價值似乎相當高。設置這些值太高可以導致振盪而不是收斂,特別是對於高度規則的輸入。你是否已經檢查了在學習循環結束後的連續運行之間你的體重值是多少?你有沒有嘗試降低學習率?免責聲明:我不是一個神經網絡專家,你應該考慮任何我認爲是猜測的斷言,但這是我的理解。

編輯:我試着用小得多的學習值(0.25和0.01之間)運行你的代碼少至200次,並得到所需的輸出。你不應該需要差不多這個簡單的網絡的兩萬個循環,並記住保持你的學習率低到足以避免奇怪的結果:約200學習循環,網絡將開始輸出不正確的000101而不是001010儘快因爲學習率達到了0.7的臨界值。較低的學習率,甚至很低的費率,都會帶來更好的結果。


現在,我們正在進入乙狀結腸功能:

import java.util.Random; 
import java.util.Arrays; 

public class NeuralNet { 
    static final Random rand = new Random(); 


    static final double[][] teach = new double[][] 
    { {0d, 0d, 0d, 0d}, 
    {0d, 0d, 1d, 0d}, 
    {0d, 1d, 0d, 1d}, 
    {0d, 1d, 1d, 0d}, 
    {1d, 1d, 0d, 1d}, 
    {1d, 1d, 1d, 0d} }; 


    public static void main(String[] args) { 
    Neural a = new Neural();   
    for(int i = 0; i < 2000; i++){ 
     int t = rand.nextInt(teach.length); 
     a.learn(teach[t][0], teach[t][1], teach[t][2], teach[t][3]); 
    } 

    System.out.println(a); 
    for (int t = 0; t < teach.length; t++) { 
     System.out.println(a.react(teach[t][0], teach[t][1], teach[t][2])); 
    } 
    } 

    public static double sigmoid(double u) { 
    return 1/(1 + Math.exp(-u)); 
    } 

    static class Neural { 
    static final double INIT_WEIGHT_RANGE = 1/Math.sqrt(3); 
    final double LEARNING_RATE = 0.1; 

    double offset = (rand.nextDouble() * 2 - 1) * INIT_WEIGHT_RANGE, 
     weight1 = (rand.nextDouble() * 2 - 1) * INIT_WEIGHT_RANGE, 
     weight2 = (rand.nextDouble() * 2 - 1) * INIT_WEIGHT_RANGE, 
     weight3 = (rand.nextDouble() * 2 - 1) * INIT_WEIGHT_RANGE; 

    public double learn(double i1, double i2, double i3, double ideals) { 
     double u = 
     offset + 
     weight1 * i1 + 
     weight2 * i2 + 
     weight3 * i3; 
     u = sigmoid(u); 
     double correction = (ideals - u) * LEARNING_RATE; 

     offset += correction; 
     weight1 += correction * i1; 
     weight2 += correction * i2; 
     weight3 += correction * i3; 

     return u; 
    } 

    public double react(double i1, double i2, double i3) { 
     double u = 
     offset + 
     weight1 * i1 + 
     weight2 * i2 + 
     weight3 * i3; 
     return sigmoid(u); 
    } 

    public String toString() { 
     // how lazy! 
     return Arrays.toString(new double[] {offset, weight1, weight2, weight3}); 
    } 
    } 
} 

我所做的閱讀公平一點剛纔對我們應該有什麼樣的反向傳播的功能,但只是在離開它像線性這似乎工作得很好。 For all I can tell這可能是正確的。有足夠的時代,這將非常瞭解從0到1的任何值。

+0

學習率可能仍然很高。 – Mumbleskates

+0

嘿,我試着用這些模式 a.getOutput(0.0,0.0,0.0,0.0); \t \t \t a.getOutput(0.0,0.0,1.0,1.0); \t \t \t a.getOutput(0.0,1.0,0.0,1.0); \t \t \t a.getOutput(0.0,1.0,1.0,0.0); \t \t \t a.getOutput(1.0,1.0,0.0,0.0); \t \t \t a.getOutput(1.0,1.0,1.0,1.0); 我的學習速度儘可能低至0.000001,但仍然沒有收斂到理想狀態。我嘗試了20個時代,高達20萬個仍然無濟於事! – Aditya

+0

您需要記住,您應該有一個恆定的偏移量,以便在所有輸入爲零或接近零時達到所需的值。所有網絡層通常會有一個靜態偏移量,其輸入假定始終爲1. – Mumbleskates

1

理想輸出0和理想輸出1的訓練模式不是線性可分的,這意味着您試圖獲得的期望輸出不能被學習通過沒有隱藏層的網絡。尤其需要注意的是,當i1 = 0時,你所要求的輸出等價於衆所周知的異或問題。請參閱此here的解釋。

+0

這對我來說非常有意義,我嘗試過使用3d點繪圖儀並嘗試移動幾個點以滿足線性分離條件,一旦它們完成,就能夠完美地訓練和回憶模式!我還需要了解更多這樣的「條件」嗎?神經網絡上有沒有神聖的東西,比如像Photoshop上的神經網絡,它幾乎包含了所有這些特殊的法律或條件?我不能指望用有限的在線預覽書來掌握神經網絡,反正我需要讓自己成爲標準的教科書。 – Aditya

+0

對於像這樣的東西,我傾向於建議通過各種在線講授筆記的大學進行搜索。它們都應該涵蓋異或問題,以及它如何激勵多層網絡,以及反向傳播如何工作。 – Jules