(自然言語処理+機械学習)の備忘録 #1 -N-gram-

## その前に
お久しぶりです。2年ぶりでしょうか......ねこみみといいます。一時期Twitterを離れた時期があったんですね。その時に何を思ったのかアカウントを削除してしまい、アカウント連携していた私は「え、パスワード知らんが？」と戻ってこれずにいました。

さて、そうですね、FFTについては需要があれば続編を書こうと思いますが、私はもう高校生の区分に入らないんですよね(高専5年)。その時は「高専生がー」に変えればいいんですがありきたりで人気でなそうですね(笑)。

## はじめに
今回なんですけど、卒研で自然言語処理をすることになった(まあ自分が決めたんですが)関係で、今までニューラルネットワークのモデルについては論文読んでアーキテクチャかじってる趣味範囲程度の人間だったんですが......技術不足が露呈したので一からちゃんとやり直すことにしました。

ベイズ統計学からちゃんとやろうと思っているのですが、卒研の期間上自然言語処理の歴史と理論をある程度掴みたいということになります。

ここではとりあえず歴史的な流れを重視して順々に現在のTransfomerやその派生までたどっていこうかな？ということで、**第一目標はWord2Vecに至る経緯を理解することになります。** 私の現状の認識はOne-hotの次元圧縮ぐらいの感覚なのでもっとちゃんと理解していこうと思います。

専門家の方々で違うよとかこれ先にやった方が理解しやすいなどあればやさしく教えていただけると幸いです。

## 初めに
タイトル宣言通りN-gram方式から書いていこうと思います。私自身今理解したばかりなのでつたないところはご容赦ください。参照は　*A Neural Probabilistic Language Model (2003)*　という論文になります。

## 導入
皆さん、人の話を聞くときには頭からしっぽの順に聞きますよね？......今の時代はオンライン授業とかオンデマンドとかあるので、中には逆再生で授業を聞いてる人もいるかもしれませんが......。普通に聞くときは時間の流れに沿って聞く、という前提で話を進めさせてもらいますね。さて、友達同士とかで何度か話を交わしていると最初の数単語からその人が何を話そうとしているのかわかってくるようになる人はいると思います。定番だと「長年の付き合いだからね！」とかって返されるやつです。

話がそれました。"This is a -"を例に取ってあるゲームをしていきましょう。
この文章の場合, この順番で文章が流れますね。
1. "This"
1. "is"
1. "a"

ここで"This is a"まで聞いたとしましょう。情報はそれだけです。話した人の性格も、シチュエーションもわかりません。文章だけが与えられます。**「ここから次の単語を予測しなさい。当てるまで帰れません。」**......無理ゲーですね。さらには英語でとも言ってませんので、英語に似た別言語の可能性もあります。もうそうなってくると頭から煙が出てきますね。この時辞書だけ持っているとします。ランダムで単語をあてると辞書の単語数だけパターンがあるので、それを$N$とすれば$\frac{1}{N}$の確率で正解です。

さて、これでは無理なので「その言語の書籍をたくさんあなたに上げます。パターンを掴んでください。」というルールを追加しましょう。
この時あなたはどうするでしょうか。ここでは、"This is a"という単語の後に何が来るか統計を取ろう！という話になります。「この単語来る確率が高いな」となればそれを優先して答えていけば当たりやすい訳です。最初に話した「長年の付き合いだからね！」も経験則ですよね。無事フラグを回収したところで、本題に移りましょうか。

## 条件付き確率の算出
先ほどのゲームの例で進めていきましょう。"This is a -"という文章を書籍から隅々まで抜き出したあなたは、その次の単語の出現回数をカウントして確率を計算しました。その結果次のような表が得られました。
|  単語  |  回数  |  確率[%] |
| ---- | ---- | ---- |
|  tomato  |  3018  | 27.14 |
|  melon  |  2987  | 26.86 |
|  banana  |  4019  | 36.15 |
|  bottle  |  1095  | 9.85 |

うれしいですね、たったの4単語しか候補がありませんでした。つまり、(あなたの頭の中では今)「大量の書籍から文章を抜き出した。ちゃんと統計はとったのでこの4単語しか候補がないはずだ」となるわけです。もっとあるだろって.....？異論は認めますが今回は例なので候補数はこれくらいにさせてください。 あと、**「何度も言いますがこれが英語とは一言も言ってません」**

でもさらに成功率を上げたいですね。そこであなたは確率の高い順に, **banana→tomato→melon→bottle**という順に単語を言うと、無事、2回目で単語を当てることができました。元の文章は"This is a tomato -"だったことになります。

例はこのくらいにして一般の話につなげていきましょう。先ほどの話で一番重要だったのがこの部分です。
>"This is a -"という文章を書籍から隅々まで抜き出したあなたは、その次の単語の出現回数をカウントして確率を計算しました。

この、**"This is a"に続く単語に限って検索**という「条件付き」で「確率」をもとめるような類を総称してを条件付き確率を呼びます。でも考えてみてください。ここで "Tya Ame Pand -"というのに続く単語を得たところでなんかの役に立ちますか？文法を知っていれば役立つかもしれませんが、知らない状態です。そういうことです。
式にしてみるとこのようになります.
```math
P(\mathrm{tomato} | \mathrm{This\  is\  a}) = 0.2714
```
ここで、$P(A|B)$は$B$という条件の下での$A$の発生確率を指します。

ではここから少しずつ一般化してみましょう。文章の先頭から連続3単語$W^{3}_{1} = \[w_1, w_2, w_3\]$が与えられたとします。ここで、下付き文字(1)は**文章内での単語列の最初の要素番号**、上付き文字(3)は**文章内での単語列の最後の要素番号**と定義します。先ほどの例だとこうですね。

```math
w_1 = \mathrm{This}, w_2 = \mathrm{is}, w_3 = \mathrm{a}
```

ここから4単語目、つまり$w_4$を当てるときの確率はこうなりますね。

```math
P(w_4 | W^{3}_{1}) = P(w_4 | [w_1, w_2, w_3])
```
さて、文字数も一般化してみましょう。文章の先頭から連続$t$単語$W_{1}^{t} = \[w_1, w_2, \cdots, w_t\] $が与えられたとします。でも結局は前の文章すべてを見てフィルタをかけているわけです。つまり、式は「$W^{t}_{1}$という単語列の直後」(条件)に当てはまる単語の発生確率になるので、やっていることはほとんど変わらずこのような式になります。
```math
P(w_{t+1} | W^{t}_{1}) = P(w_{t+1} | [w_1, w_2, \cdots, w_t])
```

これが昔の機械による統計的な単語予測法です。でもこの「ちゃんとした確率」は毎回先頭から文章を見ています。
皆さんはどうでしょうか。

## N-gramの考え方
いたってシンプルです。別に毎回最初から文章を見なくてもいいんです。そこで、その前の数単語から単語の予測を行ってもあんまり変わらないんじゃないかという話がN-gramの考え方になります。 その単語の前$N-1$単語の情報を用いて同じ動作をするわけです。予測する単語と予測材料の単語を合わせて$N$単語になることに注意しましょう。先ほどと同じ表記方法を用いると、条件とする文字列は先頭が$t-N+2$番目で終端が$t$番目になるので、確率は次のように計算できます。

```math
P(w_{t+1} | W^{t}_{1}) \approx  P(w_{t+1} | W^{t}_{t-N+2})
```

さて、N-gramの説明は終わりになります。お疲れさまでした。

## N-gramの類語(?)
簡単にN-gramの類語の説明をさせていただき閉じようと思います。
|  用語  |  説明  |
| ---- | ---- |
| uni-gram | N=1のN-gram |
| bi-gram | N=2のN-gram |
| tri-gram | N=3のN-gram |

一般にtri-gramが精度が高いようですが、それに関してはまた調査次第付記しようと思います。
また曖昧なところに関してもわかり次第少しずつ付記していこうかなと思います。

## 最後に
ありがとうございました。もし投稿が途絶えたら「あー忙しいんだな」くらいに思ってください......
次回は一応NNLMに入ろうと思っていますが、そこまでにまた必要知識があればそっちを先にやろうと思います。