#auto-diff #machine-learning #codegen #machine #learning

bin+lib meta_diff

用于在不同平台上使用单个源文件开发可扩展机器学习算法的自动微分工具

1 个不稳定版本

使用旧的 Rust 2015

0.0.1 2015 年 6 月 29 日

#autodiff 中排名 20

GPL-3.0+

430KB
6K SLoC

Meta Diff

Build Status License

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 模块生成的图像)

gradient

当前开发阶段

目前,该项目的核心构建块已经实现 - ComputeGraph 和解析器。目前正在实现几个非常重要部分

  1. 对计算图结构的优化
    • 剪枝 - 删除与输出无关的任何节点
    • 删除冗余 - 将执行相同计算的节点替换为单个节点
    • 逆操作 - 将执行逆操作的函数替换为原始节点 - 例如 log(exp(x)) 转换为 x
    • 常量折叠 - 合并同一操作中出现的常量
    • 否定和除法重排 - 例如,将 -(b + c) + d 转换为 (-b) + (-c) + d
    • 收集 n 元运算符 - 例如,将 (a+b) + (c+d) 转换为 a + b + c + d
    • 乘法运算符的对数可以替换为对数运算符之和
    • 指数运算符的乘积可以替换为求和的指数
    • 子索引优化
  2. Matlab 和 Eigen 代码生成器

未来目标

在有限的时间内可以进行的扩展数量是巨大的,但当前认为最重要的是

  1. 考虑数组支持或某种形式的 map reduce 功能
  2. 导入 for 循环和子程序
  3. OpenCL 或 CUDA 代码生成
  4. 海森矩阵-向量乘积

请提出建议,在问题跟踪器上打开一个 Issue。如果您实现了某些有趣的示例,请通知我们将其添加到示例文件夹中!

依赖项

~3.5–5.5MB
~97K SLoC