精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲毛片在线播放| 欧美日韩国产精品一区二区三区| 成人日韩精品| 最新欧美精品一区二区三区| 懂色av一区二区三区在线播放| 国产女同在线观看| 99久久亚洲精品| 亚洲第一精品福利| 久久久精品麻豆| 美足av综合网| 国产女同性恋一区二区| 成人av电影免费| 中国女人真人一级毛片| 欧美三级不卡| 中文字幕欧美日韩在线| 亚洲一级av无码毛片精品| 黄色成人小视频| 福利二区91精品bt7086| 日本一区二区免费高清视频| 深夜福利免费在线观看| 国产成人一区二区精品非洲| 国产精品第100页| 国产91av视频| 自拍日韩欧美| 中国日韩欧美久久久久久久久| 国产免费一区二区三区最新6| 青青伊人久久| 欧美亚洲动漫精品| 国产精品无码一区二区在线| 羞羞视频在线观看不卡| 国产精品久久久久久久久搜平片| 久久青青草综合| 亚洲国产日韩在线观看| 麻豆中文一区二区| 国产不卡av在线免费观看| 国产亚洲欧美精品久久久久久| 久久综合国产| 在线播放日韩欧美| 国产真实乱人偷精品人妻| 精品国产18久久久久久洗澡| 日韩色视频在线观看| 手机av在线免费| 国产91精品在线| 在线观看日韩国产| 久久久久狠狠高潮亚洲精品| 999av小视频在线| 亚洲午夜国产一区99re久久| 欧美黄色免费网址| 麻豆蜜桃在线| 亚洲人成亚洲人成在线观看图片| 亚洲综合av一区| www在线播放| 国产日韩三级在线| 色一情一乱一伦一区二区三欧美| 免费在线超碰| 国产午夜精品久久久久久免费视| 免费精品视频一区二区三区| 涩爱av在线播放一区二区| 91在线视频在线| 欧美日韩精品中文字幕一区二区| 欧美性孕妇孕交| 久久久www成人免费毛片麻豆| 欧美成人在线免费观看| 九色在线视频蝌蚪| 国产日产精品一区| 在线观看欧美激情| 性xxxfreexxxx性欧美| 一区二区三区四区精品在线视频| 中文字幕在线中文| sm久久捆绑调教精品一区| 欧美日韩精品在线播放| 老司机午夜av| 亚洲精品aa| 精品黑人一区二区三区久久| 51调教丨国产调教视频| 全球成人免费直播| 欧美精品一二区| 国产精品16p| 久久久久免费| 91久久久久久| 免费看黄色一级视频| 久久综合色婷婷| 亚洲国产一区二区三区在线播| 国产黄色在线免费观看| 婷婷综合在线观看| 国产精品乱码久久久久| 国产精品成人**免费视频| 精品国产乱码久久久久久图片 | 国产嫩bbwbbw高潮| 久久激情五月激情| 国产精品v欧美精品v日韩| 亚洲av毛片成人精品| 欧美经典三级视频一区二区三区| 中文字幕第一页亚洲| mm视频在线视频| 欧美日韩一二三| 大尺度做爰床戏呻吟舒畅| 亚洲精品进入| 欧美猛交ⅹxxx乱大交视频| 久草手机在线观看| 国产美女视频91| 久久天天狠狠| 大片免费在线观看| 色综合天天性综合| 日日夜夜精品视频免费观看| 亚洲日本三级| 久久久久久久一| 中文在线字幕免费观| 成人18视频在线播放| 中文字幕av日韩精品| 男女羞羞在线观看| 日韩欧美一级二级| 男人的天堂av网| 亚洲精品麻豆| 亚洲综合中文字幕在线| 国产美女视频一区二区三区| 亚洲在线视频网站| 久国产精品视频| 国产欧美日韩一区二区三区四区| 色综合久久88| 一区二区美女视频| 国产亚洲精品精华液| 久久这里只有精品23| 国产精品99久久免费| 有码中文亚洲精品| 无码人妻一区二区三区免费| 成人高清免费观看| av影院在线播放| 一区二区三区无毛| 最好看的2019的中文字幕视频| 超碰中文字幕在线| 99麻豆久久久国产精品免费| 男女裸体影院高潮| 国产精品免费精品自在线观看| 在线看日韩欧美| 欧美日韩a v| 久久久精品人体av艺术| 国产免费黄色av| 美女视频亚洲色图| 8050国产精品久久久久久| 亚洲第一黄色片| 亚洲女性喷水在线观看一区| 999久久久精品视频| 日韩www.| 国产精品中文久久久久久久| porn视频在线观看| 欧美三级日韩三级| 婷婷丁香综合网| 麻豆精品久久久| 亚洲精品一区二区三区av| 91成人抖音| 视频在线观看一区二区| 怡红院男人天堂| 国产精品高潮久久久久无| 性生活免费在线观看| 久久精品国产www456c0m| 国产精品一区二区久久国产| 免费黄色在线网站| 欧美一级理论性理论a| 老女人性淫交视频| 丁香婷婷综合网| 国产综合av在线| 神马影视一区二区| 国产精品女人久久久久久| 无遮挡动作视频在线观看免费入口| 欧美午夜精品久久久久久孕妇| 欧美日韩生活片| 国产精品一区不卡| 成人性免费视频| 国产欧美日韩精品高清二区综合区| 国产精品美腿一区在线看| 免费在线观看黄| 精品久久人人做人人爰| 亚洲视频免费播放| 国产偷国产偷精品高清尤物| 色免费在线视频| 欧美午夜不卡影院在线观看完整版免费| 国产99午夜精品一区二区三区| 蜜桃视频在线观看播放| 伊人伊人伊人久久| 国产毛片久久久久| 性做久久久久久久久| xxxxx在线观看| 狠狠色伊人亚洲综合成人| 久久久久久人妻一区二区三区| 国产精品嫩模av在线| 91九色国产在线| 国产拍在线视频| 自拍亚洲一区欧美另类| 亚洲成人一级片| 在线精品视频小说1| 放荡的美妇在线播放| 久久亚洲精华国产精华液| 中国黄色片一级| 99精品久久久| 一本久道久久综合| 精品嫩草影院| 国产美女久久精品香蕉69| 丁香花在线观看完整版电影| 一区二区亚洲欧洲国产日韩| 国产激情视频在线播放| 91久久精品日日躁夜夜躁欧美| 2018天天弄| 国产精品视频yy9299一区| 国产艳妇疯狂做爰视频| 久久精品99国产精品| 成人毛片一区二区| 91tv精品福利国产在线观看| 欧美日韩一区在线观看视频| 一区二区三区在线免费看| 国产精品美女久久| 午夜影院在线播放| 欧美疯狂性受xxxxx另类| 二人午夜免费观看在线视频| 亚洲高清一区二| 国产三区在线播放| 欧美日免费三级在线| 青青国产在线观看| 樱花影视一区二区| 欧美精品一区二区蜜臀亚洲| 亚洲一区二区久久| 99re国产视频| 一级日本在线| 丝袜美腿成人在线| 韩国av一区二区三区四区 | 日韩av图片| 四虎成人精品一区二区免费网站| 国产精品88久久久久久| 一本色道69色精品综合久久| 中文字幕欧美国产| 成人啪啪18免费游戏链接| 色多多在线观看| 7777精品| 久久久精品国产| 国产免费av高清在线| 亚洲国产成人在线视频| 国精产品一品二品国精品69xx | 日韩激情av在线| 国产精品久久久久婷婷二区次| 欧美午夜精品久久久久久久| 992tv人人草| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产免费一区二区三区网站免费| 久久蜜桃精品| 韩国三级日本三级少妇99| 日本中文字幕在线播放| 中文字幕免费国产精品| 国产免费av高清在线| 国产午夜精品美女视频明星a级| 黄色片免费在线| 亚洲最新av在线| 精品美女视频在线观看免费软件| 国产丝袜精品第一页| 三级做a全过程在线观看| 亚洲乱码国产乱码精品精天堂| 亚洲色图狠狠干| 亚洲人精选亚洲人成在线| 狠狠v欧美ⅴ日韩v亚洲v大胸| 我不卡手机影院| 色综合久久中文字幕| 久一视频在线观看| 亚洲成人一二三| 男人天堂中文字幕| 色综合天天综合色综合av| 男操女视频网站| 欧美人与禽zozo性伦| 国产美女明星三级做爰| 日韩欧美一二区| 色资源在线观看| 亚洲福利久久| 91一区二区三区在线观看| 99九九视频| 97精品资源在线观看| 91久久精品国产91久久性色tv| 国产美女福利在线观看| 在线一区二区三区四区五区| 在线观看av大片| 日韩免费高清av| 亚洲人妻一区二区三区| 在线视频免费一区二区| 成人无遮挡免费网站视频在线观看| 欧美激情视频一区二区三区不卡| 五月天av在线| 成人久久久久久| 欧美18免费视频| 一区二区三区四区欧美日韩| 国产综合自拍| 男女无套免费视频网站动漫| 国产美女精品人人做人人爽| 国产熟女高潮一区二区三区| 中文字幕乱码久久午夜不卡 | 久久久久亚洲| 5月婷婷6月丁香| 精品一区二区精品| 麻豆av免费观看| 亚洲一区影音先锋| 亚洲一线在线观看| 亚洲精品美女久久久久| 成视频免费观看在线看| 琪琪第一精品导航| 少妇精品在线| 正在播放亚洲| 亚洲欧美日本国产专区一区| 亚洲欧美一区二区三区不卡| 久久精品欧美日韩| 麻豆视频在线免费看| 精品免费在线观看| 在线播放一级片| 亚洲人成网站在线播| 午夜小视频福利在线观看| 国产精品女人久久久久久| 欧美影院天天5g天天爽| 乱子伦一区二区| 美日韩一区二区三区| 熟女丰满老熟女熟妇| 亚洲成人你懂的| 精品国产av鲁一鲁一区| 最近的2019中文字幕免费一页 | 最新中文字幕视频| 亚洲午夜影视影院在线观看| 国产毛片毛片毛片毛片毛片| 中文国产成人精品久久一| 亚洲精品永久免费视频| 国产麻豆日韩| 激情欧美日韩| 日韩黄色一区二区| 亚洲人成小说网站色在线| 免费看av在线| 亚洲午夜av久久乱码| 深夜福利视频一区二区| 狠狠色伊人亚洲综合网站色| 国产精品www.| 国产xxx在线观看| 亚洲女人****多毛耸耸8| 日本精品入口免费视频| 亚洲欧美在线第一页| 亚洲优女在线| 蜜桃999成人看片在线观看| 亚洲一区黄色| 精品人妻一区二区三区视频| 日韩欧美亚洲国产一区| 日韩资源在线| 国产成人精品久久久| 久草精品在线| 亚洲狼人综合干| 欧美国产精品v| 中文字幕日韩第一页| 中文字幕一区二区精品| 精品乱码一区二区三区四区| 亚洲永久一区二区三区在线| 麻豆国产精品一区二区三区| 一二三四国产精品| 欧美人动与zoxxxx乱| 麻豆tv入口在线看| 97在线电影| 极品av少妇一区二区| 亚洲精品国产成人av在线| 欧美日韩国内自拍| 国产三级在线观看| 国产精品网站视频| 亚洲激情久久| 久久福利小视频| 色婷婷综合视频在线观看| 97视频精彩视频在线观看| 成人性生交大片免费看小说| 欧美成人有码| 少妇户外露出[11p]| 欧美伊人久久久久久久久影院| 1区2区3区在线观看| 亚洲影院高清在线| 国产亚洲成人一区| 免费成人深夜天涯网站| 67194成人在线观看| 福利成人导航| 婷婷四房综合激情五月| 国产在线播精品第三| 国产精品一区二区6| 中文字幕亚洲图片| 国偷自产av一区二区三区| 男人透女人免费视频| 亚洲人成伊人成综合网小说| 天天插天天干天天操| 国产精品免费福利| 午夜精品久久久久99热蜜桃导演| 97人妻精品一区二区三区免| 欧美色偷偷大香| 国产亚av手机在线观看| 日韩欧美一区二区视频在线播放 | 久久中文免费视频| 日韩精品免费电影| 国产精品美女久久久久人| 午夜精品久久久久久久无码| 国产精品日韩成人| 黄色aaa大片| 国产在线视频不卡| 香蕉久久久久久久av网站| 久久中文免费视频| 国产亚洲视频在线观看| 精品成人自拍视频| 三级黄色片免费观看|