数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
四、常见 RNN 变种
4.1 双向 RNN
前面介绍的
RNN
网络隐含了一个假设:时刻 $ t $ 的状态只能由过去的输入序列 $ \{\mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(t-1)} \} $ ,以及当前的输入 $ \mathbf{\vec x}^{(t)} $ 来决定。实际应用中,网络输出 $ \mathbf{\vec o}^{(t)} $ 可能依赖于整个输入序列。如:语音识别任务中,当前语音对应的单词不仅取决于前面的单词,也取决于后面的单词。因为词与词之间存在语义依赖。
双向
RNN
就是为了解决这种双向依赖问题,它在需要双向信息的应用中非常成功。如:手写识别、语音识别等。典型的双向
RNN
具有两条子RNN
:$ \mathbf{\vec h}^{(t)} $ 代表通过时间向未来移动的子
RNN
的状态,向右传播信息; $ \mathbf{\vec g}^{(t)} $ 代表通过时间向过去移动的子RNN
的状态,向左传播信息。$ t $ 时刻的输出 $ \mathbf{\vec o}^{(t)} $ 同时依赖于过去、未来、以及时刻 $ t $ 的输入 $ \mathbf{\vec x}^{(t)} $ 。
模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid \mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(t )}),\quad k = 1,2,\cdots,K $
单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $
更新方程:
$ \mathbf{\vec a}_1^{(t)}=\mathbf{\vec b}_1+\mathbf W_1\mathbf{\vec h}^{(t-1)}+\mathbf U_1\mathbf{\vec x}^{(t)}\\ \mathbf{\vec a}_2^{(t)}=\mathbf{\vec b}_2+\mathbf W_2\mathbf{\vec g}^{(t+1)}+\mathbf U_2\mathbf{\vec x}^{(t)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}_1^{(t)}),\quad \mathbf{\vec g}^{(t)}=\tanh(\mathbf{\vec a}_2^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V_1\mathbf{\vec h}^{(t)}+\mathbf V_2\mathbf{\vec g}^{(t)}\right) $其中输入到隐状态的权重为 $ \mathbf U_1,\mathbf U_2 $ ,隐状态到输出的权重为 $ \mathbf V_1,\mathbf V_2 $ ,隐状态到隐状态的权重为 $ \mathbf W_1,\mathbf W_2 $ , $ \mathbf{\vec b}_1,\mathbf{\vec b}_2,\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。
如果输入是 2 维的(如图像),则双向
RNN
可以扩展到4个方向:上、下、左、右。每个子
RNN
负责一个时间移动方向, $ t $ 时刻的输出 $ \mathbf{\vec o}^{(t)} $ 同时依赖于四个方向、以及时刻 $ t $ 的输入 $ \mathbf{\vec x}^{(t)} $ 。与
CNN
相比:RNN
可以捕捉到大多数局部信息,还可以捕捉到依赖于远处的信息;CNN
只能捕捉到卷积窗所在的局部信息。RNN
计算成本通常更高,而CNN
的计算成本较低。
4.2 深度 RNN
前述
RNN
中的计算都可以分解为三种变换:从输入 $ \mathbf{\vec x}^{(t)} $ 到隐状态 $ \mathbf{\vec h}^{(t)} $ 的变换、从前一个隐状态 $ \mathbf{\vec h}^{(t)} $ 到下一个隐状态 $ \mathbf{\vec h}^{(t+1)} $ 的变换、从隐状态 $ \mathbf{\vec h}^{(t)} $ 到输出 $ \mathbf{\vec o}^{(t)} $ 的变换。这三个变换都是浅层的,即:由一个仿射变换加一个激活函数组成。事实上,可以对这三种变换中引入深度。实验表明:引入深度会带来好处。
- 方式一:通过将
RNN
的隐状态分为多层来引入深度。 - 方式二:在这三种变换中,各自使用一个独立的
MLP
(可能是较浅的,也可能是较深的)。 - 方式三:在第二种方式的基础上,类似
ResNet
的思想,在 “隐状态-隐状态” 的路径中引入跳跃连接。
- 方式一:通过将
通过将
RNN
的隐状态分为多层来引入深度:如下所示,隐状态有两层: $ \mathbf{\vec h}^{(t)} $ 和 $ \mathbf{\vec z}^{(t)} $ 。隐状态层中层次越高,对输入提取的概念越抽象。模型的数学表示: $ o^{(t)}_k=p(y^{(t)} = k \mid \mathbf{\vec x}^{(1)},\cdots,\mathbf{\vec x}^{(t )}),\quad k = 1,2,\cdots,K $
单个样本的损失: $ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $
更新方程:
$ \mathbf{\vec a}_1^{(t)}=\mathbf{\vec b}_1+\mathbf W_1\mathbf{\vec h}^{(t-1)}+\mathbf U\mathbf{\vec x}^{(t)}\\ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec a}_1^{(t)})\\ \mathbf{\vec a}_2^{(t)}=\mathbf{\vec b}_2+\mathbf W_2\mathbf{\vec z}^{(t-1)}+\mathbf R\mathbf{\vec h}^{(t)}\\ \mathbf{\vec z}^{(t)}=\tanh(\mathbf{\vec a}_2^{(t)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec z}^{(t)}\right) $其中输入到隐状态的权重为 $ \mathbf U $ ,隐状态到输出的权重为 $ \mathbf V $ ,隐状态到隐状态的权重为 $ \mathbf W_1,\mathbf W_2,\mathbf R $ , $ \mathbf{\vec b}_1,\mathbf{\vec b}_2,\mathbf{\vec c} $ 为输入偏置向量和输出偏置向量。
在这三种变换中,各自使用一个独立的
MLP
(可能是深度的),如下图所示。该方法有一个主要问题:额外深度将导致从时间步 $ t $ 到时间步 $ t+1 $ 的最短路径变得更长,这可能导致优化困难而破坏学习效果。
在第二种方式的基础上,类似
ResNet
的思想,在 “隐状态-隐状态” 的路径中引入跳跃连接,从而缓解最短路径变得更长的问题。
4.3 LSTM 和 GRU
目前实际应用中最有效的序列模型是门控
RNN
,包括基于LSTM: long short-term memory
的循环网络,和基于门控循环单元GRU: gated recurrent unit
的循环网络。围绕门控
RNN
这一主题可以设计更多的变种。然而一些调查发现:这些LSTM
和GRU
架构的变种,在广泛的任务中难以明显的同时击败这两个原始架构。门控
RNN
的思路和渗漏单元一样:生成通过时间的快捷路径,使得梯度既不消失也不爆炸。- 可以手动选择常量的连接权重来实现这个目的,如跳跃连接。权重为固定的常量,且不随时间改变。
- 可以使用参数化的连接权重来实现这个目的,如渗漏单元。权重是样本的函数,且不随时间改变。
- 门控
RNN
将其推广为:连接权重在每个时间步都可能改变。权重是样本和时间的函数,随时间改变。
渗漏单元允许网络在较长持续时间内积累信息,但它有个缺点:有时候希望一旦某个信息被使用(即:被消费掉了),那么这个信息就要被遗忘(丢掉它,使得它不再继续传递)。
门控
RNN
能够学会何时清除信息,而不需要手动决定。
4.3.1 LSTM
LSTM
在手写识别、语音识别、机器翻译、为图像生成标题等领域获得重大成功。LSTM
循环网络除了外部的RNN
循环之外,还有内部的LSTM cell
循环(自环)。LSTM
的cell
代替了普通RNN
的隐单元,而LSTM
的 $ \mathbf{\vec h}^{(t)} $ 是cell
的一个输出。LSTM
引入cell
循环以保持梯度长时间持续流动。其中一个关键是:cell
循环的权重视上下文而定,而不是固定的。具体做法是:通过
gate
来控制这个cell
循环的权重,而这个gate
由上下文决定。- 注意:
cell
输出是 $ \mathbf{\vec h}^{(t)} $ ,而不是整个RNN
单元的输出 $ \mathbf{\vec o}^{(t)} $ 。 cell
之间的连接是通过 $ \mathbf{\vec h}^{(t)},\mathbf{\vec C}^{(t)} $ 来连接的。
- 注意:
LSTM
最重要的就是cell
状态 $ \mathbf{\vec C}^{(t)} $ ,它以水平线在图上方贯穿运行。sigmoid
函数 ( $ \sigma $ ) 的输出在0
到1
之间,描述每个部分有多少量可以通过。它起到门gate
的作用:0
表示不允许通过,1
表示允许全部通过,0~1
之间表示部分通过。LSTM
拥有三个门:遗忘门、输入门、输出门。遗忘门:控制了
cell
上一个状态 $ \mathbf{\vec C}^{(t-1)} $ 中,有多少信息进入当前状态 $ \mathbf{\vec C}^{(t)} $ 。与渗漏单元类似,
$ f_i^{(t)}=\sigma(b_i^{f}+\sum_jU_{i,j}^{f}x_j^{(t)}+\sum_jW_{i,j}^{f}h_j^{(t-1)}) $LSTM cell
也有线性自环。遗忘门 $ f_i^{(t)} $ 控制了自环的权重,而不再是常数 :写成向量形式为:( $ \sigma $ 为逐元素的
$ \mathbf{\vec f}^{(t)}=\sigma(\mathbf{\vec b}^{f}+\mathbf U^{f}\mathbf{\vec x}^{(t)}+\mathbf W^{f}\mathbf{\vec h}^{(t-1)}) $sigmoid
函数)其中: $ \mathbf{\vec b}^{f} $ 为遗忘门的偏置, $ \mathbf U^{f} $ 为遗忘门的输入权重, $ \mathbf W^{f} $ 为遗忘门的循环权重。
输入门:控制了输入 $ \mathbf{\vec x}^{(t)} $ 中,有多少信息进入
cell
当前状态 $ \mathbf{\vec C}^{(t)} $ 。输入门 $ g_i^{(t)} $ 的方程:
$ g_i^{(t)}=\sigma(b_i^{g}+\sum_jU_{i,j}^{g}x_j^{(t)}+\sum_jW_{i,j}^{g}h_j^{(t-1)}) $写成向量的形式为:( $ \sigma $ 为逐元素的
$ \mathbf{\vec g}^{(t)}=\sigma(\mathbf{\vec b}^{g}+\mathbf U^{g}\mathbf{\vec x}^{(t)}+\mathbf W^{g}\mathbf{\vec h}^{(t-1)}) $sigmoid
函数)其中: $ \mathbf{\vec b}^{g} $ 为输入门的偏置, $ \mathbf U^{g} $ 为输入门的输入权重, $ \mathbf W^{g} $ 为输入门的循环权重。
图中的 $ i_t $ 就是 $ \mathbf{\vec g}^{(t)} $
输出门:控制了
cell
状态 $ \mathbf{\vec C}^{(t)} $ 中,有多少会进入cell
的输出 $ \mathbf{\vec h}^{(t )} $ 。输出门 $ q_i^{(t)} $ 的更新方程:
$ q_i^{(t)}=\sigma(b_i^{o}+\sum_jU_{i,j}^{o}x_j^{(t)}+\sum_jW_{i,j}^{o}h_j^{(t-1)}) $写成向量的形式: ( $ \sigma $ 为逐元素的
$ \mathbf{\vec q}^{(t)}=\sigma(\mathbf{\vec b}^{o}+\mathbf U^{o}\mathbf{\vec x}^{(t)}+\mathbf W^{o}\mathbf{\vec h}^{(t-1)}) $sigmoid
函数)其中: $ \mathbf{\vec b}^{o} $ 为输出门的偏置, $ \mathbf U^{o} $ 为输出门的输入权重, $ \mathbf W^{o} $ 为输出门的循环权重。
cell
状态更新:cell
状态 $ \mathbf{\vec C}^{(t)} $ 由两部分组成:- 一部分来自于上一次的状态 $ \mathbf{\vec C}^{(t-1)} $ :它经过了遗忘门 $ \mathbf{\vec f}^{(t)} $ 的控制,使得只有部分状态进入下一次。
- 一部分来自于输入(包括 $ \mathbf{\vec x}^{(t)},\mathbf{\vec h}^{(t-1)} $ ):输入需要经过 $ \tanh $ 非线性层变换之后,然后经过输入门 $ \mathbf{\vec g}^{(t)} $ 的控制,使得只有部分输入能进入状态更新。
因此
$ C_i^{(t)}=f_i^{(t)}C_i^{(t-1)}+g_i^{(t)}\tanh\left(b_i+\sum_jU_{i,j}x_j^{(t)}+\sum_jW_{i,j}h_j^{(t-1)}\right) $cell
状态更新方程为:写成向量的形式为: ( $ \tanh $ 为逐元素的函数, $ \odot $ 为逐元素的向量乘积)
$ \mathbf{\vec C}^{(t)}=\mathbf{\vec f}^{(t)}\odot\mathbf{\vec C}^{(t-1)}+\mathbf{\vec g}^{(t)}\odot \tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)}) $其中: $ \mathbf {\vec b} $ 为
cell
的偏置, $ \mathbf U $ 为cell
的输入权重, $ \mathbf W $ 为cell
的循环权重。
$ h_i^{(t)}=\tanh(C_i^{(t)})q_i^{(t)} $cell
输出更新:cell
输出就是 $ \mathbf{\vec h}^{(t)} $ ,它是将cell
状态经过了 $ \tanh $ 非线性层之后,再通过输出门 $ \mathbf{\vec q}^{(t)} $ 控制输出的流量。写成向量的形式: ( $ \tanh $ 为逐元素的函数, $ \odot $ 为逐元素的向量乘积)
$ \mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec C}^{(t)})\odot\mathbf{\vec q}^{(t)} $一旦得到了
$ \text{forget gate:}\quad \mathbf{\vec f}^{(t)}=\sigma(\mathbf{\vec b}^{f}+\mathbf U^{f}\mathbf{\vec x}^{(t)}+\mathbf W^{f}\mathbf{\vec h}^{(t-1)})\\ \text{input gate:}\quad\mathbf{\vec g}^{(t)}=\sigma(\mathbf{\vec b}^{g}+\mathbf U^{g}\mathbf{\vec x}^{(t)}+\mathbf W^{g}\mathbf{\vec h}^{(t-1)}) \\ \text{output gate:}\quad\mathbf{\vec q}^{(t)}=\sigma(\mathbf{\vec b}^{o}+\mathbf U^{o}\mathbf{\vec x}^{(t)}+\mathbf W^{o}\mathbf{\vec h}^{(t-1)})\\ \text{cell state:}\quad \mathbf{\vec C}^{(t)}=\mathbf{\vec f}^{(t)}\odot\mathbf{\vec C}^{(t-1)}+\mathbf{\vec g}^{(t)}\odot \tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)})\\ \text{cell output:}\quad\mathbf{\vec h}^{(t)}=\tanh(\mathbf{\vec C}^{(t)})\odot\mathbf{\vec q}^{(t)}\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right)\\ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $cell
的输出 $ \mathbf{\vec h}^{(t)} $ ,则获取整个RNN
单元的输出 $ \mathbf{\vec o} $ 就和普通的RNN
相同。令节点 $ \mathbf{\vec s}^{(t)} = \mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)} $ ,根据激活函数的性质: $ \frac{d}{dx}\sigma(x) = \sigma(x)(1-\sigma(x)) $ , $ \frac{d}{dx}\tanh(x) = 1-\tanh(x)^2 $ ,则有:
考虑到 $ \mathbf{\vec h}^{( t )} $ 的后续节点为:当 $ \mathbf{\vec h}^{(t)} $ 为最后一个节点时,后续节点为 $ \mathbf{\vec s}^{(t)} $ ;当 $ \mathbf{\vec h}^{(t)} $ 不是最后一个节点时,后续节点为 $ \mathbf{\vec s}^{(t)} ,\mathbf{\vec f}^{(t+1)},\mathbf{\vec g}^{(t+1)},\mathbf{\vec q}^{(t+1)},\mathbf{\vec C}^{(t+1)} $ 。因此有:
$ \nabla_{\mathbf{\vec h}^{(t)}}L=\begin{cases} \left(\frac{\partial\mathbf{\vec s}^{(t)}}{\partial\mathbf{\vec h}^{(t)} }\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L,&t=\tau\\ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L+ \mathbf{\vec f}^{(t+1)}\odot(1-\mathbf{\vec f}^{(t+1)})\odot(\mathbf W ^{f})^T \nabla_{\mathbf{\vec f}^{(t+1)}}L\\ + \mathbf{\vec g}^{(t+1)}\odot(1-\mathbf{\vec g}^{(t+1)})\odot(\mathbf W ^{g})^T \nabla_{\mathbf{\vec g}^{(t+1)}}L\\ +\mathbf{\vec q}^{(t+1)}\odot(1-\mathbf{\vec q}^{(t+1)})\odot(\mathbf W ^{o})^T \nabla_{\mathbf{\vec q}^{(t+1)}}L\\ +\mathbf{\vec g}^{(t+1)}\odot \left(1-\tanh^2(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t+1)}+\mathbf W\mathbf{\vec h}^{(t)})\right)\mathbf W^T\nabla_{\mathbf{\vec C}^{(t+1)}}L,& t\lt \tau \end{cases} $考虑到:
$ \nabla_{\mathbf{\vec f}^{(t)}}L = \mathbf{\vec C}^{(t-1)}\odot \nabla_{\mathbf{\vec C}^{(t)}}L\\ \nabla_{\mathbf{\vec g}^{(t)}}L =\tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)})\odot \nabla_{\mathbf{\vec C}^{(t)}}L\\ \nabla_{\mathbf{\vec q}^{(t)}}L = \tanh(\mathbf{\vec C}^{(t)})\odot \nabla_{\mathbf{\vec h}^{(t)}}L $因此有:
$ \nabla_{\mathbf{\vec h}^{(t)}}L=\begin{cases} \left(\frac{\partial\mathbf{\vec s}^{(t)}}{\partial\mathbf{\vec h}^{(t)} }\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L,&t=\tau\\ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L+ \mathbf{\vec f}^{(t+1)}\odot(1-\mathbf{\vec f}^{(t+1)})\odot(\mathbf W ^{f})^T \mathbf{\vec C}^{(t)}\odot \nabla_{\mathbf{\vec C}^{(t+1)}}L\\ + \mathbf{\vec g}^{(t+1)}\odot(1-\mathbf{\vec g}^{(t+1)})\odot(\mathbf W ^{g})^T \tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t+1)}+\mathbf W\mathbf{\vec h}^{(t)})\odot \nabla_{\mathbf{\vec C}^{(t+1)}}L\\ +\mathbf{\vec q}^{(t+1)}\odot(1-\mathbf{\vec q}^{(t+1)})\odot(\mathbf W ^{o})^T \tanh(\mathbf{\vec C}^{(t+1)})\odot \nabla_{\mathbf{\vec h}^{(t+1)}}L\\ +\mathbf{\vec g}^{(t+1)}\odot \left(1-\tanh^2(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t+1)}+\mathbf W\mathbf{\vec h}^{(t)})\right)\mathbf W^T\nabla_{\mathbf{\vec C}^{(t+1)}}L,& t\lt \tau \end{cases} $- 由于 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中存在常量部分 $ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(\tau)}}L $ ,因此
LSTM
可以缓解梯度消失。 - 由于各种门的存在,因此 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中的非常量部分会被缩小,因此可以缓解梯度爆炸。
- 由于 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中存在常量部分 $ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(\tau)}}L $ ,因此
考虑到 $ \mathbf{\vec C^{(t)}} $ 的后续节点为:当 $ \mathbf{\vec C}^{(t)} $ 为最后一个节点时,后续节点为 $ \mathbf{\vec h}^{(t)} $ ;当 $ \mathbf{\vec C}^{(t)} $ 不是最后一个节点时,后续节点为 $ \mathbf{\vec h}^{(t)} ,\mathbf{\vec C}^{(t+1)} $ 。因此有:
$ \nabla_{\mathbf{\vec C}^{(t)}}L=\begin{cases} \left(1- \tanh^2(\mathbf{\vec C}^{(t)})\right)\odot\mathbf{\vec q}^{(t)}\odot \nabla_{\mathbf{\vec h}^{(t)}}L ,&t=\tau\\ \left(1- \tanh^2(\mathbf{\vec C}^{(t)})\right)\odot\mathbf{\vec q}^{(t)}\odot \nabla_{\mathbf{\vec h}^{t)}}L+ \mathbf{\vec f}^{(t+1)}\odot \nabla_{\mathbf{\vec C}^{(t+1)}}L,& t\lt \tau \end{cases}\\ $考虑到 $ \mathbf V, \mathbf{\vec c} $ 对于每个输出 $ \mathbf{\vec o}^{(1)},\cdots,\mathbf{\vec o}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec c}}L=\sum_{t=1}^{t=\tau}\left(\frac{\partial \mathbf{\vec s}^{(t)}}{\partial \mathbf{\vec c}^{(t)}}\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\sum_{t=1}^{t=\tau}\nabla_{\mathbf{\vec s}^{(t)}}L\\ \nabla_{V_{i,:}}L=\sum_{t=1}^{t=\tau}\left(\frac{\partial L}{\partial s_i^{(t)}}\right)\nabla_{V_{i,:}^{(t)}} s_i^{(t)}=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec s}^{(t)}}L)_i\mathbf{\vec h}^{(t)} $其中 $ (\nabla_{\mathbf{\vec s}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec s}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U, \mathbf W, \mathbf{\vec b} $ 对于每个状态 $ \mathbf{\vec C}^{(1)},\cdots,\mathbf{\vec C}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b}}L = \sum_{t=1}^\tau \mathbf{\vec g}^{(t)}\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)})\right)\odot \nabla _{\mathbf{\vec C}^{(t)}}L\\ \nabla_{U_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec C}^{(t)}}L)_i\mathbf{\vec g}^{(t)}\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)})\right)\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec C}^{(t)}}L)_i\mathbf{\vec g}^{(t)}\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)})\right)\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec C}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec C}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U^f, \mathbf W^f,\mathbf{\vec b}^f $ 对于每个遗忘门 $ \mathbf{\vec f}^{(1)},\cdots,\mathbf{\vec f}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b^f}}L = \sum_{t=1}^\tau \mathbf{\vec f}^{(t)}\odot (1-\mathbf{\vec f}^{(t)})\odot \nabla _{\mathbf{\vec f}^{(t)}}L\\ \nabla_{U^f_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec f}^{(t)}}L)_i\mathbf{\vec f}^{(t)}\odot (1- \mathbf{\vec f}^{(t)})\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W^f_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec f}^{(t)}}L)_i\mathbf{\vec f}^{(t)}\odot (1- \mathbf{\vec f}^{(t)})\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec f}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec f}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U^g, \mathbf W^g,\mathbf{\vec b}^g $ 对于每个输入门 $ \mathbf{\vec g}^{(1)},\cdots,\mathbf{\vec g}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b^g}}L = \sum_{t=1}^\tau \mathbf{\vec g}^{(t)}\odot (1-\mathbf{\vec g}^{(t)})\odot \nabla _{\mathbf{\vec g}^{(t)}}L\\ \nabla_{U^g_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec g}^{(t)}}L)_i\mathbf{\vec g}^{(t)}\odot (1- \mathbf{\vec g}^{(t)})\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W^g_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec g}^{(t)}}L)_i\mathbf{\vec g}^{(t)}\odot (1- \mathbf{\vec g}^{(t)})\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec g}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec g}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U^o, \mathbf W^o,\mathbf{\vec b}^o $ 对于每个输出门 $ \mathbf{\vec q}^{(1)},\cdots,\mathbf{\vec q}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b^o}}L = \sum_{t=1}^\tau \mathbf{\vec q}^{(t)}\odot (1-\mathbf{\vec q}^{(t)})\odot \nabla _{\mathbf{\vec q}^{(t)}}L\\ \nabla_{U^o_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec q}^{(t)}}L)_i\mathbf{\vec q}^{(t)}\odot (1- \mathbf{\vec q}^{(t)})\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W^o_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec q}^{(t)}}L)_i\mathbf{\vec q}^{(t)}\odot (1- \mathbf{\vec q}^{(t)})\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec q}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec q}^{(t)}}L $ 的第 $ i $ 个分量。
也可以选择使用
cell
状态 $ \mathbf{\vec C}^{(t)} $ 作为这些门的额外输入。此时 $ \mathbf{\vec f}^{(t)},\mathbf{\vec g}^{(t)},\mathbf{\vec q}^{(t)} $ 就多了额外的权重参数,这些参数对应于 $ \mathbf{\vec C}^{(t-1)} $ 的权重和偏置。
4.3.2 GRU
门控循环单元
GRU
比LSTM
模型更简单:GRU
的单个门控单元同时作为遗忘门和输入门,整个GRU
模型只有两个门:更新门、复位门。GRU
不再区分cell
的状态 $ \mathbf{\vec C} $ 和cell
的输出 $ \mathbf{\vec h} $ 。
更新门:控制了新的信息 $ \tilde {\mathbf {\vec h}}^{(t)} $ ( 由 $ \mathbf{\vec x^{(t)}},\mathbf{\vec h^{(t-1)}} $ 生成)、旧的信息 $ \mathbf{\vec h^{(t-1)}} $ 中各有多少信息进入了 $ \mathbf{\vec h}^{(t)} $ 。
更新门 $ z_i^{(t)} $ 的更新方程:
$ z_i^{(t)}=\sigma\left(b_i^{z}+\sum_jU^{z}_{i,j}x_j^{(t)}+\sum_jW_{i,j}^zh_j^{(t-1)}\right) $写成向量的形式为:( $ \sigma $ 为逐元素的
$ \mathbf{\vec z}^{(t)}=\sigma(\mathbf{\vec b}^{z}+\mathbf U^{z}\mathbf{\vec x}^{(t)}+\mathbf W^{z}\mathbf{\vec h}^{(t-1)}) $sigmoid
函数)其中: $ \mathbf{\vec b}^{z} $ 为更新门的偏置, $ \mathbf U^{z} $ 为更新门的输入权重, $ \mathbf W^{z} $ 为更新门的循环权重。
复位门:控制了新的信息 $ \tilde {\mathbf {\vec h}}^{(t)} $ 中, $ \mathbf{\vec x}^{(t)},\mathbf{\vec h}^{(t-1)} $ 之间的比例。它表示在新的信息中,旧的信息多大程度上影响新的信息。如果 $ r=0 $ ,则旧的信息不影响新的信息,可以理解为复位。
复位门 $ r_i^{(t)} $ 的更新方程:
$ r_i^{(t)}=\sigma\left(b_i^{r}+\sum_jU^{r}_{i,j}x_j^{(t)}+\sum_jW_{i,j}^rh_j^{(t-1)}\right) $写成向量的形式为:( $ \sigma $ 为逐元素的
$ \mathbf{\vec r}^{(t)}=\sigma(\mathbf{\vec b}^{r}+\mathbf U^{r}\mathbf{\vec x}^{(t)}+\mathbf W^{r}\mathbf{\vec h}^{(t-1)}) $sigmoid
函数)其中: $ \mathbf{\vec b}^{r} $ 为复位门的偏置, $ \mathbf U^{r} $ 为复位门的输入权重, $ \mathbf W^{r} $ 为复位门的循环权重。
cell
输出:cell
输出就是 $ \mathbf{\vec h}^{(t)} $ 。
$ h_i^{(t)}=z_i^{(t)}h_i^{(t-1)}+(1-z_i^{(t)})\tanh\left(b_i+\sum_jU_{i,j}x_j^{(t)}+\sum_jW_{i,j}r_j^{(t)}h_j^{(t-1)}\right) $cell
更新方程:写成向量的形式:(其中 $ \odot $ 为逐元素的向量乘积; $ \tanh $ 为逐元素的函数)
$ \mathbf{\vec h}^{(t)}=\mathbf{\vec z}^{(t)}\odot\mathbf{\vec h}^{(t-1)}+(1-\mathbf{\vec z}^{(t)})\odot\tanh(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)}) $令 $ \tilde {\mathbf {\vec h}}^{(t)}= \tanh(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)}) $ ,它刻画了本次的更新。于是
$ \mathbf{\vec h}^{(t)}=\mathbf{\vec z}^{(t)}\odot\mathbf{\vec h}^{(t-1)}+(1-\mathbf{\vec z}^{(t)})\odot\tilde {\mathbf {\vec h}}^{(t)} $cell
的输出更新方程为:其中: $ \mathbf {\vec b} $ 为
cell
的偏置, $ \mathbf U $ 为cell
的输入权重, $ \mathbf W $ 为cell
的循环权重。一旦得到了
$ \text{update gate:}\quad \mathbf{\vec z}^{(t)}=\sigma(\mathbf{\vec b}^{z}+\mathbf U^{z}\mathbf{\vec x}^{(t)}+\mathbf W^{z}\mathbf{\vec h}^{(t-1)})\\ \text{reset gate:}\quad\mathbf{\vec r}^{(t)}=\sigma(\mathbf{\vec b}^{r}+\mathbf U^{r}\mathbf{\vec x}^{(t)}+\mathbf W^{r}\mathbf{\vec h}^{(t-1)}) \\ \text{cell output:}\quad\mathbf{\vec h}^{(t)}=\mathbf{\vec z}^{(t)}\odot\mathbf{\vec h}^{(t-1)}+(1-\mathbf{\vec z}^{(t)})\odot\tanh(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)})\\ \mathbf{\vec o}^{(t)}=\text{softmax}\left(\mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)}\right)\\ L = - \sum_{t=1}^{\tau}\sum_{k=1}^K \mathbb I_\left({k = y^{(t)}}\right) \log o_{k}^{(t)} $cell
的输出 $ \mathbf{\vec h}^{(t)} $ ,则获取整个RNN
单元的输出 $ \mathbf{\vec o} $ 就和普通的RNN
相同。令节点 $ \mathbf{\vec s}^{(t)} = \mathbf{\vec c}+\mathbf V\mathbf{\vec h}^{(t)} $ ,根据激活函数的性质: $ \frac{d}{dx}\sigma(x) = \sigma(x)(1-\sigma(x)) $ , $ \frac{d}{dx}\tanh(x) = 1-\tanh(x)^2 $ ,则有:
考虑到 $ \mathbf{\vec h}^{( t )} $ 的后续节点为:当 $ \mathbf{\vec h}^{(t)} $ 为最后一个节点时,后续节点为 $ \mathbf{\vec s}^{(t)} $ ;当 $ \mathbf{\vec h}^{(t)} $ 不是最后一个节点时,后续节点为 $ \mathbf{\vec s}^{(t)} ,\mathbf{\vec z}^{(t+1)},\mathbf{\vec r}^{(t+1)},\mathbf{\vec h}^{(t+1)} $ 。记 $ \mathbf{\vec e}^{(t)} =\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)} $ ,因此有:
$ \nabla_{\mathbf{\vec h}^{(t)}}L=\begin{cases} \left(\frac{\partial\mathbf{\vec s}^{(t)}}{\partial\mathbf{\vec h}^{(t)} }\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L,&t=\tau\\ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L+ \mathbf{\vec z}^{(t+1)}\odot(1-\mathbf{\vec z}^{(t+1)})\odot(\mathbf W ^{z})^T \nabla_{\mathbf{\vec z}^{(t+1)}}L\\ + \mathbf{\vec r}^{(t+1)}\odot(1-\mathbf{\vec r}^{(t+1)})\odot(\mathbf W ^{r})^T \nabla_{\mathbf{\vec r}^{(t+1)}}L+\\ \left(\mathbf{\vec z}^{(t+1)}+ (1-\mathbf{\vec z}^{(t+1)})\odot \left(1-\tanh^2(\mathbf{\vec e}^{(t+1)})\right)\odot \mathbf W \mathbf{\vec r}^{(t+1)}\right)\nabla_{\mathbf{\vec h}^{(t+1)}}L,& t\lt \tau \end{cases} $考虑到:
$ \nabla_{\mathbf{\vec z}^{(t)}}L = \left(\mathbf{\vec h}^{(t-1)} - \tanh(\mathbf{\vec e}^{(t)})\right)\odot \nabla_{\mathbf{\vec h}^{(t)}}L\\ \nabla_{\mathbf{\vec r}^{(t)}}L = (1-\mathbf{\vec z}^{(t)})\odot \mathbf W^T\left(1-\tanh^2(\mathbf{\vec e}^{(t)})\right)\odot \mathbf{\vec h}^{(t-1)} \nabla_{\mathbf{\vec h}^{(t)}}L $因此有:
$ \nabla_{\mathbf{\vec h}^{(t)}}L=\begin{cases} \left(\frac{\partial\mathbf{\vec s}^{(t)}}{\partial\mathbf{\vec h}^{(t)} }\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L,&t=\tau\\ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(t)}}L+ \mathbf{\vec z}^{(t+1)}\odot(1-\mathbf{\vec z}^{(t+1)})\odot(\mathbf W ^{z})^T \left(\mathbf{\vec h}^{(t)} - \tanh(\mathbf{\vec e}^{(t+1)})\right)\odot \nabla_{\mathbf{\vec h}^{(t+1)}}L\\ + \mathbf{\vec r}^{(t+1)}\odot(1-\mathbf{\vec r}^{(t+1)})\odot(\mathbf W ^{r})^T (1-\mathbf{\vec z}^{(t+1)})\\\odot \mathbf W^T\left(1-\tanh^2(\mathbf{\vec e}^{(t+1)})\right)\odot \mathbf{\vec h}^{(t)} \nabla_{\mathbf{\vec h}^{(t+1)}}L+\\ \left(\mathbf{\vec z}^{(t+1)}+ (1-\mathbf{\vec z}^{(t+1)})\odot \left(1-\tanh^2(\mathbf{\vec e}^{(t+1)})\right)\odot \mathbf W \mathbf{\vec r}^{(t+1)}\right)\nabla_{\mathbf{\vec h}^{(t+1)}}L,& t\lt \tau \end{cases} $- 由于 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中存在常量部分 $ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(\tau)}}L $ ,因此
GRU
可以缓解梯度消失。 - 由于各种门的存在,因此 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中的非常量部分会被缩小,因此可以缓解梯度爆炸。
- 由于 $ \nabla_{\mathbf{\vec h}^{(t )}}L $ 中存在常量部分 $ \mathbf V^{T}\nabla_{\mathbf{\vec s}^{(\tau)}}L $ ,因此
考虑到 $ \mathbf V, \mathbf{\vec c} $ 对于每个输出 $ \mathbf{\vec o}^{(1)},\cdots,\mathbf{\vec o}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec c}}L=\sum_{t=1}^{t=\tau}\left(\frac{\partial \mathbf{\vec s}^{(t)}}{\partial \mathbf{\vec c}^{(t)}}\right)^{T}\nabla_{\mathbf{\vec s}^{(t)}}L=\sum_{t=1}^{t=\tau}\nabla_{\mathbf{\vec s}^{(t)}}L\\ \nabla_{V_{i,:}}L=\sum_{t=1}^{t=\tau}\left(\frac{\partial L}{\partial s_i^{(t)}}\right)\nabla_{V_{i,:}^{(t)}} s_i^{(t)}=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec s}^{(t)}}L)_i\mathbf{\vec h}^{(t)} $其中 $ (\nabla_{\mathbf{\vec s}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec s}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U, \mathbf W, \mathbf{\vec b} $ 对于每个状态 $ \mathbf{\vec h}^{(1)},\cdots,\mathbf{\vec h}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b}}L = \sum_{t=1}^\tau (1-\mathbf{\vec z}^{(t)})\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)})\right)\odot \nabla _{\mathbf{\vec h}^{(t)}}L\\ \nabla_{U_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec h}^{(t)}}L)_i (1-\mathbf{\vec z}^{(t)})\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)})\right)\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec h}^{(t)}}L)_i(1-\mathbf{\vec z}^{(t)})\odot \left(1- \tanh^2(\mathbf{\vec b}+\mathbf U\mathbf{\vec x}^{(t)}+\mathbf W\mathbf{\vec r}^{(t)}\odot \mathbf{\vec h}^{(t-1)})\right)\odot\mathbf{\vec r}^{(t)}\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec h}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec h}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U^z, \mathbf W^z,\mathbf{\vec b}^z $ 对于每个复位门 $ \mathbf{\vec z}^{(1)},\cdots,\mathbf{\vec z}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b^z}}L = \sum_{t=1}^\tau \mathbf{\vec z}^{(t)}\odot (1-\mathbf{\vec z}^{(t)})\odot \nabla _{\mathbf{\vec z}^{(t)}}L\\ \nabla_{U^z_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec z}^{(t)}}L)_i\mathbf{\vec z}^{(t)}\odot (1- \mathbf{\vec z}^{(t)})\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W^z_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec z}^{(t)}}L)_i\mathbf{\vec z}^{(t)}\odot (1- \mathbf{\vec z}^{(t)})\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec z}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec z}^{(t)}}L $ 的第 $ i $ 个分量。
考虑到 $ \mathbf U^r, \mathbf W^r,\mathbf{\vec r}^r $ 对于每个更新门 $ \mathbf{\vec r}^{(1)},\cdots,\mathbf{\vec r}^{(\tau)} $ 都有贡献,则有:
$ \nabla _{\mathbf{\vec b^r}}L = \sum_{t=1}^\tau \mathbf{\vec r}^{(t)}\odot (1-\mathbf{\vec r}^{(t)})\odot \nabla _{\mathbf{\vec r}^{(t)}}L\\ \nabla_{U^r_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec r}^{(t)}}L)_i\mathbf{\vec r}^{(t)}\odot (1- \mathbf{\vec r}^{(t)})\odot \mathbf {\vec x}^{(t)}\\ \nabla_{W^r_{i,:}}L=\sum_{t=1}^{t=\tau}(\nabla_{\mathbf{\vec r}^{(t)}}L)_i\mathbf{\vec r}^{(t)}\odot (1- \mathbf{\vec r}^{(t)})\odot \mathbf {\vec h}^{(t-1)} $其中 $ (\nabla_{\mathbf{\vec r}^{(t)}}L)_i $ 表示 $ \nabla_{\mathbf{\vec r}^{(t)}}L $ 的第 $ i $ 个分量。
4.3.3 讨论
在
LSTM
与GRU
中有两种非线性函数:sigmoid
与tanh
。sigmoid
用于各种门,是因为它的阈值为0~1
,可以很好的模拟开关的关闭程度。tanh
用于激活函数,是因为它的阈值为 -1~1,它的梯度的阈值为 0~1。如果使用
sigmoid
作为激活函数,则其梯度范围为 0~0.5,容易发生梯度消失。如果使用
relu
作为激活函数,则前向传播时,信息容易爆炸性增长。另外
relu
激活函数也会使得输出只有大于等于0
的部分。
前面给出的
$ \mathbf{\vec C}^{(t)}=\mathbf{\vec f}^{(t)}\odot\mathbf{\vec C}^{(t-1)}+\mathbf{\vec g}^{(t)}\odot \tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)}+\mathbf W\mathbf{\vec h}^{(t-1)}) $LSTM
和GRU
中, $ \mathbf {\vec x}^{(t)},\mathbf{\vec h}^{(t-1)} $ 是通过feature map
直接相加,如LSTM
中的状态更新方程:事实上,也可以通过
$ \mathbf{\vec C}^{(t)}=\mathbf{\vec f}^{(t)}\odot\mathbf{\vec C}^{(t-1)}+\mathbf{\vec g}^{(t)}\odot \tanh(\mathbf{\vec b}+\mathbf U\mathbf {\vec x}^{(t)} : \mathbf W\mathbf{\vec h}^{(t-1)}) $feature map
进行拼接,如:其中 $ : $ 表示将两个向量进行拼接。
4.4 编码-解码架构
前面介绍的多长度输入序列的模式中,输出序列和输入序列长度相同。实际任务中,如:语音识别、机器翻译、知识问答等任务,输出序列和输入序列长度不相等。
编码-解码
架构就是为了解决这类问题。设输入序列为 $ \{\mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(\tau_x)}\} $ ,输出序列为 $ \{\mathbf{\vec y}^{(1)},\mathbf{\vec y}^{(2)},\cdots,\mathbf{\vec y}^{(\tau_y)}\} $ 。长度 $ \tau_x \ne \tau _y $ 。设
C
为输入的一个表达representation
,包含了输入序列的有效信息。- 它可能是一个向量,也可能是一个固定长度的向量序列。
- 如果
C
是一个向量序列,则它和输入序列的区别在于:序列C
是定长的、较短的;而输入序列是不定长的、较长的。
整个
编码-解码
结构分为:编码器,解码器。编码器(也叫作读取器,或者输入
RNN
):处理输入序列。编码器的最后一个状态 $ \mathbf{\vec h}^{(\tau_x)} $ 通常就是输入序列的表达
C
, 并且作为解码器的输入向量。解码器(也叫作写入器,或者输出
RNN
):处理输入的表达C
。解码器有三种处理
C
的方式:输入C
作为每个时间步的输入、输入C
作为初始状态 $ \mathbf{\vec h}^{(0)} $ 且每个时间步没有额外的输入、结合上述两种方式。训练时,编码器和解码器并不是单独训练,而是共同训练以最大化 :
$ \log P(\mathbf{\vec y}^{(1)},\mathbf{\vec y}^{(2)},\cdots,\mathbf{\vec y}^{(\tau_y)}\mid \mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(\tau_x)}) $
编码-解码架构中:
- 输入序列长度 $ \tau_x $ 和输出序列长度 $ \tau_y $ 可以不同。
- 对于编码器与解码器隐状态是否具有相同尺寸并没有限制,它们是相互独立设置的。
编码-解码架构的主要缺点:编码器
RNN
输出的上下文C
的维度太小,难以恰当的概括一个长的输入序列的完整信息。可以通过引入
attention
机制来缓解该问题。
4.5 attention
attention
是一种提升encoder - decoder
模型效果的机制,一般称作attention mechanism
。attention
被广泛用于机器翻译、语音识别、图像标注Image Caption
等领域。如:机器翻译中,为句子中的每个词赋予不同的权重。attention
本身可以理解为一种对齐关系,给出了模型输入、输出之间的对齐关系,解释了模型到底学到了什么知识。在机器翻译中,解释了输入序列的不同位置对输出序列的影响程度。如下图所示为机器翻译中,输入-输出的
attention
矩阵。在图像标注中,解释了图片不同区域对输出文本序列的影响程度。如下图所示为图像标注中,影响输出单词的图像块。
设输入序列为 $ \{\mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(\tau_x)}\} $ ,输出序列为 $ \{\mathbf{\vec y}^{(1)},\mathbf{\vec y}^{(2)},\cdots,\mathbf{\vec y}^{(\tau_y)}\} $ ,长度 $ \tau_x \ne \tau _y $ 。设
encoder
的隐向量为 $ \mathbf{\vec h}_1,\mathbf{\vec h}_2,\cdots $ ,decoder
的隐向量为 $ \mathbf{\vec s}_1,\mathbf{\vec s}_2,\cdots $ 。对于传统的
encoder-decoder
模型,decoder
的输入只有一个向量,该向量就是输入序列经过encoder
编码的上下文向量 $ \mathbf{\vec c} $ 。通常将
encoder
的最后一个隐单元的隐向量 $ \mathbf{\vec h}_{\tau_x} $ 作为上下文向量。对于
attention encoder-decoder
模型,decoder
的输入是一个向量序列,序列长度为 $ \tau_y $ 。decoder
位置 $ i $ 的输入是采用了attention
机制的上下文向量 $ \mathbf{\vec c}_i $ ,不同位置的上下文向量不同。上下文向量 $ \mathbf{\vec c}_i $ 由
encoder
的所有隐向量加权得到: $ \mathbf{\vec c}_i = \sum_{t=1}^{\tau_x} \alpha_{i,t} \mathbf{\vec h}_t $ 。其中 $ \sum_{t=1}^{\tau_x} \alpha_{i,t} =1,\quad \alpha_{i,t}\ge 0 $ 。
权重 $ \alpha_{i,t} $ 刻画了:在对第 $ i $ 个输出进行解码时,第 $ t $ 个输入的重要程度。
一个直觉上的方法是:首先计算 $ \mathbf{\vec s}_{i-1} $ 与 $ \mathbf{\vec h}_t $ 的相关性,然后对所有的 $ t=1,2,\cdots,\tau_x $ 归一化即可得到权重系数。即:
$ e_{i,t} = \text{score}(\mathbf{\vec s}_{i-1},\mathbf{\vec h}_t),\quad \alpha_{i,t} = \frac{\exp(e_{i,t})}{\sum_{t^\prime=1}^{\tau_x}\exp(e_{i,t^\prime})},\quad t=1,2,\cdots,\tau_x $其中
$ \text{score}(\mathbf{\vec s}_{i-1},\mathbf{\vec h}_t) = \begin{cases} \frac{\mathbf{\vec s}_{i-1} \cdot \mathbf{\vec h}_t}{||\mathbf{\vec s}_{i-1}||\times||\mathbf{\vec h}_t||},& \text{cosin}\\ \mathbf{\vec s}_{i-1} \cdot \mathbf{\vec h}_t,& \text{dot}\\ \frac{\mathbf{\vec s}_{i-1} \cdot \mathbf{\vec h}_t}{\sqrt n},& \text{scaled-dot}\\ \mathbf{\vec s}_{i-1}^T \mathbf W_{\alpha} \mathbf{\vec h}_t,& \text{general}\\ \mathbf{\vec v}_\alpha^T \tanh(\mathbf W_\alpha [\mathbf{\vec s}_{i-1} : \mathbf{\vec h}_t]),& \text{concat} \end{cases} $score
由多种计算方式,不同的计算方式代表不同的attention
模型( $ \mathbf{\vec v}_\alpha,\mathbf W_\alpha $ 为待学习的参数,n
为向量的维度):
4.5.1 local attention
上述的
attention
机制中为了计算上下文向量 $ \mathbf{\vec c}_i $ , 需要考虑encoder
的所有隐向量。当输入序列较长时(如一段话或一篇文章),计算效率较低。
$ p_i = \tau_x\times \text{sigmoid}\left(\mathbf{\vec v}_p\cdot \tanh(\mathbf W_p\mathbf{\vec s}_{i-1})\right)\\ e_{i,t} = \text{score}(\mathbf{\vec s}_{i-1},\mathbf{\vec h}_t)\exp\left(-\frac{(t-p_i)^2}{2d^2}\right) $local attention
在计算上下文向量 $ \mathbf{\vec c}_i $ 时只需要考虑encoder
的部分隐向量:首选预测encoder
端对齐的位置 $ p_i $ ,然后基于位置 $ p_i $ 选择一个窗口来计算上下文向量 $ \mathbf{\vec c}_i $ 。其中 $ \mathbf{\vec v}_p,\mathbf W_p $ 为待学习的参数, $ d $ 为人工指定的固定常量。
虽然
local attention
可以提高计算效率,但是会带来两个问题:- 当
encoder
的输入序列长度 $ \tau_x $ 并不是很长时,计算量并没有显著减小。 - 位置 $ p_i $ 的预测并不是非常准确,这就直接影响了计算
attention
的准确性。
`
- 当
4.5.2 self attention
传统的
attention
是基于encoder
端和decoder
端的隐向量来计算attention
的,得到的是输入序列的每个input
和输出序列的每个output
之间的依赖关系。self attention
计算三种attention
:- 在
encoder
端计算自身的attention
,捕捉input
之间的依赖关系。 - 在
decoder
端计算自身的attention
,捕捉output
之间的依赖关系。 - 将
encoder
端得到的self attention
加入到decoder
端得到的attention
中,捕捉输入序列的每个input
和输出序列的每个output
之间的依赖关系。
- 在
设输入序列为 $ \{\mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(\tau_x)}\} $ ,输出序列为 $ \{\mathbf{\vec y}^{(1)},\mathbf{\vec y}^{(2)},\cdots,\mathbf{\vec y}^{(\tau_y)}\} $ ,长度 $ \tau_x \ne \tau _y $ 。
encoder
端的self attention
:首先经过 $ \mathbf W_{k}^{encode} $ 映射得到
key
向量序列 $ \{\mathbf{\vec k}_{1}^{encode},\cdots,\mathbf{\vec k}_{\tau_x}^{encode}\} $ 、经过 $ \mathbf W_q^{encode} $ 映射得到query
向量序列 $ \{\mathbf{\vec q}_{1}^{encode},\cdots,\mathbf{\vec q}_{\tau_x}^{encode}\} $ 。然后计算归一化的
$ e_{i,t} = \text{score}(\mathbf{\vec q}_{i}^{encode},\mathbf{\vec k}_t^{encode}),\quad v_{i,t}^{encode} = \frac{\exp(e_{i,t})}{\sum_{t^\prime=1}^{\tau_x}\exp(e_{i,t^\prime})},\quad t=1,2,\cdots,\tau_x $self attention
:其中 $ \mathbf{\vec v}_i^{encode}=(v_{i,1}^{encode},\cdots,v_{i,\tau_x}^{encode}) $ 表示各输入与第 $ i $ 个输入的相关因子, $ i=1,2,\cdots,\tau_x $ 。
最后得到经过加权的
encoder
输出向量: $ \mathbf{\vec c}^{encode}_i = \sum_{t=1}^{\tau_x} v_{i,t}^{encode}\times \mathbf{\vec x}^{(t)} $ 。
decoder
端的self attention
:考虑到解码时 $ s $ 时刻不知道 $ s $ 时刻及其之后的结果,因此仅考虑 $ s $ 时刻之前的attention
,这被称作masked attention
。因此对于时刻 $ s $ :首先经过 $ \mathbf W_{k}^{decode} $ 映射得到
key
向量序列 $ \{\mathbf{\vec k}_{1}^{decode},\cdots,\mathbf{\vec k}_{s-1}^{decode}\} $ 、经过 $ \mathbf W_q^{decode} $ 映射得到query
向量序列 $ \{\mathbf{\vec q}_{1}^{decode},\cdots,\mathbf{\vec q}_{s-1}^{decode}\} $ 。然后计算归一化的
$ \tilde e_{i,t} = \text{score}(\mathbf{\vec q}_{i}^{decode},\mathbf{\vec k}_t^{decode}),\quad v_{i,t}^{decode} = \frac{\exp(\tilde e_{i,t})}{\sum_{t^\prime=1}^{s-1}\exp(\tilde e_{i,t^\prime})},\quad t=1,2,\cdots,s-1 $self attention
:其中 $ \mathbf{\vec v}_i^{decode}=(v_{i,1}^{decode},\cdots,v_{i,s-1}^{decode}) $ 表示各输入与第 $ i $ 个输入的相关因子, $ i=1,2,\cdots, s-1 $ 。
最后得到经过加权的
encoder
输出向量: $ \mathbf{\vec c}^{decode}_i = \sum_{t=1}^{s-1} v_{i,t}^{decode}\times \mathbf{\vec y}^{(t)} $ 。
encoder
和decoder
的attention
:计算归一化的
$ \hat e_{i,t} = \text{score}(\mathbf{\vec c}_{i}^{decode},\mathbf{\vec c}_t^{encode}),\quad v_{i,t} = \frac{\exp(\hat e_{i,t})}{\sum_{t^\prime=1}^{\tau_x}\exp(\hat e_{i,t^\prime})},\quad t=1,2,\cdots,\tau_x $self attention
:其中 $ \mathbf{\vec v}_i =(v_{i,1} ,\cdots,v_{i,\tau_x} ) $ 表示各输入与第 $ i $ 个输出的相关因子, $ i=1,2,\cdots,s-1 $ 。
最后得到经过加权的
attention
上下文向量: $ \mathbf{\vec c}_i = \sum_{t=1}^{\tau_x} v_{i,t} \times \mathbf{\vec c}_i^{encode} $ 。
最后将上下文向量 $ \mathbf{\vec c}_i $ 作为一个前馈神经网络的输入,其输出就是 $ \mathbf{\vec y}^{(s)} $ 。
上述
self attention
机制完全抛弃了RNN
的架构,著名的Transformer
架构就是基于它来构建的。self attention
未能考虑到输入序列的先后顺序,因此Transformer
架构中引入了位置embedding
来解决该问题。理论上序列的 $ \{\mathbf{\vec x}^{(1)},\mathbf{\vec x}^{(2)},\cdots,\mathbf{\vec x}^{(\tau_x)}\} $ 的
$ e_{i,j} = \text{score}(\mathbf{\vec x}^{(i)} ,\mathbf{\vec x}^{(j)} ),\quad v_{i,j} = \frac{\exp(e_{i,j})}{\sum_{j^\prime=1}^{\tau_x}\exp(e_{i,j^\prime})},\quad j=1,2,\cdots,\tau_x $self attention
只需要简单计算:引入两个映射矩阵是为了更好的泛化:
attention
并不仅仅考虑序列的原始信息,而是考虑了从序列中抽取的信息。
4.5.3 Hierarchical attention
在论文
《Hierarchical Attention Networks for Document Classification》
中提出了分层attention
用于文档分类。论文提出了两个层次的attention
:- 第一个层次是对句子中每个词进行
attention
,即word attention
。 - 第二个层次是对文档中每个句子进行
attention
,即sentence attention
。
- 第一个层次是对句子中每个词进行
层次
attention
涉及到四个部分:word encoder
:(对于句子 $ i $ )word embedding
: $ \mathbf{\vec x}^{(t)}_i = \mathbf W_e^T \text{word}^{(t)}_i,t=1,2,\cdots,T $ 。
$ \overrightarrow{\mathbf h}_i^{(t)} = \overrightarrow{\text{GRU}}(\mathbf{\vec x}^{(t)}_i),\quad \overleftarrow{\mathbf h}_i^{(t)} = \overleftarrow{\text{GRU}}(\mathbf{\vec x}^{(t)}_i) $GRU
隐向量(原始论文中采用双向GRU
):
$ \mathbf h_i^{(t)}=\left[\overrightarrow{\mathbf h}_i^{(t)}:\overleftarrow{\mathbf h}_i^{(t)}\right],\quad \mathbf{\vec u}^{(t)}_i = \tanh\left(\mathbf W_w\mathbf h_i^{(t)}+\mathbf{\vec b}_w\right)\\ \alpha_{i}^{(t)} = \frac{\exp(\mathbf{\vec u}^{(t)}_i\cdot \mathbf{\vec u}_w)}{\sum_{t^\prime}\exp(\mathbf{\vec u}^{(t^\prime)}_i\cdot \mathbf{\vec u}_w)},\quad \mathbf{\vec s}_i = \sum_{t^\prime} \alpha_{i}^{(t)} \mathbf h_i^{(t)} $word attention
:其中 $ \mathbf{\vec u}_w $ 表示这个单词序列的总信息,称作单词上下文。它是随机初始化并从网络训练得到。
$ \overrightarrow{\mathbf g}_i = \overrightarrow{\text{GRU}}(\mathbf{\vec s}_i),\quad \overleftarrow{\mathbf g}_i= \overleftarrow{\text{GRU}}(\mathbf{\vec s}_i),\quad i=1,2,\cdots,L $sentence encoder
:
$ \mathbf g_i = \left[\overrightarrow{\mathbf g}_i :\overleftarrow{\mathbf g}_i \right],\quad \mathbf{\vec w}_i = \tanh\left(\mathbf W_s\mathbf g_i +\mathbf{\vec b}_s\right)\\ \beta_{i} = \frac{\exp(\mathbf{\vec w}_i\cdot \mathbf{\vec u}_s)}{\sum_{i^\prime}\exp(\mathbf{\vec w}_{i^\prime}\cdot \mathbf{\vec u}_s)},\quad \mathbf{\vec v} = \sum_{i^\prime} \beta_{i^\prime} \mathbf g_{i^\prime} $sentence attention
:其中 $ \mathbf{\vec u}_s $ 表示这个句子序列的总信息,称作句子上下文。它是随机初始化并从网络训练得到。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论