Конвергенция в мелкой нейронной сети - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть один скрытый слой с 5 единицами, входной слой с 10 единицами и одна скалярная единица вывода.Я использую активацию ReLu и на выходном слое нет нелинейности, только взвешенная сумма.Вместо того чтобы использовать существующий код из сети, я подумал, что выведу уравнения.Конвергенция действительно сбивает с толку, и я уверен, что это неправильно.

import numpy as np
import matplotlib.pyplot as plt
import math

d = 10
m = 5
alp = 1e-2
W1 = np.random.randn(m,d)
W2 = np.random.randn(1,m)
a0 = np.random.randn(d,1)
b1 = np.random.randn(m,1)
b2 = np.random.randn(1,1)
y = np.random.randn(1,1)

def compute_loss(y,a2):
       return np.sum(np.power(y-a2,2))/2

def gradient_step(W1,W2,b1,b2,a1,a2,z1):
    W2 += alp*(y-a2)*a1.transpose()
    b2 += (y-a2)
    a1_deriv = np.array(reluDerivative(z1))
    b1 += (y-a2)*(np.matmul(W2,np.diagflat(a1_deriv))).transpose()
    W1 += (y-a2)*(a0.dot(W2).dot(np.diagflat(a1_deriv))).transpose()
    return W1,W2,b1,b2,a1,a2,z1

def reluDerivative(x):
     x[x<=0] = 0
     x[x>0] = 1
     return x

loss_vec = []
num_iterations = 50

for i in range(num_iterations):
    z1 = np.matmul(W1,a0)+b1
    a1 = np.maximum(0,z1)
    a2 = np.matmul(W2,a1)+b2
    loss_vec.append(compute_loss(y,a2))
    W1,W2,b1,b2,a1,a2,z1 = gradient_step(W1,W2,b1,b2,a1,a2,z1)
plt.plot(loss_vec)

enter image description here

...