5

我正在實現一個神經網絡,並希望使用ReLU作爲神經元的激活函數。此外,我正在使用SDG和反向傳播來訓練網絡。我正在用範例異或問題測試神經網絡,到目前爲止,如果我使用邏輯函數或雙曲線正切作爲激活函數,它會正確分類新樣本。使用ReLU作爲激活函數的注意事項

我一直在閱讀有關使用破RELU作爲激活功能的優勢,並實現它,在Python中,類似這樣的:

def relu(data, epsilon=0.1): 
    return np.maximum(epsilon * data, data) 

其中npNumPy的名稱。相關的衍生實現這樣的:

def relu_prime(data, epsilon=0.1): 
    if 1. * np.all(epsilon < data): 
     return 1 
    return epsilon 

使用此功能激活我得到不正確的結果。例如:

  • 輸入= [0,0] - >輸出= [0.43951457]

  • 輸入= [0,1] - >輸出= [0.46252925]

  • 輸入= [1,0] - >輸出= [0.34939594]

  • 輸入= [1,1] - >輸出= [0.37241062]

可以看出,輸出與預期的異或運算有很大不同。所以問題是,有沒有特別的考慮使用ReLU作爲激活函數?

請不要猶豫,問我更多的上下文或代碼。提前致謝。

編輯:衍生物中存在一個錯誤,因爲它只返回一個浮點值,而不是NumPy數組。正確的代碼應該是:

def relu_prime(data, epsilon=0.1): 
    gradients = 1. * (data > epsilon) 
    gradients[gradients == 0] = epsilon 
    return gradients 
+0

修改了梯度計算部分後,它是否工作? –

+0

@KrishnaKishoreAndhavarapu修改後,我得到正確的結果,但像10次中的5次。我相信我每次都應該得到正確的結果。這種激活功能顯然是我缺少的東西。 – tulians

+0

你確定'gradients = 1。*(data> epsilon)'是有意義的嗎?什麼是你的泄漏ReLU功能的定義?對於大於零的某些數據值,這會將梯度設置爲等於epsilon。 –

回答

6

relu_prime功能應該是:

def relu_prime(data, epsilon=0.1): 
    gradients = 1. * (data > 0) 
    gradients[gradients == 0] = epsilon 
    return gradients 

注意在數據矩陣中的每個值與0的比較,而不是epsilon。這是從leaky ReLUs的標準定義開始的,否則當x > 0epsilon產生1的分段梯度時。

我無法評論泄漏的ReLU是否是XOR問題的最佳選擇,但是這應該可以解決您的梯度問題。

+0

現在我大部分時間都能得到正確的結果。與@ArnisShaykh回答和你的一樣,我現在已經知道激活函數選擇取決於數據值。 – tulians

6

簡短的回答

不要用二進制數字使用RELU。它旨在以更高的價值運作。當沒有負值時也要避免使用它,因爲它基本上意味着你正在使用不是最好的線性激活函數。最好使用卷積神經網絡。

龍答案

不能說,如果有什麼不對的Python代碼因爲在Java代碼我。但邏輯上來說,我認爲在這種情況下使用ReLU是一個不好的決定。正如我們預測異或,NN的值[0,1]的範圍有限。這也是sigmoid激活函數的範圍。使用ReLU,您可以使用值[0,無窮大]進行操作,這意味着有很多值是您從不會使用的值,因爲它是異或。但是,ReLU仍然會考慮這個值,你將會得到的錯誤將會增加。這就是爲什麼你在50%的時間內得到正確的答案。事實上,這個值可以低至0%,高達99%。故事的道德 - 在決定使用哪個激活函數時,嘗試將NN中輸入值的範圍與激活函數值的範圍相匹配。

+0

感謝您指出這一事實。我沒有想過。總體感覺。 – tulians

+0

很高興這是有益的。 –