V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Richard14
V2EX  ›  程序员

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

  •  
  •   Richard14 · 2022-07-24 19:05:23 +08:00 · 1623 次点击
    这是一个创建于 851 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    5 条回复    2022-07-25 00:00:03 +08:00
    billgreen1
        1
    billgreen1  
       2022-07-24 19:50:00 +08:00 via iPhone
    主要是维度问题,它输出的是 batch size * seq length* 512 ,分类问题是一个与序列长度无关的,所以应该把这边维度压缩到 1 ,变成 batch size * 512
    longbye0
        2
    longbye0  
       2022-07-24 20:09:10 +08:00
    class token
    longbye0
        3
    longbye0  
       2022-07-24 20:13:05 +08:00
    @billgreen1 维度问题是极小的一面,如果仅仅是维度问题,为啥不像 cv 任务一样全局平均呢。class token 可以认为是学到了位置无关的,而且一直在参与 self attention 计算的 token ,这比手动融合强多了。
    sm1314
        4
    sm1314  
       2022-07-24 22:20:44 +08:00
    [cls]{文本内容} -> Bert -> [sentence embedding]{words embedding} 这两个输出中的 sentence embedding 代变整句的涵义,可以用于情感分类 所以取第 0 个 sentence embedding
    Richard14
        5
    Richard14  
    OP
       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 的部分表示全局信息?所以按照这个说法,如果我想改成回归任务,就也只用这部分全局信息就行了呗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3575 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 04:21 · PVG 12:21 · LAX 20:21 · JFK 23:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.