记录学习BERT和相关模型历程
sentence-bert
推荐看原文章,本页面只简要记录关键的思想和公式
- 原视频 & 对应的 文章
- sentence-bert 论文讲解
背景:BERT和RoBERTa在文本语义相似度等句子对的回归任务上,已经达到了SOTA的结果。但是,它们都需要把两个句子同时喂到网络中,这样会导致巨大的计算开销。论文作者提出了Sentence-BERT(SBERT)网络结构,该网络结构利用孪生网络和三胞胎网络结构生成具有语义意义的句子embedding向量。可以完成一些特定的任务,如相似度对比,聚类,基于语义的信息检索。
获得句子向量的三种方式
- 使用 [cls] 位置的输出
- 计算所有token的mean/max pooling 的结果
孪生网络和三胞胎网络简介
孪生网络:共享参数的两个神经网络。(每次是两个输入经过同一个网路)
损失函数
$$ L = (1-Y)\frac{1}{2}(D_w)^2+Y\frac{1}{2}{max(0, m-D_w)}^2 $$
\( D_w \)被定义为两个输入之间的欧式距离。计算公式如下:
$$ D_w = \sqrt{\{G_w(X_1)-G_w(X_2)\}^2} $$
- \( G_w(x) \)是网络对输入数据的编码
- \( Y \) 的值为0或者1。如果\(X_1\) 和 \(X_2\) 是同一类样本,则\( Y=0 \),否则\( Y=1 \)
- \( m \)是边际价值。即当\( Y=1 \),如果 \( X_1 \)与\( X_2 \)之间距离大于\( m \),则不做优化(省时省力);如果\( X_1 \)与\( X_2 \)之间的距离小于m,则调整参数使其距离增大到
三胞胎网络
三个输入:一个正例 + 两个负例,或一个负例 + 两个正例。训练的目标仍然是让相同类别间的距离尽可能小,不同类别间的距离尽可能大
损失函数:
$$ L = max(d(a, p)- d(a, n)+margin, 0) $$
- p 表示正样本
- n 表示负样本
- \( d(a,n) \)表示a和n的距离
希望a和p之间的距离小于a和n之间的距离。margin是超参数,表示\( d(a,p) \) 和\( d(a, n) \) 之间应该差多少。
模型结构
Classification Objective Function
$$ O = softmax(W_t[u;v;|u-v|]) $$
\(W_t \in R^{3n*k}\) 其中n是向量的维度,k是label的数量。
损失函数:交叉熵损失。
Regression Objective Function
余弦相似度计算。损失函数为MAE(mean squared error)
三胞胎网络的目标函数
$$ max(||s_a - s_p)|| - ||s_a-s_n||+ϵ,0 $$
其中, \(s_x\)表示句子\(x\)的 embedding,\(||・||\)表示距离,边缘参数ϵ表示\(s_a\)与\(s_p\)的距离至少应比\(s_a\)与\(s_n\)的距离近ϵ。在实验中,使用欧式距离作为距离度量, 设置为 1
模型训练
- 数据集:SNLI和 MultiNLI
- batch_size = 16
- 优化器为 Adam
- learning_rate = 2e-5
实验结果 & 消融实验
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。