如何在Tensorflow中创建优化器

Alb*_*ini 23 python optimization mathematical-optimization python-2.7 tensorflow

我想在Tensorflow上为我的网络编写一个新的优化算法.我希望实现Levenberg Marquardt优化算法,该算法现在被排除在TF API之外.我发现关于如何编写自定义优化器的文档很差,所以我问是否有人可以给我任何建议.谢谢.

dga*_*dga 16

优化器的最简单示例可能是梯度下降优化器.它显示了如何创建基本优化器类的实例.优化器基类文档说明了这些方法的作用.

优化器的python端向图中添加了新节点,用于计算和应用反向传播的渐变.它提供了传递给ops的参数,并对优化器进行了一些高级管理.然后,您需要实际的"应用"操作.

Ops有python和C++组件.编写训练操作与将操作添加到TensorFlow一般过程相同(但是专门).

有关计算和应用渐变的一组示例训练操作,请参阅 python/training/training_ops.py - 这是实际训练操作的Python粘合剂.请注意,这里的代码主要是关于形状推断 - 计算将在C++中进行.

应用渐变的实际数学运算由Op处理(回想一下,ops是用C++编写的).在这种情况下,应用渐变操作在core/kernels/training_ops.cc中定义.例如,您可以在其中看到ApplyGradientDescentOp的实现,它引用了一个仿函数ApplyGradientDescent:

var.device(d) -= grad * lr();
Run Code Online (Sandbox Code Playgroud)

Op本身的实现遵循add-an-op docs中描述的任何其他op的实现.

  • 感谢您的解释.有没有理由在C++中完成?我不认为在C++中组合这个简单的计算(标量乘法和逐元素减法)应该比在Python中快得多.对于原型设计优化器,用Python做一切都很有用.你知道这是否可能? (2认同)
  • @danijar的简单原因是Python只是Tensorflow的可用接口之一.在C++中实现核心机制有助于为其他语言创建接口. (2认同)
  • 此文件提供了如何在Python中实现Optimizer类的一个很好的示例:https://github.com/openai/iaf/blob/master/tf_utils/adamax.py (2认同)

小智 10

在运行Tensorflow会话之前,应该启动Optimizer,如下所示:

# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
Run Code Online (Sandbox Code Playgroud)

tf.train.GradientDescentOptimizerGradientDescentOptimizer类的一个对象,顾名思义,它实现了梯度下降算法.

该方法最小化()是被称为与"成本"作为参数,由这两种方法的 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])
Run Code Online (Sandbox Code Playgroud)

有关示例的更详细说明,请参阅此博客文章 https://www.bigdatarepublic.nl/custom-optimizer-in-tensorflow/