Bert 情感分类任务中,为什么输出前要先 x=x[:, 0, :]

2022-07-24 19:05:23 +08:00
 Richard14

在 B 站看到一个 hugging face 的预训练模型应该如何使用的教学

它提到如果要用来做分类任务的话,比如对文本情感进行分类,一般结构不是 bert block *n -> mlp 输出么,视频里说在 bertblock 结束后,进入 mlp 前,要先把网络的输出只取第一维,也就是比如[32, n, 512]取[:, 0, :]变成[32, 512]然后再进入 mlp

这是为什么呢?如果不是做分类任务,而是做回归类任务,比如给情绪打个分之类的,也需要这么操作吗?

1623 次点击
所在节点    程序员
5 条回复
billgreen1
2022-07-24 19:50:00 +08:00
主要是维度问题,它输出的是 batch size * seq length* 512 ,分类问题是一个与序列长度无关的,所以应该把这边维度压缩到 1 ,变成 batch size * 512
longbye0
2022-07-24 20:09:10 +08:00
class token
longbye0
2022-07-24 20:13:05 +08:00
@billgreen1 维度问题是极小的一面,如果仅仅是维度问题,为啥不像 cv 任务一样全局平均呢。class token 可以认为是学到了位置无关的,而且一直在参与 self attention 计算的 token ,这比手动融合强多了。
sm1314
2022-07-24 22:20:44 +08:00
[cls]{文本内容} -> Bert -> [sentence embedding]{words embedding} 这两个输出中的 sentence embedding 代变整句的涵义,可以用于情感分类 所以取第 0 个 sentence embedding
Richard14
2022-07-25 00:00:03 +08:00
@sm1314 谢谢,你的解释醍醐灌顶。我观察网上的实现代码里,原本有一个疑惑是,它有一个结构是在__init__里生成一个 cls=nn.Parameter(512),但是在每次 forward 里都要 torch.cat(cls, n),然后加到输入数据上,让形状变成[batch_size, n+1, 512]这样,原来还搞不太懂他到底是干啥的,所以按你说的可以理解成是人为添加了一个表示全局信息的部分?然后 bert 的输出就可以理解为原先的 n 个数据,还是表示输入的 n 个信息各自的词信息?外加一个 cls 的部分表示全局信息?所以按照这个说法,如果我想改成回归任务,就也只用这部分全局信息就行了呗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868398

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX