いずれのモデルも、単語などの配列を入力にして、単語やラベルを予想する
メインは階層的softmax。
いずれのモデルも
入力(単語の列)
→ 各単語をベクトル化
→ 平均を取る
→ 線形な処理
→ 非線形な処理で確率に
数学的に整理し直すと
入力(単語などの列)
→ 単語などに対応するone-hotベクトルの
平均をとる
→ 行列をかける
→ 行列をかける
→ softmaxやsigmoidを適用する
(→ 目的の確率の形に直す)
行列をかけている部分の模式図
(入力)m次元
m×h行列
h×n行列
行列を二回かける意味は、
中間の次元を小さくすることで
パラメータの数を減らすことができる
m, h, nを入力・中間・出力の次元とすると
中間がないとm×n
中間があると(m+n)×h
二分木を使って各クラスになる確率を決定する
階層的softmaxでは、
いきなり、目的の確率を計算するのではなく、
左右どちらを選ぶかの確率を一度計算する。
(行列をかけた後、sigmoid関数を使う)
学習も目的のクラスにたどり着く経路にある分岐だけを学習すれば良い。
分岐の数をnとすると、
学習すべき分岐の数はlog nのオーダー。
x: 入力(one-hotベクトルの平均)
A: 一つ目の行列
B: 二つ目の行列
p: 分岐で左を選ぶ確率
単純に単語だけでなく、単語の一部を取り出したsubwordを入力に使っている。(n-gram)
パターンが一気に増える。
本当は、単語とsubwordの列から推測を行う。
s,u,b,w,o,r,d,
su,ub,bw,wo,or,rd,
sub,ubw,bwo,wor,ord,
subw,ubwo,bwor,word,
subwo,ubwor,bword,
subwor, ubword
subword
実際は長さを制限する
単語やsubwordにIDを割り当てたい。
順番にIDを振ると探すのが大変。
文字列から計算で、IDを割り当てよう。
単語のIDが被るとまずいから、被ったらずらす。
subwordのハッシュは被っても気にしない。
ハッシュの値の許容範囲には制限をかける。
数百万まで許すと、学習データがでかくなる。
高速化に工夫が必要。