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 (#haskell on irc.libera.chat) 或项目的 issue tracker。

本摘要仅基于该仓库的 README。

相关

  • 项目
  • 项目
  • 项目
  • 项目