3个版本 (稳定)
2.0.0 | 2022年12月29日 |
---|---|
1.0.0 | 2022年9月19日 |
0.1.0 | 2021年1月2日 |
在数学类别中排名第433
200KB
4.5K SLoC
aegir
概述
在Rust中进行强类型、编译时自动微分。
aegir
是一个实验性的自动微分框架,旨在利用Rust强大的类型系统,并尽可能地避免运行时。其方法类似于C++编写的线性代数库中常用的表达式模板。
主要功能
- 内置算术、线性代数、三角和特殊运算符。
- 无限可微:雅可比矩阵、海森矩阵等...
- 自定义运算符扩展DSL。
- 解耦/泛型张量类型。
安装
[dependencies]
aegir = "2.0"
示例
#[macro_use]
extern crate aegir;
extern crate rand;
use aegir::{Differentiable, Function, Identifier, Node, ids::{X, Y, W}};
ctx!(Ctx { x: X, y: Y, w: W });
fn main() {
let mut rng = rand::thread_rng();
let mut ctx = Ctx {
x: [0.0; N],
y: 0.0,
w: [0.0; N],
};
let x = X.into_var();
let y = Y.into_var();
let w = W.into_var();
let model = x.dot(w);
// Using standard method calls...
let sse = model.sub(y).squared();
let adj = sse.adjoint(W);
// ...or using aegir! macro
let sse = aegir!((model - y) ^ 2);
let adj = sse.adjoint(W);
for _ in 0..1_000_00 {
// Independent variables:
ctx.x = rng.gen();
// Dependent variable:
ctx.y = ctx.x[0] * 2.0 - ctx.x[1] * 4.0;
// Evaluate gradient:
let g: [f64; N] = adj.evaluate(&ctx).unwrap();
// Update weights:
ctx.w[0] -= 0.01 * g[0];
ctx.w[1] -= 0.01 * g[1];
}
println!("{:?}", ctx.w.to_vec());
}
依赖项
~3.5MB
~88K SLoC