当前位置:   article > 正文

NLP 中消除padding对计算影响的技巧 mask

NLP 中消除padding对计算影响的技巧 mask

NLP的任务处理中,处理的通常是一句句话,每一句话的长度是不同的,这给训练带来了麻烦。特别是为了高效的GPU并行运算,数据大小的一致性就很重要了,除非batch_size设置为1。

增加padding

因此我们就需要把一堆句子的长度统一,通常是用最长的句子的长度为标准(也可以自定义),对短于这个长度的句子进行padding,长于的就截掉。keras中可以用proprecessing来出来

data:输入的文本数据

maxlen:文本最大长度

dtype:padding的数据类型,通常是整数

padding:padding的位置,可以为一句话开头“pre”,也可以是一句话结束“post”

truncating:对过长截断的位置,可以为一句话开头“pre”,也可以是一句话结束“post”

value:即padding词的id,通常是0,在keras中0会比较好。当然也可以自定义为1,或其他整数

k.preprocessing.sequence.pad_sequences(data, maxlen=300, dtype='int32', padding='pre', truncating='pre', value=0.0)

消除padding

那么经过了上面的padding,句子就变得一样长了,方便进行训练了。但是训练过程中也会对于padding的部分进行学习,就学到一些无用的东西,最好能让这些padding不参与运算或者参与loss的计算就好了。

因此在keras的embedding中可以设置mask_zero=True,这一步并不是把padding部分的向量全部置为0,还是会和其他词一样正常出结果,仅仅是将这些padding标记起来,会影响后序的计算,。

加入后序接的LSTM,那么LSTM这一步,被mask的就不用参与运算了。因此就消除了padding的影响。

但是这里会有一个影响,那就是不能输出sequence了,因此不参与运算了,所以对应的位置就没有输出了,因此LSTM就不能return sequence了,因为return的长度不同,后序就无法计算了,只能return output。

如果还希望return sequence,同时也希望可以进行mask处理,那么可以考虑自定义一个带mask的loss function来消除padding对loss计算的影响,同样达到了效果。这一步可以参见我的另一篇文章。

https://blog.csdn.net/weixin_42175217/article/details/104786046

 

关于torch中的方式后序再更新

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/780029
推荐阅读
相关标签
  

闽ICP备14008679号