[原创] 强化学习框架 rlpyt 安装及试跑

转载需注明出处:https://www.codelast.com/

查看关于 rlpyt 的更多文章请点击这里

之前我写了一篇强化学习框架 rlpyt简介。通常,刚接触一个框架,在安装好它之后,一般都是要先把它的一个最简单的demo跑起来看看会不会有什么问题。所以在本文中继续讲一下安装以及试运行的过程。
阅读更多

[原创] 小心PyCharm的import带来的unresolved reference误导

转载需注明出处:https://www.codelast.com/

有时候你可能会遇到这样的故事:git clone一个Python的GitHub项目下来,配置好了对应的Anaconda环境,安装好了依赖的package,用PyCharm打开了项目,打开一个.py代码文件,发现PyCharm在文件开头几行就给标注了波浪线,提示unresolved reference XXX。而且,尽管PyCharm提示有错,你却可以运行代码。
“我完全就是按项目要求的版本装的各种依赖包,怎么会找不到这个定义?”你心里可能会很不爽。
这个时候,你要看清楚了,有可能是PyCharm给了你误导,其实你什么都做对了,只是PyCharm显示错了而已。
阅读更多

[原创] 伯克利人工智能研究所的开源[强化学习框架] rlpyt,让人眼前一亮

转载需注明出处:https://www.codelast.com/

BAIR(Berkeley Artificial Intelligence Research,伯克利人工智能研究所),开源了一个强化学习(RL)框架 rlpyt,并于2019.09.24在其主页上对它进行了很长篇幅的介绍(论文在这里)。
市面上开源强化学习框架已经很多了,这个框架是否值得你上车?我认为,未来怎样不好说,但至少现在(2019.10)看来是值得入手的,因为它确实有其他框架不具备/不完善的功能——最主要的就是对并行(parallelism)的良好支持。
在强化学习领域,agent与environment互动来收集training data的过程是最耗时的,如果能并行地用多个agent与多个environment互动来收集数据,那么速度可以极大提升。类似于Google Dopamine这样的RL框架,根本没有把 parallelism 作为设计理念的一部分,所以如果你入了Dopamine的坑,等你对模型训练速度有要求的时候再想着换框架,成本就高多了。
阅读更多

[原创] 关于Google的开源强化学习框架Dopamine,不建议上车

转载需注明出处:https://www.codelast.com/

Dopamine是Google在2018年8月的时候发布的强化学习开源框架,2019年2月的时候又发布了2.0版,由于是Google出品,因此会吸引比较多的关注,很多人会想去用它。但这个产品在目前(2019.10)值不值得用?就我目前的观察来看,不建议上车,原因如下。
阅读更多

[原创] 强化学习里的 on-policy 和 off-policy 的区别

转载需注明出处:https://www.codelast.com/

强化学习(Reinforcement Learning,简称RL)是机器学习的一个领域,刚接触的时候,大多数人可能会被它的应用领域领域所吸引,觉得非常有意思,比如用来训练AI玩游戏,用来让机器人学会做某些事情,等等,但是当你越往里看,就会发现跟传统机器学习相比,RL里面的名词简直太多了吧!多到完全可以绕晕人。比如RL里经常会提到的agent,environment,episode(rollout),policy,on-policy,off-policy,state,trajectory,reward,replay buffer,model-based,model-free,MD,TD,PG,AC,等等。强化学习的高手对这些词很熟悉,但对新手来说可能就很痛苦。
在RL领域,on-policy和off-policy是两个非常重要的概念,这两个词,把RL方法分成了两个类别。你可以从网上搜到很多很人提问on-policy的强化学习方法和off-policy的强化学习方法有什么区别,作为一个智商相当平庸的人,鬼知道我当初看了多少教程才认为自己大概搞清楚了它们之间的区别。
所以我在这篇文章里想把自己的肤浅理解分享出来,希望能帮助到少部分人。
阅读更多

[原创] 怎么理解DDPG(Deep Deterministic Policy Gradient)里的Deterministic

转载需注明出处:https://www.codelast.com/

DDPG(Deep Deterministic Policy Gradient,深度确定性策略梯度)是强化学习领域的一种知名算法。
如何理解其中的Deterministic(确定性)这个名词?
通俗地说,对一个状态(state)来说,根据这个state所采取的action有可能是带有随机性的。在两次与environment交互的时候,即使是一模一样的state,所采取的action也有可能不同,这就不是一种“确定性”的策略。
对一种“确定性”的策略来说,只要state相同,它给出的action必然相同。
阅读更多

[原创] 如何取出 tf.layers.dense 定义的全连接层的weight和bias参数值

转载需注明出处:https://www.codelast.com/

TensorFlow版本:1.14.0
Python版本:3.6.8

在TensorFlow中,tf.layers.dense 定义了一个全连接层,其实现的是(来自官方文档):

This layer implements the operation: outputs = activation(inputs * kernel + bias) Where activation is the activation function passed as the activation argument (if not None), kernel is a weights matrix created by the layer, and bias is a bias vector created by the layer (only if use_bias is True).

意思就是它实现了 y = activation(x * kernel + bias) 的操作,其中,activation是激活函数。在这里,kernel 就是指我们通常所说的 weight,它被TF称为 kernel 而不是 weight。因此,如果你想从这个模型里取出weight参数的话,就要注意它的名字了,否则会读不到这个参数。
下面我们就来看具体的例子。

下面这段代码的逻辑非常简单,它干了下面这些事情:
* 创建了一个非常简单的2层全连接网络
* 训练网络
* 训练完成后把它保存成checkpoint格式的模型文件
* 从保存的checkpoint读取模型里第一层的 weight 和 bias 参数值,打印出来

文章来源:https://www.codelast.com/

import tensorflow as tf
import numpy as np
LAYER_1_NAME = 'layer1'  # 第一层的名字
LAYER_2_NAME = 'layer2'  # 第二层的名字

# 创建一个非常简单的神经网络,它有两层
x = tf.placeholder(shape=[None, 2], dtype=tf.float32)
layer1 = tf.layers.dense(x, 5, activation=tf.nn.sigmoid, name=LAYER_1_NAME)
layer2 = tf.layers.dense(layer1, 2, activation=tf.nn.sigmoid, name=LAYER_2_NAME)
loss = tf.reduce_mean((layer2 - x) ** 2)
optimizer = tf.train.AdamOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
x_values = np.random.normal(0, 1, (5000, 2))  # 生成用于输入的随机数
    for step in range(1000):
_, loss_value = sess.run([optimizer, loss], feed_dict={x: x_values})
if step % 100 == 0:
print("step: %d, loss: %f" % (step, loss_value))
# 把模型保存成checkpoint
    saver = tf.compat.v1.train.Saver()
save_path = saver.save(sess, './checkpoint/model.ckpt')
print("model saved in path: %s" % save_path, flush=True)
# 读取刚保存的checkpoint
    reader = tf.train.NewCheckpointReader(save_path)
weights = reader.get_tensor(LAYER_1_NAME + '/kernel')  # weight的名字,是由对应层的名字,加上默认的"kernel"组成的
    bias = reader.get_tensor(LAYER_1_NAME + '/bias')  # bias的名字
    print(weights)
print(bias)
# 如果想打印模型中的所有参数名和参数值的话,把下面几行取消注释
    # var_to_shape_map = reader.get_variable_to_shape_map()
    # for key in var_to_shape_map:
    #     print("tensor name: ", key)
    #     print(reader.get_tensor(key))

文章来源:https://www.codelast.com/
上面程序的输出:

step: 0, loss: 1.166642
step: 100, loss: 0.764896
step: 200, loss: 0.659553
step: 300, loss: 0.622590
step: 400, loss: 0.604577
step: 500, loss: 0.595308
step: 600, loss: 0.590193
step: 700, loss: 0.587147
step: 800, loss: 0.585213
step: 900, loss: 0.583916
model saved in path: ./checkpoint/model.ckpt
[[-3.0937738   3.6378026   0.91563785 -1.2663897  -0.09645918]
 [ 0.727915    0.22842272 -2.656725   -2.0831287  -3.4844823 ]]
[ 0.906906   -1.6009021   0.46897942  0.75946033  1.4348172 ]

注意,在取某一层的 weight 参数值的时候,我们用了以下方法:

weights = reader.get_tensor(LAYER_1_NAME + '/kernel')

这里,weight 的名字,是类似于 "layer1/kernel" 这样的字符串,其中,"layer1"就是在用 tf.layers.dense() 创建网络的一个layer的时候,设置的 "name=xxx" 里的名字。前面已经说过了,TF 里把 weight 叫做 kernel,所以这里的 weight 名是 "layer1/kernel" 而不是 "layer1/weight"!

[原创] 如何打印出TensorFlow保存的checkpoint里的参数名

转载需注明出处:https://www.codelast.com/

TensorFlow版本:1.14.0
Python版本:3.6.8

checkpoint文件是TensorFlow保存出来的一种模型文件格式。通常save下来的时候会得到4个文件,例如:

checkpoint
model.ckpt-1.data-00000-of-00001
model.ckpt-1.index
model.ckpt-1.meta

如何查看这些文件里的模型参数名称呢?
阅读更多

[原创] tf.tile() 用法举例(TensorFlow)

转载需注明出处:https://www.codelast.com/

tile 的含义:

n. 瓦 / 瓷砖 / 软木片 / 亚麻油地毡片
v. 用瓦盖 / 贴砖于 / 铺以瓦 / 铺以瓷砖

函数定义:

def tile(input, multiples, name=None):

函数功能:

Constructs a tensor by tiling a given tensor.

即:通过“平铺”一个给定的 tensor 来构造一个新的 tensor。用人话讲就是:把输入的 tensor,在指定的维度上复制N遍(就像铺瓷砖一样),来创建出一个新的 tensor。
3个参数:
input:输入的tensor
multiples:在指定的维度上复制原tensor的次数
name:operation的名字

阅读更多

[原创] Apache Pig问题:Encountered IOException. org.apache.pig.tools.parameters.ParseException: Encountered ""

转载需注明出处:https://www.codelast.com/

查看本系列文章合集,请点击这里

运行Pig脚本时报错:

Error before Pig is launched
----------------------------
ERROR 2997: Encountered IOException. org.apache.pig.tools.parameters.ParseException: Encountered "<EOF>" at line 1, column 8.
Was expecting one of:
    <IDENTIFIER> ...
    <OTHER> ...
    <LITERAL> ...
    <SHELLCMD> ...

[原创] 重要性采样/Importance Sampling

转载需注明出处:https://www.codelast.com/

查看本系列文章合集,请点击这里

在前面的文章中,我们看到,随机采样是一个蒙特卡罗方法中很关键的步骤。而采样是需要技巧的,单纯地增加采样次数太没有效率了,比如说,如果随机采样一亿次,你可以把结果计算得特别精确,但是采样一亿次需要的时间非常长,长得远远超过了我们能接受的范围,这又有什么意义呢?
人们发现,有一些方法可以让随机采的样本“特别好”。那么什么算“特别好”呢?比如说,本来使用没有任何原则的采样方法,需要采样1万个点,才能让计算出来的结果很接近真实值;现在使用一个“特别好”的采样方法,可以让我们只需要采样100个点,就可以让计算出来的结果很接近真实值了,这样就极大地减少了计算量。
阅读更多