有两种增强训练序列到序列模型的方法,可以提高模型的精确率和可扩展性。
使用装桶法降低训练复杂度
输入序列可以有不同的长度,这使短序列的训练数据添加了大量填充词条。过多的填充会使计算成本高昂,特别是当大多数序列都很短,只有少数序列接近最大词条长度时。假设用数据训练序列到序列网络,其中几乎所有的样本都是100个词条长,只有几个包含1000个词条的异常值除外。若不进行装桶,我们需要用900个填充词条填充大部分训练数据,并且在训练阶段,序列到序列网络必须对填充词条进行循环遍历。这种填充数据会大大减缓训练速度。在这种情况下,装桶法可以较少计算量。我们可以按长度对序列排序,并在不同的批处理期间使用不同的序列长度。我们将输入序列分配到不同长度的桶中,例如长度在5~10个词条之间的所有序列放在一个桶中,然后训练该批次时使用这个序列的桶,例如,先训练5~10个词条之间的所有序列,然后训练10~15个词条之间的所有序列,等等。一些深度学习框架提供了一些装桶工具为输入数据提供最佳装桶方式。
如上图,序列首先按照长度排序,然后仅填充到特定桶的最大词条长度。这样,在训练序列到序列网络时,可以减少所有批处理所需的时刻数量。在特定的批处理中,只在需要的范围内(到最长的序列)展开网络。
注意力机制
与隐性语义分析一样,较长的输入序列(文档)倾向于产生不精确表示这些文档的思想向量。思想向量受LSTM层(神经元数量)维数的限制。对于短输入/输出序列,一个思想向量就够了,类似于聊天机器人示例。但是,如果想训练一个序列到序列模型来概述在线文章。在这种情况下,输入序列可以使一篇很长的文章,要将这篇文章压缩到一个思想向量中,以生成一个标题。可以想想,训练网络来确定较长的文档中最相关的信息是很棘手的。标题或摘要(以及相关的思想向量)必须关注该文档的某个特定方面或部分,而不是试图表示其具有的所有复杂含义。
对于这一问题的解决方案就是注意力机制(如上图)。顾名思义,这个想法是要告诉解码器应该注意输入序列中的哪些部分。这种“预演”是通过允许解码器除查看思想向量外,还允许查看编码器网络的所有状态来实现。整个输入序列上的“热图”版本将于网络的其他部分一起学习。每个时刻不同的映射会与解码器共享。当它解码序列的某个特定部分时,思想向量产生的概念会被它直接产生的信息所增强扩充。换句话说,注意力机制通过选择与输出相关的输入部分,允许输入和输出之间直接相连。这并不意味着输入和输出序列的词条要对齐,因为那样就违背了目标,使我们返回了自编码器的阶段。无论概念的表示出现在序列中的哪个部分,它(注意力机制)都可以使它们更加丰富。
有了注意力机制,在给定解码器时刻时,解码器都会接受一个额外的具有每个时刻的输入,表示要“注意”的输入序列中的一个(或多个)系统。编码器中所有序列的重要程度将由解码器各个时刻的加权平均值表示。
配置和调优注意力机制并不简单,但是各种深度学习框架都提供了简单的实现方法。
标签:词条,训练,Python,建模,解码器,向量,序列,输入 From: https://blog.csdn.net/weixin_39407597/article/details/142315721