recurrent neural network, RNN
- 外推法(extrapolation):对超出已知观测范围进行预测
- 内插法(interpolation):在现有观测值之间进行估计
- 自回归模型(autoregressive models):使用xt−1,…,xt−τ预测xt
- 隐变量自回归模型(latent autoregressive models):保留一些对过去观测的总结ht,并同时更新预测x^t和总结ht
-
动力学静止(stationary):序列本身的动力学不随时间改变
P(x1,…,xT)=∏t=1TP(xt∣xt−1,…,x1)
-
马尔科夫条件(Markov condition):自回归模型的前提
-
k步预测(k-step-ahead-prediction)
当数据集很小,或单词非常罕见时使用,来将罕见单词组合指定为非零计数。
P^(x)P^(x′∣x)P^(x′′∣x,x′)=n+ϵ1n(x)+ϵ1/m=n(x)+ϵ2n(x,x′)+ϵ2P^(x′)=n(x,x′)+ϵ3n(x,x′,x′′)+ϵ3P˙(x′′)
涉及一个、两个和三个变量的概率公式分别被称为“一元语法”(unigram)、“二元语法”(bigram)、“三元语法”(trigram)模型。
P(x1,x2,x3,x4)=P(x1)P(x2)P(x3)P(x4)P(x1,x2,x3,x4)=P(x1)P(x2∣x1)P(x3∣x2)P(x4∣x3)P(x1,x2,x3,x4)=P(x1)P(x2∣x1)P(x3∣x1,x2)P(x4∣x2,x3)
第i个最常用单词的频率为
ni∝iα1logni=−αlogi+c
这个分布不仅适用于一元语法,还适用于其他n元语法。
序列数据的不同采样方法将导致隐状态初始化的差异。
随机采样(random sampling)
在迭代过程中,来自两个相邻的、随机的、小批量中的子序列不一定在原始序列上相邻。
两个相邻的小批量中的子序列在原始序列上也是相邻的。
RNN是具有隐状态(hidden state) 的神经网络。
Ht=ϕ(XtWxh+Ht−1Whh+bh)Ot=HtWhq+bq
用于评价语言模型的质量
exp(−n1t=1∑nlogP(xt∣xt−1,…,x1))
其中P由语言模型给出,xt是在时间步t从该序列中观测到的实际词元。
这样的度量确保了不同长度的序列具有可比性。
将每个词元表示为更具表现力的特征向量。
使用了以下函数
F.one_hot
预热(warm-up)期:循环遍历prefix中的字符,不断将隐状态传递到下一个时间步,但不生成任何输出。在此期间模型会自我更新(例如,更新隐状态),但不会进行预测。
预热期结束后,隐状态的值通常比初始值更适合预测。经预热后再进行预测。
预测时,将每步预测的输出字符作为下一步的输入字符。
对于长为T的序列,在反向传播过程中会产生长为O(T)的矩阵乘法链。T较大时,会导致数值不稳定。可以使用梯度裁剪来稳定训练。
若目标函数f满足Lipschitz连续,则通过ηg更新参数向量时,有
∣f(x)−f(x−ηg)∣≤Lη∥g∥
此时,通过控制梯度g的模长可以限制f的变化。
g←min(1,∥g∥θ)g
- 梯度裁剪的坏处:限制了取得进展的进度
- 梯度裁剪的好处:限制了事情变糟的程度
核心代码:
rnn_layer = nn.RNN(len(vocab), num_hiddens)
Y, state_new = rnn_layer(X, state)
∂wh∂L=T1t=1∑T∂wh∂l(yt,ot)=T1t=1∑T∂ot∂((yt,ot)∂ht∂g(ht,wo)∂wh∂ht
∂wh∂ht=∂wh∂f(xt,ht−1,wh)+∂ht−1∂f(xt,ht−1,wh)∂wh∂ht−1
∂wh∂ht=∂wh∂f(xt,ht−1,wh)+i=1∑t−1(j=i+1∏t∂hj−1∂f(xj,hj−1,wh))∂wh∂f(xi,,hi−1,wh)
中间值会被缓存、重复使用,以避免重复计算。
矩阵高次幂可能导致神经网络特征值的发散或消失,将以梯度爆炸或梯度消失的形式表现。
截断是计算方便性和数值稳定性的需要,包括:
在τ步后截断式中的求和计算。
这样做导致该模型主要侧重于短期影响,而非长期影响。
zt=∂wh∂f(xt,ht−1,wh)+ξt∂ht−1∂f(xt,ht−1,wh)∂wh∂ht−1
其中
P(ξt=0)=1−πt 且 P(ξt=πt−1)=πtE[zt]=∂ht/∂wh
在实践中并不比常规截断好!