精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Keras+OpenAI強化學習實踐:深度Q網絡

開發 開發工具
本文先給出 Q 學習(Q-learning)的基本原理,然后再具體從 DQN 網絡的超參數、智能體、模型和訓練等方面詳細解釋了深度 Q 網絡,最后,文章給出了該教程的全部代碼。

在之前的 Keras/OpenAI 教程中,我們討論了一個將深度學習應用于強化學習環境的基礎案例,它的效果非常顯著。想象作為訓練數據的完全隨機序列(series)。任何兩個序列都不可能高度彼此重復,因為這些都是隨機產生的。然而,成功的試驗之間存在相同的關鍵特征,例如在 CartPole 游戲中,當桿往右靠時需要將車向右推,反之亦然。因此,通過在所有這些試驗數據上訓練我們的神經網絡,我們提取了有助于成功的共同模式(pattern),并能夠平滑導致其產生獨立故障的細節。

話雖如此,我們認為這次的環境比上次要困難得多,即游戲:MountainCar。

一、更復雜的環境

即使看上去我們應該能夠應用與上周相同的技術,但是有一個關鍵特征使它變得不可能:我們無法生成訓練數據。與簡單的 CartPole 例子不同,采取隨機移動通常只會導致實驗的結果很差(谷底)。也就是說,我們的實驗結果***都是相同的-200。這用作訓練數據幾乎沒有用。想象一下,如果你無論在考試中做出什么答案,你都會得到 0%,那么你將如何從這些經驗中學習?

「MountainCar-v0」環境的隨機輸入不會產生任何對于訓練有用的輸出

「MountainCar-v0」環境的隨機輸入不會產生任何對于訓練有用的輸出。

由于這些問題,我們必須找出一種能逐步改進以前實驗的方法。為此,我們使用強化學習最基本的方法:Q-learning!

二、DQN 的理論背景

Q-learning 的本質是創建一個「虛擬表格」,這個表格包含了當前環境狀態下每個可能的動作能得到多少獎勵。下面來詳細說明:

DQN 的理論背景

網絡可以想象為內生有電子表格的網絡,該表格含有當前環境狀態下可能采取的每個可能的動作的值。

「虛擬表格」是什么意思?想像一下,對于輸入空間的每個可能的動作,你都可以為每個可能采取的動作賦予一個分數。如果這可行,那么你可以很容易地「打敗」環境:只需選擇具有***分數的動作!但是需要注意 2 點:首先,這個分數通常被稱為「Q-分數」,此算法也由此命名。第二,與任何其它得分一樣,這些 Q-分數在其模擬的情境外沒有任何意義。也就是說,它們沒有確定的意義,但這沒關系,因為我們只需要做比較。

為什么對于每個輸入我們都需要一個虛擬表格?難道沒有統一的表格嗎?原因是這樣做不和邏輯:這與在谷底談采取什么動作是***的,及在向左傾斜時的***點討論采取什么動作是***的是一樣的道理。

現在,我們的主要問題(為每個輸入建立虛擬表格)是不可能的:我們有一個連續的(***)輸入空間!我們可以通過離散化輸入空間來解決這個問題,但是對于本問題來說,這似乎是一個非常棘手的解決方案,并且在將來我們會一再遇到。那么,我們如何解決呢?那就是通過將神經網絡應用于這種情況:這就是 DQN 中 D 的來歷!

三、DQN agent

現在,我們現在已經將問題聚焦到:找到一種在給定當前狀態下為不同動作賦值 Q-分數的方法。這是使用任何神經網絡時遇到的非常自然的***個問題的答案:我們模型的輸入和輸出是什么?本模型中你需要了解的數學方程是以下等式(不用擔心,我們會在下面講解):

如上所述,Q 代表了給定當前狀態(s)和采取的動作(a)時我們模型估計的價值。然而,目標是確定一個狀態價值的總和。那是什么意思?即從該位置獲得的即時獎勵和將來會獲得的預期獎勵之和。也就是說,我們要考慮一個事實,即一個狀態的價值往往不僅反映了它的直接收益,而且還反映了它的未來收益。在任何情況下,我們會將未來的獎勵折現,因為對于同樣是收到$100 的兩種情況(一種為將來,一種為現在),我會永遠選擇現在的交易,因為未來是會變化的。γ因子反映了此狀態預期未來收益的貶值。

這就是我們需要的所有數學!下面是實際代碼的演示!

四、DQN agent 實現

深度 Q 網絡為持續學習(continuous learning),這意味著不是簡單地累積一批實驗/訓練數據并將其傳入模型。相反,我們通過之前運行的實驗創建訓練數據,并且直接將運行后創建的數據饋送如模型。如果現在感到好像有些模糊,別擔心,該看看代碼了。代碼主要在定義一個 DQN 類,其中將實現所有的算法邏輯,并且我們將定義一組簡單的函數來進行實際的訓練。

1. DQN 超參數

首先,我們將討論一些與 DQN 相關的參數。它們大多數是實現主流神經網絡的標準參數:

  1. class DQN: 
  2.     def __init__(self, env): 
  3.         self.env     = env 
  4.         self.memory  = deque(maxlen=2000
  5.          
  6.         self.gamma = 0.95 
  7.         self.epsilon = 1.0 
  8.         self.epsilon_min = 0.01 
  9.         self.epsilon_decay = 0.995 
  10.         self.learning_rate = 0.01 

讓我們來一步一步地講解這些超參數。***個是環境(env),這僅僅是為了在建立模型時便于引用矩陣的形狀。「記憶(memory)」是 DQN 的關鍵組成部分:如前所述,我們不斷通過實驗訓練模型。然而與直接訓練實驗的數據不同,我們將它們先添加到內存中并隨機抽樣。為什么這樣做呢,難道僅僅將*** x 個實驗數據作為樣本進行訓練不好嗎?原因有點微妙。設想我們只使用最近的實驗數據進行訓練:在這種情況下,我們的結果只會學習其最近的動作,這可能與未來的預測沒有直接的關系。特別地,在本環境下,如果我們在斜坡右側向下移動,使用最近的實驗數據進行訓練將需要在斜坡右側向上移動的數據上進行訓練。但是,這與在斜坡左側的情景需決定采取的動作無關。所以,通過抽取隨機樣本,將保證不會偏離訓練集,而是理想地學習我們將遇到的所有環境。

我們現在來討論模型的超參數:gamma、epsilon 以及 epsilon 衰減和學習速率。***個是前面方程中討論的未來獎勵的折現因子(<1),***一個是標準學習速率參數,我們不在這里討論。第二個是 RL 的一個有趣方面,值得一談。在任何一種學習經驗中,我們總是在探索與利用之間做出選擇。這不僅限于計算機科學或學術界:我們每天都在做這件事!

考慮你家附近的飯店。你***一次嘗試新飯店是什么時候?可能很久以前。這對應于你從探索到利用的轉變:與嘗試找到新的更好的機會不同,你根據自己以往的經驗找到***的解決方案,從而***化效用。對比當你剛搬家時:當時你不知道什么飯店是好的,所以被誘惑去探索新選擇。換句話說,這時存在明確的學習趨勢:當你不了解它們時,探索所有的選擇,一旦你對其中的一些建立了意見,就逐漸轉向利用。以同樣的方式,我們希望我們的模型能夠捕捉這種自然的學習模型,而 epsilon 扮演著這個角色。

Epsilon 表示我們將致力于探索的時間的一小部分。也就是說,實驗的分數 self.epsilon,我們將僅僅采取隨機動作,而不是我們預測在這種情況下***的動作。如上所述,我們希望在開始時形成穩定評估之前更經常地采取隨機動作:因此開始時初始化ε接近 1.0,并在每一個連續的時間步長中以小于 1 的速率衰減它。

2. DQN 模型

在上面的 DQN 的初始化中排除了一個關鍵環節:用于預測的實際模型!在原來的 Keras RL 教程中,我們直接給出數字向量形式的輸入和輸出。因此,除了全連接層之外,不需要在網絡中使用更復雜的層。具體來說,我們將模型定義為:

  1. def create_model(self): 
  2.         model   = Sequential() 
  3.         state_shape  = self.env.observation_space.shape 
  4.         model.add(Dense(24, input_dim=state_shape[0],  
  5.             activation="relu")) 
  6.         model.add(Dense(48, activation="relu")) 
  7.         model.add(Dense(24, activation="relu")) 
  8.         model.add(Dense(self.env.action_space.n)) 
  9.         model.compile(loss="mean_squared_error"
  10.             optimizer=Adam(lr=self.learning_rate)) 
  11.         return model 

并用它來定義模型和目標模型(如下所述):

  1. def __init__(self, env): 
  2.         self.env     = env 
  3.         self.memory  = deque(maxlen=2000
  4.          
  5.         self.gamma = 0.95 
  6.         self.epsilon = 1.0 
  7.         self.epsilon_min = 0.01 
  8.         self.epsilon_decay = 0.995 
  9.         self.learning_rate = 0.01 
  10.         self.tau = .05 
  11.         selfself.model = self.create_model() 
  12.         # "hack" implemented by DeepMind to improve convergence 
  13.         selfself.target_model = self.create_model() 

事實上,有兩個單獨的模型,一個用于做預測,一個用于跟蹤「目標值」,這是反直覺的。明確地說,模型(self.model)的作用是對要采取的動作進行實際預測,目標模型(self.target_model)的作用是跟蹤我們想要模型采取的動作。

為什么不用一個模型做這兩件事呢?畢竟,如果預測要采取的動作,那不會間接地確定我們想要模型采取的模式嗎?這實際上是 DeepMind 發明的深度學習的「不可思議的技巧」之一,它用于在 DQN 算法中獲得收斂。如果使用單個模型,它可以(通常會)在簡單的環境(如 CartPole)中收斂。但是,在這些更為復雜的環境中并不收斂的原因在于我們如何對模型進行訓練:如前所述,我們正在對模型進行「即時」訓練。

因此,在每個時間步長進行訓練模型,如果我們使用單個網絡,實際上也將在每個時間步長時改變「目標」。想想這將多么混亂!那就如同,開始老師告訴你要完成教科書中的第 6 頁,當你完成了一半時,她把它改成了第 9 頁,當你完成一半的時候,她告訴你做第 21 頁!因此,由于缺乏明確方向以利用優化器,即梯度變化太快難以穩定收斂,將導致收斂不足。所以,作為代償,我們有一個變化更慢的網絡以跟蹤我們的最終目標,和一個最終實現這些目標的網絡。

3. DQN 訓練

訓練涉及三個主要步驟:記憶、學習和重新定位目標。***步基本上只是隨著實驗的進行向記憶添加數據:

  1. def remember(self, state, action, reward, new_state, done): 
  2.         self.memory.append([state, action, reward, new_state, done]) 

這里沒有太多的注意事項,除了我們必須存儲「done」階段,以了解我們以后如何更新獎勵函數。轉到 DQN 主體的訓練函數。這是使用存儲記憶的地方,并積極從我們過去看到的內容中學習。首先,從整個存儲記憶中抽出一個樣本。我們認為每個樣本是不同的。正如我們在前面的等式中看到的,我們要將 Q-函數更新為當前獎勵之和與預期未來獎勵的總和(貶值為 gamma)。在實驗結束時,將不再有未來的獎勵,所以該狀態的價值為此時我們收到的獎勵之和。然而,在非終止狀態,如果我們能夠采取任何可能的動作,將會得到的***的獎勵是什么?我們得到:

  1. def replay(self): 
  2.         batch_size = 32 
  3.         if len(self.memory) < batch_size:  
  4.             return 
  5.         samples = random.sample(self.memory, batch_size) 
  6.         for sample in samples: 
  7.             state, action, reward, new_state, done = sample 
  8.             target = self.target_model.predict(state) 
  9.             if done: 
  10.                 target[0][action] = reward 
  11.             else: 
  12.                 Q_future = max
  13.                     self.target_model.predict(new_state)[0]) 
  14.                 target[0][action] = reward + Q_future * self.gamma 
  15.             self.model.fit(state, target, epochs=1verbose=0

***,我們必須重新定位目標,我們只需將主模型的權重復制到目標模型中。然而,與主模型訓練的方法不同,目標模型更新較慢:

  1. def target_train(self): 
  2.         weights = self.model.get_weights() 
  3.         target_weights = self.target_model.get_weights() 
  4.         for i in range(len(target_weights)): 
  5.             target_weights[i] = weights[i] 
  6.         self.target_model.set_weights(target_weights) 

4. DQN 動作

***一步是讓 DQN 實際執行希望的動作,在給定的 epsilon 參數基礎上,執行的動作在隨機動作與基于過去訓練的預測動作之間選擇,如下所示:

  1. def act(self, state): 
  2.         self.epsilon *= self.epsilon_decay 
  3.         self.epsilon = max(self.epsilon_min, self.epsilon) 
  4.         if np.random.random() < self.epsilon: 
  5.             return self.env.action_space.sample() 
  6.         return np.argmax(self.model.predict(state)[0]) 

5. 訓練 agent

現在訓練我們開發的復雜的 agent。將其實例化,傳入經驗數據,訓練 agent,并更新目標網絡:

  1. def main(): 
  2.     env     = gym.make("MountainCar-v0") 
  3.     gamma   = 0.9 
  4.     epsilon = .95 
  5.     trials  = 100 
  6.     trial_len = 500 
  7.     updateTargetNetwork = 1000 
  8.     dqn_agent = DQN(envenv=env) 
  9.     steps = [] 
  10.     for trial in range(trials): 
  11.         cur_state = env.reset().reshape(1,2) 
  12.         for step in range(trial_len): 
  13.             action = dqn_agent.act(cur_state) 
  14.             env.render() 
  15.             new_state, reward, done, _ = env.step(action) 
  16.             rewardreward = reward if not done else -20 
  17.             print(reward) 
  18.             new_statenew_state = new_state.reshape(1,2) 
  19.             dqn_agent.remember(cur_state, action,  
  20.                 reward, new_state, done) 
  21.              
  22.             dqn_agent.replay() 
  23.             dqn_agent.target_train() 
  24.             cur_state = new_state 
  25.             if done: 
  26.                 break 
  27.         if step >= 199: 
  28.             print("Failed to complete trial") 
  29.         else: 
  30.             print("Completed in {} trials".format(trial)) 
  31.             break 

五、完整的代碼

這就是使用 DQN 的「MountainCar-v0」環境的完整代碼!

  1. import gym 
  2. import numpy as np 
  3. import random 
  4. from keras.models import Sequential 
  5. from keras.layers import Dense, Dropout 
  6. from keras.optimizers import Adam 
  7.  
  8. from collections import deque 
  9.  
  10. class DQN: 
  11.    def __init__(self, env): 
  12.        self.env     = env 
  13.        self.memory  = deque(maxlen=2000
  14.         
  15.        self.gamma = 0.85 
  16.        self.epsilon = 1.0 
  17.        self.epsilon_min = 0.01 
  18.        self.epsilon_decay = 0.995 
  19.        self.learning_rate = 0.005 
  20.        self.tau = .125 
  21.  
  22.        selfself.model        = self.create_model() 
  23.        selfself.target_model = self.create_model() 
  24.  
  25.    def create_model(self): 
  26.        model   = Sequential() 
  27.        state_shape  = self.env.observation_space.shape 
  28.        model.add(Dense(24, input_dim=state_shape[0], activation="relu")) 
  29.        model.add(Dense(48, activation="relu")) 
  30.        model.add(Dense(24, activation="relu")) 
  31.        model.add(Dense(self.env.action_space.n)) 
  32.        model.compile(loss="mean_squared_error"
  33.            optimizer=Adam(lr=self.learning_rate)) 
  34.        return model 
  35.  
  36.    def act(self, state): 
  37.        self.epsilon *= self.epsilon_decay 
  38.        self.epsilon = max(self.epsilon_min, self.epsilon) 
  39.        if np.random.random() < self.epsilon: 
  40.            return self.env.action_space.sample() 
  41.        return np.argmax(self.model.predict(state)[0]) 
  42.  
  43.    def remember(self, state, action, reward, new_state, done): 
  44.        self.memory.append([state, action, reward, new_state, done]) 
  45.  
  46.    def replay(self): 
  47.        batch_size = 32 
  48.        if len(self.memory) < batch_size:  
  49.            return 
  50.  
  51.        samples = random.sample(self.memory, batch_size) 
  52.        for sample in samples: 
  53.            state, action, reward, new_state, done = sample 
  54.            target = self.target_model.predict(state) 
  55.            if done: 
  56.                target[0][action] = reward 
  57.            else: 
  58.                Q_future = max(self.target_model.predict(new_state)[0]) 
  59.                target[0][action] = reward + Q_future * self.gamma 
  60.            self.model.fit(state, target, epochs=1verbose=0
  61.  
  62.    def target_train(self): 
  63.        weights = self.model.get_weights() 
  64.        target_weights = self.target_model.get_weights() 
  65.        for i in range(len(target_weights)): 
  66.            target_weights[i] = weights[i] * self.tau + target_weights[i] * (1 - self.tau) 
  67.        self.target_model.set_weights(target_weights) 
  68.  
  69.    def save_model(self, fn): 
  70.        self.model.save(fn) 
  71.  
  72. def main(): 
  73.    env     = gym.make("MountainCar-v0") 
  74.    gamma   = 0.9 
  75.    epsilon = .95 
  76.  
  77.    trials  = 1000 
  78.    trial_len = 500 
  79.  
  80.    # updateTargetNetwork = 1000 
  81.    dqn_agent = DQN(envenv=env) 
  82.    steps = [] 
  83.    for trial in range(trials): 
  84.        cur_state = env.reset().reshape(1,2) 
  85.        for step in range(trial_len): 
  86.            action = dqn_agent.act(cur_state) 
  87.            new_state, reward, done, _ = env.step(action) 
  88.  
  89.            # rewardreward = reward if not done else -20 
  90.            new_statenew_state = new_state.reshape(1,2) 
  91.            dqn_agent.remember(cur_state, action, reward, new_state, done) 
  92.             
  93.            dqn_agent.replay()       # internally iterates default (prediction) model 
  94.            dqn_agent.target_train() # iterates target model 
  95.  
  96.            cur_state = new_state 
  97.            if done: 
  98.                break 
  99.        if step >= 199: 
  100.            print("Failed to complete in trial {}".format(trial)) 
  101.            if step % 10 == 0: 
  102.                dqn_agent.save_model("trial-{}.model".format(trial)) 
  103.        else: 
  104.            print("Completed in {} trials".format(trial)) 
  105.            dqn_agent.save_model("success.model") 
  106.            break 
  107.  
  108. if __name__ == "__main__": 
  109.    main() 

原文:

https://medium.com/towards-data-science/reinforcement-learning-w-keras-openai-dqns-1eed3a5338c

【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-08-17 09:15:23

強化學習KerasOpenAI

2018-11-14 10:28:38

AI數據科技

2018-04-21 06:41:39

Q-learning算法函數

2021-09-17 15:54:41

深度學習機器學習人工智能

2017-03-28 10:15:07

2025-04-08 09:50:00

2023-08-28 09:00:00

強化學習深度學習人工智能

2020-05-12 07:00:00

深度學習強化學習人工智能

2023-12-03 22:08:41

深度學習人工智能

2022-05-31 10:45:01

深度學習防御

2022-09-04 14:38:00

世界模型建模IRIS

2023-08-14 16:49:13

強化學習時態差分法

2023-01-04 10:02:53

強化學習自動駕駛

2025-01-03 11:46:31

2023-03-09 08:00:00

強化學習機器學習圍棋

2020-08-10 06:36:21

強化學習代碼深度學習

2024-11-29 16:33:24

2022-03-25 10:35:20

機器學習深度學習強化學習

2017-06-10 16:19:22

人工智能智能體強化學習

2023-11-07 07:13:31

推薦系統多任務學習
點贊
收藏

51CTO技術棧公眾號

国产欧美日韩综合精品二区| 亚洲国产精品99| 一道精品一区二区三区| 国产欧美综合视频| 中文亚洲字幕| 国产亚洲精品激情久久| 亚洲精品第三页| 爱福利在线视频| 国产女人18水真多18精品一级做| 成人免费在线视频网站| 在线观看亚洲天堂| 中文字幕av亚洲精品一部二部| 亚洲精品456在线播放狼人| 性欧美极品xxxx欧美一区二区| avhd101老司机| 91丨精品丨国产| 五月天亚洲婷婷| 日韩欧美国产二区| 欧洲成人一区二区三区| 美腿丝袜在线亚洲一区 | 欧洲亚洲免费视频| 三上悠亚在线观看视频| 欧美一区 二区| 欧美一区二区三区系列电影| 91视频最新入口| 午夜在线激情影院| 国产精品国产馆在线真实露脸| 国产日韩一区二区三区| 91美女精品网站| 久久高清国产| 久久久久久成人| 91n在线视频| 国产乱码精品一区二区三区四区 | 欧美性在线视频| 国产suv一区二区三区| 精品国产乱码| 日韩av中文字幕在线免费观看| 久久久久久综合网| 国产成人免费9x9x人网站视频| 香蕉成人伊视频在线观看| 日本丰满少妇黄大片在线观看| 成人免费在线视频网| 99久久99久久久精品齐齐| 产国精品偷在线| 国产jzjzjz丝袜老师水多| 久久成人久久爱| 国产精品美女av| 亚洲 欧美 日韩 在线| 国产亚洲一级| 91精品国产91久久久久久不卡| 欧美成欧美va| 国产精品www.| 久久99精品国产99久久6尤物| 中文字幕第69页| 日韩一区自拍| 日韩综合视频在线观看| 国产三级短视频| 日韩大片在线播放| 最好看的2019年中文视频 | 精品久久国产视频| 国产一区二区三区精品欧美日韩一区二区三区 | 99re国产精品| 2019中文字幕全在线观看| 久久草视频在线| 国产精品普通话对白| 91超碰caoporn97人人| 91九色丨porny丨肉丝| 中文在线一区| 国产精品久久久久国产a级| 免费看一级视频| 老司机免费视频一区二区三区| 国产欧美日韩精品专区| 一级爱爱免费视频| 国产美女娇喘av呻吟久久| 91九色蝌蚪嫩草| 亚洲av无码国产综合专区| 成人精品视频网站| 欧美日韩综合网| 在线国产91| 伊人夜夜躁av伊人久久| 毛片在线视频播放| 天然素人一区二区视频| 在线成人免费视频| 欧亚乱熟女一区二区在线| 亚洲动漫精品| 精品国偷自产在线| 国产在线视频你懂的| 国产精品夜夜夜| 国产精品你懂得| 亚洲av色香蕉一区二区三区| 久久亚洲春色中文字幕久久久| 日本电影一区二区三区| 国产精品一区二区三区视频网站| 亚洲国产日韩一级| 国产激情在线观看视频| 亚洲成a人片777777久久| 精品久久久久一区| 美女脱光内衣内裤| 亚洲欧美亚洲| 欧美在线激情视频| 99久久精品国产成人一区二区| 成人免费av在线| 先锋在线资源一区二区三区| 男人天堂亚洲天堂| 91久久一区二区| 91精品国产高清91久久久久久| 中文字幕中文字幕精品| 精品视频9999| 中文字幕一区二区三区四区免费看 | 黄色免费福利视频| 欧美a视频在线| 亚洲国产一区二区三区在线观看| 貂蝉被到爽流白浆在线观看| 亚洲国产激情| 成人免费在线网址| 国产三级在线免费| 午夜精品福利久久久| 一级黄色在线播放| 国产精品美女久久久久久不卡| 久久电影一区二区| www.五月婷婷.com| 91小视频在线观看| 色哟哟免费网站| а√天堂资源国产精品| 日韩av在线一区| 国产一级理论片| 国产做a爰片久久毛片| 日本一区网站| 中文字幕在线高清| 欧美精品一区二区三区蜜桃 | 97国产suv精品一区二区62| 97在线公开视频| 国产日本欧美一区二区| 精品国产一二三四区| 日韩欧美一级| 久久综合网hezyo| 中文字幕视频一区二区| 国产亚洲美州欧州综合国| 大陆极品少妇内射aaaaa| 深夜福利一区| 欧美猛男性生活免费| 国产精品毛片久久久久久久av| 国产日韩影视精品| 可以免费观看av毛片| 日韩欧美黄色| 性视频1819p久久| 理论片中文字幕| 性欧美大战久久久久久久久| 大尺度在线观看| 国产在线日韩| 国产精品亚洲不卡a| 污的网站在线观看| 日韩欧美国产三级| 毛片aaaaa| 成人福利视频网站| 黄色一级在线视频| 天天躁日日躁狠狠躁欧美巨大小说| 欧美激情精品久久久久久大尺度| 亚洲第一天堂网| 亚洲一区二区在线免费看| 久久久久亚洲av无码网站| 欧美特黄视频| 国语精品免费视频| 在线人成日本视频| 亚洲三级黄色在线观看| 日本免费精品视频| 中文一区二区在线观看| 91pony九色| 欧美视频久久| 久久99蜜桃综合影院免费观看| 性欧美freesex顶级少妇| 亚洲乱码国产乱码精品精| 日韩中文字幕高清| 国产精品久久久久久久浪潮网站| 午夜啪啪小视频| 好看不卡的中文字幕| 黄色一区三区| 日本在线中文字幕一区二区三区| 中文字幕精品av| av中文字幕在线免费观看| 亚洲国产视频一区| 精品无人区无码乱码毛片国产| 男男视频亚洲欧美| 国产制服91一区二区三区制服| 国产精品三p一区二区| 欧日韩在线观看| 麻豆影视国产在线观看| av在线小说| 欧美性猛交xxxx黑人| 大吊一区二区三区| 国产成人综合网站| 日韩 欧美 高清| 68国产成人综合久久精品| 精品乱色一区二区中文字幕| 成人性片免费| 久久久久这里只有精品| 福利在线午夜| 日韩精品一区二区三区中文不卡 | 精品久久久国产| 四虎国产成人精品免费一女五男| 国产传媒欧美日韩成人| 十八禁视频网站在线观看| 68国产成人综合久久精品| 欧美大香线蕉线伊人久久国产精品 | 热久久免费视频精品| 黄在线免费观看| 国产手机视频精品| 国产女人高潮时对白| 欧美日韩国产色| 中文字幕av播放| 久久久综合视频| 国产精品果冻传媒| 久久精品99国产精品| 免费无遮挡无码永久视频| 婷婷综合网站| 涩涩日韩在线| 女同一区二区三区| 91丨九色丨国产| 99久久伊人| 538国产精品一区二区在线| 最爽无遮挡行房视频在线| 亚洲视频在线观看免费| 可以免费观看的毛片| 欧美美女bb生活片| 无码人妻一区二区三区免费 | 五月天婷婷导航| 亚洲一二三四区不卡| 91香蕉一区二区三区在线观看| 国产日韩欧美制服另类| 欧美做受喷浆在线观看| 国产aⅴ综合色| 亚欧精品在线视频| 久久电影网站中文字幕| 91n.com在线观看| 久久天堂精品| avav在线看| 亚洲伊人网站| 久草热视频在线观看| 很黄很黄激情成人| 国产 欧美 日韩 一区| 国产精品精品国产一区二区| 亚洲一区二区在线免费观看| 国产真实有声精品录音| 久久精品国产一区二区三区不卡| 加勒比视频一区| 韩日午夜在线资源一区二区| 韩国精品福利一区二区三区| 国产精品三区在线| 懂色av一区二区| 粉嫩高清一区二区三区精品视频| 日韩成人在线看| 操一操视频一区| 国内精品国产成人国产三级粉色 | 色狮一区二区三区四区视频| 色综合电影网| 国产精品久久久久久久久妇女| 亚洲综合首页| 久久久国产精品| 91免费版看片| 亚洲每日更新| 黄色影院一级片| 丝袜诱惑制服诱惑色一区在线观看| 动漫av网站免费观看| 喷水一区二区三区| 午夜一级免费视频| 丰满白嫩尤物一区二区| 国产白袜脚足j棉袜在线观看| 99久久精品费精品国产一区二区| 国产 中文 字幕 日韩 在线| 久久免费国产精品| 亚洲区一区二区三| 亚洲国产日韩精品| 黄色片中文字幕| 欧美日韩黄色一区二区| 国产人妻精品一区二区三| 精品欧美黑人一区二区三区| 亚洲aⅴ在线观看| 最近的2019中文字幕免费一页 | 亚洲国产精品视频在线| 亚洲国产成人精品女人久久久| 天堂а在线中文在线无限看推荐| 一本色道久久88精品综合| 快射视频在线观看| 欧美激情欧美激情在线五月| 日韩新的三级电影| 91中文字幕在线观看| 精品福利网址导航| 天天爽天天狠久久久| 欧美精品国产一区| 黄色a级片免费| 国产精品一二三在| 在线视频 日韩| 国产精品午夜久久| 天堂资源在线播放| 欧美三级欧美一级| 精品久久久久久久无码| 性xxxfreexxxx性欧美| 久久免费精品视频| 欧美成人免费全部网站| 国产精品二区三区| 欧美日韩精品一区二区视频| 日本黄大片在线观看| 日韩精品亚洲一区| 美女黄色一级视频| 日韩一区有码在线| 蜜臀精品一区二区三区| 日韩欧美黄色影院| 成年人视频在线免费观看| 欧美国产日本在线| 另类一区二区三区| 久久精品一二三区| 欧美.www| 三级av免费观看| 久久综合九色欧美综合狠狠| 99久久婷婷国产综合| 在线一区二区三区四区五区| 欧美一级视频免费| 久久国产精品久久久久久| se69色成人网wwwsex| 麻豆传媒一区二区| 国产一区二区三区四区三区四| 色综合色综合色综合色综合| 久久亚洲私人国产精品va媚药| 国产在线一区视频| 日韩一级免费观看| 秋霞成人影院| 国产精品视频最多的网站| 久草在线成人| 日韩少妇内射免费播放18禁裸乳| 国产69精品一区二区亚洲孕妇| 99久久久免费精品| 欧美亚洲综合网| 女人天堂在线| 69**夜色精品国产69乱| 北条麻妃在线一区二区免费播放| 国产精品无码乱伦| 美女网站色91| 特级西西人体高清大胆| 91福利社在线观看| 美女欧美视频在线观看免费 | 欧美v日韩v国产v| 曰本三级在线| 91视频免费网站| 天天做天天爱天天综合网2021| 国产 porn| 国产精品色在线| 亚洲一级片免费看| 色黄久久久久久| 91精品国产色综合久久不卡粉嫩| 亚洲资源在线网| 久久成人精品无人区| 潘金莲一级黄色片| 欧美日韩国产bt| 麻豆tv入口在线看| 亚洲www永久成人夜色| 中文无码久久精品| 久久无码专区国产精品s| 亚洲综合久久久久| 三级网站免费观看| 欧美亚洲国产日本| 精品国产成人| 欧美一级视频在线| 一区二区三区四区在线播放| 亚洲精品网站在线| 欧美一区二区三区图| 欧美日韩第一| 在线免费黄色网| 亚洲综合一区在线| 四虎在线观看| 国产成人精品日本亚洲专区61| 久久中文字幕av| 99热这里只有精品2| 亚洲成人av免费| 国产精品久久久久久久龚玥菲| 成人久久18免费网站图片| 欧美日韩精品一本二本三本 | 国产精品欧美一区二区三区| 91av久久久| 欧美精品福利在线| 亚洲资源网站| 三日本三级少妇三级99| 亚洲6080在线| av在线免费观看网站| 99在线首页视频| 美女黄网久久| 麻豆天美蜜桃91| 亚洲精品电影网在线观看| 日韩天堂在线| 国产一级不卡视频| 久久久久国产精品厨房| 国产麻豆91视频| 91禁国产网站| 欧美gayvideo| 国产乱了高清露脸对白| 精品婷婷伊人一区三区三| 韩国成人免费视频| 日韩av一级大片| 成人午夜电影久久影院| 中文字幕 日韩有码| 欧美激情久久久久久|