变长序列咋使用mini-batch SGD训练( 二 )


这个时候的一次损失是一条句子在在模型中算出来的损失,Mini Batch是多个句子一起算的损失,所以梯度下降还是一样的在这个小batch上的梯度

■网友
谢邀。
变长序列是输入,SGD是算法,这两个不是直接建立关系的:算法训练的是模型,不是输入;先确定模型,再考虑怎么训练。
RNN是专门处理变长序列的,可以通过维护一个mask来获得真实的loss; CNN也可以尝试,不过padding或者clip会带来信息损失。
附上之前的一个答案:为什么RNN 需要mask 输入,而CNN则不需要?

■网友
如果是使用rnn模型的话,在tensorflow里面有dynamic_rnn函数可以实现这个功能,需要传入各个样本的长度sequence_length作为mask。
■网友
用bucket来做 输入是没有值的地方全填充为0 ,算loss时元素级乘mask(大小就是,有值的地方为1其余为0)
另外推荐使用bucket
其实tf的dynamic_rnn效率并不高,有长尾等待效应,一个batch中可能主要耗时是等最长的样本算完。
bucket 可以保证每个循环步里大部分运算是有效的,但是占显存比较多

■网友
【变长序列咋使用mini-batch SGD训练】 目前知道的有2类:
每条数据带一个mask或者length,并且operator支持这种mask或length才行;统一长度或者使用bucket,一个batch里面长短不一的填充成同样长度


推荐阅读