【chainer】 crf1d, CRF1dの使い方

chainerのlinks.CRF1dとfunctions.crf1dの使い方メモ。
crfと同様に系列を扱うNStepLSTMとかと同じ気分で使うと事故る。

概要

functions.crf1d(cost, xs, ts)

遷移スコア、タグスコア、正解ラベルをそれぞれ受け取って、最適パスをVariableのlistで返す。
遷移スコアは

って感じの行列で、例えばタグ1から2への遷移スコアを5にするなら以下のようにする。

他のスコアも適当に埋めて渡せばいい。

links.CRF1d(xs, ts)

最適な遷移スコアをヒューリスティックに探すのはしんどいので遷移スコアを学習する。
中でfunctions.crf1dを呼ぶので入出力は同じ形。

入力(xsの形)

[]はリスト、()はVariableかnumpyのarray。
リストのインデックスが各時刻、行列がバッチ内の各タグスコア。

実際のコードだと以下のような感じ。
links.CRF1dを使っているが、functionsの方を使うなら上で述べた行列を第一引数に渡せばいい。

入力(tsの形)

教師データもxsと同じで、縦にして大きい順に横に並べる。

ちなみに僕が混乱したのは、同じ系列を扱うNStepLSTMの入力が以下のようだから。

BiLSTMでのリストがバッチサイズを表しているのに対して、crf1dのリストは各時刻の入力を表している。
超紛らわしい。

 

(余談)
CRFを使うときにsoftmaxを噛ませると学習できないので、pre-trainingとかしてるひとは気をつけてください。
functions使うときにスコアをある程度正規化してから渡したいなぁ〜とか思ってると、普通に学習できなくて無理。

 

わかりづらいとか、間違いとかあったらコメントでお願いします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です