提交 09a054fc 编写于 作者: W wizardforcel

2020-09-06 20:44:39

上级 926db5d5
......@@ -21,7 +21,7 @@
# 神经元
神经元是神经网络的原子单位。 有时这是受到生物学启发的。 但是,这是另一本书的主题。 神经元通常排列成层。 在本书中,如果我指的是特定的神经元,则将使用符号![](img/c1765cf8-ce94-4e0a-87ce-d73b19bf41e5.png),其中`l`是神经元所在的层, `k`是神经元编号 。 由于我们将使用遵循第 0 个表示法的编程语言,因此我的表示法也将基于第 0 个表示法。
神经元是神经网络的原子单位。 有时这是受到生物学启发的。 但是,这是另一本书的主题。 神经元通常排列成层。 在本书中,如果我指的是特定的神经元,则将使用符号`n[k]^l`,其中`l`是神经元所在的层, `k`是神经元编号 。 由于我们将使用遵循第 0 个表示法的编程语言,因此我的表示法也将基于第 0 个表示法。
大多数神经元的核心是两个共同起作用的功能:线性功能和激活功能。 让我们从较高的角度看一下这两个组成部分。
......@@ -31,7 +31,7 @@
![](img/4e5e3493-b790-47cc-84f3-a0be62d76138.png)
在给定数据的情况下,![](img/2df1b0c3-91f5-4a39-80c2-ca92b5c36e15.png)是权重或系数,`b`是偏差项。
在给定数据的情况下,`θ[1], θ[2], ..., θ[n]`是权重或系数,`b`是偏差项。
# 神经元激活功能
......@@ -57,7 +57,7 @@ sigmoid 函数如下所示:
![](img/ebabb5f1-f275-4648-a265-618d4d2e74a0.png)
> ![](img/de142212-317a-4975-bac2-8a73d64d08c9.png)
![](img/de142212-317a-4975-bac2-8a73d64d08c9.png)
对于中间层,`tanh`通常比 S 型更好。 您可能会看到,`tanh`的输出将在[-1,1]之间,而 S 型曲线的输出将为[0,1]。 这种额外的宽度可为消失或爆炸的梯度问题提供一定的弹性,我们将在后面详细介绍。 到目前为止,仅需知道消失的梯度问题就可以使网络在早期的层中收敛非常慢(如果有的话)。 因此,使用`tanh`的网络趋于比使用 S 型激活的网络收敛更快。 也就是说,它们仍然不如 ReLu 快。
......@@ -77,19 +77,19 @@ ReLu,或直线激活,简单定义为:
![](img/39a93548-a5c8-42d4-8696-f1cac167f5b9.png)
在这种情况下,损失函数为![](img/ab17a57d-6a09-47de-a96d-d80d9e5b2636.png),这实际上是平方误差。 因此,我们的`cost`函数`J`实际上只是均方误差,或整个数据集的均方误差的平均值。 按照惯例,添加了术语 1/2 以使某些微积分更干净。
在这种情况下,损失函数为`(y_hat - y)^2`,这实际上是平方误差。 因此,我们的`cost`函数`J`实际上只是均方误差,或整个数据集的均方误差的平均值。 按照惯例,添加了术语 1/2 以使某些微积分更干净。
# 正向传播过程
正向传播是我们尝试使用单个观测值中存在的特征预测目标变量的过程。 想象一下,我们有一个两层神经网络。 在正向传播过程中,我们将从观察中出现的特征![](img/a377936f-e73a-42d1-b8da-b1988023a393.png)开始,然后将这些特征乘以它们在第 1 层中的关联系数,并为每个神经元添加一个偏差项。 之后,我们会将输出发送到神经元的激活。 之后,输出将被发送到下一层,依此类推,直到到达网络的末端,然后剩下网络的预测:
正向传播是我们尝试使用单个观测值中存在的特征预测目标变量的过程。 想象一下,我们有一个两层神经网络。 在正向传播过程中,我们将从观察中出现的特征`x[1], x[2], ..., x[n]`开始,然后将这些特征乘以它们在第 1 层中的关联系数,并为每个神经元添加一个偏差项。 之后,我们会将输出发送到神经元的激活。 之后,输出将被发送到下一层,依此类推,直到到达网络的末端,然后剩下网络的预测:
> ![](img/855a0a4f-c69b-49ee-841e-8a0b72e076a0.jpg)
![](img/855a0a4f-c69b-49ee-841e-8a0b72e076a0.jpg)
# 反向传播功能
一旦正向传播完成,我们就可以对每个数据点进行网络预测。 我们也知道数据点的实际值。 通常,将预测定义为![](img/39b33940-3972-4624-bb21-3b73b5791e02.png),而将目标变量的实际值定义为 y。
一旦正向传播完成,我们就可以对每个数据点进行网络预测。 我们也知道数据点的实际值。 通常,将预测定义为`y_hat`,而将目标变量的实际值定义为 y。
一旦 y 和![](img/f27b326f-8544-47b8-a2e7-9820af78e39c.png)都已知,就可以使用成本函数计算网络误差。 回想一下,代价函数是`loss`函数的平均值。
一旦 y 和`y_hat`都已知,就可以使用成本函数计算网络误差。 回想一下,代价函数是`loss`函数的平均值。
为了使学习在网络中发生,网络的错误信号必须从最后一层到最后一层通过网络层向后传播。 我们反向传播的目标是在网络中向后传播该误差信号,同时随着信号的传播使用误差信号来更新网络权重。 在数学上,要做到这一点,我们需要对权重进行微调,以使成本函数最小,从而最小化成本函数。 此过程称为梯度下降。
......@@ -127,7 +127,7 @@ ReLu,或直线激活,简单定义为:
![](img/c23360a9-e58b-4a17-88d0-7bc7f4a0c3e4.png)
在动量的情况下,最通常将![](img/693d5dde-563d-4124-bf3a-7f3cfa05d02a.png)设置为 0.9,通常这不是需要更改的超参数。
在动量的情况下,最通常将`β`设置为 0.9,通常这不是需要更改的超参数。
# RMSProp 算法
......@@ -139,7 +139,7 @@ RMSProp 是另一种算法,可以通过跨网络权重表示的多维空间,
![](img/e2195ce4-cd4a-4c72-a0bb-ea6fc453ac8a.png)
这具有在![](img/aad5fa43-4213-47a0-bbfd-83f7aca5a426.png)大的方向上进一步减少振荡的效果。
这具有在`v[t]`大的方向上进一步减少振荡的效果。
# Adam 优化器
......@@ -153,7 +153,7 @@ Adam 是已知性能最好的**优化器**之一,这是我的首选。 它可
![](img/898ba591-7dc4-4be2-8a81-3eed0141913b.png)
其中![](img/867a839f-774a-43a1-86ae-2a2078e3d488.png)很小,可以防止被 0 除。
其中`ε`很小,可以防止被 0 除。
亚当通常是一个不错的选择,当您进行原型设计时,这是一个很好的起点,因此,从亚当开始可以节省一些时间。
......
......@@ -146,7 +146,7 @@ Keras 当前有两个用于构建模型的 API。 在我的示例中,我将使
# 输出层形状
我们的最后一层将由单个神经元组成,使用来自隐藏层的 32 个输入,将为每个观察值预测单个输出值![](img/08578297-d3d2-43dd-9cf8-7481a158df77.png)
我们的最后一层将由单个神经元组成,使用来自隐藏层的 32 个输入,将为每个观察值预测单个输出值`y_hat`
将所有各层放在一起,我们的 MLP 网络结构将如下所示:
......@@ -275,7 +275,7 @@ Model Test MAE: 0.190189985043
建立网络后,我想直观地检查错误,以了解网络对验证集分布进行建模的程度。 这通常会带来见解,这将有助于我改进模型。 对于回归模型,我想绘制验证集的预测值和实际值的直方图。 让我们看看我的表现如何。 该图如下,供您参考:
> ![](img/f254ee63-9487-4f22-93f4-70090f208fe6.jpg)
![](img/f254ee63-9487-4f22-93f4-70090f208fe6.jpg)
总体而言,我认为该模型正在相当接近地预测实际分布。 似乎实际的验证数据集比预测的数据集向左移动(较小的值)要多一些,这可能是一个重要的见解。 换句话说,网络可能会预测葡萄酒的酒精含量高于平均水平,尤其是在酒精含量较低的情况下。 更仔细地检查验证数据可能会建议我们如何收集更多的培训数据。
......
......@@ -53,7 +53,7 @@ tensorboard --logdir ~/ch3_tb_log --port 6006
如果使用的是云服务,则可能还需要调整防火墙或安全规则,以允许通过端口`6006`连接到服务器。 在 Amazon Web Services(AWS)上,您可以通过编辑与您的 EC2 实例关联的安全组中的入站规则来执行此操作:
> ![](img/c60f32d7-a490-4be7-9c2e-99d908a4629d.png)
![](img/c60f32d7-a490-4be7-9c2e-99d908a4629d.png)
您可能不希望像我上面那样允许全世界范围内的开放访问。 这只是一个测试实例,因此我不太关心安全性,无论如何我都喜欢过着危险的生活。
......
......@@ -90,15 +90,15 @@ def load_data():
![](img/0b843338-e484-47d0-9bec-6b9db1209675.png)
这可能更简单地看作是两个函数的集合,对于情况![](img/13362c21-ee4d-48aa-9406-c4a71e7cca41.png)和![](img/eda70b06-42dd-4146-b421-fabcdf53e914.png),一个函数:
这可能更简单地看作是两个函数的集合,对于情况`y[i] = 0``y[i] = 1`,一个函数:
![](img/2c455fce-cf7b-4e8b-ad2b-be204b77667f.png)
![](img/a4f98a3d-01d5-4678-b33c-acf99f39d07c.png)
`y[i] = 1`
![](img/e5f0cab0-6a5b-4bc5-a8d1-f8159aed950e.png)
![](img/4215357f-dc6d-4b69-8e99-6ecdea5cf6b8.png)
`y[i] = 0`
对数函数在这里用于产生单调函数(一个一直在增加或减少的函数),我们可以轻松区分它。 与所有成本函数一样,我们将调整网络参数以最小化网络成本。
......@@ -225,7 +225,7 @@ model.fit(x=data["train_X"], y=data["train_y"], batch_size=32, epochs=20, verbos
如果您已经阅读第 2 章“使用深度学习解决回归问题”,则应该看起来很熟悉。 在大多数情况下,实际上是相同的。 回调列表包含 TensorBoard 回调,因此让我们观看我们的网络训练 20 个纪元,看看会发生什么:
> ![](img/33cc8da8-37ba-4743-8e74-3bffbc02c050.png)
![](img/33cc8da8-37ba-4743-8e74-3bffbc02c050.png)
尽管我们的火车损失继续下降,但我们可以看到 val_loss 到处都在跳跃。 大约在第八个时代之后,我们就过度拟合了。
......
......@@ -315,7 +315,7 @@ def build_network(input_features=None):
![](img/490b7c75-bc4c-47de-aff0-35881df64129.png)
这里, ; ![](img/778cbc8f-17cd-4358-8279-1cc904d90f55.png)是可以增加或减少以更改应用的正则化量的正则化参数。 此正则化参数会惩罚较大的权重值,从而使网络总体上希望具有较小的权重。
这里,`λ`是可以增加或减少以更改应用的正则化量的正则化参数。 此正则化参数会惩罚较大的权重值,从而使网络总体上希望具有较小的权重。
要更深入地了解神经网络中的正则化,请查看 Michael Nielsen 的[《神经网络和深度学习》的第 3 章](http://neuralnetworksanddeeplearning.com/chap3.html)
......
......@@ -121,7 +121,7 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
![](img/0969789c-bcfd-4c4a-b526-8e05a45d6ab1.png)
通常,我们在时间序列分析中的目标是预测。 但是,使用时间序列当然还可以执行许多其他有趣的事情,而这不在本书的讨论范围之内。 预测实际上只是回归的一种特殊形式,我们的目标是根据给定的先前点![](img/c756c9ec-79c1-4919-a567-1a60c335b71a.png)来预测某个点`x[t]`或点`x[t], x[t+1], x[t+2], ..., x[t+n]`。 当时间序列自动关联时,我们可以执行此操作,这意味着数据点与其自身关联一个或多个时间上的点(称为滞后)。 自相关性越强,预测就越容易。
通常,我们在时间序列分析中的目标是预测。 但是,使用时间序列当然还可以执行许多其他有趣的事情,而这不在本书的讨论范围之内。 预测实际上只是回归的一种特殊形式,我们的目标是根据给定的先前点`x[t-1], ..., x[t-n]`来预测某个点`x[t]`或点`x[t], x[t+1], x[t+2], ..., x[t+n]`。 当时间序列自动关联时,我们可以执行此操作,这意味着数据点与其自身关联一个或多个时间上的点(称为滞后)。 自相关性越强,预测就越容易。
在许多书中,时间序列问题用`y`表示,而不是用`x`表示,以暗示我们通常关心预测给定自身的变量 y 的想法。
......@@ -247,7 +247,7 @@ def scale_data(df, scaler=None):
# 创建滞后的训练集
对于每个训练示例,给定一系列延迟![](img/05cdcd9e-d909-4bc0-a8ad-8f082ba859d2.png),我们希望训练网络以预测值 x <sub>t</sub> 。 理想的延迟数是一个超参数,因此需要进行一些实验。
对于每个训练示例,给定一系列延迟`x[t-1], ..., x[t-n]`,我们希望训练网络以预测值`x[t]`。 理想的延迟数是一个超参数,因此需要进行一些实验。
如前所述,以这种方式构造输入是 BPTT 算法的要求。 我们将使用以下代码来训练数据集:
......
......@@ -679,7 +679,7 @@ model.fit(data["X_train"], data["y_train"],
以下屏幕截图中的橙色线对应于学习的嵌入层,蓝色线对应于 GloVe 向量:
> ![](img/63265d98-f436-415a-ae52-1d53c78e5530.png)
![](img/63265d98-f436-415a-ae52-1d53c78e5530.png)
GloVe 预先训练的网络不仅学习得更快,而且在每个时期都表现得更好。 总体而言,这些网络似乎在学习文档分类任务方面做得很好。 大约在第五个时代之后,它们都开始过拟合。 但是,GloVe 模型比没有使用 GloVe 训练的网络更能防止过度拟合。
......
......@@ -387,7 +387,7 @@ decoder_model.save('char_s2s_decoder.h5')
让我们来看看这个模型的 100 个时代的模型训练:
> ![](img/d6844cf9-3d55-4e3f-9722-4c54b3be05b5.png)
![](img/d6844cf9-3d55-4e3f-9722-4c54b3be05b5.png)
如您所见,我们在第 20 个时期开始过度拟合。虽然损失持续减少,但`val_loss`却在增加。 在这种情况下,模型检查指向可能无法正常工作,因为在训练结束之前我们不会序列化推理模型。 因此,理想情况下,我们应该再训练一次,将训练的时期数设置为略大于 TensorBoard 中观察到的最小值。
......
......@@ -40,11 +40,11 @@
* 它具有一组有限的状态,`S`
* 它具有一组有限的动作 `A`
* ![](img/02b74074-e384-4fa3-bccd-c0262c867f5b.png)是采取行动`A`将在状态`s`和状态![](img/eb953b39-cb00-4772-bc93-a344af6f04fd.png)之间转换的概率
* ![](img/4535c471-eb4b-493a-8248-21870b941877.png)`s`和![](img/00a202fe-1100-4d7e-b183-32efc3c0dd7a.png)之间过渡的直接奖励。
* ![](img/5c9c163f-374e-4d8f-a5f4-c434ce13a568.png)是折扣因子,这是我们相对于当前奖励对未来奖励的折扣程度(稍后会详细介绍)
* `P[a](s, s')`是采取行动`A`将在状态`s`和状态`s'`之间转换的概率
* `R[a](s, s')``s``s'`之间过渡的直接奖励。
* `γ ∈ [0, 1]`是折扣因子,这是我们相对于当前奖励对未来奖励的折扣程度(稍后会详细介绍)
一旦我们有了确定每个状态要采取的操作的策略功能![](img/2c3faff6-8c08-4086-9d0e-9ef3b6bf448e.png),MDP 就解决了,成为了马尔可夫链。
一旦我们有了确定每个状态要采取的操作的策略功能`pi`,MDP 就解决了,成为了马尔可夫链。
好消息是,有一个警告就完全有可能完美解决 MDP。 需要注意的是,必须知道 MDP 的所有回报和概率。 事实证明,这种警告相当重要,因为在大多数情况下,由于代理人的环境混乱或至少不确定,因此代理人不知道所有的回报和状态更改概率。
......@@ -202,13 +202,13 @@ memory = SequentialMemory(limit=50000, window_length=1)
# 政策
Keras-RL 提供了一个称为`rl.policy.EpsGreedyQPolicy`![](img/2034a34a-4744-448c-a000-97ae2f895294.png)-贪婪 Q 策略,我们可以用来平衡勘探和开发。 当代理程序向世界前进时,我们可以使用`rl.policy.LinearAnnealedPolicy`来衰减![](img/1b0429eb-6319-461b-bab0-e4399ee0a985.png),如以下代码所示:
Keras-RL 提供了一个称为`rl.policy.EpsGreedyQPolicy` ε-贪婪 Q 策略,我们可以用来平衡勘探和开发。 当代理程序向世界前进时,我们可以使用`rl.policy.LinearAnnealedPolicy`来衰减`ε`,如以下代码所示:
```py
policy = LinearAnnealedPolicy(EpsGreedyQPolicy(), attr='eps', value_max=1., value_min=.1, value_test=.05, nb_steps=10000)
```
在这里我们要说的是,我们要从![](img/c60e566c-69b7-4681-886e-282c5e3fb3ea.png)的值 1 开始,并且不小于 0.1,同时测试我们的随机数是否小于 0.05。 我们将步数设置为 1 到.1 到 10,000 之间,Keras-RL 为我们处理衰减数学。
在这里我们要说的是,我们要从`ε`的值 1 开始,并且不小于 0.1,同时测试我们的随机数是否小于 0.05。 我们将步数设置为 1 到.1 到 10,000 之间,Keras-RL 为我们处理衰减数学。
# 代理商
......
......@@ -85,7 +85,7 @@ DCGAN 框架是使用迷你批量来进行训练的,这与我之前在本书
![](img/c8cc7ae9-1801-46d0-af96-142955d6a9a2.png)
鉴别器将提出一些预测,我们可以称之为![](img/d18fdfd8-3bd4-4f7d-b1f2-e0e754230335.png)。 此堆栈的`loss`函数将是二进制交叉熵,并且我们将`loss`函数的标签传递为 1,我们可以考虑`y`。 如您在本书前面所提到的, `y`和![](img/d16a73a6-36ff-4092-ac21-700ea76f558c.png)之间的`loss`转换为梯度,然后通过鉴别器传给生成器。 这将更新生成器权重,使它可以从鉴别者对问题空间的了解中受益,以便它可以学习创建更逼真的生成图像。
鉴别器将提出一些预测,我们可以称之为`y_hat`。 此堆栈的`loss`函数将是二进制交叉熵,并且我们将`loss`函数的标签传递为 1,我们可以考虑`y`。 如您在本书前面所提到的, `y``y_hat`之间的`loss`转换为梯度,然后通过鉴别器传给生成器。 这将更新生成器权重,使它可以从鉴别者对问题空间的了解中受益,以便它可以学习创建更逼真的生成图像。
然后重复这两个步骤,直到生成器能够创建与训练集中的数据相似的数据,使得判别器无法再将两个数据集区分开,这成为了一个猜谜游戏。 鉴别器。 此时,发电机将不再能够改进。 当我们找到纳什均衡时,就对网络进行了训练。
......@@ -110,7 +110,7 @@ DCGAN 框架是使用迷你批量来进行训练的,这与我之前在本书
我之前已经提到过 Soumith Chintala 的 [GAN hacks Git](https://github.com/soumith/ganhacks),当您试图使 GAN 稳定时,这是一个很好的起点。 既然我们已经讨论了训练稳定的 GAN 会有多么困难,让我们来谈谈一些安全的选择,这些选择可能会帮助您成功找到自己的地方。 尽管有很多技巧,但以下是本章中尚未涵盖的我的主要建议:
* **批量规范**:使用批量规范化时,请为真实数据和伪数据构造不同的微型批量,并分别进行更新。
* **泄漏的 ReLU**:泄漏的 ReLU 是 ReLU 激活功能的变异。 回想一下 ReLU 函数是![](img/f11e5dcb-d17d-4280-9485-b003fd9e0d4b.png)
* **泄漏的 ReLU**:泄漏的 ReLU 是 ReLU 激活功能的变异。 回想一下 ReLU 函数是`f(x) = max(0, x)`
但是,泄漏的 ReLU 可以表示为:
......@@ -454,7 +454,7 @@ discriminator = build_discriminator(img_shape=(32, 32, 3))
下图显示了 12 个纪元后的生成器:
> ![](img/7a6bfedb-d613-4204-badf-c62e7e5f00f4.png)
![](img/7a6bfedb-d613-4204-badf-c62e7e5f00f4.png)
我看到分辨率很低的鸟,鱼,甚至还有飞机和卡车。 当然,我们还有很长的路要走,但是我们的网络已经学会了创建图像,这非常令人兴奋。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册