有關向量的重要結論,專題-句向量(Sentence Embedding)
有關向量的重要結論,專題-句向量(Sentence Embedding)
原始地址:https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/blob/master/B-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/B-%E4%B8%93%E9%A2%98-%E5%8F%A5%E5%B5%8C%E5%85%A5.md
?
Reference
- The Current Best of Universal Word Embeddings and Sentence Embeddings
Index
- 基線模型
- 基于統計的詞袋模型(BoW)
- 基于詞向量的詞袋模型
- 均值模型
- 加權模型
- 基于 RNN(任務相關)
- 基于 CNN(任務相關)
- 詞袋模型
- [2018] Power Mean 均值模型
- [2017] SIF 加權模型
- 無監督模型
- [2015] Skip-Thought Vector
- [2018] Quick-Thought Vectors
- 有監督模型
- [2017] InferSent
- [2017] Self-Attention
- [2015] DAN & RecNN
- 多任務學習
- [2018] 基于多任務的 Sentence Embedding(微軟)
- [2018] Universal Sentence Encoder(谷歌)
- 參考文獻
基線模型
基于統計的詞袋模型(BoW)
- 單個詞的 One-Hot 表示
- 基于頻數的詞袋模型
- 基于 TF-IDF 的詞袋模型
- ...
基于詞向量的詞袋模型
均值模型
有關向量的重要結論,
其中?
v_i
?表示維度為?d
?的詞向量,均值指的是對所有詞向量按位求和后計算每一維的均值,最后?s
?的維度與?v
?相同。
加權模型
BERT得到句向量、
其中?
α
?可以有不同的選擇,但一般應該遵循這樣一個準則:越常見的詞權重越小[2017] SIF 加權模型
基于 RNN(任務相關)
-
向量筆記整理,以最后一個隱狀態作為整個句子的 Embedding
-
基于 RNN 的 Sentence Embedding 往往用于特定的有監督任務中,缺乏可遷移性,在新的任務中需要重新訓練;
-
相似句生成。此外,由于 RNN 難以并行訓練的缺陷,導致開銷較大。
基于 CNN(任務相關)
-
卷積的優勢在于提取局部特征,利用 CNN 可以提取句子中類似 n-gram 的局部信息;
-
通過整合不同大小的 n-gram 特征作為整個句子的表示。
詞袋模型
[2018] Power Mean 均值模型
[4]
-
本文是均值模型的一種推廣;通過引入“冪均值”(Power Mean)來捕捉序列中的其他信息;
-
記句子?
s=(x_1, x_2, ..., x_n)
x_i
?為每個詞的詞向量,維度為?d
- 普通的均值模型即?
p=1
?時的特例; - 特別說明,
±∞
?實際上指的是?max
/min
,而不是絕對值最大/最小
-
本文通過拼接的方式來保留不同?
p
?的信息此時,Sentence Embedding 的維度應該是?
K * d
-
進一步的,文本還加入了在不同詞嵌入空間上的詞向量,依然通過拼接的方式保留信息
-
所謂不同詞嵌入空間,指的就是使用不同算法在不同語料上訓練得到的詞向量
此時,Sentence Embedding 的維度應該是?
K * L * d
-
本文使用了如下?4 種詞向量:
- GloVe embeddings (GV) trained on Common Crawl
- Word2Vec trained on GoogleNews (GN)
- Attract-Repel (AR) (Mrksic et al., 2017)
- MorphSpecialized (MS) (Vulic et al., 2017)
-
[2017] SIF 加權模型
-
文獻 [1]?提出了一個簡單但有效的加權詞袋模型 SIF?(Smooth Inverse Frequency),其性能超過了簡單的 RNN/CNN 模型
-
SIF?的計算分為兩步:
1)?對句子中的每個詞向量,乘以一個權重?a/(a+p_w)
,其中?a
?是一個常數(原文取?0.0001
),p_w
?為該詞的詞頻;對于出現頻率越高的詞,其權重越小;
2)?計算句向量矩陣的第一個主成分?u
,讓每個句向量減去它在?u
?上的投影(類似 PCA); -
完整算法描述
無監督模型
[2015] Skip-Thought Vector
[2]
-
類似 Word2Vec/語言模型 的思想,Sentence Embedding 作為模型的副產品。
-
給定一個三元組?
s_{i-1}, s_i, s_{i+1}
?表示 3 個連續的句子。 -
模型使用 Encoder-Decoder 框架;
-
訓練時,由 Encoder 對?
s_i
?進行編碼;然后分別使用兩個 Decoder 生成前一句?s_{i-1}
?和下一句?s_{i+1}
-
Encoder(GRU)
-
Decoder(帶窺孔的 GRU)
其中?
h_i
?為 Encoder 的輸出,即表示?s_i
?的 Sentence Embedding -
Decoder?可以看作是以?Encoder?輸出為條件的神經語言模型
語言模型,
v
?表示詞向量 -
目標函數
-
-
OOV 詞的處理 TODO
[2018] Quick-Thought Vectors
[4]
-
本文是基于 Skip-Thought Vector 的改進
-
Skip-Thought Vector 中給出前一句生成上一句和下一句的任務,被重新描述為一個分類任務:Decoder 作為分類器從一組候選句子中選擇正確的上一個/下一個句子。
-
生成模型(Skip-Thought Vector)
-
分類模型(Quick-Thought Vectors)
-
-
該模型的一個主要優點是訓練速度比 Skip-Thought Vector 快,后者需要訓練 3 個 RNN 模塊。
-
一些細節:
batch size = 400
,即一個 batch 為 400 個連續的句子;context size = 3
,即對給定句子,預測其上一句和下一句;- 負采樣:同一 batch 中除上下文句子,均作為 負例;
- 開始訓練時,詞向量被初始化為?
[-0.1, 0.1]
,沒有使用預訓練的詞向量;
有監督模型
[2017] InferSent
[5]
-
本文使用有監督的方法,在自然語言推理(NLI)數據集上訓練 Sentence Embedding;
-
本文認為從?NLI 數據集(比如?SNLI)中訓練得到的句向量也適合遷移到其他 NLP 任務中。
- 就像在各種?CV 任務中使用基于 ImageNet 的模型(VGG, ResNet 等)來得到圖像特征一樣,在處理?NLP 任務之前可以先使用本文公開的模型來計算句子的特征。
-
基本模型
- 在 NLI 任務中,每個樣本由三個元素構成?
(u, v, l)
——其中?u
?表示前提(premise),v
?表示假設(hypothesis),l
?為類標(entailment 1, contradiction 2, neutral 3) - 本文比較了 7 種編碼器:1)LSTM, 2)GRU, 3)bi-GRU, 4)bi-LSTM(mean pooling), 5)bi-LSTM(max pooling), 6)self-attention, 7)CNN
- 注意:在 NLI 數據集中,句子?
u
?和?v
?的地位不是等價的
- 在 NLI 任務中,每個樣本由三個元素構成?
[2017] Self-Attention
[3]
-
本文提出使用二維矩陣作為句子表征,矩陣的行表示在句子不同位置的關注度,以解決句子被壓縮成一維向量時的信息損失。
[2015] DAN & RecNN
[9]
-
原文模型僅用于分類,但也可用于有監督的學習 Sentence Embedding
Universal Sentence Encoder(谷歌)
-
基本模型,其中比較常用的是 DAN
-
DAN(Deep Averaging Network)
-
RecNN
-
多任務學習
- InferSent 模型的成功,使大家開始探索不同的有監督任務中得到的 Sentence Embedding 在下游任務中的效果。
- 多任務學習試圖在一次訓練中組合不同的訓練目標。
[2018] 基于多任務的 Sentence Embedding(微軟)
[6]
-
本文認為為了能夠推廣到各種不同的任務,需要對同一句話的多個方面進行編碼。
-
簡單來說,模型同時在多個任務和多個數據源上進行訓練,但是共享相同的 Sentence Embedding。
-
任務及數據集包括:
- Skip-Thought(預測上一句/下一句)——BookCorpus
- 神經機器翻譯(NMT)——En-Fr (WMT14) + En-De (WMT15)
- 自然語言推理(NLI)——SNLI + MultiNLI
- Constituency Parsing——PTB + 1-billion word
-
本文模型與?Skip-Thought Vector?基本一致
- 主要區別在于本文的 Encoder 部分使用的是?Bi-GRU,而 Decoder 部分完全一致;
- 使用 GRU 而非 LSTM 的原因主要是為了速度;
[2018] Universal Sentence Encoder(谷歌)
[7]
-
本文的目的是動態地適應各種的 NLP 任務,通過在不同的數據集和不同的任務上同時訓練。
-
本文使用類似的多任務框架,區別在于使用的 Encoder 不同。
[2018] 基于多任務的 Sentence Embedding(微軟)
-
本文以兩種模型作為 Encoder
- Transformer?[8]——更高的精度
- DAN?(Deep Averaging Network) [9]——更快的速度
-
一個可用的預訓練版本
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2") embeddings = embed(["The quick brown fox jumps over the lazy dog.","I am a sentence for which I would like to get its embedding"])sess.run(embeddings)