# 深度学习之强化学习（1）强化学习案例

### 深度学习之强化学习（1）强化学习案例

[En]

Reinforcement learning is another research branch in the field of machine learning in addition to supervised learning and unsupervised learning. it mainly uses agents to interact with the environment so as to learn strategies that can achieve good results. Different from supervised learning, the action of reinforcement learning does not clearly mark the information, only the reward information from the feedback from the environment, which usually has a certain lag and is used to reflect the “good and bad” of the action.

[En]

The design of reinforcement learning algorithm is different from the traditional supervised learning, including a large number of new mathematical formula derivation. Before entering the learning process of reinforcement learning algorithm, we first feel the charm of reinforcement learning algorithm through a simple example.

[En]

This section does not need to master every detail, mainly intuitive feeling, to get the first impression.

## 1. 平衡杆游戏

[En]

The balance bar game system consists of three objects: the slide rail, the car and the rod. As shown in figure 1, the car can move freely on the slide rail, and one side of the rod is fixed on the car through the bearing. In the initial state, the car is located in the middle of the slide rail, the rod is upright on the car, and the agent controls the balance of the rod by controlling the left and right movement of the car. when the angle between the rod and the vertical direction is greater than a certain angle or the trolley deviates from the center of the slide rail at a certain distance, the game is considered to be over. The longer the game, the more rewards the game gives, and the higher the level of control of the agent.

## ; 2. 策略网络

∑ a ∈ A π θ ( a ∣ s ) = 1 ∑{a∈A}π_θ (a|s)=1 a ∈A ∑​πθ​(a ∣s )=1

a t = argmax a ⁡ π θ ( a ∣ s t ) a_t=\underset{a}{\text{argmax}}⁡\ π_θ (a|s_t)a t ​=a argmax ​⁡πθ​(a ∣s t ​)

{t+1}s t +1 ​和奖励r t r_t r t ​，如此循环往复，直至游戏回合结束。

[En]

We implement the policy network as a two-layer fully connected network. The first layer converts a vector of length 4 into a vector of length 128, and the second layer converts a vector of 128 into a vector of 2, that is, the probability distribution of the action. As in the process of creating a normal neural network, the code is as follows:

class Policy(keras.Model):
# &#x7B56;&#x7565;&#x7F51;&#x7EDC;&#xFF0C;&#x751F;&#x6210;&#x52A8;&#x4F5C;&#x7684;&#x6982;&#x7387;&#x5206;&#x5E03;
def __init__(self):
super(Policy, self).__init__()
self.data = [] # &#x5B58;&#x50A8;&#x8F68;&#x8FF9;
# &#x8F93;&#x5165;&#x4E3A;&#x957F;&#x5EA6;&#x4E3A;4&#x7684;&#x5411;&#x91CF;&#xFF0C;&#x8F93;&#x51FA;&#x4E3A;&#x5DE6;&#x3001;&#x53F3;2&#x4E2A;&#x52A8;&#x4F5C;&#xFF0C;&#x6307;&#x5B9A;W&#x5F20;&#x91CF;&#x7684;&#x521D;&#x59CB;&#x5316;&#x65B9;&#x6848;
self.fc1 = layers.Dense(128, kernel_initializer='he_normal')
self.fc2 = layers.Dense(2, kernel_initializer='he_normal')
# &#x7F51;&#x7EDC;&#x4F18;&#x5316;&#x5668;

def call(self, inputs, training=None):
# &#x72B6;&#x6001;&#x8F93;&#x5165;s&#x7684;shape&#x4E3A;&#x5411;&#x91CF;&#xFF1A;[4]
x = tf.nn.relu(self.fc1(inputs))
x = tf.nn.softmax(self.fc2(x), axis=1)  # &#x83B7;&#x5F97;&#x52A8;&#x4F5C;&#x7684;&#x6982;&#x7387;&#x5206;&#x5E03;
return x


def put_data(self, item):
# &#x8BB0;&#x5F55;r,log_P(a|s)
self.data.append(item)


## 3. 梯度更新

θ ′ = θ + η ⋅ ∂ J ( θ ) ∂ θ θ’=θ+η\cdot\frac{∂J(θ)}{∂θ}θ′=θ+η⋅∂θ∂J (θ)​

[En]

Then the strategy network can be iteratively optimized, resulting in a larger expected total return.

∂ J ( θ ) ∂ θ = E τ ∼ p θ ( τ ) [ ( ∑ t = 1 T ∂ ∂ θ log ⁡ π θ ( a t │ s t ) ) R ( τ ) ] \frac{∂J(θ)}{∂θ}=\mathbb E_{τ\sim p_θ (τ) }\bigg [\Big(∑_{t=1}^T\frac{∂}{∂θ} \text{log}⁡π_θ (a_t│s_t )\Big)R(τ)\bigg]∂θ∂J (θ)​=E τ∼p θ​(τ)​[(t =1 ∑T ​∂θ∂​log ⁡πθ​(a t ​│s t ​))R (τ)]

for r, log_prob in self.data[::-1]:  # &#x9006;&#x5E8F;&#x53D6;&#x8F68;&#x8FF9;&#x6570;&#x636E;
R = r + gamma * R  # &#x7D2F;&#x52A0;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x4E0A;&#x7684;&#x56DE;&#x62A5;
# &#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x90FD;&#x8BA1;&#x7B97;&#x4E00;&#x6B21;&#x68AF;&#x5EA6;
loss = -log_prob * R

&#x5B8C;&#x6574;&#x7684;&#x8BAD;&#x7EC3;&#x53CA;&#x66F4;&#x65B0;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;

def train_net(self, tape):
# &#x8BA1;&#x7B97;&#x68AF;&#x5EA6;&#x5E76;&#x66F4;&#x65B0;&#x7B56;&#x7565;&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#x3002;tape&#x4E3A;&#x68AF;&#x5EA6;&#x8BB0;&#x5F55;&#x5668;
R = 0  # &#x7EC8;&#x7ED3;&#x72B6;&#x6001;&#x7684;&#x521D;&#x59CB;&#x56DE;&#x62A5;&#x4E3A;0
for r, log_prob in self.data[::-1]:  # &#x9006;&#x5E8F;&#x53D6;&#x8F68;&#x8FF9;&#x6570;&#x636E;
R = r + gamma * R  # &#x7D2F;&#x52A0;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x4E0A;&#x7684;&#x56DE;&#x62A5;
# &#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x90FD;&#x8BA1;&#x7B97;&#x4E00;&#x6B21;&#x68AF;&#x5EA6;
loss = -log_prob * R
with tape.stop_recording():
# &#x4F18;&#x5316;&#x7B56;&#x7565;&#x7F51;&#x7EDC;
self.data = []  # &#x6E05;&#x7A7A;&#x8F68;&#x8FF9;


## 4. 平衡杆游戏实战

[En]

The interaction and training code is as follows:

for n_epi in range(400):
s = env.reset()  # &#x56DE;&#x5230;&#x6E38;&#x620F;&#x521D;&#x59CB;&#x72B6;&#x6001;&#xFF0C;&#x8FD4;&#x56DE;s0
for t in range(501):  # CartPole-v1 forced to terminates at 500 step.

# &#x9001;&#x5165;&#x72B6;&#x6001;&#x5411;&#x91CF;&#xFF0C;&#x83B7;&#x53D6;&#x7B56;&#x7565;
s = tf.constant(s, dtype=tf.float32)
# s: [4] => [1,4]
s = tf.expand_dims(s, axis=0)
prob = pi(s)  # &#x52A8;&#x4F5C;&#x5206;&#x5E03;:[1,2]
# &#x4ECE;&#x7C7B;&#x522B;&#x5206;&#x5E03;&#x4E2D;&#x91C7;&#x6837;1&#x4E2A;&#x52A8;&#x4F5C;, shape: [1]
a = tf.random.categorical(tf.math.log(prob), 1)[0]
a = int(a)  # Tensor&#x8F6C;&#x6570;&#x5B57;
s_prime, r, done, info = env.step(a)
# &#x8BB0;&#x5F55;&#x52A8;&#x4F5C;a&#x548C;&#x52A8;&#x4F5C;&#x4EA7;&#x751F;&#x7684;&#x5956;&#x52B1;r
# prob shape:[1,2]
pi.put_data((r, tf.math.log(prob[0][a])))
s = s_prime  # &#x5237;&#x65B0;&#x72B6;&#x6001;
score += r  # &#x7D2F;&#x79EF;&#x5956;&#x52B1;

if n_epi >1000:
env.render()
# im = Image.fromarray(s)
# im.save("res/%d.jpg" % info['frames'][0])

if done:  # &#x5F53;&#x524D;episode&#x7EC8;&#x6B62;
break
pi.train_net(tape)
del tape


[En]

Through this example, we have a preliminary impression and understanding of the interaction process between reinforcement learning algorithm and reinforcement learning, and then we will formally describe the reinforcement learning problem.

## 完整代码

import gym
import os
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
Default parameters for plots
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, losses
from PIL import Image

matplotlib.rcParams['font.size'] = 18
matplotlib.rcParams['figure.titlesize'] = 18
matplotlib.rcParams['figure.figsize'] = [9, 7]
matplotlib.rcParams['font.family'] = ['KaiTi']
matplotlib.rcParams['axes.unicode_minus'] = False

env = gym.make('CartPole-v1')  # &#x521B;&#x5EFA;&#x6E38;&#x620F;&#x73AF;&#x5883;
env.seed(2333)
tf.random.set_seed(2333)
np.random.seed(2333)
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
assert tf.__version__.startswith('2.')

learning_rate = 0.0002
gamma = 0.98

class Policy(keras.Model):
# &#x7B56;&#x7565;&#x7F51;&#x7EDC;&#xFF0C;&#x751F;&#x6210;&#x52A8;&#x4F5C;&#x7684;&#x6982;&#x7387;&#x5206;&#x5E03;
def __init__(self):
super(Policy, self).__init__()
self.data = [] # &#x5B58;&#x50A8;&#x8F68;&#x8FF9;
# &#x8F93;&#x5165;&#x4E3A;&#x957F;&#x5EA6;&#x4E3A;4&#x7684;&#x5411;&#x91CF;&#xFF0C;&#x8F93;&#x51FA;&#x4E3A;&#x5DE6;&#x3001;&#x53F3;2&#x4E2A;&#x52A8;&#x4F5C;&#xFF0C;&#x6307;&#x5B9A;W&#x5F20;&#x91CF;&#x7684;&#x521D;&#x59CB;&#x5316;&#x65B9;&#x6848;
self.fc1 = layers.Dense(128, kernel_initializer='he_normal')
self.fc2 = layers.Dense(2, kernel_initializer='he_normal')
# &#x7F51;&#x7EDC;&#x4F18;&#x5316;&#x5668;

def call(self, inputs, training=None):
# &#x72B6;&#x6001;&#x8F93;&#x5165;s&#x7684;shape&#x4E3A;&#x5411;&#x91CF;&#xFF1A;[4]
x = tf.nn.relu(self.fc1(inputs))
x = tf.nn.softmax(self.fc2(x), axis=1)  # &#x83B7;&#x5F97;&#x52A8;&#x4F5C;&#x7684;&#x6982;&#x7387;&#x5206;&#x5E03;
return x

def put_data(self, item):
# &#x8BB0;&#x5F55;r,log_P(a|s)
self.data.append(item)

def train_net(self, tape):
# &#x8BA1;&#x7B97;&#x68AF;&#x5EA6;&#x5E76;&#x66F4;&#x65B0;&#x7B56;&#x7565;&#x7F51;&#x7EDC;&#x53C2;&#x6570;&#x3002;tape&#x4E3A;&#x68AF;&#x5EA6;&#x8BB0;&#x5F55;&#x5668;
R = 0  # &#x7EC8;&#x7ED3;&#x72B6;&#x6001;&#x7684;&#x521D;&#x59CB;&#x56DE;&#x62A5;&#x4E3A;0
for r, log_prob in self.data[::-1]:  # &#x9006;&#x5E8F;&#x53D6;&#x8F68;&#x8FF9;&#x6570;&#x636E;
R = r + gamma * R  # &#x7D2F;&#x52A0;&#x8BA1;&#x7B97;&#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x4E0A;&#x7684;&#x56DE;&#x62A5;
# &#x6BCF;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x90FD;&#x8BA1;&#x7B97;&#x4E00;&#x6B21;&#x68AF;&#x5EA6;
loss = -log_prob * R
with tape.stop_recording():
# &#x4F18;&#x5316;&#x7B56;&#x7565;&#x7F51;&#x7EDC;
self.data = []  # &#x6E05;&#x7A7A;&#x8F68;&#x8FF9;

def main():
pi = Policy()  # &#x521B;&#x5EFA;&#x7B56;&#x7565;&#x7F51;&#x7EDC;
pi(tf.random.normal((4, 4)))
pi.summary()
score = 0.0  # &#x8BA1;&#x5206;
print_interval = 20  # &#x6253;&#x5370;&#x95F4;&#x9694;
returns = []

for n_epi in range(400):
s = env.reset()  # &#x56DE;&#x5230;&#x6E38;&#x620F;&#x521D;&#x59CB;&#x72B6;&#x6001;&#xFF0C;&#x8FD4;&#x56DE;s0
for t in range(501):  # CartPole-v1 forced to terminates at 500 step.

# &#x9001;&#x5165;&#x72B6;&#x6001;&#x5411;&#x91CF;&#xFF0C;&#x83B7;&#x53D6;&#x7B56;&#x7565;
s = tf.constant(s, dtype=tf.float32)
# s: [4] => [1,4]
s = tf.expand_dims(s, axis=0)
prob = pi(s)  # &#x52A8;&#x4F5C;&#x5206;&#x5E03;:[1,2]
# &#x4ECE;&#x7C7B;&#x522B;&#x5206;&#x5E03;&#x4E2D;&#x91C7;&#x6837;1&#x4E2A;&#x52A8;&#x4F5C;, shape: [1]
a = tf.random.categorical(tf.math.log(prob), 1)[0]
a = int(a)  # Tensor&#x8F6C;&#x6570;&#x5B57;
s_prime, r, done, info = env.step(a)
# &#x8BB0;&#x5F55;&#x52A8;&#x4F5C;a&#x548C;&#x52A8;&#x4F5C;&#x4EA7;&#x751F;&#x7684;&#x5956;&#x52B1;r
# prob shape:[1,2]
pi.put_data((r, tf.math.log(prob[0][a])))
s = s_prime  # &#x5237;&#x65B0;&#x72B6;&#x6001;
score += r  # &#x7D2F;&#x79EF;&#x5956;&#x52B1;

if n_epi > 1000:
env.render()
# im = Image.fromarray(s)
# im.save("res/%d.jpg" % info['frames'][0])

if done:  # &#x5F53;&#x524D;episode&#x7EC8;&#x6B62;
break
pi.train_net(tape)
del tape

if n_epi % print_interval == 0 and n_epi != 0:
returns.append(score/print_interval)
print(f"# of episode :{n_epi}, avg score : {score/print_interval}")
score = 0.0
env.close()  # &#x5173;&#x95ED;&#x73AF;&#x5883;

plt.plot(np.arange(len(returns))*print_interval, returns)
plt.plot(np.arange(len(returns))*print_interval, returns, 's')
plt.xlabel('Number of Rounds')  # &#x56DE;&#x5408;&#x6570;
plt.ylabel('Total Return')  # &#x603B;&#x56DE;&#x62A5;
plt.savefig('reinforce-tf-cartpole.svg')
plt.show()

if __name__ == '__main__':
main()


Original: https://blog.csdn.net/weixin_43360025/article/details/120772582
Author: 炎武丶航
Title: 深度学习之强化学习（1）强化学习案例

(0)

### 大家都在看

• #### FAST角点检测python实现及基于opencv实现 （角点检测、非极大值抑制）

写在前面： 黄宁然，看你看过的算法系列，即将进入尾声。 参考文献镇楼： [1]Deepak Geetha Viswanathan, Features from Accelerate…

人工智能 2023年7月18日
0184
• #### [数据库系统概论学习笔记]3.关系

重点与难点一组概念的区分:围绕关系的县官概念,如域,笛卡尔积,关系,关系模式,关键字/键/码, 外码/外键, 主码/主键, 主属性与非主属性. 三个完整性:实体完整性,参照完整性和…

人工智能 2023年6月10日
0130
• #### 使用pytorch保存效果最好那个模型+加载模型

1 验证集的作用就是监督训练是否过拟合； 一般默认验证集的损失值经历由下降到上升的阶段； 保存在验证集上损失最小的那个迭代模型，其泛化能力应该最好； 在训练部分计算验证集损失值，保…

人工智能 2023年7月5日
0136
• #### 【深度学习】使用PyTorch实现图像分类（简单Net/VGGNet/AlexNet+官方/自己数据集+plt/混淆矩阵展示统计结果+用训练好的模型进行分类验证）

文章目录 使用PyTorch实现图像分类 * 1. 定义模型 – 1.1 一个小的神经网络 1.2 AlxeNet网络结构 1.3 VGG16网络结构 2. 加载数据集…

人工智能 2023年7月21日
0154
• #### .pth.tar文件

torch保存的模型有很多形式，前几天下载别人预训练好的模型后发现是 .pth.tar 后缀的文件，开始以为是压缩文件，使用tar -xvf 命令解压，结果报错。后经过搜索资料，发…

人工智能 2023年7月22日
0149
• #### Linux操作系统5：用户和组的管理

Linux操作系统5：用户和组的管理 一、实验目的： 二、实验内容： 三、实验结果： * （1）用户的管理 （2）组的管理 一、实验目的： 掌握Linux系统下利用命令方式实现用户…

人工智能 2023年6月29日
0110
• #### ARMA，ARIMA，SARIMA时序数据预测（附代码讲解）

1 背景 1.1 AR模型 AutoRegress,AR，自回归模型,描述当前值和历史数据的关系，利用历史数据进行预测。AR模型必须满足平稳性。p阶自回归方程的定义为：y t = …

人工智能 2023年6月19日
0122
• #### Speak语音拟合Python

抵扣说明： 1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。 Original: https:…

人工智能 2023年5月27日
0193
• #### 记一次BUG，RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation

错误： RuntimeError: one of the variables needed for gradient computation has been modified b…

人工智能 2023年6月4日
0136
• #### 一元线性回归

目录 一、线性回归概念 二、一元线性回归拟合 1、最小二乘法 1、基本思想 2、手工推导 3、代码实现 4、运行结果 2、梯度下降法 1、损失函数的构建 2、梯度下降三兄弟 3、梯…

人工智能 2023年6月18日
0238
• #### 智慧供应链的学习笔记（库存管理、配补货、仓间调拨、控制塔等）

文章目录 1 供应链集成系统案例 * 1.1 京东物流一体化供应链 – 1.1.1 算法中台 1.1.2 易卜工程化平台 1.2 美团：到店供应链及商品平台建设实践 2…

人工智能 2023年6月24日
0141
• #### C++实现DBSCAN密度聚类算法实战案例

一、基本概念 可以用1，2，3，4来总结DBSCAN的基本概念。 1个核心思想：基于密度 直观效果上看，DBSCAN算法可以找到样本点的全部密集区域，并把这些密集区域当做一个一个的…

人工智能 2023年5月31日
0141
• #### 知识图谱Neo4j相关——Cypher查询

Cypher is Neo4j’s graph query language that allows users to store and retrieve data …

人工智能 2023年6月10日
0131
• #### NLP的Token embedding和位置embedding

Token Enbedding，也是字符转向量的一种常用做法。 import tensorflow as tf model_name = "ted_hrlr_transl…

人工智能 2023年5月24日
0206
• #### 用自建kinetics-skeleton行为识别数据集训练st-gcn网络流程记录

用自建kinetics-skeleton行为识别数据集训练st-gcn网络流程记录 * – + * 0. 准备工作 * 1. 下载/裁剪视频 * 2. 利用OpenPo…

人工智能 2023年6月30日
0150
• #### Python pandas模块

; 1 pandas数据读取 Pandas需要先读取表格类型的数据，然后进行分析 1.1 读取文件和基础语句： 读取csv文件数据： import pandas as pd fil…

人工智能 2023年6月19日
0153