ekmett/ad
Automatic Differentiation
ad – Haskell 的自动微分
简介
- 这是一个 Haskell 库,让您能直接在代码中计算数值函数的精确导数。它在简洁且类型安全的 API 背后,实现了前向模式与反向模式的自动微分 (AD)。
重要性
- 在机器学习、优化、物理模拟及许多其他领域中,您经常需要梯度、雅可比矩阵、海森矩阵等。手写这些函数容易出错;使用有限差分法则既慢又不精确。
ad让您在保持纯 Haskell 的同时,获得编译代码的速度与符号微分的精确度。
主要功能
- 前向与反向模式 AD,具有通用且易于学习的接口。
- 高阶导数(梯度、雅可比矩阵、海森矩阵、任意阶张量),可延迟且高效地获取。
- 类型级标记 (Type-level branding),防止“无穷小”AD 值与普通数字意外混用。
- 模块化设计 – 每个模式都有各自的模块 (
Numeric.AD.Mode.Forward,...Reverse,...Sparse,...Tower等),让您可以选择适合问题规模的实现。 - 求根辅助工具 (
Newton,Halley),建立在 AD 引擎之上。 - Rank-1 组合子,当您需要使用高阶函数操作 AD 值时,可提供最大的灵活性(代价是牺牲部分类型安全性)。
典型用法
import Numeric.AD
-- First derivative of sin at 0
> diff sin 0
1.0
-- Value and derivative of exp . log at 2
> diff' (exp . log) 2
(2.0,1.0)
-- Gradient of a multivariate function
> grad (\[x,y,z] -> x * sin (x + log y)) [1,2,3]
[ sin (1 + log 2) + cos (1 + log 2) * 1
, recip 2 * cos (1 + log 2) * 1
, 0 ]
该库也支持高阶导数流 (diffs, grads) 以及用于检查导数塔每一“层”的 Jet 类型。
适用对象
- 正在构建机器学习模型、优化算法或科学模拟,且需要快速、精确梯度的 Haskell 开发人员。
- 希望在不离开 Haskell 生态系统的情况下,实验自定义损失函数或微分方程的研究人员。
- 任何需要可靠求根 (
Newton,Halley) 并能从自动微分中受益的人。
入门指南
- 从 Hackage 安装:
cabal install ad或将ad加入您项目的.cabal文件中。 - 导入
Numeric.AD(或特定的模式模块) 并开始调用diff,grad,jacobian,hessian等函数。
咨询渠道
- 在 GitHub 仓库开启 issue 或 pull request:https://github.com/ekmett/ad
- 加入 Haskell 社区 IRC (
#haskellon irc.libera.chat) 或项目的 issue tracker。
本摘要仅基于该仓库的 README。
相关
- 项目
- 项目
- 项目
- 项目