NLP プログラミング勉強会 1 - 1-gram 言語モデル

自然言語処理プログラミング勉強会 1 1-gram 言語モデル

Graham Neubig
奈良先端科学技術大学院大学 (NAIST)1NLP プログラミング勉強会 1 - 1-gram 言語モデル

言語モデルの基礎

2

NLP プログラミング勉強会 1 - 1-gram 言語モデル

言語モデル？
●

英語の音声認識を行いたい時に、どれが正解？

英語音声

W1 = speech recognition system
W2 = speech cognition system
W3 = speck podcast histamine
W4 = スピーチ が 救出 ストン

3

NLP プログラミング勉強会 1 - 1-gram 言語モデル

言語モデル？
●

英語の音声認識を行いたい時に、どれが正解？

英語音声

W1 = speech recognition system
W2 = speech cognition system
W3 = speck podcast histamine
W4 = スピーチ が 救出 ストン●

言語モデルは「もっともらしい」文を選んでくれる4

NLP プログラミング勉強会 1 - 1-gram 言語モデル

確率的言語モデル●言語モデルが各文に確率を与える

W1 = speech recognition
systemW2 = speech cognition
systemW3 = speck podcast
histamine
W4 = スピーチ が 救出 ストン●P(W1) = 4.021 * 10-3
P(W2) = 8.932 * 10-4
P(W3) = 2.432 * 10-7
P(W4) = 9.124 * 10-23

P(W1) > P(W2) > P(W3) > P(W4) が望ましい●( 日本語の場合は P(W4) > P(W1), P(W2), P(W3) ？ )5

NLP プログラミング勉強会 1 - 1-gram 言語モデル

文の確率計算●文の確率が欲しいW = speech recognition system●変数で以下のように表す
P(|W| = 3, w1=”speech”, w2=”recognition”, w3=”system”)

6

NLP プログラミング勉強会 1 - 1-gram 言語モデル

文の確率計算●文の確率が欲しいW = speech recognition system●

変数で以下のように表す ( 連鎖の法則を用いて ):P(|W| = 3, w1=”speech”, w2=”recognition”, w3=”system”) =P(w1=“speech” | w0 = “
”)* P(w2=”recognition” | w0 = “
”, w1=“speech”)* P(w3=”system” | w0 = “
”, w1=“speech”, w2=”recognition”)* P(w4=”
” | w0 = “
”, w1=“speech”, w2=”recognition”, w3=”system”)

注：
文頭「 
 」と文末「 
 」記号

注：
P(w0 = 
) = 1

7

NLP プログラミング勉強会 1 - 1-gram 言語モデル

確率の漸次的な計算●前のスライドの積を以下のように一般化∣W ∣+ 1

P(W )=∏i =1 P(wi∣w 0 … wi−1 )●以下の条件付き確率の決め方は？

P( wi∣w 0 … wi−1 )8NLP プログラミング勉強会 1 - 1-gram 言語モデル

最尤推定による確率計算●

コーパスの単語列を数え上げて割ることで計算

c (w1 … wi )P( wi∣w 1 …w i−1)=c (w 1 …w i−1)
i live in osaka . 
i am a graduate student . 

my school is in nara . 
P(live | 
 i) = c(
 i live)/c(
 i) = 1 / 2 = 0.5
P(am | 
 i) = c(
 i am)/c(
 i) = 1 / 2 = 0.5

9NLP プログラミング勉強会 1 - 1-gram 言語モデル

最尤推定の問題●

頻度の低い現象に弱い：学習：

i live in osaka . 
i am a graduate student . 

my school is in nara . 

 i live in nara . 


確率計算：

P(nara|
 i live in) = 0/1 = 0
P(W=
 i live in nara . 
) = 010

NLP プログラミング勉強会 1 - 1-gram 言語モデル

1-gram モデル●

履歴を用いないことで低頻度の現象を減らす

c (wi )P( wi∣w 1 …w i−1)≈ P( wi )=̃∑w̃ c (w)P(nara) = 1/20 = 0.05
i live in osaka . 

= 2/20 = 0.1
i am a graduate student . 
 P(i)my school is in nara . 

P(
) = 3/20 = 0.15
P(W=i live in nara . 
) =0.1 * 0.05 * 0.1 * 0.05 * 0.15 * 0.15 = 5.625 * 10-7
11

NLP プログラミング勉強会 1 - 1-gram 言語モデル

整数に注意！
●

2 つの整数を割ると小数点以下が削られる$ ./my-program.py0●

1 つの整数を浮動小数点に変更すると問題ない$ ./my-program.py0.512

NLP プログラミング勉強会 1 - 1-gram 言語モデル

未知語の対応●未知語が含まれる場合は 1-gram でさえも問題あり
i live in osaka . 
i am a graduate student . 

my school is in nara . 
●●P(nara) = 1/20 = 0.05
P(i)= 2/20 = 0.1
P(kyoto) = 0/20 = 0

多くの場合（例：音声認識）、未知語が無視される
他の解決法
●
●

少しの確率を未知語に割り当てる (λunk = 1-λ1)

未知語を含む語彙数を N とし、以下の式で確率計算

1
P( wi )=λ1 P ML ( wi )+ (1−λ 1)
N13

NLP プログラミング勉強会 1 - 1-gram 言語モデル

未知語の例
●

●

未知語を含む語彙数： N=106未知語確率： λunk=0.05 (λ1 = 0.95)

1P( wi )=λ1 P ML ( wi )+ (1−λ 1)NP(nara) = 0.95*0.05 + 0.05*(1/106) = 0.04750005
P(i)= 0.95*0.10 + 0.05*(1/106) = 0.09500005

P(kyoto) = 0.95*0.00 + 0.05*(1/106) = 0.00000005
14NLP プログラミング勉強会 1 - 1-gram 言語モデル

言語モデルの評価

15

NLP プログラミング勉強会 1 - 1-gram 言語モデル

言語モデルの評価の実験設定●

学習と評価のための別のデータを用意

学習データ
i live in osaka
i am a graduate student
my school is in nara...

モデル
学習評価データi live in narai am a studenti have lots of homework
…

モデル

モデル
評価

モデル評価の尺度
尤度
対数尤度
エントロピー16パープレキシティ

NLP プログラミング勉強会 1 - 1-gram 言語モデル

尤度●

尤度はモデル M が与えられた時の観測されたデータ( 評価データ Wtest) の確率

P(W test∣M )=∏w∈ W P ( w∣M )test

i live in naraP(w=”i live in nara”|M) =2.52*10-21

i am a student

P(w=”i am a student”|M) =3.48*10-19

P(w=”my classes are hard”|M) =2.15*10-34

my classes are hardxx=
1.89*10-73
17

NLP プログラミング勉強会 1 - 1-gram 言語モデル

対数尤度
●
●

尤度の値が非常に小さく、桁あふれがしばしば起こる
尤度を対数に変更することで問題解決log P(W test∣M )=∑ w∈W log P( w∣M )test

i live in narai am a student
my classes are hard

log P(w=”i live in nara”|M) =-20.58log P(w=”i am a student”|M) =-18.45++log P(w=”my classes are hard”|M) = -33.67=-72.6018

NLP プログラミング勉強会 1 - 1-gram 言語モデル

対数の計算
●

Python の math パッケージで対数の log 関数$ ./my-program.py
4.60517018599
2.019

NLP プログラミング勉強会 1 - 1-gram 言語モデル

エントロピー●

エントロピー H は負の底２の対数尤度を単語数で割った値

1H (W test∣M )=−logP(w∣M)∑2|W test | w ∈W
test

i live in naralog2 P(w=”i live in nara”|M)=( 68.43i am a student

log2 P(w=”i am a student”|M)=

61.32

my classes are hard++log2 P(w=”my classes are hard”|M)= 111.84 )単語数：/

12=20.13* 
 を単語として数えることもあるが、ここでは入れていない

20

NLP プログラミング勉強会 1 - 1-gram 言語モデル

パープレキシティ●２のエントロピー乗

PPL=2●

H

一様分布の場合は、選択肢の数に当たる

V =51
H =−log 25H−log2

PPL=2 =21
5=2log 2 5=521

NLP プログラミング勉強会 1 - 1-gram 言語モデル

カバレージ
●

評価データに現れた単語（ n-gram ）の中で、モデルに含まれている割合
a bird a cat a dog a 
“dog” は未知語
カバレージ : 7/8 ** 文末記号を除いた場合は → 6/7

22

NLP プログラミング勉強会 1 - 1-gram 言語モデル

演習問題

23

NLP プログラミング勉強会 1 - 1-gram 言語モデル

演習問題

●

２つのプログラムを作成

train-unigram: 1-gram モデルを学習● test-unigram: 1-gram モデルを読み込み、エントロピーとカバレージを計算
●

●

●
●

テスト
学習 test/01-train-input.txt →正解 test/01-train-answer.txt
テスト test/01-test-input.txt →正解 test/01-test-answer.txt

data/wiki-en-train.word でモデルを学習

data/wiki-en-test.word に対してエントロピーとカバレージを計算

24

NLP プログラミング勉強会 1 - 1-gram 言語モデル

train-unigram 擬似コード
create a map counts
create a variable total_count = 0
for each line in the training_file
split line into an array of words
append “
” to the end of words
for each word in words
add 1 to counts[word]
add 1 to total_countopen the model_file for writingfor each word, count in counts
probability = counts[word]/total_countprint word, probability to model_file25

NLP プログラミング勉強会 1 - 1-gram 言語モデル

test-unigram 擬似コード
λ1 = 0.95, λunk = 1-λ1, V = 1000000, W = 0, H = 0モデル読み込み

create a map probabilities
for each line in model_file
split line into w and P
set probabilities[w] = P

評価と結果表示for each line in test_file
split line into an array of words
append “
” to the end of words
for each w in words
add 1 to W
set P = λunk / V
if probabilities[w] exists
set P += λ1 * probabilities[w]else
add 1 to unk
add -log2 P to H
print “entropy = ”+H/W
print “coverage = ” + (W-unk)/W26