0

活性化関数として ReLU を使用してバックプロパゲーションを実装しようとしています。私が間違っていなければ、その関数の導関数は x > 0 の場合は 1 で、x < 0 の場合は 0 です。この導関数を使用すると、ネットワークはまったく学習しません。他の例を検索すると、ほとんどの場合、X > 0 の 1 を無視して x のままにしておくことがわかりました。これにより、はるかに良い結果が得られます。なぜそうなのか不思議です。

他に間違いがないことを確認するために、1 入力、1 出力、非表示の Neuron Network をトレーニングするためのコードを次に示します。平均二乗誤差を誤差関数として使用します

import random

x = random.uniform(0, 1)
y = random.uniform(0, 1)
w = random.uniform(0, 1)
lr = 0.1

for i in range(500):
    z = x * w
    yP = z
    if yP < 0:
        yP = 0
    loss = (yP - y)**2
    print(i, loss)

    grad_y=2.0*(yP - y)
    grad_z = grad_y
    if z < 0:
        grad_z = 0
    else :
        grad_z = grad_y
    grad_w = grad_z * x
    w -= lr * grad_w

ネットワークのサイズと関係がある可能性は低いことに注意してください。1000 個の入力ニューロン、100 個のニューロンを持つ 1 つの隠れ層、および 10 個の出力ニューロンを含むネットワークでもテストしました。64 エポックと 500 エポックのバッチ サイズを使用しました。同じ問題がありました。

4

1 に答える 1