13 个版本

0.2.2 2021年8月7日
0.2.1 2021年8月3日
0.1.9 2021年8月3日
0.0.1 2021年8月1日

413科学

33 每月下载量
用于 2 crates

MIT/Apache

28KB
737

reverse

Crates.io Documentation License

为 Rust 的反向模式自动微分提供零依赖的 crate。

要在您的 crate 中使用此功能,请在 Cargo.toml 中添加以下内容

[dependencies]
reverse = "0.2"

示例

use reverse::*;

fn main() {
  let tape = Tape::new();
  let a = tape.add_var(2.5);
  let b = tape.add_var(14.);
  let c = (a.sin().powi(2) + b.ln() * 3.) - 5.;
  let gradients = c.grad();

  assert_eq!(gradients.wrt(&a), (2. * 2.5).sin());
  assert_eq!(gradients.wrt(&b), 3. / 14.);
}

主要类型是 Var<'a>,因此您可以定义接受此类型(可能还有其他 f64 参数)作为输入的函数,并且该函数还返回此类型,并且该函数是可微分的。例如

use reverse::*;

fn main() {
    let tape = Tape::new();
    let params = tape.add_vars(&[5., 2., 0.]);
    let data = [1., 2.];
    let result = diff_fn(&params, &data);
    let gradients = result.grad();
    println!("{:?}", gradients.wrt(&params));
}

fn diff_fn<'a>(params: &[Var<'a>], data: &[f64]) -> Var<'a> {
    params[0].powf(params[1]) + data[0].sin() - params[2].asinh() / data[1]
}

无运行时依赖