2016-06-13 82 views
0

經過my previous attempt,我設法訓練一個神經網絡來表達正弦函數。我用ai4r紅寶石:神經網絡正弦函數

require 'ai4r' 
srand 1 
net = Ai4r::NeuralNetwork::Backpropagation.new([1, 60, 1]) 
net.learning_rate = 0.01 
#net.propagation_function = lambda { |x| 1.0/(1.0 + Math::exp(-x)) } 

def normalise(x, xmin, xmax, ymin, ymax) 
    xrange = xmax - xmin 
    yrange = ymax - ymin 
    return ymin + (x - xmin) * (yrange.to_f/xrange) 
end 

training_data = Array.new 
test = Array.new 
i2 = 0.0 
320.times do |i| 
    i2 += 0.1 
    hash = Hash.new 
    output = Math.sin(i2.to_f) 
    input = i2.to_f 
    hash.store(:input,[normalise(input,0.0,32.0,0.0,1.0)]) 
    hash.store(:expected_result,[normalise(output,-1.0,1.0,0.0,1.0)]) 
    training_data.push(hash) 
    test.push([normalise(output,-1.0,1.0,0.0,1.0)]) 
end 
puts "#{test}" 
puts "#{training_data}" 

time = Time.now 
999999.times do |i| 
    error = 0.0 
    training_data.each do |d| 
    error+=net.train(d[:input], d[:expected_result]) 
    end 
    if error < 0.26 
    break 
    end 
    print "Times: #{i}, error: #{error} \r" 
end 
time2 = Time.now 
puts "#{time2}-#{time} = #{time2-time} Sekunden gebraucht." 

serialized = Marshal.dump(net) 
File.open("net.saved", "w+") { |file| file.write(serialized) } 

一切工作正常。該網絡訓練了4703.664857秒。

sin function - neural network output

當我正常化0和1之間ai4r輸入/輸出到多個所述的網絡將被更快地訓練使用S形函數,所以很明顯,它不輸出負值。但爲什麼我必須規範化輸入值?這種神經網絡僅接受輸入值< 1嗎?

在正弦例子中,是有可能輸入的任何數量的如:

Input: -10.0 -> Output: 0.5440211108893699 
Input: 87654.322 -> Output: -0.6782453567239783 
Input: -9878.923 -> Output: -0.9829544956991526 

或我必須限定的範圍內。

回答

1

在您的結構中,您有一個輸入後有60個隱藏節點。這意味着每個隱藏節點對於總共60個學習值只有1個學習權重。從隱藏層到單個輸出節點的連接同樣具有60個權重或學習值。這總共提供了120個可學習的維度。

圖像隱藏層中的每個節點能夠學習的內容:存在單個縮放因子,然後是非線性。讓我們假設你的權重最終看起來像:

[1e-10, 1e-9, 1e-8, ..., .1]

每個條目是在隱藏層節點的權重。現在,如果你在1號傳遞到你的網絡的隱藏層將輸出的東西這樣的效果:

[0, 0, 0, 0, ..., .1, .25, .5, .75, 1](粗略地講,沒有實際計算)

同樣的,如果你給它的東西大,如:1E10然後第一層將給:

[0, .25, .5, .75, 1, 1, 1, ..., 1]

隱藏層的權重將要學會以這種方式分離,以便能夠通過將它們縮放到更小範圍來處理大範圍的輸入。您擁有的隱藏節點越多(在第一層),每個節點必須分開的距離越小。在我的例子中,它們間隔十倍。如果你有1000個,他們將被分開的因素可能是2.

通過規範化輸入範圍在[0,1]之間,你限制了這些隱藏節點在啓動之前需要分離多遠爲最後一層提供有意義的信息。這樣可以加快培訓速度(假設您的停止條件是基於損失的變化)。

那麼直接回答你的問題:不,你不需要正常化,但它肯定有助於降低輸入空間的可變性和規模加快訓練速度。

+0

「同樣,如果你給它一些大的東西,比如:1e10,那麼第一層就會給出:」爲什麼順序(現在是從大到小的數字)會改變? –

+1

哎呀,它不會。我做了一些不好的數學:)它應該給出大量的1(或非常接近1的東西)的數組,這對於神經網絡來說也是很難區分的。我編輯了我的帖子。 – Andnp