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

DDPG強(qiáng)化學(xué)習(xí)的PyTorch代碼實(shí)現(xiàn)和逐步講解

開(kāi)發(fā) 前端
深度確定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network啟發(fā)的無(wú)模型、非策略深度強(qiáng)化算法,是基于使用策略梯度的Actor-Critic,本文將使用pytorch對(duì)其進(jìn)行完整的實(shí)現(xiàn)和講解

深度確定性策略梯度(Deep Deterministic Policy Gradient, DDPG)是受Deep Q-Network啟發(fā)的無(wú)模型、非策略深度強(qiáng)化算法,是基于使用策略梯度的Actor-Critic,本文將使用pytorch對(duì)其進(jìn)行完整的實(shí)現(xiàn)和講解

圖片

DDPG的關(guān)鍵組成部分是

  • Replay Buffer
  • Actor-Critic neural network
  • Exploration Noise
  • Target network
  • Soft Target Updates for Target Network

下面我們一個(gè)一個(gè)來(lái)逐步實(shí)現(xiàn):

Replay Buffer

DDPG使用Replay Buffer存儲(chǔ)通過(guò)探索環(huán)境采樣的過(guò)程和獎(jiǎng)勵(lì)(S?,a?,R?,S?+?)。Replay Buffer在幫助代理加速學(xué)習(xí)以及DDPG的穩(wěn)定性方面起著至關(guān)重要的作用:

  • 最小化樣本之間的相關(guān)性:將過(guò)去的經(jīng)驗(yàn)存儲(chǔ)在 Replay Buffer 中,從而允許代理從各種經(jīng)驗(yàn)中學(xué)習(xí)。
  • 啟用離線(xiàn)策略學(xué)習(xí):允許代理從重播緩沖區(qū)采樣轉(zhuǎn)換,而不是從當(dāng)前策略采樣轉(zhuǎn)換。
  • 高效采樣:將過(guò)去的經(jīng)驗(yàn)存儲(chǔ)在緩沖區(qū)中,允許代理多次從不同的經(jīng)驗(yàn)中學(xué)習(xí)。
class Replay_buffer():
'''
Code based on:
https://github.com/openai/baselines/blob/master/baselines/deepq/replay_buffer.py
Expects tuples of (state, next_state, action, reward, done)
'''
def __init__(self, max_size=capacity):
"""Create Replay buffer.
Parameters
----------
size: int
Max number of transitions to store in the buffer. When the buffer
overflows the old memories are dropped.
"""
self.storage = []
self.max_size = max_size
self.ptr = 0

def push(self, data):
if len(self.storage) == self.max_size:
self.storage[int(self.ptr)] = data
self.ptr = (self.ptr + 1) % self.max_size
else:
self.storage.append(data)

def sample(self, batch_size):
"""Sample a batch of experiences.
Parameters
----------
batch_size: int
How many transitions to sample.
Returns
-------
state: np.array
batch of state or observations
action: np.array
batch of actions executed given a state
reward: np.array
rewards received as results of executing action
next_state: np.array
next state next state or observations seen after executing action
done: np.array
done[i] = 1 if executing ation[i] resulted in
the end of an episode and 0 otherwise.
"""
ind = np.random.randint(0, len(self.storage), size=batch_size)
state, next_state, action, reward, done = [], [], [], [], []

for i in ind:
st, n_st, act, rew, dn = self.storage[i]
state.append(np.array(st, copy=False))
next_state.append(np.array(n_st, copy=False))
action.append(np.array(act, copy=False))
reward.append(np.array(rew, copy=False))
done.append(np.array(dn, copy=False))

return np.array(state), np.array(next_state), np.array(action), np.array(reward).reshape(-1, 1), np.array(done).reshape(-1, 1)

Actor-Critic Neural Network

這是Actor-Critic 強(qiáng)化學(xué)習(xí)算法的 PyTorch 實(shí)現(xiàn)。該代碼定義了兩個(gè)神經(jīng)網(wǎng)絡(luò)模型,一個(gè) Actor 和一個(gè) Critic。

Actor 模型的輸入:環(huán)境狀態(tài);Actor 模型的輸出:具有連續(xù)值的動(dòng)作。

Critic 模型的輸入:環(huán)境狀態(tài)和動(dòng)作;Critic 模型的輸出:Q 值,即當(dāng)前狀態(tài)-動(dòng)作對(duì)的預(yù)期總獎(jiǎng)勵(lì)。

class Actor(nn.Module):
"""
The Actor model takes in a state observation as input and
outputs an action, which is a continuous value.

It consists of four fully connected linear layers with ReLU activation functions and
a final output layer selects one single optimized action for the state
"""
def __init__(self, n_states, action_dim, hidden1):
super(Actor, self).__init__()
self.net = nn.Sequential(
nn.Linear(n_states, hidden1),
nn.ReLU(),
nn.Linear(hidden1, hidden1),
nn.ReLU(),
nn.Linear(hidden1, hidden1),
nn.ReLU(),
nn.Linear(hidden1, 1)
)

def forward(self, state):
return self.net(state)

class Critic(nn.Module):
"""
The Critic model takes in both a state observation and an action as input and
outputs a Q-value, which estimates the expected total reward for the current state-action pair.

It consists of four linear layers with ReLU activation functions,
State and action inputs are concatenated before being fed into the first linear layer.

The output layer has a single output, representing the Q-value
"""
def __init__(self, n_states, action_dim, hidden2):
super(Critic, self).__init__()
self.net = nn.Sequential(
nn.Linear(n_states + action_dim, hidden2),
nn.ReLU(),
nn.Linear(hidden2, hidden2),
nn.ReLU(),
nn.Linear(hidden2, hidden2),
nn.ReLU(),
nn.Linear(hidden2, action_dim)
)

def forward(self, state, action):
return self.net(torch.cat((state, action), 1))

Exploration Noise

向 Actor 選擇的動(dòng)作添加噪聲是 DDPG 中用來(lái)鼓勵(lì)探索和改進(jìn)學(xué)習(xí)過(guò)程的一種技術(shù)。

可以使用高斯噪聲或 Ornstein-Uhlenbeck 噪聲。 高斯噪聲簡(jiǎn)單且易于實(shí)現(xiàn),Ornstein-Uhlenbeck 噪聲會(huì)生成時(shí)間相關(guān)的噪聲,可以幫助代理更有效地探索動(dòng)作空間。但是與高斯噪聲方法相比,Ornstein-Uhlenbeck 噪聲波動(dòng)更平滑且隨機(jī)性更低。

import numpy as np
import random
import copy

class OU_Noise(object):
"""Ornstein-Uhlenbeck process.
code from :
https://math.stackexchange.com/questions/1287634/implementing-ornstein-uhlenbeck-in-matlab
The OU_Noise class has four attributes

size: the size of the noise vector to be generated
mu: the mean of the noise, set to 0 by default
theta: the rate of mean reversion, controlling how quickly the noise returns to the mean
sigma: the volatility of the noise, controlling the magnitude of fluctuations
"""
def __init__(self, size, seed, mu=0., theta=0.15, sigma=0.2):
self.mu = mu * np.ones(size)
self.theta = theta
self.sigma = sigma
self.seed = random.seed(seed)
self.reset()

def reset(self):
"""Reset the internal state (= noise) to mean (mu)."""
self.state = copy.copy(self.mu)

def sample(self):
"""Update internal state and return it as a noise sample.
This method uses the current state of the noise and generates the next sample
"""
dx = self.theta * (self.mu - self.state) + self.sigma * np.array([np.random.normal() for _ in range(len(self.state))])
self.state += dx
return self.state

要在DDPG中使用高斯噪聲,可以直接將高斯噪聲添加到代理的動(dòng)作選擇過(guò)程中。

DDPG

DDPG (Deep Deterministic Policy Gradient)采用兩組Actor-Critic神經(jīng)網(wǎng)絡(luò)進(jìn)行函數(shù)逼近。在DDPG中,目標(biāo)網(wǎng)絡(luò)是Actor-Critic ,它目標(biāo)網(wǎng)絡(luò)具有與Actor-Critic網(wǎng)絡(luò)相同的結(jié)構(gòu)和參數(shù)化。

在訓(xùn)練期時(shí),代理使用其 Actor-Critic 網(wǎng)絡(luò)與環(huán)境交互,并將經(jīng)驗(yàn)元組(S?、A?、R?、S?+?)存儲(chǔ)在Replay Buffer中。 然后代理從 Replay Buffer 中采樣并使用數(shù)據(jù)更新 Actor-Critic 網(wǎng)絡(luò)。 DDPG 算法不是通過(guò)直接從 Actor-Critic 網(wǎng)絡(luò)復(fù)制來(lái)更新目標(biāo)網(wǎng)絡(luò)權(quán)重,而是通過(guò)稱(chēng)為軟目標(biāo)更新的過(guò)程緩慢更新目標(biāo)網(wǎng)絡(luò)權(quán)重。

圖片

軟目標(biāo)的更新是從Actor-Critic網(wǎng)絡(luò)傳輸?shù)侥繕?biāo)網(wǎng)絡(luò)的稱(chēng)為目標(biāo)更新率(τ)的權(quán)重的一小部分。

軟目標(biāo)的更新公式如下:

圖片

通過(guò)使用軟目標(biāo)技術(shù),可以大大提高學(xué)習(xí)的穩(wěn)定性。

#Set Hyperparameters
# Hyperparameters adapted for performance from
capacity=1000000
batch_size=64
update_iteration=200
tau=0.001 # tau for soft updating
gamma=0.99 # discount factor
directory = './'
hidden1=20 # hidden layer for actor
hidden2=64. #hiiden laye for critic

class DDPG(object):
def __init__(self, state_dim, action_dim):
"""
Initializes the DDPG agent.
Takes three arguments:
state_dim which is the dimensionality of the state space,
action_dim which is the dimensionality of the action space, and
max_action which is the maximum value an action can take.

Creates a replay buffer, an actor-critic networks and their corresponding target networks.
It also initializes the optimizer for both actor and critic networks alog with
counters to track the number of training iterations.
"""
self.replay_buffer = Replay_buffer()

self.actor = Actor(state_dim, action_dim, hidden1).to(device)
self.actor_target = Actor(state_dim, action_dim, hidden1).to(device)
self.actor_target.load_state_dict(self.actor.state_dict())
self.actor_optimizer = optim.Adam(self.actor.parameters(), lr=3e-3)

self.critic = Critic(state_dim, action_dim, hidden2).to(device)
self.critic_target = Critic(state_dim, action_dim, hidden2).to(device)
self.critic_target.load_state_dict(self.critic.state_dict())
self.critic_optimizer = optim.Adam(self.critic.parameters(), lr=2e-2)
# learning rate



self.num_critic_update_iteration = 0
self.num_actor_update_iteration = 0
self.num_training = 0

def select_action(self, state):
"""
takes the current state as input and returns an action to take in that state.
It uses the actor network to map the state to an action.
"""
state = torch.FloatTensor(state.reshape(1, -1)).to(device)
return self.actor(state).cpu().data.numpy().flatten()


def update(self):
"""
updates the actor and critic networks using a batch of samples from the replay buffer.
For each sample in the batch, it computes the target Q value using the target critic network and the target actor network.
It then computes the current Q value
using the critic network and the action taken by the actor network.

It computes the critic loss as the mean squared error between the target Q value and the current Q value, and
updates the critic network using gradient descent.

It then computes the actor loss as the negative mean Q value using the critic network and the actor network, and
updates the actor network using gradient ascent.

Finally, it updates the target networks using
soft updates, where a small fraction of the actor and critic network weights are transferred to their target counterparts.
This process is repeated for a fixed number of iterations.
"""

for it in range(update_iteration):
# For each Sample in replay buffer batch
state, next_state, action, reward, done = self.replay_buffer.sample(batch_size)
state = torch.FloatTensor(state).to(device)
action = torch.FloatTensor(action).to(device)
next_state = torch.FloatTensor(next_state).to(device)
done = torch.FloatTensor(1-done).to(device)
reward = torch.FloatTensor(reward).to(device)

# Compute the target Q value
target_Q = self.critic_target(next_state, self.actor_target(next_state))
target_Q = reward + (done * gamma * target_Q).detach()

# Get current Q estimate
current_Q = self.critic(state, action)

# Compute critic loss
critic_loss = F.mse_loss(current_Q, target_Q)

# Optimize the critic
self.critic_optimizer.zero_grad()
critic_loss.backward()
self.critic_optimizer.step()

# Compute actor loss as the negative mean Q value using the critic network and the actor network
actor_loss = -self.critic(state, self.actor(state)).mean()

# Optimize the actor
self.actor_optimizer.zero_grad()
actor_loss.backward()
self.actor_optimizer.step()


"""
Update the frozen target models using
soft updates, where
tau,a small fraction of the actor and critic network weights are transferred to their target counterparts.
"""
for param, target_param in zip(self.critic.parameters(), self.critic_target.parameters()):
target_param.data.copy_(tau * param.data + (1 - tau) * target_param.data)

for param, target_param in zip(self.actor.parameters(), self.actor_target.parameters()):
target_param.data.copy_(tau * param.data + (1 - tau) * target_param.data)


self.num_actor_update_iteration += 1
self.num_critic_update_iteration += 1
def save(self):
"""
Saves the state dictionaries of the actor and critic networks to files
"""
torch.save(self.actor.state_dict(), directory + 'actor.pth')
torch.save(self.critic.state_dict(), directory + 'critic.pth')

def load(self):
"""
Loads the state dictionaries of the actor and critic networks to files
"""
self.actor.load_state_dict(torch.load(directory + 'actor.pth'))
self.critic.load_state_dict(torch.load(directory + 'critic.pth'))

訓(xùn)練DDPG

這里我們使用 OpenAI Gym 的“MountainCarContinuous-v0”來(lái)訓(xùn)練我們的DDPG RL 模型,這里的環(huán)境提供連續(xù)的行動(dòng)和觀察空間,目標(biāo)是盡快讓小車(chē)到達(dá)山頂。

圖片

下面定義算法的各種參數(shù),例如最大訓(xùn)練次數(shù)、探索噪聲和記錄間隔等等。 使用固定的隨機(jī)種子可以使得過(guò)程能夠回溯。

import gym

# create the environment
env_name='MountainCarContinuous-v0'
env = gym.make(env_name)
device = 'cuda' if torch.cuda.is_available() else 'cpu'

# Define different parameters for training the agent
max_episode=100
max_time_steps=5000
ep_r = 0
total_step = 0
score_hist=[]
# for rensering the environmnet
render=True
render_interval=10
# for reproducibility
env.seed(0)
torch.manual_seed(0)
np.random.seed(0)
#Environment action ans states
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.shape[0]
max_action = float(env.action_space.high[0])
min_Val = torch.tensor(1e-7).float().to(device)

# Exploration Noise
exploration_noise=0.1
exploration_noise=0.1 * max_action

創(chuàng)建DDPG代理類(lèi)的實(shí)例,以訓(xùn)練代理達(dá)到指定的次數(shù)。在每輪結(jié)束時(shí)調(diào)用代理的update()方法來(lái)更新參數(shù),并且在每十輪之后使用save()方法將代理的參數(shù)保存到一個(gè)文件中。

# Create a DDPG instance
agent = DDPG(state_dim, action_dim)

# Train the agent for max_episodes
for i in range(max_episode):
total_reward = 0
step =0
state = env.reset()
for t in range(max_time_steps):
action = agent.select_action(state)
# Add Gaussian noise to actions for exploration
action = (action + np.random.normal(0, 1, size=action_dim)).clip(-max_action, max_action)
#action += ou_noise.sample()
next_state, reward, done, info = env.step(action)
total_reward += reward
if render and i >= render_interval : env.render()
agent.replay_buffer.push((state, next_state, action, reward, np.float(done)))
state = next_state
if done:
break
step += 1

score_hist.append(total_reward)
total_step += step+1
print("Episode: \t{} Total Reward: \t{:0.2f}".format( i, total_reward))
agent.update()
if i % 10 == 0:
agent.save()
env.close()

測(cè)試DDPG

test_iteration=100

for i in range(test_iteration):
state = env.reset()
for t in count():
action = agent.select_action(state)
next_state, reward, done, info = env.step(np.float32(action))
ep_r += reward
print(reward)
env.render()
if done:
print("reward{}".format(reward))
print("Episode \t{}, the episode reward is \t{:0.2f}".format(i, ep_r))
ep_r = 0
env.render()
break
state = next_state

我們使用下面的參數(shù)讓模型收斂:

  • 從標(biāo)準(zhǔn)正態(tài)分布中采樣噪聲,而不是隨機(jī)采樣。
  • 將polyak常數(shù)(tau)從0.99更改為0.001
  • 修改Critic 網(wǎng)絡(luò)的隱藏層大小為[64,64]。在Critic 網(wǎng)絡(luò)的第二層之后刪除了ReLU激活。改成(Linear, ReLU, Linear, Linear)。
  • 最大緩沖區(qū)大小更改為1000000
  • 將batch_size的大小從128更改為64

訓(xùn)練了75輪之后的效果如下:

圖片

總結(jié)

DDPG算法是一種受deep Q-Network (DQN)算法啟發(fā)的無(wú)模型off-policy Actor-Critic算法。它結(jié)合了策略梯度方法和Q-learning的優(yōu)點(diǎn)來(lái)學(xué)習(xí)連續(xù)動(dòng)作空間的確定性策略。

與DQN類(lèi)似,它使用重播緩沖區(qū)存儲(chǔ)過(guò)去的經(jīng)驗(yàn)和目標(biāo)網(wǎng)絡(luò),用于訓(xùn)練網(wǎng)絡(luò),從而提高了訓(xùn)練過(guò)程的穩(wěn)定性。

DDPG算法需要仔細(xì)的超參數(shù)調(diào)優(yōu)以獲得最佳性能。超參數(shù)包括學(xué)習(xí)率、批大小、目標(biāo)網(wǎng)絡(luò)更新速率和探測(cè)噪聲參數(shù)。超參數(shù)的微小變化會(huì)對(duì)算法的性能產(chǎn)生重大影響。

責(zé)任編輯:華軒 來(lái)源: DeepHub IMBA
相關(guān)推薦

2020-08-10 06:36:21

強(qiáng)化學(xué)習(xí)代碼深度學(xué)習(xí)

2025-01-09 15:57:41

2023-05-10 15:53:19

2023-01-24 17:03:13

強(qiáng)化學(xué)習(xí)算法機(jī)器人人工智能

2019-09-29 10:42:02

人工智能機(jī)器學(xué)習(xí)技術(shù)

2025-03-11 01:00:00

GRPO算法模型

2024-01-26 08:31:49

2022-05-31 10:45:01

深度學(xué)習(xí)防御

2023-06-25 11:30:47

可視化

2025-05-08 09:16:00

模型強(qiáng)化學(xué)習(xí)訓(xùn)練

2025-01-03 11:46:31

2022-03-25 10:35:20

機(jī)器學(xué)習(xí)深度學(xué)習(xí)強(qiáng)化學(xué)習(xí)

2023-03-09 08:00:00

強(qiáng)化學(xué)習(xí)機(jī)器學(xué)習(xí)圍棋

2020-11-12 19:31:41

強(qiáng)化學(xué)習(xí)人工智能機(jī)器學(xué)習(xí)

2019-08-12 08:43:53

GitHub代碼開(kāi)發(fā)者

2021-09-17 15:54:41

深度學(xué)習(xí)機(jī)器學(xué)習(xí)人工智能

2022-11-02 14:02:02

強(qiáng)化學(xué)習(xí)訓(xùn)練

2023-11-07 07:13:31

推薦系統(tǒng)多任務(wù)學(xué)習(xí)

2020-06-05 08:09:01

Python強(qiáng)化學(xué)習(xí)框架

2023-07-20 15:18:42

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

外国成人在线视频| 后入内射欧美99二区视频| 开心激情综合| 亚洲国产日日夜夜| 99在线视频免费观看| 国产白丝一区二区三区| 99久久亚洲国产日韩美女 | 不卡av电影院| 国产亚洲综合视频| 亚洲日本国产精品| 丝袜亚洲精品中文字幕一区| 国产一区二区三区18| 牛夜精品久久久久久久| 中文字幕一区二区人妻在线不卡| 在线观看免费不卡av| 国产在线小视频| 日韩二区三区在线观看| 在线免费观看羞羞视频一区二区| 亚欧在线免费观看| 日本精品一区二区三区在线播放| 国产又粗又猛又爽又黄91精品| 久久国产精品久久久久久久久久| 久久人妻少妇嫩草av蜜桃| 黄视频免费在线看| 国产欧美1区2区3区| 91在线直播亚洲| 国产一级做a爱免费视频| 人人精品亚洲| 欧美在线制服丝袜| 国产盗摄视频在线观看| 四虎在线观看| 久久精品免费观看| 国模极品一区二区三区| 日韩毛片无码永久免费看| 韩国三级大全久久网站| 色综合欧美在线视频区| 日本一区二区免费高清视频| 日本激情视频网站| 久久精品国内一区二区三区| 久久久久国产一区二区三区| 五月天精品在线| 999在线精品| 狠狠色狠狠色综合日日小说| av不卡在线免费观看| 三级在线观看网站| 毛片av一区二区| 97精品视频在线| www.黄色com| 日韩精品丝袜美腿| 日韩一区二区中文字幕| 成人免费无码av| 天堂а√在线资源在线| 成人黄色在线网站| 成人免费高清完整版在线观看| 国产一卡二卡在线| 99久久99久久精品国产片桃花 | 日韩不卡的av| 爱情电影社保片一区| 国产精品国产三级国产| 久久久久久九九| 性生活免费网站| 男女男精品视频| 91爱视频在线| 久久久久久久中文字幕| 我不卡影院28| 亚洲一区www| 国内精品久久99人妻无码| 蜜桃精品视频| 欧美日韩和欧美的一区二区| 欧美黄色免费影院| caoporn视频在线| 日本一二三不卡| 国产91视觉| 国产成人三级在线播放| 精品一区二区免费在线观看| 欧美一区在线直播| 色播视频在线播放| 国模吧视频一区| 久久久精品亚洲| 最新日韩免费视频| 色135综合网| 在线观看欧美日韩| 一级特黄曰皮片视频| 欧美日韩有码| 中文字幕无线精品亚洲乱码一区 | 国模gogo一区二区大胆私拍| 欧美日韩成人免费观看| 亚洲成人最新网站| 久热精品在线视频| 在线免费日韩av| 欧美日韩国产成人精品| 久久久久国产精品免费| 青青草av在线播放| 午夜在线精品偷拍| 国产精品成人播放| 激情网站在线观看| 久久久久国产精品一区三寸| 国产91精品网站| 国语对白做受69按摩| 日本美女一区二区| 国产中文字幕亚洲| 国产精品视频a| 国产精品2024| 精品国产一区二区三区麻豆小说 | 91资源在线观看| 午夜精品久久久久久久99樱桃| 妞干网在线观看视频| 男人的天堂免费在线视频| 亚洲天堂久久久久久久| 久艹在线免费观看| 性国裸体高清亚洲| 欧美视频一区二区| 999热精品视频| 91成人入口| 亚洲精品色婷婷福利天堂| 性欧美精品男男| 亚洲综合激情在线| 午夜精品久久久久久久男人的天堂| wwwwww国产| 日韩二区三区四区| 成人在线观看网址| 涩爱av在线播放一区二区| 日本一区二区三区高清不卡| 永久免费在线看片视频| 麻豆国产在线| 精品污污网站免费看| 亚洲少妇一区二区| 在线观看欧美理论a影院| 色阁综合伊人av| 久久精品久久国产| 秋霞午夜av一区二区三区| 亚洲free性xxxx护士hd| 日本大臀精品| 亚洲人成伊人成综合网小说| 免费毛片小视频| 日本一区二区三区视频在线| 日韩精品一区二区三区在线播放 | 午夜精品一区二区三区在线视| 男人天堂2024| 国产精品123| 日本a级片久久久| 欧美精品videossex少妇| 欧美自拍丝袜亚洲| 男男做爰猛烈叫床爽爽小说| 午夜欧美在线| 日本一区二区三区在线播放| 99久久精品无免国产免费| 国产午夜精品久久久久久久 | 国产精品中文| 亚洲欧美日韩视频一区| 黄色一级视频免费| 麻豆国产一区二区| 欧美一区二区三区在线免费观看 | 国产精品一二一区| 亚洲欧洲国产精品久久| 免费在线小视频| 日韩欧美一区二区免费| 色撸撸在线视频| 欧美一级久久| 懂色中文一区二区三区在线视频| 免费黄网在线观看| 日本韩国一区二区| 亚洲精品乱码久久久久久不卡| 牛夜精品久久久久久久99黑人| 国产玖玖精品视频| 可以免费看污视频的网站在线| 亚洲午夜一区二区三区| 无码人妻一区二区三区在线视频| 久久国产精品亚洲人一区二区三区 | 91麻豆视频网站| 精品少妇人妻av免费久久洗澡| 欧美2区3区4区| 日韩一区二区三区在线播放| 亚洲免费视频二区| 久久精品亚洲精品国产欧美| 日韩人妻精品无码一区二区三区| 免费萌白酱国产一区二区三区| 欧美另类在线观看| 国产人妖一区二区| 欧美国产视频在线| 欧美日韩亚洲自拍| 日韩一区二区中文| 成人福利视频在线观看| 日本最黄一级片免费在线| 狠狠色狠狠色综合日日tαg| 一区二区三区国产豹纹内裤在线| 91蝌蚪视频在线观看| 日日天天久久| 国内揄拍国内精品| 日本黄色大片视频| 午夜伊人狠狠久久| 性色av蜜臀av浪潮av老女人| 99在线精品免费视频九九视| 久久99精品久久久久久水蜜桃 | 超碰最新在线| 欧美在线看片a免费观看| 在线观看福利片| 久久男女视频| 一区二区在线观| 久久丁香四色| 久久久久亚洲精品成人网小说| 日韩av一区二区三区四区| 91久久爱成人| 国产免费一区二区三区在线能观看| 九色国产在线观看| 欧美影视一区在线| 国产精品视频一区二区在线观看| 极品销魂美女一区二区三区| 26uuu成人| av一级亚洲| 日韩美女视频在线观看| 免费在线看黄网站| 精品国产一区二区三区忘忧草| 校园春色 亚洲| 不卡av免费在线观看| 日韩久久一级片| 国产精品videosex性欧美| 91久久爱成人| 成人动漫一区| 国产亚洲激情视频在线| 国产特黄一级片| 天天操天天综合网| 日韩欧美在线视频播放| 成人激情午夜影院| 日本美女高潮视频| 国产精品99在线观看| 好吊妞www.84com只有这里才有精品| 春暖花开亚洲一区二区三区| 九九精品视频在线观看| 欧美亚洲日本| 欧美一区二区视频在线观看2020 | 鲁丝一区二区三区| 激情av综合网| 波多野结衣家庭教师视频| 1024精品久久久久久久久| 精品无人区一区二区三区| 欧美大片网站| 97色在线观看| 黄视频在线观看网站| 国产丝袜一区二区三区免费视频| 最近中文字幕av| 亚洲.国产.中文慕字在线| 九九热久久免费视频| 91丨国产丨九色丨pron| 中文字幕人妻无码系列第三区| 首页综合国产亚洲丝袜| 欧美一级免费播放| 天天综合网91| 视频一区不卡| 啪啪激情综合网| 亚洲精品日韩激情在线电影| 欧美日韩在线精品一区二区三区激情综合 | 在线播放av网址| 蜜臀av在线播放一区二区三区| 可以在线看的av网站| 伊人情人综合网| 欧美日韩亚洲在线| 人人精品亚洲| 婷婷丁香激情综合| 欧美日韩系列| 日韩激情啪啪| 国新精品乱码一区二区三区18| 欧美电影网站| 91成人福利在线| 超碰在线资源| 欧美国产在线电影| 亚洲七七久久综合桃花剧情介绍| 中文一区二区视频| av网站在线免费播放| 亚洲视频视频在线| 精品三级久久久久久久电影聊斋| 亚洲精品国产精品国自产观看浪潮| www黄色网址| 日韩欧美国产综合| 国产激情视频在线播放| 欧美老年两性高潮| 国产尤物视频在线观看| 欧美精品一级二级三级| 国产精品国产精品国产| 色综合欧美在线| 免费av网站在线| 欧美午夜精品久久久久久浪潮| 国产成人免费观看视频| 精品人伦一区二区三区蜜桃网站| 国产无遮挡裸体免费视频| 亚洲国产精品自拍| 亚洲精品国产精品乱码| 五月婷婷欧美视频| 啦啦啦免费高清视频在线观看| 狠狠久久五月精品中文字幕| 国产午夜精品久久久久| 精品动漫一区二区| 亚洲影院在线播放| 在线观看一区二区精品视频| 国产精品成人久久久| 欧美猛男gaygay网站| 99热这里只有精品在线| 精品国产sm最大网站免费看| 青梅竹马是消防员在线| 亚洲午夜性刺激影院| 69久久夜色| 超碰日本道色综合久久综合 | 日韩电影中文字幕在线观看| 完全免费av在线播放| 国产精品wwww| 日韩护士脚交太爽了| 成人欧美一区二区| 久久精品免视看国产成人| 精品无人区一区二区三区竹菊| 久久精品av| 日本福利视频在线| 精品一区二区三区香蕉蜜桃 | chinese国产精品| 91精品国产综合久久蜜臀| 三级无遮挡在线观看| 操日韩av在线电影| 日韩成人高清| 国产一区二区三区免费不卡| 亚洲精品va| 少妇人妻互换不带套| 成人激情文学综合网| sm捆绑调教视频| 欧美日韩精品在线| 精品人妻一区二区三区麻豆91| 一区二区亚洲精品国产| 黄视频免费在线看| 91在线在线观看| 成人三级视频| 国产男女无遮挡| 性金发美女69hd大尺寸| 神马午夜在线观看| 久久视频在线播放| 中文字幕日本一区二区| 久久国产精品 国产精品| 亚洲深深色噜噜狠狠爱网站| 超碰av在线免费观看| 成人av网址在线观看| 日韩在线观看视频一区二区| 欧美性感一类影片在线播放| 男男激情在线| 992tv成人免费影院| 亚洲色图日韩av| 国产乱色精品成人免费视频| 亚洲精品自拍偷拍| a'aaa级片在线观看| 亚洲在线免费看| 91综合久久| 91小视频网站| 日本一区二区免费在线| 波多野结衣视频免费观看| 日韩久久午夜影院| 亚洲黄色网址| 久中文字幕一区| 国产亚洲综合精品| 好吊一区二区三区视频| 亚洲欧洲综合另类在线| 国产普通话bbwbbwbbw| 久久在线免费观看视频| 91国产一区| 91社在线播放| 国产精品66部| 精品一区二区三区四| 亚洲第一色中文字幕| 国产探花视频在线观看| 国产精品国产三级国产专区53| 亚洲视频一区| 国产在线观看无码免费视频| 欧美午夜女人视频在线| 国产三级电影在线| 国产精品一区专区欧美日韩| 偷拍欧美精品| 色偷偷中文字幕| 亚洲大片一区二区三区| 性xxxx视频| 国产精品99导航| 欧美gay男男猛男无套| 日本特黄在线观看| 亚洲一区二区三区国产| 五月天婷婷社区| 国产精品99久久久久久白浆小说| 91亚洲自偷观看高清| 免费黄视频在线观看| 富二代精品短视频| jizz在线观看视频| 91精品国产99久久久久久红楼| 欧美91福利在线观看| 国产精品熟妇一区二区三区四区| 岛国精品视频在线播放| 在线视频婷婷| 91丨九色丨国产| 香蕉视频成人在线观看| 狂野欧美性猛交| 日韩欧美国产1| 成人小电影网站| 亚洲一区二区自拍偷拍| 成人在线视频一区| 国产男人搡女人免费视频| 毛片精品免费在线观看| 亚洲精品中文字幕99999| 搡的我好爽在线观看免费视频|