在线分类时差学习实现

问题描述 投票:0回答:1

我正在读一本书“麻省理工学院的分布式强化学习”,我实现了在线分类时差学习来学习策略的回报分布。 (https://www.distributional-rl.org/contents/chapter3

enter image description here

这是我当前的代码

import numpy as np
import gymnasium as gym

def online_CTD(policy):
    EPISODE = 10000
    LEARNING_RATE = 0.05
    DISCOUNT = 0.99
    EXPLORE = 0.1
    MAX_STEPS = 1000
    M = 31

    env = gym.make('Taxi-v3')

    # initialise
    locations = np.linspace(-1, 1, M)
    #policy = np.random.rand(env.observation_space.n, env.action_space.n)
    probabilities = np.ones((M, env.observation_space.n))
    probabilities = probabilities / np.sum(probabilities)

    for e in range(EPISODE):
        terminated = False
        truncated = False
        state, _ = env.reset()

        while not terminated and not truncated:
            #space = policy[state]
            #action = np.random.choice(len(space), p=space)
            action = np.argmax(policy[state])
            next_state, reward, terminated, truncated, _ = env.step(action)
            temp_policy = np.array([0 for i in range(M)])

            for j in range(1, M+1):
                if terminated or truncated:
                    g = reward
                else:
                    g = reward + DISCOUNT * locations[j - 1]

                if g <= locations[0]:
                    temp_policy[0] += probabilities[j - 1, next_state]
                elif g >= locations[-1]:
                    temp_policy[-1] += probabilities[j - 1, next_state]
                else:
                    i = np.searchsorted(locations, g) - 1
                # print(locations, g, i)
                    d = (g - locations[i]) / (locations[i+1] - locations[i])
                    temp_policy[i] += (1-d) * probabilities[j - 1, next_state]
                    temp_policy[i+1] += d * probabilities[j - 1, next_state]

            for i in range(M):
                probabilities[i, state] = (1-LEARNING_RATE) * probabilities[i, state] + LEARNING_RATE * temp_policy[i]

            state = next_state
        
    return probabilities

但是,当我运行时,最终返回的概率不会等于 1(Q_table 是我早期得到的策略,它始终给出正返回)

probabilities = online_CTD(Q_table)
dist = np.sum(probabilities, axis=1)
print(dist)
print(np.sum(dist))

我预计分布是你在位置区域(

locations = np.linspace(-1, 1, M)
)有更多的概率。这有什么问题吗?

python reinforcement-learning
1个回答
0
投票

这很奇怪,您的实现似乎是正确的(与图像匹配)。鉴于此,这似乎可能只是数值误差的累积。

例如,变量

temp_policy
基本上总是全零(在我的测试中从未包含任何非零值),类似地
probabilities
最终包含小值(在 10^-5 附近),这是最初预期的因为它是一个归一化矩阵。不同寻常的是,它们从未真正改变,环境几乎从未进入获得分数的情况(或真正以任何重大方式发生变化)。因此,
probabilities
中的值不会真正改变其原始值,除非您对其应用的 10000000 多个微小操作中可能存在数值错误。

至于您应该如何解决这个问题,您所附的书籍章节似乎谈到了一些“悬崖域”,我不确定他们的意思,但他们可能指的是

CliffWalking-v0
环境,这可能比你使用的
Taxi-v3
环境工作得更好,我很快测试了它,结果并没有真正改变,但这并不是说它不能工作。我不太确定这本书是如何得到他们所做的结果的,但导致差异的问题可能不是概率加起来不等于一的事实,这似乎只是模型这一事实的症状没有按照有意义的价值观行事。

© www.soinside.com 2019 - 2024. All rights reserved.