Pytorch,将顺序输出转换为二进制的标准层?

Pytorch, standard layer to convert sequential output to binary?

我正在研究一个新的 Pytorch 模型,它将顺序数据作为输入,我只需要输出一个值,然后我将使用二元交叉熵函数来评估 1 或 0 的概率。

更具体地说,假设我的序列是 1000 个时间步并且只有 2 个维度,就像一个二维正弦波,所以数据形状是 1000 x 2。

我在使用RNN之前做过这样的事情,网上有很多内容。由于 RNN 的循环结构,为了做到这一点,我们只需在处理序列后查看 RNN 的最终输出。通过这种方式,最后一步输出将是二维的,然后我们可以应用线性层来转换 2 -> 1 维,等等,它完成了。

我的问题:

我现在尝试做的不是使用循环网络,而是使用注意力编码器(Transformer)。所以编码器的输出现在仍然是 1000 步长,无论我的嵌入尺寸是多少,比如 8。所以顺序编码器的输出是形状 1000 x 8。所以我的问题是我需要将这个输出转换为单个值,我可以对其应用二元交叉熵函数。我没有找到一个明显的方法来做到这一点。

想法:

传统上使用这种顺序模型,编码器输入解码器,然后解码器可以输出可变长度序列(这用于语言翻译问题)。我的问题有所不同,因为我不想输出另一个序列,而只想输出一个值。也许我需要以这种有效的方式转换解码器?解码器通常将目标值和编码器的输出作为输入。解码器的输出然后具有与该目标值相同的形状。一个想法是使用传统的解码器并给出一个 1 长度的目标,然后我会得到一个 1 长度的输出,我可以使用一个传统的线性层将其转换为我想要的输出。然而,这似乎并不完全合乎逻辑,因为我真的对输出序列不感兴趣,而只是输出 1 个值。

无论如何,如果您有任何想法,只是从社区中寻找更多想法。谢谢!

我认为这篇 paper 可以满足您的要求:)(可能不是第一篇这样做的论文,但它是我最近阅读的一篇)

  1. 为您的序列添加一个额外的标记。令牌可以具有可学习的嵌入。
  2. transformer后,丢弃(或不计算)其他位置的输出。我们只从第一个位置获取输出,并将其转换为您需要的目标。

图片取自论文: