文本生成通常会使用Seq2Seq模型,但结果并不理想,可能的原因及解决思路是什么(至少列出3条)?

贪心学院AI学习挑战赛(奖学金活动)第11周第1个问题
关注者
53
被浏览
34,863
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

问题1:训练模型时的计算浪费。在处理序列问题时,每个batch中的句子的长度是不一的,通常做法是取batch中语句最长的长度作为序列的固定的长度,不足的补PAD。如果batch里面存在长句,那么其他的句子的都需要按照这个作为输入序列的长度,训练模型时这将造成不必要的计算浪费。

对策:导入bucket机制。对序列的长度做一个分段,切分成多个固定长度的输入序列(bucket)。每一个bucket都是一个固定的computation graph。这样一来,对于模型输入序列的固定长度将不再单一,从一定程度上减少了计算资源的浪费。

问题2:Sampled Softmax。为了减少计算每个词的softmax的时候的资源压力,通常会减少词汇表的大小,但是由于词汇表的词量的减少,语句的Embeding的id表示时容易大频率的出现未登录词UNK。于是,希望寻找到一个能使seq2seq模型使用较大词汇表,但又不怎么影响计算效率的解决办法。

对策:导入Sampled Softmax机制。《On Using Very Large Target Vocabulary for Neural Machine Translation》中提出了计算词汇表的softmax的时候,并不采用全部的词汇表中的词,而是进行一定手段的sampled的采样,从而近似的表示词汇表的loss输出。sampled采样需要定义好候选分布,即按照预定义的分布去采样。

问题3:OOV(词汇表外的未登录词)和低频词。在Decoder阶段时预测的词来自于词汇表,这就造成了未登录词难以生成,低频词也比较小的概率被预测生成。

对策:导入预测开关机制。《Abstractive Text Summarization using Seq2Seq RNNs and Beyond》中使用Pointer-Generator机制来解决OOV和低频词问题。由于文本摘要的任务的特点,很多OOV 或者不常见的的词可以从输入序列中找到,因此可以预测一个开关(switch)的概率 P(s_i=1)=f(h_i,y_{i-1},c_i) ,如果开启,就是正常地预测词表;如果关闭,就需要再原文中指定一个位置作为输出。