:dart: W13 - Word2Vec, Doc2Vec, ELMo, BERT
===
<!-- ## Table of Content
[Toc] -->
## 名字:盈蓓
### Word2vec
* 發想自J.R. Firth 的 "You shall know a word by the company it keeps."
* 透過單一詞彙與其collocation的關係繪製向量。
* 如果兩個詞彙相近,就會出現在相似的語境底下,繪製出來的向量也會比較相似。
→ 例:「漢堡」和「薯條」可能都會比較常跟「速食」和「麥當勞」一起出現,但「陽春麵」不會,所以畫出來的向量跟他們的距離就會比較遠。(把向量想像成點的話就會是下面這個樣子)

* 可以用來改善one-hot encoding維度太高,運算量太大的問題
* **Skip-gram**:運用target word來預測附近的詞
* **CBOW (Continuous Bag of Word)** :運用附近的詞來預測target word
* 原理:
* 以"I like to learn things about Linguistics"為例
* 先在文本中選定一個window size,假設window size是2,會有下面這些資料被取出來。

* 步驟(以有10000個type的corpus為例):
* **編碼**:用 one-hot encoding 幫每個字編碼讓他們變成向量
* 假設Linguistics是10000個字裡面的第2個,那他的向量就會是[0,1,0,0...0]
* **降維**:在 hidden layer 幫向量降維
* 因為有幾個字就會有幾個就會有幾個維度,維度太多會造成計算量暴增,所以需要降維。
→ 通常會選擇比input layer小很多的數字
* 可以把hidden layer裡面的東西想像成字的不同feature。這些feature是讓每個字跟其他字產生差異的關鍵,所以根據每個字的feature不同,就會產生不同的權重。
* 如果選擇300個feature的話,在hidden layer就會形成一個10000\*300的矩陣。因為input的向量只有在自己的那個位子會是1,所以兩邊相乘之後就會留下一個1\*300的向量,變得比原本1\*10000的向量小很多。
* 用比較小的數字畫一下圖:
* **相乘**:因為要計算input word跟其他字同時出現的機率,也就是$P(context|input word)$(或$P(target word|context)$ for CBOW),所以會將input word的向量跟corpus裡的每一個向量相乘。
→ 得到一個300\*10000的output layer
* **轉換**: 向量相乘之後得到的只是一個新的向量,所以要用**Softmax Regreesion**來把他們轉換成介於0到1之間的數字以代表機率。
→ **輸出的所有數字加起來會等於1**
* skip-gram步驟示意圖(CBOW就是把Input換成10000個vector,output換成1個):
* 相乘&轉換示意圖:
* **word2vec實際上並沒有使用one-hot encoding跟hidden layer這些東西,而是一開始就幫輸入的字隨機安排一個N維的向量。但是我們可以把安排這個隨機向量的過程想像成上面這些步驟。**
→ word2wec是一種**unsupervised**的模型
* **提高訓練效率的方法**(就算降了維,hidden layer還是要計算10000\*300 = 三百萬個權重):
* 把常見的詞組或是搭配視為一個vector。
* 對高頻率出現的字詞進行抽樣,來減少訓練樣本的數目。
* **Negative Sampling**
[Reference 1](https://medium.com/@pocheng0118/word2vec-from-scratch-skip-gram-cbow-98fd17385945)
[Reference 2](https://tengyuanchang.medium.com/%E8%AE%93%E9%9B%BB%E8%85%A6%E8%81%BD%E6%87%82%E4%BA%BA%E8%A9%B1-%E7%90%86%E8%A7%A3-nlp-%E9%87%8D%E8%A6%81%E6%8A%80%E8%A1%93-word2vec-%E7%9A%84-skip-gram-%E6%A8%A1%E5%9E%8B-73d0239ad698)
[Reference 3](https://zhuanlan.zhihu.com/p/26306795)
### Softmax Regression
* 公式太難直接跳過
* 簡單來說就是sigmoid function更general的一種形式。
* Logistic Regression只能做二元分類,但Softmax Regression可以做多元分類。
* 因為可以做多元分類,所以適用於deep learning model最後轉換成機率的步驟。
[Reference](https://medium.com/%E6%89%8B%E5%AF%AB%E7%AD%86%E8%A8%98/%E4%BD%BF%E7%94%A8-tensorflow-%E5%AD%B8%E7%BF%92-softmax-%E5%9B%9E%E6%AD%B8-softmax-regression-41a12b619f04)
### Doc2vec
* 原本在訓練模型時,如果要用到句子或短文的時候或用BOW的方法,但是BOW不會考慮到句子或文章當中不同詞彙出現的先後順序還有語意關係,所以有了Doc2vec的出現。
* 「小美喜歡小明」跟「小明喜歡小美」因為詞序不同而產生不同的句意,但是對BOW來說都是一樣的三個詞。
* 「小美討厭小明」、「小明喜歡小美」跟「小明暗戀小美」雖然語意不同,但是對BOW來說「討厭」、「喜歡」和「暗戀」具有相同的語意距離。
* 跟word2vec一樣會設定target word跟window size,不一樣的點在於input layer會有一個**paragraph vector**。
* **DBOW**:skip-gram的延伸。
* **DM (Distributed Memory)**:CBOW的延伸。
* 雖然設定了wondow size,但是同一句話擷取出來的資料在input的時候因為會加上同樣的paragraph vector,讓模型在訓練的時候可以更精確知道哪些東西屬於同一個句子,有更近的關係。
[Reference](https://www.twblogs.net/a/5db38150bd9eee310ee69608)
---
## 名字:標云
### word2vec:
word to vector 是一個能把文字變成向量的演算法,即把詞(word)轉換成電腦可以了解的模式(vector)。word2vec同時可以讀取出詞裡的概念.這個概念就像是當我們想到英國的時候,可能就會想到它的首都倫敦.而word2vec在經過訓練以後是有能力做這樣的推想。
word2vec會把這個詞附近的相鄰詞考慮進來.實際上實作有兩種的演算法,第一種稱作 Countinuous Bag Of Words(CBOW),此方法會利用上下文的詞來當作神經網路的輸入,最後預測這個目標的詞是什麼.而第二種則是 Skip-Gram 演算法,剛好跟第一種演算法相反,他所輸入的是當前的詞來預測這一段的文章上下文的詞。
從一篇文章隨機取出了兩個詞,在學習的過程中,這兩個詞分別的上下文會被導入 word2vec 來決定他們向量的數值.而這個向量是一個 N個長度的數字.同一個詞,例如:台灣.向量值必定是一樣的.在訓練的過程中,如果這兩個向量的上下文被判定為相似的,那word2vec 會調整向量裡的數值來讓彼此在向量空間裡的距離拉近,而反之則會把他拉遠.最後學習完成的模型會把同樣概念的詞在向量空間裡面聚集在一起,這可能是國家的名稱例如:法國,英國,德國.而抽象的概念也會被聚集在一起例如:高興,快樂,愉悅.
word2vec 使用 Cosine Similarity 來計算兩個詞的相似性.這是一個 -1 到 1 的數值,如果兩個詞完全一樣就是 1.像是「台灣」這個詞和他自身的 Cosine Similarity 就是 1
而除了比較相似性以外, word2vec 還可已有類推這個概念.從引用至 google open source blog 的圖來看,我們可以看到國家的距離是彼此相近的.中國,俄國,日本......等.而相對應首都的距離也是相近的。如圖中每條虛線的所示.把這種對應關係改成數學上的表示的話就是巴黎 - 法國 = 柏林 - 德國.因此可以利用這種方式推估未知的單詞,即巴黎 - 法國 + 德國 = ?

[Resource](https://ithelp.ithome.com.tw/articles/10188574)
### skip-gram:
skip-gram模型的輸入是一個單詞W1,它的輸出是W1的上Wo1,...,Woc,上下文的窗口大小為C。舉個例子,這裡有個句子“I drive my car to the store”。我們如果把”car”作為訓練輸入數據,單詞組{“I”, “drive”, “my”, “to”, “the”, “store”}就是輸出。
例:“The dog barked at the mailman”
1. 首先我們選句子中間的一個詞作為輸入詞,例如我們選取“dog”作為input word;
2. 有了input word以後,我們再定義一個叫做skip_window的參數,它代表著我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設置 skip_window = 2,那麼我們最終獲得窗口中的詞(包括input word在內)就是['The', 'dog','barked', 'at']。 skip_window = 2 代表著選取input word左側2個詞和右側2個詞進入窗口,所以整個窗口大小span = 2*2 = 4。
3. 另一個參數叫num_skips,它代表著我們從整個窗口中選取多少個不同的詞作為我們的output word,當skip_window = 2、num_skips = 2時,我們將會得到兩組 (input word, output word) 形式的訓練數據,即 ('dog', 'barked'),('dog', 'the')。
4. 神經網路基於這些訓練數據將會輸出一個概率分佈,這個概率代表著我們的詞典中的每個詞是output word的可能性。舉例來說,第二步中我們在設置skip_window和num_skips=2的情況下獲得了兩組訓練數據。假如我們先拿一組數據 ('dog', 'barked') 來訓練神經網絡,那麼模型通過學習這個訓練樣本,會告訴我們詞彙表中每個單詞是“barked”的概率大小。
* 我們如何來表示這些單詞呢?
對單詞進行one-hot編碼。
假設從我們的訓練文檔中抽取出10000個唯一不重複的單詞組成詞彙表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞彙表中的出現位置為第3個,那麼ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(ant = [0,0,1,0,0,.....])。
模型的輸入如果為一個10000維的向量,那麼輸出也是一個10000維度(詞彙表的大小)的向量,它包含了10000個概率,每一個概率代表著當前詞是輸入樣本中output word的概率大小。
### CBOW:
CBOW模型跟skip-gram的原理是一樣的,只不過在輸入的時候是該詞周圍的詞向量加總作為輸入。
現在有這樣一句話:今天我和小明去台北玩
今天:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 記為x1
我 :[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 記為x2
和 :[0, 0, 0, 0, 0, 0, 0, 0, 1, 0] 記為x3
去 :[0, 0, 0, 0, 0, 0, 0, 1, 0, 0] 記為x4
台北:[0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 記為x5
玩 :[0, 0, 0, 0, 0, 0, 1, 0, 0, 0] 記為x6
小明的向量表示為:
小明 :[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
我們的輸入就是:
X = x1 + x2 + x3 + x4 + x5 + x6 = [1, 1, 0, 0, 0, 1, 1, 1, 1, 0]
這個輸入是把「小明」這個詞的上下文全部作為輸入,而如果我們只是要前後的一個,那就只要加總「和」以及「去」。
[Resource](https://zhuanlan.zhihu.com/p/39562499)
### doc2vec model:
許多機器學習算法需要的輸入是一個固定長度的向量,當涉及到短文時,最常用的固定長度的向量方法是詞袋模型(bag-of-words)。儘管它很流行,但是詞袋模型存在兩個主要的缺點:一個是詞袋模型忽略詞序,如果兩個不同的句子由相同的詞但是順序不同組成,詞袋模型會將這兩句話定義爲同一個表達;另一個是詞袋模型忽略了語義,這樣訓練出來的模型會造成類似’powerful’,'strong’和’Paris’的距離是相同的,而其實’powerful’應該相對於’Paris’距離’strong’更近纔對。
Doc2vec又叫Paragraph Vector是Tomas Mikolov基於word2vec模型提出的,其具有一些優點,比如不用固定句子長度,可以接受不同長度的句子做訓練樣本,Doc2vec是一個無監督學習算法,該算法用於向量來表示文檔,該模型的結構潛在的克服了詞袋模型的缺點。另外,word2vec預測詞向量時,預測出來的詞是含有詞義的,比如上文提到的詞向量’powerful’會相對於’Paris’離’strong’距離更近,在Doc2vec中也構建了相同的結構。所以Doc2vec克服了詞袋模型中沒有語義的去缺點。
* Doc2vec有兩種訓練方式,一種是PV-DM(Distributed Memory Model of paragraphvectors)類似於word2vec中的CBOW模型

PV-DM模型,每次從一句話中滑動採樣固定長度的詞,取其中一個詞作預測詞,其他的作輸入詞。輸入詞對應的詞向量word vector和本句話對應的句子向量Paragraph vector作爲輸入層的輸入,將本句話的向量和本次採樣的詞向量相加求平均或者累加構成一個新的向量X,進而使用這個向量X預測此次窗口內的預測詞。
Doc2vec相對於word2vec不同之處在於,在輸入層,增添了一個新句子向量Paragraph vector,Paragraph vector可以被看作是另一個詞向量,它扮演了一個記憶。詞袋模型中,因爲每次訓練只會截取句子中一小部分詞訓練,而忽略了除了本次訓練詞以外該句子中的其他詞,這樣僅僅訓練出來每個詞的向量表達,句子只是每個詞的向量累加在一起表達的。正如上文所說的詞袋模型的缺點,忽略了文本的詞序問題。而Doc2vec中的Paragraph vector則彌補了這方面的不足,它每次訓練也是滑動截取句子中一小部分詞來訓練,Paragraph Vector在同一個句子的若干次訓練中是共享的,所以同一句話會有多次訓練,每次訓練中輸入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,該句子的主旨每次都會被放入作爲輸入的一部分來訓練。這樣每次訓練過程中,不光是訓練了詞,得到了詞向量。同時隨着一句話每次滑動取若干詞訓練的過程中,作爲每次訓練的輸入層一部分的共享Paragraph vector,該向量表達的主旨會越來越準確。
* 另一種模型是PV-DBOW(Distributed Bag of Words of paragraph vector)類似於word2vec中的skip-gram模型

該模型原理和PV-DM模型相同,但是該模型的輸入是paragraph id的句向量,在隨機梯度下降的每一次迭代中採樣一個文本窗口(text window),再從該文本窗口中隨機採樣一個詞,從而形成一個給定段落向量進行詞預測的多分類任務。該模型和Skip-gram模型相似。
[Resource](https://www.twblogs.net/a/5db38150bd9eee310ee69608)
### Bidirectional Encoder Representations from Transformers (BERT):
* Transfer Learning:
遷移學習的概念,簡單說就是將已經在一個特定資料集上訓練好的模型拿來用於另一個資料集的訓練。它所應用的情境通常是,自己所要做的任務僅有少量標註資料,不足以訓練一個好模型,但是公開領域中已經有了許多跟自己的任務相似或資料相似的大型標註資料集。那麼將已經在大型資料集上訓練好的模型拿來在自己的任務上繼續訓練,往往會獲得比較好的結果。這是因為模型已經透過大型資料集的學習有了一定的對於任務的理解、對於資料特徵提取的掌握。
* BERT的兩步驟訓練法:
1. 預訓練Pretraining:BERT透過一些已經定好的任務進行預訓練,這類任務的要求是不需要進行人工標註,只要利用序列本身已有的資訊即可。原始BERT的預訓練任務有兩個:其一是「克漏字」,隨機將語句中的少數詞語遮住,然後訓練BERT模型猜出被遮住的詞語是什麼;其二是「下一句預測」,將上下相連的兩個句子中的第二句(下一句)以固定比率替換成其他句子,訓練模型判斷這個句子是否是第一句的下一句。
2. 微調Fine-tune:已經預訓練好的模型最擅長的就是預訓練任務,但是實際應用場景中,我們並不需要克漏字和下一句預測。我們需要的是文本的分類、命名實體識別、問答、摘要等等。要讓已經預訓練好的模型學會實際任務的處理方式,也同時調整它已經學到的文本的表示來適應該任務的文本語義,我們必須做fine-tune。這個步驟是在BERT模型的輸出部分設計一個自己的小模型(通常簡單的線性層即可),讓整個模型的輸出可以符合任務需要。

* 嵌入Embedding:
在BERT模型發明之前,詞嵌入主要由Word2Vec來完成。但Word2Vec的缺點是無法分辨脈絡(Context),也就是說,在Word2Vec所轉換的詞嵌入結果中,一個詞在任何語句中的表示向量都是一樣的。例如以下句子中的「自然」:
大自然真美好,我想生活在綠色環境中。
順其自然吧,沒什麼好難過的。
礦泉水是最自然的飲用品。
詞本身沒有變化,變的是在詞語上下的文本脈絡。而BERT正可以彌補這個缺失,讓詞語根據上下文轉換成符合脈絡的嵌入。因此,BERT的輸入必定是一個完整的文本序列。而輸出則是序列中每個詞語對應的多維向量。

上圖是BERT的輸入的說明,兩道分隔線將圖片分成三個部分,最上層是作為文本序列的輸入(預處理後的原始資料),第二層是實際BERT模型需要的三個輸入,第三層則是在Pytorch、Transformers模組中的三個輸入。我們實際用Python進行模型微調的時候只要輸入最下方第三層的三個輸入即可。
* 文本的預處理:
1. [CLS]:Special Classification Embedding,用於每個序列之首,Fine-tuning時用於聚集所有分類資訊(BertPooler,一個全連接層將整句的資訊用第一個token表示),代表整個序列的語義。
2. [SEP]:有兩個句子的文本會被串接成一個輸入序列,並在兩句之間插入這個 token 以做區隔。
3. [PAD]:佔位符,將長度不一的輸入序列補齊方便做 batch 運算。
除了上述三個之外,BERT還有以下兩個特殊token:
4. [UNK]:沒出現在 BERT 字典裡的字會被這個 token 取代。
5. [MASK]:未知遮罩,僅在預訓練階段的克漏字任務中會用到。
* 用Transformers微調所使用的三個輸入:
1. Token Embeddings:也就是詞嵌入。只是BERT模型的輸入的Token embeddings是最淺層的詞嵌入,只能代表詞語的淺層特徵(例如字符長度之類的),也沒有包含上下文脈絡,因為還沒有經過與序列中其他token的運算。
2. Segment Embeddings:分段嵌入。只有兩種不同的向量,用於在輸入是兩個句子時分辨 token 是屬於哪個句子。第一句子的每一個詞對應相同的Segment Embedding,第二句對應第二種Segment embedding。
3. Position Embeddings:表示序列位置的嵌入。因為BERT是同時輸入做平行計算,而非一步步按照序列進行輸入,所以無法自然得知序列的前後順序,需要一個位置嵌入來補足。
Token Embeddings、Segment Embeddings、Position Embeddings是已經包含在BERT模型中的嵌入,在實際應用過程中,我們只要能撈取到對應的Embeddings即可。這些嵌入是以字典的形式進行儲存,例如對於Token Embeddings,每一個不同的詞(Token)對應固定ID的嵌入。所以我們只要把詞語轉換為對應的數字id即可。而BERT模型在釋出時也會提供相應的字典,讓你可以進行自動對應。
這部分的三個輸入(下方括號內為此輸入在Transformers中的變量名稱)分別有:
1. tokens_tensor(input_ids):每個token的索引值,用於對應Token Embeddings。可以用BERT模型提供的vocab.txt查到。
2. segments_tensor(token_type_ids):對應Segment Embeddings,識別句子界限,第一句中的每個詞給0,第二句中每個詞給1。
3. masks_tensor(attention_mask):排除佔位符(<pad>)用,界定自注意力機制範圍,為1則是有意義的文本序列內容,進入後續運算,<pad>對應0,不進入運算。
* BERT 輸出
1. Batch是機器學習中常使用的概念,它指的是我們每次訓練或推論時送固定數量的樣本給模型,Batch Size就是這個每次送入的樣本數量。在訓練BERT模型時,我們一般取12、16、32、64等數值(取決於GPU顯存)。
2. 序列長度顧名思義就是你送入的每一個樣本的文本序列長度,值得注意的是,因為BERT模型通常會將一些字詞進行拆解,分為wordpiece後再進行運算,而且會額外插入模型專用的特殊token(<CLS>,<SEP>等),所以送給模型的序列長度通常比原始資料的文本長度更長一些。
3. Hidden State Size就是我們所說的詞嵌入的維度,它是由模型在預訓練階段即規定好的。Hidden State Size越大代表抽取的特徵越多,運算耗費時間更久,但也更有可能獲得更好的效果。BERT的Base版模型的Hidden State Size為768,Large版本則為1024。
以上三個概念正是對應於BERT Encoding後的模型輸出的三個維度的數值。在下圖中,12代表Batch Size為12,160指的是該批次中最長的樣本的序列長度(其他短於160的樣本則被<PAD>補齊到160),768則代表Hidden State Size,說明這是一個Base版本BERT模型的輸出,每一個詞都被轉化為768維的向量了。它們共同構成了一個三維的大型矩陣。


[Resource 1](https://ithelp.ithome.com.tw/articles/10260092)
[Resource 2](https://ithelp.ithome.com.tw/articles/10260396)
[Resource 3](https://ithelp.ithome.com.tw/articles/10260866)
---
## 名字:宜庭
### Word2vec
* 透過向量表達一個詞彙。
* 經由**上下文**給定詞彙向量。
* 出現在類似上下文的詞彙會有相近的向量。
* 為 static embeddings,不會隨著文本調整 embeddings。
* 訓練分類器處理預測任務:「詞彙 *w* 有可能出現在 *c* 附近嗎?」
* 經由預測任務學習到的權重將作為該詞彙的 embedding,而詞彙的出現位置也可作為回答上述問題的答案 (==self-supervision==)。
* 兩種方法:
* skip-gram: 利用 target word 來預測附近的 context words (預測次數多)。

> *w*: target word
> *c*: context word
> 藉由更新參數 *θ* 最大化 context words 的出線機率乘積。
* Negative Sampling: 讓模型學習非上下文的詞彙 (非 window size 中所包含的字),以優化 skip-gram。
* CBOW: 利用附近的 context words 來找 target word (僅預測一次)。
* 藉由 Hierarchical Softmax 來縮短訓練所需的時間。
* 以霍夫曼編碼 (huffman coding) 建立二元數,經由統計每個詞彙的出現頻率,來決定詞彙的編碼 (高頻詞的編碼位元數較低)。
[Reference 1](https://medium.com/@pocheng0118/word2vec-from-scratch-skip-gram-cbow-98fd17385945)
[Reference 2](https://web.stanford.edu/~jurafsky/slp3/6.pdf)
### Pointwise Mutual Information (PMI):
* 用以計算兩個詞彙之間是否存在某種關係 e.g., 兩字常一起出現可能帶有某種特定訊息。
$$ pmi(x, y) = log\frac{P(x, y)}{P(x) P(y)} \ $$
> *P(x)*: 文字 *x* 的出現機率。
> *P(y)*: 文字 *y* 的出現機率。
> *P(x, y)*: 文字 *x* 和 *y* 共同出現的機率。
> 數值可能為正無限大到負無限大 (∵ 取 log) → PPMI: 以 0 取代負值。
* 兩個字的出現愈非偶然,計算出來的 PMI 值愈大。
* 但 PMI 在計算極罕見的詞彙時可能會出現偏差 (數值會極大,∵ 分母為極小的分數相乘),可藉由**調整機率的計算方式** (*$P_α(c)$*)或 **Laplace smoothing** 來改善。
[Reference 3](http://cpmarkchang.logdown.com/posts/195584-natural-language-processing-pointwise-mutual-information)
[Reference 4](https://web.stanford.edu/~jurafsky/slp3/6.pdf)
### Term Occurrence (TO) vs Binary Term Occurrence (BTO)
* TO 為最基本的詞向量方式。
* 計算每個 document 中,詞彙出現的次數。
$$ N_ij = T_i (D_j) $$
> *T_i*: 詞彙出現的次數。
> *D_i*: 每一個 document。
* BTO 不同於 TO 之處在於,他的出現結果僅有 0 和 1 (沒出現 / 有出現)。
[Reference 5](https://www.ijitee.org/wp-content/uploads/papers/v9i10/D1938029420.pdf)
---
## 名字:孟青
### Word2Vec
* 將字詞表示成空間中的向量,可以利用向量間的距離,來代表文本語意上的相似程度(cosine similarity)
* 讓機器理解人類用的詞語,把符號數學化
1. CBOW (Continuous Bag of Words)
<img src="https://i.imgur.com/JQQbtPf.png" width=60%>
* 利用所有input data(語料庫)中,每個(經過斷詞後)的上下文詞語組合,預測目標字詞本身出現的機率有多少。
* 圖中的w就是每個詞的權重矩陣(訓練完成後會就是該詞的詞向量)
* CBOW模型的目的是讓當前字詞(要被預測的對象w(t))的出現機率越高越好。
2. skip-gram
<img src="https://i.imgur.com/QrweqQN.png" width=60%>
* CBOW的相反,根據當前詞語預測上下文詞語的機率
### Doc2Vec
* 「段落」間的相近程度是如何(cosine similarity)
* 非監督式演算法
1. 將Word2Vec算出的詞向量相加做平均處理
--> 沒有考慮到字詞的先後順序,以及上下文關係,而且段落長度可能相差非常多
2. PV-DM (Paragraph Vector - Distributed Memory)

* 與CBOW相似
* paragraph_id先映射成一paragraph vector
* 訓練過程中 paragraph_id跟詞一樣保持不變、參與每個詞的訓練,待每個詞都被訓練到以後,也會獲得一個代表這段文檔的向量(文檔權重D)
* 在預測新的句子的時候,會將該Paragraph vector隨機初始化,放入模型中再根據隨機梯度下降求得最終穩定下來的句子向量。
Doc2vec相對於Word2vec不同之處在於,在輸入層增添了一個新的句子向量**Paragraph vector**,Paragraph vector將**詞序**納入考慮,它每次訓練是滑動擷取句子中一小部分詞來訓練,Paragraph Vector在同一個句子的若干次訓練中是共享的,所以同一句話會有**多次訓練**,**每次訓練中輸入都包含Paragraph vector**。
3. PV-DBOW (Paragraph Vector - Distributed Bag-of-words)
<img src="https://i.imgur.com/vyDLkU9.png" width=80%>
* 與Skip-gram相似
* 使用文檔權重矩陣來預測每個詞出現的機率
4. GloVe (Global Vectors for Word Representation)
* 由史丹佛(Stanford)研究團隊所創造
* 基於全局詞頻統計(count-based & overall statistics)的詞表徵(word representation)工具
* 把一個單詞表達成一個由實數組成的向量
* 向量捕捉到了單詞之間一些語義特性,比如相似性(similarity)、類比性(analogy)等。
* GloVe綜合了LSA、CBOW的優點,訓練更快、對於大規模語料算法的擴展性也很好、在小語料或者小向量上性能表現也很好。
[source](https://medium.com/datamixcontent-lab/資料分析師自學筆記-概念-實作篇-自然語言處理入門-之-word2vec-doc2vec-比較-c94dd0a407c7)
[source](https://www.gushiciku.cn/pl/pLpL/zh-tw)
### BERT
* 由多個 Transformer encoders 相疊而成 (multi-layer bidirectional Transformer encoder)

* BERT base–12 layers (transformer), 12 attention heads, & 110 million parameters
* BERT Large–24 layers, 16 attention heads and, 340 million parameters
* Bidirectional: BERT 的 self-attention layer 是雙向的,也就是訓練時會從 token(一個字符)的上、下文學習--> contextual cues

* 句子開頭以 [CLS] 做標記
* 斷句時以 [SEP] 做標記
* Input Embedding是Token, Segment, Position的加總
* BERT pre-training: unsupervised
1. Masked Language Model: 克漏字測驗
2. Next Sentence Prediction: 讓模型判斷後面的句子是否是前面句子的下一句,利用[CLS]和[SEP]
3. Google 以 BooksCorpus 上 800M 個詞與英文維基百科 2500M 個詞進行 Pre-training
* Downstream task of BERT (Fine-tuning)

[source](https://medium.com/datamixcontent-lab/nlp-自然語言處理-將-bert-加入-tf-keras-model-與-bert-起源淺談-1b84a183482d)
[source](https://https://people.cs.umass.edu/~miyyer/cs585/lectures/10-sesamest.pdf)
### ERNIE
* 屬於transformer encoder的部分

* 最下層的encoder的輸入是word embeddings

* 與BERT不同的地方在於masking的策略: 將phrase及entity視為一個單位--> more generalize
1. Baic-level masking (e.g., apple)
2. phrase masking (e.g., a series of)
3. entity masking (e.g., J.K. Rowling)
* 較BERT多了denoising entity auto-encoder (dEA)的預訓練:模型能夠根據給定的實體序列和文本序列來預測對應的實體
* tokens:
1. 【CLS】:該token含有句子的信息,可適用於一般任務
2. 【HD】和【TL】:該token表示關係分類任務中的頭實體和尾實體(類似於傳統關係分類模型中的位置向量),然後使用【CLS】來做分類
3. 【ENT】:該token表示實體類型,用於entity typing等任務。
* ERNIE 2.0 加入連續學習(Continual Learning):訓練多個不同的任務以便在學習下個任務時可以記住前一個任務所學習到的結果。
[source](https://https://zhuanlan.zhihu.com/p/87008569)
[source](https://bigdatafinance.tw/index.php/tech/methodology/1559-bert-nlp-part-i)
---
## 名字:柏瑄
### Word2vec
- Converts a set of words into a vector based on their semantic relation to each other
- Does so by conduncting a "fake task" that tries to predict the possible output based on the input => the probabilities are then used to indicate how similar the words are to the input word
### CBOW & skip-gram

Mirror of each other:
- CBOW uses a fixed window size of context words to predict a single word; skip-gram predicts the context words with an input word
---
## 名字:譚欣
### pointwise mutual information
- the underlying assumption is that when two words co-occurr more frequently, they share mutual information, or there is a certain unique concept.
- 算試如下

- 如果兩個事件是獨立的, 則 PMI = 0,他們的相遇便是偶然的。
- 如果一個字自己一個人出現的機率不高,但他跟另一字出現的機率卻很高的話,則他們的 PMI > 0,他們的相遇不是偶然的,是命中註定,有意義的。
[source 1](http://cpmarkchang.logdown.com/posts/195584-natural-language-processing-pointwise-mutual-information) [source 2](https://medium.com/dataseries/understanding-pointwise-mutual-information-in-nlp-e4ef75ecb57a)
### BERT
- BERT 就是他

是 Google 工程師的趣味。
- BERT 有兩個步驟
- pretaining: 它是以字的序列的資訊拿來訓練。它認為上下文是很有用的資訊,看字的排序就可以看出有用的資訊。方法有兩個,一個是克漏字,一個是它是不是他的下一句。
- fine-tuning: 就是拿來做你想做的事情,看你要幹嘛的,可以翻譯,可以分類,可以問答,快樂似神仙。
- BERT pretrain 出的東西是 word embedding
[source](https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html)
### word embedding
- bag of words (BOW)
- word vector
把文句中字,變成向量來表示

如果字越靠近彼此,表示字的資訊越靠近。或者詞義上的關聯也可以如此表示
Embedding 的概念是將字這個在文本空間映射到空間向量上。因此,一段文字的輸入,輸出後就會變成一長串的向量資訊,像 [0,1,0,0,0,0,]
[source](https://medium.com/ml-note/word-embedding-3ca60663999d)
### word2vec
- it is an predicted based embedding,分為兩個模型:1. CBOW 2. skipgram
1. CBOW (continuous bag of words)

用一個字的前後文來做預測這個字的出現。
2. skipgram

用一個字來預測他的前後文
[source](https://tengyuanchang.medium.com/讓電腦聽懂人話-理解-nlp-重要技術-word2vec-的-skip-gram-模型-73d0239ad698)
---
## 名字:宜君
### Word2Vec
* word vector: 用 vector 表達一個字的含義,相似的字會聚集在一起,如果將 word vector 投射到二維空間就像下圖:
<img src="https://i.imgur.com/JNU2b4C.png" width='80%'>
* word2vec 就是想要訓練出理想的 word vector
* 只需要大一點的 corpus 以 unsupervised learning 的方式就可以訓練出 word vector
* 方法一:skip-gram model
* 文件中的每個字都可以當成 input ,這些 input 也就是 center words ,從這些 center words 去預測 context words,計算過程就是給定一個 center word($w_c$) 預測周圍有某個 context word($w_o$) 的條件機率為何:$P(w_o|w_c)$

* word2vec network
* d = dimension (太大會影響訓練效率,一般而言,d = 300 尤佳)
* V = vocabulary 的字數
* input: center word 的 one-hot vector
* 經過 layer V 得到 center word vector
* 經過 layer U 計算 center word vector 和 context word vector 的內積得到 similarity
* 最後透過 softmax ,使得最後一層輸出的機率分佈總和為 1

* 方法二:continuous bag of words model (CBOW)
* 透過 context words 推敲出 target words
* input: context word 的 one-hot vector
* context vector 加總平均 ---> 中間的 hidden layer
* 最後透過 output layer 預測 target words
<img src="https://i.imgur.com/OH4UGW3.png" width='65%'>
* 二個 model 相比:
* skip-gram 訓練時間較長
* 在 NLP 應用上,語意上適用 skip-gram,句法適用 CBOW
[Reference 1](https://ithelp.ithome.com.tw/articles/10243725)
[Reference 2](https://medium.com/手寫筆記/使用-tensorflow-學習-softmax-回歸-softmax-regression-41a12b619f04)
[Reference 3](https://medium.com/daai/引起你對-word2vec-基本概念-524c8b758f99)
[Reference 4](https://www.baeldung.com/cs/word-embeddings-cbow-vs-skip-gram)
### Doc2Vec
* 與 word2vec 概念相似,只是換成文檔轉向量
* 由於過去 bag-of-words 的方法沒有考慮到詞序,因此, doc2vec 延伸了 word2vec 的概念來解決這個問題
* 方法一:PV-DM(Paragraph Vector: A distributed memory model)
* 由 CBOW 衍生出來的 model
* 不同於 CBOW ,多了一個文檔矩陣
* 以前面的詞預測下一個詞的機率,通常會固定一個 wondow size 後作預測
* 在訓練時,document id 是不變的
<img src="https://i.imgur.com/vWe1YYf.png" width='90%'>
* 方法二: DBOW(Distributed bag of words)
* 由 skip-gram model 衍生出來的
* 利用文檔的矩陣來預測文檔中每個詞出現的機率
* 不同於 skip-gram ,DBOW 的 input 是文檔的權重
<img src="https://i.imgur.com/wq0vXTM.png" width='90%'>
[Reference 1](https://ddoo8059.medium.com/讀paper之心得-word2vec-與-doc2vec-5c8b8daa7f12)
[Reference 2](https://thinkinfi.com/simple-doc2vec-explained/)
### Transformer
* sequence-to-sequence model; encoder-decoder model + self-attention mechanism
* input, output 都是 sequence (句子就是一種 sequence),由機器自行決定 output sequence 的長度
* encoder, decoder: encoder 會先將輸入的 sequence 也就是句子進行編碼,得到的狀態會傳給 Decoder 解碼產成目標句子
* attention mechanism: 當訊息太多時,seq2seq model 容易丟失訊息,所以有了 attention mechanism,encoder 在處理每個詞彙後所產成的 output 都交給 decoder,讓 decoder 自行決定在生成新序列時該「注意」哪些 encoder 的 output
* self-attention: encoder 跟 decoder 各自利用 self-attention 關注自己處理的 sequence ,以機器翻譯來說,就是擷取 sequence 中每個字的語義訊息來獲取上下文資訊
* transformer 分成 encoder, decoder 二大部分,其中包含了 encoder-decoder attention 及 encoder, decoder 各自的 self-attention layer
* transformer 示意圖
<img src="https://i.imgur.com/3OTBANx.png" width='100%'>
* transformer 應用 (左:encoder;右:decoder)
<img src="https://i.imgur.com/7zO2MIN.png" width='85%'>
### BERT
* Bidirectional Encoder Representation from Transformer
* encoder of transformer
* unsupervised learning
* 主要工作:輸入一個句子,輸出一個 embedding
* 任務一:masked LM (克漏字測驗)
* 將一個句子中其中 15% 的詞彙蓋掉 [MASK],要猜出這些被蓋住的詞彙有哪些
* 目的:讓 BERT 能產出每個詞彙在不同情境下的 vector/representation,也就是更能適應不同情境的 vector
<img src="https://i.imgur.com/0cP8pDJ.png" width='80%'>
* 任務二:next sentence prediction (預測後文)
* 判斷二個句子要接在一起還是分開
* 目的:讓 BERT 更清楚表現出兩個句子間的關係
<img src="https://i.imgur.com/2345sIK.png" width='80%'>
* 補充 bert 中的特殊詞彙:
* UNK: 用來取代沒出現在 BERT 字典裡的字
* PAD: 將長度不一的輸入序列補齊以方便運算
* 透過以上的預訓練任務所產生的 bert model ,可用來當作 feature 或對其他任務作 fine-tuning

[Reference 1](https://medium.com/@x02018991/機器學習筆記-transformer-628cfcd17ba6)
[Reference 2](https://leemeng.tw/neural-machine-translation-with-transformer-and-tensorflow2.html)
[Reference 3](https://medium.com/ching-i/transformer-attention-is-all-you-need-c7967f38af14)
[Reference 4](https://www.youtube.com/watch?v=UYPa347-DdE&t=1700s)
[Reference 5](https://dysonma.github.io/2020/11/21/bert_Introduction/)
[Reference 6](https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html)
---
## 名字:伊瑩
### word2vec
* 透過學習大量文本資料,將字詞用數學向量的方式來代表他們的語意。並將字詞嵌入到一個空間後,讓語意相似的單字可以有較近的距離。簡單來說就是把詞轉為可計算、有結構的向量的過程。
* Word2vec 是 Word Embedding 的方法之一,也有其他的Word Embedding方法 e.g. GloVe
* word2vec主要有兩種model: CBOW 與 Skip-gram,兩種model的訓練過程剛好相反
* Skip-gram 是給定輸入字詞後,來預測上下文

* CBOW 是給定上下文,來預測輸入的字詞


* 優點:比起之前的word embedding的方法好,會考慮到上下文,且維度更少、通用性很好
* 缺點:多義詞,因為word2vec是一個詞對應一個向量,如果一篇文章出現多義詞,就會有問題
[reference1](https://easyai.tech/ai-definition/word2vec/)
[reference2](https://tengyuanchang.medium.com/%E8%AE%93%E9%9B%BB%E8%85%A6%E8%81%BD%E6%87%82%E4%BA%BA%E8%A9%B1-%E7%90%86%E8%A7%A3-nlp-%E9%87%8D%E8%A6%81%E6%8A%80%E8%A1%93-word2vec-%E7%9A%84-skip-gram-%E6%A8%A1%E5%9E%8B-73d0239ad698)
### setiment analysis
* different types of sentiment analysis:
* *Graded Sentiment Analysis*
If polarity precision is importantyou might consider expanding your polarity categories to include different levels of positive and negative.
E.g. very positve: 5 stars/very negative: 1 star
* *Emotion detection*
Emotion detection sentiment analysis allows you to go beyond polarity to detect emotions, like happiness, frustration, anger, and sadness.
E.g. lexicon or complex machine learning algorithms
* *Aspect-based Sentiment Analysis*
want to know which particular aspects or features people are mentioning in a positive, neutral, or negative way.
* *Multilingual sentiment analysis*
[reference](https://monkeylearn.com/sentiment-analysis/)
### BERT model
* BERT應用廣泛:包含google搜尋時出現的text summerization,搜尋出相關的標題的網頁,或是搜尋一個問題會出現highlight的文字,gmail底下會出現推薦的回覆內容字句等等
* self-supervised learning,unsupervised learning的一種
* BERT 的構造是由多個 Transformer encoders 相疊而成 (multi-layer bidirectional Transformer encoder)
* BERT使用了 Bidirectional 的概念
Bidirectional: BERT 的 self-attention layer 是雙向的,也就是訓練時會從 token(一個字符)的上、下文學習,上下文很重要是因同樣的字擺在不同的上下文位置,會有不同含意
* BERT的pretraning的訓練過程方法1: mask input

一筆已經知道的文字sequence,隨機蓋住一些字/詞彙,也就是替換成一個特殊的token或是隨便替換成其他的字,之後透過BERT輸出的新的sequence,把原本蓋掉的部分transform成為一個linear的矩陣,再做softmax之後會有個vector是所有字的distribution,BERT訓練的目標就是要softmax後的結果和原本的答案越接近越好
* BERT的pretraning的訓練過程方法2: Next Sentence Prediction
從資料中分別取出兩個不同的句子,[CLS] & [SEP]標記分隔,放進去BERT訓練後,[CLS]標記的這個句子的輸出乘上linear transform的結果,預測這兩個句子是不是相接的句子(yes/no perdiction)
這個方法有因為方法太簡單(?)而被critisize

[reference1](https://medium.com/datamixcontent-lab/nlp-%E8%87%AA%E7%84%B6%E8%AA%9E%E8%A8%80%E8%99%95%E7%90%86-%E5%B0%87-bert-%E5%8A%A0%E5%85%A5-tf-keras-model-%E8%88%87-bert-%E8%B5%B7%E6%BA%90%E6%B7%BA%E8%AB%87-1b84a183482d)
[reference2](https://www.youtube.com/watch?v=ioGry-89gqE)
[reference3](https://www.youtube.com/watch?v=gh0hewYkjgo)
## 名字:Milan
### BERT
* def: BERT 是傳統語言模型的一種變形,而語言模型(Language Model, LM)做的事情就是在給定一些詞彙的前提下, 去估計下一個詞彙出現的機率分佈。
* technique: 2 phase
1. Pre-training
2. Fine-tuning

* training task
1. Next Sentence prediction
2. Masked Language Model

* 加入預訓練模型的有三種Embeddings
* Token embedding
* Segment Embedding
* Position Embedding: 因為天涯若比鄰的特性,需加入位置特徵告訴模型特定token在文本中的位置。

* 四種常見下游任務
* 單一句子分類任務
* 單一句子標註任務
* 成對句子分類任務
* 問答任務

### GRNN
* Gated Recurrent Unit
* 循環神經網路的一種
* 為了解決長期記憶與反向傳播中的梯度問題
<br>
> We choose to use Gated Recyrrent Unit (GRU) in our experiment since it performs similarly to LSTM but is computationally cheaper
* 有一個當前的輸入$x^t$,和上一個節點傳下來的hidden state $h^{t-1}$,這個hidden state包含了先前節點的相關資訊。
* 結合$x^t$和$h^{t-1}$,GRU會得到目前隱藏節點的輸出$y^t$,和傳遞給下一個節點的hidden state $h^t$

* 相較於LSTM,GRU使用相同的門,可以同時進行遺忘和選擇記憶(LSTM需要使用多個門控)
* 輸入輸出的結構和普通RNN相近,內部概念跟LSTM相近。但GRU更實用省錢省時間一點。
### Bag of Words
* Continuous Bag of Words
* model that trie to predict words given the context of a few words before and a few words after the targeting word
* different from language modeling
* not sequential
* does not have to be probabilistic
* bag-of-words use sparse vectores, CBOW uses dense vectors (continuous distributional embeddings)
* Distributed Bag of Words
### skip gram: works well with a small amount of the training data, represents well even rare words or phrases.
---
## 名字:雞丁
### word2vec
* word to vector,將文字的相關資訊,轉換成特徵,將文字以向量的方式表示,透過向量可以計算兩個文字之間的相似程度。
* 相關程度可以用餘弦(cosine)表示,兩者夾角越小,值越大,兩者越相關。
* 舉個爛例子,把甄嬛傳中的三個人物視作三個文字,他們的人物背景就代表了他們的特徵,轉換成向量後,透過餘弦值就可以比較齊妃和吉祥誰和翠果比較相關:
翠果-齊妃:$cos(\theta_1)$
翠果-吉祥:$cos(\theta_2)$
$cos(\theta_1)>cos(\theta_2)$

-
透過不同window size捕捉不同字詞組合的機率

* word2vec怎麼蒐集資訊:CBOW和skip-gram modle
* Skip-gram modle: 根據中心詞預測它的上下文
* 馬英九出現了,那等等吳敦義、郝柏村、朱立倫大概也會出現。
* CBOW: 根據上下文預測它的中心詞
* 吳敦義、郝柏村、朱立倫出現了,那等等馬英九大概也會出現。
### BERT

* Pre-training of BERT
* Cloze test(Masked Language Model, MLM),以克漏字(cloze)為靈感,將文本挖空後作為test set,送進MLM預測,文本中挖空處標記為 **[MASK]** ,機器需預測出挖空處應出現的單詞:
* 大家的reading note真的是 **[MASK]** 喔 :)
* 請不要造成同儕的 **[MASK]** 。
→如果在同一個格子中,可以填入數個不同的單詞,那這些單詞就會有相同的word embedding
* Nest Sentence Prediction
* 「你這個王八蛋」下一句話會是什麼呢?
* 我祝你身體健康! **[NO]**
* 怎麼還不去死啊! **[YES]**
* Pre-train完的BERT還可以加入新的線性分類器(Linear Classification)進行fine tuning。
### References
[自然語言處理入門- Word2vec小實作](https://medium.com/pyladies-taiwan/%E8%87%AA%E7%84%B6%E8%AA%9E%E8%A8%80%E8%99%95%E7%90%86%E5%85%A5%E9%96%80-word2vec%E5%B0%8F%E5%AF%A6%E4%BD%9C-f8832d9677c8)
[進擊的 BERT:NLP 界的巨人之力與遷移學習](https://leemeng.tw/attack_on_bert_transfer_learning_in_nlp.html)
###### tags: `QL`
<!-- ---
## 名字:
### 以下如果要用到標題請打三個以上的井字號 -->