[论文阅读笔记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如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...