1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🔰PyTorchでニュヌラルネットワヌク基瀎 #27【トヌクナむズ線・Unigram LM】

1
Last updated at Posted at 2026-03-23

抂芁

トヌクナむズ線の回目ずなりたす。今回はUnigram Language Modelに぀いお自分なりにたずめおみたした。トヌクナむズの考え方ですが、手法ず初期分割の方法に分けお敎理しおみたした。

  1. アルゎリズム手法

    • BPE (Byte Pair Encoding): 隣接するトヌクンx,yの頻床freq(x,y)を最倧化するトヌクンをくっ぀けおいく回目
    • WordPiece: 隣接するトヌクンx,yのPMI(x,y)を最倧化するトヌクンをくっ぀けおいく回目
    • Unigram: 最初に語圙集合を決めお文章尀床を最倧化する語圙を残し、圱響床の少ない語圙を削陀しおいく回目
  2. 初期分割方法前凊理

    • MetaspaceUnicode文字単䜍で分割。空癜を特殊蚘号"_"に倉換
    • ByteLevel文字をUTF-8のバむト単䜍で分割。256皮類の数倀ですべお衚珟できる。
    • Whitespace空癜で分割

アルゎリズムず初期分割の方法で組み合わせられるようですが、組み合わせ方にも盞性があるっぜい。回目はUnigramの手法です。その前に、トヌクンずいう蚀葉䜿いに぀いおです。この蚘事では、単語や䞀文字「あい01AB」など、語圙をトヌクンず読んでいたす。トヌクンを集めた集合を語圙集合$V$ずしたす。

基本的に、工藀倧先生の論文に基づいお、参考文献の本を頌りに理解を深めおみたした。
Taku Kudo (2018)
Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates
勝手に蚘号を倉曎しおしたい申し蚳ない限り:bow:

背景
これたでのテキスト分類(第20回〜第24回)では日本語文字列を圢態玠に分割しおID化する方法を䜿っおきたした。この方法では、新しい文字列に察しお<unk>を割り圓おおしたうため、デヌタセット内で完結しない状況では有甚性がありたせん。芁するに、「党く䜿えん:rage:」ずいうこずになっおしたいたす:flag_white::bow::flag_white:

倧芏暡蚀語モデルで利甚されるタむプのIDの割り圓お方を調べおみたした。3回目はUnigram Language Model (Unigram LM)です。

挔習甚のファむル

1. Unigramの考え方

Unigramの考え方は、最初に倧きな語圙集合を想定しお、語圙の圱響床や語圙の貢献床のような尀床の差が小さい語圙を削陀しおいく方匏ず考えれば良さそうです。BPEやword pieceが語圙を぀なげお、新しい語圙を䜜りながら、語圙集合を構成しおいくのに察しお、unigramは文章を衚珟する䞊で削陀しおも問題ない語圙を枛らしながら語圙集合を構成しおいく逆の発想になっおいたす。

  1. 語圙集合$V_1$で構成できる文章の尀床ず、語圙集合$V_1$からトヌクン$w$を削陀した$V_1\setminus \{w\}$で構成できる文章の尀床の差を求める。
  2. トヌクン$w$の圱響床・貢献床を衚す尀床の差トヌクン$w$の損倱が倧きいトヌクンは残し、小さいトヌクンを削陀しお、次の語圙集合$V_2$を䜜る。

語圙集合$V_2$を䜿っお番から繰り返す圢になりたす。

1.1 少しだけ詳しめ

  • $D=\{X_1,..,X_j,...,X_n\}$: コヌパス
  • $X_j\in D$: $j$番目の文章
  • $V$: 初期の語圙集合。すべおの文章を䞀文字ず぀に分解しお、そのトヌクンから䜜られる組み合わせのむメヌゞ。
  • $\theta = \{p(v)\}_{v\in V}$: 語圙集合䞊の確率で$\sum_{v\in V}p(v)=1$ずなるもの。
  • $S(X_j)$: 文章$X_j$の$V$による分割の集合。

䟋
文章 $X=(a, b, c)$からなるコヌパス$D=\{X\}$を考えたす。初期語圙集合$V$は、

V = \{ a, b, c, ab, bc, abc \}

や、トヌクンの数を2個たでに制限した

V = \{ a, b, c, ab, bc\}

のようなものが想定されたす。語圙はコヌパス䞭で隣接しお出珟する郚分列のみから構成されるため、䟋えば $ac$ のような非隣接トヌクンからなるものは $V$ に含たないぞ〜🌵

$V = \{ a, b, c, ab, bc\}$の時、文章$X=(a, b, c)$の$V$による分割の集合は

S(X) = \{ [a][b][c], [a][bc], [ab][c]\}

のように3個の集合ずなりたす。[ab]でaずbの塊で぀のトヌクンを衚珟しおいたす。

語圙の確率が$\theta=\{p(v)\}_{v\in V}$の時、分割$Z$で文章が生成される確率$P_{\theta}(Z)$を

P_{\theta}(Z)=\prod_{t=1}^{|Z|}p(v_t)

ず考えたす。独立や同分垃などが暗黙のうちに仮定されおいるんだろうなっお。

Unigram LMの基本的なアむディアは、コヌパス党䜓の察数呚蟺尀床を最倧にする$\theta = \{p(v)\}_{v\in V}$を求めお、尀床にあたり圱響のないトヌクンを削陀しおいく方法ずなりたす。

圢匏的には、コヌパス$X_j$の分割$Z$で文章が生成される確率$P_{\theta}(Z)$を䜿い、察数呚蟺尀床を最倧にするような確率$p(v)$を求める圢に萜ずし蟌むこずになりたす。

\arg\max_{\theta}\sum_{j=1}^{n}\log \sum_{Z\in S(X_j)}P_{\theta}(Z)
= \arg\max_{p}\sum_{j=1}^{n}\log \sum_{Z\in S(X_j)}\prod_{t=1}^{|Z|}p(v_t)

䞊蚘の匏察数呚蟺尀床を最倧にするような確率$p(v)$を求めお、察数呚蟺尀床に圱響の少ないトヌクンを削陀しおいく方法がUnigram LMによるトヌクナむズになりたす。察数呚蟺尀床を最倧にする郚分ですが、理論䞊はEMアルゎリズムを䜿い尀床の最倧化を目指したす。わかりにくいので埌で具䜓䟋で求めおみよう🌞

1.2 ちょっずだけ詳しく

本来はコヌパスの集合ずしお$D=\{X_1,..,X_j,...,X_n\}$のようにたくさんの文章を考えるのですが、$D=\{X\}$ず䞀文だけにしお、Unigram LMによるトヌクンの削陀たでの理論的な流れを远っおみたいず思いたす。尀床の$\sum_{j=1}^{n}$がなくなるので少し簡単になりたす。

1. 蚘号の準備

  • $D=\{X\}$: 文章䞀぀のコヌパス集合

  • $V=\{v_1,...,v_k\}$: 初期語圙の集合

  • $V^m=\{(z_1,
,z_m)∣z_t\in V\}$ : $m$個の長さの語圙文みたいなもの

  • $\Omega=\cup_{m=1}^{\infty}V^m$: 語圙集合$V$から䜜られる文章党䜓

  • $\theta=\{p(v)\}_{v\in V}$: 語圙集合$V$䞊の確率 $\sum_{v\in V}p(v)=1$ずなりたす。

  • $S(X)$: 文章$X$の$V$による分割の集合

  • $P_{\theta}(Z)$: 語圙の確率が $\{p(v)\}$ の時に生成される文$Z\in\Omega$の生成確率で
    $$P_{\theta}(Z)= \prod_{t=1}^{|Z|}​p(v_t)$$ず蚈算される。統蚈孊っぜいテキストだず$P(Z|\theta)$ず曞かれるこずが倚いみたい。

  • 小文字$p$で語圙の確率、倧文字$P_{\theta}$で文の確率を衚しおいたす。

  • $P_{\theta}(X) = \sum_{Z\in S(X)} P_{\theta}(Z)$ず定矩する。$X\not\in\Omega$だけど$X$の分割を䜿っお構成しおおきたす。

  • 文章$X$の条件のもずで、分割が$Z\in S(X)$である事埌確率
    $$P_{\theta}(Z|X)=\frac{P_{\theta}(Z)}{P_{\theta}(X)}=\frac{P_{\theta}(Z)}{\sum_{Z\in S(X)}P_{\theta}(Z)}$$

2. 察数呚蟺尀床
コヌパスの察数呚蟺尀床$L(D, V,\theta)$を倉圢しおみたした1。

 \begin{align*}
L(D,V,\theta)
& = \log P_{\theta}(X) \\
& =  \log\sum_{Z\in S(X)}P_{\theta}(Z)\\
& =  \log\sum_{Z\in S(X)}\prod_{i=1}^{|Z|}p(v_i)\\
\end{align*}

この尀床を最倧にする$\theta = \{p(v)\}$を求めたいでも、logの䞭に∑があるので面倒そう:sweat_smile:

3. EMアルゎリズムを䜿う
$\{p(v)\}$を掚定する方法ずしお、EMアルゎリズムを䜿いたす。EMアルゎリズムは補助的な確率$q(Z)$ずJensenの䞍等匏を䜿っお$\{p(v)\}$を蚈算する方法で、

  • E step: $\theta$を固定しお$L(D, V, \theta)$の䞋界を最倧にする$q(Z)$を求める。
  • M step: $q(Z)$を固定しお、$L(D, V, \theta)$の䞋界を最倧にする$\{p(v)\}$を求める。

この2ステップを繰り返す圢になりたす。Expectation StepずMaximization Stepかな

E stepたでの道のり

  • 察数呚蟺尀床を埐々に倉圢しおいきたす。
  • $q(Z)$は$\sum_{Z\in S(X)}q(Z)=1$ずなる確率で無理やり远加しおJensenの䞍等匏を䜿える圢に倉圢したす。
  • 最埌、確率同士の距離みたいな抂念のKLダむバヌゞェンスを䜿っお再び無理やり倉圢したす:sweat:
 \begin{align*}
L(D, V, \theta)
& = \log P_{\theta}(X)
& Xの察数尀床 \\
& = \log \sum_{Z\in S(X)} P_{\theta}(Z)\\
& = \log \sum_{Z\in S(X)} q(Z) \cdot \frac{P_{\theta}(Z)}{q(Z)}\\
&\ge \sum_{Z\in S(X)} q(Z) \cdot \log \frac{P_{\theta}(Z)}{q(Z)} 
& \text{Jensen}の䞍等匏\\
& = \sum_{Z\in S(X)} q(Z) \Bigl[  \log P_{\theta}(Z) - \log q(Z) \Bigr] \\ 
& = - \Bigl[ \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z)  \Bigr] 
& (🍀)\\ 
& = - D_{KL}(q || P_{\theta}( \cdot |X)) + \log P_{\theta}(X)
& \text{KLダむバヌゞェンスの郚分}\\
\end{align*}

䞊蚘の匏の最埌の等匏KLダむバヌゞェンスの郚分の蚈算を確認。∑ずか面倒そうに芋えるけど、条件付き確率を戻しお、logの割り算を蚈算しおいるだけ:bow:

\begin{align*}
D_{KL}(q || P_{\theta}( \cdot |X))
& = \sum_{Z\in S(X)} q(Z) \log \frac{q(Z)}{P_{\theta}(Z|X)} 
& KLダむバヌゞェンスの定矩\\
& = \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z|X) \\
& = \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log \frac{P_{\theta}(Z)}{P_{\theta}(X)} \\
& = \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\Bigl[\log P_{\theta}(Z) - \log P_{\theta}(X) \Bigr]\\
& = \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z) + \log P_{\theta}(X)
& (★)\\
\end{align*}

あずは、適圓〜に移項するずKLダむバヌゞェンスの郚分の匏になりたす。

E step
$L(D,V,\theta)$の䞋界である「$- D_{KL}(q || P_{\theta}(\cdot|X))+\log P_{\theta}(X)$」を倧きくする$q(Z)$を探したす。KLダむバヌゞェンスは$q(Z)$ず$P_{\theta}(Z|X)$の距離みたいなものなので、$q(Z)=P_{\theta}(Z|X)$の時、䞋界が最倧になりたす。

具䜓的に蚈算するず、...

\begin{align*}
q(Z)
& = P_{\theta}(Z|X) \\
& = \frac{P_{\theta}(Z)}{P_{\theta}(X)} \\
& = \frac{P_{\theta}(Z)}{\sum_{Z\in S(X)}P_{\theta}(Z)}
\end{align*}

$p(v)$で求めた分割$Z$の生成確率を、ちゃんず確率になるように調敎正芏化したものが$q(Z)$ずなりたす。あずで具䜓䟋で蚈算しおみるこずにしよう:scream:

確認ポむント
䞋界が最倧になっおいるのだけど、(★)の匏の最初ず最埌だけを眺めるず、

D_{KL}(q || P_{\theta}( \cdot |X))
= \sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z) + \log P_{\theta}(X) \\

ずなりたす。移項䜜業しお、

\begin{align*}
\log P_{\theta}(X)
& = D_{KL}(q || P_{\theta}( \cdot |X)) - \left[\sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z)\right] \\
& =  - \left[\sum_{Z\in S(X)} q(Z) \log q(Z) - \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z)\right] \\

\end{align*}

ずいう圢になりたす。

  • $\log P_{\theta}(X)$は察数尀床で、これを最倧にしたい。
  • []で囲たれた郚分。これは🍀匏の郚分ず同じ「−」もちゃんず含めおね
  • E stepで求めた倀を䜿うず、KLの倀は0

E stepで求めた$q(Z) = P_{\theta}(Z|X)$を䜿うず、䞋界(🍀の匏)が圓初最倧化したかった尀床$\log P_{\theta}(X)$に䞀臎しおいたす。(ちょっず説明が䞋手かも:bow:)
E step ず、次のM step を繰り返しお、より倧きな$L(D,V,\theta)$の倀を芋぀けたい。

M step

E stepで構成した$\{q(Z)\}_{Z\in S(X)}$を所䞎ずしお、尀床を最倧化する$\theta = \{p(v)\}$を求めたす。

再び、尀床の匏から同じような倉圢をしたす。

 \begin{align*}
L(D, V, \theta)
& = \log \sum_{Z\in S(X)} P_{\theta}(Z)\\
& = \log \sum_{Z\in S(X)} q(Z) \cdot \frac{P_{\theta}(Z)}{q(Z)}\\
&\ge \sum_{Z\in S(X)} q(Z) \cdot \log \frac{P_{\theta}(Z)}{q(Z)} 
& \text{Jensen}の䞍等匏\\
& = \sum_{Z\in S(X)} q(Z) \Bigl[  \log P_{\theta}(Z) - \log q(Z) \Bigr] \\ 
& = \sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z) - \sum_{Z\in S(X)} q(Z) \log q(Z) \\ 
\end{align*}

これも同じパタヌン。䞋界を倧きくするように考えるのですが、最埌の匏の第2項目は$\theta$に無関係の固定倀。実質的に最倧化で重芁なのは第䞀項目 $\sum q(Z)\log P_{\theta}(Z)$ だけずなりたす。

 \begin{align*}
\sum_{Z\in S(X)} q(Z)\log P_{\theta}(Z)
& = \sum_{Z\in S(X)} q(Z) \log \prod_{t=1}^{|Z|} p(v_t) \\
& = \sum_{Z\in S(X)} q(Z) \sum_{t=1}^{|Z|}\log  p(v_t)  & (🌞)\\
& = \sum_{v\in V}\left[ \sum_{Z\in S(X)} q(Z) n(v,Z) \right] \log p(v) \\
& = \sum_{v\in V} c(v) \log p(v) 
\end{align*}
  • $n(v, Z)$は分割$Z$の䞭に、トヌクン$v$が存圚する数ずなりたす。
  • $Z$の䞭に$v_t$が2回登堎する堎合、(🌞)の郚分は$\log p(v_t)$が2回たされたあず、$q(Z)$をかけるこずになりたす。぀たり、$n(v_t, Z)=2$ず$\log p(v_t)$ず$q(Z)$を掛け算するこずになりたす。わかりにくい説明で倧倉申し蚳無い限り:bow::bow::bow:
  • []で囲たれた郚分を$c(v)$ず衚蚘したす。
    $$
    c(v) = \sum_{Z\in S(X)} q(Z) n(v,Z)
    $$
    期埅カりントず解釈できそうです。

圓初の目的の最倧化に戻りたす。$\sum_{v\in V} p(v) = 1 $ずいう条件のもず、

\arg\max_{\{p(v)\}} \sum_{v\in V} c(v) \log p(v)

を求めるこずになりたす。制玄条件付きの最倧化問題なのでラグランゞュ乗数法を䜿っちゃいたす。

L = \sum_{v\in V} c(v) \log p(v) + \lambda \left(1-\sum_{v\in V}p(v)\right)

ずおいお、$p(v)$や$\lambda$で埮分しおむコヌル0ずしお蚈算したしょう。

\begin{align}
\frac{\partial L}{\partial p(v)} = \frac{c(v)}{p(v)} - \lambda = 0 \\
\frac{\partial L}{\partial \lambda} = 1 - \sum_{v\in V} p(v) = 0 
\end{align}

(1)ず(2)から、

p(v) = \frac{c(v)}{\sum_{v\in V}c(v)}

ずいう綺麗な圢になりたす。期埅カりントを正芏化した倀が尀床を倧きくする$p(v)$ずなりたす。

4. トヌクンの圱響床・貢献床
トヌクン$t$の圱響床・貢献床は

\text{loss}(t) = L(D, V, \theta) - L(D, V\setminus\{t\}, \theta)

で求められそうです。トヌクン$t$が削陀されたずきの損倱ずいう意味合いでもあるので、lossず呜名しおありたす。

5. 削陀候補
loss(t)が小さいトヌクンを語圙集合$V$から削陀したす。逆に、loss(t)が倧きいトヌクンは残す圢になりたす。個だけ削陀ずかだず効率が悪そうなので、20%削陀、80%残すみたいな刀断をするっぜい。

削陀候補が$t^{*}$なら、

t^{*}\in \arg\min_{t} L(D, V, \theta) - L(D, V\setminus\{t\}, \theta)

みたいに衚珟できたす。抂念䞊では、すべおの分割で期埅倀を蚈算するし、$L(D, V\setminus{t}, \theta)$の倀もEMアルゎリズムを䜿っお蚈算するわけですので非垞〜に面倒そうです。実際は、色んな工倫をしおloss(t)を簡䟿に求めおいるようです。:smile:

6. 分割
語圙集合$V$が完成したあず、どのように文をトヌクナむズしおいくのかに぀いおです。文章$X$の尀床が最倧になる分割$Z^*\in S(X)$ずしたす。匏だず

Z^* \in \arg\max_{Z\in S(X)}\prod_{t=1}^{|Z|}p(v_t) 

ずなりたす。論文ではViterbiアルゎリズムを䜿っお求めるずしおいたす。

1.3 具䜓䟋で愚盎に蚈算しおみた

文章 $X=(a, b, a)$ からなるコヌパス$D$を考えたす。初期語圙集合を$V_1=\{a, b, ab, ba, aba\}$ずしたす。

  • $(a, b, a)$ : 文章
  • $V_1=\{a, b, ab, ba, aba\}$: 初期語圙の集合
  • $p(v)$: トヌクン$v$の確率
  • $S(X) = \{[a][b][a], [a][ba], [ab][a], [aba]\}$

$p(v) = 1/5$、぀たり、すべおのトヌクンが等しい状況を初期確率ずしたす。

1. 文の確率 $P_Ξ(Z)$を蚈算
$P_{\theta}(Z) = \prod_{t=1}^{|Z|}p(v_t)$を䜿っお蚈算したす。

  • $P_{\theta}$([a][b][a]) = p(a)p(b)p(a) = (1/5) * (1/5) * (1/5) = 1/125
  • $P_{\theta}$([a][ba]) = p(a)p(ba) = (1/5) * (1/5) = 1/25
  • $P_{\theta}$([ab][a]) = p(ab)p(a) = (1/5) * (1/5) = 1/25
  • $P_{\theta}$([aba]) = p(aba) = 1/5

合蚈を求めたす。
$$\sum_{Z\in S(X)}P_{\theta}(Z) = 36/125$$

2. E step: $q(Z)$を蚈算
$q(Z)= \frac{P_{\theta}(Z)}{\sum_{Z\in S(X)}P_{\theta}(Z)}$を䜿っお蚈算したす。

  • q([a][b][a]) = (1/125)/(36/125) = 1/36
  • q([a][ba]) = (5/125)/(36/125) = 5/36
  • q([ab][a]) = (5/125)/(36/125) = 5/36
  • q([aba]) = (25/125)/(36/125) = 25/36

3. 期埅カりント: $c(v)$の蚈算
分割の䞭に、トヌクンがどれくらいあるのかの期埅倀を蚈算したす。

  • c(a) = 2×q([a][b][a]) + 1×q([a][ba]) + 1×q([ab][a]) = 12/36
  • c(b) = 1×q([a][b][a]) = 1/36
  • c(ab) = 1×q([ab][a]) = 5/36
  • c(ba) = 1×q([a][ba]) = 5/36
  • c(aba) = 1×q([aba]) = 25/36

合蚈を求めたす。
$$\sum c(v) = 48/36$$

4. M step: 期埅カりントの正芏化
$p(v) = \frac{c(v)}{\sum_{v\in V}c(v)}$を利甚しお、正芏化した期埅カりントを求めたす。

  • p(a) = (12/36)/(48/36) = 12/48
  • p(b) = (1/36)/(48/36) = 1/48
  • p(ab) = (5/36)/(48/36) = 5/48
  • p(ba) = (5/36)/(48/36) = 5/48
  • p(aba) = (25/36)/(48/36) = 25/48

これで、EMアルゎリズム的に最適な確率が求たりたす。

p(a)=1/5 → p(a) = 1/4 =: p*(a)

ずアップデヌトされる感じ。最適化されたpをp*ず曞いおおきたす。

5. EM埌の$L(D,V_1,\{p^*(v)\})$を求める

\begin{align*}
L(D,V_1,\theta^{*}) 
& = \log ( P_{\theta}([a][b][a]) + P_{\theta}([a][ba])+ P_{\theta}([ab][a]) + P_{\theta}([aba])) \\
& = \log \left( \frac{1}{4}\cdot\frac{1}{48}\cdot\frac{1}{4} 
            +\frac{1}{4}\cdot\frac{5}{48}
            +\frac{5}{48}\cdot\frac{1}{48} + \frac{25}{48}\right)
\end{align*}

6. 削陀トヌクンを探す
V₁からトヌクンvを削陀しお、L(D, V\{v}, Ξ)を蚈算するぞ。これにもEM䜿うから、もしかしお、非垞に面倒:scream: だから、実際のコヌドは近䌌蚈算になるんだなっお思うよ。

6.1 {b}を削陀候補ずしおみた

  • $(a, b, a)$ : 文章
  • $V_2=\{a, ab, ba, aba\} = V_1 \setminus \{b\}$
  • $p(v)$: トヌクン$v$の確率
  • $S(X) = \{[a][ba], [ab][a], [aba]\}$

トヌクン$v$の確率から求めたす。アップデヌトされた$p^*$はトヌクン$b$の確率も割り圓おられおいたす。$b$を陀いた圢で確率化すればいいので、

p*(a) + p*(ab) + p*(ba) + p*(aba) = 47/48を䜿っお、トヌクンの確率$p^*$を求めたす。
衚蚘がぐちゃぐちゃになるのですが、再び、 「トヌクンの確率を$p$」 ず曞き盎したす。

  • p(a) = (12/48)/(47/48) = 12/47
  • p(ab) = 5/47
  • p(ba) = 5/47
  • p(aba) = 25/47

6.1 $P_Ξ(Z)$を蚈算
語圙集合に$b$が無いので、文の分割も倉わっおきたす。

  • $P_{\theta}$([a][ba]) = p(a)p(ba) = (12/47) * (5/47)
  • $P_{\theta}$([ab][a]) = p(ab)p(a) = (5/47) * (12/47)
  • $P_{\theta}$([aba]) = p(aba) = 25/47

合蚈を求めたす。
$$\sum_{Z\in S(X)}P_{\theta}(Z) = 1295/(47*47) = 1295/2209$$

6.2 E step: $q(Z)$を蚈算
$q(Z)= \frac{P_{\theta}(Z)}{\sum_{Z\in S(X)}P_{\theta}(Z)}$を䜿っお蚈算したす。

  • q([a][ba]) = (60/2209)/(1295/2209) = 12/259
  • q([ab][a]) = (60/2209)/(1295/2209) = 12/259
  • q([aba]) = (25/2209)/(1295/2209) = 235/259

6.3 期埅カりント: $c(v)$の蚈算
分割の䞭に、トヌクンがどれくらいあるのかの期埅倀を蚈算したす。

  • c(a) = 1×q([a][ba]) + 1xq([ab][a]) = 24/259
  • c(ab) = 1×q([ab][a]) = 12/259
  • c(ba) = 1×q([a][ba]) = 12/259
  • c(aba) = 1×q([aba]) = 235/259

合蚈を求めたす。
$$\sum c(v) = 283/259$$

6.4. M step: 期埅カりントの正芏化
$p(v) = \frac{c(v)}{\sum_{v\in V}c(v)}$を利甚しお、正芏化した期埅カりントを求めたす。

  • p(a) = (24/259)/(283/259) = 24/283
  • p(ab) = (12/259)/(283/259) = 12/283
  • p(ba) = (12/259)/(283/259) = 12/283
  • p(aba) = (235/259)/(283/259) = 235/283

これで、EMアルゎリズム的に最適な確率が求たりたす。

p(a)=12/47 → p(a) = 24/283 =: p*(a)

ずアップデヌトされる感じ。最適化された$p$を$p^*$ず曞いおおきたす。

6.5 EM埌の$L(D,V_2,\{p^*(v)\})$を求める

\begin{align*}
L(D,V_1\setminus\{b\},\theta^{*}) 
& = \log ( P_{\theta}([a][ba])+ P_{\theta}([ab][a]) + P_{\theta}([aba])) \\
& = \log \left( \frac{24}{283}\cdot\frac{12}{283} 
            +\frac{12}{283}\cdot\frac{24}{283}
            +\frac{235}{283}\right)
\end{align*}

6.6. トヌクン$b$の損倱

\text{loss}(b) = L(D, V_{1}, \theta^*) - L(D,V_{1}\setminus\{b\}, \theta^*)

これでトヌクン$b$の損倱が求たりたす。倚分蚈算あっおいるず思うけど、あたり自信ないな。もう䞀぀だけ蚈算しおみた。

6.7. {aba}を削陀候補ずしおみた

  • $(a, b, a)$ : 文章
  • $V_2=\{a, b, ab, ba\} = V_1 \setminus \{aba\}$
  • $p(v)$: トヌクン$v$の確率
  • $S(X) = \{[a][b][ab], [a][ba], [ab][a]\}$

同様に蚈算するず、

\begin{align*}
L(D,V_1\setminus\{aba\},\theta^{*}) 
& = \log ( P_{\theta}([a][b][a]) + P_{\theta}([a][ba])+ P_{\theta}([ab][a])) \\
& = \log \left( \frac{127\cdot6\cdot127}{248^3}+\frac{127\cdot124\cdot115}{248^3}+\frac{127\cdot124\cdot115​}{248^3}\right)
\end{align*}
\text{loss}(aba) = L(D,V_1, \theta^*) - L(D,V_{1}\setminus\{aba\}, \theta^*)

7. 損倱の比范

あずは、同じように$ab$や$ba$、$a$のトヌクンを削陀候補ずしお察数尀床を求めお損倱たで蚈算したす。倚分、トヌクンbの損倱が小さいので$b$を削陀するこずずなりたす。

\text{loss}(b)  = \min \{
\text{loss}(aba), 
\text{loss}(ab), 
\text{loss}(ba), 
\text{loss}(a) , 
\text{loss}(b)\}

なので、損倱削陀効果が小さいトヌクンbを削陀するこずになりたす。

非垞に面倒😱:scream: ずいうかあり埗ない倧倉さ:smile:だから、実際のコヌドは近䌌蚈算になるんだなっお思うよ。

ここから気を取り盎しお、実装に移りたいな。近䌌蚈算で非垞に高速なはず。

2. 実装

unigram language model によるトヌクナむザヌを䜜成しおみたす。BPEでは倚蚀語、word pieceでは分かち曞きでも詊しおみたした。今回は小さなサむズの日本語コヌパスを扱いたす。今回は理論面での解説が䞭心だったので、実装面は小さめに:sweat:

孊習に利甚するデヌタはcc100デヌタセットの日本語jaから抜出した䞇行ずなりたす。テキストファむルにしおみたした。

Unigram + (Metaspace)
import random
import pandas as pd
from tokenizers import Tokenizer, models, trainers, pre_tokenizers, normalizers

# (1) Unigram を䜿うunk_token は trainer 偎で指定するのがポむント
tokenizer = Tokenizer(models.Unigram())
#tokenizer = Tokenizer(models.BPE(unk_token="<unk>"))
#tokenizer = Tokenizer(models.WordPiece(unk_token="<unk>"))


# (2) 正芏化぀けおみた
tokenizer.normalizer = normalizers.NFKC()

# (3)
# 分かち曞きの時ONにしお効果を確認しおみたいな
#tokenizer.pre_tokenizer = pre_tokenizers.Metaspace(replacement="▁")

#(4) <unk>の指定
trainer = trainers.UnigramTrainer(
    vocab_size=10_000,
    special_tokens=["<pad>", "<bos>", "<eos>", "<unk>", "<mask>"],
    unk_token="<unk>",
    shrinking_factor=0.75,
    max_piece_length=16,
    n_sub_iterations=2,
)

# (5) csvファむルから盎接孊習
paths = ["./data/tiny_cc100_ja.csv"]

# (6) ランダムにする意味ないけど、そのたたコピヌしお䜿っただけ
def mixed_iterator(paths):
    texts = []
    for p in paths:
        # text列だけ読み蟌む
        df = pd.read_csv(p)
        texts.extend(df["text"].tolist())   
    # 䞀気にシャッフル数癟䞇件皋床たでならこの方法でOKなはず
    random.shuffle(texts)  
    for t in texts:
        yield t

# (7) å­Šç¿’
tokenizer.train_from_iterator(mixed_iterator(paths), trainer=trainer)

# (8) 保存
tokenizer.save("./tokenizer/unigram_10k.json")

説明メモ

  • NFKCはちょっずした正芏化凊理。これたで぀けおなかったけど:sweat:

    • 党角英数字が半角英数字  → ABC123
    • 半角カナが党角カナ です → テストです
    • ㍿みたいなのなんお蚀うのかな ㍿○△□ → 株匏䌚瀟○△□
  • (3) Metaspaceの郚分、OFFにしおありたす。ONにするず効果がはっきりわかるかず思いたす。サンプル出力で「_」だらけになるので今回は省略OFFにした。

  • (8)出力されたJSONファむル、今たでず異なり、トヌクンのlog(確率)も぀いおいたす。特殊トヌクンのlog(確率)は0ずなっおいたす。

毎回同じパタヌンです。

text_list = [
    "これは日本語のテストです",
    "Awesome blog! Do you have any suggestions",
    "📷 정교하멎서 완벜하게 아날로귞 칎메띌륌 재현한 것 같닀.",
    "䜠奜",
    "𐀀𐀁"
]
    
for text in text_list:
    encoded = tokenizer.encode(text)
    print(f"文章: {text}")
    print("トヌクン:", encoded.tokens)
    print("ID:", encoded.ids)
    print(f"デコヌド: {tokenizer.decode(encoded.ids)}\n")

入力デヌタに存圚しない文字は<unk>ずなりたす。デコヌドしおも元の文字に戻らないぞ〜。

文章: これは日本語のテストです
トヌクン: ['これは', '日本語', 'の', 'テスト', 'です']
ID: [391, 1324, 6, 4120, 207]
デコヌド: これは 日本語 の テスト です

文章: Awesome blog! Do you have any suggestions
トヌクン: ['A', 'w', 'e', 's', 'o', 'm', 'e', ' ', 'b', 'l', 'o', 'g', '! ', 'D', 'o', ' ', 'y', 'o', 'u', ' ', 'h', 'a', 'v', 'e', ' ', 'an', 'y', ' ', 's', 'u', 'g', 'g', 'est', 'i', 'on', 's']
ID: [121, 1133, 226, 522, 171, 318, 226, 14, 951, 547, 171, 600, 1005, 361, 171, 14, 1309, 171, 415, 14, 647, 276, 1257, 226, 14, 3229, 1309, 14, 522, 415, 600, 600, 6908, 255, 1871, 522]
デコヌド: A w e s o m e   b l o g !  D o   y o u   h a v e   an y   s u g g est i on s

文章: 📷 정교하멎서 완벜하게 아날로귞 칎메띌륌 재현한 것 같닀.
トヌクン: ['📷', ' ', '정교하멎서', ' ', '완벜하게', ' ', '아날로귞', ' ', '칎메띌륌', ' ', '재현한', ' ', '것', ' ', '같닀', '.']
ID: [3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 254]
デコヌド:               .

文章: 䜠奜
トヌクン: ['䜠', '奜']
ID: [3, 2149]
デコヌド: 奜

文章: 𐀀𐀁
トヌクン: ['𐀀𐀁']
ID: [3]
デコヌド:
  • 日本語がトヌクナむズされおいるのはOK、ずいうか、これが目的。
  • 䜕故かアルファベットも綺麗に埩元されおいる。
  • 今回利甚したtiny_cc100_ja.csvずいう日本語コヌパスの超ミニュチュア版にもアルファベットがたくさん入っおいるようです。「MacbookPro」ずか「Submitボタン」ず蚀う感じに自然に銎染んでいたした。日本語ぞのアルファベットの浞透床恐るべし😆

参考

機械孊習ず情報技術ずいうサむトのトヌクナむれヌションBPE/WordPiece/SentencePieceを解説にコンパクトにたずたっおいたす。他の内容も倧倉勉匷になりたす:smile:

今回自分が参考にしたのは、次の曞籍になりたす。詳しい文献案内も぀いおいお倧倉勉匷になりたした。日本語の専門曞っおありがたいなず思っおしたった😆

  • 持橋倧地 (2025) 『統蚈的テキストモデル 蚀語ぞのベむズ的アプロヌチ』岩波曞店

次回

BERTのようなTransformer Encoderタむプのモデルで登堎するMLM (Masked Language Modeling)に぀いお扱う予定です。

目次ペヌゞ

泚

  1. 察数尀床$L(D,V,\theta)$の衚珟ですが、今回は語圙集合$V$が倉わっおいくので、$V$を関数の䞭に入れお衚珟したした。 ↩

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?