26. Chinese Restaurant Process
3
+ c
2
+ c
1
+ c + c
新しいテーブルに
客が着席する確率率率
P(w| ) =
cw
+ c
+
+ c
G0(w)
CRP
⾔言語モデルのスムージングに利利⽤用
未知の単語にも確率率率を与えられる
基底測度度から単語が⽣生成される確率率率
¤ 訓練データに出てこない単語にも確率率率を与えたい
¤ とりあえずCRPとはこういうもんだと納得すると幸せになれる
30. P(家 |context) =
c家 |context
d
+ c.
+
+ 3d
+ c.
G2(家)
階層化PYPによるスムージング
¤ 単語ngramの確率率率
G1
G2
G0 =
1
V
1 d
+ c
2 d
+ c
3 d
+ c
+ 3d
+ c
新しいテーブルに客(頻度度)が着席する確率率率
=基底測度(親の文脈)から単語が⽣生成される確率率率
⽂文脈におけるテーブルの数=親の⽂文脈から単語が⽣生成された回数(この例例では3個)
家という料料理理を出しているテーブルは1個=c(家)のディスカウントは1*d
階層PYPによるスムージング
37. HPYLMの学習
¤ ⽂文脈⽊木の構築と,各レストランの適切切な客の配置を決定する
¤ 学習アルゴリズム
¤ Text = {w_1, w_2, …, W_T}
¤ for i = 1 to Convergence
¤ for t = 1 to T
¤ read {context:u_t, word:w_t} ※ u_t = w_{i-1},…,w_{i-n+1}
¤ if i > 0 then
¤ remove_customer(u_t,w_t)
¤ add_customer(u_t,w_t)
¤ add_customer: ⽂文脈u_tに対応するレストランにw_tを追加
¤ remove_customer: ⽂文脈u_tに対応するレストランからw_tを削除
48. ⽂文脈の各ノードに通過/停⽌止回数を⼊入れる
typedef vector<int> tables;
class node
{
map<int,node*> restaurants; // ⽂文脈⽊木
map<int,tables> arrangement; // 客の配置
int T; // テーブル数
int C; // 客の数
node *p; // 親
int a; //停⽌止回数
int b; // 通過回数
}; ai :
bi :
ノード i にカスタマが停⽌止した回数
ノード i をカスタマが通過した回数
E[qi] =
ai + ↵
ai + bi + ↵ +
ノードiで停⽌止する期待値
ノード毎に停⽌止回数と通過回数を
⼊入れる事で,ノード毎に停⽌止確率率率
を計算できる
49. オーダーnのサンプリング
停⽌止する⽂文脈の深さ 確率率率
0 0次の⽂文脈|u|=0でwが⽣生成される確率率率*0次で停⽌止する確率率率
1 1次の⽂文脈|u|=1でwが⽣生成される確率率率*1次で停⽌止する確率率率
2 2次の⽂文脈|u|=2でwが⽣生成される確率率率*2次で停⽌止する確率率率
単語wと⽂文脈uが観測された時,その単語は⽂文脈のどの深さから⽣生成されたんだろう?
⽂文脈の深さを固定
した時の予測確率率率
P(n = l|¬
) =
al +
al + bl + +
l 1
i=0
bi +
ai + bi + +
¬
: wt, ntを除去した VPYLM のパラメータ
深さ l の⽂文脈に到達す
る事前確率率率
P(w|u, ¬
, n) =
¬
cw dn
¬
tw
n + ¬c·
+
n + dn
¬
t·
n + ¬c·
P(w| (u))
50. VPYLMの学習
¤ ⽂文脈⽊木の構築と,各レストランの適切切な客の配置を決定する
¤ 学習アルゴリズム
¤ Text = {w_1, w_2, …, W_T, n_1, n_2, …, n_T}
¤ for i = 1 to Convergence
¤ for t = 1 to T
¤ read {context:u_t, word:w_t, order:n_t}
¤ if i > 0 then
¤ remove_customer(u_t,w_t,n_t)
¤ n_t = sample_order(u_t,w_t)
¤ add_customer(u_t,w_t,n_t)
51. sample_order(u_t, w_t)
¤ オーダーのサンプリングテーブルを以下の式で作る
¬ :remove_cusomerを呼んだ後のVPYLMのパラメータと思っておけば良良い
P(n = l|¬
) =
al +
al + bl + +
l 1
i=0
bi +
ai + bi + +
0 1 2
z = Σ t[i]
サンプリングの⼿手続き
1. 0〜~zの間で乱数rを⽣生成
2. Σt[i]がrを超えた時のiに対応する次数を選ぶ
P(n|w, ¬
) P(w|u, ¬
) P(n = l|¬
)
P(w|u, ¬
, n) =
¬
cw dn
¬
tw
n + ¬c·
+
n + dn
¬
t·
n + ¬c·
P(w| (u))
52. AddCustomer
¤ addCust(context u, word w, order n_t)
¤ 深さn_tに到達するまで,以下を⾏行行う
¤ 1つ前の単語に対応する⽂文脈をrootから探す
¤ 無い場合,1つ前の単語に対応するノードを作る
⼊入⼒力力⽂文:
w_tcontext:u_t
root
Context Tree
root
n_t=1 の例例
53. AddCustomer
¤ addCust(context u, word w, order n_t)
¤ 深さn_tに到達するまで,以下を⾏行行う
¤ 1つ前の単語に対応するノードの通過回数bをインクリメント
¤ 深さn_tのノードの停⽌止回数aをインクリメント
⼊入⼒力力⽂文:
w_tcontext:u_t
root
Context Tree
root
n_t=1 の例例
b_0++
a_1++
56. 予測確率率率の計算
¤ ⽂文脈uと単語wを受け取る
¤ オーダーnの積分消去
1. n について確率率率 を計算する
2. オーダーを n とした時の ngram 確率率率を計算する
3. 1,2を掛け合わせた物を全てのnについて⾜足し合わせる
P(n|context) =
al +
al + bn + +
l 1
i=0
bi +
ai + bi + +
P(w|context, n) =
cw dntw
n + c·
n + dnt·
n + c·
P(w| (context), n 1)
×