我应该如何使用 BERT 嵌入进行聚类(而不是为监督任务微调 BERT 模型)

数据挖掘 机器学习 深度学习 nlp 词嵌入 伯特
2021-09-29 17:54:15

首先,我想说我问这个问题是因为我对使用 BERT 嵌入作为文档特征进行聚类感兴趣。我正在使用 Hugging Face 库中的变形金刚。我正在考虑平均每个文档的所有 Word Piece 嵌入,以便每个文档都有一个唯一的向量。然后我会使用这些向量进行聚类。如果您认为这不是一个好主意,或者如果我遗漏了某些内容或不理解某些内容,请随时发表评论。

我看到的问题是您只使用max_lengthHugging Face 库中指定的前 N ​​个令牌。如果前 N 个标记不是该文档的最佳表示怎么办?随机选择 N 个令牌不是更好,还是随机选择 N 个令牌 10 次更好?

此外,我意识到使用 WordPiece 标记器可以替代词形还原,因此标准的 NLP 预处理应该更简单。但是,由于我们已经只使用了前 N 个标记,并且如果我们没有去除停用词,那么前 N 个标记中将出现无用的停用词。据我所知,在 Hugging Face 的示例中,没有人真正在标记化之前做更多的预处理。

[参见下面的标记化示例(来自 Hugging Face),文档的前 64 个标记]

因此,我在这里提出几个问题(请随意回答一个问题或提供我可以阅读的论文或资源的参考):

  1. 为什么选择前 N 个令牌,而不是随机选择?1a) 有没有什么东西可以随机选择 N 个令牌,可能会多次?
  2. 与问题1类似,有没有更好的选择token的方法?也许在令牌上使用 TF-IDF 至少可以排除某些无用的令牌?
  3. 人们在使用 Word Piece 分词器之前通常会使用更多的预处理吗?
  4. 选择在多大程度上max_length影响性能?
  5. 为什么 Hugging Face 库中的最大长度限制为 512?为什么不直接使用最长文档的长度?
  6. 对 WordPiece 嵌入进行平均以获得矩阵是否是个好主意(如果要进行聚类)?
  7. 使用 BERT 嵌入来获取可以聚类的文档的特征以找到相似的文档组是一个好主意吗?还是有其他更好的方法?

原来的: 'Trump tries to smooth things over with GOP insiders. Hollywood, Florida (CNN) Donald Trump\'s new delegate guru told Republican Party insiders at a posh resort here on Thursday that the billionaire front-runner is recalibrating the part "that he\'s been playing" and is ready

标记化:

['[CLS]',
 'trump',
 'tries',
 'to',
 'smooth',
 'things',
 'over',
 'with',
 'go',
 '##p',
 'insider',
 '##s',
 '.',
 'hollywood',
 ',',
 'florida',
 '(',
 'cnn',
 ')',
 'donald',
 'trump',
 "'",
 's',
 'new',
 'delegate',
 'guru',
 'told',
 'republican',
 'party',
 'insider',
 '##s',
 'at',
 'a',
 'po',
 '##sh',
 'resort',
 'here',
 'on',
 'thursday',
 'that',
 'the',
 'billionaire',
 'front',
 '-',
 'runner',
 'is',
 'rec',
 '##ali',
 '##bra',
 '##ting',
 'the',
 'part',
 '"',
 'that',
 'he',
 "'",
 's',
 'been',
 'playing',
 '"',
 'and',
 'is',
 'ready',
 '[SEP]']
2个回答

以下是答案:

  1. 在序列建模中,我们期望一个句子是有序的,因此我们不能随机取词(不像词袋,我们只关心词而不是真正的顺序)。例如:在词袋中:“I ate ice-cream”和“ice-cream ate I”是相同的,而对于将整个句子视为有序序列的模型则不是这样。因此,您不能以随机顺序选择 N 个随机单词。
  2. 选择令牌取决于模型。如果停用词和其他内容(例如符号、数字等)比信息充当噪音,您始终可以进行预处理以删除它。
  3. 我想澄清一下,词形还原和词片标记化是不一样的。例如,在词形还原中,“playing”和“played”被词形化为“play”。但在词片标记化的情况下,它可能会根据词汇分为“play”+“##ing”或“play”+“ed”。因此,保留了更多信息。
  4. max_length应该进行最佳选择,以便充分考虑大多数句子。(即,大多数句子应该比max_length标记化后的句子短)。有一些模型考虑了完整的序列长度。示例:Universal Sentence Encoder(USE)、Transformer-XL 等。但是请注意,您也可以使用较小的批量大小max_length,这使得训练/微调更快,有时会产生更好的结果。
  5. 预训练模型使用MAX_LEN512 进行训练。这是模型的限制。
  6. 正如论文所声称的,对于 BERT 来说,[CLS]token 的分类嵌入就足够了。由于其基于注意力的模型,[CLS]令牌将捕获整个句子的组成,因此就足够了。但是,您也可以平均所有标记的嵌入。我都尝试过,在我的大部分作品中,所有 word-piece 标记的平均值都产生了更高的性能。此外,一些工作甚至建议您对最后 4 层的嵌入进行平均。这只是一种设计选择。
  7. 使用句子嵌入通常是可以的。但是,您需要通过文献进行验证。总会有更好的技术。此外,还有特定于句子嵌入的模型(USE 就是这样一种模型),您可以查看它们。

由于您的许多问题已经得到解答,我只能就您的最后一个问题分享我的个人经验:

7) 使用 BERT 嵌入来获取可以聚类的文档的特征以找到相似的文档组是一个好主意吗?还是有其他更好的方法?

我认为从更简单的方法开始是一个好主意。尤其是在处理依赖于矢量化器的长文档时,例如tf-idf可能会导致更好的结果,同时具有复杂性较低且通常可解释性更高的优点。

我刚刚完成了更长文档的集群练习,并经历了类似的思考过程和实验。最终,我获得了具有tf-idf特征的最佳结果。我使用的管道包括:

  1. 处理数据(停用词删除、词形还原等)
  2. 适合 tf-idf 矢量化器(或者您也可以尝试doc2vec)。
  3. 运行某种降维算法(在我的例子中是 PCA)。
  4. (K-means)聚类 - 评估最佳聚类数。

如果您渴望在下游任务中使用带有长文档的 BERT,您可以查看以下两种主要方法:

截断方法

  • 仅头部(前 512 个令牌)
  • 仅尾(最后 512 个标记
  • 头+尾

根据您的领域,例如,如果每个文档都以执行摘要结束,则仅尾部可能会改善结果。

分层方法

  • 平均池化
  • 最大池化

如此处所述截断方法适用于 BERT 模型的输入(令牌),而分层方法适用于 Bert 模型的输出(嵌入)。