1 俳優批評家アルゴリズムの概要
1.1 俳優批評家が存在する理由
Actor-Critic の Actor の前身は Policy Gradient で、これにより連続アクションで適切なアクションを簡単に選択できますが、これを行うと Q ラーニングが麻痺してしまうため、Policy Gradient を直接使用しないのはなぜでしょうか? Critic in Critic の前身は、シングルステップ更新を実行できる Q-Learning またはその他の価値ベースの学習手法でしたが、より伝統的な Policy Gradient はラウンド更新であるため、学習効率が低下します。
これで、Actor と Critic という 2 つの異なるシステムがあり、異なるニューラル ネットワークで置き換えることができます。現実の賞罰はアクターの更新に影響します。Policy Gradient もこれに依存して、適切な更新を取得します。では、いつ賞罰があり、この種の情報を知ることができるのでしょうか?これは価値ベースの強化学習手法が行うことだと思いませんか。次に、批評家を使用してこれらの報酬と罰のメカニズムを学習します。学習後、俳優は指を指し、批評家は俳優に、どの指差しが良くてどれが悪いかを伝えます。批評家は環境間の関係を学習します。と報酬。現在の状態の潜在的な報酬を確認できるため、それを使用してアクターをポイントし、アクターがステップごとに更新されるようにします。単純なポリシー グラデーションを使用する場合、アクターはラウンドの終了まで待機することしかできません。更新を開始します。
しかし、ビジネスには常に悪い面があります。Actor-Critic は 2 つのニューラル ネットワークを設計し、そのたびにパラメーターが連続的な状態で更新されます。各パラメーターの更新の前後には相関関係があり、ニューラル ネットワークは問題のみを調べることになります。一方的に、さらにはニューラルネットワークが何も学習しない原因にもなります。この問題を解決するために、Google DeepMind は Actor-Critic アルゴリズムを変更しました。
1.2 Deep Deterministic Policy Gradient (DDPG) の改良版
以前ビデオ ゲーム Atari で成功した DQN ネットワークを Actor-Critic システムに追加したこの新しいアルゴリズムは Deep Deterministic Policy Gradient と呼ばれ、連続アクション予測で何も学習しないという問題を解決することに成功しました。
記事 [強化学習] ディープ決定論的ポリシー勾配 (DDPG) アルゴリズムの説明では、このアルゴリズムについて詳しく説明しています。記事のリンク: https://blog.csdn.net/shoppingend/article/details/124344083?spm=1001.2014.3001.5502
2 Actor-Criticアルゴリズムの詳細な説明
2.1 要点
Actor-Critic アルゴリズムは、ポリシー勾配 (アクター) と関数近似 (クリティック) を組み合わせた手法であるという一文が要約されています。アクターは確率に基づいて行動を選択し、クリティックはアクターの行動スコアに基づいて行動を判断し、アクターはクリティックのスコアに基づいて選択された行動の確率を変更します。
Actor-Critic メソッドの利点: 単一ステップで更新できるため、従来のポリシー グラディエントよりも高速です。
Actor-Critic手法のデメリット:Criticの価値判断に依存するが、Criticは収束しにくい、Actorの更新と相まってさらに収束しにくい この問題を解決するには, Google Deepmind は、Actor-Critic Deep Deterministic Policy Gradient のアップグレード版を提案しました。後者は DQN の利点を組み合わせて、まれに発生する収束の問題を解決します。
2.2 アルゴリズム
この一連のアルゴリズムは、通常の Policy Gradient アルゴリズムに基づいて変更されています。Policy Gradient アルゴリズムについて詳しくない場合は、ここをクリックしてくださいhttps://blog.csdn.net/shoppingend/article/details/124297444?spm= 1001.2014.3001.5502を一度理解する。
このアルゴリズムは類似しています。アクターがその動作を変更するとき、それは目隠しをして前方に運転するようなものであり、批評家はアクターの運転方向を変えるためにハンドルを握る人です。
より具体的には、アクターがポリシー グラデーション メソッドを使用してグラデーション上昇を実行すると、批評家は今回のグラデーション上昇が正しい上昇であるかどうかをアクターに伝えます。今回のスコアが良くない場合は、上昇。たくさん。
2.3 メインコードの構造
上記は Actor のニューラル ネットワーク構造であり、コード構造は次のとおりです。
class Actor(object):
def __init__(self, sess, n_features, n_actions, lr=0.001):
# 用 tensorflow 建立 Actor 神经网络,
# 搭建好训练的 Graph.
def learn(self, s, a, td):
# s, a 用于产生 Gradient ascent 的方向,
# td 来自 Critic, 用于告诉 Actor 这方向对不对.
def choose_action(self, s):
# 根据 s 选 行为 a
上記はCriticのニューラルネットワーク構造で、コード構造は次のとおりです。
class Critic(object):
def __init__(self, sess, n_features, lr=0.01):
# 用 tensorflow 建立 Critic 神经网络,
# 搭建好训练的 Graph.
def learn(self, s, r, s_):
# 学习 状态的价值 (state value), 不是行为的价值 (action value),
# 计算 TD_error = (r + v_) - v,
# 用 TD_error 评判这一步的行为有没有带来比平时更好的结果,
# 可以把它看做 Advantage
return # 学习时产生的 TD_error
2.4 両方の学習方法
Actor は期待される報酬を最大化したいと考えています。Actor-Critic アルゴリズムでは、報酬として「通常よりどれだけ優れているか」(TError) を使用します。
with tf.variable_scope('exp_v'):
log_prob = tf.log(self.acts_prob[0, self.a]) # log 动作概率
self.exp_v = tf.reduce_mean(log_prob * self.td_error) # log 概率 * TD 方向
with tf.variable_scope('train'):
# 因为我们想不断增加这个 exp_v (动作带来的额外价值),
# 所以我们用过 minimize(-exp_v) 的方式达到
# maximize(exp_v) 的目的
self.train_op = tf.train.AdamOptimizer(lr).minimize(-self.exp_v)
Critic の更新はより簡単で、Q-Learning と同様に実際の誤差と推定誤差 (TError) を更新するだけです。
with tf.variable_scope('squared_TD_error'):
self.td_error = self.r + GAMMA * self.v_ - self.v
self.loss = tf.square(self.td_error) # TD_error = (r+gamma*V_next) - V_eval
with tf.variable_scope('train'):
self.train_op = tf.train.AdamOptimizer(lr).minimize(self.loss)
2.5 各ラウンドのアルゴリズム
for i_episode in range(MAX_EPISODE):
s = env.reset()
t = 0
track_r = [] # 每回合的所有奖励
while True:
if RENDER: env.render()
a = actor.choose_action(s)
s_, r, done, info = env.step(a)
if done: r = -20 # 回合结束的惩罚
track_r.append(r)
td_error = critic.learn(s, r, s_) # Critic 学习
actor.learn(s, a, td_error) # Actor 学习
s = s_
t += 1
if done or t >= MAX_EP_STEPS:
# 回合结束, 打印回合累积奖励
ep_rs_sum = sum(track_r)
if 'running_reward' not in globals():
running_reward = ep_rs_sum
else:
running_reward = running_reward * 0.95 + ep_rs_sum * 0.05
if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True # rendering
print("episode:", i_episode, " reward:", int(running_reward))
break
記事のソース: Mofan 強化学習http://mofanpy.com/tutorials/machine-learning/reinforcement-learning/