8
如果说卷积神经网络可以有效地处理空间信息, 那么循环神经网络(recurrent neural network,RNN)则可以更好地处理序列信息。
循环神经网络通过引入状态变量存储过去的信息和当前的输入,从而可以确定当前的输出。
8.1
-
在统计学中
- 预测明天的股价称为外推法,(extrapolation),对超出已知观测范围进行预测。
- 预测过去的股价称为内插法(interpolation),在现有观测值之间进行估计。
-
自回归模型(autoregressive models),对自己执行回归。
只需要满足某个长度为 τ \tau τ的时间跨度, 即使用观测序列 x t − 1 , . . . , x t − τ x_{t-1}, ... , x_{t-\tau} xt−1,...,xt−τ。 -
隐变量自回归模型
-
马尔可夫模型:类似自回归模型的近似法,只要是这种近似精确的,我们就说序列满足马尔可夫条件(Markov condition)。
-
没有足够的历史记录来描述前 τ \tau τ个数据样本。 一个简单的解决办法是:如果拥有足够长的序列就丢弃这几项; 另一个方法是用零填充序列。
小结
- 内插法(在现有观测值之间进行估计)和外推法(对超出已知观测范围进行预测)在实践的难度上差别很大。因此,对于所拥有的序列数据,在训练时始终要尊重其时间顺序,即最好不要基于未来的数据进行训练。
- 序列模型的估计需要专门的统计工具,两种较流行的选择是自回归模型和隐变量自回归模型。
- 对于时间是向前推进的因果模型,正向估计通常比反向估计更容易。
- 于直到时间步t的观测序列,其在时间步t+k
的预测输出是“k步预测”。随着我们对预测时间
k值的增加,会造成误差的快速累积和预测质量的极速下降。
8.2
文本的常见预处理步骤通常包括:
- 将文本作为字符串加载到内存中。
- 将字符串拆分为词元(如单词和字符)。
- 建立一个词表,将拆分的词元映射到数字索引。
- 将文本转换为数字索引序列,方便模型操作。
- 词元(token)是文本的基本单位,词元的类型是字符串。
- 由词元构建的字典叫做词表(vocabulary),用来将字符串类型的词元映射到从0开始的数字索引中。
- 训练集中所有文档合在一起后,统计其中的唯一词元,得到的结果叫做语料(corpus)。
- 很少出现的词元通常被移除,这可以降低复杂性。
- 语料库中不存在或已删除的任何词元都将映射到一个特定的未知词元<unk> 。
- 我们可以选择增加一个列表,用于保存那些被保留的词元, 例如:填充词元(“<pad>”); 序列开始词元(“<bos>”); 序列结束词元(“<eos>”)。
8.3
假设长度为T的文本序列中的词元依次为
x
1
,
x
2
,
.
.
.
,
x
T
x_1, x_2,...,x_T
x1,x2,...,xT。 于是,
x
t
(
1
≤
t
≤
T
)
x_t(1≤t≤T)
xt(1≤t≤T)
可以被认为是文本序列在时间步t处的观测或标签。 在给定这样的文本序列时,语言模型(language model)的目标是估计序列的联合概率
P
(
x
1
,
x
2
,
.
.
,
x
T
)
P(x_1,x_2,..,x_T)
P(x1,x2,..,xT)
语言模型
- 许多合理的三个单词组合可能是存在的,但是在数据集中却找不到。 除非我们提供某种解决方案,来将这些单词组合指定为非零计数, 否则将无法在语言模型中使用它们。 如果数据集很小,或者单词非常罕见,那么这类单词出现一次的机会可能都找不到。
- 一种常见的策略是执行某种形式的拉普拉斯平滑(Laplace smoothing), 具体方法是在所有计数中添加一个小常量。
马尔可夫模型与n元语法
- 一种常见的策略是执行某种形式的拉普拉斯平滑(Laplace smoothing), 具体方法是在所有计数中添加一个小常量。
- 涉及一个、两个和三个变量的概率公式分别被称为 一元语法(unigram)、二元语法(bigram)和三元语法(trigram)模型。
- 最流行的词看起来很无聊, 这些词通常被称为停用词(stop words),因此可以被过滤掉。
读取长序列数据
- 如果我们只选择一个偏移量, 那么用于训练网络的、所有可能的子序列的覆盖范围将是有限的。 因此,我们可以从随机偏移量开始划分序列, 以同时获得覆盖性(coverage)和随机性(randomness)。
小结
- 长序列存在一个问题:它们很少出现或者从不出现。
- 齐普夫定律支配着单词的分布,这个分布不仅适用于一元语法,还适用于其他n元语法。
- 读取长序列的主要方式是随机采样和顺序分区。在迭代过程中,后者可以保证来自两个相邻的小批量中的子序列在原始序列上也是相邻的。
8.4
- 通常,我们可以基于当前输入
x
t
x_t
xt和先前隐状态
h
t
−
1
h_{t-1}
ht−1来计算时间步t处的任何时间的隐状态:
h t = f ( x t , h t − 1 ) h_t = f(x_t, h_{t-1}) ht=f(xt,ht−1) - 注意:隐藏层和隐状态指的是两个截然不同的概念。
- 隐藏层是在从输入到输出的路径上(以观测角度来理解)的隐藏的层,
- 隐状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入, 并且这些状态只能通过先前时间步的数据来计算。
- 循环神经网络(recurrent neural networks,RNNs) 是具有隐状态的神经网络。
基于循环神经网络的字符级语言模型
- 在最好的情况下,模型总是完美地估计标签词元的概率为1。 在这种情况下,模型的困惑度为1。
- 在最坏的情况下,模型总是预测标签词元的概率为0。 在这种情况下,困惑度是正无穷大。
- 我们可以使用循环神经网络创建字符级语言模型。
- 我们可以使用困惑度来评价语言模型的质量。
8.5
小结
- 我们可以训练一个基于循环神经网络的字符级语言模型,根据用户提供的文本的前缀生成后续文本。
- 一个简单的循环神经网络语言模型包括输入编码、循环神经网络模型和输出生成。
- 循环神经网络模型在训练以前需要初始化状态,不过随机抽样和顺序划分使用初始化方法不同。
- 当使用顺序划分时,我们需要分离梯度以减少计算量。
- 在进行任何预测之前,模型通过预热期进行自我更新(例如,获得比初始值更好的隐状态)。
- 梯度裁剪可以防止梯度爆炸,但不能应对梯度消失。
8.6
小结
- 深度学习框架的高级API提供了循环神经网络层的实现。
- 高级API的循环神经网络层返回一个输出和一个更新后的隐状态,我们还需要计算整个模型的输出层。
- 相比从零开始实现的循环神经网络,使用高级API实现可以加速训练。
8.7
小结
- “通过时间反向传播”仅仅适用于反向传播在具有隐状态的序列模型。
- 截断是计算方便性和数值稳定性的需要。截断包括:规则截断和随机截断。
- 矩阵的高次幂可能导致神经网络特征值的发散或消失,将以梯度爆炸或梯度消失的形式表现。
- 为了计算的效率,“通过时间反向传播”在计算期间会缓存中间值。