#自动微分 #微分 #前向 #auto-diff

no-std dfo

在Rust中的可微分浮点运算

7个版本

0.1.0-beta.52022年11月23日
0.1.0-beta.32022年11月21日
0.1.0-beta2022年11月20日
0.1.0-alpha2022年11月16日

#968 in 算法

MIT 协议

56KB
1.5K SLoC

可微分浮点运算

⚠ 此crate正在开发中,不应直接使用!

如果您想贡献或提问,请通过GitHub issues与我联系。

Crates.io docs.rs

DFO crate旨在通过自动微分使您现有的代码可微分。

crate结构

至于自动微分,此crate由两个独立的部分组成

正如其名所示,前者实现的是 前向 模式自动微分,而后者实现的是 反向 模式。

注意:如果您对自动微分不熟悉,我建议您阅读Max Slater博客上的这篇优秀的文章这篇优秀的文章

接下来,每个模块都分为(至少)两个子模块: 原始泛型

原始模块在原始类型上实现特定的微分模式,例如,使用forward::DFloat32的[f32]。

示例 - 原始类型的正向自动微分

use dfo::forward::primitive::*;

let f = |x| { x * x + 1.0 - x };
let df = |x| { 2.0 * x - 1.0 };
let x = DFloat32::var(4.0);

assert_eq!(f(x).deriv(), df(x).value());

泛型模块在泛型类型上实现特定的微分模式。对于后者,我们建议使用num_traits::Float特质,例如。原始类型通常优化得更好(没有无用的复制,编译时间更快),除非您想使用外部crate,例如ndarray

crate功能标志

以下crate功能标志可用。它们配置在您的Cargo.toml中。

  • libm:启用num-traits/libm功能
  • num-traits:支持(大多数)在num-traits中定义的特质(默认启用)
  • std:使用Rust标准库的功能(默认启用)
  • serde:为 serde 1.x 提供序列化支持

库目标

DFO 有两个主要目标。它必须是

  1. 快速,即在可能的情况下减少计算和复制,大量使用代码内联,以及其他方式;
  2. 并且 易于使用,利用泛型类型,并且需要非常少的修改来计算导数。

库状态

总结:这个库稳定吗?它是否已准备好投入生产?

不,可能需要很长时间才会。

目前,以下模块已实现

  • 正向
    • 原始
    • 泛型
  • 反向
    • 原始
    • 泛型

以下是我想要工作的一个小型 待办事项列表

  • 原始正向反向 创建功能
  • 创建多个输入、多个输出、ndarrays 等 的示例
  • 实现反向自动微分

类似库

依赖关系

~94–395KB