ロジット
ロジット(logit)とは、0から1の範囲を取る確率から計算される値の一種である。
次の式で定義される。(pは確率変数、lnは自然対数関数)
logit(p) = ln( p / ( 1 - p ) )
確率0.5の時に0となり、確率が上がると無限大方向に、下がるとマイナス無限大方向に変化する。
計算式には対数関数が含まれているため、0.5から0.6に変化する場合のロジットの差と、0.6から0.7に変化する場合の差は一定では無い。
以下に確率とロジットの対応を示す。なお、表中のロジットは有効桁数3桁に丸めている。
確率 | ロジット |
0.001 | -6.91 |
0.01 | -4.60 |
0.1 | -2.20 |
0.2 | -1.39 |
0.3 | -0.847 |
0.4 | -0.405 |
0.5 | 0 |
0.6 | 0.405 |
0.7 | 0.847 |
0.8 | 1.39 |
0.9 | 2.20 |
0.99 | 4.60 |
0.999 | 6.91 |
このグラフからわかる通り、確率が0と1に近い部分では、少しの変化でロジットが大きく変化する。また、0.5を中心に対称となっていることも分かる。
ロジットから確率を計算することも可能で、その場合は以下の式を使う。(αはロジット、eは自然対数の底)
expit(α) = 1 / ( 1 + e ^ -α)
バイアス
これは公式の仕様書ではなく、動作から確認、推測した内容であり、実際にこの通りの仕様である保証はありません。
その点を十分に注意ください。
キャラクターブックのコマンド「@addbias」を使うことで、トークンの生成確率にバイアスをかけることができる。
このバイアスは確率に直接作用するのではなく、ロジットに対して作用する。
「@addbias」の書式は次の通りである。
@addbias トークン,バイアス値
@addbias トークン,バイアス値<<|>>トークン,バイアス値<<|>>トークン,バイアス値<<|>>...
バイアス値は-40から40までの実数で、この範囲外の値は正の値なら40に、負の値なら-40になる。
バイアス値はフロントエンドサーバーに接続した際に0.25倍された値に変換される。
この値が対象トークンのロジット値に加算されるとみられる。
例
夏のレジャー、「海」か「山」か。私はやっぱり「
上記のような本文で続きを書くと、次に来るトークンはおおむね「海」か「山」かで半々となる。
ここで次のようなキャラクターブックを設定する。
タグ:夏
@_addbias 海,-3
この状態で続きを書くと、「海」が出力される確率が減り、「山」が優勢となる。(実測では50回出力して「山」が35回、「海」が15回)
この結果について考察すると、元は半々で出ていたと言うことは、2つとも生成確率は0.5に近かったと思われる。
一応低確率とは言え他のトークンが来る可能性もあるので、0.5を越えてはいなかっただろう。
このとすると、そのロジットは0を少し下回るぐらいになる。
ここでバイアス値の-3を0.25倍した-0.75を足すと、そのロジットは約-0.75となる。
こうして算出した値を、総和が1になるように変換(ソフトマックス関数による正規化と思われる)すると、バイアスを適用した後の確率を得られる。
なぜバイアスはロジットに対して適用されるのか
ひと言で言うと、計算に便利だからだと思われる。
単純に確率に対して加減算を行うと、1を越えてしまったり、0を下回ってしまったりする可能性がある。
それは確率としては不適当な値である。
そこで確率をロジットに変換すると、[0, 1]だった範囲は[-∞, ∞]に変換される。
これにより範囲が実数全体に広がったことで、実数の加減算を制限無く行うことができるようになる。
加減算の後はロジットを何らかの方法で正規化しつつ確率に戻せば、0から1の範囲に収まった値を得られる。
一見、ロジットに変換する分ややこしくなっているように思えるかもしれないが、0から1に収まる場合・0を下回る場合・1を越える場合で処理を分ける必要が無く、常に一定の処理で済むため、むしろシンプルになっている。
これがロジットを使う理由だと推測する。