首页 > 解决方案 > RL Card Game DQN 上的预测输出为 NaN

问题描述

我正在尝试为流行的葡萄牙纸牌游戏制作强化学习项目。我有环境工作。该代码可以使用随机选择自行运行 n 轮。

为了快速解释,游戏类似于 Hearts。它有2支球队的4名球员。每个玩家有 10 张牌,如果可能的话,玩下花色,直到没有牌为止。每墩计分,10墩后得分超过60分的队伍获胜。

首先,我对如何“编码”卡片/套牌有一些疑问。我将桌上的牌、手头的牌和已经打过的牌传递给模型。我对甲板进行了一次热编码,4套花色,10个数字/数字。我还必须包括王牌(取自回合开始)。例如,一张牌看起来像:[ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ],其中前四个数字是花色,并且最后一个是王牌(布尔值),其余的是什么牌(2、3、4、5、6、j、q、k、7、a)。我正在为每手牌、每张牌桌、每张牌都传递牌组,所以 40*3,每张牌有 15 个特征(展平时有 1800 个特征)。可能这不是最好的方法,如果有人可以就此提出建议,那就太好了。

有了这些数据,我将 1 个玩家设置为 AI 代理。当轮到 AI 时,状态是手牌、桌上的牌、打出的牌。对于下一个状态,我将使用相同类型的数据通过技巧结束。该技巧的奖励是累积值(最多 120 分)。当我运行代码时,损失初始输出一个值,就像第一次一样,然后显示 NaN。所以预测也以 NaN 的形式出现(我有 10 个输出,手上的每张牌都有 1 个。也对这个有一些疑问,因为它们从 10 张牌开始,但随着游戏的进行和牌的开始,这个数字变为零。)

这是训练的代码:

async expReplay() {
    console.debug('Training...')
    const minibatch = await this.memory.concat().sort(() => .5 - Math.random()).slice(0, this.batchSize)

    for (let i = 0; i < minibatch.length - 1; i++) {
        let [state, action, reward, next_state, done] = minibatch[i]

        state = await tf.concat(state).flatten().reshape([1, this.stateSize])
        next_state = await tf.concat(next_state).flatten().reshape([1, this.stateSize])
        let target = reward

        if (!done) {
            let predictNext = await this.model.predict(next_state)
            target = reward + this.gamma * predictNext.argMax().dataSync()[0]
        }
        let target_f = await this.model.predict(state).dataSync()

        target_f[action] = target
        target_f = await tf.tensor2d(target_f, [1, this.actionSize])
        await this.model.fit(state, target_f, {
            epochs: 1,
            verbose: 1,
            callbacks: {
                onEpochEnd: (epoch, logs) => {
                    process.stdout.write(`${logs.loss} ${logs.acc}                             \r`)
                }
            }
        })

        await state.dispose()
        await next_state.dispose()
        await target_f.dispose()
    }
    if (this.epsilon > this.epsilonMin) {
        this.epsilon *= this.epsilonDecay
    }
    return 'Training... stop!'
}

这个循环,我以前在 DQN 上使用过,也用于我正在试验的比特币交易者,它运行良好。所以我猜我的数据在某个地方是错误的。我已经记录了 state 和 next_state 来检查 NaN 但没有发现任何...

如果您需要更多信息,请询问!

标签: reinforcement-learningtensorflow.js

解决方案


推荐阅读