![695713ae81cce50399f0bd7e312070af.png](https://i-blog.csdnimg.cn/blog_migrate/27920d62d0353f21d78cfa7cf559f82a.jpeg)
强化学习随机策略之高斯似然数原理与代码实现
一、原理介绍
使用随机策略有两个关键点
- 从策略当中进行采样,获得动作
(Action)
- 计算特定动作的似然数
什么是多元高斯分布?
在多元高斯分布中,当协方差矩阵
多元高斯分布(Multivariate Gaussian Distribution)是一元高斯分布的在向量形式上的推广,其中向量
例如二元高斯多元分布可以如图所示
![26385dcaa957c636b0d4de53a925f872.png](https://i-blog.csdnimg.cn/blog_migrate/53f8b1d9b55e4db08973a660494d2de2.jpeg)
.
对于一对随机变量
对于多个变量的问题,用协方差矩阵
对角多元高斯分布
特殊地,当 N 个随机变量
对角高斯策略 Diagonal Gaussian Policies
由于标准差的公式
log
对数,可以将标准差映射到
- 采样:假设已知动作(Action) 的均值
和标准差
,引入服从
分布的噪声
,下一步的动作采样表示为
其中
表示两个向量之间的内积。
- 似然数:当均值为
,标准差为
的
维的动作
的似然数表示为
二、代码实现
要求
- 输入: 样本
x
,对角高斯分布的均值和标准差 - 输出:样本
x
的似然数
import tensorflow as tf
import numpy as np
EPS = 1e-8
根据上一节,似然数公式,理解公式后就很容易写出代码
# my solution
def my_gaussian_likelihood(x, mu, log_std):
"""
Args:
x: Tensor with shape [batch, dim]
mu: Tensor with shape [batch, dim]
log_std: Tensor with shape [batch, dim] or [dim]
Returns:
Tensor with shape [batch]
"""
#######################
# #
# YOUR CODE HERE #
# #
#######################
std = tf.exp(log_std)
ans = ((x - mu) / std)**2 + 2 * log_std + np.log(2 * np.pi)
ans = -0.5 * ans
# https://www.tensorflow.org/api_docs/python/tf/math/reduce_sum
sum_ans = tf.reduce_sum(ans, axis=1)
return sum_ans
# standard solution
# 代码来自 spinup/exercises/problem_set_1_solutions/exercise1_2_soln.py
def ans_gaussian_likelihood(x, mu, log_std):
pre_sum = -0.5 * (((x-mu)/(tf.exp(log_std)+EPS))**2 + 2*log_std + np.log(2*np.pi))
return tf.reduce_sum(pre_sum, axis=1)
if __name__ == '__main__':
"""
Run this file to verify your solution.
"""
sess = tf.Session()
dim = 10
x = tf.placeholder(tf.float32, shape=(None, dim))
mu = tf.placeholder(tf.float32, shape=(None, dim))
log_std = tf.placeholder(tf.float32, shape=(dim,))
your_gaussian_likelihood = my_gaussian_likelihood(x, mu, log_std)
true_gaussian_likelihood = ans_gaussian_likelihood(x, mu, log_std)
batch_size = 32
feed_dict = {x: np.random.rand(batch_size, dim),
mu: np.random.rand(batch_size, dim),
log_std: np.random.rand(dim)}
your_result, true_result = sess.run([your_gaussian_likelihood, true_gaussian_likelihood],
feed_dict=feed_dict)
correct = np.allclose(your_result, true_result)
print("Your answer is", correct)
Your answer is True
参考链接
- https://spinningup.openai.com/en/latest/spinningup/rl_intro.html#stochastic-policies
- https://www.tensorflow.org/api_docs/python/tf/math/reduce_sum