【问题标题】:Custom loss function for Deep Q-Learning深度 Q 学习的自定义损失函数
【发布时间】:2021-02-28 16:52:57
【问题描述】:

在处理强化学习问题时出现以下问题。在我的代码中,在计算损失时,我最终遇到了以下问题:我的神经网络输出 4 个 q 值(给定一个状态作为输入,它输出给定状态下可以采取的每个动作的 q 值 --> 4 种可能的行动)。现在对于 DQN 算法,我想计算 y_true 之间的损失,它基本上表示折扣奖励,因此只是一个标量,我的代理实际采取的行动的 q 值(所以只是四个 q 值之一)。那里我不能使用 keras 中可用的自定义 MSE。我想我需要以下结构:

import keras.backend as kb

def custom_loss_function(batch_action_taken):
    def loss(y_true, y_pred):
        q_value = ? #need to extract the q_values from y_pred according to the action taken in batch_action_taken
        return kb.mean(kb.square(q_value - y_true), axis=-1)
    return loss

但由于函数中的值是 keras 对象,我不知道如何对我放置注释的行进行编码。

我希望,我解释得很好。我也google了很多,但我找不到答案!

编辑:为了澄清目的:

batch_action_taken: 长度为 36 的向量,每个条目为 0,1,2 或 3

y_true:长度为36的向量

y_pred: 大小为 (36, 4)(对于每个数据点,总共 36, 4 个可能的操作)

q_value: 应该是一个长度为 36 的向量,每个条目对应于 y_pred 中的一行中的一个值,具体取决于 batch_action_taken 的对应值em>

【问题讨论】:

    标签: keras deep-learning reinforcement-learning q-learning


    【解决方案1】:

    这可能会有所帮助,

    # Based on your [action_size]
    actions = kb.placeholder(shape=(None,[action_size]), dtype='float32')
    
    q_value = kb.sum(kb.dot(batch_action_taken, actions), axis=1) 
    return kb.mean(kb.square(q_value - y_true), axis=1)
    

    【讨论】:

    • 遗憾的是,我得到了 AttributeError: 'tuple' object has no attribute 'rank' 用于您的代码的第二行
    • 很抱歉听到这个消息。我不确定为什么会这样,但可能与这个问题有关:stackoverflow.com/questions/62744659/…
    猜你喜欢
    • 2018-12-27
    • 2020-11-09
    • 1970-01-01
    • 2023-03-29
    • 2014-12-08
    • 2018-09-25
    • 2021-08-18
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多