ekmett/ad

Automatic Differentiation

ad – Haskellのための自動微分

概要

  • 数値関数の正確な導関数をコード内で直接計算できるHaskellライブラリです。シンプルで型安全なAPIの背後で、順方向および逆方向の自動微分(AD)を実装しています。

重要性

  • 機械学習、最適化、物理シミュレーションなどの分野では、勾配、ヤコビ行列、ヘッセ行列などが頻繁に必要となります。これらを手書きするのはエラーの元であり、有限差分法は低速で不正確です。ad を使用すれば、純粋なHaskellを保ちつつ、コンパイルされたコードの速度と記号微分の精度を両立できます。

主な機能

  • 順方向および逆方向のAD:共通の学習しやすいインターフェースを提供。
  • 高階導関数:勾配、ヤコビ行列、ヘッセ行列、任意の階数のテンソルを遅延評価かつ効率的に取得可能。
  • 型レベルのブランディング:「無限小」のAD値が通常の数値と誤って混ざるのを防ぐ仕組み。
  • モジュール設計:各モードが独立したモジュール (Numeric.AD.Mode.Forward, ...Reverse, ...Sparse, ...Tower など) に分かれており、問題の規模に合わせて実装を選択可能。
  • 求根補助機能:ADエンジン上に構築された Newton や Halley 法。
  • 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 またはプロジェクトの .cabal ファイルに ad を追加。
  • Numeric.AD (または特定のモードモジュール) をインポートし、diff, grad, jacobian, hessian などを呼び出します。

質問先

  • GitHubリポジトリでIssueやPull Requestを作成:https://github.com/ekmett/ad
  • HaskellコミュニティのIRC (#haskell on irc.libera.chat) またはプロジェクトのIssueトラッカーに参加。

この要約はリポジトリのREADMEのみに基づいています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト