Snorkelの生成モデルについて(理論編)
Snorkelとは
一言で言うと、ラベル付き訓練データを簡単に作成できるツール。
詳しくは前回の記事にまとめた。
kento1109.hatenablog.com
尚、今回の内容は以下の論文のまとめみたいなもの。
[1605.07723] Data Programming: Creating Large Training Sets, Quickly
生成モデルとは
観測データを生成する確率分布を想定し、観測データからその確率分布を推定する方法。
(それぞれのクラスにおけるデータの分布を学習するモデル。)
教師なし学習における生成モデルによるアプローチでは、ラベル無しデータをラベリングに関する不完全データとして扱うことで分類器の学習に用いる。
同時確率モデルにおいて、訓練データを用いてパラメータを学習する。
のクラスラベル は、ベイズ則によりクラス事後確率 を求め、その確率を最大化する を選択することで推定される。
識別モデルと生成モデル - 機械学習・自然言語処理の勉強メモ
にもまとめた。
Data Programming
Data Programmingとは、概念みたいなものであるが、訓練データをラベリング関数を書くことで簡単に生成する手法みたいなもの、と書かれている。
Data Programmingでは、
- 生成モデルを用いてラベリング関数の出力をモデリング
- 識別モデルを用いてデータをラベリング
の2つのプロセスに分けられる。
今回は1.の方を見ていく。
ラベリング関数の出力結果は、潜在変数から生成されたと仮定する。
(生成モデリングによるアプローチ)
※論文より引用
各関数は以下のようなもの
def lambda_1(x): return 1 if (x.gene,x.pheno) in KNOWN_RELATIONS_1 else 0 def lambda_2(x): return -1 if re.match(r’.*not cause.*’ , x.text_between) else 0 def lambda_3(x): return 1 if re.match(r’.*associated.*’ ,x. text_between) and (x.gene , x.pheno) in KNOWN_RELATIONS_2 else 0
なので、結果は下記のような行列となる。
1 | 0 | 1 | |
1 | 1 | 1 | |
-1 | 1 | 0 | |
1 | 1 | -1 |
ここで、に関する確率変数
- :観測データの網羅率(非ゼロの割合)
- :真のラベルと「一致」する確率
を導入する。
※関係抽出タスクの場合、関数は、「1(関係あり)、-1(関係なし)、0(不明)」を返す。
例えば、の潜在変数がであった場合を考えると、
の時、ラベリング関数は真のラベルと一致している。(これはで定義される。)ただし、ラベリング関数がその観測データをカバーしていない(0を返す)可能性もある。なので、カバー率を掛けてが「真のラベルとラベリング関数の出力が一致する確率」となる。反対に、とすると、「真のラベルとラベリング関数の出力が一致しない確率」となる。最後に、が「ラベリング関数の非カバー率」となる。
まとめると、
と書ける。
※
であるが、これは観測データから計算可能。一方、真のラベルは不明なのでは推定する必要がある。(論文ではをパラメータとしているが、なぜも推定する必要があるかはよく分からなかった・・)
生成モデルは下記の式で考えられる。
今回は2クラスで考えるので、
事前確率であるが、今回は推定できないので、0.5と置いておく。は一般的には正規分布などを仮定してが生成される確率を計算することが多いが、ここではを使って求める。
とすると、分布
事前確率は0.5なので、同時確率の分布は、
となる。
任意の訓練データを用意して、
として、最尤法によりを求める。
論文では、確率的勾配法によりを推定している。(調整過程は省略)
生成モデルのアプローチでは、
1 | 0 | 1 | 1 | 1 | |
1 | 1 | 1 | 0 | 0 | |
-1 | -1 | 0 | -1 | 0 |
とデータがあった場合、
はの分布から、は、の分布から生成されたとするのが尤もらしいと考える。