如何计算给定一个unigram语言模型_CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)...
CS224n筆記[5]:語言模型(LM)和循環神經網絡(RNNs)
作者:郭必揚
許久沒更新了,十分慚愧,翻了翻之前的筆記,才之前上一期我們講的是“依存分析”。本期,我們介紹一下語言模型(Language Model)和循環神經網絡(RNNs)的基本知識。
語言模型
語言模型(language models)是NLP的基礎技術之一,這個名字聽起來總是很玄乎,又因為其不想文本分類、實體識別這些技術這么常用,導致包括我在內的很多人一直對這個玩意兒一知半解。所以今天我們就來一起跟著CS224N網課把這個概念搞清楚。
理解玄乎的理論的最佳方法,就是記住它的一些經典的具體應用。語言模型最典型的應用就是“輸入法聯想”。 比如我在搜狗輸入法里寫一個“我”,輸入法會給我推薦幾個詞:“女朋友”、“剛剛”、“的”等等。
為啥會推薦這些詞呢,可能是搜狗對我曾經輸入過的成百上千句話訓練過語言模型,知道了我輸入“我”之后,很大概率會接著輸入“女朋友”,也有很大概率輸入“剛剛”,因此輸入法就把這些詞給排到了前面。 在一些社交平臺上,我們也會經常玩一個游戲:“給定一個初始詞,不斷通過自己輸入法的聯想詞來造句,看看會造出什么句子來”,往往我們發現可以構成一個完整的說得通的句子,甚至還能暴露出我們個人的一些習慣。
這些我們每天都在使用的功能,實際上都在默默地使用語言模型的技術。下面我們來給語言模型下一個定義。
語言模型其實可以從兩個角度去理解,因此我們給出兩種定義:
? 定義一:語言模型(LM)的任務就是預測一段文字接下來會出現什么詞。?
即一個語言模型應該有能力計算下面這個公式的值:
翻譯過來就是,在已知一句話的前t個詞的基礎上,通過LM可以計算出下一個詞是某個詞的概率。
? 定義二:語言模型(LM)給一段文本賦予一個概率。?
即對于一段文字
,LM可可以計算出這句話出現的概率:其中
就是LM可以計算出來的。
所以回頭看,這兩種定義是一回事兒。
如何學習語言模型
首先再介紹一個概念:N-gram。 所謂的N-gram,就是指一堆連續的詞,根據這一堆詞的個數,我們可以分為unigram,bigram,trigram等等。
如果我們需要得到一個N-gram的LM,它的意思就是希望我們可以通過N-1個詞預測第N個詞的概率。
那么如何學習得到一個N-gram的LM呢?一個直接的思路就是,我們可以收集關于語料中的各個N-gram出現的頻率信息。
對于一個N-gram的LM,我們需要做一個假設:
? Assumption:某個詞出現的概率只由其前N-1個詞決定。?
比如我們想得到一個3-gram的LM,那么就是說想預測一段文本的下一個詞是什么的話,只用看這個詞前面2個詞即可。
還是用輸入法聯想中的例子:
要根據“羅永浩是什么”的下一個字是什么,如果我們設定的是3-gram,則我們只使用圖中藍色的“什么”二字來預測,而不看前面黑色的字。
N-gram的LM用公式表達即為:
公式的第一個等式,就是使用了我們前面的假設,第二個等式就是條件概率的計算方法。 (2)式的分子就是代表這個由N個詞構成的N-gram出現的概率,分母則是一個(N-1)-gram出現的概率。
如何計算得到這些概率值呢?————數它就完事兒了! 我們就在語料中去count,用頻率來估計這些概率。
「顯然,由于這是一個分式,會有分母分子為0的可能,這些特殊情況是我們需要考慮的:」
比如分子,它為0的可能性其實很大,因為隨機給定一個N-gram,它真的會在語料中出現的概率其實很小,多數可能都不存在,這個時候,我們就需要使用一個很小的數來補到分子上。
分母是一個(N-1)-gram,也很有可能不存在,導致分母為0,這個時候,我們就采用回退(back-off)的策略,轉而統計(N-2)-gram的個數,N越小,其出現的概率實際上越大,所以不斷回退,總可以找到不為0的情況。
通過上面的說明,我們發現學習一個N-gram的LM其實很簡單,就是數數問題。數完了這些數兒,就得到了LM。但是從上面的分析過程,我們也不難發現這樣得到的LM的一些嚴重問題:
我們知道,語言模型最直接的用途,就是文本聯想,和文本生成了。 對于文本聯想,這種基于計數的LM也不是不能用,畢竟聯想出來的詞確實在統計意義上是更加頻繁的,所以用戶直接感受不出它的缺點。
但對于文本生成來說,這種基于計數的LM則有很大問題了。這里拿CS224N的PPT上的一個例子來說明:
這段文字中高亮的"today the"是預先給定的文本,后面則是通過LM一個字一個字預測出來形成的文本。 這段文本,牛逼之處在于,它的語法基本沒啥錯,可以我們讀完之后,完全不知道在講啥,因為它說著說著就說偏了,再說一會又偏了,導致整個文本沒有一個清晰的主題。很明顯,這里訓練的LM采用的N-gram一定不大。但是N一大起來,訓練起來又很困難。這就是基于計數的LM的困境。
不過,這玩意兒來做一個bullshit-generator還是挺不錯的!
RNN和基于RNN的語言模型
前面講到的基于計數的LM的缺點,主要就是由它的N-gram的N不能太大又不能太小的限制造成的。 如果能有一個結構,可以處理任意長度的輸入,而不是要固定一長度的話,那就可以解決這個問題了。
在這樣的啟發下,RNN被提出了。
一個經典的RNN結構可以這樣表示:
RNN即循環神經網絡,為何叫循環呢?因為不管RNN有多長,它實際上都是在「同一個神經網絡中不斷循環」,例如圖中話的4個隱層神經網絡,實際上都是同一個,因此他們的「權重都是一樣」的,只是根據輸入的不同,而產生不同的輸出。
有了這樣的結構,使得RNN具有以下這些優點:
然而,RNN也有其缺點:
當然,這些問題都是后話了,后面我們學習的GRU,LSTM乃至Transformer都是在不斷改進RNN的種種缺點。
如何訓練一個基于RNN的LM呢?
首先,我們收集一大批語料,這些語料是由很多個序列(句子、短語等等)組成的。 我們把序列作為輸入,輸入到RNN網絡中,每一步都可以得到一個輸出,這個輸出即為當前步的下一個詞的概率分布。我們使用這個概率分布可以和真實的概率分布(其實就是一個one-hot向量)計算一個損失。明確了損失函數,我們就很容易去訓練了。CS224N中的一張圖描繪地很清晰:
一圖勝前言,這里就不再贅述了。
訓練好RNN了之后,如何進行文本生成呢?
輸入一個詞,每一步的輸出都作為下一步的輸入,這樣就可以通過一個詞不斷進行文本生成了。
如何評價一個語言模型呢?
使用「Perplexity」(困惑度):
這個公式計算出來的結果越大,就說明你這個模型越讓人“困惑”,也就是不好了。
通過公式的變形,我們可以發現這個困惑度,等價于交叉熵損失函數:
所以,我們在優化RNN LM的時候,就是在使勁降低perplexity。
為何語言模型很重要
語言模型(LM)對于許多學習NLP的同學來說,是一個熟悉的陌生人,因為很多時候我們并不會去專門做一個語言模型,不像文本分類這種任務,任何學習NLP的同學都會去通過文本分類來練手。
但語言模型依然是十分重要的,主要體現在下面兩個方面:
>歡迎訂閱我的Hello NLP系列文章(不斷更新中):
CS224n筆記[1]:Word2Vec從何而來
CS224n筆記[2]:Word2Vec算法推導&實現
CS224n筆記[3]:共現矩陣、SVD與GloVe詞向量
CS224n筆記[4]:自然語言中的依存分析(Dependency Parsing)
CS224n筆記[5]:語言模型(LM)和循環神經網絡(RNNs)
CS224n筆記[6]:更好的我們,更好的RNNs
CS224n筆記[7]:機器翻譯和seq2seq>我的其他高贊文章,總有一款是你的菜:
何時能懂你的心——圖卷積神經網絡(GCN)
GraphSAGE:我尋思GCN也沒我牛逼
【DL筆記8】如果你愿意一層一層剝開CNN的心
【DL筆記6】從此明白了卷積神經網絡(CNN)
一條龍搞定情感分析:文本預處理、加載詞向量、搭建RNN
Docker,救你于「深度學習環境配置」的苦海>更多精彩,歡迎訂閱我的公眾號:SimpleAI
總結
以上是生活随笔為你收集整理的如何计算给定一个unigram语言模型_CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .ajax 自定义headers,Aja
- 下一篇: matlab多元约束最小值,无约束多变量