5

私はニューラル ネットワークを実装しており、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
4

2 に答える 2

7

あなたのrelu_prime機能は次のとおりです。

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

データ行列の各値が ではなく 0 と比較されていることに注意してくださいepsilonこれは、漏れのある ReLUの標準的な定義に1従います。x > 0epsilon

漏れやすい ReLU が XOR 問題に最適な選択であるかどうかについてはコメントできませんが、これで勾配の問題は解決するはずです。

于 2017-01-09T14:16:28.647 に答える
6

簡潔な答え

2 進数で ReLU を使用しないでください。これは、はるかに大きな値で動作するように設計されています。また、負の値がない場合は使用しないでください。これは、基本的に最適ではない線形活性化関数を使用していることを意味するためです。畳み込みニューラル ネットワークでの使用に最適です。

長い答え

私はJavaでコーディングしているため、Pythonコードに問題があるかどうかはわかりません。しかし、論理的には、この場合に ReLU を使用することは悪い決定だと思います。XOR を予測しているため、NN [0,1] の値の範囲は限られています。これは、シグモイド活性化関数の範囲でもあります。ReLU では、値 [0,infinity] で操作します。これは、XOR であるため、決して使用しない値が非常に多くあることを意味します。ただし、ReLU はこの値を考慮に入れるため、発生するエラーが増加します。そのため、約 50% の確率で正しい答えが得られます。実際、この値は 0% まで低く、99% まで高くなる可能性があります。教訓 - どの活性化関数を使用するかを決定するときは、NN の入力値の範囲を活性化関数の値の範囲と一致させてください。

于 2017-01-09T13:46:12.453 に答える