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
28KB
737 行
reverse
为 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(¶ms, &data);
let gradients = result.grad();
println!("{:?}", gradients.wrt(¶ms));
}
fn diff_fn<'a>(params: &[Var<'a>], data: &[f64]) -> Var<'a> {
params[0].powf(params[1]) + data[0].sin() - params[2].asinh() / data[1]
}