提交 b9531009 编写于 作者: W wizardforcel

2020-09-06 20:01:43

上级 4e0ea8e6
# 从头开始训练 RNN
**递归神经网络****RNN**)是为建模顺序数据而构建的一组神经网络。 在最后几章中,我们研究了使用卷积层从图像中学习特征。 当我们想从所有相关的值中学习特征时,递归层同样有用: *x <sub>t</sub>**x <sub>t-1</sub>**x <sub>t-2</sub>**x* <sub>*t-3*</sub>
**递归神经网络****RNN**)是为建模顺序数据而构建的一组神经网络。 在最后几章中,我们研究了使用卷积层从图像中学习特征。 当我们想从所有相关的值中学习特征时,递归层同样有用: `x[t]``x[t-1]``x[t-2]``x[t-3]`
在本章中,我们将讨论如何将 RNN 用于时间序列问题,这无疑是涉及按时间或时间顺序排列的一系列数据点的问题。
......@@ -35,7 +35,7 @@
![](img/78f99d5b-c72c-4dd8-a83f-e000b7e711c5.jpg)
在上图中,我们可以看到神经元 **A** 接受输入 **x <sub>t0</sub>** 并输出 **h <sub>t0</sub>** 在时间步 0 处。然后在时间步 1,神经元使用输入 **x <sub>t1</sub>** 以及来自其上一个时间步的信号来输出 **h <sub>t1 [</sub>** 。 现在在时间步骤 2,它认为它是输入 **x <sub>t2</sub>** 以及上一个时间步骤的信号,该信号可能仍包含时间步骤 0 的信息。我们继续这种方式,直到到达 序列中的最后一个时间步,网络逐步增加其内存。
在上图中,我们可以看到神经元`A`接受输入`x[t0]`并输出`h[t0]`在时间步 0 处。然后在时间步 1,神经元使用输入`x[t1]`以及来自其上一个时间步的信号来输出`h[t1]`。 现在在时间步骤 2,它认为它是输入`x[t2]`以及上一个时间步骤的信号,该信号可能仍包含时间步骤 0 的信息。我们继续这种方式,直到到达 序列中的最后一个时间步,网络逐步增加其内存。
标准 RNN 使用权重矩阵将前一个时间步的信号与当前时间步的输入和隐藏权重矩阵的乘积混合。 在通过非线性函数(通常是双曲正切函数)进行馈送之前,将所有这些函数组合在一起。 对于每个时间步骤,它看起来像:
......@@ -45,7 +45,7 @@
![](img/e391d033-316e-426f-bf52-c72785baffdb.png)
此处 <sub>t</sub> 是前一个时间步输出和当前时间步输入的线性组合,均由权重矩阵 *W**U* 进行参数化。 一旦计算出*和 <sub>t</sub>* ,它就具有非线性函数,最常见的是双曲正切 *h [ <sub>t</sub>* 。 最后,神经元的输出 *o* <sub>*t*</sub>*h* <sub>*t*</sub> 与权重矩阵结合在一起 , *V**a* 偏置, *c* 偏置。
此处`t`是前一个时间步输出和当前时间步输入的线性组合,均由权重矩阵`W``U`进行参数化。 一旦计算出`t`,它就具有非线性函数,最常见的是双曲正切`h[t]`。 最后,神经元的输出`o[t]``h[t]`与权重矩阵结合在一起,`V``a`偏置,`c`偏置。
当您查看此结构时,请尝试想象一下一种情况,在该情况下,您很早就需要一些非常重要的信息。 随着序列的延长,重要的早期信息被遗忘的可能性就更高,因为新信号会轻易地压倒旧信息。 从数学上讲,单位的梯度将消失或爆炸。
......@@ -59,7 +59,7 @@
LSTM 既可以积累先前时间步骤中的信息,又可以选择何时忘记一些不相关的信息,而选择一些新的更相关的信息。
例如,考虑序列*,在高中时我选择了西班牙语**去法国时,我讲法语*。 如果我们正在训练一个网络来预测“法语”一词,那么记住法国并有选择地忘记西班牙语是非常重要的,因为上下文已经发生了变化。 当序列的上下文发生变化时,LSTM 可以有选择地忘记某些事情。
例如,考虑序列`In highschool I took Spanish. When I went to France I spoke French.`。 如果我们正在训练一个网络来预测“法语”一词,那么记住法国并有选择地忘记西班牙语是非常重要的,因为上下文已经发生了变化。 当序列的上下文发生变化时,LSTM 可以有选择地忘记某些事情。
为了完成这种选择性的长期记忆,LSTM 实现了一个“忘记门”,该门使 LSTM 成为了称为门控神经网络的神经网络家族的成员。 该遗忘门允许 LSTM 有选择地学习何时应从其长期存储器中丢弃信息。
......@@ -69,25 +69,25 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
![](img/0a5218b1-b99c-496a-bf84-f9d97c188a58.png)
每个 LSTM 单元展开时,都有一个时间段 *t* 的输入,称为 *x <sub>t</sub>* ,一个输出,称为 *o <sub>t</sub>* 以及从上一个时间步 *C <sub>t-1</sub>* 到下一个 *C <sub>t 进行存储的存储器总线 *C*</sub>*
每个 LSTM 单元展开时,都有一个时间段`t`的输入,称为`x[t]`,一个输出,称为`o[t]`以及从上一个时间步`C[t-1]`到下一个`C[t]`进行存储的存储器总线`C`
除这些输入外,该单元还包含多个门。 我们已经提到的第一个是忘记门,在图中标记为 *F <sub>t</sub>*
除这些输入外,该单元还包含多个门。 我们已经提到的第一个是忘记门,在图中标记为`F[t]`
![](img/355dbba6-b10b-4cc7-a992-727d56fbc887.png)
该门的输出(将在 0 和 1 之间)逐点乘以 *C <sub>t-1</sub>* 。 这允许门调节从 *C <sub>t-1</sub>**C <sub>t</sub>* 的信息流。
该门的输出(将在 0 和 1 之间)逐点乘以`C[t-1]`。 这允许门调节从`C[t-1]``C[t]`的信息流。
下一个门,即输入门 *i <sub>t</sub>* 与功能候选 *C <sub>t</sub>* 结合使用。 候选 *C <sub>t</sub>* 学习可以添加到内存状态的向量。 输入门了解总线 *C* 中的哪些值得到更新。 下式说明 *i <sub>t</sub>* 和候选 *C <sub>t</sub>*
下一个门,即输入门`i[t]`与功能候选`C[t]`结合使用。 候选`C[t]`学习可以添加到内存状态的向量。 输入门了解总线`C`中的哪些值得到更新。 下式说明`i[t]`和候选`C[t]`
![](img/ec04eb9a-48f5-45fd-af5c-812bf60c1288.png)
![](img/fd532fce-cd9f-4f87-a814-45976a16593d.png)
我们取 *i <sub>t</sub>* 和候选 *C <sub>t</sub>* 的点积,决定添加到总线 *C* 的对象, 使用 *F <sub>t</sub>* 决定要忘记什么之后,如以下公式所示:
我们取`i[t]`和候选`C[t]`的点积,决定添加到总线`C`的对象, 使用`F[t]`决定要忘记什么之后,如以下公式所示:
![](img/c6d9fff9-d274-4af0-8ef2-69b3cd7c03bc.png)
最后,我们将决定获取输出的内容。 输出主要来自内存总线 *C* ; 但是,它被另一个称为输出门的门过滤。 以下公式说明了输出:
最后,我们将决定获取输出的内容。 输出主要来自内存总线`C`; 但是,它被另一个称为输出门的门过滤。 以下公式说明了输出:
![](img/57790f79-d20b-4cb4-a728-d25af7dab0bf.png)
......@@ -99,7 +99,7 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
# 通过时间反向传播
训练 RNN 要求**反向传播**的实现略有不同,即在整个时间( **BPTT**)中称为**反向传播。**
训练 RNN 要求**反向传播**的实现略有不同,即在整个时间(**BPTT**)中称为**反向传播**
与正常反向传播一样,BPTT 的目标是使用整体网络误差,通过梯度来调整每个神经元/单元对它们对整体误差的贡献的权重。 总体目标是相同的。
......@@ -121,25 +121,25 @@ LSTM 的另一个关键特性是内部自循环,使设备可以长期积累信
![](img/0969789c-bcfd-4c4a-b526-8e05a45d6ab1.png)
通常,我们在时间序列分析中的目标是预测。 但是,使用时间序列当然还可以执行许多其他有趣的事情,而这不在本书的讨论范围之内。 预测实际上只是回归的一种特殊形式,我们的目标是根据给定的先前点![](img/c756c9ec-79c1-4919-a567-1a60c335b71a.png)来预测某个点 *x <sub> t </sub>* 或点![](img/4bb8b337-ac21-40e6-8bb7-de2e9ac39988.png)。 当时间序列自动关联时,我们可以执行此操作,这意味着数据点与其自身关联一个或多个时间上的点(称为滞后)。 自相关性越强,预测就越容易。
通常,我们在时间序列分析中的目标是预测。 但是,使用时间序列当然还可以执行许多其他有趣的事情,而这不在本书的讨论范围之内。 预测实际上只是回归的一种特殊形式,我们的目标是根据给定的先前点![](img/c756c9ec-79c1-4919-a567-1a60c335b71a.png)来预测某个点`x[t]`或点`x[t], x[t+1], x[t+2], ..., x[t+n]`。 当时间序列自动关联时,我们可以执行此操作,这意味着数据点与其自身关联一个或多个时间上的点(称为滞后)。 自相关性越强,预测就越容易。
在许多书中,时间序列问题用 *y* 表示,而不是用 *x* 表示,以暗示我们通常关心预测给定自身的变量 y 的想法。
在许多书中,时间序列问题用`y`表示,而不是用`x`表示,以暗示我们通常关心预测给定自身的变量 y 的想法。
# 库存和流量
在计量经济学时间序列中,数量通常被定义为**库存****流量**。 库存度量是指特定时间点的数量。 例如,2008 年 12 月 31 日的 *S**P* 500 的值是库存测量值。 流量测量是一段时间间隔内的速率。 美国股票市场从 2009 年到 2010 年的增长率是一种流量度量。
在计量经济学时间序列中,数量通常被定义为**库存****流量**。 库存度量是指特定时间点的数量。 例如,2008 年 12 月 31 日的 SP500 的值是库存测量值。 流量测量是一段时间间隔内的速率。 美国股票市场从 2009 年到 2010 年的增长率是一种流量度量。
最经常进行预测时,我们会关注预测流量。 如果我们将预测想象为一种特定的回归,那么我们偏爱流量的第一个也是最明显的原因是,流量估算更有可能是插值而不是外推,而且插值几乎总是更安全。 此外,大多数时间序列模型都具有平稳性的假设。 固定时间序列是其统计属性(均值,方差和自相关)随时间恒定的序列。 如果我们使用一定数量的库存测量,则会发现大多数现实世界中的问题远非静止不动。
使用 LSTM 进行时间序列分析时,虽然没有假设(读取规则)需要平稳性,但根据实际经验,我发现对相对固定的数据进行训练的 LSTM 更加健壮。 使用 LSTM 进行时间序列预测时,几乎在所有情况下,一阶差分就足够了。
将库存数量转换为流量数量非常简单。 如果您具有 *n* 点,则可以创建具有一阶差分的 *n-1* 流量测量值,其中,对于每个值 *t' <sub>n</sub> [* ,我们通过从 *t <sub>n</sub>* 中减去 *t <sub>n-1</sub>* 来进行计算,从而得出跨两次测量的变化率 时间间隔,如以下公式所示:
将库存数量转换为流量数量非常简单。 如果您具有`n`个点,则可以创建具有一阶差分的`n-1`流量测量值,其中,对于每个值`t'[n]`,我们通过从`t[n]`中减去`t[n-1]`来进行计算,从而得出跨两次测量的变化率 时间间隔,如以下公式所示:
![](img/335dae59-80a2-4afd-bc88-829c9306832d.png)
例如,如果我们在三月份拥有价值 80 美元的股票,而在四月份突然价值 100 美元,则该股票的流率将为 20 美元。
一阶微分不能保证平稳的时间序列。 我们可能还需要删除季节或趋势。 趋势消除是专业预测员日常生活的重要组成部分。 如果我们使用传统的统计模型进行预测,则需要做更多的工作。 虽然我们没有涵盖这些内容的页面,但我们可能还需要执行二阶差分,季节性趋势下降或更多操作。 **增强 Dickey-Fuller****ADF**)测试是一种统计测试,通常用于确定我们的时间序列是否实际上是静止的。 如果您想知道时间序列是否稳定,[可以使用增强的 Dickey-Fuller 检验来检查](https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test)。 但是,对于 LSTM,一阶微分通常可能就足够了。 只需了解网络最肯定会学习您数据集中剩余的季节和时期。
一阶微分不能保证平稳的时间序列。 我们可能还需要删除季节或趋势。 趋势消除是专业预测员日常生活的重要组成部分。 如果我们使用传统的统计模型进行预测,则需要做更多的工作。 虽然我们没有涵盖这些内容的页面,但我们可能还需要执行二阶差分,季节性趋势下降或更多操作。 **增强 Dickey-Fuller****ADF**)测试是一种统计测试,通常用于确定我们的时间序列是否实际上是静止的。 如果您想知道时间序列是否稳定,[可以使用增强的 Dickey-Fuller 检验来检查](https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test)。 但是,对于 LSTM,一阶微分通常可能就足够了。 只需了解网络最肯定会学习您数据集中剩余的季节和时期。
# ARIMA 和 ARIMAX 预测
......@@ -179,7 +179,7 @@ ARIMAX 模型允许在时间序列模型中包含一个或多个协变量。 您
2. 通过对日期范围进行切片来创建火车和测试集。
3. 区别我们的数据集。
4. 将差异缩放到更接近我们的激活功能的程度。 我们将使用-1 到 1,因为我们将使用`tanh`作为激活
5. 创建一个训练集,其中每个目标 *x <sub>t</sub>* 都有一系列滞后 *x <sub>t-1</sub> ... x <sub>tn</sub> 与之相关的*。 在此训练集中,您可以将 *x <sub>t</sub>* 视为我们的典型因变量 *y* 。 滞后序列 *x <sub>t-1</sub> ... x <sub>t-n</sub>* 可以看作是典型的 *X* 训练矩阵。
5. 创建一个训练集,其中每个目标`x[t]`都有一系列与之相关的滞后`x[t-1], ..., x[t-n]`。 在此训练集中,您可以将`x[t]`视为我们的典型因变量`y`。 滞后序列`x[t-1], ..., x[t-n]`可以看作是典型的`X`训练矩阵。
我将在接下来的主题中介绍每个步骤,并在进行过程中显示相关的代码。
......@@ -271,7 +271,7 @@ def lag_dataframe(data, lags=1):
return df
```
例如,如果我们用`lags = 3`调用`lag_dataframe`,我们期望数据集返回 *x <sub>t-1</sub>**x <sub>t- 2</sub>**x <sub>t-3</sub>* 。 我发现很难理解这样的滞后代码,因此,如果您也这样做,您并不孤单。 我建议运行它并建立一些熟悉的操作。
例如,如果我们用`lags = 3`调用`lag_dataframe`,我们期望数据集返回`x[t-1], x[t-2], x[t-3]`。 我发现很难理解这样的滞后代码,因此,如果您也这样做,您并不孤单。 我建议运行它并建立一些熟悉的操作。
在选择数量滞后时,在将模型部署到生产环境时,您可能还需要考虑要等待多少个滞后才能做出预测。
......@@ -320,7 +320,7 @@ def prep_data(df_train, df_test, lags):
return X_train, X_test, y_train, y_test
```
此功能采用训练和测试数据帧,并应用差分,缩放和滞后代码。 然后,将这些数据帧重新调整为我们熟悉的 *X**y* 张量,以进行训练和测试。
此功能采用训练和测试数据帧,并应用差分,缩放和滞后代码。 然后,将这些数据帧重新调整为我们熟悉的`X``y`张量,以进行训练和测试。
现在,我们可以使用几行代码将这些转换粘合在一起,从而从加载数据到准备进行训练和测试,它们可以:
......@@ -405,7 +405,7 @@ model.save("lstm_model.h5")
我们拥有一个合适的网络,似乎已经学到了一些东西。 现在,我们可以对比特币的价格流做出某种预测。 如果我们能做好,我们所有人都会非常富有。 在去买那栋豪宅之前,我们可能应该测量一下模型的性能。
财务模型的最终检验是这个问题:*您愿意在上面花钱吗?* 很难回答这个问题,因为在时间序列问题中衡量性能可能具有挑战性。
财务模型的最终检验是这个问题:“您愿意在上面花钱吗?”很难回答这个问题,因为在时间序列问题中衡量性能可能具有挑战性。
一种衡量性能的非常简单的方法是使用均方根误差来评估`y_test``X_test`预测之间的差异。 我们最肯定可以做到这一点,如以下代码所示:
......
......@@ -74,19 +74,21 @@ Word 袋模型很简单,需要相对较少的数据,并且考虑到该模型
**词干****词根去除**是两种不同但非常相似的技术,它们试图将每个单词还原为基本形式,从而简化了语言模型。 例如,如果要阻止猫的各种形式,我们将在此示例中进行转换:
**猫,猫,猫的->猫**
```py
cat, cats, cat's, cats' -> cat
```
限制词法化和词干化之间的差异成为我们进行此转换的方式。 提取是通过算法完成的。 当应用于同一个单词的多种形式时,提取的根在大多数情况下应相同。 这个概念可以与词条反义化形成对比,词条反义化使用具有已知基础的词汇表并考虑如何使用该词。
词干处理通常比词条化处理快得多。 Porter 提取器在很多情况下都可以很好地工作,因此您可以将其作为提取的第一个安全选择。
停用词是在该语言中非常常见的词,但几乎没有语义。 典范示例是*和*一词。 我在上一句话中只使用了 3 次,但实际上只保留了一次意思。 通常,我们会删除停用词,以使输入内容更加稀疏。
停用词是在该语言中非常常见的词,但几乎没有语义。 典范示例是`the`一词。 我在上一句话中只使用了 3 次,但实际上只保留了一次意思。 通常,我们会删除停用词,以使输入内容更加稀疏。
大部分 BoW 模型都受益于词干,词根化和删除停用词。 有时,我们很快将要讨论的词嵌入模型也可以从词干提取或词义化中受益。 词嵌入模型很少会受益于停用词的删除。
# 计数和 TF-IDF 矢量化
计数向量化和**词频逆文档频率****T** **TF-IDF**)是两种将词袋转换成适合输入的特征向量的策略 机器学习算法。
计数向量化和**词频逆文档频率****TF-IDF**)是两种将词袋转换成适合输入的特征向量的策略 机器学习算法。
计数向量化采用我们的一组单词,并创建一个矢量,其中每个元素代表语料库词汇中的一个单词。 自然,一组文档中唯一单词的数量可能会很大,并且许多文档可能不包含语料库中存在的单词的任何实例。 在这种情况下,使用稀疏矩阵表示这些类型的字向量通常是非常明智的。 当一个单词出现一次或多次时,计数矢量化器将简单地对该单词出现在文档中的次数进行计数,然后将该计数放置在代表该单词的位置。
......@@ -107,13 +109,13 @@ docB = "the dog sat on my bed"
因此,如果我们要为该语料库创建一个计数嵌入,它将看起来像这样:
| | **床** | **猫** | **狗** | **脸部** | **我的** | 上的 | **坐姿** | |
| | `bed` | `cat` | `dog` | `face` | `my` | `on` | `sat` | `the` |
| **文件 0** | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| **文件 1** | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
这就是计数向量化。 这是我们工具箱中最简单的矢量化技术。
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(*和*)占我们所讲单词的 7%,是第二个最受欢迎的单词(的*)出现频率的两倍 )。 语言中单词的分布是幂律分布,[这是称为 Zipf 定律的基础](https://en.wikipedia.org/wiki/Zipf%27s_law)。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用**。*
计数向量化的问题在于我们使用了很多根本没有太多意义的单词。 实际上,英语中最常用的单词(`the`)占我们所讲单词的 7%,是第二个最受欢迎的单词(`of`)出现频率的两倍。 语言中单词的分布是幂律分布,[这是称为 Zipf 定律的基础](https://en.wikipedia.org/wiki/Zipf%27s_law)。 如果我们从计数中构造文档矩阵,那么最终得到的数字将包含很多信息,除非我们的目标是查看谁最经常使用`the`
更好的策略是根据单词在文档中的相对重要性对单词进行加权。 为此,我们可以使用 TF-IDF。
......@@ -131,7 +133,7 @@ n 这个公式:
如果我们要为同一语料库计算 TF-IDF 矩阵,它将看起来像这样:
| | **床** | **猫** | **狗** | **脸部** | **我的** | 上的 | **坐姿** | |
| | `bed` | `cat` | `dog` | `face` | `my` | `on` | `sat` | `the` |
| **文件 0** | 0 | 0.116 | 0 | 0.116 | 0 | 0 | 0 | 0 |
| **文件 1** | 0.116 | 0 | 0.116 | 0 | 0 | 0 | 0 | 0 |
......@@ -168,26 +170,26 @@ array([ 5.81600726e-01, 3.07168198e+00, 3.73339128e+00,
现在我们有了猫的向量,我将计算狗和蜥蜴的词向量。 我建议猫比蜥蜴更像狗。 我应该能够测量猫矢量和狗矢量之间的距离,然后测量猫矢量和蜥蜴矢量之间的距离。 尽管有许多方法可以测量向量之间的距离,但余弦相似度可能是单词向量最常用的方法。 在下表中,我们正在比较猫与狗和蜥蜴的余弦相似度:
| | **狗** | **蜥蜴** |
| **猫** | 0.74 | 0.63 |
| | `dog` | `lizard` |
| `cat` | 0.74 | 0.63 |
不出所料,在我们的向量空间中,猫的含义比蜥蜴更接近狗。
# 通过预测学习单词嵌入
单词嵌入是通过使用专门为该任务构建的神经网络来计算的。 我将在这里介绍该网络的概述。 一旦计算了某些语料库的词嵌入,它们便可以轻松地重用于其他应用程序,因此使该技术成为迁移学习的候选者,类似于我们在第 8 章*迁移中介绍的技术 使用预先训练的 CNN* 学习
单词嵌入是通过使用专门为该任务构建的神经网络来计算的。 我将在这里介绍该网络的概述。 一旦计算了某些语料库的词嵌入,它们便可以轻松地重用于其他应用程序,因此使该技术成为迁移学习的候选者,类似于我们在第 8 章“使用预先训练的 CNN 的迁移学习”中介绍的技术
当我们完成了对该词嵌入网络的训练后,我们网络中单个隐藏层的权重将成为我们词嵌入的查找表。 对于词汇表中的每个单词,我们将学习该单词的向量。
该隐藏层将包含比输入空间少的神经元,从而迫使网络学习输入层中存在的信息的压缩形式。 这种架构非常类似于自动编码器。 但是,该技术围绕着一项任务,该任务帮助网络学习向量空间中每个单词的语义值。
我们将用来训练嵌入网络的任务是预测某些目标词出现在距训练词距离窗口内的概率。 例如,如果*考拉*是我们的输入词,而*有袋动物*是我们的目标词,则我们想知道这两个词彼此靠近的可能性。
我们将用来训练嵌入网络的任务是预测某些目标词出现在距训练词距离窗口内的概率。 例如,如果`koala`是我们的输入词,而`marsupials`是我们的目标词,则我们想知道这两个词彼此靠近的可能性。
此任务的输入层将是词汇表中每个单词的一个热编码矢量。 输出层将是相同大小的`softmax`层,如下图所示:
![](img/ec71e9df-b735-4432-ab12-d31905f6d2c6.png)
该网络导致隐藏层的形状为权重矩阵[**词汇 x 神经元**]。 例如,如果我们的语料库中有 20,000 个唯一单词,而隐藏层中有 300 个神经元,那么我们的隐藏层权重矩阵将为 20,000 x300。将这些权重保存到磁盘后,我们将拥有一个 300 元素向量,可用于 代表每个词。 然后,在训练其他模型时,可以使用这些向量表示单词。
该网络导致隐藏层的形状为权重矩阵`[词汇 x 神经元]`。 例如,如果我们的语料库中有 20,000 个唯一单词,而隐藏层中有 300 个神经元,那么我们的隐藏层权重矩阵将为 20,000 x300。将这些权重保存到磁盘后,我们将拥有一个 300 元素向量,可用于 代表每个词。 然后,在训练其他模型时,可以使用这些向量表示单词。
当然,除此以外,还有更多的培训词嵌入网络的方法,而我故意过分简化了快速参考样式。
......@@ -205,9 +207,9 @@ GloVe 通过创建单词共现的非常大的矩阵来工作。 对于某些语
如果您一直在仔细阅读,您可能会注意到我尚未消除的鸿沟。 词嵌入模型为每个词创建一个向量。 相比之下,BoW 模型为每个文档创建一个向量。 那么,我们如何使用词嵌入模型进行文档分类呢?
一种幼稚的方法可能是获取文档中所有单词的向量并计算均值。 我们可能将此值解释为文档的平均语义值。 在实践中,通常使用此解决方案,并且可以产生良好的结果。 但是,它并不总是优于 BoW 嵌入模型。 考虑短语*狗咬人**狗咬人*。 希望您会同意我的观点,这是两个截然不同的陈述。 但是,如果我们对它们的词向量进行平均,它们将具有相同的值。 这使我们提出了一些其他策略,可以用来设计文档中的特征,例如使用每个向量的均值,最大值和最小值。
一种幼稚的方法可能是获取文档中所有单词的向量并计算均值。 我们可能将此值解释为文档的平均语义值。 在实践中,通常使用此解决方案,并且可以产生良好的结果。 但是,它并不总是优于 BoW 嵌入模型。 考虑短语`dog bites man``man bites dog`。 希望您会同意我的观点,这是两个截然不同的陈述。 但是,如果我们对它们的词向量进行平均,它们将具有相同的值。 这使我们提出了一些其他策略,可以用来设计文档中的特征,例如使用每个向量的均值,最大值和最小值。
Le 和 Mikolov 在[《句子和文档的分布式表示》](https://arxiv.org/abs/1405.4053)中提出了一种从单词到文档的更好的想法。 基于`word2vec`的思想,本文将段落标识符添加到我们描述的用于学习单词向量的神经网络的输入中。 使用文本中的单词以及文档 ID 可以使网络学习将可变长度文档嵌入矢量空间中。 该技术称为 **doc2vec** ,它可以很好地用作主题建模以及为模型创建输入特征的技术。
Le 和 Mikolov 在[《句子和文档的分布式表示》](https://arxiv.org/abs/1405.4053)中提出了一种从单词到文档的更好的想法。 基于`word2vec`的思想,本文将段落标识符添加到我们描述的用于学习单词向量的神经网络的输入中。 使用文本中的单词以及文档 ID 可以使网络学习将可变长度文档嵌入矢量空间中。 该技术称为 **doc2vec**,它可以很好地用作主题建模以及为模型创建输入特征的技术。
最后,许多深度学习框架都包含了嵌入层的概念。 嵌入层使您可以了解嵌入空间,这是网络正在执行的总体任务的一部分。 使用深度神经网络时,嵌入层可能是矢量化文本的最佳选择。 接下来让我们看一下嵌入层。
......@@ -231,13 +233,13 @@ Embedding(input_dim=10000, output_dim=128, input_length=10)
在这种情况下,该层的输出将是形状为 10 x 128 的 2D 矩阵,其中每个文档的 10 个单词将具有与之关联的 128 元素矢量。
这样的单词序列可以作为 LSTM 的出色输入。 LSTM 层可以紧随嵌入层。 就像上一章一样,我们可以将嵌入层中的这 10 行视为 LSTM 的顺序输入。 在本章的第一个示例中,我将使用 LSTM,因此,如果您在未阅读第 9 章*的情况下从头开始训练 RNN* ,则请花一点时间 让您重新了解 LSTM 的操作,可以在此处找到。
这样的单词序列可以作为 LSTM 的出色输入。 LSTM 层可以紧随嵌入层。 就像上一章一样,我们可以将嵌入层中的这 10 行视为 LSTM 的顺序输入。 在本章的第一个示例中,我将使用 LSTM,因此,如果您在未阅读第 9 章“从头开始训练 RNN”的情况下,则请花一点时间 让您重新了解 LSTM 的操作,可以在此处找到。
如果我们想将嵌入层直接连接到密集层,则需要对其进行展平,但您可能不想这样做。 如果您有序列文本,通常使用 LSTM 是更好的选择。 我们还有另外一个有趣的选择。
# 一维 CNN 用于自然语言处理
回顾第 7 章,*从头开始训练 CNN* 时,我们使用了卷积在图像区域上滑动窗口以学习复杂的视觉特征。 这使我们能够学习重要的局部视觉功能,而不管这些功能在图片中的位置,然后随着我们的网络越来越深入,逐步地学习越来越复杂的功能。 我们通常在 2D 或 3D 图像上使用 *3 x 3**5 x 5* 过滤器。 如果您对卷积层及其工作原理的理解感到生疏,则可能需要阅读第 7 章和*从头开始训练 CNN。*
回顾第 7 章,“从头开始训练 CNN”时,我们使用了卷积在图像区域上滑动窗口以学习复杂的视觉特征。 这使我们能够学习重要的局部视觉功能,而不管这些功能在图片中的位置,然后随着我们的网络越来越深入,逐步地学习越来越复杂的功能。 我们通常在 2D 或 3D 图像上使用`3 x 3``5 x 5`过滤器。 如果您对卷积层及其工作原理的理解感到生疏,则可能需要阅读第 7 章“从头开始训练 CNN”。
事实证明,我们可以对一系列单词使用相同的策略。 在这里,我们的 2D 矩阵是嵌入层的输出。 每行代表一个单词,并且该行中的所有元素都是其单词向量。 继续前面的示例,我们将有一个 10 x 128 的向量,其中连续有 10 个单词,每个单词都由 128 个元素的向量空间表示。 我们当然可以在这些单词上滑动过滤器。
......@@ -257,7 +259,7 @@ Embedding(input_dim=10000, output_dim=128, input_length=10)
本章的第一个案例研究将演示情绪分析。 在此示例中,我们将应用本章中学到的大多数内容。
我们将使用从 **Internet 电影数据库****IMDB**)内置于 Keras 中的数据集。 该数据集包含 25,000 条电影评论,每条评论均按情感标记。 正面评论标记为 1,负面评论标记为 0。此数据集中的每个单词均已替换为标识该单词的整数。 每个评论都被编码为单词索引序列。
我们将使用从**互联网电影数据库****IMDB**)内置于 Keras 中的数据集。 该数据集包含 25,000 条电影评论,每条评论均按情感标记。 正面评论标记为 1,负面评论标记为 0。此数据集中的每个单词均已替换为标识该单词的整数。 每个评论都被编码为单词索引序列。
我们的目标是仅使用评论中的文字将电影评论分为正面评论或负面评论。
......@@ -361,7 +363,7 @@ def build_network(vocab_size, embedding_dim, sequence_length):
return model
```
与其他二进制分类任务一样,我们可以使用二进制交叉熵。 请注意,因为我们正在将 LSTM 层连接到密集层,所以我们需要将`return_sequences`设置为`False`,正如我们在第 9 章,*从头训练*中讨论的那样 ]
与其他二进制分类任务一样,我们可以使用二进制交叉熵。 请注意,因为我们正在将 LSTM 层连接到密集层,所以我们需要将`return_sequences`设置为`False`,正如我们在第 9 章,“从头训练”中讨论的那样
为了使这部分代码可重用,我们使词汇量,嵌入维数和序列长度可配置。 如果要搜索超参数,则还可能希望参数化`dropout``recurrent_dropout`和 LSTM 神经元的数量。
......@@ -391,7 +393,7 @@ model.fit(x=data["X_train"], y=data["y_train"],
# 性能
从下面的屏幕截图中,让我们看一下我们的网络运行情况。 检查这些图时,请密切注意 *y* 轴上的刻度。 虽然挥杆动作看起来很戏剧性,但幅度并不大:
从下面的屏幕截图中,让我们看一下我们的网络运行情况。 检查这些图时,请密切注意`y`轴上的刻度。 虽然挥杆动作看起来很戏剧性,但幅度并不大:
![](img/d2911d59-77b8-4069-9bee-621999666e5d.png)
......@@ -401,7 +403,7 @@ model.fit(x=data["X_train"], y=data["y_train"],
# 有和没有 GloVe 的文档分类
在此示例中,我们将使用一个比较著名的文本分类问题,称为 [**20 新闻组问题**](http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/news20.html)。 在此问题中,我们获得了 19,997 个文档,每个文档都属于一个新闻组。 我们的目标是使用帖子的文本来预测该文本所属的新闻组。对于我们中间的千禧一代,新闻组是 **Reddit** 的先驱(但可能更接近伟大的 -Reddit 的曾祖父)。 这些新闻组涵盖的主题差异很大,包括政治,宗教和操作系统等主题,您应避免在礼貌的公司中讨论所有这些主题。 这些职位相当长,语料库中有 174,074 个独特的单词。
在此示例中,我们将使用一个比较著名的文本分类问题,称为 [**news20**](http://www.cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/www/data/news20.html)。 在此问题中,我们获得了 19,997 个文档,每个文档都属于一个新闻组。 我们的目标是使用帖子的文本来预测该文本所属的新闻组。对于我们中间的千禧一代,新闻组是 **Reddit** 的先驱(但可能更接近伟大的 -Reddit 的曾祖父)。 这些新闻组涵盖的主题差异很大,包括政治,宗教和操作系统等主题,您应避免在礼貌的公司中讨论所有这些主题。 这些职位相当长,语料库中有 174,074 个独特的单词。
这次,我将构建模型的两个版本。 在第一个版本中,我们将使用嵌入层,并且将学习嵌入空间,就像在前面的示例中一样。 在第二个版本中,我将使用 GloVe 向量作为嵌入层的权重。 然后,我将花一些时间比较和对比这两种方法。
......@@ -577,7 +579,7 @@ embedding_layer = Embedding(input_dim=vocab_size,
在大多数情况下,此代码看起来是等效的。 有两个主要区别:
* 我们初始化层权重以包含在我们与`weights=[embedding_matrix]`组装的 GloVe 矩阵中。
* 我们还将图层设置为`trainable=False`。 这将阻止我们更新权重。 您可能希望以与微调权重相似的方式微调权重,该方式类似于我们在第 8 章*使用预训练的 CNN* 进行的传递学习中构建的 CNN,但是在大多数情况下, 不必要或没有帮助。
* 我们还将图层设置为`trainable=False`。 这将阻止我们更新权重。 您可能希望以与微调权重相似的方式微调权重,该方式类似于我们在第 8 章“使用预训练的 CNN”进行的迁移学习中构建的 CNN,但是在大多数情况下, 不必要或没有帮助。
# 卷积层
......
......@@ -25,7 +25,7 @@
# 深度卷积 GAN 架构
关于 GAN 的论文很多,每篇都提出了新的新颖架构和调整。 但是,它们中的大多数至少在某种程度上基于**深卷积 GAN****DCGAN**)。 在本章的其余部分中,我们将重点介绍这种模型,因为当您采用此处未介绍的新的令人兴奋的 GAN 架构(例如**有条件 GAN****cGAN**),Stack GAN,InfoGAN 或 Wasserstein GAN,或者可能还有一些其他的新变种,您可能会选择接下来看看。
关于 GAN 的论文很多,每篇都提出了新的新颖架构和调整。 但是,它们中的大多数至少在某种程度上基于**深卷积 GAN****DCGAN**)。 在本章的其余部分中,我们将重点介绍这种模型,因为当您采用此处未介绍的新的令人兴奋的 GAN 架构(例如**有条件 GAN****cGAN**),Stack GAN,InfoGAN 或 Wasserstein GAN,或者可能还有一些其他的新变种,您可能会选择接下来看看。
DCGAN 由 Alex Radford,Luke Metz 和 Soumith Chintala 在论文[《深度卷积生成对抗网络》](https://arxiv.org/pdf/1511.06434.pdf)中提出。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册