超軽量LMを考える
対話AIの基本となる Transformer よりも軽量で文章予測のできる特徴加工を作成します
本記事はその記録です
文脈特徴を重み付きMULTI-HOT(ONE-HOT総和)とする考え
そもそも ONE-HOT とは
業務プログラム等でデータを取り扱い場合に
[男][女][その他] という区分フラグを扱う事を考えます
ONE-HOT とは [男][女][その他] という情報を
種類数(3)の配列を準備
インデックスを次のように設定
男=インデックス=0
女=インデックス=1
その他=インデックス=2
配列の該当するインデックスに1を設定する
各々次のようなデータとなる
男 = [1, 0, 0]
女 = [0, 1, 0]
その他 = [0, 0, 1]
ONE-HOT総和(平均)とは
次のONE-HOT単語ベクトルを例に考えます
駅 = [1, 0, 0]
徒歩 = [0, 1, 0]
自転車 = [0, 0, 1]
ある文章が次のような単語構成だったとします
- 駅という単語が6回登場
- 徒歩という単語が2回登場
- 自転車という単語が1回登場
駅 x 6 = [6, 0, 0]
徒歩 x 2 = [0, 2, 0]
自転車 x 1 = [0, 0, 1]
縦方向に総和を取る
[6, 2, 1]
となる
この文章の特徴ベクトルは
[6, 2, 1]
となります。
これが ONE-HOT 総和です。
この特徴方式として Bag Of Words が有名かと思います。
MULTI-HOT とは
「ONE-HOT 総和」が呼びづらいので 「MULTI-HOT」 と呼ぶことにします
造語です、世間的に MULTI-HOT という単語は使用されていません。
距離重み付き MULTI-HOTとは
連続した文章をMULTI-HOT表現とすると位置情報、順序が失われます
例えば次のようになります
[駅, 徒歩, 予測単語] = [1, 1, 0]
[徒歩, 駅, 予測単語] = [1, 1, 0]
そこで ONE-HOT に1を設定するのではなく、文脈末尾単語(予測単語)からの距離を重み係数として設定するルールを追加します。
駅 = [1, 0, 0]
徒歩 = [0, 1, 0]
自転車 = [0, 0, 1]
[駅, 徒歩, 予測単語] = [0.5, 1, 0] # [1/2, 1, 0]
[徒歩, 駅, 予測単語] = [1, 0.5, 0] # [1, 1/2, 0]
[駅, 徒歩, 自転車, 駅, 徒歩, 予測単語]
= [1/2 + 1/5, 1 + 1/4, 1/3]
= [0.7, 1.25, 0.333]
となり、位置情報(距離情報)を残すことができます。
同じ単語が続く場合に位置情報が失われる問題は許容する
「駅 駅 駅 徒歩 予測単語」という文章について考えます
次のようなベクトルとなり、駅という単語が末尾に尤も近いという意味合いのベクトルとなり、位置情報が想定通りでなく、破綻していると言っても良い状態です。
[駅, 駅, 駅, 徒歩, 予測単語] = [1.0833, 1, 0]
ですが、このようなパターンについても、「そういう特徴である」「単語が執拗に連続する事は稀である」として、モデル精度が落ちる事を許容します。
トレーニングデータ(X)と回答データ(Y)を作る
想定手順
- 窓解析を基本とする
- 文章のある位置からN単語を1文脈としトレーニングデータとする
- 1文脈の次の単語を回答データとする
駅 = [1, 0, 0, 0]
徒歩 = [0, 1, 0, 0]
自転車 = [0, 0, 1, 0]
予測単語 = [0, 0, 0, 1]
[駅, 徒歩, 予測単語] の場合に
X = [0.5, 1, 0, 0]
Y = [0, 0, 0, 1]
となる
ハイパーパラメータ
窓解析時のW(幅=単語数)とS(ステップ/ストライド=次の開始位置までの単語数)がハイパーパラメータとなります。
500単語の文章を W=20、S=5 で解析した場合は
500/5=100 となり、100個のベクトルが作成されます。
文章予測モデルの作成
これまでの内容でX,Yを作成しニューラルネットワークに学習させることで、簡単な文書作成モデルができると思います。
次に、文章全体の特徴を作成する方法について記します。
文章特徴の作成
文脈の次の単語を予測するモデルの解説をしましたが、この特徴を流用して文書全体の特徴化を行います。
シンプルに総和か平均を特徴とする
500単語、W=20、S=5 で解析した場合に、その1文章から100個のベクトルが作成されます
その100ベクトルを行方向(列単位)で平均値とし、それをそのまま文章特徴とします。
位置情報がだいぶ失われるため、Bag Of Words に近い特徴となることが予測されます。
単語密度係数を設定する
単語が一度も出現しなかったら0
一度でも出現したら1
2つ以上出現したら1+単語密度とします
ある単語について出現位置から密度係数を計算する
positions = [5, 25, 45, 65, 85]
gaps = [20, 20, 20, 20]
spread = average(gap/(1+gap)) ≒ 0.952
feature = 5 * 0.952 = 4.76
列全てでこの計算を実施し、最終的な値として設定します。
この設定により、位置情報は考慮されないものの「単語の出方」は考慮されるため、Bag Of Words よりは特徴を捉えるかもしれません
モデル差分を使う
文章生成モデルを作成します。
次に、分類したい文章をモデルに追加学習させ、元のモデルとの差分の行方向の平均をその文章の特徴とします。
学習済みLM = M
Mに追加学習させたモデル = M`
学習差分 = M` - M = Mdiff
文章特徴 = Mdiff の列毎の平均値
ちょっと変わった手法ではありますが、与えたサンプルが学習モデルに与えた影響をそのまま文章特徴としてしまおうという案です
その際ですが、seed値の固定をしたほうが良いでしょう、同じ文章は同じ特徴となるよう工夫が必要です。
tensorflowのseed値固定もそうですが、処理の途中で乱数を使うような処理があるならそれも固定です。
以上です