---
# System prepended metadata

title: 語言模型
tags: [Data Science, NLP]

---

###### tags: `Data Science`,`NLP`

# 語言模型

# N-gram模型
假設在中文的所有句子中，每一百句對話會出現一次 **好的** ，則機率$P(好的)\approx 0.01$
>**我,喜歡,吃,火鍋** :point_right:  在中文出現的機率較高
**我,籃球,打,喜歡** :point_right:  在中文出現的機率較低
==一個語法完全正確的句子，出現的機率也可能極為接近零==
**我,吃,籃球** :point_right:  在中文出現的機率較低


由於中文的句子可以有無限多種組合，無法窮舉出分母有多大，故利用 **機率公式** 解決  

>$P(S)=P(w_1,w_2,w_3,...,w_n)$

展開為:point_right: $P(w_1,w_2,\dots,w_n)=P(w_1)\times P(w_2|w_1)\times P(w_3|w_2,w_1)\dots$ 

範例:point_right: $P(我,喜歡,\dots,火鍋)=P(我)\times P(喜歡|我)\times P(吃|喜歡,我)\dots$

==隨著單詞越多會漸漸無法計算==

故馬可夫提出:point_right:下一狀態的機率分布只能由當前狀態決定，在時間序列中前面的事件均與之無關，這種特定類型的「無記憶性」稱作 ==**馬可夫性質**==。

套用到句子中，則認為 $w_n$ 僅和 $w_{n-1}$相關，故出現 ==n-gram== 模型
~*n太小機率不準確，n太大無法運算，故通常令n=3~

當我們假設一個詞的出現不依賴於其他任何詞時，稱為unigram；
當一個詞的出現依賴於上一個詞時，我們稱為bigram

**N-gram缺點:**

1.無法找出==距離較遠==的詞之間的關係
2.無法建立詞的==相似度==
>    The dog is walking in the bedroom    
>    The cat is running in the bedroom
即使我們看不懂英文，也可以明白“cat”和“dog”、“walking”和“running”之間是相似的。
然而 N-gram 模型只能描述 “running“ 出現在 “cat” 和 “dog” 之後的概率都很高
但是無法表述“cat”與“dog”是這兩個詞是相似的。



# 神經網路語言模型 NNLM 
> 在自然語言處理的首要任務，便是將文字轉成機器看得懂的格式。

## One-Hot-Encoding

|Word|維度1|維度2|維度3|維度4|維度5|
|--|--|--|--|--|--|
|apple|1|0|0|0|0|
|bag|0|1|0|0|0|
|cat|0|0|1|0|0|
|dog|0|0|0|1|0|
|eye|0|0|0|0|1|


one-hot向量將每個單詞表示為完全獨立的實體，這樣的表徵方法主要有兩個問題：

- **有序性問題**：
無法反映文字的有序性。因為語言並不是一個完全無序的隨機序列。
一個字之後只有接特定的字才能組成一個有意義的詞。
特定的一系列詞按特定的順序組合在一起才能組成一個有意義的句子。
- **語義鴻溝**：
其無法通過詞向量來衡量相關詞之間的距離關係，即這樣的表徵方法無法反映詞之間的相似程度，因為任意兩個向量的距離是相同的。
$(w^{hotel})^Tw^{motel} = (w^{hotel})^Tw^{cat} = 0$
- **維度災難**：
高維情形下將導致資料樣本稀疏，距離計算困難，這對下游模型的負擔是很重的。

## Word-Embedding
> 解決1-of-N Encoding 無法敘述相似詞的問題
> 解決維度爆炸的問題

要將 Word 映射到向量空間，只知道輸入的文字，沒有對應的Label 可供訓練，故Word Embedding 是一個Unsupervised Learning的問題

> 原理: 讓機器讀入大量的句子，透過上下文的相似性，對單詞進行分群。
> 馬英九 520宣布就職 
> 蔡英文 520宣布就職
> 馬英九 is similar to 蔡英文


Word-Embedding 最有名的技術有兩個：
1. **Word2vec**：由Google的Tomas Mikolov研究團隊所創造。
2. **GloVe**：由史丹佛(Stanford)研究團隊所創造。

兩者的技術都是在計算單字在文件(Document)出現的次數，進而統計兩個單字共同出現的機率大小，以決定其相似性，也就是單字間的向量距離，距離越短表示越相似。另一方面，如果為每個單字都定義一個向量，所有單字就構成一個『向量空間』(Vector Space)，我們就可以計算相對距離，來預測單字構成的文章是屬於哪一類。


### Count based

- LSA 潛在語意分析
將每個詞的 tf-idf 值作為Y軸，每個文本作為X軸，形成一個矩陣
再進行 SVD 奇異值分解，將該矩陣降維

[Glove Vector](https://nlp.stanford.edu/projects/glove)


### Prediction Based
給定 $w_{i-1}$ ， 預測 $w$ 的機率

- Continuous Bag-of-Words Model
第一個提出的模型與feedforward NNLM相似，差在移除了非線性的hidden layer 及 projection layer 被所有的字共用(不只是projection matrix) , 然而 所有的字投射到同一個位置(their Vector are averaged) 稱為 詞袋模型

- Continuous Skip-gram Model


## Feedforward Neural Network Language Model(NNLM)
> 前饋神經網路

- 模型複雜度:

$$
O = E \times T \times Q
$$通常會設定
Epoch = 3 ~ 50 , T = 訓練總字數 , Q 隨著每個要訓練的資料集有所不同，
其中Q的定義為

$Q = N \times D + N \times D \times H+ H \times V$

$N$ = previous Word encoded by 1-of-$V$
$D$ = Dimensionality?
$H$ = Hidden layer size
$V$ = size of Vocabulary

- 所有模型都用**隨機梯度下降法(stochastic gradient descent)** 及 **反向傳播法(backpropagation)** 做訓練。


## Recurrent Neural Net Language Model (RNNLM)
> 就RNN

為了克服NNLM的諸多限制而提出，像是RNN需要固定上下文長度、輸入字詞順序等。理論上RNN可以更有效的代表更複雜的patterns.

RNN model 沒有projection layer，只有input hidden and output 
，此模型特別之處為 recurrent matrix 連結到 hidden layer 後又連回自己。藉以將前一個運算結果作為下一個的參數。

- RNN model的複雜度為

$Q = H \times H + H \times V$

Word Representations $D$ 與 Hidden Layer $H$ 有一樣的維度。
利用Hierachical Softmax 可以將 $H\times V$ 可以有效的降低成 
$H\times log_2(V)$
剩下的複雜度就都出現在 $H \times H$

- 模型訓練都在 Tensorflow 的前身 _DistBelief_ 上運算
 
## 新的 Log 線性模型
為了最小化計算複雜度，提出兩個新的 word representations 模型架構
, 先前模型的複雜度過高是由於非線性的hidden layer所導致。我們決定發展更簡單的模型，可能沒辦法那麼恰當的闡述類神經模型的概念，但可以讓運算更有效率。

根據先前的成果，類神經語言模型的建立主要依靠兩個訓練步驟，
1.用簡單模型所學習出的連續詞向量
2.利用 N-gram 類神經網路 針對連續詞向量進行訓練

### Continuous Bag-of-Words Model
第一個提出的模型與feedforward NNLM相似，差在移除了非線性的hidden layer 及 projection layer 被所有的字共用(不只是projection matrix) , 然而 所有的字投射到同一個位置(their Vector are averaged) 稱為 詞袋模型

### Continuous Skip-gram Model




[[Seq2Seq] Encoder-Decoder程式碼](https://zhuanlan.zhihu.com/p/27608348)







# 快速解读Google BERT模型 + Word Embedding

### One-Hot Encoding
- 每一個字都是一個維度,運算爆炸

### Bag of Words(BoW) 詞袋模型
- 將文本轉為詞頻統計表(Bag of Words)
- <Word, Count> Like <Car,20>

| |Doc1|Doc2|Doc3|
|---|---|---|---|
|car|27|4|3
|auto|3|33|0|
|insurance|0|33|29|
|best|14|0|17|

- 類似用法
    - cosine計算 兩詞高維向量距離
    - Euclidean Distance 向量末端距離差
    - Dot-Product 點乘積（向量相乘）
    - TF-IDF 詞頻-反向文件頻率

**==以上方式無論如何都會造成維度過高、計算困難==**

## 機率圖模型
![zz](https://i1.kknews.cc/SIG=8ndafr/ctp-vzntr/2n9p81np3r0q4q2591813p1642q24502.jpg)

[馬可夫模型的噪點消除沒看懂](https://read01.com/zh-tw/BngzoKK.html#.Xrn20igzaHt)
[機率圖模型解釋](https://kknews.cc/zh-tw/science/bk58y3m.html)
### [機率圖模型](https://read01.com/zh-tw/BngzoKK.html#.Xnxj_ygzaHs)

### [類神經機率語言模型 A Neural Probabilistic Language Model](http://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf)
### [Efficient estimate of Word Representations in Vector Space](https://arxiv.org/abs/1301.3781)