Whi*_*sht 4 machine-learning transformer-model text-classification deep-learning pytorch
我正在使用 进行序列分类任务nn.TransformerEncoder()。其管道类似于nn.LSTM().
我尝试了几种时间特征融合方法:
选择最终输出作为整个序列的表示。
使用仿射变换来融合这些特征。
对序列进行逐帧分类,然后选取最大值作为整个序列的类别。
但是,这 3 种方法的准确率都很糟糕,4 类分类的准确率仅为25% 。当使用带有最后一个隐藏状态的 nn.LSTM 时,我可以轻松达到83% 的准确率。我尝试了很多超参数nn.TransformerEncoder(),但精度没有任何提高。
我现在不知道如何调整这个模型。你能给我一些实用的建议吗?谢谢。
对于LSTM:forward()是:
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)
你提到的准确性表明有问题。由于您正在将 LSTM 与 TransformerEncoder 进行比较,因此我想指出一些关键的差异。
位置嵌入:这非常重要,因为 Transformer 没有递归概念,因此它不捕获序列信息。因此,请确保添加位置信息以及输入嵌入。
模型架构:d_model、n_head、num_encoder_layers很重要。使用 Vaswani 等人,2017 年使用的默认大小。( d_model=512, n_head=8, num_encoder_layers=6)
优化:在很多场景下,我们发现Transformer需要用更小的学习率、大的batch size、WarmUpScheduling来训练。
最后但并非最不重要的一点是,对于健全性检查,只需确保模型的参数正在更新即可。您还可以检查训练准确性,以确保准确性随着训练的进行而不断提高。
虽然很难说你的代码到底出了什么问题,但我希望以上几点能有所帮助!
| 归档时间: |
|
| 查看次数: |
6033 次 |
| 最近记录: |