tensorflow - 为什么 Bert 转换器使用 [CLS] 令牌进行分类,而不是对所有令牌进行平均?
问题描述
我正在对 bert 架构进行实验,发现大多数微调任务都将最终的隐藏层作为文本表示,然后将其传递给其他模型以进行进一步的下游任务。
Bert 的最后一层是这样的:
我们在哪里获取每个句子的 [CLS] 标记:
我对这个拥抱脸问题、数据科学论坛问题、github问题进行了很多讨论,大多数数据 科学家都 给出了这样的解释:
BERT 是双向的,[CLS] 通过多层编码过程被编码,包括所有令牌的所有代表信息。[CLS] 的表示在不同的句子中是个体的。
我的问题是,为什么作者忽略了其他信息(每个令牌的向量)并采用平均值、max_pool 或其他方法来利用所有信息而不是使用 [CLS] 令牌进行分类?
这个 [CLS] 令牌与所有令牌向量的平均值相比有何帮助?
解决方案
BERT 主要设计用于迁移学习,即对特定任务数据集进行微调。如果对状态进行平均,则每个状态的平均权重相同:包括停用词或其他与任务无关的内容。该[CLS]
向量是使用自注意力计算的(就像 BERT 中的所有内容一样),因此它只能从其余隐藏状态中收集相关信息。因此,从某种意义上说,[CLS]
向量也是令牌向量的平均值,只是计算得更巧妙,特别是针对您微调的任务。
另外,我的经验是,当我保持权重固定且不对 BERT 进行微调时,使用令牌平均值会产生更好的结果。
推荐阅读
- bash - Unix检查日期距今天多少天
- javascript - 从数组中返回第一个可除数
- php - 无法启动/重启 PHP 7.2 FPM 服务(CentOS 7、Apache)
- html - 我想在“Markdown”发布我的“原始代码”
- python - 请问,如何从 TimeStamp 列中获取日期组件作为索引?所以我想要它没有时间
- python - 获取产品属性及其值
- amazon-web-services - 如何为 AWS ECS 服务提供环境变量?
- apache-kafka - 查看 shell 上的消费者和生产者统计信息:kafka
- git - 使用 git 将我的更改与上游代码分开
- android - 如何在android中将播放的mp3信息从activity传递到fragment