私はJava(小さいもの)でニューラルネットワークを実装しようとしていますが、学習アルゴリズムに逆伝播を使用しています。これには、一般的な導関数を見つける必要があります。Javaで一般的な派生物を見つけるにはどうすればよいですか?
7 に答える
Helmut Dersch の Jasymca 2 http://webuser.hs-furtwangen.de/~dersch/jasymca2/を試してください。これは、GNU Octave/Matlab のような機能を提供する Java API です。記号数学が含まれています。
Jasymca は最近開発されました。ドキュメントは 2009 年 3 月のもので、Java 1.5+ が必要です。
注意: Jasymca は GPL であるため、商用製品で使用する前に弁護士に相談してください。
連続データか離散データかによって異なります。ニューラルネットについて話しているので、あなたは離散データを持っていると思います。
有限差分は、導関数を近似する1つの方法です。別のアプローチは、ある種の近似を実行し、近似関数を微分することです。これは、計算が容易な導関数(多項式など)を使用したよく知られた関数であると想定しています。
データの独立変数はいくつですか?1つの変数の関数は簡単です。偏導関数が必要なため、2つ以上はより困難です。
あなたはそれをハードコードしようとするべきです
double derivative = (f(x+h) - f(x-h)) / (2*h);
Javaには微積分機能用のライブラリが組み込まれていないと確信しています。ただし、自分で差別化を実装することは、些細なことから非常に困難なことまでさまざまです。
関数を格納および分析する機能がすでにある場合、導関数の取得は、(非常に限られた)数の微分規則をプログラミングするのと同じくらい簡単です。
ただし、DATAsets(抽象関数ではない)に基づく微分を検討している場合は、シンプソンの法則などのさまざまな近似手法を使用できます。
ニューラル ネットワークを使用している場合は、任意の関数の一般的な導関数を取得する必要はほとんどありません。これは、一般的な微積分ライブラリが必要になるものです。Backprop では、活性化関数の導関数を使用する必要があります。通常、活性化関数はシグモイド関数または双曲線 tan 関数になります。どちらもウィキペディアから の派生物を取得し、その関数をニューラル ネットワークのトレーニングに提供するだけです。導関数を毎回実際に解く必要はありません。
他にも一般的なアクティベーション関数はありますが、実際に使用されるのはほんの一握りです。派生物を調べて、必要なものを使用してください。ほとんどのニューラル ネットワーク フレームワークは、通常の活性化関数と導関数を、使用する何らかの基本クラスに組み込むだけです。最も一般的なもののいくつかを次に示します。
Java に関しては、DMelt math programを参照してください。無料です。マニュアルでは、派生の取得方法を見つけることができます。
World Wide Web に対して HTTP 要求を作成できる場合は、SaturnAPI統合スクリプトを作成できます。
開示:私はSaturnAPIに取り組みました