La intersección de la física de muchos cuerpos y el aprendizaje profundo ha abierto una nueva frontera: los estados neuronales cuánticos (NQS). Mientras que los métodos tradicionales luchan con sistemas frustrados de alta dimensión, el mecanismo de atención global de Transformers proporciona una herramienta poderosa para capturar correlaciones cuánticas complejas.
En este tutorial, implementamos una tubería Variational Monte Carlo (VMC) de grado de investigación utilizando NetKet y JAX para resolver la frustrada cadena de espín de Heisenberg J1-J2. Lo haremos:
Cree una arquitectura NQS personalizada basada en Transformer. Optimice la función de onda mediante la reconfiguración estocástica (descenso de gradiente natural). Compare nuestros resultados con la diagonalización exacta y analice las fases cuánticas emergentes.
Al final de esta guía, tendrá un marco de simulación escalable y físicamente conectado capaz de explorar el magnetismo cuántico más allá del alcance de los métodos exactos clásicos.
para i en el rango (L): bordes.append([i, (i+1)%L, 1]) bordes.append([i, (i+2)%L, 2]) g = nk.graph.Graph(bordes=bordes) hi = nk.hilbert.Spin(s=0.5, N=L, total_sz=total_sz) sigmaz = np.array([[1,0],[0,-1]], dtype=np.float64) mszsz = np.kron(sigmaz, sigmaz) exchange = np.array(
[[0,0,0,0],
[0,0,2,0],
[0,2,0,0],
[0,0,0,0]], dtype=np.float64 ) bond_ops = [
(J1*mszsz).tolist(),
(J2*mszsz).tolist(),
(-J1*exchange).tolist(),
(J2*exchange).tolist(),
]
colores_bonos = [1,2,1,2]
H = nk.operator.GraphOperator(hola, g, bond_ops=bond_ops, bond_ops_colors=bond_colors) devuelve g, hola, H
Instalamos todas las bibliotecas necesarias y configuramos JAX para un cálculo estable de alta precisión. Definimos el hamiltoniano de Heisenberg frustrado J1-J2 utilizando una representación gráfica de colores personalizada. Construimos el espacio de Hilbert y GraphOperator para simular eficientemente sistemas de espín que interactúan en NetKet.
Implementamos un estado cuántico neuronal basado en Transformer usando Flax. Codificamos configuraciones de giro en incrustaciones, aplicamos bloques de autoatención de múltiples capas y agregamos información global mediante la agrupación. Generamos una amplitud logarítmica compleja, lo que permite que nuestro modelo represente funciones de onda de muchos cuerpos altamente expresivas.
def run_vmc(L, J2, n_iter=250): g, hola, H = make_j1j2_chain(L, J2, total_sz=0.0) modelo = TransformerLogPsi(L=L) sampler = nk.sampler.MetropolisExchange( hilbert=hi, graph=g, n_chains_per_rank=64 ) vs = nk.vqs.MCState( muestreador, modelo, n_samples=4096, n_discard_per_chain=128 ) opt = nk.optimizer.Adam(learning_rate=2e-3) sr = nk.optimizer.SR(diag_shift=1e-2) vmc = nk.driver.VMC(H, opt, variacional_state=vs, preconditioner=sr) log = vmc.run(n_iter=n_iter, out=Ninguno) energía = np.array(log[“Energy”][“Mean”]) var = np.array(registro[“Energy”][“Variance”]) retorno vs, energía, var
Definimos el factor de estructura observable y el punto de referencia de diagonalización exacto para la validación. Implementamos la rutina completa de capacitación de VMC utilizando el muestreo MetropolisExchange y la reconfiguración estocástica. Devolvemos matrices de energía y varianza para que podamos analizar la convergencia y la precisión física.
picos_estructura = []
para J2 en tqdm(J2_values): vs, e, var = run_vmc(L, J2) energías.append(e[-1]) q, Sq = factor_estructura(vs, L) picos_estructura.append(np.max(Sq))
picos_estructura = []
para J2 en tqdm(J2_values): vs, e, var = run_vmc(L, J2) energías.append(e[-1]) q, Sq = factor_estructura(vs, L) picos_estructura.append(np.max(Sq))
Analizamos múltiples valores de J2 para explorar el diagrama de fases frustrado. Entrenamos un estado variacional separado para cada fuerza de acoplamiento y registramos la energía final. Calculamos el pico del factor de estructura para cada punto para detectar posibles transiciones de orden.
print(“Energía ED (L=14):”, E_ed) print(“Energía VMC:”, E_vmc) print(“Brecha Abs:”, abs(E_vmc – E_ed)) plt.figure(figsize=(12,4)) plt.subplot(1,3,1) plt.plot(e_small) plt.title(“Convergencia de energía”) plt.subplot(1,3,2) plt.plot(J2_values, energías, ‘o-‘) plt.title(“Energía vs J2”) plt.subplot(1,3,3) plt.plot(J2_values, Structure_peaks, ‘o-‘) plt.title(“Pico del factor de estructura”) plt.tight_layout() plt.show()
Comparamos nuestro modelo con la diagonalización exacta en un tamaño de red más pequeño. Calculamos la brecha de energía absoluta entre VMC y ED para evaluar la precisión. Visualizamos el comportamiento de convergencia, las tendencias de la energía de fase y las respuestas de los factores de estructura para resumir los conocimientos físicos que obtenemos.
En conclusión, integramos arquitecturas neuronales avanzadas con técnicas cuánticas de Monte Carlo para explorar el magnetismo frustrado más allá del alcance de los métodos exactos de sistemas pequeños. Validamos nuestro ansatz de Transformer contra la diagonalización de Lanczos, analizamos el comportamiento de convergencia y extrajimos observables físicamente significativos, como picos de factores de estructura, para detectar transiciones de fase. Además, establecimos una base flexible que podemos extender hacia redes de dimensiones superiores, estados proyectados de simetría, diagnósticos de entrelazamiento y simulaciones cuánticas dependientes del tiempo.
Consulte los códigos de implementación completos aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 130.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.
¿Necesita asociarse con nosotros para promocionar su repositorio de GitHub O su página principal de Hugging O su lanzamiento de producto O seminario web, etc.? Conéctate con nosotros