Я пытаюсь реализовать обратное распространение с помощью ReLU в качестве функции активации. Если я не ошибаюсь, производная этой функции равна 1 при x > 0 и 0 при x ‹ 0. Используя эту производную, сеть вообще не обучается. При поиске других примеров я обнаружил, что большинство из них игнорируют часть 1 вместо X > 0 и просто оставляют значение x, что приводит к гораздо лучшим результатам. Интересно, почему это так?
Чтобы убедиться, что нет других ошибок, вот код для обучения 1 входу, 1 выходу без скрытой нейронной сети. Я использую среднеквадратичную ошибку в качестве функции ошибки
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 входными нейронами, 1 скрытым слоем со 100 нейронами и 10 выходными нейронами. Я использовал размер партии 64 и 500 эпох. Была такая же проблема.