3

この関数scipy.optimize.fmin_bfgsを使用すると、ユーザーはターゲット関数と勾配の両方を入力できます。私のデスクトップには 8 コアのマシンがあるので、次のコマンドを実行してソルバーを並列化できると考えました。

from scipy import optimize
import itertools
import numpy as np

def single_grad_point((idx,px)):
    p = px.copy()
    epsilon = 10**(-6.0)
    p[idx] += epsilon
    d1 = err_func(p)
    p[idx] -= 2*epsilon
    d2 = err_func(p)
    return (d1-d2)/(2*epsilon)

def err_func_gradient(p):
    P = multiprocessing.Pool()   
    input_args = zip(*(xrange(len(p)), itertools.cycle((p,))))
    sol = P.imap(single_grad_point, input_args)
    return np.array(list(sol))

optimize.fmin_bfgs(err_func, p0, fprime=err_func_gradient)

簡単に言えば、マルチプロセッシングを使用してグラデーションの各方向を計算しています。ターゲット関数err_funcが高価な場合、これにより大幅な高速化が得られるようです。ただし、私の質問は、すべての の使用と構成/破壊に関するものmultiprocessing.Poolsです。err_func_gradient何万回も呼び出される可能性があるので、これはどこかでスローダウンやリークを引き起こしますか?

4

2 に答える 2

5

を使用できます。これは、や フレンドなど、いくつかのアルゴリズムmysticの並列バージョンを提供します。scipy.optimizefmin

シンプレックスのそれぞれを並列に評価する単純な呼び出しを実行しようとすると、計算する非常に高価な目的関数がない限り、通常は速度が低下します。ただし、代わりに の複数のインスタンスを呼び出すとfmin、実際には最も急降下する速度で疑似グローバル最適化を得ることができます。次の例は、いくつかのパブで使用されているアルゴリズムを示しています (以下を参照): https://github.com/uqfoundation/mystic/blob/master/examples/buckshot_example06.py

または同様に、ここの例を見てください: のフォークを使用multiprocessing: https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpmap.py

parallelpythonまたは(分散並列コンピューティング) のフォーク: https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_ppmap.py

または拡張機能を使用mpi4py: https://github.com/uqfoundation/pathos/blob/master/examples2/optimize_cheby_powell_mpimap.py

mystic(ソルバー フレームワーク) とpathos(並列計算フレームワーク) はこちらから 入手してください: https://github.com/uqfoundation

パブの参考文献 (どちらも少し古くなっています): http://conference.scipy.org/proceedings/scipy2011/mckerns.html http://trac.mystic.cacr.caltech.edu/project/mystic/wiki/Publications

ただし、より単純なバージョンの を実行したい場合は、fmin初期化とロードをpool1 回だけ行うのが最善の方法です。これはpathosすでに提供されているものですが、自分でコーディングしたい場合は、 のインスタンスをpoolシングルトンとして保存するだけです。 https://github.com/uqfoundation/pathos/blob/master/pathos/multiprocessing.py

于 2014-06-08T14:37:45.857 に答える
-3

まず、グラデーションを次のように計算できます。

(f(x)-f(x+eps))/eps

次に、すべての偏導関数に対して f(x) を 1 回計算します。それはあなたの半分の仕事を節約するはずです

于 2014-05-27T07:31:32.467 に答える