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 (
#haskellon irc.libera.chat) またはプロジェクトのIssueトラッカーに参加。
この要約はリポジトリのREADMEのみに基づいています。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト