活性化関数として 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 エポックのバッチ サイズを使用しました。同じ問題がありました。