はじめに
Rinna から提供されている gpt モデルを使って遊んでみています。
Rinna Gpt2 モデルを onnx データにしたので、これをIME(かな漢字変換)に応用できるか試してみます。今回はリランカで使ってみることを想定します。
(もちろん、入力の続きを生成するのが、もっとも単純に思いつく応用ですが、それは至極当然なので…)
リランカ (Reranker) って?
日本語入力を支える技術 の P.245 のリランキングのフェーズで使ってみようということです。つまり単語グラフを作って2単語接続情報からバックワードビタビとフォワードA*で、Nベストを作り、それの評価機として使うということです。このフェーズだと、とんでも候補はに除外されている前提です。
何を計算するのか
GPTの出力の logits には、次トークンだけではなく、入力されたトークンに対しても計算されているようです。直前のトークンに対する logits から、softmax で、そのトークンの確率を計算します。それをP(Wn|W1...Wn-1) と思って、すべてかけると文章の確率が π P(Wn|W1...Wn-1) として計算してみます。
入力 |
_ |
庭 |
で |
犬 |
を |
飼 |
う |
<eos> |
log(total) |
token ID |
9 |
3383 |
19 |
1651 |
18 |
11915 |
307 |
2 |
|
softmax/total |
|
0.000018 |
0.053874 |
0.003065 |
0.250974 |
0.344746 |
0.193827 |
0.000025 |
-34.306927 |
計算に使ったプログラム
同音異義語を比較してみる
入力 |
log(total) |
Best? |
庭で犬を飼う |
-34.306927 |
〇 |
庭で犬を買う |
-38.451576 |
|
庭で犬をかう |
-43.358597 |
|
入力 |
log(total) |
Best? |
店で犬を飼う |
-35.116959 |
|
店で犬を買う |
-34.593872 |
〇 |
店で犬をかう |
-45.241699 |
|
入力 |
log(total) |
Best? |
登校時間が、いつもよりとても速い |
-50.598568 |
|
登校時間が、いつもよりとても早い |
-47.688759 |
〇 |
入力 |
log(total) |
Best? |
彼の足は、いつもよりとても速い |
-45.206917 |
〇 |
彼の足は、いつもよりとても早い |
-46.757721 |
|
まとめ
- GPTを、文の生成に使うのではなく、既知の文の確率を計算できるのか試してみた。
- 同音異義に対して、正しい方が高確率になるか確認してみた。