张量网络碎碎念:CGC

news2024/11/26 14:39:50

在本系列 上一篇文章 中,我介绍了张量网络的一些基础概念。其中很大一部分来自 github 上一个教程。事实上,该教程的大部分内容来自 e3nn 官网。
除了上篇文章介绍的一些可视化技巧,官网还提供了其他一些可视化模块。使用这些功能能使我们更深入理解张量网络中的种种细节。其中,本人觉得最实用的功能就是张量积通路的可视化。(事实上,我只看懂这一个hhh)
下面就张量积为例介绍:
e3nn 中的张量积形式是 CGC 矩阵实现的,用户无需关注计算细节,只需提供输入向量及其表征即可:

import os

import matplotlib.pyplot as plt
from e3nn import o3


irreps1 = o3.Irreps("1x1e")
irreps2 = o3.Irreps("1x1e")

tp = o3.FullTensorProduct(irreps1, irreps2)
print(tp)
tp.visualize()
plt.show()

input1 = irreps1.randn(-1)
input2 = irreps2.randn(-1)
results = tp(input1, input2)
print(results)

其中

tp.visualize()

是 e3nn 内置的可视化通道,本例中,我们没有对输出张量的格式做限定,所以输出张量最低价是 1-1=0,最高价是 1+1=2

在这里插入图片描述
我们随机初始化符合输入表征的两个输入向量,并将其填入预先划定好的 tp 通道,即可得到最终的张量积结果:

input1 = irreps1.randn(-1)
input2 = irreps2.randn(-1)
results = tp(input1, input2)
print(results)

可以看到,使用 e3nn ,我们轻松完成了一次张量积。事实上,在张量积背后,e3nn 是使用 CGC 完成的计算。这导致张量积一直以来造成性能瓶颈,据说是 O(Lmax^6),导致诸多张量网络不敢增加 Lmax 值。
如何优化张量积计算,解决性能瓶颈,目前主流的算法是绕开 CGC 模式,从 SO3 降到 SO2 (eSCN)。
本文将先关注 CGC,试图回答,CGC 做了什么?
首先,CGC 公式如下:
在这里插入图片描述
等式左边:
x, y 分别是输入张量,做直积。但是直积的结果有很多项,有很多的角动量,每个角动量下面有磁动量。
具体来说,
|l1-l2
在确定了角动量后,磁动量的取值范围是
在这里插入图片描述
在本例中,两输入均为 1e,所以张量积结果的角动量在 0,1,2 间,如上图可视化所示。
每一个角动量,对应不同的磁动量,所以等式左边一共会有 1+3+5=9 种 (l3, m3) 组合。
在确定了 (l3, m3) 以后(9选1),由于
在这里插入图片描述
等式左边固定,等式右边仅剩下 m1, m2 两个可变参数(取值范围跟 l1, l2 有关,本例中是 0, +1, -1),这也是大大的求和符号的存在意义:
对于特定的 (l3, m3) ,我们需要遍历 m1, m2,在遍历的过程中,我们根据 m1, m2 索引 x,y,将其内积,最后再根据 m1, m2 以及前面固定的 (l3, m3, l1, l2) ,我们能求出 CGC 系数,将其和内积结果拼到一起即可。
最终,我们将所有内积结果加在一起,即可得到等式左边的值,的其中一项。我们重复固定 (l3, m3) ,最终能求出全部张量结果。
为了验证这一想法,我们使用 sympy 里的 cgc 模块,求出 cgc ,再进行拼凑。
全部代码如下:

import os

import matplotlib.pyplot as plt
from e3nn import o3
from sympy import S
from sympy.physics.quantum.cg import CG


def clebsch_gordan_coefficients(l1, m1, l2, m2, l, m):
    cg = CG(S(l1), S(m1), S(l2), S(m2), S(l), S(m)).doit()
    return float(cg)


irreps1 = o3.Irreps("1x1e")
irreps2 = o3.Irreps("1x1e")

tp = o3.FullTensorProduct(irreps1, irreps2)
print(tp)
tp.visualize()
plt.show()

input1 = irreps1.randn(1, -1)
input2 = irreps2.randn(1, -1)
results = tp(input1, input2)

# Possible values of total angular momentum J and its projection M
total_angular_momenta = [(0, 0), (1, 1), (1, 0), (1, -1), (2, 0), (2, 2), (2, 1), (2, -1), (2, -2)]
all_cgc_results = []
for idx, (l3, m3) in enumerate(total_angular_momenta):
    sub_results = []
    for idx1, m1 in enumerate([-1, 1, 0]):
        for idx2, m2 in enumerate([-1, 1, 0]):
            # print(f"x(l1=1, m1={m1}), y(l1=1, m2={m2}) for l3={l3}, m3={m3}")
            coefficient = clebsch_gordan_coefficients(l1=1, l2=1, m1=m1, m2=m2, l=l3, m=m3)
            # print(f"Clebsch-Gordan Coefficient for (l1=1, m1={m1}, l2=1, m2={m2}, l={l3}, m={m3}): {coefficient}")
            a_sub_result = coefficient * input1[0][m1] * input2[0][m2]
            sub_results.append(a_sub_result)
    sum_sub_results = sum(sub_results)
    print(f'The l={l3}, m={m3} has been iterated. \n'
          f'The tp results provided by e3nn is {results[0][idx]}.\n'
          f'The tp results computed with assistance of CGC is {sum_sub_results}')
    all_cgc_results.append(round(float(sum_sub_results), 4))
print('\nThe tp results:\n')
print(results)
print('\nThe cgc results:\n')
print(all_cgc_results)

结果如下:

The tp results:

tensor([[ 0.7047,  1.3212, -0.5690,  0.1757,  0.5107,  0.6395,  1.0796,  1.0922,
         -0.2554]])

The cgc results:

[0.8071, -0.1757, 1.3212, 0.569, 0.7504, 1.2884, 0.6395, 0.5107, -0.2145]

其中 9 个数中 5 个数字的绝对值是完全吻合的,顺序是颠倒的,未能全部复现成功可能因为,磁动量的顺序在不同的程序包中不一致,以及其他索引,倍数差异等问题。尽管如此,我们复现出了绝对值完全一致的结果,证明了 e3nn 内部的黑箱是按照 CGC 模式进行计算的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1938570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows USB 设备驱动开发-开发Type C接口的驱动程序(三)

编写 USB Type C 端口控制器驱动程序 如果 USB Type-C 硬件实现 USB Type-C 或电源传送 (PD) 物理层,但未实现供电所需的状态机,则需要编写 USB Type-C 端口控制器驱动程序。 在 Windows 10 版本 1703 中,USB Type-C 体系结构已得到改进&am…

云监控(华为) | 实训学习day5(10)

Gaussdb安装和连接idea GaussDB的安装 首先关闭防火墙 systemctl disable firewalld.service 永久关闭防火墙(发生在下次启动) systemctl stop firewalld.service 关闭本次防火墙 查看防火墙状态systemctl status firewalld.service 查询的状态是Dead表…

【算法】百钱买百鸡问题算法详解及多语言实现

问题描述 百钱买百鸡问题是一个经典的数学问题,题目要求用100文钱买100只鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,问公鸡、母鸡、小鸡各买多少只? 目录 问题描述​编辑 解决方案 Python实现 Ja…

选择Maya进行3D动画制作与渲染的理由

如果你对3D动画充满热情并追求成为专业3D动画师的梦想,你一定听说过Maya——近年来3D动画的行业标准。Maya被3D艺术家广泛使用,你是否想知道为什么Maya总是他们的首选?下面一起来了解下。 一、什么是Maya? 由Autodesk开发的Maya是…

wxid转微信号

7.21由于微信的再一次调整,能够转出微信号的接口已经和谐,根据客户要求琢磨了几个小时 发现新的接口也是可以批量转换的

springcolud学习06Hystrix

Hystrix Hystrix是Netflix开发的一个用于处理分布式系统中延迟和容错问题的库。它主要用于防止分布式系统中的雪崩效应,通过在服务之间添加延迟容错和故障处理机制来增强系统的弹性。 服务熔断 类似于电路中的断路器,当失败率超过阈值时,Hystrix 可以自动地开启断路器,停…

c++习题12-开关灯

目录 一,题目 二,思路 三,代码 一,题目 用例输入 1 10 10 用例输出 1 1,4,9 二,思路 创建可以存放路灯亮灭情况的数组,路灯的编号从1开始,因此在使用for循环去初始化数组时&#xff…

初识模板【C++】

P. S.:以下代码均在VS2022环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

编写小程序用什么软件

编写小程序时,可以使用多种软件或工具,这些工具通常提供了丰富的开发功能和组件,方便开发者进行小程序的创建、开发和调试。以下是一些常用的编写小程序的软件和工具: DIY官网可视化工具 可视化拖拽开发神器|无须编程 零代码基础…

HashMap原理详解,HashMap源码解析

HashMap是一个数组链表和红黑树的结合体 HashMap的第一层表现是数组,HashMap默认创建一个长度为十六的数组来储存数据,但不同的是,它并非是先放在第0个索引,然后第一个索引那么放置,而是通过key获取对应的32位hash值&a…

OAuth2.0 or Spring Session or 单点登录流程

1.社交登录 2.微博社交登录 第三方登录 1.登录微博 2.点击网站接入 3.填写完信息,到这里,写入成功回调 和 失败回调 是重定向,所以可以写本地的地址 3.认证 分布式Session spring-session 域名不一样 发的 jSessionId 就不同&#xff0c…

uniapp,vue3上传图片组件封装

首先创建一个 components 文件在里面进行组件的创建 下面是 vip组件的封装 也就是图片上传组件 只是我的命名是随便起的 <template><!--图片 --><view class"up-page"><!--图片--><view class"show-box" v-for"(item,ind…

STM32的串口(RS485)数据收发

一、前言 我们的单片机串口一般常用RS232、RS485、TTL这几种通讯方式&#xff0c;日常调试可能RS232、TTL比较多&#xff0c;真正和其它厂家数据交互的时候&#xff0c;还是RS485用的比较多&#xff0c;因为它是差分信号等电气属性&#xff0c;所以比较稳定&#xff0c;传输距…

Matlab演示三维坐标系旋转

function showTwo3DCoordinateSystemsWithAngleDifference() clear all close all % 第一个三维坐标系 origin1 [0 0 0]; x_axis1 [1 0 0]; y_axis1 [0 1 0]; z_axis1 [0 0 1];% 绕 x 轴旋转 30 度的旋转矩阵 theta_x 30 * pi / 180; rotation_matrix_x [1 0 0; 0 cos(th…

SpringBoot使用本地缓存——Caffeine

SpringBoot使用本地缓存——Caffeine 缓存&#xff0c;想必大家都用过&#xff0c;将常用的数据存储在缓存上能在一定程度上提升数据存取的速度。这正是局部性原理的应用。之前用的缓存大多是分布式的&#xff0c;比如Redis。使用Redis作为缓存虽然是大多数系统的选择&#xf…

基于重要抽样的主动学习不平衡分类方法ALIS

这篇论文讨论了数据分布不平衡对分类器性能造成的影响,并提出了一种新的有效解决方案 - 主动学习框架ALIS。 1、数据分布不平衡会影响分类器的学习性能。现有的方法主要集中在过采样少数类或欠采样多数类,但往往只采用单一的采样技术,无法有效解决严重的类别不平衡问题。 2、论…

【Datawhale AI 夏令营】CV图像竞赛——Deepfake攻防

【Datawhale AI 夏令营】CV图像竞赛——Deepfake攻防 从零入门CV图像竞赛(Deepfake攻防) 是 Datawhale 2024 年 AI 夏令营第二期 的学习活动&#xff08;“CV图像”方向&#xff09;&#xff0c;基于蚂蚁集团举办的“外滩大会-全球Deepfake攻防挑战赛”开展的实践学习 ​ 这几天…

Mysql深入讲解(索引、事务、锁机制)

一、MySQL索引 1、何为索引&#xff1f; MySQL中的索引是一种数据结构&#xff0c;用于加快对数据库表中数据的查询速度【查询速度提升】。它类似于书本目录&#xff0c;使得用户可以根据特定字段快速定位到所需的数据行&#xff0c;而无需扫描整个表。 2、索引分类 Hash索…

C 语言回调函数

回调函数的概念 您的理解是正确的。pFunCallBack 是一种函数指针类型&#xff0c;它定义了函数的签名&#xff08;即函数的参数类型和返回类型&#xff09;。当我们说 pFunCallBack pFun&#xff0c;我们是在声明一个变量 pFun&#xff0c;其类型是 pFunCallBack —— 即一个函…

【D3.js in Action 3 精译_018】2.4 向选择集添加元素

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本章小结 第二章…