RNN单元明明可以接受不同长度的输入,但我们却在实际训练时习惯于使用padding来补齐。对于大小可变的输入,深度学习模型如何处理?
- 究竟什么样的模型结构可以处理可变大小的输入?
- 若模型可处理,那该如何训练/预测?
- 若模型不可处理,那该如何训练/预测?
一、什么样的网络结构可以处理可变大小的输入
①只处理局部的信息;
②网络是无参数化的;
③参数矩阵跟输入大小无关;
CNN
CNN中的卷积层通过若干个kernel来获取输入的特征,每个kernel只通过一个小窗口在整体的输入上滑动,所以不管输入大小怎么变化,对于卷积层来说都是一样的。那为什么CNN不能直接处理大小不同的图片呢?是因为一般的CNN里都会有Dense层,Dense层连接的是全部的输入,一张图片,经过卷积层、池化层的处理后,要把全部的单元都“压扁(flatten)”然后输入给Dense层,所以图片的大小,是影响到输入给Dense层的维数的,因此CNN不能直接处理。
RNN
RNN,是由一个个共享参数的RNN单元组成的,本质上可以看成一层RNN只有一个RNN单元,只不过在不断地循环处理罢了。所以,一个RNN单元,也是处理局部的信息——当前time step的信息。无论输入的长度怎么变,RNN层都是使用同一个RNN单元。往往我们也会在RNN后面接上Dense层,然后再通过softmax输出,这里的Dense会有影响吗?答案是不影响,因为我们使用RNN,往往是只需要用最后一个time step的hidden state,这个hidden state的维度是RNN单元中设置的维度,跟输入的长度无关,因此这个hidden state跟Dense的交互也跟输入的维度无关。比如我们输入的长度是l,RNN单元的输出维度为u,Dense层的单元数为n,那么Dense层中的权重矩阵大小为u×n,跟l是无关的。RNN单元中的权重也跟l无关,只跟每个time step的输入的维度有关,比如词向量的维度d,RNN单元中的权重矩阵大小是d×u。
虽然RNN可以处理各种长度的序列,但是我们在训练时,为了加速训练,往往会将一批数据同时输入到模型中进行计算、求导。那同一批数据,要喂给网络,我们必须把它组织成矩阵的形式,那矩阵的每一行/列自然维度需要相同。所以我们必须让同一个batch中的各个样本长度/大小一致。
最常用的方法,就是padding,我们通过padding补零,把同一个batch中的所有样本都变成同一个长度,这样就可以方便我们进行批量计算了。对于那些padded values,也就是补的零,我们可以使用masking机制来避免模型对这些值进行训练。
参考链接:
一个小问题:深度学习模型如何处理大小可变的输入 - 知乎 (zhihu.com)
最后
以上就是能干蚂蚁最近收集整理的关于深度学习模型如何处理大小可变的输入的全部内容,更多相关深度学习模型如何处理大小可变内容请搜索靠谱客的其他文章。
发表评论 取消回复