自動微分の誤った神話その3

私のコードには適用できない

原文:AD Myths Debunked: It won't work on my code - Published 2022/04/06 By Johannes Lotz

この記事は 自動微分の誤った神話 シリーズの一部です。

「自動微分とその利点に興味はあるが、自動微分(AD)を自分のコードに適用するのは技術的、数学的に多くの困難があるため不可能なのでは?」

我々はこのような話を、何年も前から何度も聞かされてきました。外部ライブラリ、微分不可性、並列化、ヘテロジニアスアーキテクチャ、更にはポリモーフィズムや最新のC++言語機能等が自動微分を適用する上での障壁になるのでは? それともこれらは単なる誤った神話なのでしょうか?

NAGでは、私たちのツールであるdco/c++を適用できないコードに出会ったことは一度もありません。これは、dco/c++の柔軟性と機能(すべての課題を解決するための基礎となるもの)、そしてNAGの自動微分専門家が大規模な数学シミュレーションコードに対して持っている膨大な経験のおかげなのです。

以下に、私たちが過去に自動微分を様々なコードに適用する際にお客様が懸念されていた事項を列挙しました。私たちは、これらの一般的な誤解や神話を説明する事が必要だと感じています。

NAGの自動微分ツールセットは過去12年にわたり開発され、さらに10年にわたるC++による自動微分研究開発の経験を基に構築されています。私たちは、細部が重要であることを知っています。レガシーコードは私たちのビジネスであり、私たちが扱うことができないコードに出会ったことは一度もありません。

神話は、真実のように聞こえるかもしれませんが、私たちは、神話について詳しく話し、私たちの経験を共有することによって、企業がこれらの問題を解決する手助けをしたいと願っています。

結果は重要ですが、神話は重要ではありません。

メモリの使用ライブラリの書き換えなど、自動微分の神話に関する他の投稿もご覧ください。

  • 「私が自動微分を適用したいコードは、例題で見たように入力と出力が1つのトップレベルのルーチンにきれいにまとまっていません。あちこちに散らばっています。」
    例題では確かにそのようなトップレベルのルーチンを使用していますが、それは全く必要条件ではありません。入力と出力は、様々なルーチン、コンパイルユニット、またはライブラリにまたがることができます。dco/c++ APIは、これらすべてをコード内の一カ所に集めることに依存していません。
  • 「ポリモーフィズム、ラムダ、パターン(ファクトリー、ビジター、CRTP、アダプター、...)などのモダンなC++の機能だけでなく、スタンダードライブラリのコンテナやアルゴリズムを使っています。」
    これはまさに、dco/c++が扱うために設計されたコードベースのようなものです。私たちは、dco/c++が最新のC++をサポートするように多くの時間を費やしてきました。一方、他の多くの自動微分ツールは、どこかで問題にぶつかります。
  • 「我々は外部の数値計算ライブラリを使用していて「double」以外のデータ型で呼び出すことができません。
    まず、この特定の外部ライブラリを実際に微分する必要があるかどうかを確認する必要があります。ライブラリは微分が必要な入力と出力の間に位置していますか?もしそうなら、dco/c++のデータ型で外部ライブラリを呼び出すための奇跡的な解決策はありません。しかし、実行可能な代替案はあります。明らかなのは、dco/c++型をサポートする数値計算ライブラリを使うことです。もしNAG ADライブラリでサポートされていない機能が必要な場合、ADソリューション全体を局所的な有限差分近似や手書きの微分と結合することができます。
  • 「私のコードは並列です。」
    それは素晴らしい!dco/c++はスレッドセーフで、並列性を扱うためのシンプルなAPIを持っています。他の多くの自動微分ツールはこのどちらも備えていません。
  • 「私のコードは複数のプログラミング言語を使っています。」
    自動微分は技法であり、概念的に使用する言語に制約されることはありません。dco/c++は、C++とFortran用のプロダクションで利用可能なフロントエンドおよび、C#とPython用のアルファ版のフロントエンドを持っています。他の言語用のカスタムソリューションもあります。これには、ソース変換に基づくスクリプト言語や、静的なコードに対するハンドコーディングが含まれます。
  • 「私が解決しようとしている問題は微分不可能です。」
    自動微分は、数学的問題が微分可能であるかではなく、実装が微分可能であることを要求しています。多くの場合、この事実が微分不可能性をすぐに回避してくれます。さらに、自動微分はデフォルトで、微分不可能な点(例えば、左または右の微分)での評価の場合、副勾配を計算します。もし、微分化不可能性が問題となった場合、様々な方法で対処することができます。解決策としては、局所的な(記号微分などの)手動実装、局所的な有限差分の適用、局所的な平滑化などが考えられます。これらのアプローチはすべて、dco/c++を用いた全体的な自動微分ソリューションに適用することが可能です。
  • 「私はヘテロジニアスなプログラミングをしています。」
    dco/c++では、分散・共有メモリ並列を扱うための様々なアプローチがあります。本ツールはスレッドセーフであり、正しく適用することで並列性が保たれます。GPUプログラミングについては、汎用ツールdco/mapを提供していますが、カスタムソリューションも実装します。
関連情報
MENU
Privacy Policy  /  Trademarks