私はニューラル ネットワークを実装しており、ReLU をニューロンの活性化関数として使用したいと考えていました。さらに、SDG とバックプロパゲーションを使用してネットワークをトレーニングしています。パラダイム XOR 問題を使用してニューラル ネットワークをテストしていますが、これまでのところ、ロジスティック関数または双曲線正接を活性化関数として使用すると、新しいサンプルが正しく分類されます。
Leaky ReLU をアクティベーション関数として使用する利点について読んでいて、次のように Python で実装しました。
def relu(data, epsilon=0.1):
return np.maximum(epsilon * data, data)
はNumPynp
の名前です。関連する派生物は次のように実装されます。
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]
出力が予想される XOR のものと大きく異なることがわかります。そこで質問なのですが、ReLU をアクティベーション関数として使用する際に特別な考慮事項はありますか?
より多くのコンテキストやコードを私に尋ねることを躊躇しないでください。前もって感謝します。
編集: NumPy 配列ではなく、単一の float 値のみを返すため、派生物にバグがあります。正しいコードは次のとおりです。
def relu_prime(data, epsilon=0.1):
gradients = 1. * (data > epsilon)
gradients[gradients == 0] = epsilon
return gradients