強化學習筆記

2021-10-01 01:57:35 字數 4006 閱讀 2614

1.q-learning與sarsa區別:

lambda 就是乙個衰變值, 他可以讓你知道離獎勵越遠的步可能並不是讓你最快拿到獎勵的步, 所以我們想象我們站在寶藏的位置, 回頭看看我們走過的尋寶之路, 離寶藏越近的腳印越看得清, 遠處的腳印太渺小, 我們都很難看清, 那我們就索性記下離寶藏越近的腳印越重要, 越需要被好好的更新. 和之前我們提到過的 獎勵衰減值 gamma 一樣, lambda 是腳步衰減值, 都是乙個在 0 和 1 之間的數.

當 lambda 取0, 就變成了 sarsa 的單步更新, 當 lambda 取 1, 就變成了回合更新, 對所有步更新的力度都是一樣. 當 lambda 在 0 和 1 之間, 取值越大, 離寶藏越近的步更新力度越大. 這樣我們就不用受限於單步更新的每次只能更新最近的一步, 我們可以更有效率的更新所有相關步了.

3.policy gradients

直接輸出動作的最大好處就是, 它能在乙個連續區間內挑選動作. policy gradients 沒有誤差! 但是他的確是在進行某一種的反向傳遞. 這種反向傳遞的目的是讓這次被選中的行為更有可能在下次發生. 通過reward來確定這個行為是不是應當被增加被選的概率。

觀測的資訊通過神經網路分析, 選出了左邊的行為, 我們直接進行反向傳遞, 使之下次被選的可能性增加, 但是獎懲資訊卻告訴我們, 這次的行為是不好的, 那我們的動作可能性增加的幅度 隨之被減低. 這樣就能靠獎勵來左右我們的神經網路反向傳遞. 我們再來舉個例子, 假如這次的觀測資訊讓神經網路選擇了右邊的行為, 右邊的行為隨之想要進行反向傳遞, 使右邊的行為下次被多選一點, 這時, 獎懲資訊也來了, 告訴我們這是好行為, 那我們就在這次反向傳遞的時候加大力度, 讓它下次被多選的幅度更猛烈! 

輸出的這個 action 可以是乙個連續的值, 之前我們說到的 value-based 方法輸出的都是不連續的值, 然後再選擇值最大的 action. 而 policy gradient 可以在乙個連續分布上選取 action.

loss = tf.reduce_mean(neg_log_prob * self.tf_vt)  # (vt = 本reward + 衰減的未來reward) 引導引數的梯度下降
4.actor-critic

actor基於概率選行為,critic基於actor的行為評判行為的得分,actor根據critic的評分修改選行為的概率.actor想要最大化期望的reward, 在actor critic演算法中, 我們用 「比平時好多少」 (td error) 來當做reward,  actor更新 

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更新:

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)

5.ddpg

ddpg 中所用到的神經網路和之前提到的 actor-critic 形式差不多, 也需要有基於 策略 policy 的神經網路 和基於 價值 value 的神經網路, 但是為了體現 dqn 的思想, 每種神經網路都需要再細分為兩個, policy gradient 這邊, 我們有估計網路和現實網路, 估計網路用來輸出實時的動作, 供 actor 在現實中實行. 而現實網路則是用來更新價值網路系統的. 再來看看價值系統這邊, 我們也有現實網路和估計網路, 他們都在輸出這個狀態的價值, 而輸入端卻有不同, 狀態現實網路這邊會拿著從動作現實網路來的動作加上狀態的觀測值加以分析, 而狀態估計網路則是拿著當時 actor 施加的動作當做輸入.在實際運用中, ddpg 的這種做法的確帶來了更有效的學習過程. 

一句話概括 ddpg:google deepmind 提出的一種使用actor critic結構, 但是輸出的不是行為的概率, 而是具體的行為, 用於連續動作 (continuous action) 的**.ddpg結合了之前獲得成功的dqn結構, 提高了actor critic的穩定性和收斂性.

actor要朝著更有可能獲取大q的方向修改動作引數了.

actor的target產生的actor用於critic的target網路,

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)

5.a3c

多核訓練actor-critic

google deepmind 提出的一種解決actor-critic不收斂問題的演算法. 它會建立多個並行的環境, 讓多個擁有副結構的 agent 同時在這些並行環境上更新主結構中的引數. 並行中的 agent 們互不干擾, 而主結構的引數更新受到副結構提交更新的不連續性干擾, 所以更新的相關性被降低, 收斂性提高. 

強化學習筆記

policy iteration 隨機選擇乙個策略,交替做兩件事 策略評價,和策略改進,則可以得到最優的策略。其中,策略評價即policy evalution,為當前策略計算值函式v 策略改進即policy improvement,即給定乙個值函式,得到乙個改進的策略。value iteration...

強化學習 學習筆記

強化學習任務通常用馬爾可夫決策過程來描述 強化學習任務對應了四元組 強化學習的目標是在環境中不斷地嘗試而學得乙個 策略 policy 策略有兩種表示方法 確定性策略 表示為函式 隨機性策略 表示為概率 策略的優劣在於長期執行這一策略後得到的累積獎賞。強化學習任務中,學習的目的就是要找到能使長期累積獎...

強化學習 強化學習基礎

為了應對車載網路中通訊環境快速變化的難題,可以使用強化學習進行解決,這裡對強化學習的基礎進行整理。主要的應用場景為車載網路中資源分配問題。本文源自莫煩python 強化學習章節,有需要請查閱原文 20200413補充了一些內容,來自這篇部落格,是李巨集毅的深度強化學習的筆記。強化學習的主要構成有 a...