日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

强化学习(八) - 深度Q学习(Deep Q-learning, DQL,DQN)原理及相关实例

發(fā)布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 强化学习(八) - 深度Q学习(Deep Q-learning, DQL,DQN)原理及相关实例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深度Q學習原理及相關(guān)實例

    • 8. 深度Q學習
      • 8.1 經(jīng)驗回放
      • 8.2 目標網(wǎng)絡(luò)
      • 8.3 相關(guān)算法
      • 8.4 訓練算法
      • 8.5 深度Q學習實例
        • 8.5.1 主程序
          • 程序注釋
        • 8.5.2 DQN模型構(gòu)建程序
          • 程序注釋
        • 8.5.3 程序測試
      • 8.6 雙重深度Q網(wǎng)絡(luò)
      • 8.7 對偶深度Q網(wǎng)絡(luò)

8. 深度Q學習

深度Q學習將深度學習和強化學習相結(jié)合,是第一個深度強化學習算法。深度Q學習的核心就是用一個人工神經(jīng)網(wǎng)絡(luò)q(s,a;θ),s∈S,a∈Aq(s,a;\theta),s∈\mathcal{S},a∈\mathcal{A}q(s,a;θ),sS,aA來代替動作價值函數(shù)。其中θ\thetaθ為神經(jīng)網(wǎng)絡(luò)權(quán)重,在前面文章中,也使用過w\text{w}w。由于神經(jīng)網(wǎng)絡(luò)具有強大的表達能力,能夠自動尋找特征,所以采用神經(jīng)網(wǎng)絡(luò)有潛力比傳統(tǒng)人工特征強大得多。最近基于深度Q網(wǎng)絡(luò)的深度強化學習算法有了重大的進展,在目前學術(shù)界有非常大的影響力。當同時出現(xiàn)異策、自益和函數(shù)近似時,無法保證收斂性,會出現(xiàn)訓練不穩(wěn)定或訓練困難等問題。針對出現(xiàn)的各種問題,研究人員主要從以下兩方面進行了改進。

  • 經(jīng)驗回放(experience replay):將經(jīng)驗(即歷史的狀態(tài)、動作、獎勵等)存儲起來,再在存儲的經(jīng)驗中按一定的規(guī)則采樣。
  • 目標網(wǎng)絡(luò)(target network):修改網(wǎng)絡(luò)的更新方式,例如不把剛學習到的網(wǎng)絡(luò)權(quán)重馬上用于后續(xù)的自益過程。本節(jié)后續(xù)內(nèi)容將從這兩條主線出發(fā),介紹基于深度Q網(wǎng)絡(luò)的強化學習算法。

8.1 經(jīng)驗回放

V. Mnih 等在 2013 年 發(fā) 表 文 章 《Playing Atari with deep reinforcement leaming》,提出了基于經(jīng)驗回放的深度Q網(wǎng)絡(luò),標志著深度Q網(wǎng)絡(luò)的誕生,也標志著深度強化學習的誕生1

采用批處理的模式能夠提供穩(wěn)定性。經(jīng)驗回放就是一種讓經(jīng)驗的概率分布變得穩(wěn)定的技術(shù),它能提高訓練的穩(wěn)定性。
經(jīng)驗回放主要有“存儲”和 “采樣回放”兩大關(guān)鍵步驟。其相關(guān)算法在之后會介紹, 現(xiàn)在主要來看其特征。

  • 存儲:將軌跡以(St,At,Rt+1,St+1)(S_t,A_t, R_{t+1}, S_{t+1})(St?,At?,Rt+1?,St+1?) 等形式存儲起來;
  • 采樣回放:使用某種規(guī)則從存儲的(St,At,Rt+1,St+1)(S_t,A_t, R_{t+1}, S_{t+1})(St?,At?,Rt+1?,St+1?) 中隨機取出一條或多條經(jīng)驗。

經(jīng)驗回放有以下好處。

  • 在訓練Q網(wǎng)絡(luò)時,可以消除數(shù)據(jù)的關(guān)聯(lián),使得數(shù)據(jù)更像是獨立同分布的(獨立同分布是很多有監(jiān)督學習的證明條件)。這樣可以減小參數(shù)更新的方差,加快收斂。
  • 能夠重復使用經(jīng)驗,對于數(shù)據(jù)獲取困難的情況尤其有用。從存儲的角度,經(jīng)驗回放可以分為集中式回放和分布式回放。

回放可以分為以下幾種,

  • 集中式回放:智能體在一個環(huán)境中運行,把經(jīng)驗統(tǒng)一存儲在經(jīng)驗池中。
  • 分布式回放:智能體的多份拷貝(worker)同時在多個環(huán)境中運行,并將經(jīng)驗統(tǒng)一存 儲于經(jīng)驗池中。由于多個智能體拷貝同時生成經(jīng)驗,所以能夠在使用更多資源的同
    時更快地收集經(jīng)驗。從采樣的角度,經(jīng)驗回放可以分為均勻回放和優(yōu)先回放。
  • 均勻回放:等概率從經(jīng)驗集中取經(jīng)驗,并且用取得的經(jīng)驗來更新最優(yōu)價值函數(shù)。
  • 優(yōu)先回放(PrioritizedExperienceReplay, PER): 為經(jīng)驗池里的每個經(jīng)驗指定一個優(yōu)
    先級,在選取經(jīng)驗時更傾向于選擇優(yōu)先級高的經(jīng)驗。

T. Schaul等 于 2016年發(fā)表文章《Prioritized experience replay》,提出了優(yōu)先回放。優(yōu)先回放的基本思想是為經(jīng)驗池里的經(jīng)驗指定一個優(yōu)先級,在選取經(jīng)驗時更傾向于選擇優(yōu)先級高的經(jīng)驗。一般的做法是,如果某個經(jīng)驗(例如經(jīng)驗iii)的優(yōu)先級為pip_ipi?,那么選取該經(jīng)驗的概率為
pi=pi∑kpkp_i = \frac{p_i}{\sum_{k} p_k}pi?=k?pk?pi??

經(jīng)驗值有許多不同的選取方法,最常見的選取方法有成比例優(yōu)先基于排序優(yōu)先

  • 成比例優(yōu)先(proportional priority):第iii個經(jīng)驗的優(yōu)先級為
    pi=(δi+ε)αp_i = {(\delta_i + \varepsilon)^{\alpha}}pi?=(δi?+ε)α
    其中δi\delta_iδi?是時序差分誤差,ε\varepsilonε是預先選擇的一個小正數(shù),α\alphaα是正參數(shù)。
  • 基于排序優(yōu)先(rank-basedpriority):第iii個經(jīng)驗的優(yōu)先級為
    pi=(1ranki)αp_i = (\frac{1}{\text{rank}_{i}})^{\alpha}pi?=(ranki?1?)α
    其中ranki\text{rank}_{i}ranki?是第iii個經(jīng)驗從大到小排序的排名, 排名從1開始。

經(jīng)驗回放也不是完全沒有缺點。例如,它也會導致回合更新和多步學習算法無法使用。一般情況下,如果我們將經(jīng)驗回放用于Q學習,就規(guī)避了這個缺點。

8.2 目標網(wǎng)絡(luò)

對于基于自益的Q學習,其回報的估計和動作價值的估計都和權(quán)重θ\thetaθ有關(guān)。當權(quán)重值變化時,回報的估計和動作價值的估計都會變化。在學習的過程中,動作價值試圖追逐一個變化的回報,也容易出現(xiàn)不穩(wěn)定的情況??梢允褂弥敖榻B的半梯度下降的算法來解決這個問題。在半梯度下降中,在更新價值參數(shù)θ\thetaθ時,不對基于自益得到的回報估計UtU_{t}Ut?求梯度。其中一種阻止對UtU_tUt?求梯度的方法就是將價值參數(shù)復制一份得到θtarget\theta_{\text{target}}θtarget?, 在計算UtU_tUt?時用θtarget\theta_{\text{target}}θtarget?目標計算。

基于這一方法,V. Mnih等 在 2015年發(fā)表了論文《Human-level control through deep reinforcement learning》提出了目標網(wǎng)絡(luò)(target network) 這一概念。 目標網(wǎng)絡(luò)是在原有的神經(jīng)網(wǎng)絡(luò)之外再搭建一份結(jié)構(gòu)完全相同的網(wǎng)絡(luò)。原先就有的神經(jīng)網(wǎng)絡(luò)稱為評估網(wǎng)絡(luò)( evaluation network)。在學習的過程中,使用目標網(wǎng)絡(luò)來進行自益得到回報的評估值,作 為學習的目標。在權(quán)重更新的過程中,只更新評估網(wǎng)絡(luò)的權(quán)重,而不更新目標網(wǎng)絡(luò)的權(quán)重。這樣,更新權(quán)重時針對的目標不會在每次迭代都變化,是一個固定的目標。在完成一定次數(shù)的更新后,再將評估網(wǎng)絡(luò)的權(quán)重值賦給目標網(wǎng)絡(luò),進而進行下一批更新。這樣,目標網(wǎng)絡(luò)也能得到更新。由于在目標網(wǎng)絡(luò)沒有變化的一段時間內(nèi)回報的估計是相對固定的,目標網(wǎng)絡(luò)的引入增加了學習的穩(wěn)定性。所以,目標網(wǎng)絡(luò)目前已經(jīng)成為深度Q學習的主流做法。

8.3 相關(guān)算法

現(xiàn)在我們考慮使用深度Q學習算法來訓練智能體玩游戲2

在每一個時間步驟中,智能體從游戲動作集A=1,...K\mathcal{A} = {1, ... K}A=1,...K中選擇一個動作。該動作被傳遞給模擬器并修改其內(nèi)部狀態(tài)和游戲分數(shù)。在一般情況下,環(huán)境可能是隨機的。仿真器的內(nèi)部狀態(tài)不被智能體觀察到,相反,智能體觀察到一個來自仿真器的圖像xt∈Rdx_t\in \mathbb{R}^dxt?Rd,這是一個代表當前屏幕的像素值的向量。此外,它還會收到代表游戲分數(shù)變化的獎勵 rtr_trt?。需要注意的是,一般情況下,游戲得分可能取決于之前的整個動作和觀察序列;關(guān)于一個動作的反饋可能只有在經(jīng)過數(shù)千次的時間步長之后才會收到。

由于智能體只能觀察當前屏幕,任務(wù)是部分觀察,許多模擬器狀態(tài)在感知上是異構(gòu)的(即不可能只從當前屏幕xtx_txt?中完全了解當前情況)。因此,動作和觀察的序列st=x1,a1,x2,...,at?1,xts_t = x_1,a_1,x_2,...,a_{t-1},x_tst?=x1?,a1?,x2?,...,at?1?,xt? 被輸入到算法中,然后算法根據(jù)這些序列學習游戲策略。仿真器中的所有序列都被假定為在有限的時間步長內(nèi)終止。這個形式化的過程產(chǎn)生了一個大而有限的馬爾科夫決策過程(MDP),在這個過程中,每個序列都是一個獨立的狀態(tài)。因此,我們可以將標準的強化學習方法應用于MDP,只需將完整序列sts_tst?作為時間ttt的狀態(tài)表示即可。

智能體的任務(wù)是在模擬器中選擇最佳的動作最大化未來的損失.我們做一個標準的假設(shè),對未來的每一步回報采用一個折扣因子γ\gammaγ(γ\gammaγ從始至終設(shè)置為0.99),然后定義了在時間ttt上經(jīng)過折扣后的回報Rt=∑t′=tTγt′?trt′R_t = \sum_{t'=t}^{T}\gamma^{t'-t}r_{t'}Rt?=t=tT?γt?trt?,其中TTT為最終停止的時間步。我們定義最佳動作價值函數(shù)Q?(s,a)Q^*(s, a)Q?(s,a)作為遵循任何策略所能獲得的最大預期收益。在經(jīng)過一些狀態(tài)sss和采取一些動作aaa后,Q?(s,a)=max?πE[Rt∣st=s,at=a,π]Q^*(s, a) = \max_{\pi}\mathbb{E}[R_t|s_t = s, a_t =a, \pi]Q?(s,a)=maxπ?E[Rt?st?=s,at?=a,π],其中π\(zhòng)piπ作為在狀態(tài)sss采取的動作aaa的映射,即策略。

最優(yōu)行為價值函數(shù)遵循一個重要的恒等式,這個恒等式被稱為貝爾曼方程(Bellman equation)。這基于以下直覺:如果狀態(tài)s′s's在下一個時間步的最優(yōu)值Q?(s′,a′)Q^*(s', a')Q?(s,a)對于所有可能的行動a′a'a都已知,那么最優(yōu)策略就是選擇使期望值r+γQ?(s′,a′)r + \gamma Q^*(s', a')r+γQ?(s,a)最大化的行動a′a'a:
Q?(s,a)=Es′[r+γmax?a′Q?(s′,a′)∣s,a]Q^*(s, a) = \mathbb{E}_{s'}[r + \gamma \max_{a'}Q^*(s', a')|s, a]Q?(s,a)=Es?[r+γamax?Q?(s,a)s,a]

許多強化學習算法背后的基本思想是通過使用貝爾曼方程作為迭代更新來估計動作價值函數(shù),Qi+1(s,a)=Es′[r+γmax?a′Qi(s′,a′)∣s,a]Q_{i+1}(s, a) = \mathbb{E}_{s'}[r + \gamma \max_{a'}Q_{i}(s', a')|s, a]Qi+1?(s,a)=Es?[r+γmaxa?Qi?(s,a)s,a]。這些價值迭代算法都收斂于最優(yōu)動作價值函數(shù),當i→∞i\to \infiniQi→Q?Q_i \to Q^*Qi?Q?。在實踐中,這種基本的方法是不切實際的,因為動作-價值函數(shù)是對每個狀態(tài)分別估計的,沒有任何泛化。相反,通常使用函數(shù)逼近器來估計動作價值函數(shù)Q(s,a;θ)≈Q?(s,a)Q(s, a;\theta) \approx Q^*(s, a)Q(s,a;θ)Q?(s,a)。在強化學習中這是典型的線性函數(shù)逼近器,但是有時用非線性函數(shù)逼近器代替,如神經(jīng)網(wǎng)絡(luò)。我們把帶有權(quán)值θ\thetaθ的神經(jīng)網(wǎng)絡(luò)函數(shù)逼近器稱為Q網(wǎng)絡(luò)。Q網(wǎng)絡(luò)可以通過在迭代iii中調(diào)整參數(shù)θi\theta_iθi?來訓練減少貝爾曼方程中的均方誤差, 其中最佳目標值r+γmax?a′Q?(s′,a′)r+\gamma \max_{a'}Q^*(s', a')r+γmaxa?Q?(s,a)被替代為近似目標值y=r+γmax?a′Q(s′,a′;θi?)y =r+\gamma \max_{a'}Q(s', a';\theta_i^{-})y=r+γmaxa?Q(s,a;θi??),其使用先前的一些迭代中的參數(shù)θi?\theta_{i}^{-}θi??。這就產(chǎn)生了一個損失函數(shù)Li(θi)L_i(\theta_i)Li?(θi?)的序列,它在每次迭代iii時發(fā)生變化,

Li(θi)=Es,a,r[(Es′[y∣s,a]?Q(s,a;θi))2]=Es,a,r,s′[(y?Q(s,a;θi))2]+Es,a,r[Vs′[y]]\begin{aligned}L_i(\theta_i) & = \mathbb{E}_{s, a,r} [(\mathrm{E}_{s'}[y|s,a] - Q(s,a;\theta_i))^2] \\ &= \mathbb{E}_{s, a,r, s'}[(y - Q(s, a;\theta_i))^2]+ \mathrm{E}_{s, a, r}[\mathrm{V}_{s'}[y]]\end{aligned}Li?(θi?)?=Es,a,r?[(Es?[ys,a]?Q(s,a;θi?))2]=Es,a,r,s?[(y?Q(s,a;θi?))2]+Es,a,r?[Vs?[y]]?

請注意,目標取決于網(wǎng)絡(luò)權(quán)重;這與用于監(jiān)督學習的目標不同,后者在學習開始前是固定的。在優(yōu)化的每一個階段,我們在優(yōu)化第iii個損失函數(shù)Li(θi)L_i(\theta_i)Li?(θi?)時,保持上一次迭代的參數(shù)θi?\theta_{i}^-θi??固定,從而產(chǎn)生一系列定義明確的優(yōu)化問題。最后一項是目標的方差,它不依賴于我們當前優(yōu)化的參數(shù)θi\theta_iθi?,因此可以忽略。將損失函數(shù)相對于權(quán)重進行微分,我們得出以下梯度:

?θiL(θi)=Es,a,r,s′[(r+γmax?a′Q(s′,a′;θi?)?Q(s,a;θi))?θiQ(s,a;θi))]\nabla_{\theta_i}L(\theta_i) = \mathbb{E}_{s,a,r,s'}[(r+\gamma\max_{a'}Q(s',a';\theta_{i}^-)-Q(s, a;\theta_i))\nabla_{\theta_i}Q(s, a;\theta_i))]?θi??L(θi?)=Es,a,r,s?[(r+γamax?Q(s,a;θi??)?Q(s,a;θi?))?θi??Q(s,a;θi?))]

與其計算上述梯度中的全部期望值,不如通過隨機梯度下降來優(yōu)化損失函數(shù),這通常是計算上的便利。在這個框架中,通過在每一個時間步長后更新權(quán)重,使用單樣本替換期望值,并設(shè)置θi?=θi?1\theta_{i}^- = \theta_{i-1}θi??=θi?1?,可以恢復熟悉的Q-learning算法。

需要注意的是,這個算法是無模型的:它直接使用仿真器的樣本來解決強化學習任務(wù),而不需要明確地估計獎賞和過渡動態(tài)P(r,s′∣s,a)P(r, s'|s, a)P(r,ss,a).它也是off-policy:它學習貪婪的策略a=arg?max?a′Q(s,a′;θ)a = \argmax_{a'}Q(s,a';\theta)a=aargmax?Q(s,a;θ),以確保充分探索狀態(tài)空間。在實際工作中,行為分布往往由ε\varepsilonε-greedy策略選擇,遵循概率1?ε1-\varepsilon1?ε貪婪策略,選擇概率ε\varepsilonε的隨機行動。

8.4 訓練算法

訓練深度Q-網(wǎng)絡(luò)的完整算法在下圖所示的算法1中提出。智能體根據(jù)基于Q表的ε\varepsilonε-貪婪策略選擇和執(zhí)行動作。 由于使用任意長度的歷史作為神經(jīng)網(wǎng)絡(luò)的輸入可能是困難的,Q函數(shù)因此工作在由上述函數(shù)?\phi?產(chǎn)生的固定長度的歷史表征上。該算法以兩種方式修改了標準的在線Q-learning,使其適用于訓練大型神經(jīng)網(wǎng)絡(luò)而不產(chǎn)生分歧。

首先,這里使用了經(jīng)驗回放,我們將智能體在每個時間步的經(jīng)驗et=(st,at,rt,st+1)e_t=(s_t,a_t,r_t,s_{t+1})et?=(st?at?rt?st+1?)存儲在一個數(shù)據(jù)集Dt=e1,...,etD_t={e_1,...,e_t}Dt?=e1?...,et?中,將許多情節(jié)(其中一個情節(jié)的結(jié)束發(fā)生在達到終端狀態(tài)時)匯集到重放存儲器中。在算法的內(nèi)循環(huán)過程中,我們對從存儲樣本池中隨機抽取的經(jīng)驗樣本(s,a,r,s′)~U(D)(s,a,r,s') \thicksim U(D)(s,a,r,s)U(D)進行Q-learning更新,或稱minibatch更新。這種方法比標準的在線Q-learning有幾個優(yōu)勢。

  • 第一,每一步的經(jīng)驗都有可能被用于許多權(quán)重更新,這使得數(shù)據(jù)效率更高。
  • 第二,直接從連續(xù)的樣本中學習是低效的,因為樣本之間有很強的相關(guān)性;隨機化樣本可以打破這些相關(guān)性,從而降低更新的方差。
  • 第三,在對策略進行學習時,當前的參數(shù)決定了參數(shù)訓練的下一個數(shù)據(jù)樣本。例如,如果最大化動作是向左移動,那么訓練樣本將以左手邊的樣本為主;如果最大化動作隨后切換到右邊,那么訓練分布也將切換。

很容易看出,不需要的反饋循環(huán)可能會出現(xiàn),參數(shù)可能會被卡在一個糟糕的局部最小值中,甚至是災難性的偏離。通過使用經(jīng)驗重放,行為分布是對其以前的許多狀態(tài)進行平均,平滑學習,避免參數(shù)的振蕩或發(fā)散。需要注意的是,通過經(jīng)驗重放學習時,需要進行off-policy學習(因為我們當前的參數(shù)與用于生成樣本的參數(shù)不同),這也是選擇Q-learning的動機。

在實踐中,算法只在重放存儲器中存儲最后的NNN個經(jīng)驗元組,并在執(zhí)行更新時從DDD中隨機均勻取樣。這種方法在某些方面是有局限性的,因為內(nèi)存緩沖區(qū)并不能區(qū)分重要的轉(zhuǎn)折,而且由于內(nèi)存大小NNN是有限的,所以總是用最近的轉(zhuǎn)折來覆蓋。同樣,均勻采樣對重放內(nèi)存中的所有轉(zhuǎn)折給予同等的重要性。

對在線Q-learning的第二個修改旨在進一步提高方法與神經(jīng)網(wǎng)絡(luò)的穩(wěn)定性,就是在Q-learning更新中使用一個單獨的網(wǎng)絡(luò)來生成目標yjy_jyj?,即,建立目標網(wǎng)絡(luò)。更準確的說,每一次C更新,我們都會克隆網(wǎng)絡(luò)Q,得到一個目標網(wǎng)絡(luò)Q^\hat{Q}Q^?,并使用Q^\hat{Q}Q^?來生成Q-learning目標yjy_jyj?,用于后續(xù)C更新Q。與標準的在線Q-learning相比,這種修改使得算法更加穩(wěn)定,在標準的在線Q-learning中,增加Q(st,at)Q(s_t,a_t)Q(st?,at?)的更新往往也會增加所有aaaQ(st+1,a)Q(s_{t+1},a)Q(st+1?,a),因此也會增加目標yjy_jyj?,可能會導致策略的振蕩或分歧。使用較舊的參數(shù)集生成目標,在對Q進行更新和更新影響目標yjy_jyj?之間增加了一個延遲,使得分歧或振蕩的可能性大大降低。

將更新r+γmax?a′Q(s′,a′;θi?)?Q(s,a;,θi)r+\gamma \max_{a'}Q(s',a';\theta_{i}^{-})-Q(s, a;,\theta_i)r+γmaxa?Q(s,a;θi??)?Q(s,a;,θi?)中的誤差項約束為-1和1之間是很有幫助的.因為絕對值損失函數(shù)∣x∣|x|x對x的所有負值都有-1的導數(shù),對x的所有正值都有1的導數(shù),所以將平方誤差剪裁為?1-1?1111之間相當于對(?1,1)(-1,1)(?1,1)區(qū)間外的誤差使用絕對值損失函數(shù).這種形式的誤差剪裁進一步提高了算法的穩(wěn)定性.

8.5 深度Q學習實例

在這個實例里我們采用"LunarLander-v2"環(huán)境。

LunarLander-v2 著陸臺總是在坐標(0,0)處。坐標是狀態(tài)向量的前兩個數(shù)字。從屏幕頂部移動到著陸臺并以零速度降落的獎勵大約是100…140點。如果著陸器遠離著陸臺,就會失去獎勵。如果著陸器墜毀或靜止,則事件結(jié)束,獲得額外的-100或+100分。每條腿的地面接觸是+10。發(fā)射主引擎每格為-0.3分。解決了就是+200分。可以在起落架外降落。燃料是無限的,所以智能體可以學習飛行,然后在第一次嘗試降落。有四個離散動作可供選擇:什么都不做、發(fā)射左方位引擎、發(fā)射主引擎、發(fā)射右方位引擎。

8.5.1 主程序

這是我們的主程序, 在其中我們建立相關(guān)環(huán)境并調(diào)用了子函數(shù)來建立深度強化網(wǎng)絡(luò)模型進行訓練。神經(jīng)網(wǎng)絡(luò)框架采用pytorch, 神經(jīng)網(wǎng)絡(luò)部分簡單的采用3層全連接神經(jīng)網(wǎng)絡(luò)。

import gym
import random
import torch
import numpy as np
from collections import deque
import matplotlib.pyplot as plt
from dqn_agent import Agent
import osdef dqn(n_episode=2000, max_t=1000, eps_start=1.0, eps_end=0.01, eps_decay=0.995, mode='train'):"""Deep Q-Learning:param n_episode:maximum number of training episodes:param max_t:maximum number of timesteps per episode:param eps_start:starting value of epsilon, for epsilon-greedy action selection:param eps_end:minimum value of epsilon:param eps_decay:multiplicative factor (per episode) for decreasing epsilon:return: final score"""scores = []scores_window = deque(maxlen=100)eps = eps_startif mode == 'train':for i_episode in range(1, n_episode+1):# 初始化狀態(tài)state = env.reset()score = 0for t in range(max_t):action = agent.act(state, eps)next_state, reward, done, _ = env.step(action)agent.step(state, action, reward, next_state, done)state = next_statescore += rewardif done:breakscores_window.append(score)scores.append(score)eps = max(eps_end, eps_decay*eps)print('\rEpisode {}\t Average Score:{:.2f}'.format(i_episode, np.mean(scores_window)), end="")if i_episode % 100 == 0:print('\rEpisode {}\rAverage Score :{:.2f}'.format(i_episode, np.mean(scores_window)))if np.mean(scores_window) >= 200.0:print('\nEnvironment solved in {:d} episode! \t Average Score: {:.2f}'.format(i_episode, np.mean(scores_window)))torch.save(agent.qnetwork_local.state_dict(), 'checkpoint.pth')breakelse:# 訓練一次state = env.reset()for j in range(200):action = agent.act(state, eps)print('state :{} action :{}'. format(state, action))env.render()next_state, reward, done, _ = env.step(action)print('next_state={}, reward={}, done={}'.format(next_state, reward, done))agent.step(state, action, reward, next_state, done)if done:breakreturn scoresif __name__ == '__main__':os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'env = gym.make('LunarLander-v2')env.seed(0)print('State shape: ', env.observation_space.shape)print('Number of actions: ', env.action_space.n)MODE = 'train'if MODE == 'debug':# 調(diào)試模式agent = Agent(state_size=8, action_size=4, seed=1,debug_mode=True)scores = dqn(mode='test')elif MODE == 'run':agent = Agent(state_size=8, action_size=4, seed=1)agent.qnetwork_local.load_state_dict(torch.load('checkpoint.pth'))# 以當前策略運行for i in range(3):state = env.reset()for j in range(200):action = agent.act(state)env.render()state, reward, done, _ = env.step(action)if done:breakenv.close()else:# 訓練模式agent = Agent(state_size=8, action_size=4, seed=1)scores = dqn()# plot the scoresfig = plt.figure()ax = fig.add_subplot(111)plt.plot(np.arange(len(scores)), scores)plt.ylabel('Score')plt.xlabel('Episode #')plt.show()
程序注釋
	 MODE = 'train'if MODE == 'debug':# 調(diào)試模式agent = Agent(state_size=8, action_size=4, seed=1,debug_mode=True)scores = dqn(mode='test')elif MODE == 'run':agent = Agent(state_size=8, action_size=4, seed=1)agent.qnetwork_local.load_state_dict(torch.load('checkpoint.pth'))...else:# 訓練模式agent = Agent(state_size=8, action_size=4, seed=1)scores = dqn()

在這里提供了程序運行的三種模式,“debug”, “run”, "train"模式。debug模式是為了方便查看在程序運行過程中的各種參數(shù),方便程序調(diào)試和后期更改而設(shè)置的。run模式是在模型訓練完成后可以使用訓練完成的神經(jīng)網(wǎng)絡(luò)來查看最終效果。 train模式即訓練模式,沒有太多相關(guān)數(shù)據(jù)輸出。

8.5.2 DQN模型構(gòu)建程序

這部分為模型構(gòu)建子程序,包含了DQN最重要的算法。程序包含了3個類, 分別是class QNetwork, class Agentclass ReplayBuffer。

import numpy as np
import random
from collections import namedtuple, dequeimport torch
import torch.nn.functional as F
import torch.nn as nn
import torch.optim as optimBUFFER_SIZE = int(1e4)  # 經(jīng)驗回放的緩沖區(qū)的大小
BATCH_SIZE = 64  # 最小訓練批數(shù)量
GAMMA = 0.99  # 折扣率
TAU = 1e-3  # 用于目標函數(shù)的柔性策略更新
LR = 5e-4  # 學習率
UPDATE_EVERY = 4  # 更新網(wǎng)絡(luò)的頻率device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")class QNetwork(nn.Module):"""Actor (Policy) Model."""def __init__(self, state_size, action_size, seed, fc1_units=64, fc2_units=64):"""Initialize parameters and build model.Params======state_size (int): Dimension of each stateaction_size (int): Dimension of each actionseed (int): Random seed"""super(QNetwork, self).__init__()self.seed = torch.manual_seed(seed)self.fc1 = nn.Linear(state_size, fc1_units)self.fc2 = nn.Linear(fc1_units, fc2_units)self.fc3 = nn.Linear(fc2_units, action_size)def forward(self, state):"""Build a network that maps state -> action values."""x = F.relu(self.fc1(state))x = F.relu(self.fc2(x))return self.fc3(x)class Agent():"""與環(huán)境相互作用,從環(huán)境中學習。"""def __init__(self, state_size, action_size, seed, debug_mode=False):"""初始化智能體對象。Params======state_size (int): dimension of each stateaction_size (int): dimension of each actionseed (int): random seed"""self.state_size = state_sizeself.action_size = action_sizeself.seed = random.seed(seed)self.debug_mode = debug_modeprint('Program running in {}'.format(device))# Q-Networkself.qnetwork_local = QNetwork(state_size, action_size, seed).to(device)self.qnetwork_target = QNetwork(state_size, action_size, seed).to(device)self.optimizer = optim.Adam(self.qnetwork_local.parameters(), lr=LR)  # 自適應梯度算法# print('Q-Network_local:{}\nQ-Network_target:{}'.format(self.qnetwork_local, self.qnetwork_target))# 經(jīng)驗回放if self.debug_mode is True:self.memory = ReplayBuffer(action_size, BUFFER_SIZE, 1, seed)else:self.memory = ReplayBuffer(action_size, BUFFER_SIZE, BATCH_SIZE, seed)# 初始化時間步 (for updating every UPDATE_EVERY steps)self.t_step = 0def step(self, state, action, reward, next_state, done):# 在經(jīng)驗回放中保存經(jīng)驗self.memory.add(state, action, reward, next_state, done)# 在每個時間步UPDATE_EVERY中學習self.t_step = (self.t_step + 1) % UPDATE_EVERYif self.t_step == 0:# 如果內(nèi)存中有足夠的樣本,取隨機子集進行學習if len(self.memory) > BATCH_SIZE:experiences = self.memory.sample()self.learn(experiences, GAMMA)if self.debug_mode is True:experiences = self.memory.sample()self.learn(experiences, GAMMA)def act(self, state, eps=0.):"""根據(jù)當前策略返回給定狀態(tài)的操作.Params======state (array_like): 當前的狀態(tài)eps (float): epsilon, 用于 epsilon-greedy action selection"""state = torch.from_numpy(state).float().unsqueeze(0).to(device)# 將qn更改成評估形式self.qnetwork_local.eval()# 禁用梯度with torch.no_grad():# 獲得動作價值action_values = self.qnetwork_local(state)# 將qn更改成訓練模式self.qnetwork_local.train()# Epsilon-greedy action selectionif random.random() > eps:return np.argmax(action_values.cpu().data.numpy())else:return random.choice(np.arange(self.action_size))def learn(self, experiences, gamma):"""使用給定的一批經(jīng)驗元組更新值參數(shù)。Params======experiences (Tuple[torch.Tensor]): tuple of (s, a, r, s', done) tuples gamma (float): discount factor"""states, actions, rewards, next_states, dones = experiencesif self.debug_mode is True:print('\nstates={}, actions={}, rewards={}, next_states={}, dones={}'.format(states, actions, rewards, next_states, dones))# compute and minimize the loss# 從目標網(wǎng)絡(luò)得到最大的預測Q值(下一個狀態(tài))Q_targets_next = self.qnetwork_target(next_states).detach().max(1)[0].unsqueeze(1)# 計算當前狀態(tài)的Q目標Q_targets = rewards + (gamma * Q_targets_next * (1 - dones))# 從評估網(wǎng)絡(luò)中獲得期望的Q值Q_expected = self.qnetwork_local(states).gather(1, actions)if self.debug_mode is True:print('Q_target_next={}, \nQ_target ={}, \nQ_expected={},'.format(Q_targets_next, Q_targets, Q_expected))# Compute lossloss = F.mse_loss(Q_expected, Q_targets)# Minimize the lossself.optimizer.zero_grad()loss.backward()# 執(zhí)行單個優(yōu)化步驟self.optimizer.step()# ------------------- update target network ------------------- #self.soft_update(self.qnetwork_local, self.qnetwork_target, TAU)def soft_update(self, local_model, target_model, tau):""":柔性更新模型參數(shù)。θ_target = τ*θ_local + (1 - τ)*θ_targetParams======local_model (PyTorch model): weights will be copied fromtarget_model (PyTorch model): weights will be copied totau (float): 插值參數(shù)"""for target_param, local_param in zip(target_model.parameters(), local_model.parameters()):# 柔性更新, 將src中數(shù)據(jù)復制到self中target_param.data.copy_(tau * local_param.data + (1.0 - tau) * target_param.data)class ReplayBuffer:"""Fixed-size buffer to store experience tuples."""def __init__(self, action_size, buffer_size, batch_size, seed):"""Initialize a ReplayBuffer object.Params======action_size (int): dimension of each actionbuffer_size (int): maximum size of bufferbatch_size (int): size of each training batchseed (int): random seed"""self.action_size = action_sizeself.memory = deque(maxlen=buffer_size)self.batch_size = batch_sizeself.experience = namedtuple("Experience", field_names=["state", "action", "reward", "next_state", "done"])self.seed = random.seed(seed)def add(self, state, action, reward, next_state, done):"""在memory中添加一段新的經(jīng)驗."""e = self.experience(state, action, reward, next_state, done)self.memory.append(e)def sample(self):"""從memory中隨機抽取一批經(jīng)驗."""experiences = random.sample(self.memory, k=self.batch_size)states = torch.from_numpy(np.vstack([e.state for e in experiences if e is not None])).float().to(device)actions = torch.from_numpy(np.vstack([e.action for e in experiences if e is not None])).long().to(device)rewards = torch.from_numpy(np.vstack([e.reward for e in experiences if e is not None])).float().to(device)next_states = torch.from_numpy(np.vstack([e.next_state for e in experiences if e is not None])).float().to(device)dones = torch.from_numpy(np.vstack([e.done for e in experiences if e is not None]).astype(np.uint8)).float().to(device)return (states, actions, rewards, next_states, dones)def __len__(self):"""Return the current size of internal memory."""return len(self.memory)
程序注釋

class QNetwork類構(gòu)建了三層的神經(jīng)網(wǎng)絡(luò)模型,class ReplayBuffer類定義了關(guān)于經(jīng)驗回訪的相關(guān)功能。class Agent是最重要的類,它調(diào)用了class QNetworkclass ReplayBuffer來創(chuàng)建DQN模型。所以我們主要看一下class Agent的相關(guān)函數(shù)和功能。


        self.state_size = state_sizeself.action_size = action_sizeself.seed = random.seed(seed)self.debug_mode = debug_mode# Q-Networkself.qnetwork_local = QNetwork(state_size, action_size, seed).to(device)self.qnetwork_target = QNetwork(state_size, action_size, seed).to(device)self.optimizer = optim.Adam(self.qnetwork_local.parameters(), lr=LR)  # 自適應梯度算法

初始化智能體對象,并構(gòu)建神經(jīng)網(wǎng)絡(luò)。在這里我們需要建立兩個神經(jīng)網(wǎng)絡(luò),其中“qnetwork_local”作為訓練使用的神經(jīng)網(wǎng)絡(luò),在此之外,我們還要建立qnetwork_target目標網(wǎng)絡(luò),來優(yōu)化我們的訓練過程。在這里使用了“自適應梯度算法”來作為神經(jīng)網(wǎng)絡(luò)的優(yōu)化器。


        # 經(jīng)驗回放if self.debug_mode is True:self.memory = ReplayBuffer(action_size, BUFFER_SIZE, 1, seed)else:self.memory = ReplayBuffer(action_size, BUFFER_SIZE, BATCH_SIZE, seed)

根據(jù)相關(guān)的模式來建立經(jīng)驗回放功能的類。


	def step(self, state, action, reward, next_state, done):...def act(self, state, eps=0.):...def learn(self, experiences, gamma):...def soft_update(self, local_model, target_model, tau):

這些是在訓練過程中使用到的函數(shù),它們的功能如下所示。其作用是方便與理解,其關(guān)系并不是完全如圖所示的流線型關(guān)系。例如,soft_update函數(shù)是在learn函數(shù)中調(diào)用的的一個函數(shù),其關(guān)系并不算是線性的。

當前狀態(tài)若經(jīng)驗回放樣本數(shù)足夠act 根據(jù)策略選擇動作step 執(zhí)行單步操作learn 更新神經(jīng)網(wǎng)絡(luò)參數(shù)soft_update 更新目標網(wǎng)絡(luò)

8.5.3 程序測試

接下來將模式設(shè)置為Mode = train運行程序進行訓練,要實現(xiàn)平均分數(shù)大于200分的目標,我的電腦需要跑40分鐘左右。使用run模式運行模型如下,

8.6 雙重深度Q網(wǎng)絡(luò)

之前曾提到Q學習會帶來最大化偏差,而雙重Q學習卻可以消除最大化偏差?;诓檎冶淼碾p重Q學習引入了兩個動作價值的估計Q(0)Q(0)Q(0)Q(1)Q(1)Q(1),每次更新動作價值時用其中的一個網(wǎng)絡(luò)確定動作,用確定的動作和另外一個網(wǎng)絡(luò)來估計回報。對于深度Q學習也有同樣的結(jié)論。Deepmind于2015年發(fā)表論文《Deepreinforcement learning with double Q-learning》,將雙重Q學習用于深度Q網(wǎng)絡(luò),得到了雙重深度Q網(wǎng)絡(luò)(Double Deep Q Network,Double DQN)。考慮到深度Q網(wǎng)絡(luò)已經(jīng)有了評估網(wǎng)絡(luò)和目標網(wǎng)絡(luò)兩個網(wǎng)絡(luò),所以雙重深度Q學習在估計回報時只需要用評估網(wǎng)絡(luò)確定動作,用目標網(wǎng)絡(luò)確定回報的估計即可。所以,只需要將
y=r+γmax?aQ(s′,a;θtarget)y =r+\gamma \max_{a}Q(s', a;\theta_{target})y=r+γamax?Q(s,a;θtarget?)
更改為
y=r+γQ(s′,arg?max?aQ(s′,a;θi);θ?)y =r+\gamma Q(s', \argmax_{a}Q(s', a;\theta_i);\theta^-)y=r+γQ(s,aargmax?Q(s,a;θi?);θ?)
就得到了帶經(jīng)驗回放的雙重深度Q網(wǎng)絡(luò)算法。

8.7 對偶深度Q網(wǎng)絡(luò)

Z.Wang等在2015年發(fā)表論文《Dueling network architectures for deepreinforcement learning》,提出了一種神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)——對偶網(wǎng)絡(luò)(duelnetwork)。對偶網(wǎng)絡(luò)理論利用動作價值函數(shù)和狀態(tài)價值函數(shù)之差定義了一個新的函數(shù)——優(yōu)勢函數(shù)(advantage function):
A(s,a)=Q(s,a)?V(s,a)A(s,a) = Q(s, a) - V(s, a)A(s,a)=Q(s,a)?V(s,a)
對偶Q網(wǎng)絡(luò)仍然用Q(θ)Q(\theta)Q(θ)來估計動作價值,只不過這時候Q(θ)Q(\theta)Q(θ)是狀態(tài)價值估計V(s;θ)V(s;\theta)V(s;θ)和優(yōu)勢函數(shù)估計A(s,a;θ)A(s,a;\theta)A(s,a;θ)的疊加,即
Q(s,a;θ)=V(s;θ)+A(s,a;θ)Q(s,a;\theta)=V(s;\theta)+A(s,a;\theta)Q(s,a;θ)=V(s;θ)+A(s,a;θ)

其中V(θ)V(\theta)V(θ)A(θ)A(\theta)A(θ)可能都只用到了θ\thetaθ中的部分參數(shù)。在訓練的過程中,V(θ)V(\theta)V(θ)A(θ)A(\theta)A(θ)是共同訓練的,訓練過程和單獨訓練普通深度QQQ網(wǎng)絡(luò)并無不同之處。


  1. 來自于《強化學習:原理與python實現(xiàn)》 ??

  2. 參考于《Human-level control through deep reinforcement learning》Volodymyr Mnih等 ??

總結(jié)

以上是生活随笔為你收集整理的强化学习(八) - 深度Q学习(Deep Q-learning, DQL,DQN)原理及相关实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

欧美精品一区二区在线播放 | 欧美91成人网 | 亚洲影院色 | 人人干狠狠干 | 天天插综合| 国产免费一区二区三区最新 | 成人午夜影院在线观看 | 国产一级电影免费观看 | 激情视频亚洲 | 一区二区精品在线 | 午夜在线观看一区 | 免费成人看片 | 免费精品国产 | 91av视频播放 | 久久免费视频6 | 黄色毛片在线 | 久久艹艹 | 中文字幕观看在线 | 中文字幕乱码电影 | 天天操天天吃 | 国产一区高清在线观看 | 成人在线观看资源 | 激情久久久久久久久久久久久久久久 | 成人免费视频观看 | 日韩免费在线观看网站 | 国产在线久久久 | 亚洲成av| 91精品久久久久久综合乱菊 | 久久y| 国产一区二区三区高清播放 | 伊人热 | 日日干av | 色婷婷精品大在线视频 | 国产手机视频精品 | 综合色播 | 成人h电影 | 97视频在线观看免费 | 久久婷婷影视 | 国产中文字幕三区 | 视频91| 首页av在线| 国产亚洲一区二区在线观看 | 成人国产精品久久久久久亚洲 | 亚洲激情在线观看 | 天天射天天做 | 碰超在线| 精品影院一区二区久久久 | av在线免费播放网站 | 国产99久久久国产精品免费二区 | 久久精品国产99 | 操一草| 国产精品久久久久久久久久东京 | 日韩va欧美va亚洲va久久 | 国产高清视频在线免费观看 | 久久久久国产精品厨房 | 成年人免费电影 | 中文区中文字幕免费看 | 91天天操| 欧美做受69| 91社区国产高清 | 在线中文字幕网站 | 91超国产| 99精品国产兔费观看久久99 | 久久精品视频中文字幕 | 黄色软件视频大全免费下载 | 国产精品久久久网站 | 久久99九九99精品 | 国产 欧美 日产久久 | 欧美少妇xxxxxx| 亚洲国产福利视频 | 一级精品视频在线观看宜春院 | 日韩精品久久久久久 | 97干com| 黄色天堂在线观看 | 久久看免费视频 | 五月天婷婷狠狠 | 黄网站免费久久 | 黄色免费高清视频 | 国产视频2区 | 天天干天天摸天天操 | 欧美一二三视频 | 国产一级做a | 黄色福利网站 | 亚洲精品美女免费 | 久久久精品二区 | 免费大片黄在线 | 欧美成人xxxxxxxx| 亚洲3级| 91在线视频免费91 | 国产成人一区在线 | 超碰97免费 | 狠狠色丁香婷婷综合久久片 | 99精品视频中文字幕 | 婷婷综合视频 | 国产一级精品视频 | 欧美日韩一区二区久久 | 91精品免费 | 国产精品成久久久久 | 精品国产一区二区三区日日嗨 | 精品欧美乱码久久久久久 | 欧美精品久久久久久久久久 | 久久久久久综合 | 国产成人久久精品亚洲 | 亚洲精品免费观看 | 欧美日韩中文国产 | 胖bbbb搡bbbb擦bbbb | 欧美精品xxx| 色久网 | 国产一级视频在线免费观看 | 中文字幕黄色网址 | 国产 成人 久久 | 东方av在| 亚洲午夜久久久久久久久电影网 | av在线免费观看黄 | 国产精品久久久久免费观看 | 久久网站最新地址 | 人人爽人人香蕉 | 欧美成年黄网站色视频 | 丁五月婷婷 | 在线观看一区二区视频 | 日韩簧片在线观看 | 欧美另类激情 | 韩国中文三级 | 一本一道久久a久久精品 | 久久专区 | 欧美视频日韩视频 | 久久久久网址 | 五月天中文字幕mv在线 | 国产男男gay做爰 | 天天爱av导航 | 日批视频国产 | 国产一级片一区二区三区 | 中文字幕成人在线观看 | 国产区在线视频 | 97国产精品免费 | 国产尤物一区二区三区 | 中文字幕在线观看第一页 | 天天操天天操天天操天天 | 黄色特级一级片 | 国产一区av在线 | 天天色天天射天天操 | 九九在线国产视频 | 国产专区第一页 | av动图| www.久久com | 国产精品黑丝在线观看 | 久久91久久久久麻豆精品 | 久久久久女教师免费一区 | 免费看的黄色 | 国产精品成人一区二区三区 | 99久久影视| 97精品视频在线 | 国际精品久久久久 | 欧美日韩激情视频8区 | 国产乱对白刺激视频不卡 | 成人在线免费观看网站 | 啪啪精品 | 操少妇视频 | 色吊丝在线永久观看最新版本 | 国产一区二区在线观看视频 | aⅴ精品av导航 | 久久人人干| av天天在线观看 | 国产精品久久久久久久久久尿 | 亚洲区视频在线 | 久久a v视频| 午夜久久久久久久久久久 | 欧美一级视频免费看 | 久草在线免| 中文字幕在线一二 | 9999免费视频 | 中国一级片免费看 | 亚洲午夜精品久久久久久久久久久久 | 国产美女精品久久久 | 久色 网 | 久草9视频| 日韩国产精品一区 | 久久精品一区二区三区四区 | 国产福利91精品一区二区三区 | 97色噜噜| 欧美亚洲免费在线一区 | 亚洲精选在线 | 伊人午夜 | 成人一区二区在线 | 日韩免费网址 | 久久久久草 | 精品一区二区三区久久久 | 日韩免费一区二区在线观看 | 午夜影院在线观看18 | 一区二区中文字幕在线 | 日韩电影在线观看一区二区三区 | 69国产盗摄一区二区三区五区 | 国产高清av | 91传媒91久久久 | 国产精品久久久久久吹潮天美传媒 | 午夜婷婷在线观看 | 97色在线观看免费视频 | 91成人看片| 国产又粗又猛又爽 | 久久精品导航 | 狠狠色免费 | 亚洲精品视频一二三 | 最近中文字幕免费 | 国产精品美女久久久久aⅴ 干干夜夜 | 麻豆精品视频在线观看免费 | 麻豆国产精品va在线观看不卡 | va视频在线 | 成人av电影在线 | 亚洲精品99久久久久久 | 激情五月婷婷综合 | 97电影手机版 | 中文字幕免费在线 | 欧美色精品天天在线观看视频 | 亚洲精品资源 | 亚洲欧美在线视频免费 | 久久免费视频7 | 中文字幕亚洲欧美日韩2019 | 婷婷成人亚洲综合国产xv88 | 国产一区二区精品 | av黄色免费在线观看 | 日韩av伦理片 | 久久久久女人精品毛片九一 | 99色免费| 夜夜爽88888免费视频4848 | 69av在线播放 | 91在线精品视频 | 天天添夜夜操 | 亚洲撸撸 | 97成人资源站 | 欧美另类巨大 | 久久精品麻豆 | 国产亚洲视频在线观看 | 91视频免费网站 | 国产午夜精品视频 | 欧美一级片免费 | 日韩成人邪恶影片 | 狠狠色丁香婷婷综合久小说久 | 久久久久久久久久久久影院 | 在线观看a视频 | 91成人精品一区在线播放 | 色视频在线| 99久久99久久 | 久久免费国产视频 | 天堂av在线免费 | 日批网站免费观看 | 狠狠色狠狠色综合日日小说 | 在线观看亚洲精品视频 | 国产女人18毛片水真多18精品 | 久久久久亚洲精品国产 | 久久久这里有精品 | 久久黄色片子 | 欧美性生活大片 | 亚洲精品视频偷拍 | 日本中文一区二区 | 三级在线播放视频 | 久草视频在线免费 | 亚洲成aⅴ人在线观看 | 综合色综合色 | 午夜精品在线看 | 成人免费大片黄在线播放 | 欧美成人性网 | 黄色在线网站噜噜噜 | 狠狠狠色丁香婷婷综合激情 | 久久国产经典 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产美女免费观看 | 久久色中文字幕 | 国产小视频免费在线观看 | 一区二区三区在线观看中文字幕 | 欧美激情视频一区二区三区 | 亚洲成人av在线 | 麻豆免费视频 | 免费黄色在线 | 区一区二区三区中文字幕 | 国产一区二区三区四区在线 | 国产精品一区二区吃奶在线观看 | 午夜在线免费观看视频 | 狠狠躁夜夜躁人人爽视频 | 97激情影院 | 久久久久影视 | 亚洲精品欧美精品 | 亚洲黄污| 探花视频免费观看 | 久久免费视频网站 | 欧美精品亚洲二区 | 91丨九色丨勾搭 | 91爱爱网址| a在线播放 | 成人观看 | 成人欧美一区二区三区在线观看 | 国产青青青 | 欧美精品免费在线 | 国产91综合一区在线观看 | 国产精品久久久久影院日本 | 大荫蒂欧美视频另类xxxx | 99 久久久久 | 成人app在线免费观看 | 免费国产在线精品 | 在线观看av网站 | www国产亚洲精品久久麻豆 | 日本在线观看中文字幕无线观看 | 久久69av| 欧美日韩一级久久久久久免费看 | 亚洲精品免费观看视频 | 婷婷在线资源 | 99精品视频免费在线观看 | 久久国产经典视频 | 蜜臀av.com | 免费看特级毛片 | 久久久久国产精品一区二区 | 国产黄色一级大片 | 亚洲波多野结衣 | 国产视频精品久久 | 91看片看淫黄大片 | 久久视频在线 | 中文字幕日韩高清 | 天天操天天干天天干 | 国产日韩三级 | 国产 视频 久久 | 黄污污网站 | 久草在线视频网 | 在线观看第一页 | 91麻豆免费版 | 国产精品久久久久久久久久直播 | 粉嫩av一区二区三区入口 | 成人免费在线播放视频 | 天天天天色射综合 | 91av免费看 | 久久久999免费视频 日韩网站在线 | 在线观看av网 | 在线观看资源 | 992tv在线观看 | 亚洲国产精品激情在线观看 | 久久99视频免费 | 一区二区三区在线观看 | 亚洲蜜桃av | 在线观看黄网站 | 色欲综合视频天天天 | 国产字幕在线看 | 精品福利av | 黄色一级大片在线免费看产 | 日韩中文在线观看 | 日韩欧美在线观看一区二区 | 丝袜av一区 | 国产又黄又硬又爽 | 中文字幕在线观看免费高清电影 | 亚洲三级性片 | 天天干,夜夜爽 | 狠狠操操操 | 96视频免费在线观看 | 国产精品嫩草影院99网站 | 国产色一区 | 亚洲色图27p | 91在线播放综合 | 在线你懂的视频 | 91理论片午午伦夜理片久久 | 激情视频综合网 | 91成人免费在线 | 黄色免费电影网站 | 又黄又爽又刺激视频 | 欧洲性视频 | 亚洲免费在线视频 | 成 人 黄 色 视频播放1 | 久久九九网站 | 日韩欧美在线免费 | 97色视频在线 | 夜夜高潮夜夜爽国产伦精品 | 97视频免费在线看 | 综合久久久久 | 久久久久99精品成人片三人毛片 | 日韩在线观看高清 | 成人小视频免费在线观看 | 久久免费视频精品 | 国产精品一区二区三区在线免费观看 | 亚洲国产精品日韩 | 欧美午夜理伦三级在线观看 | 日韩视频一区二区三区在线播放免费观看 | 国产在线色视频 | 亚洲成人网av | 一区二区视频在线播放 | 久草精品电影 | 天堂在线视频中文网 | 久久精品网站免费观看 | 综合在线观看色 | 国产小视频在线免费观看 | 天天操天天吃 | 不卡电影一区二区三区 | av中文字幕在线看 | 玖玖视频在线 | 91精品视频在线看 | 伊人色**天天综合婷婷 | 在线观看国产日韩欧美 | japanesexxx乱女另类 | 日本mv大片欧洲mv大片 | 欧美一区二区三区在线 | 97中文字幕 | 日日夜夜骑| 久久午夜精品视频 | 就要干b | 免费在线播放av电影 | 久久er99热精品一区二区三区 | 亚洲一区二区三区在线看 | 久久99精品国产99久久6尤 | aaa日本高清在线播放免费观看 | av午夜电影 | 国产精品99久久久久久武松影视 | 91尤物国产尤物福利在线播放 | 亚洲美女在线一区 | 欧美日韩久 | 亚洲专区视频在线观看 | 精品视频免费久久久看 | 精品久久九九 | 久久电影网站中文字幕 | 色综合久久久久综合99 | 人人爽人人澡 | 91在线视频播放 | av中文字幕日韩 | 国产一区二区三区久久久 | 日韩成人免费观看 | 日韩性网站| 日日干夜夜干 | a级片久久| 91精品成人 | 欧美性成人 | 欧美三级免费 | av免费在线网站 | 欧美最猛性xxxxx免费 | 欧美一级性生活片 | 国产精品18久久久久vr手机版特色 | 日韩亚洲精品电影 | 亚洲天堂网站 | 久久精品国产亚洲aⅴ | 超碰在线人人艹 | 国产精成人品免费观看 | 色综合久久久久久中文网 | 欧美日韩不卡在线观看 | 久久精品亚洲综合专区 | 免费看短 | 亚洲专区 国产精品 | 在线 视频 一区二区 | 免费在线一区二区 | 黄色精品国产 | 伊人超碰在线 | 不卡av电影在线观看 | 不卡日韩av | 视频国产区 | 韩国精品在线观看 | 成人av在线直播 | 国产亚洲va综合人人澡精品 | 激情久久五月 | 亚洲欧洲精品视频 | 亚洲精品麻豆视频 | 中文字幕一区二区三区四区久久 | 丁香六月在线 | 久久99精品国产麻豆宅宅 | 在线观看成人毛片 | www最近高清中文国语在线观看 | 国产手机av在线 | 激情五月亚洲 | 伊人官网| www欧美日韩 | 中文字幕 成人 | 欧美黑人猛交 | 久草av在线播放 | 国产色女 | 中文字幕在线播出 | 亚洲丁香日韩 | 亚洲五月激情 | 福利电影久久 | 午夜精品视频一区二区三区在线看 | 九九热在线视频免费观看 | 国内精品美女在线观看 | 9免费视频 | 天天干.com | 精品999久久久| 在线a人v观看视频 | 久久久久久久久久久国产精品 | 国产视频首页 | 亚洲精品美女久久久久 | 国产麻豆视频在线观看 | 天天操夜夜曰 | 欧美黑吊大战白妞欧美 | 国产专区视频在线 | 成人丝袜 | 天天天天色综合 | 精品国产黄色片 | 日韩动漫免费观看高清完整版在线观看 | japanesexxxhd奶水| 九九九热精品免费视频观看网站 | 久久久久欠精品国产毛片国产毛生 | av免费在线网 | 国产欧美最新羞羞视频在线观看 | 在线观看a视频 | 久久久久久久久毛片 | 在线亚洲人成电影网站色www | 久久成年人网站 | 日韩三级中文字幕 | 天天干夜夜操视频 | 999久久国产精品免费观看网站 | 日韩电影精品 | 超碰在线97免费 | 欧美日韩亚洲第一 | 四虎永久免费网站 | 91在线播| 国产亚洲综合在线 | 视频在线观看91 | 国产一二区精品 | 中文字幕乱码在线播放 | 国产又粗又猛又爽 | 天堂av一区二区 | 国产精品久久久一区二区三区网站 | av免费观看网站 | 午夜精品一区二区国产 | 国产成人精品久久亚洲高清不卡 | 成人在线观看你懂的 | 国产高清专区 | av资源网在线播放 | 九九免费在线观看视频 | 久久这里只有精品视频首页 | 亚洲精品视频免费在线 | 在线观看黄网站 | 丁香婷婷综合五月 | av电影在线观看完整版一区二区 | 久久国产精品久久精品 | 国产视频在线免费 | 夜夜操天天摸 | 欧美日韩一二三四区 | www.综合网.com | 超碰在线94 | 草莓视频在线观看免费观看 | 亚洲精品456在线播放乱码 | 久久久污| 天天爱天天爽 | 又黄又爽又刺激 | 日批视频国产 | 中文字幕亚洲欧美日韩 | 国产黄网站在线观看 | 精品国产乱码久久久久久1区二区 | 中文字幕黄色网址 | 欧美 另类 交 | 亚洲欧美日韩精品久久久 | 99久久久久久久久久 | 久久久久久久99精品免费观看 | 欧美亚洲成人xxx | 97免费公开视频 | 日韩亚洲国产中文字幕 | 在线va网站 | 超碰九九| 五月开心激情 | 久久久久网址 | 国产精品手机在线播放 | 97国产大学生情侣白嫩酒店 | 探花视频免费在线观看 | 国产aa精品 | 99国产视频| 日日夜夜狠狠 | 国产麻豆果冻传媒在线观看 | 97精品超碰一区二区三区 | 国产美女网站在线观看 | 欧美韩日精品 | 国产美女在线精品免费观看 | 亚洲1级片 | 在线观看亚洲国产精品 | 五月天激情电影 | 国内精品久久久久久久久久清纯 | 久久人人97超碰精品888 | 亚洲欧美日韩在线一区二区 | 国产精品久久久久久妇 | 国产一级片网站 | 五月天综合网站 | 久久国产精品视频免费看 | 视频一区二区国产 | 一色屋精品视频在线观看 | 九九热在线精品视频 | 综合色影院| 国产一级片一区二区三区 | 亚洲激情中文 | 日韩av三区| 日本一区二区三区免费看 | 日韩欧美国产精品 | 香蕉视频免费在线播放 | 日韩精品中文字幕在线不卡尤物 | 97超碰在线久草超碰在线观看 | 欧美日韩裸体免费视频 | 久久综合色天天久久综合图片 | 2023天天干 | 国产91精品看黄网站 | 超碰97国产在线 | 亚洲国产精品日韩 | 91九色老| 91视频电影 | 久久精品一区二区三区国产主播 | 在线观看视频中文字幕 | 午夜精品剧场 | 久久久久看片 | 青青草在久久免费久久免费 | 一区二区三区在线视频观看58 | 亚洲永久字幕 | 亚洲成人精品av | 久草手机视频 | 人人揉人人揉人人揉人人揉97 | 一级电影免费在线观看 | 成人一区二区三区中文字幕 | 免费成人av | 中文字幕在线高清 | 国际精品久久久 | 91理论片午午伦夜理片久久 | 国产黄色片一级 | 视频 国产区| 久久爱导航 | 色成人亚洲 | 亚洲久久视频 | 高清不卡免费视频 | 国产一卡二卡在线 | 伊人手机在线 | 久久久电影 | 亚洲丝袜一区 | 亚洲精品五月天 | 在线播放一区二区三区 | 久久久久国产成人精品亚洲午夜 | 天天摸天天操天天舔 | 999久久久免费精品国产 | 亚洲一区二区高潮无套美女 | 日韩在线观看网址 | 激情影院在线 | 精品成人免费 | 久久超碰99 | 久久免费看av | 99re久久资源最新地址 | 久久免费av电影 | 免费韩国av| 国产成人免费在线观看 | 日韩免费二区 | 夜夜骑日日操 | 亚洲成人免费在线观看 | 国产精品视屏 | 亚洲精品久久久久www | 五月天丁香综合 | 天天摸天天干天天操天天射 | 欧美色图30p | 麻豆传媒视频在线免费观看 | 国产区av在线 | 成人h电影 | 日本三级久久久 | 国产精品电影一区二区 | 啪啪资源 | 国产日韩欧美在线观看 | 人人草人人做 | 久久国产精品偷 | 色综合久久久久综合体桃花网 | 人人爽夜夜爽 | 欧美日韩不卡在线 | 91亚洲精品久久久中文字幕 | 亚洲综合色丁香婷婷六月图片 | 天天操夜夜操国产精品 | 91亚洲精品乱码久久久久久蜜桃 | 日韩啪视频 | 久久色在线观看 | 色一色在线 | 狠狠色2019综合网 | 婷婷综合影院 | 99久久婷婷国产综合亚洲 | 日日夜夜天天射 | 亚州性色 | 日韩欧美在线综合网 | 中文字幕国产在线 | 久久久这里有精品 | 午夜体验区 | 国产在线播放一区二区 | 日本久久久久久久久久久 | 亚洲人xxx | 99国产在线视频 | 久久久久综合精品福利啪啪 | 九九热免费精品视频 | www成人av| 五月婷婷视频在线 | 日本不卡123| 国产一区二区三区 在线 | 伊人天天综合 | 91亚洲成人| 一级黄色片在线免费看 | 国产精品毛片一区视频播 | 麻豆久久久久 | 久久夜靖品| 国产午夜麻豆影院在线观看 | 激情综合五月天 | 婷婷性综合| 国产成人精品综合久久久久99 | 大胆欧美gogo免费视频一二区 | 国产免费久久久久 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩最新中文字幕 | 亚洲国产欧美在线人成大黄瓜 | 日韩免费视频一区二区 | 久草久热 | 久久久久综合 | 欧美日韩另类在线 | 免费看黄色91 | 成人片在线播放 | 日韩三级在线观看 | 亚洲欧美国产视频 | 超碰日韩 | 成人免费共享视频 | 黄色成人av| 9ⅰ精品久久久久久久久中文字幕 | 久久99精品久久久久久 | 开心婷婷色 | 四虎欧美 | 香蕉久草 | 国产成人av电影在线观看 | 97精品国产91久久久久久久 | 色综合久久88色综合天天免费 | 日日夜夜网站 | 在线观看日韩专区 | 中文在线资源 | 久久99精品波多结衣一区 | 亚洲最快最全在线视频 | 国产乱码精品一区二区三区介绍 | 中文字幕你懂的 | 亚州av免费 | 亚洲精品字幕在线 | 人人爽人人澡人人添人人人人 | 国产日韩中文字幕在线 | 亚洲五月综合 | 天天射天天干天天爽 | av大片网站 | 欧美精品久久久久久久免费 | 操操操av| 激情文学丁香 | 欧美91av| 日本不卡视频 | 亚洲成av人影片在线观看 | 精品黄色在线观看 | 国产在线va | 狠狠色噜噜狠狠狠 | 九九热久久免费视频 | 亚洲天堂va | 亚洲综合少妇 | 国产美女精品视频免费观看 | 在线v片| 国产精品二区三区 | 精品视频9999| 成年人电影毛片 | 日日操狠狠干 | 亚洲国产综合在线 | 色成人亚洲网 | 六月婷婷久香在线视频 | 69亚洲乱| 日韩欧美中文 | 日本精品在线看 | 欧美一级黄色视屏 | av中文字幕亚洲 | 国产剧在线观看片 | 成片免费观看视频大全 | 久久视奸| 久久精品视频18 | 免费看三级 | 成人综合免费 | 黄色a大片 | 亚洲国产高清视频 | av丝袜天堂| 亚洲激情免费 | 久久久久久久18 | 日韩欧美v | 国产一二三区在线观看 | 激情文学丁香 | 国产精品成人自产拍在线观看 | 丁香色婷| 国产成人亚洲在线观看 | 91在线最新 | 国产一级一片免费播放放 | 99热日本| 就色干综合 | 国产香蕉久久精品综合网 | 免费看色的网站 | 久草在线视频新 | 嫩嫩影院理论片 | 国产电影黄色av | 日韩免费精品 | 91桃花视频 | 成人一级片在线观看 | 97电院网手机版 | 97在线免费视频 | 国产精品 国内视频 | 国产黄色片免费 | 日批在线观看 | 久久午夜国产 | 黄色一级大片在线免费看国产一 | 色网站免费在线观看 | 黄色大片免费播放 | 久草视频在线免费 | 夜夜视频欧洲 | 最新99热| 麻豆一级视频 | 九九热只有这里有精品 | 成人av教育 | 欧美日韩三级在线观看 | 美女久久| 日韩电影在线视频 | 中文字幕 在线看 | 天天摸天天舔 | 97色se| 国产一区二区三区久久久 | 精品一区二区三区香蕉蜜桃 | av一区二区在线观看中文字幕 | 国产亚洲成人网 | 91免费观看视频网站 | 久久热亚洲 | 久99久在线 | 久久久免费精品 | 日韩精品高清视频 | 亚洲天堂网视频在线观看 | 天天天天爽 | 三级av在线 | 中文av在线播放 | 午夜精品av在线 | 国产一级电影免费观看 | 最新91在线视频 | 欧美精品在线一区 | 亚洲精品国产免费 | 婷婷丁香六月 | 国产成人性色生活片 | 九色视频网站 | 中文字幕一区二区三区四区视频 | 天天爱天天色 | 日韩电影在线视频 | 三级视频片 | 日日操日日干 | 免费看一级片 | 国产网站在线免费观看 | 日日碰夜夜爽 | 免费一级特黄毛大片 | 欧美一区二区在线免费观看 | 性色av一区二区三区在线观看 | 日韩乱色精品一区二区 | 日本在线观看一区二区三区 | 欧美日韩综合在线观看 | 91激情视频在线观看 | av韩国在线 | 亚洲 欧洲av | 日韩电影黄色 | 激情婷婷综合网 | 色视频在线免费观看 | 五月天久久久久 | 色欧美视频 | 免费在线观看av网址 | 欧美性黄网官网 | 国产成人黄色 | 亚洲一二三区精品 | 天天鲁一鲁摸一摸爽一爽 | www.在线观看视频 | a级片久久久 | 国产黄色片一级 | 国产青草视频在线观看 | 欧美在线视频第一页 | 日韩高清无线码2023 | 三级黄色免费片 | 成人一级片免费看 | 亚洲国产欧美一区二区三区丁香婷 | 久草在线高清 | 欧美一级在线观看视频 | 亚洲精品系列 | 久久色在线观看 | 国产精品久久久免费 | 91视频首页 | 国产在线久草 | 欧洲视频一区 | 精品国产诱惑 | 成人一级免费电影 | 日韩电影在线观看一区 | 国产手机在线播放 | 中文字幕在线观看视频免费 | 人人插人人玩 | 国产精品国产三级在线专区 | 欧美一区二区三区激情视频 | 国内精品久久久久影院男同志 | 97品白浆高清久久久久久 | 香蕉久久久久久av成人 | 国产高清视频在线 | 国产精品久久三 | 在线观看网站你懂的 | 欧美色综合天天久久综合精品 | 欧美老女人xx | 亚洲欧美精品在线 | 999国内精品永久免费视频 | 国产专区在线播放 | 超碰国产在线播放 | 97超级碰碰碰碰久久久久 | 狠狠色狠狠色综合日日小说 | 久久99热这里只有精品国产 | 亚洲国产剧情av | 亚洲精欧美一区二区精品 | 中文字幕亚洲国产 | 丁香六月av | 天天综合网国产 | 蜜臀一区二区三区精品免费视频 | 欧美精品在线观看 | 国产一二三四在线观看视频 | 麻豆传媒电影在线观看 | 国产露脸91国语对白 | 国产日韩精品一区二区在线观看播放 | 在线 高清 中文字幕 | 国产一级片免费观看 | 国产 中文 日韩 欧美 | 91字幕| 欧美日韩高清在线一区 | 丁香花中文在线免费观看 | 狠狠操电影网 | 欧美激情在线看 | 91久久黄色 | 91亚洲国产成人久久精品网站 | 中文字幕一区二区三区久久 | 日日夜夜天天干 | 亚洲精品成人av在线 | 色哟哟国产精品 | 西西4444www大胆艺术 | 夜夜婷婷 | 久草在线官网 | 亚洲一级电影在线观看 | 国产毛片久久久 | 国产日韩中文字幕 | 999成人网 | 婷婷丁香激情五月 | 成人免费一区二区三区在线观看 | 日日综合网 | 国产爽视频 | 五月天电影免费在线观看一区 | 国产精品免费不 | 韩国av在线 | 天堂av免费观看 | 超碰国产97| 欧美精品国产综合久久 | 日本一区二区三区免费看 | 久亚洲| 色吊丝在线永久观看最新版本 | 丁香色天天 | 色永久免费视频 | 欧美激情视频一区二区三区免费 | 亚洲美女免费精品视频在线观看 | 精品视频亚洲 | 日本中文在线播放 | 在线av资源| 一区二区三区日韩精品 | 超碰官网| 中文字幕 婷婷 | 日本特黄一级片 | 欧美日韩国产色综合一二三四 | 国产精品一区二区在线免费观看 | 一区二区国产精品 | 久久精品国产第一区二区三区 | 一区二区视频免费在线观看 | 久草在线这里只有精品 | 人人草天天草 | 色妞色视频一区二区三区四区 | 日韩激情av在线 | 中文字幕电影高清在线观看 | 午夜精品麻豆 | 精品久久久久久亚洲 | 日韩黄色一级电影 | 亚洲伊人成综合网 | 日韩二区在线观看 | 日韩大片在线看 | 成人在线播放av | 91丨九色丨蝌蚪丨对白 | 久久国产精品第一页 | 黄色在线免费观看网站 | 国产在线2020| 五月天丁香综合 | 亚洲精品乱码久久久久久9色 | 视频一区在线播放 | 久久一区二区免费视频 | 国产成人av电影在线 | 美女露久久 | 欧美成人精品三级在线观看播放 | 日本久草电影 | 国产精品 国产精品 | 久久国产一区二区三区 | 日日操天天爽 | www.亚洲激情.com | 国产精品久久久久久久av电影 | 国产福利91精品 | 免费h漫在线观看 | 天堂成人在线 | 久久久网址 | 在线免费观看国产 | 日日夜夜狠狠干 | 欧美日本高清视频 | 国产综合婷婷 | 久久深爱网| 亚洲精品乱码久久 | 久久草在线视频国产 | 99久久影视 | 日日夜夜狠狠操 | 超碰人人草 | 国产精品午夜在线观看 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 午夜色影院 | 99久久99久久|