Sentence-BERT
Sentence-BERT
Section titled “Sentence-BERT”文章全名:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
具体实现参考 github 库 sentence-transformers
研究的目标是 Semantic Textual Similarity 探究两个句子之间的语义相似度,在 BERT 中必须对两个句子之间两两执行这个运算,这个代价很昂贵,不可行
核心原因就是 BERT 是 cross-encoder(输出依赖于句子对,而不是独立的一个句子),但是语义搜索需要 independent embeddings
Pooling
Section titled “Pooling”用 Siamese 结构微调 BERT,就能得到可比较的句向量,命名为 Sentence-BERT(SBERT)
方法是在 BERT 的上面再加一层 pooling,包括 CLS, MEAN, MAX 三种
- CLS: 使用输出的 cls token,但是效果很差,不适合 cosine 距离
- MEAN(实际使用的): 对所有的 token 执行平均操作,更加抗噪声,相对平滑,适合 cosine 距离
- MAX: 每一个维度都选择最大的那个值,强化句子的特征(实际 cosine 表现是最差的)
Classification (使用 NLI1)
Section titled “Classification (使用 NLI1)”训练的分类目标 (后面再经过一个 cross entropy)其中 是第一个第二个句子的向量, 是逐个元素的绝对值差, 拼接后得到一个三维的向量
训练的时候 BERT 本身的全部参数都是加入反向传播的,BERT 的所有参数 + 这个分类目标的 都是参加到训练中的,但是这个参数只在训练的时候保留,推理的时候只使用 cosine 计算相似度
- 为什么 NLI 有用?
因为entailment 构成远距离,contradiction构成近距离,这是自然的语义几何结构
Regression (使用 STS2)
Section titled “Regression (使用 STS2)”回归目标是直接计算两个句子之间的 cosine 距离差值,然后计算 使用的是 STS 的 0~5 的那个相似度分数
目标是让 cosine 相似度等于真实语义相似度,适合检索任务
Triplet
Section titled “Triplet”三元组目标
指的是给出 anchor, positive, negative 三句话,然后让这个值尽可能的大,执行局部几何排序结构。关心的不是绝对值,而是两两之间的相对距离
Triplet 是 Metric Learning(度量学习),目标就是让相关的更近,错误的更远
如果 则这个时候 loss 是 0,已经没有梯度了,到达了训练目标