如何用强化学习训练逻辑异或?

人工智能 强化学习
2021-10-20 11:20:49

在阅读了一篇出色的博客文章Deep Reinforcement Learning: Pong from Pixels并稍微使用了代码之后,我尝试做一些简单的事情:使用相同的代码来训练逻辑 XOR 门。

但无论我如何调整超参数,增强版本都不会收敛(卡在 -10 左右)。我究竟做错了什么?在这种情况下,出于某种原因,是否可以使用策略梯度?

设置很简单:

  • 3 个输入(1 个用于偏置 =1、x 和 y),隐藏层中的 3 个神经元和 1 个输出。
  • 游戏逐步将 x,y 的所有 4 种组合传递给 RNN,经过 4 步后,如果所有 4 个答案都正确,则奖励 +1,如果至少有一个错误,则奖励 -1。
  • 集共20

代码(从原始分叉并经过最少修改)在这里:https ://gist.github.com/Dimagog/de9d2b2489f377eba6aa8da141f09bc2

PS 几乎相同的代码可以立即(2 秒)用监督学习训练 XOR 门。

3个回答

当我们知道我们想要的结果时使用强化学习,而不是如何到达那里,这就是为什么你不会看到很多人使用它进行分类(因为我们已经知道最优策略,它只是输出类标签)。你已经知道了,只是为未来的读者让路!

正如您所说,您的策略模型很好 - 一个完全连接的模型,其深度足以学习 XOR。我认为奖励梯度有点浅——当我给“3 out 4”正确的奖励 +1 和“4 out of 4”的 +2 奖励时,就会发生收敛(但非常缓慢)。

在这个问题中,强化和收敛之间存在一些混淆。

XOR 问题在历史背景下很有趣,因为当数据集是表示布尔 XOR 操作的排列时,梯度下降的可靠性是单层感知器的同一性(与理想的抛硬币相比没有优势)。这是一种信息论方式,表示单层感知器不能用于学习任意布尔二元运算,以 XOR 和 XAND 作为反例,其中不仅不能保证收敛,而且只能靠运气才能产生功能行为。这就是为什么 MLP 是感知器设计的重要扩展。可以可靠地教授 XOR 运算。

与深度强化学习相关的图像的搜索结果提供了代表所涉及原理的设计图的调查。我们可以注意到,强化学习应用程序的用例与 MLP 及其衍生物的用例明显不同。

解析术语并重新组合以产生最初组合产生 DRL 的概念框架,我们有深度学习强化学习深度学习实际上是一组技术和算法改进,用于将人工网络层组合成更成功的拓扑,从而执行有用的数据中心任务。强化学习是

Sutton 在他为德克萨斯大学(可能是为了摆脱阿尔伯塔省的冬天)的幻灯片中指出,“RL 正在学习控制数据。” 他的定义过于宽泛,因为 MLP、CNN 和 GRU 网络都学习了一个控制数据处理的函数,然后在其预期用例中利用学习到的参数。这就是问题的观点可能基于这些过于宽泛的定义的错误信息性质。

强化学习的区别在于行为可以在使用过程中得到强化。可能存在有益行为的实际并行强化(如在更多受神经学启发的架构中)或学习可能发生在时间分片操作系统中,并与使用所学知识的进程共享处理硬件(如在 Q 学习算法及其衍生算法中) .

一些人将 RL 定义为机器学习技术,它指导沿着行为路径选择行动,从而使行动所采取的后果的一些累积值最大化。这可能是一个过于狭隘的定义,受到马尔可夫过程和 Q 学习的流行的影响。

这是问题中表达的观点的问题。XOR 操作不是可以开辟路径的环境。

如果要构建一个 XOR 迷宫,其中初始状态未定义,并且单个动作是落入象限 10 或 01,它仍然不代表 XOR,因为输入不是布尔向量

BB2,

并且输出不是由 XOR 操作产生的 1 或 0,就像 XOR 操作的多层感知器学习的情况一样。没有累积奖励。如果没有输入并且移动是分成两半并选择 10 或 01,因为它们的奖励高于 00 或 11,那么这可能被认为是强化学习场景,但这将是一个奇怪的场景。

当工具是用于转动螺钉的扳手时,所描述的设置导致“卡住”也就不足为奇了。

如果设计放松了强化并且人工网络减少到两层感知器,那么在给定足够大小的标记数据集或无监督安排的情况下,将保证收敛,其中损失函数只是对结果是否为 XOR 的评估。

为了试验强化学习,智能体必须与环境交互并做出具有指导后续行为的价值后果的选择。无论多么复杂,布尔表达式都不是这种性质。

也许是深度强化学习?

我不确定,但你的实现可以解决 AND 门。我对 OR 门有其他感觉。试想一下 - 首先我们需要了解两个条件的信息,然后我们可以检查复杂的解决方案。首先,我想到了具有一个隐藏层的神经网络。听起来很完美。

我想当你检查这个 Tensorflow-Keras 代码时你会明白:

iterations = 50

model = Sequential()
model.add(Dense(16, input_shape=(None, 2), activation='relu')) # our hidden layer for OR gate problem
model.add(Dense(2, activation='sigmoid'))
model.summary()
opt = Adam(0.01)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['acc'])
# mean_squared_error categorical_crossentropy binary_crossentropy

for iteration in range(iterations):
    x_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # table of inputs
    y_train = np.array([[1, 0], [0, 1], [0, 1], [1, 0]]) # outputs in categorical (first index is 0, second is 1)

    r = np.random.randint(0, len(x_train)) # random input
    r_x = x_train[r]
    r_x = np.array([[r_x]])
    result = model.predict(r_x)[0] # predict
    best_id = np.argmax(result) # get of index of "better" output

    input_vector = np.array([[x_train[r]]])
    isWon = False
    if (best_id == np.argmax(y_train[r])):
        isWon = True # everything is good
    else:
        # answer is bad!
        output = np.zeros((2))
        output[best_id] = -1
        output = np.array([[output]])
        loss = model.train_on_batch(input_vector, output)

    print("iteration", iteration, "; has won?", isWon)

当代理的“答案”很好时——我们不会改变任何东西(但我们可以训练网络以最佳动作为 1 以保持稳定性)。

当答案不好时,我们将动作设置为坏 - 其他动作被选择的可能性更大。

有时学习需要超过 50 次迭代,但这只是我的建议。使用隐藏层神经元计数、学习率和迭代次数。

希望能帮到你:)