diff --git a/docs/chapter4/chapter4.md b/docs/chapter4/chapter4.md index bd25f43..f69e9ce 100644 --- a/docs/chapter4/chapter4.md +++ b/docs/chapter4/chapter4.md @@ -26,13 +26,12 @@ * **Network 的 input 就是现在 machine 看到的东西**,如果让 machine 打电玩的话,machine 看到的东西就是游戏的画面。Machine 看到什么东西,会影响你现在 training 到底好不好 train。举例来说,在玩游戏的时候, 也许你觉得游戏的画面,前后是相关的,也许你觉得说,你应该让你的 policy,看从游戏初始到现在这个时间点,所有画面的总和。你可能会觉得你要用到 RNN 来处理它,不过这样子会比较难处理。要让你的 machine,你的 policy 看到什么样的画面, 这个是你自己决定的。让你知道说给机器看到什么样的游戏画面,可能是比较有效的。 * **Output 的就是机器要采取什么样的行为。** -上图就是具体的例子, - -* policy 就是一个 network; -* input 就是游戏的画面,它通常是由 pixels 所组成的; -* output 就是看看说有哪些选项是你可以去执行的,output layer 就有几个 neurons。 - -假设你现在可以做的行为有 3 个,output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。Input 一个东西后,network 就会给每一个可以采取的行为一个分数。接下来,你把这个分数当作是概率。 actor 就是看这个概率的分布,根据这个机率的分布,决定它要采取的行为。比如说 70% 会走 left,20% 走 right,10% 开火等等。概率分布不同,actor 采取的行为就会不一样。 +* 上图就是具体的例子, + * policy 就是一个 network; + * input 就是游戏的画面,它通常是由 pixels 所组成的; + * output 就是看看说有哪些选项是你可以去执行的,output layer 就有几个 neurons。 + * 假设你现在可以做的行为有 3 个,output layer 就是有 3 个 neurons。每个 neuron 对应到一个可以采取的行为。 + * Input 一个东西后,network 就会给每一个可以采取的行为一个分数。你可以把这个分数当作是概率。 actor 就是看这个概率的分布,根据这个概率的分布来决定它要采取的行为。比如说 70% 会走 left,20% 走 right,10% 开火等等。概率分布不同,actor 采取的行为就会不一样。 ![](img/4.3.png) **接下来用一个例子来说明 actor 是怎么样跟环境互动的。** @@ -161,7 +160,7 @@ $$ \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) $$ -像这种 loss function。你可在 TensorFlow 里 call 现成的 function,它就会自动帮你算。 +像这种 loss function,你可在 TensorFlow 里调用现成的 function,它就会自动帮你算。 然后你就可以把 gradient 计算出来,这是一般的分类问题。RL 唯一不同的地方是 loss 前面乘上一个 weight,这个是整场游戏的时候得到的 total reward R, 它并不是在 state s 采取 action a 的时候得到的 reward。 你要把你的每一笔 training data,都 weighted by 这个 R。然后你用 TensorFlow 或 PyTorch 去帮你算 gradient 就结束了,跟一般 classification 差不多。 ## Tips @@ -278,7 +277,10 @@ REINFORCE 的伪代码主要看最后四行,先产生一个 episode 的数据 ![](img/4.23.png) -手写数字识别是一个经典的多分类问题,就是输入一张手写数字的图片,经过神经网络输出的是各个分类的一个概率。目的是希望输出的这个概率的分布尽可能地去贴近真实值的概率分布。因为真实值只有一个数字 9,你用这个 one-hot 向量的形式去给它编码的话,也可以把这个真实值理解为一个概率分布,9 的概率就是1,其他的概率就是 0。神经的网络输出一开始可能会比较平均,通过不断地迭代,训练优化之后,我会希望 9 输出的概率可以远高于其他数字输出的概率。 +* 手写数字识别是一个经典的多分类问题,输入是一张手写数字的图片,经过神经网络输出的是各个分类的一个概率。 +* 目的是希望输出的这个概率的分布尽可能地去贴近真实值的概率分布。 +* 因为真实值只有一个数字 9,你用这个 one-hot 向量的形式去给它编码的话,也可以把这个真实值理解为一个概率分布,9 的概率就是1,其他的概率就是 0。 +* 神经的网络输出一开始可能会比较平均,通过不断地迭代,训练优化之后,我会希望 9 输出的概率可以远高于其他数字输出的概率。 ![](img/4.24.png) @@ -286,7 +288,10 @@ REINFORCE 的伪代码主要看最后四行,先产生一个 episode 的数据 ![](img/4.25.png) -我们看一下它的优化流程,就是怎么让这个输出去逼近这个真实值。它的优化流程就是将图片作为输入传给神经网络,神经网络会判断这个图片属于哪一类数字,输出所有数字可能的概率,然后再计算这个交叉熵,就是神经网络的输出 $Y_i$ 和真实的标签值 $Y_i'$ 之间的距离 $-\sum Y_{i}^{\prime} \cdot \log \left(Y_{i}\right)$。我们希望尽可能地缩小这两个概率分布之间的差距,计算出来的 cross entropy 可以作为这个 loss 函数传给神经网络里面的优化器去优化,去自动去做神经网络的参数更新。 +我们看一下它的优化流程,就是怎么让这个输出去逼近这个真实值。 + +* 它的优化流程就是将图片作为输入传给神经网络,神经网络会判断这个图片属于哪一类数字,输出所有数字可能的概率,然后再计算这个交叉熵,就是神经网络的输出 $Y_i$ 和真实的标签值 $Y_i'$ 之间的距离 $-\sum Y_{i}^{\prime} \cdot \log \left(Y_{i}\right)$。 +* 我们希望尽可能地缩小这两个概率分布之间的差距,计算出来的 cross entropy 可以作为这个 loss 函数传给神经网络里面的优化器去优化,去自动去做神经网络的参数更新。 ![](img/4.26.png)