1 个不稳定版本
使用旧的 Rust 2015
0.0.1 | 2015 年 6 月 29 日 |
---|
在 #autodiff 中排名 20
430KB
6K SLoC
Meta Diff
Meta Diff 是一个自动微分和代码生成工具,用于使用单个源文件在不同平台上开发可扩展的机器学习算法。它用 Rust 实现,并将以不同平台上的二进制文件形式分发。
[文档网站] (http://botev.github.io/meta_diff/index.html)
用法和安装
当项目准备就绪时,它将以二进制文件的形式分发,无需任何形式的安装。用法是从命令行以以下格式执行:
diff <source_file>
该命令将在当前目录中创建一个新文件夹,其名称与输入文件相同,在其中您将找到所有自动生成的源文件。请注意,这些文件可能需要单独编译(在 C/C++、CUDA 或 OpenCL 的情况下)或直接使用(在 Matlab 或 Python 的情况下)。
源语言
源文件遵循 Matlab 语法的子集,但有几个重要的区别。考虑以下简单的源文件,它定义了一个前馈网络
function [L] = mat(@w1,@w2,x,y)
h = tanh(w1 dot vertcat(x,1));
h = tanh(w2 dot vertcat(h,1));
L = l2(h-y,0);
end
第一行定义了一个具有四个参数的函数 mat
,其中前两个是参数,后两个是常数,这意味着不会对它们求梯度。所有标准运算都被视为逐元素运算。因此,运算符 *
被称为 Hadammart 积。线性代数意义上的乘法通过关键字 dot
实现。因此,此代码片段通过使用 vertcat
向每个层添加偏置项来计算网络的正向传递。最后一行指定我们正在取 L2
平方范数 h-y
。函数的第二个参数指定了沿哪个维度,0
的含义是所有维度。在解析时,工具将自动进行梯度运算,因此对于此示例,这导致以下计算图(由 graphviz 模块生成的图像)
当前开发阶段
目前,该项目的核心构建块已经实现 - ComputeGraph
和解析器。目前正在实现几个非常重要部分
- 对计算图结构的优化
- 剪枝 - 删除与输出无关的任何节点
- 删除冗余 - 将执行相同计算的节点替换为单个节点
- 逆操作 - 将执行逆操作的函数替换为原始节点 - 例如
log(exp(x))
转换为x
- 常量折叠 - 合并同一操作中出现的常量
- 否定和除法重排 - 例如,将
-(b + c) + d
转换为(-b) + (-c) + d
- 收集 n 元运算符 - 例如,将
(a+b) + (c+d)
转换为a + b + c + d
- 乘法运算符的对数可以替换为对数运算符之和
- 指数运算符的乘积可以替换为求和的指数
- 子索引优化
- Matlab 和 Eigen 代码生成器
未来目标
在有限的时间内可以进行的扩展数量是巨大的,但当前认为最重要的是
- 考虑数组支持或某种形式的 map reduce 功能
- 导入 for 循环和子程序
- OpenCL 或 CUDA 代码生成
- 海森矩阵-向量乘积
请提出建议,在问题跟踪器上打开一个 Issue。如果您实现了某些有趣的示例,请通知我们将其添加到示例文件夹中!
依赖项
~3.5–5.5MB
~97K SLoC