【七、循环神经⽹络】
1. 序列模型
- 序列模型估计方法有自回归模型和隐变量自回归模型。在统计学中,前者(超出已知观测值的预测)称为外推(extrapolation),后者(在现有观测值之间进⾏估计)称为内插(interpolation)。内插和外推在难度上有很⼤差别,因此,在训练时要尊重数据的时间顺序,不要对未来数据进行训练。因果模型如向前推进的时间,估计正向通常比反向容易得多
- 自回归模型(autoregressive models):自己执行回归,若观测序列xt−1, . . . , x1非必需,仅使⽤xt−1, . . . , xt−τ个观测,t > τ的参数量相同,从而能够训练⼀个深层⽹络
- 隐变量自回归模型(latent autoregressive models):保留⼀些过去观测的 ht,除了预测 ht 之外还更新ˆxt,产⽣估计 xt 和 ˆxt = P(xt | ht) 的模型,且更新 ht = g(ht−1, xt−1),此时 ht 未被观测。离散对象仍然有效,但需⽤分类器而不是回归模型来估计P(xt | xt−1, . . . , x1)
- 马尔可夫模型:在⾃回归模型中,只使⽤ xt−1, . . . , xt−τ 而不是 xt−1, . . . , x1 来估计 xt。只要这种近似准确,称为序列满⾜马尔可夫条件(Markov condition)。特别地,如果 τ=1,有⼀阶马尔可夫模型(first-order Markov model),P(x) 由下式给出:
当 xt 只假设离散值时,模型特别好,因为动态规划可沿链精确计算,如计算:
- 对于直到 xt 的观测序列,在时间步⻓ ˆxt+k 处的预测输出 t + k 称为** k 步预测**。随着在时间上进⼀步预测,增加 k,误差会累积,预测的质量会下降
2. 文本预处理
- ⽂本的常⻅预处理步骤:将⽂本作为字符串加载到内存中;将字符串拆分为标记(如单词和字符);建⽴词汇表,将拆分的标记映射到数字索引;将⽂本转换为数字索引序列
- 标记的字符串类型不⽅便模型使⽤,因此构建字典/词表(Vocabulary)将字符串标记映射到从 0 开始的数字索引中。先统计训练集中所有⽂档中的唯⼀标记,即语料(corpus),然后根据每个唯⼀标记的出现频率分配数字索引。出现少的标记通常被移除以降低复杂性,语料库中不存在或已删除的任何标记都将映射到⼀个特殊的未知标记 “
”。可选择添加保留令牌的列表,如 “ ” 表⽰填充;“ ” 表⽰序列开始;“ ” 表⽰序列结束
3. 语⾔模型和数据集
-
语言模型(language model)是⾃然语⾔处理的关键,⽬标是估计序列的联合概率。出现频率低的词汇估计正确率低,可通过拉普拉斯平滑(Laplace smoothing)在所有计数中添加⼀个小常量,处理不常⻅的、结构复杂且频率不够词组。但需要存储所有计数,且难以调整到额外的上下⽂中,同时⻓序列出现少难以估计
-
马尔可夫模型:序列分布满⾜⼀阶马尔可夫性质 P(xt+1 | xt, . . . , x1) =P(xt+1 | xt),阶数越高,依赖关系越长,因此可应⽤于序列建模的许多近似,涉及⼀个、两个和三个变量的概率公式称为单变量模型(unigram)、双变量模型(bigram)和三变量模型(trigram)
-
最常用的词称为 “停⽤词”(stop words),可以被过滤掉。单词符合⻬普夫定律(Zipf’s law),即第 i 个最常⽤单词的频率 ni 如下,α 是表征分布的指数,c 是常数
-
单词序列也遵循齐普夫定律,n 元组的数量并不⼤,很多 n 元组出现少,因此拉普拉斯平滑不适合语言建模,需使用基于深度学习的模型。n 元语法通过截断相关性,为处理⻓序列提供⽅便的模型
-
读取⻓序列的方法有随机采样和顺序分区。在随机采样中,每个样本在原始⻓序列上任意捕获⼦序列,迭代期间来⾃两个相邻随机小批量的⼦序列不⼀定在原始序列上相邻。语⾔建模⽬标是根据⽬前标记预测下⼀标记,因此标签是原始序列移位⼀个标记。顺序分区保证迭代过程中两个相邻小批量的⼦序列在原始序列上是相邻的,在对小批进⾏迭代时保留了拆分⼦序列的顺序
4. 循环神经⽹络
-
循环神经⽹络(Recurrent neural networks,RNNs)是指对隐藏状态使⽤循环计算的网络,可捕获直到当前时间步序列的历史信息,参数数量不会随着时间步的增加而增加。若在时间步 t 有小批量输⼊Xt∈Rn×d,权重参数Wxh∈Rd×h,小批量序列样本 n,时间步 t 的隐藏变量 Ht∈Rn×h,前⼀个时间步的隐藏变量 Ht−1,对应权重参数 Whh∈Rh×h,偏置 bh∈R1×h,“循环层”(recurrent layers)如下:
-
对于时间步长 t,输出层权重 Whq∈Rh×q 和偏置 bq∈R1×q,则输出层的计算:
-
将当前时间步 t 的输⼊ Xt 和前⼀时间步 t-1 的隐藏状态 Ht−1 连结,将连结结果送⼊带有激活函数 ϕ 的全连接层
-
使用循环神经⽹络创建字符级语言模型(character-level language model):基于当前字符和先前字符预测下⼀个字符。在训练过程中,对每个时间步⻓输出层的输出进⾏ softmax 操作,然后利用交叉熵损失计算模型输出和标签之间的误差
-
度量语言模型质量:通过序列中所有 n 个标记的平均交叉熵损失衡量(公式一),由于历史原因,更常用困惑度(perplexity)衡量(公式二)
5. 循环神经⽹络的从零开始实现
-
独热编码(One-Hot Encoding):将每个标记表⽰为更具表现⼒的特征向量。假设词表中不同的标记数为 N(len(vocab)),索引范围 0~(N -1)。若标记索引是整数 i,创建⼀个⻓度为 N 的全 0 向量,将 i 处元素置 1,则此向量是原始标记的⼀个独热向量
-
梯度裁剪可缓解梯度爆炸,可在更新模型参数之前使用,通过将梯度 g 投影给定半径的球(如θ)来裁剪梯度 g。梯度范数永远不会超过 θ,更新后的梯度与 g 的原始⽅向对⻬。梯度裁剪不能应对梯度消失
-
顺序分区在处理任何⼀个小批量之前先分离梯度,使隐藏状态的梯度计算限制在⼀个小批量的时间步内,减少计算量;随机抽样需为每个迭代周期重新初始化隐藏状态,因为每个样本都是在⼀个随机位置抽样
-
⼀个简单的循环神经⽹络语⾔模型包括输入编码、循环神经网络模型和输出生成
-
预热期允许模型在进⾏任何预测之前进⾏⾃我更新,可获得⽐初始值更好的隐藏状态
6. 通过时间反向传播
(1)循环神经⽹络的梯度分析:
-
通过时间反向传播:为了⾼效计算,在通过时间反向传播期间缓存中间值
-
为了计算⽅便和数值稳定,需要截断,如规则截断和随机截断
-
矩阵的高次方可能导致特征值发散或消失,这以梯度爆炸或梯度消失的形式表现出来