Skip to content

Latest commit

 

History

History
74 lines (48 loc) · 4.08 KB

README_CN.md

File metadata and controls

74 lines (48 loc) · 4.08 KB

SparseADRules

Stable Dev Build Status Coverage

英文版本

SparseADRules开源软件供应链点亮计划-暑期2021仓库之一。SparseADRules 使用NiLang对稀疏矩阵操作进行实现从而得到其微分规则,并将这些规则导入至ChainRules

背景

稀疏矩阵在科学计算中应用广泛,但是在Julia语言里面却没有很好的软件包实现对稀疏矩阵的自动微分,这个项目使用可逆嵌入式语言 NiLang.jl对稀疏矩阵操作进行实现从而得到其微分规则。生成的微分规则将以扩展的形式导入到ChainRules.jl中,使用者可以直接通过使用自动微分包比如Zygote, FluxDiffractor来获取这些特性。

安装

在julia (>=1.6) REPL 中键入 ] 然后输入

git clone 
pkg> add SparseADRules 

API一览

API 描述
function imul!(C::StridedVecOrMat, A::AbstractSparseMatrix{T}, B::DenseInputVecOrMat, α::Number, β::Number) where T 稀疏矩阵与稠密矩阵乘法
function imul!(C::StridedVecOrMat, xA::Adjoint{T, <:AbstractSparseMatrix}, B::DenseInputVecOrMat, α::Number, β::Number) where T 共轭稀疏矩阵与稠密矩阵乘法
function imul!(C::StridedVecOrMat, X::DenseMatrixUnion, A::AbstractSparseMatrix{T}, α::Number, β::Number) where T 稠密矩阵与稀疏矩阵乘法
function imul!(C::StridedVecOrMat, X::Adjoint{T1, <:DenseMatrixUnion}, A::AbstractSparseMatrix{T2}, α::Number, β::Number) where {T1, T2} 共轭稠密矩阵与稀疏矩阵乘法
function imul!(C::StridedVecOrMat, X::DenseMatrixUnion, xA::Adjoint{T, <:AbstractSparseMatrix}, α::Number, β::Number) where T 稠密矩阵与共轭稀疏矩阵乘法
function idot(r, A::SparseMatrixCSC{T},B::SparseMatrixCSC{T}) where {T} 稀疏矩阵与稀疏矩阵的点积
function idot(r, x::AbstractVector, A::AbstractSparseMatrix{T1}, y::AbstractVector{T2}) where {T1, T2} 稀疏矩阵与稠密向量的点积
function idot(r, x::SparseVector, A::AbstractSparseMatrix{T1}, y::SparseVector{T2}) where {T1, T2} 稀疏矩阵与稀疏向量的点积

高阶算子

API description
low_rank_svd(A::AbstractSparseMatrix{T}, l::Int, niter::Int = 2, M::Union{AbstractMatrix{T}, Nothing} = nothing) where T 返回秩约为l的稀疏矩阵A的奇异值分解 A ≈ U diag(S) Vt。在行向量M给定的情形下,对矩阵A - M进行奇异值分解。

一个简单的用例

这里我们用一个最小的用例去展示如何使用SparseADRules去加速Zygote梯度。更多测试用例,请前往examples文件夹查看。

julia> using SparseArrays, LinearAlgebra, Random, BenchmarkTools

julia> A = sprand(1000, 1000, 0.1);

julia> x = rand(1000);

julia> using Zygote

julia> @btime Zygote.gradient((A, x) -> sum(A*x), $A, $x)
  15.065 ms (27 allocations: 8.42 MiB)

julia> using SparseADRules

julia> @btime Zygote.gradient((A, x) -> sum(A*x), $A, $x)
  644.035 μs (32 allocations: 3.86 MiB)

你会发现使用SparseADRules不仅能够加速计算过程,还能够节省内存分配——这是因为我们的实现在梯度计算的过程中并不会将一个稀疏矩阵转换为稠密矩阵。

贡献

欢迎提出Issue和PR👏

许可证

MIT许可证