Advanced Computing Platform for Theoretical Physics

test_grad.py 1.54 KB
Newer Older
Lei Wang's avatar
Lei Wang committed
1
'''
Lei Wang's avatar
Lei Wang committed
2
Different ways of computing gradient of infinite matrix product trace 
Lei Wang's avatar
Lei Wang committed
3
4
5
6
7
8
9
Z = Tr(T*T...*T)
'''

import torch 
torch.manual_seed(42)

N = 10
Lei Wang's avatar
Lei Wang committed
10
11
Niter = 30
A = torch.randn(N, N, dtype=torch.float64)
Lei Wang's avatar
Lei Wang committed
12
13
14
15
16
17
18
19
20
T = torch.nn.Parameter(A@A.t()) # a symmetric positive definite transfer matrix 

lnZ = 0.0 
M = T.clone() # M is the converged envioment tensor
for i in range(Niter):
    s = M.norm() 
    lnZ = lnZ + torch.log(s)/2**i
    M = M/s
    M = M@M 
Lei Wang's avatar
Lei Wang committed
21
lnZ = lnZ + torch.log(torch.trace(M))/(2**Niter)
Lei Wang's avatar
Lei Wang committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

#(1) impurity grad 
impurity_grad = (M@M).t()/torch.trace(M@T@M)

#(2) autograd on lnZ
lnZ.backward()
lnZ_grad = T.grad.clone()

#(3) direct compute dominant eigenvalue 
w, v = torch.symeig(T, eigenvectors=True)
T.grad.zero_()
loss = torch.log(w[-1])
loss.backward()
exact_grad = ((T.grad + T.grad.t())/2) # need to symmetrize since it is an upper triangular matrix

Lei Wang's avatar
Lei Wang committed
37
# (4) use leading eigenvector of the transfer matrix $T$
Lei Wang's avatar
Lei Wang committed
38
39
#c.f. sec.3.1  https://people.maths.ox.ac.uk/gilesm/files/NA-08-01.pdf
#or, HF theorem 
Lei Wang's avatar
Lei Wang committed
40
41
eigenvector_grad= torch.ger(v[:,-1], v[:, -1])/w[-1] # outer product of the leading eigenvector and its transpose

Lei Wang's avatar
Lei Wang committed
42
43
44
45
46
47
48
49
50
51
52
53
54
#(5) lnZ using envioment 
w, v = torch.symeig(T, eigenvectors=True)
T.grad.zero_()

#try this 
e = v[:, -1] #environment
#and this 
#e = v[:, -1].detach() #environment

loss = torch.log(e@T@e) 
loss.backward()
environment_grad = T.grad.clone()

Lei Wang's avatar
Lei Wang committed
55
56
print ((impurity_grad-exact_grad).abs().max().item())
print ((lnZ_grad-exact_grad).abs().max().item())
Lei Wang's avatar
Lei Wang committed
57
print ((eigenvector_grad-exact_grad).abs().max().item())
Lei Wang's avatar
Lei Wang committed
58
print ((environment_grad-exact_grad).abs().max().item())