реализация векторизованного обратного распространения, не сходящаяся - PullRequest
0 голосов
/ 03 сентября 2018

Я действительно новичок в машинном обучении и прошел до 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))

Пожалуйста, любая помощь с этим была бы очень признательна, я очень новичок, но очень хотел бы понять, как реализовать это с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...