基于RNN的语言生成模型
本篇介绍RNN的基本原理及其在NLP的应用。
RNN
循环神经网络(Recurrent Neural Network, RNN)为带层间反馈的神经网络模型。其算法框架包含输入层、隐藏层和输出层。
基本原理(前馈计算)
输入层:
给定一个词向量序列${\pmb X} = ({\pmb e}(w_1),{\pmb e}(w_2),…,{\pmb e}(w_n))$,其中${\pmb e}(w_i)\in{\Bbb R}^k$为单词$w_i$的向量表示,$k$为向量维度。
隐藏层:
RNN隐状态${\pmb h}_t \in {\Bbb R}_d$($d$为隐状态向量维度)的更新:
$$
{\pmb h}_t=
\begin{cases}
\begin{array}{ll}
0, & t=0 \\ f_r({\pmb h}_{t-1}, {\pmb e}(w_t) ), & t\ge 1
\end{array}
\end{cases}
$$
其中$f_r$为RNN隐藏层中的循环函数。RNN的记忆能力来源于RNN隐藏层每一时刻的输入包括上一时刻隐藏层的输出${\pmb h}_{t-1}$。
RNN中最简单的循环函数为
$$f_r({\pmb h}_{t-1},{\pmb e}(w_t))=f({\pmb Uh}_{t-1} + {\pmb We}(w_t) + {\pmb b} )$$
其中$f$为激活函数(如${\rm tanh}$或ReLU函数),${\pmb U}\in {\Bbb R}^{d\times d}$和${\pmb W}\in {\Bbb R}^{d\times k}$为可训练的网络权重,${\pmb b}\in{\Bbb R}^d$为偏置向量。
输出层:
接收隐藏层的输出${\pmb h}_t$作为输入,根据输出函数$g_r$产生$t$时刻的输出${\pmb y}_t=g_r({\pmb h}_t)$,一般为类别集合或词表上的概率分布。
以上过程,循环的时间步数可变,但$f_r$和$g_r$的网络参数不随时间变化(在不同时刻使用同一套参数计算隐状态和输出)。
训练算法(BPTT)
基于时间的反向传播(Back Propagation Through Time,g,BPTT):
- RNN输入的每个训练样本为一个时间序列,每一时刻都可能有输出,进而计算模型输出相对于真实标签的误差。
- 每一时刻的隐状态受前一时刻隐状态影响,故RNN的训练需要从最后一个时刻开始将误差的梯度回传
RNN在时间步$t$的损失函数$J_t$即RNN的输出与目标输出之间的误差,是${\pmb y}_t$的函数,可用$J_t={\cal L}({\pmb y}_t)$表示。
RNN在所有时间步上的整体损失函数$J=\sum_{i=1}^T J_t$。
可得(推导过程略):
$$\frac{\partial J}{\partial {\pmb U}}=\sum_{t=1}^T \sum_{k=1}^t \frac{\partial J_t}{\partial {\pmb y}_t}\frac{\partial {\pmb y}_t}{\partial {\pmb h}_t} \left( \prod_{i=k+1}^t {\rm diag}[f’( {\pmb h}_{i-1}, {\pmb e}(w_i) )]{\pmb U} \right) \frac{\partial {\pmb h}_k}{\partial{\pmb U}}$$
定义$\gamma_i=|| {\rm diag}[f’( {\pmb h}_{i-1}, {\pmb e}(w_i) )]{\pmb U} ||_2$:
- $\gamma_i>1$:$\left[ \lim_{t-k\rightarrow\infty} \prod_{i=k+1}^t {\rm diag}[f’( {\pmb h}_{i-1}, {\pmb e}(w_i) )]{\pmb U} \right] \rightarrow \infty$,容易出现梯度爆炸;
- $\gamma_i<1$:$\left[ \lim_{t-k\rightarrow\infty} \prod_{i=k+1}^t {\rm diag}[f’( {\pmb h}_{i-1}, {\pmb e}(w_i) )]{\pmb U} \right] \rightarrow 0$,容易出现梯度消失。
LSTM
长短期记忆(Long Short-term Memory, LSTM)神经网络可进一步改善RNN的记忆能力,并减轻梯度爆炸和梯度消失问题。
对RNN的主要修改:将循环函数$f_r$从全连接改进为使用三个控制门的记忆单元。
控制门:对于向量${\pmb y}$,希望通过向量${\pmb x}$来控制${\pmb y}$所保留的信息。
$${\pmb o} = \sigma({\pmb x})\otimes{\pmb y}$$
- $\otimes$:逐元素的向量乘法
- $\sigma({\pmb x})$:sigmoid函数
LSTM的循环函数可写为:
$$
\begin{array}{c}
{\pmb h}_t = {\pmb o}_t \otimes {\rm tanh}({\pmb c}_t) \\ {\pmb c}_t = {\pmb f}_t \otimes {\pmb c}_{t-1} + {\pmb i}_t \otimes {\hat {\pmb c}}_t \\ {\hat {\pmb c}}_t = {\rm tanh}({\pmb W}_c{\pmb e}(w_t)+{\pmb U}_c{\pmb h}_{t-1}+{\pmb b}_c)
\end{array}
$$
- ${\pmb c}_t$:$t$时刻RNN的单元状态(Cell State),含序列历史信息。
- ${\pmb i}_t$, ${\pmb o}_t$, ${\pmb f}_t$:分别称为输入门、输出门、遗忘门。
$$
\begin{array}{c}
{\pmb i}_t = \sigma({\pmb W}_i {\pmb e} (w_t) + {\pmb U}_i {\pmb h}_{t-1} + {\pmb b}_i) \\ {\pmb o}_t = \sigma({\pmb W}_o {\pmb e} (w_t) + {\pmb U}_o {\pmb h}_{t-1} + {\pmb b}_o) \\ {\pmb f}_t = \sigma({\pmb W}_f {\pmb e} (w_t) + {\pmb U}_f {\pmb h}_{t-1} + {\pmb b}_f)
\end{array}
$$
LSTM在每个时间步上对当前输入和记忆的历史信息进行重新组合,有效减轻梯度爆炸/消失等问题。关键在于:
- 更复杂的循环函数:使得梯度在回传过程中经历更多导数较小的激活函数,降低梯度爆炸发生的可能性。
- 遗忘门的使用:遗忘门中的偏置项${\pmb b}_f$通常在初始化时会设置得很大,使得${\pmb f}_t$接近1,即单元状态${\pmb c}_t$将尽量保留${\pmb c}_{t-1}$中的信息。
- 训练时${\pmb c}_t$上的梯度通过${\pmb c}_{t-1}$一直回传,不易消失。
- 但${\pmb f}_t$中的元素可能会逐渐减小,故遗忘门无法完全避免梯度消失。
- 去掉遗忘门(相当于${\pmb f}_t$为1)可完全避免梯度消失,但有遗忘门的LSTM神经网络实际效果往往会更好。
LSTM效果优于标准RNN,但循环函数复杂,学习和推理能力较低,在大规模神经网络结构中时间性能较差。
GRU
门控循环单元(Gated Recurrent Units, GRU):简化LSTM神经网络的循环函数,达到相似的效果和时空效率。
$$
\begin{array}{c}
{\pmb h}_t = ( 1 - {\pmb z}_t ) \otimes {\pmb h}_{t-1} + {\pmb z}_t \otimes {\hat {\pmb c}}_t \\ {\hat {\pmb h}}_t = {\rm tanh}({\pmb W}_c{\pmb e}(w_t)+{\pmb U}_c( {\pmb r}_t \otimes {\pmb h}_{t-1} ) )
\end{array}
$$
- ${\pmb r}_t$, ${\pmb z}_t$:分别称为重置门(Reset Gate)、更新门(Update Gate)。
$$
\begin{array}{c}
{\pmb r}_t = \sigma({\pmb W}_r {\pmb e} (w_t) + {\pmb U}_r {\pmb h}_{t-1} ) \\ {\pmb z}_t = \sigma({\pmb W}_z {\pmb e} (w_t) + {\pmb U}_z {\pmb h}_{t-1} )
\end{array}
$$
RNN的架构设计
RNN及其变种对输入的较长序列,前向传播时难以有效记忆历史信息,反向传播时也很难沿时间轴进行有效梯度回传。
设计各种网络架构,一定程度上可解决上述问题。
多层RNN
RNN隐藏层的循环函数$f_r$可以用多层全连接神经网络表示,从而得到更深的多层RNN。
- 第一个隐藏层的输入:上一时刻的隐状态和当前的词向量
- 其他隐藏层的输入:上一时刻的隐状态和上一隐藏层当前时刻的隐状态
- 最后一个隐藏层的隐状态:预测输出
多层RNN有更多的网络参数和更深的结构,能有效提高对更长时间序列的记忆能力。
双向RNN
同时考虑当前位置的上下文信息,有助于更有效的序列特征表示。双向RNN的隐状态${\pmb h}_t$由两个方向编码得到的隐状态组成:
$${\pmb h}_t = {\overleftarrow {\pmb h} }_t \oplus {\overrightarrow {\pmb h} }_t $$
$${\overleftarrow {\pmb h} }_t =
\begin{cases}
\begin{array}{ll}
0, & t=0 \\ f_r(\overleftarrow{\pmb h}_{t-1},{\pmb e}(w_t)), & 1\le t\le n
\end{array}
\end{cases}
$$
$${\overrightarrow {\pmb h} }_t =
\begin{cases}
\begin{array}{ll}
0, & t=n+1 \\ f_r(\overrightarrow{\pmb h}_{t+1},{\pmb e}(w_t)), & 1\le t\le n
\end{array}
\end{cases}
$$
但目前语言生成任务多使用自回归的生成方式(生成时模型只知道已生成的前缀信息而不知道后缀信息),故双向RNN难以应用到语言生成任务中。
基于RNN的语言模型
RNN专为序列建模设计,能自然地作为语言模型建模语言序列。
语言模型的核心任务:确定词序列$Y=(y_1,y_2,…,y_n)$的概率$P(Y)$
自回归分解:$P(Y)=\prod_{t=1}^n P(y_t|Y_{<t})$
使用RNN作为语言模型建模:
$$P(y_t|Y_{<t})={\rm softmax}({\pmb W}_0 {\pmb h}_t + {\pmb b}_0)|_{y_t}$$
- 可训练网络参数:${\pmb W}_0\in {\Bbb R}^{|{\cal V}|\times d}$, ${\pmb b}_0\in {\Bbb R}^{|{\cal V}|}$
- ${\pmb h}_t$:$t$时刻RNN的隐状态
- $P(y_t|Y_{<t})$:$t$时刻模型预测的在词表上的条件概率分布
模型结构
训练:教师强制(Teacher-forcing)模式
- 最大似然估计
- 输入:
<SOS>
, $y_1$, …, $y_{n-1}$ - 输出:$p(y_1)$, $p(y_2|y_1)$, …, $p(y_n|y_1…y_{n-1})$
- 在语料集${\cal D}$上训练时的优化目标:${\pmb \theta}^* = {\rm argmax}_{ {\pmb \theta}} \sum_{k=1}^{|{\cal D}|} \sum_{t=1}^{l_k} \log P(y_t^k|Y_{<t}^k;{\pmb \theta})$
- ${\pmb \theta}$:RNN所有可训练参数
- $y_1^ky_2^k…y_{l_k}^k$:${\cal D}$中的第$k$个文本
测试(生成):自由运行(Free-run)模式
- 读入自己生成的前缀$\hat{Y}_{<t}$再预测下一个词$\hat{y}_t$的分布,通过搜索或采样得到$\hat{y}|_t$,并送回模型输入端进行下一个词的生成,直到遇到
<EOS>
为止。
主要问题
softmax预测整个词表的概率分布时,需计算归一化因子$\sum_{y\in{\cal V}}(\epsilon(y))$,其中$\epsilon(y)$为softmax之前的多层感知器(MLP)输出(可参考下一节)中单词$y$对应的结果,即$\epsilon(y_t)=({\pmb W}_0 {\pmb h}_t + {\pmb b}_0)|_{y_t}$。此过程时间复杂度为$O(|{\cal V}|)$,当词表较大时计算过程较为耗时。于是有一些解决方法。
层次化softmax:将词表所有此表示在一棵二叉树上,将归一化因子的计算转换为一系列二分类问题,时间复杂度为$O(\log|{\cal V}|)$。
重要性采样(Importance Sampling)近似:训练时不在整个词表作概率计算,而是通过随机或启发式采样,从词表采样一小部分进行概率估计和梯度计算。
归一化因子用重要性近似来估计:
$$\sum_{y\in{\cal V}}\exp(\epsilon(y))\approx\frac{1}{N}\sum_{y’\in{\cal J}} \frac{\exp(\epsilon(y’))}{Q(y’|Y_{<t})}$$
- 集合${\cal J}$含$N$个从预定义的便于采样的提议分布(Proposal distribution)$Q(y’|Y_{<t})$中采样得到的词。
- 实际使用时可任意选择提议分布$Q(y’|Y_{<t})$(一般设为均匀分布)和采样个数$N$。
负对数似然的梯度(推导过程略,留作练习):
$$-\frac{\partial \log P(y_t|Y_{<t})}{\partial {\pmb \theta}}\approx-\frac{\partial \epsilon(y_t)}{\partial {\pmb \theta}}+\frac{ \sum_{y’\in{\cal J}} \frac{\partial \epsilon(y’)}{\partial {\pmb \theta}} \frac{\exp(\epsilon(y’))}{Q(y’|Y_{<t})} }{ \sum_{y’\in{\cal J}} \frac{\exp(\epsilon(y’))}{Q(y’|Y_{<t})} }$$
- 优点:时间复杂度降至$O(N)$
- 缺点:每一步训练只调整与$y_t$和$\cal J$相关的一部分参数,使得整体估计存在方差,可能导致训练不稳定
- 改进:
- 调整提议分布
- 扩大采样个数
模型改进
缓存(Caching)机制:文本中刚出现过的词很可能在后面的句子中再次出现。
$$P(y_t|Y_{<t})=\lambda P_{\mathrm{LM}}(y_t|Y_{<t})+(1-\lambda)P_{\mathrm{cache}}(y_t|Y_{<t})$$
$$P_{\mathrm{cache}}(y_t|Y_{<t})=
\begin{cases}
\begin{array}{ll}
\frac{\#(y)}{t-1}, & y\in Y_{<t} \\ 0, & 其他
\end{array}
\end{cases}
$$
- $\#(y)$:单词$y$在缓存中出现的次数。
字符感知模型(Character-aware Models):将单词中字符级的信息通过层次RNN等方式与单词级的信息相结合,细粒度语言学特征,缓解低频词问题。
因子模型(Factored Models):将语言的形态、语法、词性、词袋等多种因子的信息融入语言模型,帮助模型学习单词的连续表示,但需人工标注及在不同数据或下游任务上实验确定融入哪些因子信息。
Seq2Seq
序列到序列(Sequence to Sequence, Seq2seq)模型
基本原理
给定输入语句$X=(x_1,x_2,…,x_m)$,希望模型输出目标语句$Y=(y_1,y_2,..,y_n)$。通过编码$X$和解码$Y$来建模条件概率分布$P(Y|X)$。
$$P(Y|X)=\prod_{t=1}^n P(y_t|Y_{<t},X)$$
模型结构
一般采用两个RNN分别作为编码器和解码器。在每个时间步$t$,编解码状态都由RNN隐状态表示:
$${\pmb h}_t=\mathrm{RNN} ( {\pmb h}_{t-1}, {\pmb e}(x_t) )$$
$${\pmb s}_t=\mathrm{RNN} ( {\pmb s}_{t-1}, {\pmb e}(y_{t-1}), {\pmb h}_m )$$
$$P(y_t|Y_{<t},X)=\mathrm{softmax} ( \mathrm{MLP} ( {\pmb s}_t ) ) |_{y_t}$$
Attention
使用Seq2Seq模型生成文本时,$X$中越靠后的词对解码器生成文本的影响越大,而靠前的词容易被忽略。
原因:最终编码状态${\pmb h}_m$更容易记住靠后的词的信息。
注意力机制(Attention mechanism)的提出正是为了解决这一问题。解码器在解码时的每一步都会评价$X$中每个词对当前词的重要性,从而使解码器在预测每个词时能动态地关注到$X$的不同部分。
根据Bahdanau等提出的注意力机制:
计算时间步$t$的解码状态${\pmb s}_t$时,输入${\pmb s}_{t-1}$和上一步解码生成的词$y_{t-1}$,同时考虑注意力机制基于编码器的$m$个编码状态计算出的上下文向量${\pmb c}_t$。
$${\pmb s}_t=\mathrm{RNN} ( {\pmb s}_{t-1}, {\pmb e} ( y_{t-1}, {\pmb c}_t ) )$$
其中${\pmb c}_t$为上下文向量,是对所有编码隐状态$\{ {\pmb h}_1,…,{\pmb h}_m \}$的动态加权和:
$${\pmb c}_t=\sum_{i=1}^{m}\alpha_{it}{\pmb h}_i$$
$$\alpha_{it}=\frac{ \exp (e_{it}) }{ \sum_{k=1}^m \exp (e_{kt}) }$$
$$e_{it}={\pmb V}_a\cdot \tanh ( {\pmb W}_a {\pmb s}_{t-1} + {\pmb U}_a {\pmb h}_i ) $$
- 可训练参数:${\pmb V}_a \in {\Bbb R}^d$, ${\pmb W}_a \in {\Bbb R}^{d\times d}$, ${\pmb U}_a \in {\Bbb R}^{d\times d}$
- $e_{it}$表示$t$时刻解码状态${\pmb s}_{t-1}$受编码状态${\pmb h}_i$的影响程度(对齐函数,描述上下文对齐关系)
- $\alpha_{it}$:${\pmb s}_{t-1}$对所有编码的注意力权重
- 查询(Query)向量:${\pmb s}_{t-1}$
- 键(Key)和值(Value)向量:$\{ {\pmb h}_1,…,{\pmb h}_m \}$中的向量
注意力机制:Query向量对每个Key向量分别计算影响度(即注意力分布),并在(softmax)归一化后将其作为权重对$m$个Value向量加权求和,得到基于注意力的上下文向量。得到解码器隐状态${\pmb s}_t$后,计算条件概率$P(y_t|Y_{<t},X)$的方法与普通Seq2Seq模型相同。
作用:解码器在生成每个词时都能动态关注到不同位置的编码状态,从而使得模型具有更好的拟合能力和更强的可解释性。
扩充和改进
Luong等人提出的注意力机制与以上的不同点:
- 解码状态的计算方式:使用$t$时刻的隐状态作为查询向量
$$P(y_t|Y_{<t},X)=\mathrm{softmax}(\mathrm{MLP}(\tilde{\pmb s}_t))|_{y_t}$$
$$\tilde{\pmb s}_t=\tanh({\pmb W}_c({\pmb s}_t\oplus{\pmb c}_t))$$
- 对齐函数:
$$e_{it}={\pmb s}_{t-1}\cdot{\pmb h}_i$$
$$e_{it}={\pmb s}_{t-1}{\pmb W}_a{\pmb h}_i$$
- 局部注意力机制:定义整型超参数$D$,在解码每一时刻$t$预测整数值$I_t$,Key和Value向量变为$\{ {\pmb h}_{I_t-D},{\pmb h}_{I_t-D+1},…,{\pmb h}_{I_t+D} \}$。其中$I_t$的计算方法:
- 单调对齐:$I_t=t$
- 预测对齐:$I_t=m\cdot \sigma({\pmb V}_p\cdot\tanh({\pmb W}_p{\pmb h}_t))$
- ${\pmb V}_p$, ${\pmb W}_p$:模型参数
- 同时注意力权重$\alpha_{it}$引入以$I_t$为中心的高斯权重:$\alpha_{it}=\frac{ \exp (e_{it}) }{ \sum_{k=1}^m \exp (e_{kt}) }\exp\left( - \frac{(i-I_t)^2}{2\sigma^2} \right)$
- $\sigma$一般设置为$\frac{D}{2}$
解码器的解码方法
生成文本时需要解决的问题:求一个单词序列${\hat Y}$,使其生成概率$P({\hat Y}|X)$最大。
- 搜索空间大小:$|{\cal V}|^T$
- $|{\cal V}|$:词表大小
- $T$:句子的最大长度
基于搜索的解码方法
贪心搜索
每个时间步$t$都选取当前概率分布最大的词,即$\hat{y}_t={\rm argmax}_y P(y|\hat{Y}_{<t},X)$,直到$\hat{y}_t$为<EOS>
时停止生成。
- 复杂度低
- 不保证全局最优
集束搜索
集束搜索(柱状搜索,Beam Search)扩大搜索范围,有超参数$B$即束宽(Beam Size)。
$${\cal Y}_{[t]}={\rm argmax}_{Y_{[t]}^1,…,Y_{[t]}^B\in S_t} \sum_{b=1}^B\log P(Y_{[t]}^b|X) $$
$$\mathrm{s.t.}\ Y_{[t]}^i\ne Y_{[t]}^j, \forall i\ne j, i,j=1,2,…,B$$
缺点:
- 倾向于生成较短的序列
- 改进:加上一个可调节参数$a\in[0,1]$
$${\cal Y}_{[t]}={\rm argmax}_{Y_{[t]}^1,…,Y_{[t]}^B\in S_t} \sum_{b=1}^B
\frac{1}{(n_{b,[t]})^a} \log P(Y_{[t]}^b|X) $$
$$\mathrm{s.t.}\ Y_{[t]}^i\ne Y_{[t]}^j, \forall i\ne j, i,j=1,2,…,B$$
- 容易生成不断重复的语句
- 人类文本并非总在文本序列的每个位置上都取最高概率的词
基于采样的解码方法
随机采样
在生成时的每一步都从当前概率分布$P(y|Y_{<t},X)$按照概率随机采样一个词,即${\hat y}\sim P(y|Y_{<t},X)$。
- 优点:通常具有更高的多样性;一定程度上缓解生成通用或重复文本的问题。
- 缺点:上下文不连贯。
带温度的随机采样
目的:避免采样到低概率的词,导致上下文不连贯。
设置一个大于0的实数温度参数$\tau$,控制概率分布的弥漫程度。
$$P(y|Y_{<t},X)={\rm softmax}(\mathrm{MLP}({\hat {\pmb s}}_t ) / \tau ) |_y$$
其中${\hat {\pmb s}}_t$为使用模型生成的前缀${\hat Y}_{<t}$而非解码器隐状态。
合理设置$\tau \in (0,1)$可避免随机采到概率较小的词。
Top-$k$采样
Top-$k$采样(Fan et al., 2018):选择概率最高的$k$个词作为候选词,根据相对概率随机采样。
设在$t$时刻模型预测的在词表${\cal V}$上的概率分布为$P(y|{\hat Y}_{<t},X)$,则它的Top-$k$词表为${\cal V}^{(k)} = {\rm argmax}_{ {\cal V}’^{(k)} }\sum_{y \in {\cal V} ^{(k)} } P(y|{ Y}_{<t},X) $,其中${\cal V}’^{(k)}\subset {\cal V}$。
得新概率分布:
$$
{\tilde P}(y|{\hat Y}_{<t},X)=
\begin{cases}
\begin{array}{ll}
\frac{P(y_t|{ Y}_{<t},X)}{\sum_{y\in {\cal V}^{(k)} } P(y|{ Y}_{<t},X)}, & y_t\in {\cal V}^{(k)} \\ 0, & 其他
\end{array}
\end{cases}
$$
再按照概率随机采样得$\hat{y}_t$即可。
Top-$p$采样
Top-$k$采样对于不同的模型,常数$k$难以进行一致的设定。
- 在概率分布较为平坦的情况下,词概率相差不大,实际可能存在超过$k$个合理的词。如果仍限制仅从Top-$k$个候选词中采样,可能会增加生成重复文本的风险。
- 在概率分布集中的情况下,合理的可选词可能会少于$k$个。如果仍从Top-$k$个候选词中采样,可能得到与上下文无关的词。
Top-$p$采样(即核采样(Nucleus sampling),Holtzman et al., 2019):修改采样范围为${\cal V}^{(p)}$,即满足$\sum_{y \in {\cal V}’^{(p)}} P(y|{\hat Y}_{<t},X) \ge p$的所有${\cal V}’^{(p)}$中最小的集合,其中$p\in (0,1)$为预先设定的超参数,作为阈值。
惩罚采样
惩罚采样(Penalized sampling,Keskar et al., 2019):为避免生成重复子串,对先前生成的token的分数进行打折,惩罚重复情况:
$$
p_i=\frac{\exp (o_i/(T\cdot 1(i\in g)))}{ \sum_j \exp (o_j/(T\cdot 1(j\in g))) } \qquad 1(c)=\theta \text{ if the condition } c \text{ is True else 1}
$$
其中$g$为先前生成token的集合,$1(\cdot)$为识别函数。论文发现取$\theta=1.2$时可在较少的重复和真实的生成之间取得良好平衡。
copy机制(待补充)
Seq2Seq模型存在的问题
- 一般基于RNN,编解码序列需按自回归方式从左至右依次进行,难以并行,处理较长序列时间复杂度较高(解决方案:CNN或Transformer作为编码器,非自回归语言生成模型作为解码器)
- RNN按照时间轴方向依次递归,位置较远的单词之间的隐状态关联衰减严重(Transformer全连接self-attention更佳,可直接建模序列中任意两个单词之间的依赖关系)
- 使用最大似然估计(Maximum Likelihood Estimation, MLE)训练的自回归语言模型存在暴露偏差(Export Bias)问题,且随句子长度增加而增大,最终导致模型生成文本质量下降。
- 训练:教师强制,解码每个位置的token,输入$Y_{<t}$为训练数据的真实前缀
- 生成:输入为之前解码的前缀
参考资料
[1] 黄民烈等. 《现代自然语言生成》. 电子工业出版社, 2021.
[2] Controllable Neural Text Generation (lilianweng.github.io)
本站所有文章除特別聲明外,均採用 CC BY-SA 4.0 協議 ,轉載請註明出處!