日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

强化学习(四)—— Actor-Critic

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习(四)—— Actor-Critic 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

強化學習(四)—— Actor-Critic

  • 1. 網絡結構
  • 2. 網絡函數
  • 3. 策略網絡的更新-策略梯度
  • 4. 價值網絡的更新-時序差分(TD)
  • 5. 網絡訓練流程
  • 6. 案例

1. 網絡結構

  • 狀態價值函數:
    Vπ(st)=∑aQπ(st,a)?π(a∣st)V_\pi(s_t)=\sum_aQ_\pi(s_t,a)\cdot\pi(a|s_t) Vπ?(st?)=a?Qπ?(st?,a)?π(ast?)

  • 通過策略網絡近似策略函數:
    π(a∣s)≈π(a∣s;θ)\pi(a|s)\approx\pi(a|s;\theta) π(as)π(as;θ)

  • 通過價值網絡近似動作價值函數:
    q(s,a;W)≈Q(s,a)q(s,a;W)\approx Q(s,a) q(s,a;W)Q(s,a)

  • 神經網絡近似后的狀態價值函數:
    V(s;θ,W)=∑aq(s,a;W)?π(a∣s;θ)V(s;\theta ,W)=\sum_aq(s,a;W)*\pi(a|s;\theta) V(s;θ,W)=a?q(s,a;W)?π(as;θ)

  • 通過對策略網絡不斷更新以增加狀態價值函數值。

  • 通過對價值網絡不斷更新來更好的預測所獲得的回報。

2. 網絡函數

Policy Network

  • 通過策略網絡近似策略函數
    π(a∣st)≈π(a∣st;θ)π(a|s_t)≈π(a|s_t;\theta) π(ast?)π(ast?;θ)
  • 狀態價值函數及其近似
    Vπ(st)=∑aπ(a∣st)Qπ(st,a)V_π(s_t)=\sum_aπ(a|s_t)Q_π(s_t,a) Vπ?(st?)=a?π(ast?)Qπ?(st?,a)
    V(st;θ)=∑aπ(a∣st;θ)?Qπ(st,a)V(s_t;\theta)=\sum_aπ(a|s_t;\theta)·Q_π(s_t,a) V(st?;θ)=a?π(ast?;θ)?Qπ?(st?,a)
  • 策略學習最大化的目標函數
    J(θ)=ES[V(S;θ)]J(\theta)=E_S[V(S;\theta)] J(θ)=ES?[V(S;θ)]
  • 依據策略梯度上升進行
    θ←θ+β??V(s;θ)?θ\theta\gets\theta+\beta·\frac{\partial V(s;\theta)}{\partial \theta} θθ+β??θ?V(s;θ)?

3. 策略網絡的更新-策略梯度

Policy Network

  • 策略梯度為:
    g(a,θ)=?lnπ(a∣s;θ)?θ?q(s,a;W)?V(s;θ,W)?θ=E[g(A,θ)]g(a,\theta)=\frac{\partial ln\pi(a|s;\theta)}{\partial \theta}\cdot q(s,a;W)\\\frac{\partial V(s;\theta,W)}{\partial \theta}=E[g(A,\theta)] g(a,θ)=?θ?lnπ(as;θ)??q(s,a;W)?θ?V(s;θ,W)?=E[g(A,θ)]
  • 可采用隨機策略梯度,(無偏估計)
    a~π(?∣st;θ)θt+1=θt+β?g(a,θt)a\sim \pi(\cdot|s_t;\theta)\\\theta_{t+1}=\theta_t+\beta·g(a,\theta_t) aπ(?st?;θ)θt+1?=θt?+β?g(a,θt?)

4. 價值網絡的更新-時序差分(TD)

  • TD的目標:
    yt=rt+γq(st+1,at+1;Wt)y_t= r_t+\gamma q(s_{t+1},a_{t+1};W_t) yt?=rt?+γq(st+1?,at+1?;Wt?)
  • 損失函數為:
    loss=12[q(st,at;Wt)?yt]2loss = \frac{1}{2}[q(s_t,a_t;W_t)-y_t]^2 loss=21?[q(st?,at?;Wt?)?yt?]2
  • 采用梯度下降進行更新:
    Wt+1=Wt?α??loss?W∣W=WtW_{t+1}=W_t-\alpha\cdot\frac{\partial loss}{\partial W}|_{W=W_t} Wt+1?=Wt??α??W?loss?W=Wt??

5. 網絡訓練流程

一次更新中,Agent執行一次動作,獲得一次獎勵。

  • 獲得狀態st并隨機采樣動作:at~π(?∣st;θ)a_t \sim\pi(\cdot|s_t;\theta)at?π(?st?;θ)
  • Agent執行動作,并獲得環境的新狀態和獎勵:st+1rts_{t+1}\\r_tst+1?rt?
  • 依據新狀態再次隨機采樣動作(該動作在本次迭代中并不執行):a~t+1~π(?∣st+1;θ)\tilde{a}_{t+1}\sim\pi(\cdot|s_{t+1};\theta)a~t+1?π(?st+1?;θ)
  • 依據價值網絡,分別計算兩個動作和狀態的價值:qt=q(st,at;Wt)qt+1=q(st+1,a~t+1;Wt)q_t=q(s_t,a_t;W_t)\\q_{t+1}=q(s_{t+1},\tilde{a}_{t+1};W_t)qt?=q(st?,at?;Wt?)qt+1?=q(st+1?,a~t+1?;Wt?)
  • 計算TD誤差:δt=qt?(rt+γqt+1)\delta_t=q_t-(r_t+\gamma q_{t+1})δt?=qt??(rt?+γqt+1?)
  • 計算價值網絡的導數:dW,t=?q(st,at;W)?W∣W=Wtd_{W,t}=\frac{\partial q(s_t,a_t;W)}{\partial W}|_{W=W_t}dW,t?=?W?q(st?,at?;W)?W=Wt??
  • 對價值網絡進行梯度更新:Wt+1=Wt?α?δt?dW,tW_{t+1}=W_t-\alpha\cdot\delta_t\cdot d_{W,t}Wt+1?=Wt??α?δt??dW,t?
  • 計算策略網絡的梯度:dθ,t=?ln[π(?∣st;θ)]?θ∣θ=θtd_{\theta,t}=\frac{\partial ln[\pi(\cdot|s_t;\theta)]}{\partial\theta}|_{\theta=\theta_t}dθ,t?=?θ?ln[π(?st?;θ)]?θ=θt??
  • 對策略網絡進行梯度更新,式(2)為式(1)對動作價值函數值使用了baseline,目標函數的期望一致,但是方差減小,網絡更容易收斂。θt+1=θ+β?qt?dθ,tθt+1=θ+β?δt?dθ,t\theta_{t+1}=\theta+\beta\cdot q_t\cdot d_{\theta,t}\\\theta_{t+1}=\theta+\beta\cdot \delta_t\cdot d_{\theta,t}θt+1?=θ+β?qt??dθ,t?θt+1?=θ+β?δt??dθ,t?
  • 6. 案例

    該網絡的收斂對于模型大小、激活函數等參數較敏感。

    # -*- coding: utf-8 -*- # @Time : 2022/3/29 21:51 # @Author : CyrusMay WJ # @FileName: AC.py # @Software: PyCharm # @Blog :https://blog.csdn.net/Cyrus_Mayimport tensorflow as tf import numpy as np import logging import sys import gymclass Critic():def __init__(self,logger=None,input_dim=6,gamma=0.9):self.logger = loggerself.__build_model(input_dim)self.gamma = gammaself.optimizer = tf.optimizers.Adam(learning_rate=0.001)def __build_model(self,input_dim):self.model = tf.keras.Sequential([tf.keras.layers.Dense(32, activation="relu"),tf.keras.layers.Dense(1)])self.model.build(input_shape=[None,input_dim])def predict(self,action,state):action = tf.one_hot([action],depth=2)state = tf.convert_to_tensor([state])x = tf.concat([action,state],axis=1)return self.model(x)[0][0]def train(self,state,state_,action,action_,reward,done):action = tf.one_hot([action], depth=2)state = tf.convert_to_tensor([state])action_ = tf.one_hot([action_], depth=2)state_ = tf.convert_to_tensor([state_])x = tf.concat([action, state], axis=1)x_ = tf.concat([action_, state_], axis=1)done = 0 if done else 1with tf.GradientTape() as tape:q = self.model(x)q_ = self.model(x_)Td_error = (reward + done * self.gamma * q_ - q)loss = tf.square(Td_error)dt = tape.gradient(loss,self.model.trainable_variables)self.optimizer.apply_gradients(zip(dt,self.model.trainable_variables))return Td_errorclass Actor():def __init__(self,logger=None,input_dim=4,gamma=0.9,output_dim=2):self.logger = loggerself.__build_model(input_dim,output_dim)self.gamma = gammaself.optimizer = tf.optimizers.Adam(learning_rate=0.001)self.output_dim = output_dimdef __build_model(self,input_dim,output_dim=2):self.model = tf.keras.Sequential([tf.keras.layers.Dense(32, activation="relu"),tf.keras.layers.Dense(output_dim)])self.model.build(input_shape=[None,input_dim])def predict(self,state):state = tf.convert_to_tensor([state])logits = self.model(state)prob = tf.nn.softmax(logits).numpy()action = np.random.choice([i for i in range(self.output_dim)],p=prob.ravel())return actiondef train(self,state,action,TD_error,done):state = tf.convert_to_tensor([state])with tf.GradientTape() as tape:logits = self.model(state)loss = tf.nn.sparse_softmax_cross_entropy_with_logits(labels = [action], logits=logits)loss = tf.reduce_sum(tf.multiply(TD_error,loss))dt = tape.gradient(loss,self.model.trainable_variables)self.optimizer.apply_gradients(zip(dt,self.model.trainable_variables))class Agent():def __init__(self,gamma=0.9,logger=None):self.gamma = gammaself.logger = loggerself.env = gym.make("CartPole-v0")self.actor = Actor(logger=logger,input_dim=4,gamma=self.gamma,output_dim=2)self.critic = Critic(logger = logger,input_dim=6,gamma=self.gamma)def train(self,tran_epochs=1000,max_act=100):history_returns = []for epoch in range(tran_epochs):single_returns = 0state = self.env.reset()for iter in range(max_act):self.env.render()action = self.actor.predict(state)state_,reward,done,info = self.env.step(action)action_ = self.actor.predict(state_)TD_error = self.critic.train(state,state_,action,action_,reward,done)self.actor.train(state,action,TD_error,done)single_returns+=(reward)state = state_if done:breakif history_returns:history_returns.append(history_returns[-1]*0.9+0.1*single_returns)else:history_returns.append( single_returns)self.logger.info("epoch:{}\{} || epoch return:{:,.4f} || history return:{:,.4f}".format(tran_epochs,epoch+1,single_returns,history_returns[-1]))self.env.close()def test(self,max_act=1000):state = self.env.reset()single_returns = 0for iter in range(max_act):self.env.render()action = self.actor.predict(state)state_, reward, done, info = self.env.step(action)single_returns += (reward)if done:self.logger.info("End in {} iterations".format(iter+1))breakif not done:self.logger.info("success and return is {}".format(single_returns))if __name__ == '__main__':logger = logging.getLogger()logger.setLevel(logging.INFO)screen_handler = logging.StreamHandler(sys.stdout)screen_handler.setLevel(logging.INFO)formatter = logging.Formatter('%(asctime)s - %(module)s.%(funcName)s:%(lineno)d - %(levelname)s - %(message)s')screen_handler.setFormatter(formatter)logger.addHandler(screen_handler)agent = Agent(logger=logger)agent.train(tran_epochs=2000,max_act=500)agent.test()

    本文部分內容為參考B站學習視頻書寫的筆記!

    by CyrusMay 2022 03 29

    摸不到的顏色 是否叫彩虹
    看不到的擁抱 是否叫做微風
    ————五月天(星空)————

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的强化学习(四)—— Actor-Critic的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 韩国日本欧美一区 | 亚洲精品久久久久久久久久久久久 | 日本妇女毛茸茸 | av在线天堂 | 台湾av在线 | 免费激情网站 | 亚洲av无码一区二区二三区 | 国产精品自拍99 | 亚洲天堂777 | 玩偶游戏在线观看免费 | 另类天堂 | 麻豆精品视频免费观看 | 五月婷婷六月婷婷 | www.成人网.com | 亚洲欧洲免费视频 | 浓精喷进老师黑色丝袜在线观看 | 先锋av资源网 | 天天做日日干 | 天天夜夜啦啦啦 | 久久久久爱 | 久久久久97 | 中文字幕高清在线观看 | 午夜影院网站 | 日本人妖网站 | 翔田千里在线播放 | 日韩国产一区 | 亚洲图片自拍偷拍区 | 网站av | 艳妇乳肉豪妇荡乳av无码福利 | 国产人成无码视频在线观看 | 国产精品黄色av | 91亚洲欧美激情 | 亚洲图片一区二区 | 亚洲成人av一区二区 | 亚洲av无码国产精品色午夜 | 丹丹的呻吟声1一7 | 欧美国产精品一区 | 国模人体私拍xvideos | 午夜不卡影院 | 午夜欧美日韩 | 国产精品毛片一区二区在线看 | 久久久久久麻豆 | 日韩电影在线一区 | 日本美女黄网站 | 国产精品国产三级国产专区51区 | 香蕉视频1024 | 日日日操| 天天爱天天爽 | 亚洲精品国产一区二 | 久热99 | 91国产高清 | 污污视频在线免费看 | 午夜九九九| 在线看片中文字幕 | 天天想你在线观看完整版电影免费 | 麻豆国产av超爽剧情系列 | 6699嫩草久久久精品影院 | 日韩精品中文字幕一区二区 | 欧美成人精品欧美一 | 亚洲五级片 | a级大片在线观看 | 精品黄色 | 一级特黄特色的免费大片视频 | 小宵虎南在线观看 | 人妖av在线 | 久久国产主播 | 一区不卡av | 免费看日批视频 | 婷婷中文网 | 国产精品视频久久久 | 青青草娱乐视频 | 九九色精品 | 中文字幕第3页 | 成人自拍视频 | 五十路av在线 | 久久99久久99精品蜜柚传媒 | 亚洲AV成人午夜无码精品久久 | 免费在线播放视频 | 中文字幕免费一区二区 | 日韩精选在线观看 | 国产偷拍一区二区 | www.天堂av | 欧美男人天堂 | 久久激情久久 | 奇米影视网 | 日本免费一区视频 | 请用你的手指扰乱我吧 | 日本欧美一区二区 | 精品国产一区二区不卡 | 少妇精品无码一区二区免费视频 | 浓精喷进老师黑色丝袜在线观看 | 亚洲第一黄| 国产精品久久久久久久午夜 | 久久国产中文字幕 | 天天干天天操天天操 | 丰满熟女人妻一区二区三 | 久久男人天堂 | 久久精品国产亚洲av嫖农村妇女 | 少妇2做爰交换朴银狐 |