Skip to content

Commit

Permalink
Update 2024-07-28-nlp-embedding.md
Browse files Browse the repository at this point in the history
fix typos
  • Loading branch information
ANYMS-A authored Aug 8, 2024
1 parent 53cf38d commit 2866e0e
Showing 1 changed file with 14 additions and 16 deletions.
30 changes: 14 additions & 16 deletions _posts/2024-07-28-nlp-embedding.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Word Embedding可被看作一种映射(mapping):将单词(word)看作

### Word2Vec

Word2Vec来自于2013年谷歌研究团队的一篇paper: [“Efficient Estimation of Word Representations in Vector Space”](https://arxiv.org/abs/1301.3781)它旨在通过从大型文本语料库中学习来捕捉单词之间的语义关系(单词的相似度)。
Word2Vec来自于2013年谷歌研究团队的一篇paper: [“Efficient Estimation of Word Representations in Vector Space”](https://arxiv.org/abs/1301.3781)它旨在通过学习 大型文本语料库中单词的分布 来捕捉单词之间的语义关系(单词的相似度)。

有趣的是,该paper当年被顶会ICLR 2013拒了,但目前该paper的引用量已有4万多。

Expand Down Expand Up @@ -280,8 +280,18 @@ Sentence-BERT的 网络结构 和 输入形式 使得模型可以预先计算和
训练步骤:
1. 将两个句子对 (A, B) 通过共享参数(同样参数)的BERT编码器生成各自的句子嵌入$${\vec{u}}_{[h \times 1]}$$$${\vec{v}}_{[h \times 1]}$$
2. 将这两个嵌入向量以及它们的 差值 拼接起来,形成一个特征向量$${\vec{z}}_{[3h \times 1]}$$,其中$$\vec{z} = concat([\vec{u}, \vec{v}, \lvert \vec{u} - \vec{v} \rvert])$$
3. 将特征向量$${\vec{z}}_{[3h \times 1]}$$输入一个Linear层,即令向量$${\vec{z}}_{[3h \times 1]}$$乘上一个矩阵$${\mathbf{W}}_{[3 \times 3h]}$$,得到分类用的输出向量$${\vec{y^{'}}}_{[3 \times 1]}$$
4. 计算$${\vec{y^{'}}}_{[3 \times 1]}$$ 与类别标签 $$\vec{y}$$ 的交叉熵 $$\textbf{CrossEntropy}(\vec{y}, \vec{y^{'}})$$,最后根据交叉熵求梯度,并更新参数。
3. 将特征向量$${\vec{z}}_{[3h \times 1]}$$输入一个Linear层,即令向量$${\vec{z}}_{[3h \times 1]}$$乘上一个矩阵$${\mathbf{W}}_{[3 \times 3h]}$$,得到分类用的输出向量$${{\vec{y}}^{'}}_{[3 \times 1]}$$
4. 计算$${\vec{y^{'}}}_{[3 \times 1]}$$ 与类别标签 $$\vec{y}$$ 的交叉熵 $$\textbf{CrossEntropy}(\vec{y}, {\vec{y}}^{'})$$,最后根据交叉熵求梯度,并更新参数。

#### 相似度损失
数据组成:
- 输入:两个句子(A,B)组成的句子对(sentence pair)
- 标签:两个句子的相似度$$S$$,通常是[-1,1]之间的浮点数。

训练步骤:
1. 将两个句子对 (A, B) 通过共享参数(同样参数)的BERT编码器生成各自的句子嵌入$${\vec{u}}_{[h \times 1]}$$$${\vec{v}}_{[h \times 1]}$$
2. 计算两个句子的嵌入向量之间的 余弦相似度(cosine similarity)$$S^{'}$$
3. 计算$$S^{'}$$$$S$$之间的mean-square error(MSE)作为损失,最后根据MSE求梯度,并更新模型参数$$\theta$$

#### 三元组损失 (Triplet Loss)
Triplet Loss可以很好的 “推远不同语义的sentence embedding之间的距离,拉近相似语义的sentence embedding的距离。” 曾广泛的使用于人脸识别任务中。
Expand All @@ -291,7 +301,7 @@ Triplet Loss可以很好的 “推远不同语义的sentence embedding之间的

训练步骤:
1. 将三个句子对(A, P, N) 通过共享参数(同样参数)的BERT编码器生成各自的句子嵌入向量$${\vec{a}}_{[h \times 1]}$$$${\vec{p}}_{[h \times 1]}$$$${\vec{n}}_{[h \times 1]}$$
2. 直接使用三个句子的嵌入向量计算Triplet Loss损失, 最后根据损失求梯度,并更新模型参数$\theta$,公式如下。
2. 直接使用三个句子的嵌入向量计算Triplet Loss损失, 最后根据损失求梯度,并更新模型参数$$\theta$$,公式如下。

$$
TripletLoss = \mathop{\arg\min}\limits_{\theta}({\max{(0, \Vert \vec{a} - \vec{p} \Vert - \Vert \vec{a} - \vec{n} \Vert + margin)}})
Expand All @@ -318,15 +328,3 @@ $$
至此,我们便得到了一个向量数据库!

![](../assets/img/2024-07-28-nlp-embedding/vector-db.png)

[TODO]

- [ ] 三元组loss的示意图。


## Evaulation Metrics

## 向量数据库



0 comments on commit 2866e0e

Please sign in to comment.