[강화 학습] DDPG(Deep Deterministic Policy Gradient) 알고리즘에 대한 자세한 설명

1 DDPG 소개

DDPG는 Actor-Critic의 Policy Gradient의 단일 단계 업데이트의 본질을 흡수하고 컴퓨터가 게임 플레이를 학습할 수 있도록 하는 DQN의 본질도 흡수하여 Deep Deterinistic Policy Gradient라는 새로운 알고리즘으로 병합합니다. DDPG는 어떤 알고리즘인지 분해해서 분석해 보겠습니다. 하나.

1.1 딥 및 DQN

Deep은 이름에서 알 수 있듯이 더 깊이 들어가는 것입니다.DQN은 학습을 효과적으로 촉진하기 위해 메모리 뱅크와 구조는 같지만 매개변수 업데이트 빈도가 다른 두 세트의 신경망을 사용합니다. 그런 다음 이 아이디어를 DDPG에도 적용하여 DDPG도 이러한 뛰어난 스타일을 갖도록 했습니다. 그러나 DDPG의 신경망은 DQN보다 조금 더 복잡합니다. DQN을 검토해야 하는 경우 여기를 클릭할 수 있습니다 . DQN).

1.2 결정론적 정책 기울기

다른 강화 학습 알고리즘과 비교할 때 Policy Gradient는 연속 작업에 대한 작업을 선별하는 데 사용할 수 있습니다. 그리고 스크리닝시 학습된 행동분포에 따라 무작위로 선택하는데, 결정론적은 좀 견디기 힘듭니다. 무작위일 필요는 없습니다. 따라서 Deterministic은 action을 출력하는 과정을 변경하여 연속적인 action에 대해 action 값을 범주적으로 출력합니다.

1.3 DDPG 신경망

DDPG 신경망은 사실 앞서 언급한 Actor-Critic 라인과 유사하며 정책 기반 신경망과 가치 기반 가치 신경망이 필요합니다. 신경망 Policy Gradient 측에는 추정 네트워크와 실제 네트워크가 있으며 추정 네트워크는 액터가 현실에서 구현할 실시간 작업을 출력하는 데 사용됩니다. 현실 네트워크는 가치 네트워크 시스템을 업데이트하는 데 사용됩니다. 그래서 가치 체계를 다시 살펴봅시다.실제 네트워크와 추정 네트워크도 있습니다.그들은 이 상태의 값을 출력하고 있지만 입력 끝이 다릅니다.상태 실제 네트워크는 행동에서 관찰된 값과 상태 분석, 상태 추정 네트워크는 해당 시간에 액터가 부과한 조치를 입력으로 사용합니다. 실제로 DDPG의 이러한 접근 방식은 보다 효과적인 학습 프로세스로 이어집니다.

2 DDPG 알고리즘

2.1 요점

DDPG를 한 문장으로 요약: Google DeepMind에서 제안한 Actor-Critic 구조이지만 출력은 동작의 확률이 아니라 특정 동작이며 연속 동작 예측에 사용됩니다. DDPG는 이전에 성공한 DQN 구조를 결합하고 Actor-Critic의 안정성과 수렴성을 언급합니다. Actor-Critic이 완전히 명확하지 않은 경우 여기 https://blog.csdn.net/shoppingend/article/details/124341639?spm=1001.2014.3001.5502 를 클릭하여 확인할 수 있습니다.

2.2 알고리즘

DDPG의 알고리즘은 사실 Actor-Critic이며 Actor 부분의 경우 매개 변수 업데이트에는 Critic도 포함됩니다.
여기에 이미지 설명 삽입
위는 Actor 매개변수의 업데이트에 대한 것입니다. grad[Q]의 전반부는 Critic에서 가져옵니다. Actor에서 가져옵니다. 즉, Actor가 자신의 매개변수를 수정하여 Actor가 이 작업을 수행할 가능성이 높습니다. 따라서 이 둘의 조합은 액터가 큰 Q를 얻을 가능성이 더 큰 방향으로 액션 매개변수를 수정해야 함을 의미합니다.
여기에 이미지 설명 삽입
위는 Critic에 대한 업데이트입니다.DQN과 Double Q-Learning에서 차용합니다.Q를 계산하는 두 개의 신경망이 있습니다.Q_target에서 Actor는 다음 상태에 따라 작업을 선택하는 데 사용됩니다.이 때 Actor도 Actor_target (오래 전에 Actor의 매개변수 포함). 이 방법으로 얻은 Q_target은 DQN과 같은 상관성을 차단하고 수렴성을 향상시킬 수 있습니다.

2.3 주요 코드 구조

우리는 Tensorflow를 사용하여 신경망을 구축합니다.이 Tensorboard의 그림에서 주요 구조를 볼 수 있습니다.
여기에 이미지 설명 삽입
Actor와 Critic의 구조를 따로 살펴보십시오.
여기에 이미지 설명 삽입
구성의 코드 부분은 다음과 같습니다.

class Actor(object):
    def __init__(self):
        ...
        with tf.variable_scope('Actor'):
            # 这个网络用于及时更新参数
            self.a = self._build_net(S, scope='eval_net', trainable=True)
            # 这个网络不及时更新参数, 用于预测 Critic 的 Q_target 中的 action
            self.a_ = self._build_net(S_, scope='target_net', trainable=False)
        ...

class Critic(object):
    def __init__(self):
        with tf.variable_scope('Critic'):
            # 这个网络是用于及时更新参数
            self.a = a  # 这个 a 是来自 Actor 的, 但是 self.a 在更新 Critic 的时候是之前选择的 a 而不是来自 Actor 的 a.
            self.q = self._build_net(S, self.a, 'eval_net', trainable=True)
            # 这个网络不及时更新参数, 用于给出 Actor 更新参数时的 Gradient ascent 强度
            self.q_ = self._build_net(S_, a_, 'target_net', trainable=False)

2.4 배우 평론가

각 Actor-Critic의 두 가지 신경망 구조에 대한 이해를 바탕으로 이들이 어떻게 정보를 전달하고 전달하는지 살펴보겠습니다. 액터가 학습하고 업데이트하는 방식부터 시작하겠습니다.
여기에 이미지 설명 삽입
이 그림에서 Actor의 업데이트가 무엇을 기반으로 하는지 한눈에 알 수 있습니다. 두 개의 eval_net을 사용하는 것을 볼 수 있으므로 다음과 같이 Actor 클래스에 train에 대한 코드를 작성합니다.

with tf.variable_scope('policy_grads'):
    # 这是在计算 (dQ/da) * (da/dparams)
    self.policy_grads = tf.gradients(
        ys=self.a, xs=self.e_params, # 计算 ys 对于 xs 的梯度
        grad_ys=a_grads # 这是从 Critic 来的 dQ/da
    )
with tf.variable_scope('A_train'):
    opt = tf.train.AdamOptimizer(-self.lr)  # 负的学习率为了使我们计算的梯度往上升, 和 Policy Gradient 中的方式一个性质
    self.train_op = opt.apply_gradients(zip(self.policy_grads, self.e_params)) # 对 eval_net 的参数更新

동시에 아래 언급된 Actor에게 보내는 a_grad는 Tensorflow로 계산해야 합니다. 이 a_grad는 Critic 클래스에 있으며 이 a는 s를 기반으로 Actor에서 계산됩니다.

with tf.variable_scope('a_grad'):
    self.a_grads = tf.gradients(self.q, self.a)[0]   # dQ/da

Critic에서는 더 간단한 것을 사용합니다.
여기에 이미지 설명 삽입
아래는 Critic의 업데이트된 코드입니다.

# 计算 target Q
with tf.variable_scope('target_q'):
    self.target_q = R + self.gamma * self.q_    # self.q_ 根据 Actor 的 target_net 来的
# 计算误差并反向传递误差
with tf.variable_scope('TD_error'):
    self.loss = tf.reduce_mean(tf.squared_difference(self.target_q, self.q))  # self.q 又基于 Actor 的 target_net
with tf.variable_scope('C_train'):
    self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)

결국 Actor와 Critic을 구축하고 통합하면서 이것을 썼습니다.

actor = Actor(...)
critic = Critic(..., actor.a, actor.a_)  # 将 actor 同它的 eval_net/target_net 产生的 a/a_ 传给 Critic
actor.add_grad_to_graph(critic.a_grads) # 将 critic 产出的 dQ/da 加入到 Actor 的 Graph 中去

2.5 메모리 뱅크 메모리

다음은 DQN과 유사한 메모리 라이브러리 코드이며 클래스를 사용하여 빌드합니다.

class Memory(object):
    def __init__(self, capacity, dims):
        """用 numpy 初始化记忆库"""

    def store_transition(self, s, a, r, s_):
        """保存每次记忆在 numpy array 里"""

    def sample(self, n):
        """随即从记忆库中抽取 n 个记忆进行学习"""

2.6 라운드별 알고리즘

여기서 라운드 알고리즘은 가장 중요한 부분만 언급하여 불필요한 부분을 절약합니다.

var = 3  # 这里初始化一个方差用于增强 actor 的探索性

for i in range(MAX_EPISODES):
    ...
    for j in range(MAX_EP_STEPS):
        ...

        a = actor.choose_action(s)
        a = np.clip(np.random.normal(a, var), -2, 2) # 增强探索性
        s_, r, done, info = env.step(a)

        M.store_transition(s, a, r / 10, s_)   # 记忆库

        if M.pointer > MEMORY_CAPACITY: # 记忆库头一次满了以后
            var *= .9998    # 逐渐降低探索性
            b_M = M.sample(BATCH_SIZE)
            ...   # 将 b_M 拆分成下面的输入信息
            critic.learn(b_s, b_a, b_r, b_s_)
            actor.learn(b_s)

        s = s_

        if j == MAX_EP_STEPS-1:
            break

기사 출처: Mofan 강화 학습 https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

Supongo que te gusta

Origin blog.csdn.net/shoppingend/article/details/124344083
Recomendado
Clasificación