如何使用pytorch nn.Transformer进行序列分类?

Whi*_*sht 4 machine-learning transformer-model text-classification deep-learning pytorch

我正在使用 进行序列分类任务nn.TransformerEncoder()。其管道类似于nn.LSTM().

我尝试了几种时间特征融合方法:

  1. 选择最终输出作为整个序列的表示。

  2. 使用仿射变换来融合这些特征。

  3. 对序列进行逐帧分类,然后选取最大值作为整个序列的类别。

但是,这 3 种方法的准确率都很糟糕,4 类分类的准确率仅为25% 。当使用带有最后一个隐藏状态的 nn.LSTM 时,我可以轻松达到83% 的准确率。我尝试了很多超参数nn.TransformerEncoder(),但精度没有任何提高。

我现在不知道如何调整这个模型。你能给我一些实用的建议吗?谢谢。

对于LSTMforward()是:

    def forward(self, x_in, x_lengths, apply_softmax=False):

        # Embed
        x_in = self.embeddings(x_in)

        # Feed into RNN
        out, h_n = self.LSTM(x_in) #shape of out: T*N*D

        # Gather the last relevant hidden state
        out = out[-1,:,:] # N*D

        # FC layers
        z = self.dropout(out)
        z = self.fc1(z)
        z = self.dropout(z)
        y_pred = self.fc2(z)

        if apply_softmax:
            y_pred = F.softmax(y_pred, dim=1)
        return y_pred
Run Code Online (Sandbox Code Playgroud)

为了transformer

    def forward(self, x_in, x_lengths, apply_softmax=False):

        # Embed
        x_in = self.embeddings(x_in)

        # Feed into RNN
        out = self.transformer(x_in)#shape of out T*N*D

        # Gather the last relevant hidden state
        out = out[-1,:,:] # N*D

        # FC layers
        z = self.dropout(out)
        z = self.fc1(z)
        z = self.dropout(z)
        y_pred = self.fc2(z)

        if apply_softmax:
            y_pred = F.softmax(y_pred, dim=1)
        return y_pred
Run Code Online (Sandbox Code Playgroud)

Was*_*mad 5

你提到的准确性表明有问题。由于您正在将 LSTM 与 TransformerEncoder 进行比较,因此我想指出一些关键的差异。

  1. 位置嵌入:这非常重要,因为 Transformer 没有递归概念,因此它不捕获序列信息。因此,请确保添加位置信息以及输入嵌入。

  2. 模型架构d_modeln_headnum_encoder_layers很重要。使用 Vaswani 等人,2017 年使用的默认大小。( d_model=512, n_head=8, num_encoder_layers=6)

  3. 优化:在很多场景下,我们发现Transformer需要用更小的学习率、大的batch size、WarmUpScheduling来训练。

最后但并非最不重要的一点是,对于健全性检查,只需确保模型的参数正在更新即可。您还可以检查训练准确性,以确保准确性随着训练的进行而不断提高。

虽然很难说你的代码到底出了什么问题,但我希望以上几点能有所帮助!