条件付き確率場(CRF)概説 CRF編
前回の記事でCRF以前の多クラス線形識別器まで話をしました. 今回はその続きということで, 本題であるCRFについてみていくことにします.
その前回の記事というのがこれです
kumachan-math.hatenablog.jp
これを前提に話を進めるのでまだの方は先にこっちから読むことをお勧めします.
前置きが長くても仕方ないので早速本題に行きましょう.
1. CRFは何をするか
多クラス線形識別においては, 1つの入力に対して, 1つの識別結果を与えるのでした. 具体的には, ソフトマックス関数によって定義される"条件付き確率"のようなもの
を定義し, 正解ラベルに対するこの値の積による尤度, あるいはその対数を取った対数尤度
の最大化問題として定式化されるのでした. けれども, 例えば自然言語や音声データを対象として何らかの識別問題を解きたいと思った時には, 入力の識別結果がの情報のみによって決まると考えるのは安易です. 自然言語であれば単語単体ではなく文脈を考慮したような識別ができた方がいいですし, 音声でも前後の発話からの抑揚の変化だったり速度の変化だったりを考慮できた方が良いですよね.
CRFは, 何らか順序を持ったデータをそれ単体で扱うのではなく系列として扱うということをします. 入力は今までだったものが順序を持った複数の入力の系列になるし, 出力もになります.
問題は複雑になりましたが, 式の上ではあまり問題はあまり変わっていません. 最大化するべき対数尤度は次のようになります.
ここで, 出力に関してはですが, 入力は順序関係の束縛があるため真部分集合です.
以上です. CRFってつまりはこれだけです. 数式の上では. 大事なことなのでもう一度言います.
数 式 の 上 で は
これで終わりです. つまり, まだまだ実際に動くシステムには遠いということです. 問題点を挙げましょう.
- ってさらっと書いてありますが, これはどうやって見つけるのでしょうか. 実験的に頑張るのでもいいかもしれませんが, もう少し理論に裏打ちされたセンスのある見つけ方というものはないのでしょうか
- 式を複雑にするのは結構ですが, コンピュータに計算させるとなると計算時間の問題は常について回ります. どうにかして高速に計算できないでしょうか.
例えば, 尤度の式の中に出てくる
とかは計算が大変そうです. 他にもパラメタ更新を勾配法で行うとき, その更新式の計算は一筋縄では行きそうにありません.
これらの点を順に見ていきましょう.
2. マルコフ性の仮定の導入とCRFの識別
今, 推定したいラベル列をとし, これについて各はのみに依存して決まるという仮定をおきましょう. この仮定は問題によって変更をするところですが, ひとまず説明のためにこうしておきます. この仮定の下では次の3種類の特徴を得ることができます.
- ととが全て関係する特徴
- とのみが関係する特徴
- とのみが関係する特徴
の値はすでに決まっていますから, とのみが関係する特徴は考える必要がありません. これらの特徴をいくつか定義することができれば, それらを各成分にもつベクトルをのうちの位置における局所的な特徴ベクトルと考えることができます. この局所的な特徴ベクトルをと書くことにします. 全体の特徴ベクトルを得るときには, 最も単純にはそれらを足し合わせれば良いですから.
と定義すれば良さそうです.
まずは, 学習のステップは考えないで, 学習が終わった後の識別のステップを考えましょう. の最大化に注目します. 最大化における変数は他でもなく識別結果のラベル列です.
ですから,
と定義すれば,
とかけます. 改めて問題を明示的に式で書けば,
です.
これ, どうやってときましょうか. は組合せ爆発の問題を抱えていて, 時間軸上順番を持った系列を考えており, 各はの元それぞれを選択肢として持っていて, でどんなラベル列を選んできたかがの選び方を束縛しないわけです. こうきたら, 典型的な動的計画法...ですよね. DPと分かれば漸化式を書いてみましょう. 時間的な流れ(今まで変数をと書きました)を一方に, それぞれの選択肢たるラベルの元(今まで変数をと書きました)を他方の次元に持つようなDP行列を考えれば良さそうです.
ここで, はBeginning Of Sequenceのことで, 系列の開始を表すダミーのラベルです. あとはこのDP行列を計算して, 最大成分のところからバックトラックすれば, 識別結果のラベル列が得られます. バックトラック...説明した方が良ければコメントでください.
3. 分配関数の計算
学習のステップにおいて最大化したい尤度の中に
という式が出てきました. この関数のことは分配関数と呼んでいます. これを愚直に計算しようと思うと回もの内積計算が必要になります. つまりラベルの種類の数に関して指数オーダーです. 誰かさんの言葉を借りれば, 恥ずかしいほど遅いを通り越して論外です. いいですか, 論 of the 外です. もう少し効率の良い計算方法はないものだろうか, そう考えるのは自然なことです.
せっかく上でを定義したので, それを用いて分配関数の定義を書き直してみましょう.
式の見た目が煩雑になるのが嫌なので,
と置きます. この(因数分解と展開の意味で)展開された式を因数分解してみようと思うと
となります. 少々煩雑ですが, ただの因数分解なので, ゆっくり式を追えば必ず理解できます(頑張って!). ここまでくれば, この計算を再帰的に行うことができると言うことに気がつくと思います.
とおくと, これらは漸化式
を満たします. あとはこの漸化式に従って行列を埋めていけば,
として分配関数を求めることができました. 組み合わせ爆発で困ったら, とりあえずDPを検討すればいいみたいですね.
次の章のために, もう一種類の漸化式を考えておきましょう.
とおくと, これらは漸化式
を満たして,
となります.
4. CRFのオンライン学習
最尤推定によって学習を進めるにあたって, 謎の変数がまだ1つ残っています. というより, この謎の変数が学習によって調整をするものな訳ですけれどね. そう,今まで定ベクトルとか言ってだましだまし考えていたです. このをうまく決めましょう, ただし評価関数は対数尤度
にしましょうというのがCRFの学習そのものです. オンライン学習で勾配法によってを更新するときの更新式はを学習率として,
とかけます. ここに, を新しく追加したデータとして
です. このとき,
となりますが,
ですから,
と綺麗な形に整理されました.
今から, 第2項をとを使って表現することを考えましょう. もしこれがうまくいけば, 分配関数の計算過程で出てきた副産物を使いまわすことができるので計算時間はグッと短縮されます. 第2項の総和ではの元全てについて考えるのですから, 局所的にある連続した2つのラベルを見たときには, の全てについて考えていると言えます. 入力としてが与えられたとき位置において, 直前のラベルがであって位置のラベルがとなるソフトマックス関数の意味での確率をと書くことにしましょう. すると, 上の第二項はを用いて,
とかけます. は, 分散関数の値を分母に持って, その計算過程において, (m-1, y')と(m, y)を通る値の総和を分子に持つ比によって書けるので, ある位置より先の値の総和を計算しているとその直前の位置までの値の総和を計算している用いれば,
となります. 晴れて目標達成です.
5. まとめ
CRF概説はここまでとなります. 色々数式をいじりましたが, お気持ちをまとめると次の二点です.
- CRFは, 何らか順序を持ったデータをそれ単体で扱うのではなく系列として扱い, 入力系列から識別ラベルの系列を推定するための手法です.
- ソフトマックス関数によって確率のようなものを定義して, それによる尤度の最大化問題として学習ステップを行い, 内積によるスコアの最大化問題として識別ステップをおこないます.
はー長かったですね. お疲れした〜!