[e3nn] 等变神经网络 | 线性层o3.Linear | 非线性nn.Gate

第4章:等变神经网络模块

欢迎回来~

在我们探索e3nn的旅程中,我们已经揭示了一些基本概念:

  • 在第1章:不可约表示(Irreps)中,我们学习了Irreps作为等变数据的标签,告诉我们数据在旋转和反射下如何变换。
  • 在第2章:球谐函数中,我们看到了这些抽象的Irreps如何通过方向性的"波模式"具体表示。
  • 在第3章:张量积中,我们发现了e3nn如何结合不同的Irreps来创建新的、更复杂的等变特征。

现在,我们有了这些惊人的构建块。但我们如何实际构建一个神经网络呢?在传统神经网络中,我们有"层",如Linear变换和激活函数(如ReLU或Sigmoid)。我们如何创建这些层的等变版本?

这就是等变神经网络模块的用武之地。

这些是您用来构建一个固有尊重3D对称性的神经网络的实际构建块。

它们在底层利用IrrepsTensorProduct来确保当输入旋转或反射时,网络的输出正确变换,就像物理定律一样。

本章的目标是理解如何使用e3nn来创建:

  1. 一个等变线性变换,类似于torch.nn.Linear层。
  2. 一个等变非线性(激活函数),类似于torch.nn.ReLU

让我们开始吧~

等变线性层:e3nn.o3.Linear

就像标准线性层将其输入乘以权重矩阵一样,e3nn.o3.Linear层对其输入特征执行线性变换。

关键区别在于它以等变的方式执行。

e3nn.o3.Linear的功能

e3nn.o3.Linear层接受由irreps_in描述的输入特征,并将其转换为由irreps_out描述的输出特征。

关键约束是Linear层只能组合相同Irrep类型的组件。

例如,输入中的所有0e组件可以贡献给输出中的所有0e组件,输入中的所有1o组件可以贡献给输出中的所有1o组件。但0e输入不能通过简单的线性层变为1o输出。

这确保了数据的基本对称属性得以保留。

可以把它想象成整理袜子:

可以将白袜子与其他白袜子组合,彩色袜子与其他彩色袜子组合。

但不能通过简单的重新排列将白袜子"变成"彩色袜子。e3nn.o3.Linear保持了这些"类型"

如何使用e3nn.o3.Linear

通过使用不可约表示(Irreducible Representations)对象指定其irreps_inirreps_out来定义e3nn.o3.Linear层。

import torch
from e3nn import o3# 定义输入数据的Irreps:
# 一个标量(0e)和一个向量(1o)的混合
irreps_in = o3.Irreps("0e + 1o")
print(f"输入Irreps: {irreps_in}")# 创建符合这些Irreps的随机输入数据
x = irreps_in.randn(10, -1) # 10个样本,其中-1被irreps_in.dim(4)替换
print(f"输入数据形状: {x.shape}")# 定义输出数据的Irreps:
# 两个标量(0e)和两个向量(1o)的混合
irreps_out = o3.Irreps("2x0e + 2x1o")
print(f"输出Irreps: {irreps_out}")# 创建一个将'irreps_in'数据转换为'irreps_out'数据的线性层
# e3nn确保此层尊重旋转/反射
linear_layer = o3.Linear(irreps_in=irreps_in, irreps_out=irreps_out)
print(f"\n线性层创建: {linear_layer}")# 将线性层应用于输入数据
y = linear_layer(x)
print(f"输出数据形状: {y.shape}")

输出:

输入Irreps: 1x0e+1x1o
输入数据形状: torch.Size([10, 4])
输出Irreps: 2x0e+2x1o线性层创建: Linear(1x0e+1x1o -> 2x0e+2x1o | 10 weights)
输出数据形状: torch.Size([10, 8])

如所见,Linear层成功地将输入(维度4)转换为输出(维度8),就像常规的torch.nn.Linear一样。

e3nn的魔力在于这种转换保证是等变的

底层实现:e3nn.o3.Linear

当创建e3nn.o3.Linear层时,e3nn智能地确定输入Irreps的哪些部分可以连接到输出Irreps的哪些部分。

具体来说,它知道只有相同lpIrrep可以连接

在这里插入图片描述

  1. 连接逻辑e3nn识别irreps_inirreps_out之间所有可能的连接,其中Irrep类型(如0e0e1o1o)匹配。
  2. 权重分配:对于每个有效连接,它分配一个可学习的权重矩阵。此矩阵的大小取决于输入和输出Irrepsmultiplicity。例如,如果输入中有2x0e,输出中有3x0e,则需要一个2x3权重矩阵用于该连接。
  3. 高效计算e3nn的内部代码(在e3nn/o3/_linear.py中)生成高度优化的torch.einsum操作,而不是手动拆分输入并为每个Irrep类型应用矩阵乘法。einsum是一个强大的函数,允许简洁高效的张量收缩,有效地执行给定输入张量所需的所有乘法和求和,确保等变性和良好的性能。

Linear模块确保每个输入Irrep组件(mul_in x ir_in)仅当ir_in == ir_out时转换为每个输出Irrep组件(mul_out x ir_out)。然后使用大小为mul_in x mul_out的权重矩阵进行此转换。

等变非线性:e3nn.nn.Gate

非线性对于神经网络学习复杂模式至关重要。

然而,直接将标准激活函数(如ReLU或Sigmoid)应用于向量组件会破坏等变性。

如果旋转一个向量(x, y, z),然后对每个组件应用ReLU,这与先应用ReLU再旋转不同。

e3nn.nn.Gate模块提供了一种巧妙的方式引入非线性,同时严格保持等变性。

e3nn.nn.Gate的功能

Gate通过将高阶Irreps(如向量,l=1,或张量,l=2)与标量0e Irreps的组件)相乘来实现非线性,这些标量首先通过标准激活函数传递。

可以这样理解:

  • **标量(0e Irreps)**可以直接应用正常激活函数(如tanhsigmoidrelu),因为标量在旋转下不会改变。
  • **高阶Irrepsl > 0)**不能直接应用标准激活。相反,e3nn.nn.Gate使用另一个标量(我们称之为"门")来乘以这些高阶Irreps。这种乘法缩放高阶特征,但不改变其方向或旋转方式。就像灯的调光器开关——它改变亮度(大小),但不改变光的颜色或方向。

这种标量乘法是张量积的特殊情况:0e x Irrep -> Irrep。当您将标量乘以任何其他Irrep时,结果Irrep具有与非标量Irrep相同的lp。这就是如何保持等变性。

如何使用e3nn.nn.Gate

code: https://github.com/lvy010/AI-exploration/tree/main/neural_network

Gate模块接受五个主要参数:

  • irreps_scalars:仅作为标量并接收直接激活的特征的Irreps
  • act_scalarsirreps_scalars的激活函数列表。
  • irreps_gates:用作"门"的特征的Irreps。这些必须是标量(0e)并接收直接激活。
  • act_gatesirreps_gates的激活函数列表。
  • irreps_gated:将被激活门乘以的特征的Irrepsirreps_gates中的Irrep组数必须匹配irreps_gated
import torch
from e3nn import o3
from e3nn.nn import Gate# 示例:假设输入特征是两个标量和一个向量
# 输入将是:1x0e(标量特征)+ 1x0e(门标量)+ 1x1o(向量特征)
irreps_in = o3.Irreps("1x0e + 1x0e + 1x1o")
x = irreps_in.randn(1, -1)
print(f"输入Irreps: {irreps_in}")
print(f"输入数据形状: {x.shape}")# 定义Gate模块:
# - 第一个0e将直接激活(无门控)。
# - 第二个0e将被激活并用作门。
# - 1o将由激活的第二个0e门控。
equivariant_gate = Gate(irreps_scalars="1x0e",       # 一个0e标量act_scalars=[torch.tanh],    # 对其应用tanhirreps_gates="1x0e",         # 一个0e标量作为门act_gates=[torch.sigmoid],   # 对门标量应用sigmoidirreps_gated="1x1o"          # 一个1o向量被门控
)
print(f"\n等变Gate创建: {equivariant_gate}")
print(f"输出Irreps: {equivariant_gate.irreps_out}")# 将Gate应用于输入数据
y = equivariant_gate(x)
print(f"输出数据形状: {y.shape}")# 让我们手动拆分输入以检查输出(简化说明)
# scalars_input = x[:, irreps_in.slices_by_irreps[0]]
# gates_input = x[:, irreps_in.slices_by_irreps[1]]
# gated_input = x[:, irreps_in.slices_by_irreps[2]]# print(f"\n(手动说明):")
# print(f"激活标量: {torch.tanh(scalars_input)}")
# print(f"激活门: {torch.sigmoid(gates_input)}")
# print(f"门控向量: {torch.sigmoid(gates_input) * gated_input}")

输出:

输入Irreps: 1x0e+1x0e+1x1o
输入数据形状: torch.Size([1, 5])等变Gate创建: Gate(1x0e+1x0e+1x1o -> 1x0e+1x1o)
输出Irreps: 1x0e+1x1o
输出数据形状: torch.Size([1, 4])

注意输出Irreps 1x0e+1x1o如何组合激活的irreps_scalars和被irreps_gates乘以后的irreps_gated

irreps_gates本身不出现在输出中,因为它们在乘法中被消耗。总维度从5缩小到4(1x0e(激活标量)+ 1x1o(门控向量))

底层实现:e3nn.nn.Gate

e3nn.nn.Gate模块(位于e3nn/nn/_gate.py)执行以下步骤:

在这里插入图片描述

  1. 特征拆分:首先将输入张量(组合了所有irreps_scalarsirreps_gatesirreps_gated组件)拆分为其相应部分。这是由内部_Sortcut实用程序处理的,以高效提取张量的正确部分。
  2. 标量激活irreps_scalarsirreps_gates(均为0e类型)通过标准的e3nn.nn.Activation模块传递,应用其各自的非线性函数(如tanhsigmoid)。
  3. 门控(张量积):然后,激活的标量门与irreps_gated特征逐元素相乘。这是由e3nn.o3.ElementwiseTensorProduct(张量积的一种专门形式)执行的,确保标量-Irrep乘法保持等变性。
  4. 连接:最后,激活的标量和新的"门控"特征被连接在一起,形成输出张量。

这种精心设计的过程允许e3nn在神经网络中引入非线性,而不破坏其等变性的基本承诺

结论

在本章中,学习了构成e3nn网络层的基本等变神经网络模块

  • **e3nn.o3.Linear**执行等变线性变换,连接相同类型的Irreps
  • **e3nn.nn.Gate**以等变方式引入非线性,特别是通过使用激活的标量Irreps来"门控"(乘以)高阶Irreps

这些模块建立在不可约表示(Irreducible Representations)、球谐函数和张量积的概念之上,构建了固有感知3D对称性的神经网络。有了这些工具,现在可以开始组装强大的等变模型。

然而,就像传统神经网络一样,原始特征值可能会剧烈变化,导致训练不稳定。

在下一章中,我们将探索专门为e3nn设计的==归一化技术,以保持特征值的良好行为==。

第5章:归一化

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

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

相关文章

共享云服务器替代传统电脑做三维设计会卡顿吗

与传统本地工作站相比,云服务器在硬件配置、协作效率和成本控制方面具有明显优势,但设计师们比较关心的主要问题始终是:使用共享云服务器进行三维设计会出现卡顿吗?这取决于硬件配置、网络环境、软件优化及使用场景等多方面因素。…

Autosar之CRC模块概述

简介 CRCL模块提供如下的算法,用于对输入数据进行循环冗余校验,用于核对数据传输过程中是否被更改或者传输错误: CRC8: SAEJ1850 CRC8H2F: CRC8 0x2F polynomial CRC16: CCITT-FALSE CRC32: 0xF4ACFB13 CRC32P4: CRC32 0x1F4ACFB13 polynomia…

隐私计算框架PrivacyMagic(密算魔方)

隐私计算框架PrivacyMagic(密算魔方) 动机:写论文时为了实现方案需要调用各种密码学库,写起来有些混乱,失去了代码结构的美感。最可气的是现有的密码学方案基本上是个写个的,接口、类型并不通用&#xff0…

Linux--->网络编程(TCP并发服务器构建:[ 多进程、多线程、select ])

TCP并发服务器构建一、服务器单循环服务器:服务端同一时刻只能处理一个客户端的任务(TCP)并发服务器:服务端同一时刻可以处理多个客户端的任务(UDP)二、TCP服务端并发模型1、多进程进程资源开销大&#xff…

深入解析达梦数据库:模式分类、状态管理与实操指南

达梦数据库(DM Database)作为国产数据库的核心代表,其模式与状态机制是保障数据高可用、实现主备同步的关键基础。无论是日常运维中的数据库配置,还是故障场景下的主备切换,都需要深入理解模式与状态的特性及交互逻辑。…

如何选择适合自己的PHP微服务框架?

在开始选择之前,我们首先要明白:为什么需要微服务框架?传统的单体应用(Monolithic Application)虽然开发简单,但随着业务复杂度的增加,会变得臃肿且难以维护。而微服务架构通过将应用拆分为一组…

ESP32使用场景及大规模物联网IoT

最近用ESP32搭建了一个网络,想知道搭建的网络拓扑对不对。一、物联网无线通信v.s通讯网络无线通信我第一个好奇的问题就是,物联网用ESP32的话,路由器用什么?物联网也可以组WLAN,通讯网也可以组WLAN。把自己的Tenda AC1200路由器拆…

NSSCTF 4th WP

第一次打比赛AK了,虽然题比较简单没啥好说的,但还是想记录一下 WEB ez_signin 源码: from flask import Flask, request, render_template, jsonify from pymongo import MongoClient import reapp Flask(__name__)client MongoClient…

Paimon——官网阅读:主键表

主键表(Table with PK)PK 是 Primary Key(主键)的缩写。在数据库中,主键是一个或多个列的组合,其值在表中是唯一的,并且不能为 NULL。主键的作用是确保每一行记录的唯一性,便于数据的查找、管理和维护&…

【配置 PyCharm 连接远程服务器进行开发和调试的完整流程】

前提条件: 1.PyCharm Professional(社区版不支持远程解释器) 2.代码在本地目录里面,可以同步上传远程服务器 3.宿主机上安装了conda 环境 操作方法: 1、在本地使用PyCharm打开工程代码; 2、然后Add New_in…

在压力测试中如何确定合适的并发用户数?

确定压力测试中的合适并发用户数 在进行压力测试时,确定合适的并发用户数是评估系统性能的关键步骤。并发用户数是指同时向系统发送请求的用户数量,它直接影响系统的负载水平和性能表现。以下是几种常用的方法和考虑因素,用于确定合适的并发…

微算法科技(NASDAQ:MLGO)突破性FPGA仿真算法技术助力Grover搜索,显著提升量子计算仿真效率

在量子计算迅猛发展的今天,量子算法尤其是在搜索和加密领域的应用,正逐步揭开了其颠覆性潜力。然而,量子计算机的实际实现仍是一项复杂且充满挑战的任务,因此,如何在经典计算平台上高效建模和仿真量子算法成为了当前的…

TencentOS Server 4.4 下创建mysql容器无法正常运行的问题

环境 腾讯的 TencentOS Server 4.4 服务器系统 Linux app 6.6.92-34.1.tl4.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Jun 25 14:33:47 CST 2025 x86_64 x86_64 x86_64 GNU/Linux docker使用的是yum安装的版本 [rootapp ~]# docker version Client:Version: 28.0.1-202…

稀土:从“稀有”到“命脉”的科技核心

稀土,这个听起来有些陌生的词汇,其实早已悄然渗透进我们生活的方方面面。它并非真的“稀有”,而是指17种金属元素的统称,包括镧、铈、钕、铕等。这些元素在地壳中并不稀少,但因其独特的物理和化学性质,使其…

开发手札:UnrealEngine编辑器开发

以前在unity框架中开发了非常多实用且高频使用的编辑器工具,现在准备把目前用得上工具移植到ue4中。下面说明一下ue4开发编辑器工具的流程。1.创建编辑器工具控件2.在控件中创建一个Button和一个EditableText,用于测试3.新建一个继承UEditorUtilityWidge…

EXCEL开发之路(一)公式解析—仙盟创梦IDE

Excel 数据校验:基于自定义格式的深度解析与开发实现引言在数据处理和管理领域,Excel 是一款广泛应用的工具。确保 Excel 中数据的准确性和完整性至关重要,而数据校验是达成这一目标的关键手段。本文将借助特定的代码示例,深入探讨…

Day14——JavaScript 核心知识全解析:变量、类型与操作符深度探秘

接续上文:《前端小白进阶 Day13:JavaScript 基础语法 交互技巧 知识图谱,零基础也能懂》-CSDN博客 点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 主页:一位…

anaconda本身有一个python环境(base),想用别的环境就是用anaconda命令行往anaconda里创建虚拟环境

差不多是这个意思,但需要稍微澄清一下:Anaconda 可以管理任意版本的 Python你安装了 Anaconda 后,默认有一个 base 环境自带的 Python。如果你想用其他版本,比如 Python 3.9、3.10,可以用 conda create -n py39 python…

毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全(可点击查看,不定时更新中)概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式…

字库原理 GB2312-80

这篇文章介绍的是 在嵌入式开发中 常常会遇见的 中文字体点阵字库(如汉字库) 的核心编码原理:区位码 偏移计算 内存映射。我们将会介绍 GB2312-80 字库的工作机制。 📘什么是 GB2312-80? GB2312-80 是中国国家标准定…