# Add gradient from next step to current output gradient dh = np.dot(self.why.T, dy) + dh_next dh_ = dh * z * self.dtanh(h_) dz = dh * (h_ - h_prev) * self.dsigmoid(z) dr = np.dot(self.wh[:, :self.hidden_size].T, dh_) * h_prev * self.dsigmoid(r)