[论文阅读笔记25]A Comprehensive Survey on Graph Neural Networks
这是一篇GNN的综述, 发表于2021年的TNNLS. 这篇博客旨在对GNN的基本概念做一些记录.
论文地址: 论文
1. 引言, 背景与定义
对于图像数据来说, CNN具有平移不变性和局部连接性, 因此可以在欧氏空间上良好地学习. 然而, 对于具有图结构的数据(例如社交网络 化学分子等)就需要用GNN来学习.
最早期的GNN网络是遵循类似RNN的循环迭代式的(RecGNN), 主要的对象是DAG(有向无环图). 这个方式停止的条件是节点的表示趋于稳定.
后来发展出了卷积图网络(ConvGNN), 主要有基于谱域(频域)的和基于空域的. 除此之外, 还发展出了图自编码器(Graph autoencoders, GAEs)和时空(spatial-temporal)GNN.
因此这篇文章主要就把GNN分成了这四种:
- 循环GNN
- 卷积GNN
- 图自编码器
- 时空GNN
后面, 作者主要讲了GNN与两个任务的区别:
GNN与network embedding. network embedding旨在将一个网络的节点编码成低维度的向量表示, 并保持网络的拓扑结构不变, 这样降维之后, 一些分类, 聚类等任务, 就可以通过传统的机器学习方法实现(例如SVM). 因此, GNN和network embedding的关系是, GNN可以通过一个图自编码器来学习一个低维的表示, 即network embedding的任务. 总而言之, network embedding主要是通过降维来实现应用机器学习方法的目的.
GNN与图的核方法(graph kernel methods). 图的核方法主要是将一个图编码到一个向量空间, 以便应用SVM之类的任务(图的层面).
2. 分类和框架
如前所述, 本文将GNN分成了四类, 如下图所示:
节点分类任务的ConvGNN. 对于每一个节点, 在每次迭代中聚合它临近节点的信息(图卷积), 最后通过一个非线性变换对节点进行分类. 其中 X ∈ R n × d X\in\mathbb{R}^{n\times d} X∈Rn×d表示节点特征拼成的矩阵.
图分类任务的ConvGNN. 在图卷积操作后, 使用一个池化层, 将图粗糙化成一个子图, 得到图的高阶表示(higher representations). 最后用一个readout函数, 对图进行分类.
用于network embedding的图自编码器. 先用图卷积得到每个节点的embedding, 然后解码器在给定embedding的情况下计算成对距离. 在应用非线性激活函数后, 解码器重构图邻接矩阵. 通过最小化真实邻接矩阵与重构邻接矩阵之间的差异来训练网络.
时空GNN. 对每个timestep的GNN都应用卷积, 随后跟一个 1D-CNN 层对时序特征进行提取. 输出层是一个线性变换,为每个节点生成一个预测,例如它在下一个时间步的未来值.
3. 循环GNN
循环GNN一般都是GNN早期的开山之作, 由于计算量的限制, 一般都是应用于有向无环图的. The Graph Neural Network Model(IEEE Trans. Neural Network, 2009)
提出了一个更具有普适性的方式, 可以应用于各种图. 节点更新方式如下式:
为了保证收敛性, f f f必须是一个收缩映射. 如果 f f f是神经网络的话, 则必须加入罚项.
除此之外, 门控GNNGated graph sequence neural networks, (arxiv, 2015)
将门控单元(GRU)作为上述的 f f f函数, 减少了收敛时间. 其节点更新用上一个隐藏态和临近节点隐藏态的线性映射组成, 如下式:
h v ( t ) = G R U ( h v ( t − 1 ) , ∑ u ∈ N ( v ) W h u ( t − 1 ) ) h_v^{(t)} = GRU(h_v^{(t - 1)}, \sum_{u\in N(v)}Wh_u^{(t-1)}) hv(t)=GRU(hv(t−1),u∈N(v)∑Whu(t−1))
这个网络的训练用通过时间的反向传播(RNN的反向传播方式)进行梯度下降.
总体来说, 循环GNN的方式类似RNN, 是作用于离散的节点上面. 但是循环GNN每次(层)用的更新函数 f f f是同一个, 因此必须保证收敛性.
4. 卷积GNN
与循环GNN不同, 卷积GNN的每一层都是可学习的不同参数, 具有固定层数, 和循环GNN区别如下:
卷积GNN基本分为两类, 基于谱的(频域的)和基于空域的.
A. 基于谱的卷积GNN
基于谱的GNN基本对于无向图而言, 我们可以用(归一化的)图Laplace矩阵唯一的表示这个图的拓扑性质:
L = I n − D − 1 / 2 A D − 1 / 2 L = I_n - D^{-1/2}AD^{-1/2} L=In−D−1/2AD−1/2
其中 D D D为对角矩阵, 每个对角元素为邻接阵对应行的和, 也就是这个节点的度.
我们可以看出, 对于Laplace矩阵的 ( i , j ) (i, j) (i,j)个元素:
如果 i = j i=j i=j, a i , j = 0 , d i , j = d e g ( v i ) , l i , j = 1 a_{i,j} = 0, d_{i,j} = deg(v_i), l_{i,j} = 1 ai,j=0,di,j=deg(vi),li,j=1
如果 i ≠ j i \ne j i=j, v i , v j v_i, v_j vi,vj不相连, a i , j = 0 , l i , j = 0 a_{i,j} = 0, l_{i,j} = 0 ai,j=0,li,j=0
如果 i ≠ j i \ne j i=j, v i , v j v_i, v_j vi,vj相连, a i , j = 1 , l i , j = − 1 / d e g ( v i ) d e g ( v j ) a_{i,j} = 1, l_{i,j} = -1/\sqrt{deg(v_i)deg(v_j)} ai,j=1,li,j=−1/deg(vi)deg(vj)
因此, 图Laplace矩阵可以唯一表示图
容易看出Laplace矩阵是实对称的, 因此是半正定的, 因此具有非负特征值. 我们可以对其做特征值分解:
L = U Λ U T L = U \Lambda U^T L=UΛUT
因此我们可以基于Laplace矩阵的特征值分解定义图的Fourier变换:
F ( x ^ ) = U T x ^ \mathcal{F}(\hat{x}) = U^T\hat{x} F(x^)=UTx^
由于 U U T = I UU^T = I UUT=I, 因此可以立即定义图的逆Fourier变换:
F − 1 ( x ) = U x \mathcal{F}^{-1}(x)=Ux F−1(x)=Ux
所以图Fourier变换实际上就是将图信号 x x x投影到一个标准正交基构成的空间中, 换句话说, x x x可以表示成 U U U的列向量的线性组合: x = ∑ i x ^ i u i x = \sum_i \hat{x}_iu_i x=∑ix^iui, 这就是正 逆Fourier变换的关系(和信号处理中的一致).
我们考虑将图信号经过滤波器, 根据卷积定理(时域卷积的Fourier变换对应频域乘积), 有:
x ∗ g = F − 1 ( F ( x ) ⊙ F ( g ) ) = U ( U T x ⊙ U T g ) x * g = \mathcal{F}^{-1}(\mathcal{F}(x) \odot \mathcal{F}(g)) \\ = U(U^Tx \odot U^T g) x∗g=F−1(F(x)⊙F(g))=U(UTx⊙UTg)
其中 ⊙ \odot ⊙表示element-wise乘法. 如果我们记 g θ = d i a g ( U T g ) g_{\theta} = diag(U^Tg) gθ=diag(UTg), 则 U T x ⊙ U T g = g θ U T x U^Tx \odot U^Tg = g_{\theta}U^Tx UTx⊙UTg=gθUTx, 所以
x ∗ g = U g θ U T x x * g = Ug_{\theta}U^Tx x∗g=UgθUTx
谱GNN的关键在于如何选择滤波器 g θ g_{\theta} gθ.
在实际中, 我们考虑网络的第 k k k层, 输入和输出的通道数分别为 f k − 1 , f k f_{k-1}, f_k fk−1,fk, 则该层第 j j j个通道的输出为:
H : , j ( k ) = σ ( ∑ i = 1 f k − 1 U Θ i , j ( k ) U T H : , i ( k − 1 ) ) ∈ R n H^{(k)}_{:, j} = \sigma(\sum_{i=1}^{f_{k-1}}U\Theta_{i,j}^{(k)}U^TH^{(k-1)}_{:, i}) \in \mathbb{R}^n H:,j(k)=σ(i=1∑fk−1UΘi,j(k)UTH:,i(k−1))∈Rn
其中 Θ i , j ( k ) \Theta_{i,j}^{(k)} Θi,j(k)是对角阵, 对角元素为一组可学习的参数.
然而, 这样的方式有三个缺点:
- 图的任何扰动对特征值和特征向量的影响都很大(特征值分解的性质)
- 学习到的滤波器是域相关的, 这意味着它们不能应用于具有不同结构的图.
- 特征值分解的复杂度很高( O ( n 3 ) O(n^3) O(n3)).
为了解决复杂度高的问题, ChebNet和GCN经过几个简化将复杂度降为线性复杂度. ChebNet用Chebyshev多项式来估计滤波器 g θ g_{\theta} gθ, 即
g θ = ∑ i = 1 K θ i T i ( Λ ~ ) , Λ ~ = 2 Λ / λ m a x − I n g_\theta = \sum_{i=1}^K \theta_i T_i(\tilde{\Lambda}), ~~\tilde{\Lambda} = 2\Lambda / \lambda_{max} - I_n gθ=i=1∑KθiTi(Λ~), Λ~=2Λ/λmax−In
这样 Λ ~ \tilde{\Lambda} Λ~中的值都落在 [ − 1 , 1 ] [-1, 1] [−1,1]内. T i ( x ) T_i(x) Ti(x)表示Chebyshev多项式, 按照如下递推定义:
T 0 ( x ) = 1 T_0(x) = 1 T0(x)=1
T 1 ( x ) = x T_1(x) = x T1(x)=x
T i ( x ) = 2 x T i − 1 ( x ) − T i − 2 ( x ) T_i(x) = 2xT_{i - 1}(x) - T_{i - 2}(x) Ti(x)=2xTi−1(x)−Ti−2(x)
带入, 就得到按照Chebyshev多项式估计的图卷积结果如下:
x ∗ g = U ( ∑ i = 1 K θ i T i ( Λ ~ ) ) U T x x * g = U(\sum_{i=1}^K \theta_i T_i(\tilde{\Lambda}))U^Tx x∗g=U(i=1∑KθiTi(Λ~))UTx
可以用数学归纳法证明拉普拉斯矩阵的Chebyshev多项式矩阵和特征值矩阵具有如下关系(?):
T i ( L ~ ) = U T i ( Λ ~ ) U T , L ~ = 2 L / λ m a x − I n T_i(\tilde{L}) = UT_i(\tilde{\Lambda})U^T, ~~ \tilde{L} = 2L / \lambda_{max} - I_n Ti(L~)=UTi(Λ~)UT, L~=2L/λmax−In
因此有
x ∗ g = U ( ∑ i = 1 K θ i T i ( Λ ~ ) ) U T x = ∑ i = 1 K θ i T i ( L ~ ) x x * g = U(\sum_{i=1}^K \theta_i T_i(\tilde{\Lambda}))U^Tx = \sum_{i=1}^K \theta_i T_i(\tilde{L})x x∗g=U(i=1∑KθiTi(Λ~))UTx=i=1∑KθiTi(L~)x
ChebNet 定义的过滤器在空间上是局部的, 这意味着过滤器可以独立于图大小提取局部特征. ChebNet的频谱线性映射到[−1,1].
下面再来看经典的图卷积网络GCN. GCN是ChebNet的简化, 取了 K = 1 K = 1 K=1, 并且假定最大特征值为2, 得到
x ∗ g = θ 0 x + θ 1 ( 2 L / λ m a x − I n ) x = θ 0 x + θ 1 ( 2 ( I n − D − 1 / 2 A D − 1 / 2 ) / λ m a x − I n ) x ( λ m a x = 2 ) = θ 0 x − θ 1 D − 1 / 2 A D − 1 / 2 x x * g = \theta_0x + \theta_1 (2L / \lambda_{max} - I_n)x \\ = \theta_0x + \theta_1 (2( I_n - D^{-1/2}AD^{-1/2}) / \lambda_{max} - I_n)x \\ (\lambda_{max} = 2) = \theta_0x - \theta_1 D^{-1/2}AD^{-1/2}x x∗g=θ0x+θ1(2L/λmax−In)x=θ0x+θ1(2(In−D−1/2AD−1/2)/λmax−In)x(λmax=2)=θ0x−θ1D−1/2AD−1/2x
为了进一步减少参数量, 防止过拟合, 假定 θ = θ 0 = − θ 1 \theta = \theta_0 = -\theta_1 θ=θ0=−θ1, 立即有
x ∗ g = θ ( I n + D − 1 / 2 A D − 1 / 2 ) x x * g = \theta(I_n + D^{-1/2}AD^{-1/2})x x∗g=θ(In+D−1/2AD−1/2)x
在经验上, I n + D − 1 / 2 A D − 1 / 2 I_n + D^{-1/2}AD^{-1/2} In+D−1/2AD−1/2容易造成稳定性的问题, 因此GCN采用 D ~ − 1 / 2 A ~ D ~ − 1 / 2 \tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2} D~−1/2A~D~−1/2来代替, 其中 A ~ = A + I n , D ~ \tilde{A} = A + I_n, \tilde{D} A~=A+In,D~为 A ~ \tilde{A} A~的度矩阵.
对这种归一化的理解:
由于邻接矩阵的对角元素是0, 因此 θ ( I n + D − 1 / 2 A D − 1 / 2 ) x \theta(I_n + D^{-1/2}AD^{-1/2})x θ(In+D−1/2AD−1/2)x的第一项可以认为是聚合节点自身信息, 第二项可以认为是聚合邻近节点的信息. 然而这样会造成不稳定, 因此更改一下形式, 即直接添加self-loop也就是自环边, 也就相当于给邻接矩阵 A A A加上单位阵 I n I_n In.
后续跟进GCN的工作主要是对于对称矩阵的选取.
B. 基于空域的卷积GNN
实际上空域上对图进行卷积和在典型具有欧氏空间结构的图像上进行卷积是相似的, 如下图所示:
例如, NN4G在每一次迭代聚合一个节点和它邻居节点的信息, 如下式所示:
此外, 还有一种比较有意思的Diffusion GNN, 也就是将图卷积过程视为扩散过程. 在扩散过程中, 信息按照一定的概率从一个节点传入另一个节点, 这样的概率和节点的度有关, 如下式:
H ( k ) = f ( W ( k ) ⊙ P k X ) , P = D − 1 A H^{(k)} = f(W^{(k)} \odot P^kX), ~~P = D^{-1}A H(k)=f(W(k)⊙PkX), P=D−1A
P = D − 1 A P = D^{-1}A P=D−1A的意义是对于度大的点, 其信息传入相连邻居节点的就更多(权重大)
在Diffusion Graph Convolution中, 最后的结果是将中间结果加起来, 即:
H = ∑ k = 0 K f ( P k X W k ) H = \sum_{k=0}^Kf(P^kXW^k) H=k=0∑Kf(PkXWk)
PGC-DGCNN按照节点之间的距离学习权重, 也就是增强距离远的节点的作用. 具体地, 如果节点 v v v到节点 u u u的最短路长度为 j j j, 则记 S v , u ( j ) = 1 S_{v, u}^{(j)} = 1 Sv,u(j)=1, 否则为0.
另外, 还有一种形式的空域GNN, 也就是我们所熟知的消息传递. 消息传递可以解释成信息可以从节点沿着边进行传递, 一般通常来讲有固定的 K K K步迭代, 这样可以让信息传递的更远, 也就是有更大的感受野. 可以用如下公式表示:
然而, 对于graph-level的任务, 传统的消息传递无法区分不同的图结构. 为此, GIN通过调节中心节点的权重, 这样就区分了中心节点和邻居节点, 如下所示:
此外, 对于一个节点的邻居节点, 不同邻居的重要性也许是不同的, 因此GAT提出了图注意力机制, 将聚合时邻居节点的权重变成learnable的参数:
其中
α v u ( k ) = s o f t m a x ( g ( a T [ W ( k ) h v ( k − 1 ) ∣ ∣ W ( k ) h u ( k − 1 ) ] ) ) \alpha_{vu}^{(k)} = softmax(g(a^T[W^{(k)}h_{v}^{(k-1)}||W^{(k)}h_{u}^{(k-1)}])) αvu(k)=softmax(g(aT[W(k)hv(k−1)∣∣W(k)hu(k−1)]))
图池化层, 图自编码器待更新…
相关文章:

[论文阅读笔记25]A Comprehensive Survey on Graph Neural Networks
这是一篇GNN的综述, 发表于2021年的TNNLS. 这篇博客旨在对GNN的基本概念做一些记录. 论文地址: 论文 1. 引言, 背景与定义 对于图像数据来说, CNN具有平移不变性和局部连接性, 因此可以在欧氏空间上良好地学习. 然而, 对于具有图结构的数据(例如社交网络 化学分子等)就需要用…...

iview时间控件 动态不可选日期 可选择24小时范围内 时间往后退24小时
演示 html 设定 起始时间 触发on-change 方法结束时间 options 动态设置不可选择的日期。 <!-- 起始时间 --> <FormItem :label"$t(startTime)" prop"startTime"><DatePickertransfertype"datetime":placeholder"$t(pleas…...

Rest学习环境搭建:服务消费者
建一个子模块 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…...

JVM内存模型介绍
内存模型 内存模型如下图所示 堆 堆是Java虚拟机所管理的内存最大一块。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例。所有的对象实例都在这里分配内存 Java堆是垃圾收集器管理的主要区域。从内存回收的角度来看&am…...

2000-2021年地级市产业升级、产业结构高级化面板数据
2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间:2000-2021年 2、范围:地级市 3、指标:年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…...
Java实现密码加密实现步骤【bcrypt算法】
一、SpringBoot和SSM框架均可实现密码加密的方法 在Spring Boot和SSM中实现密码加密可以使用bcrypt算法。bcrypt是一种密码哈希函数,通过将密码与随机生成的盐值进行混合,然后再进行多次迭代的计算,最终生成一个安全的哈希密码。 下面是使用…...

商城-学习整理-集群-K8S(二十三)
目录 一、k8s 集群部署1、k8s 快速入门1)、简介2)、架构1、整体主从方式2、Master 节点架构3、Node 节点架构 3)、概念4)、快速体验1、安装 minikube2、体验 nginx 部署升级 5)、流程叙述 2、k8s 集群安装1、kubeadm2、…...
MATLAB算法实战应用案例精讲-【深度学习】强化学习
目录 基础知识点 马尔科夫决策过程 策略梯度定理 蒙特卡洛策略梯度定理 REINFORCE 算法...

时间和日期--Python
1. 时间:time模块 总结:2. datetime模块 相比与time模块,datetime模块的接口更直观、更容易调用 2.1 datetime模块定义的类 (1)datetime.date:表示日期的类。常用的属性有:year、month、day; ÿ…...

【Git】学习总结
【Git】学习总结 【一】安装【二】Git克隆项目代码【1】idea下载git项目【2】创建新的分支【3】新建的分支推送到远程【4】合并最新代码到主分支【5】切换分支 【三】提交本地项目到远程🚀1. 配置 Git🚀2. 创建项目远程仓库🚀3. 初始化本地仓…...

手写Spring源码——实现一个简单的spring framework
这篇文章主要带大家实现一个简单的Spring框架,包含单例、多例bean的获取,依赖注入、懒加载等功能。文章内容会持续更新,感兴趣的小伙伴可以持续关注一下。 目录 一、创建Java项目 二、开始实现Spring 1、创建BeanFactory接口 2、创建Appl…...

银河麒麟服务器、centos7服务器一键卸载mysql脚本
脚本 # 查看mysql相关的rpm包写到rmsql.sh文件中 rpm -aq | grep -i mysql >rmsql.sh # 修改文件为卸载mysql的脚本文件 sed -i -e s/^/yum remove -y / rmsql.sh # 修改文本权限 chmod 777 rmsql.sh # 全盘查找mysql相关文件,写到my.sh脚本中 find / -name mysq…...

【随笔】- 程序员的40岁后健身计划
【随笔】- 40岁后程序员的健身计划 文章目录 【随笔】- 40岁后程序员的健身计划一、树立健身信心,制订坚持计划二、挑选让你舒适的方式三、调整速度,以间歇式训练为主四、刚开始锻炼,别求太快五、增加力量、柔韧性和平衡练习六、运动多样化七…...
后端项目开发:集成Druid数据源
Druid作为连接池中间件可以监控数据库访问性能,对数据库密码加密,查看SQL执行日志,扩展JDBC。 添加依赖 <!-- druid --> <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter&…...

深度学习11:Transformer
目录 什么是 Transformer? Encoder Decoder Attention Self-Attention Context-Attention 什么是 Transformer(微软研究院笨笨) RNN和Transformer区别 Universal Transformer和Transformer 区别 什么是 Transformer? …...

免费开源跨平台视频下载器 支持数百站点视频和音频下载-ytDownloader
ytDownloader: ytDownloader是一款免费开源跨平台视频下载器,帮助用户从数百个网站下载不同格式的视频和提取音频,使用简单,复制视频链接粘贴即可下载,支持4K画质视频下载,支持Linux、Windows 和 macOS平台…...

R包开发1:RStudio 与 GitHub建立连接
目录 1.安装Git 2-配置Git(只需配置一次) 3-用SSH连接GitHub(只需配置一次) 4-创建Github远程仓库 5-克隆仓库到本地 目标:创建的R包,包含Git版本控制,并且能在远程Github仓库同步,相当于发布在Github。…...

红蓝攻防:浅谈削弱WindowsDefender的各种方式
前言 随着数字技术的日益进步,我们的生活、工作和娱乐越来越依赖于计算机和网络系统。然而,与此同时,恶意软件也日趋猖獗,寻求窃取信息、破坏系统或仅仅为了展现其能力。微软Windows,作为世界上最流行的操作系统&…...

什么是响应式设计(Responsive Design)?如何实现一个响应式网页?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式设计(Responsive Design)⭐ 如何实现一个响应式网页?1. 弹性网格布局2. 媒体查询3. 弹性图像和媒体4. 流式布局5. 优化导航6. 测试和调整7. 图片优化8. 字体优化9. 渐进增强10. 面向移动优先11. …...
QT之应用程序执行脚本
简介 ● Qt中的类QProcess支持在程序中另外开辟线程 ● 其中start方法支持以字符串为参数执行命令 以Linux平台为例: 方式一(后台执行) /// /// \brief MainWindow::cmdLine run a linux command with string format in the bash /// \pa…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...