代码之家  ›  专栏  ›  技术社区  ›  Mario Ishac

为什么批处理不能有可变长度的序列/数据项(例如句子)?

  •  1
  • Mario Ishac  · 技术社区  · 8 年前

    怎样 为什么? 是 here on Data Science ,答案是“在单个批中,您必须具有相同的时间步数,因为它必须是张量(这通常是您看到0填充的地方)。”

    然而,这似乎是一个不必要的限制(我对Keras/TensorFlow不是很熟悉,所以我的问题不是针对任何API的)。

    由于变长序列是RNN的一个应用,这个问题归结为 为什么在给定批次的训练过程中,RNN中不能有可变的时间步长?

    以下是让我质疑批量缺乏可变长度序列的原因:

    基于所述计算的梯度(取平均值,然后基于其他超参数应用平均值)实际更改网络参数时的影响。可变长度序列将具有可变数量的时间步长,但是与每个条目相关联的梯度已经平均了网络参数对其自身每个时间步长的影响(并且可以给出一个平均值) 时间步数),因此,无论时间步数是多少,都可以成功地计算每个条目的梯度,因此,对于整个批次(通过计算所有条目的平均梯度)。

    2) :给定一个具有可变长度序列的批,矩阵乘法的并行性仍然可以正常进行,因为矩阵乘法对于批中的每个条目都是并行的,这将是一个序列,因此长度是固定的。

    1 回复  |  直到 8 年前
        1
  •  1
  •   emschorsch    8 年前

    This post pad the shorter sequences 截断较大的序列。每批动态地这样做似乎只会隐藏更多细节,并使任何培训问题更加难以理解,而没有任何好处。

    问题是您希望从动态长度序列中获得什么好处?这似乎是不合理的,期待从这一效率提高,因为我相信他们会实施这样的方式,如果它是这样的。这样使用图书馆容易吗?那么也许答案是填充是一个危险的细节来隐藏用户,或者没有足够的用户要求它。你希望它训练得更好吗?这对我来说似乎是合理的,但是prob并没有提供足够的好处来值得实现的复杂性。您可能需要对数据进行预处理,以决定如何处理很长的序列。

    总之,我很想看看批量大小为1的训练之间的比较,这样每次的梯度都与训练示例的长度和当前的批量方法有关。这将是慢得多,但如果模型训练比也许值得进一步研究更好。

    推荐文章