| 35 | |
| 36 | |
| 37 | def derivative_w2(Z, T, Y): |
| 38 | N, K = T.shape |
| 39 | M = Z.shape[1] # H is (N, M) |
| 40 | |
| 41 | # # slow |
| 42 | # ret1 = np.zeros((M, K)) |
| 43 | # for n in xrange(N): |
| 44 | # for m in xrange(M): |
| 45 | # for k in xrange(K): |
| 46 | # ret1[m,k] += (T[n,k] - Y[n,k])*Z[n,m] |
| 47 | |
| 48 | # # a bit faster - let's not loop over m |
| 49 | # ret2 = np.zeros((M, K)) |
| 50 | # for n in xrange(N): |
| 51 | # for k in xrange(K): |
| 52 | # ret2[:,k] += (T[n,k]* - Y[n,k])*Z[n,:] |
| 53 | |
| 54 | # assert(np.abs(ret1 - ret2).sum() < 0.00001) |
| 55 | |
| 56 | # # even faster - let's not loop over k either |
| 57 | # ret3 = np.zeros((M, K)) |
| 58 | # for n in xrange(N): # slow way first |
| 59 | # ret3 += np.outer( Z[n], T[n] - Y[n] ) |
| 60 | |
| 61 | # assert(np.abs(ret1 - ret3).sum() < 0.00001) |
| 62 | |
| 63 | # fastest - let's not loop over anything |
| 64 | ret4 = Z.T.dot(T - Y) |
| 65 | # assert(np.abs(ret1 - ret4).sum() < 0.00001) |
| 66 | |
| 67 | return ret4 |
| 68 | |
| 69 | |
| 70 | def derivative_w1(X, Z, T, Y, W2): |