1

我正在尝试实现本文(https://arxiv.org/abs/1611.03824)中提出的递归神经网络架构,其中作者使用 LSTM 来最小化黑盒函数(但假设它是可微分的) )。这是所提出的架构的示意图:RNN。简而言之,这个想法是像优化器一样使用 LSTM,它必须学习一个好的启发式算法来为未知函数 y=f(parameters) 提出新参数,以便它向最小值移动。以下是建议程序的工作原理:

  1. p0为参数和函数选择一个初始值y0 = f(p0)
  2. 调用 LSTM 单元input=[p0,y0],其输出是参数的新值output=p1
  3. 评估y1 = f(p1)
  4. 用 调用 LSTM 单元input=[p1,y1],并获得output=p2
  5. 评估y2 = f(p2)
  6. 重复几次,例如在第五次迭代时停止:y5 = f(p5).

我正在尝试在 Tensorflow/Keras 中实现类似的模型,但遇到了一些麻烦。特别是,这种情况与“标准”情况不同,因为我们没有要分析的预定时间序列,而是在 LSTM 单元的每次迭代之后在线生成。[p0,y0=f(p0)]因此,在这种情况下,我们的输入将仅包含时间的开始猜测t=0。如果我理解正确的话,这个模型类似于一对多 LSTM,但不同的是,下一个时间步的输入不仅仅来自前一个单元,而且还形成了一个附加函数的输出(在我们的案例 f)。

我设法创建了一个自定义tf.keras.layers.Layer,它执行单个时间步长的计算(即它执行 LSTM 单元,然后将其输出用作函数 f 的输入):

class my_layer(tf.keras.layers.Layer):
    def __init__(self, units = 4):
        super(my_layer, self).__init__()
        self.cell = tf.keras.layers.LSTMCell(units)

    def call(self, inputs):
        prev_cost = inputs[0]
        prev_params = inputs[1]
        prev_h = inputs[2]
        prev_c = inputs[3]
        
        # Concatenate the previous parameters and previous cost to create new input
        new_input = tf.keras.layers.concatenate([prev_cost, prev_params])
        
        # New parameters obtained by the LSTM cell, along with new internsal states: h and c
        new_params, [new_h, new_c] = self.cell(new_input, states = [prev_h, prev_c])
        
        # Function evaluation
        new_cost = f(new_params)
    
        return [new_cost, new_params, new_h, new_c]

但我不知道如何构建经常性部分。我尝试手动执行此操作,即执行以下操作:

my_cell = my_layer(units = 4)

outputs = my_cell(inputs)
outputs1 = my_cell(outputs)
outputs2 = my_cell(outputs1)

那是对的吗?还有其他更合适的方法吗?

额外的问题:我想训练 LSTM,使其不仅能够优化单个函数 f,而且能够优化一类不同的函数[f1, f2, ...],这些函数具有一些共同的结构,这使得它们足够相似,可以使用相同的 LSTM 进行优化。我怎样才能实现这样一个训练循环,它将这些函数的列表作为输入[f1, f2, ...],并尝试将它们全部最小化?我的第一个想法是采用这种“蛮力”方式:在函数上使用 for 循环,tf.GradientTape并为每个函数评估和应用梯度。

任何帮助深表感谢!非常感谢您!:)

4

0 回答 0