日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

N元模型

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 N元模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在自然語言處理的任務中,拼音糾錯、機器翻譯等任務都需要對某個句子的下一個單詞進行預測,或者評估某個句子的概率大小。例如預測如下句子的下一個單詞:

Please turn your home work...

在這個語境中,我們可能會預測下一個單詞是over或是in,而不是預測為the或其他單詞。

像這種對自然語言的句子進行建模,并賦予單詞或句子概率的模型稱為語言模型(LMs,Language Models)。在這篇博客中將介紹一種最簡單的語言模型-n元模型。n元模型對N個單詞組成的序列進行建模,例如2-元模型、3-元模型等。2-元模型就是兩個單詞組成的序列,比如please turn,turn your,your homework等等。

N元模型

根據語境預測下一個單詞是什么的任務可以形式化的表示為:已知history h,求下一個單詞是w的概率 $P(w|h) $。例如

\[ P(the|\ its\ water\ is\ so\ transparent\ that\ ) \]

如果有一個很大的語料庫(比如web語料),我們可以采用頻率估計的方法計算上式,這個問題可以轉化為

\[ P(w|h) = \frac {P(hw)}{P(h)} = \frac {Count(hw)}{Count(h)} \]

\[ P(the|\ its\ water\ is\ so\ transparent\ that\ ) =\frac {P(\ its\ water\ is\ so\ transparent\ that\ the\ )}{P(\ its\ water\ is\ so\ transparent\ that\ )} = \frac {Count(\ its\ water\ is\ so\ transparent\ that\ the\ )}{Count(\ its\ water\ is\ so\ transparent\ that\ )}\]

即分別計算在語料庫中its water is so transparent that the出現的次數和its water is so transparent that出現的次數,然后做除法。這種方法在一些任務上的效果很好,但在一些任務中不能給出很好的結果,主要原因有以下兩點:

語言具有創造性:新的句子和單詞的組合方式總是在出現,我們不能總是計算整個句子的概率。而且在這種方法中,即使只是簡單的對例句進行了擴展也可能會產生句子的出現概率為0的情況。
計算量過大:在這種計算方式下,如果我們想要計算its water is so transparent出現的概率,我們首先需要獲得語料庫中這個句子出現的次數,還要計算語料庫中所有五個單詞組成的句子的次數。毫無疑問,這種方法的計算量太大了。
我們需要采用一種更好的方法來計算,首先可以采用鏈式法則將整個句子的概率計算簡化為如下形式

\[ P(w^{n}_{1}) = P(w_{1})P(w_{2}|w_{1})P(w_{3}|w^{2}_{1})....P(w_{n}|w^{n-1}_{1}) \]

但是\(P(w_{n}|w^{n-1}_{1})\)的概率還是無法計算。N元模型的思想是,將history簡化為最近的幾個單詞。例如在二元模型中,\(P(w_{n}|w^{n-1}_{1}) = P(w_{n}|w_{n-1})\)。也就是在計算\(P(the|\ its\ water\ is\ so\ transparent\ that\ )\)的概率時近似的用 $P(the|that) $來代替。
這種采用 \(P(w_{n}|w_{n-1})\) 來近似 \(P(w_{n}|w^{n-1}_{1})\) 的假設稱為馬爾科夫假設。馬爾科夫模型是指在預測的時候不過多的考慮前文的一系列模型。將馬爾科夫假設應用到N元模型中為:\(P(w_{n}|w^{n-1}_{1})\ =\ P(w_{n}|w^{n-1}_{n-N+1})\)
對二元模型來說,$ P(w^{n}{1}) $的的計算可以簡化為如下公式:
\[ P(w^{n}_{1})\ =\ \prod^{n}_{k=1} P(w_{k}|w_{k-1})\]
在這個公式中,模型的參數是所有的 \(P(w_{k}w_{k-1}),P(w_{k-1})\)。極大似然估計可以證明,在n次實驗、m種可能結果的情況下,如果我們已知每種結果發生的頻次,可以用 \(P(p_{i})=\frac{n_{i}}{n}\) 作為對第i種結果的概率估計,即用頻率估計參數。在本模型中,m種可能的結果為$ w
{k}$的各種排列組合結果,n為語料庫的語句,則可得到如下式子:
\[ P(w_{n}|w_{n-1})=\frac{C(w_{n-1}w_{n})}{\sum_{w}{C(w_{n-1}w)}} \]
其中 \(\sum_{w}{C(w_{n-1}w)}\) 計算了\(w_{n-1}\)的各種后綴的數目總和。其實就是\(w_{n-1}\)的總數。則上式可以簡化為
\[ P(w_{n}|w_{n-1})=\frac{C(w_{n-1}w_{n})}{C(w_{n-1})} \]將整個式子推廣到一般情況可得
\[ P(w_{n}|w^{n-1}_{n-N+1})=\frac{C(w^{n-1}_{n-N+1}w_{n})}{C(w^{n-1}_{n-N+1})} \]

將二元模型應用在實際中我們可以看到統計學可以將語法知識,甚至文化等編碼進概率。比如eat的后面常常跟著一個名字或者副詞,to后面常常跟著一個動詞等語法常識,或者是I通常是一句話的開頭等個人習慣,以及人們尋求中餐的概率比英式食物的概率要高等文化習俗。另外,由于概率是介于0和1之間的浮點數,在將多個概率相乘后得到的數可能會非常小,因此我們常常對概率取log進行表示。

語言模型的評估

評估一個語言模型的最好方法是將它放在應用系統中,看這個模型為系統帶來了多少提升。這種方法被稱為外部測試(extrinsic evaluation)。外部測試可以準確的知道這個模型對系統是否真的有用,但是這種測試的代價太高,一版不會使用。相對的,我們一般采用內部測試,內部測試的思想是獨立于任何一個應用系統對模型進行測試。
內部測試需要測試集(test set)和訓練集(training set)。我們拿到一份語料后,將其劃分為訓練集和測試集兩部分。模型在訓練集上進行參數訓練,在測試集上評估模型效果。需要注意的是,測試集和訓練集的數據不能有交叉,測試集必須是模型“沒有見過”的數據。那么在測試集上如何評估模型效果呢?如果模型能更準確地預測數據或是更緊的收斂于測試集,就稱這個模型的效果更好。
有時我們頻繁的使用某個測試集,會使得模型隱式地被這個測試集校準。這時我們需要一個全新的測試集來評估模型,之前的測試集又被稱為開發集(development set)。那我們如何將我們的數據集劃分為訓練集、開發集和測試集呢?我們不僅希望測試集足夠大(小的測試集可能不具有代表性),又希望獲得更多的訓練數據。我們可以選擇在能夠提供足夠的統計數據測試模型的效果的前提下的最小測試集。在實踐中,我們通常將數據集劃分為80%的訓練集,10%開發集和10%的測試集。
困惑度
我們一般不直接使用模型的測試結果作為模型的評價指標,而是一種叫做困惑度(perplexity,pp)的變量。模型的困惑度是模型在測試集上的概率被詞匯數N規范化以后的值。例如,測試集\(W=w_{1}w_{2}w_{3}...w_{N}\)的困惑度為
\[ PP(W)= P(w_{1}w_{2}w_{3}...w_{N})^{-\frac{1}{N}} = \sqrt[N]{\frac{1}{P(w_{1}w_{2}w_{3}...w_{N})}}\]
我們可以采用鏈式法則進行簡化
\[ PP(W)= \sqrt[N]{\prod^{N}_{i=1}{\frac{1}{P(w_{i}|w_{1}...w_{i-1})}}} \]
應用二元模型可得
\[ PP(W)=\sqrt[N]{\prod^{N}_{i=1}{\frac{1}{P(w_{i}|w_{i-1})}}} \]
可以看到,要最大化模型在測試集上的概率,可以通過最小化困惑度來完成。

接下來我們通過一個例子來看困惑度如何比較模型的效果。基于華爾街日報訓練的三個模型:一元模型、二元模型和三元模型的困惑度如下表所示:

\一元模型二元模型三元模型
困惑度962170109

可以看出,模型提供的信息量越大(三元模型),模型的困惑度就越低,單詞的后繼詞匯就越確定。需要注意的是,在比較困惑度時,必須基于同一個測試集。

采用模型生成語句

像很多統計模型一樣,N元模型也依賴于訓練語料。這意味著模型中編碼了訓練集中的一些特定信息,而且隨著N的增大,N元模型對訓練集的建模效果會越來越好。下面我們將直觀的反應N元模型的這兩個特點。
我們采用香農和米勒在1951年提出的生成隨機語句的方法來展示N元模型的特點。一元模型是最容易展示的。
一元模型生成語句算法:

  • 為詞匯賦予概率:根據每個詞匯的頻率為其賦予一個0到1之間的數字
  • 產生隨機數序列:產生一個隨機數序列,每個隨機數都在0到1之間
  • 根據隨機數序列產生隨機語句:隨機序列中的每個隨機數a都可以找到一個詞匯,該詞匯的概率為a

    根據上述算法可以產生一元模型的隨機語句。類似的,我們可以得到二元模型的隨機語句,其產生算法如下所示:
  • 計算每個二元詞組的概率P(a|b)
  • 假設句子的開始標志為<s>,從所有以<s<開始的二元組中隨機選出一組,假設這組為(<s>,w)
  • 接下來從以w開頭的二元組中隨機選擇一組,重復這兩個過程,直到產生結束符</s>

下面給出四個模型產生的隨機語句:

模型隨機語句
一元模型-To him swallowed confess hear both.Which .Of save on trail for are ay device and rote life have . -Hill he late speaks;or! a more to leg less first you enter
二元模型-Why dost stand forth thy canopy,forsooth;he is this palpable hit the King Henry.Live king.Follow. -What means,sir.I confess she?then all sorts,he is trim,captain.
三元模型-Fly,and will rid me these news of price.Therefore the sadness of parting,as they say,'tis done. -This shall forbid it should be branded ,if renown made it empty.
四元模型-King Henry.What! I will go seek the traitor Gloucester.Exeunt some of the watch. A great banquet serv'd in; -It cannot be but so.

這八條語句由四個N元模型產生,訓練語料均為莎士比亞的作品。可以看出,模型訓練的上下文越長,句子越連貫。在一元模型中,單詞之間沒有關聯,二元模型中單詞之間有一些關聯,三元模型和四元模型生成的語句看起來就很像莎士比亞的風格了。It cannot be but so直接來自《King John》。
為了理解模型對訓練語料的依賴,我們在另外一個語料(華爾街日報)上重新訓練了這四個模型。結果如下:

模型隨機語句
一元模型Months the my and issue of year foreign new exchange's september were recession exchange new endorsed a acquire to six executives.
二元模型Last December through the way to preserve the Hudson corporation N.B.E.C.Taylor would seem to complete the major central planners one point five percent of U.S.E. has already old M.X. corporation of living on information such as more frequently fishing to keep her
三元模型They also point to ninety nine point six billion dollars from two hundred four oh six three percent of the rates of interest stores as Mexico and Brazil on market conditions.

比較在兩個語料上生成的模型可以發現,兩個模型生成的語句之間沒有交叉,甚至是詞組上也沒有交叉。可見,如果訓練集是莎士比亞作品而測試集是華爾街日報,那么這個模型將會變得無用。因此,在訓練N元模型時,我們需要確認訓練集和測試集是同一種類型的語料。同時,語料的語氣等也需要加以區分,尤其是與正式文稿或口語化文稿相關的任務。
語料的類型和語氣等匹配了仍然不夠,我們的模型還受到語料稀疏度的影響。由于語料的有限性,一些很常見的語句可能不被包含在內,造成一些“零概率短語”實際上應該擁有非零值的概率。比如在華爾街日報的語料中,denied the有以下短語:

  • denied the allegations:5
  • denied the speculation:2
  • denied the rumors:1
  • denied the report:1
    如果訓練集中包含下述語料他們的概率將會被視為0:
  • denied the offer
  • denied the load

除了二元概率為0的情況(沒見過的詞匯組合),我們還可能會在測試集中遇到完全沒見過的單詞。這種情況下應該怎么辦呢?
有時我們的語言模型不可能會遇到沒出現過的詞匯。這種封閉詞匯袋(closed vocabulary)的假設在某些語言任務中是合理的假設,例如語音識別、機器翻譯等,這些任務中我們會提前設置好發音詞典,語言模型只需要識別詞典中出現過的詞匯。
在其他的任務中,我們必須處理之前沒有遇到過的詞匯(unknown words,或者成為oov,out of vocabulary)。OOV出現的比例被稱為OOV率。開放詞匯袋(Open vocabulary)系統是指我們通過一個偽詞匯<UNK>來對測試集中可能出現的unknown word進行建模的系統。下面介紹兩種訓練帶有<UNK>詞匯訓練集的方法。
第一種方法將這個問題轉化為封閉詞袋問題。首先選擇一個固定的詞匯集,然后在文本正則化(text normalization)的過程中,將不屬于固定詞匯集的單詞替換為<UNK>。根據頻率估計<UNK>的概率。
第二種方法主要針對無法事先準備一個詞袋的情況,這時我們可以構建一個詞典,將訓練集中的一些單詞替換為<UNK>。比如我們可以將出現的頻率低于n的單詞都替換為<UNK>,其中n是一個很小的數字。或者設定一個詞袋的容量N,對詞袋中所有的詞匯頻率進行統計并排序,取前N個詞匯組成固定詞袋,剩下的詞匯是unknown word。

平滑(smoothing)

接下來解決一種新的情景:某個在訓練集中出現過的單詞,在測試集里出現在一種新的語境中,該如何計算?為了使語言模型在這種情況下不會賦予短語0概率,我們需要將高頻事件的概率勻一部分給未知的新事件。這種概率的修改稱為平滑(smoothing)或者折扣(discount),下面將介紹幾種平滑方式:add-1 smoothing,add-k smoothing,stupid backoff和Kneser-Ney smoothing。

Laplace Smoothing

最簡單的平滑方式是在計算概率之前,為所有的二元詞組的計數都加一。之前頻數為1的詞組變成2,頻數為2的詞組變成3。這平滑方式又被稱為拉普拉斯平滑(Laplace Smoothing)。拉普拉斯平滑雖然在現在的很多模型中表現不是很好,但是可以為我們引入許多平滑的術語,并為其他的平滑方式提供一個基準線(baseline),而且在文本分類等任務中有較好的效果。
我們可以先嘗試將拉普拉斯平滑加入一元模型中。根據極大似然估計計算一元模型中某個詞的概率公式為:
\[ P(w_{i})=\frac{c_{i}}{N} \]
其中\(w_{i}\)為訓練集中的詞匯,\(c_{i}\)\(w_{i}\)的頻數,\(N\)為所有詞匯的頻數總和。拉普拉斯平滑只是為每個詞匯的頻數都加1。假設訓練集中共有\(V\)個詞匯,因此公式中的分母相應的調整為\(N+V\)。完整的公式如下:
\[P(w_{i})=\frac{c_{i}+1}{N+V}\]
我們可以定義一個新的變量\(c^{*}_{i}\)作為系數,在計算一個詞匯的平滑概率時不用同時改變分子、分母,只需要將原來的概率乘以該系數即可。\(c^{*}_{i}\)的定義如下:
\[c^{*}_{i}=(c_{i}+1)*\frac{N}{N+V}\]
現在我們可以將\(c^{*}_{i}\)直接除以\(N\)得到概率\(P^{*}_{i}\)。我們可以通過另一種方式描述這種平滑:詞匯的原始頻數與平滑后的頻數之比,也即詞匯頻數的折扣\(discount \ d_{c}\):
\[d_{c}=\frac{c^{*}}{c}\]
現在我們有了一元模型的平滑計算方法,繼續看二元模型的拉普拉斯平滑。二元模型的概率計算方法為:
\[P(w_{n}|w_{n-1})=\frac{C(w_{n-1}w_{n})}{C(w_{n-1})}\]
二元模型的平滑即為給每個二元詞組的共現頻數都加一。計算公式改為如下形式:
\[P^{*}_{Laplace}(w_{n}|w_{n-1})=\frac{C(w_{n-1}w_{n})+1}{\sum_{w}{(C(w_{n-1}w)+1)}}=\frac{C(w_{n-1}w_{n})+1}{C(w_{n-1})+V}\]
通過上面的公式我們計算出二元概率模型中每個二元詞組的概率。二元模型的平滑系數計算方法如下:
\[c^{*}(w_{n-1}w_{n})=P^{*}_{Laplace}*C(w_{n-1})=\frac{[C(w_{n-1}w_{n}+1)]*C(w_{n-1})}{C(w_{n-1})+V}\]
以下兩個表格分別是二元模型在某一語料上的平滑前和平滑后的頻數。

\iwanttoeatchinesefoodlunchspend
i5827090002
want2060816651
to204686206211
eat0020162420
chinese100008210
food1501501400
lunch20000100
speed10100000

以下是平滑后的頻數表:

\iwanttoeatchinesefoodlunchspend
i3.85270.646.40.640.640.641.9
want1.20.392380.782.72.72.30.78
to1.90.633.14301.90.634.4133
eat0.340.3410.345.81150.34
chinese0.20.0980.0980.0980.0988.20.20.098
food6.90.436.90.430.862.20.430.43
lunch0.570.190.190.190.190.380.190.19
speed0.320.160.320.160.160.160.160.16

從上面兩個表可以看出拉普拉斯平滑對詞匯的頻數改變是很大的。\(C(want to)\)的頻數從608降到了238!計算頻數的折扣可以看出頻數的變化是多么劇烈,\(C(chinese food)\)的折扣率竟然高達10!這種頻數和概率的劇烈變化是因為我們從高頻詞的地方借來了太多概率!

add-k smoothing

既然add-1平滑的折扣率太高了,一個很自然的想法是降低從高頻詞匯那里勻出來的概率,每個詞的頻數不是加1,而是加上一個小于1的浮點數k,這種方法被稱為add-k smoothing。
\[P^{*}_{Add-k}(w_{n}|w_{n-1}) = \frac{C(w_{n-1}w_{n})+k}{C(w_{n-1})+kV}\]
add-k 平滑要求我們有選擇k的算法,例如我們可以通過在dev集上優化k值。盡管add-k smoothing在一些任務上很有效(包括文本分類的任務),但它應用在語言模型上的效果仍然不是很好,平滑后的頻數要么對原頻數沒什么改變,要么有著不恰當的折扣率。

backoff and interpolation

add-1平滑和add-k平滑可以解決N元模型的詞匯零頻數問題,但是N元模型的零值問題還包含另一種情況:假設我們要計算\(P(w_{n}|w_{n-2}w_{n-1})\),但是我們沒有\(w_{n-2}w_{n-1}w_{n}\)的詞組,我們可以退而求其次,計算二元概率\(P(w_{n}|w_{n-1})\)代替三元概率。類似的,如果我們沒有二元概率\(P(w_{n}|w_{n-1})\),可以使用一元概率\(P(w_{n})\)進行代替。
換句話說,有時在訓練的時候少一點上下文可以模型的泛化能力。有兩種方法利用這種n元模型之間的“繼承關系”,分別是后退和插值。當模型無法估計N元詞組時,后退一步選用N-1元模型替代,這種方法稱為后退。而插值的方法會利用所有的N元模型信息。

插值算法

當估計一個三元詞組的概率時,加權結合三元模型、二元模型和一元模型的結果。線性插值是相對簡單的插值方法,將N個模型的結果做線性組合。利用線性插值估計三元詞組的概率時,公式如下:
\[P(w_{n}|w_{n-1}w_{n-2})=\lambda_{1}P(w_{n}|w_{n-1}w_{n-2})+\lambda_{2}P(w_{n}|w_{n-1})+\lambda_{3}P(w_{n}) \]
其中所有的\(\lambda\)和為1,\(\sum_{i}\lambda_{i}=1\)
稍微復雜一點的情況是,根據上下文來計算\(\lambda\)的值,計算公式如下:
\[P(w_{n}|w_{n-1}w_{n-2})=\lambda_{1}(w^{n-1}_{n-2})P(w_{n}|w_{n-1}w_{n-2})+\lambda_{2}(w^{n-1}_{n-2})P(w_{n}|w_{n-1})+\lambda_{3}(w^{n-1}_{n-2})P(w_{n}) \]
公式中的\(\lambda\)值如何確定呢?線性插值和條件插值中的\(\lambda\)值都可以通過held-out corpus學習得到的,其中held-out語料是一個附加訓練集,用于訓練超參數(比如上面的\(\lambda\))。比如,固定N元模型的概率,尋找使\(P(w_{n}|w_{n-1}w_{n-2})\)最大的\(\lambda\)值,可以采用EM算法確定\(\lambda\)值。

后退算法

在使用后退算法計算概率時,如果N元詞組計算的概率為0,使用N-1元近似來N元詞組的概率。為了維持概率分布的正確性,在后退算法中,需要對higher-order概率折扣處理。如果higher-order的概率不進行折扣處理,而是直接使用lower-order的概率去近似,概率空間會被擴大,概率和將大于1。比如\(P(w_{n}|w_{n-1})\)的概率明顯比\(P(w_{n})\)概率小,如果直接用一元概率替代,所有二元概率的概率和將大于一。因此,我們需要用一個函數\(\alpha\)來均衡概率分布。
這種有折扣的后退方法被稱為Katz backoff。在Katz后退方法中,如果\(C(w^{n}_{n-N+1})\)不為0,那么概率值為折扣概率\(P^{*}\),如果\(C(w^{n}_{n-N+1})\)是0,就遞歸地退回N-1的短上下文情境中計算概率并乘以\(\alpha\)函數的結果,具體公式如下所示:

Katz后退通常跟Good-Turing平滑方法結合在一起使用。

Kneser-Ney算法

Kneser-Ney將絕對折扣算法加以擴充,能更好的處理地lower-order模型的概率分布。現在考慮這樣一個問題,采用二元模型和一元模型預測一句話中的下一個單詞,舉例如下:
I can't see without my reading...
單詞glasses是比較合理的后繼詞匯,因此我們希望一元模型能預測出glasses而不是Kong。但是由于Hong Kong是一個很常見的詞組,一元模型給Kong賦予的概率要比glasses高。對比Kong和glasses兩個詞匯可以發現,雖然Kong是一個很常見的詞匯,但是Kong一般只出現在Hong之后,而glasses的分布更為廣泛。也就是說,在一個新的語境中,一元模型預測的概率不應該只是:這個詞匯出現的概率有多大?而是:這個詞匯在新語境中出現的概率有多大?我們將這種新的概率記為\(P_{CONTINUATION}\)。KN算法通過統計詞匯w出現在不同語境中的次數來計算\(P_{CONTINUATION}\),其假設為一個單詞在過去出現在不同語境中的頻率越高,在未來出現在新語境中的可能性就越高。即為
\[P_{CONTINUATION}(w) \propto | {v:C(vw)>0}|\]
為了將這種正比關系轉化為概率公式,我們可以用所有二元詞組的數目來正則化。即:
\[P_{CONTINUATION}(w)=\frac{| {v:C(vw)>0}|}{|{(u',w'):C(u'w')>0|}}\]
另一種歸一化的方法是采用單詞w的所有前繼的后繼數目之和,公式如下:
\[P_{CONTINUATION}(w)=\frac{| {v:C(vw)>0}|}{\sum_{w'}|{(vw')>0|}}\]
在這個公式中高頻詞匯Kong的概率很低,達到了我們的預期。最終的KN插值公式如下:
\[P_{KN}(w_{i}|w_{i-1})=\frac{max(C(w_{i-1}w_{i})-d,0)}{C(w_{i-1})}+\lambda(w_{i-1})P_{CONTINUATION}(w_{i})\]
其中\(\lambda\)的計算方法為:
\[\lambda(w_{i-1})=\fracozvdkddzhkzd{\sum_{v}{C(w_{i-1}w)}}|\{w:C(w_{i-1}w)>0|\}\]
其中第一項\(\fracozvdkddzhkzd{\sum_{v}{C(w_{i-1}w)}}\)計算了\(w_{i-1}\)的所有后繼的頻數之和,第二項\(|\{w:C(w_{i-1}w)>0|\}\)計算了\(w_{i-1}\)的后繼種類。
將KN公式推廣到一般情況,遞歸公式如下:
\[P_{KN}(w_{i}|w^{i-1}_{i-n+1})=\frac{max(c_{KN}(w^{i}_{i-n+1})-d,0)}{\sum_{v}{c_{KN}(w^{i-1}_{i-n+1}v)}}+\lambda(w^{i-1}_{i-n+1})P_{KN}(w_{i}|w^{i-1}_{i-n+2})\]
其中\(count()\)函數的值取決于計算的是highest-order的頻數還是lower-ouder的頻數。如果是highest-order,則直接計算頻數即可,如果是lower-ouder則計算其語境的數目。即:

遞歸過程的最后一步是均勻分布\(\frac{1}{V}\)的一元插值,參數\(\epsilon\)是一個空字符串,計算公式如下:
\[P_{KN}(w)=\frac{max(c_{KN}(w)-d,0)}{\sum_{w'}{c_{KN}(w')}}+\lambda(\epsilon)\frac{1}{V}\]
KN插值算法的效果最好的版本是modified Kneser-Ney smoothing,該算法不只使用一個\(d\)進行計算折扣,而是用了三個折扣參數\(d_{1},d_{2},d_{3}\),分別用于頻數為1、2和3及以上頻數的詞匯。

網絡和后退算法

web極大的豐富了自然語言處理的語料庫,有了網絡,訓練high-oder的N元模型成為可能。google在2016年發布了一個極大的N元詞組count集,包括從一元到五元所有詞組的頻數。要在大規模語料集上構建語言模型,性能問題需要慎重考慮。例如字符串形式的單詞放在磁盤上,內存中只放一個64位的哈希碼。還有其他的方式來縮減N元模型的大小:僅僅存儲頻數大于某個閾值的N元詞組或是利用熵去掉某些不重要的N元詞組。
盡管有了這些方法的幫助,我們可以在web語料集上采用KN平滑算法,但是Brants在2007年的研究結果表明沒有必要采用KN等復雜算法,當語料集合非常大時(例如web語料),簡單的平滑算法反而更加有效。這種簡單的算法就是后退算法(stupid backoff)。后退算法不會平衡概率分布,當higher-order的概率為0時,直接后退到lower-order進行代替,計算公式如下:

后退算法在一元模型時停止,此時概率\(S(w)=\frac{count(w)}{N}\),此外Brants在2007年給出了\(\lambda\)的優值0.4。

轉載于:https://www.cnblogs.com/AnnaJuly/p/10626443.html

總結

以上是生活随笔為你收集整理的N元模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。