You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch对称矩阵特征分解复特征值及eigh收敛报错问题问询

问题根因

  1. torch.eig 针对通用非对称矩阵设计,即使输入对称矩阵,浮点计算误差也会生成带微小虚部的复特征值,导致反向传播失败,且该接口在PyTorch 1.9+版本已被弃用。
  2. torch.linalg.eigh 收敛报错通常由三类数值问题导致:
    • 特征归一化时某维度特征标准差为0,出现除以0的异常,生成nan/inf污染相关矩阵
    • 矩阵乘法的浮点累积误差导致相关矩阵偏离严格对称,超出eigh算法的对称容忍阈值
    • 相关矩阵病态条件数过高,底层迭代算法无法收敛

修复方案

  • 归一化步骤添加极小epsilon避免除以0
  • 对生成的相关矩阵做对称化处理,消除浮点误差带来的不对称性
  • 对相关矩阵添加微小的正定扰动,降低矩阵条件数
  • 可指定eigh的CUDA计算driver为syevj,相比默认driver对小矩阵的数值稳定性更高

修复后可稳定运行的代码

# 归一化添加epsilon避免某维度特征方差为0时除零
X_mean = X.mean(dim=0)
X_std = X.std(dim=0)
X_norm = (X - X_mean) / (X_std + 1e-8)

corr = (X_norm.t() @ X_norm) / X_norm.size(0)
# 强制对称,消除浮点计算带来的不对称误差
corr = (corr + corr.t()) / 2
# 添加微小正定扰动,降低矩阵条件数
corr += 1e-6 * torch.eye(corr.shape[0], device=corr.device)

# 使用eigh计算对称矩阵特征分解,CUDA环境下可指定driver='syevj'提升稳定性
eigs, vecs = torch.linalg.eigh(corr, driver='syevj')

如果仅需要保留前K个最大的特征值/特征向量,可在调用eigh时添加eigvals=(corr.shape[0]-K, corr.shape[0]-1)参数,仅计算所需的特征对,进一步提升计算效率和稳定性。

内容的提问来源于stack exchange,提问作者Nitin Prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:04