def RNN_back_prop(X, Y, parameters, cache): # Initialize gradients as an empty dictionary grads = {} # Retrieve from cache and parameters (y_hat, a, x) = cache W_aa = parameters['W_aa'] W_ax = parameters['W_ax'] W_ya = parameters['W_ya'] b_y = parameters['b_y'] b = parameters['b'] # Initialize gradients grads['dW_ax'], grads['dW_aa'], grads['dW_ya'] = np.zeros_like(W_ax), np.zeros_like(W_aa), np.zeros_like(W_ya) grads['db'], grads['db_y'] = np.zeros_like(b), np.zeros_like(b_y) grads['da_next'] = np.zeros_like(a[0]) # Backpropagate through timesteps for t in reversed(range(len(X))): dy = np.copy(y_hat[t]) dy[Y[t]] -= 1 grads = RNN_back_prop_step(dy, grads, parameters, x[t], a[t], a[t-1]) return grads, a