Я действительно новичок в машинном обучении и прошел до 5-й недели в курсовом курсе Эндрю Нга по машинному обучению, где мы применяем обратное распространение к набору данных mnist. Но я хотел попробовать реализовать векторизованную версию с нуля в python.
Я очень долго пытался и просто не понимаю, почему стоимость, которую я получаю, невероятно медленно сходится и остается на очень высоком уровне. (т. е. 1-й шаг: 137336,70 2-й шаг: 137203,66).
Я не могу снизить стоимость до разумного уровня, и мне кажется, что я неправильно внедряю алгоритм обратной проверки, когда обновляю свои веса и смещения. Я немного запутался с размерами, а также с функциями, которые я использую, я пытаюсь использовать функцию SoftMax для выходного слоя и tanh для скрытых слоев. выходной сигнал представляет собой матрицу (m, 10), поскольку он кодируется в горячем виде.
Я посмотрел это видео для справки при реализации векторизованной реализации https://youtu.be/7bLEWDZng_M
m = len(y_train)
w1 = np.random.rand(784,25)
b1 = np.ones((59999))
w2 = np.random.rand(25,10)
b2 = np.ones((59999))
#X is a (59999, 784) matrix
# is a (59999, 10) matrix
# W1 is (25,784)
#W2 is (10,25)
alpha = 0.1
for i in range(2000):
#forward prop
Z1 = W1.dot(X) + b1
A1 = tan_h(Z1)
Z2 = W2.dot(A1) + b2
A2 = softmax(Z2)
#back prop
dz2 = A2 - Y
dW2 = (1/m) * dz2.dot(A1.T)
db2 = (1/m) * np.sum(dz2, axis=1, keepdims = True)
dz1 = W2.T.dot(dz2) * tan_h_p(Z1)
dW1 = (1/m) * dz1.dot(X.T)
db1 = (1/m) * np.sum(dz1, axis=1, keepdims=True)
W1 = W1 - alpha*dW1
b1 = b1 - db1
W2 = W2 - alpha*dW2
b2 = b2 - db2
if i % 250 == 0:
print(calc_cost(Y,A2))
Пожалуйста, любая помощь с этим была бы очень признательна, я очень новичок, но очень хотел бы понять, как реализовать это с нуля.