この関数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
何万回も呼び出される可能性があるので、これはどこかでスローダウンやリークを引き起こしますか?