Tensorflowでネットワークの新しい最適化アルゴリズムを作成します。 Levenberg Marquardt最適化アルゴリズム を実装したいと考えていますが、現在はTF APIから除外されています。カスタムオプティマイザーの作成方法に関するドキュメントが不十分であることがわかったため、誰かアドバイスをしてもらえないかと尋ねました。ありがとう。
オプティマイザーの最も簡単な例は、おそらく gradient descentオプティマイザー です。基本的な optimizer class のインスタンスを作成する方法を示しています。オプティマイザーの基本クラスのドキュメントでは、メソッドの機能について説明しています。
オプティマイザーのpython側は、逆伝播される勾配を計算して適用する新しいノードをグラフに追加します。opsに渡されるパラメーターを提供し、高レベルの一部を実行しますオプティマイザーの管理次に、実際の「適用」操作が必要です。
OpsにはpythonとC++コンポーネントの両方があります。トレーニングopの作成は、 Op = to TensorFlow 。
勾配を計算して適用するトレーニング操作のセットの例については、 python/training/training_ops.py を参照してください-これはPython実際のトレーニング操作の接着剤です。注ここでのコードはほとんど形状推定に関するものであり、計算はC++で行われます。
勾配を適用するための実際の計算は、Opによって処理されます(一般に、opsはC++で記述されていることを思い出してください)。この場合、適用勾配opsは core/kernels/training_ops.cc 。たとえば、ApplyGradientDescentOpの実装は、ファンクターApplyGradientDescentを参照しています。
var.device(d) -= grad * lr();
Op自体の実装は、add-an-opドキュメントで説明されている他のopの実装に従います。
Tensorflowセッションを実行する前に、次のようにOptimizerを開始する必要があります。
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
tf.train.GradientDescentOptimizerはクラスのオブジェクトですGradientDescentOptimizerおよびasその名前は、勾配降下アルゴリズムを実装しています。
メソッドminimize()は、パラメーターとして「コスト」で呼び出され、2つのメソッドcompute_gradients( )、次にapply_gradients()。
ほとんどの(カスタム)オプティマイザーの実装では、メソッドapply_gradients()を適応させる必要があります。
このメソッドは、作成する(新しい)オプティマイザー(クラス)に依存して、次のメソッドを実装します:_ create_slots()、_ prepare()、_ apply_dense()、および_apply_sparse()。
_ create_slots()および_ prepare()などの追加変数を作成および初期化する勢いとして。
_ apply_dense()、および_ apply_sparse()は実際のOpsを実装します。変数を更新します。
通常、OpsはC++で記述されています。 C++ヘッダーを自分で変更しなくても、これらのメソッドを介して一部のOpsのpythonラッパーを返すことができます。これは次のように行います。
def _create_slots(self, var_list):
# Create slots for allocation and later management of additional
# variables associated with the variables to train.
# for example: the first and second moments.
'''
for v in var_list:
self._zeros_slot(v, "m", self._name)
self._zeros_slot(v, "v", self._name)
'''
def _apply_dense(self, grad, var):
#define your favourite variable update
# for example:
'''
# Here we apply gradient descents by substracting the variables
# with the gradient times the learning_rate (defined in __init__)
var_update = state_ops.assign_sub(var, self.learning_rate * grad)
'''
#The trick is now to pass the Ops in the control_flow_ops and
# eventually groups any particular computation of the slots your
# wish to keep track of:
# for example:
'''
m_t = ...m... #do something with m and grad
v_t = ...v... # do something with v and grad
'''
return control_flow_ops.group(*[var_update, m_t, v_t])
例の詳細な説明については、このブログ投稿を参照してください https://www.bigdatarepublic.nl/custom-optimizer-in-tensorflow/