機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

Snorkelの生成モデルについて(理論編)

Snorkelとは



一言で言うと、ラベル付き訓練データを簡単に作成できるツール。
詳しくは前回の記事にまとめた。
kento1109.hatenablog.com
尚、今回の内容は以下の論文のまとめみたいなもの。
[1605.07723] Data Programming: Creating Large Training Sets, Quickly

生成モデルとは



観測データを生成する確率分布を想定し、観測データからその確率分布を推定する方法。
(それぞれのクラスにおけるデータの分布を学習するモデル。)
教師なし学習における生成モデルによるアプローチでは、ラベル無しデータをラベリングに関する不完全データとして扱うことで分類器の学習に用いる。
同時確率モデルp(x,y:\Theta)において、訓練データを用いてパラメータ\Theta=\{\theta_k\}_{k=1}^Kを学習する。
xのクラスラベル yは、ベイズ則によりクラス事後確率 P(k|x:\Theta)\propto P(x,k:\theta_k)を求め、その確率を最大化する kを選択することで推定される。
識別モデルと生成モデル - 機械学習・自然言語処理の勉強メモ
にもまとめた。

Data Programming



Data Programmingとは、概念みたいなものであるが、訓練データをラベリング関数を書くことで簡単に生成する手法みたいなもの、と書かれている。
Data Programmingでは、

  1. 生成モデルを用いてラベリング関数の出力をモデリング
  2. 識別モデルを用いてデータをラベリング

の2つのプロセスに分けられる。

今回は1.の方を見ていく。
ラベリング関数の出力結果\lambda_iは、潜在変数yから生成されたと仮定する。
(生成モデリングによるアプローチ)
f:id:kento1109:20180109162304p:plain
※論文より引用
各関数は以下のようなもの

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

\lambda \in [-1,-,1]なので、結果は下記のような行列となる。

\lambda_1 \lambda_2 \lambda_3
x_1 1 0 1
x_2 1 1 1
x_3 -1 1 0
\vdots \vdots \vdots \vdots
x_i 1 1 -1

ここで、\lambda_iに関する確率変数

  • \beta_i:観測データの網羅率(非ゼロの割合)
  • \alpha_i:真のラベルyと「一致」する確率

を導入する。
※関係抽出タスクの場合、関数は、「1(関係あり)、-1(関係なし)、0(不明)」を返す。

例えば、\lambda_i(x)の潜在変数がy=1であった場合を考えると、
\lambda_i(x)=1の時、ラベリング関数は真のラベルyと一致している。(これは\alphaで定義される。)ただし、ラベリング関数がその観測データをカバーしていない(0を返す)可能性もある。なので、カバー率を掛けて\beta\alphaが「真のラベルとラベリング関数の出力が一致する確率」となる。反対に、\beta(1-\alpha)とすると、「真のラベルとラベリング関数の出力が一致しない確率」となる。最後に、(1-\beta)が「ラベリング関数の非カバー率」となる。
まとめると、
  P(\lambda_i(x)|y) = \begin{cases}
    \beta_i\alpha_i & (\lambda_i(x)=y) \\
\beta_i(1-\alpha_i) & (\lambda_i(x)=-y) \\
    (1-\beta_i)& (\lambda_i(x)=0)
  \end{cases}
と書ける。
\beta_i\alpha_i+\beta_i(1-\alpha_i)+(1-\beta_i)=1

\betaであるが、これは観測データから計算可能。一方、真のラベルyは不明なので\alphaは推定する必要がある。(論文では\alpha,\betaをパラメータとしているが、なぜ\betaも推定する必要があるかはよく分からなかった・・)
生成モデルは下記の式で考えられる。
\sum_{i=0}^nP(y_i)P(x|y_i)
今回は2クラスで考えるので、
P(y)P(x|y)=P(y=0)P(x|y=0)+P(y=1)P(x|y=1)
事前確率P(y)であるが、今回は推定できないので、0.5と置いておく。P(x|y)は一般的には正規分布などを仮定してxが生成される確率を計算することが多いが、ここでは\alpha,\betaを使って求める。
\begin{eqnarray}P(\Lambda|y)=\prod _{ i=1 }^{m }{  P(\lambda_i(x)|y)}\end{eqnarray}とすると、分布
\begin{eqnarray}p(\Lambda|y)=\prod _{ i=1 }^{m }{ ( \beta_i\alpha_i\rm 1_{\{\Lambda_i=y\}}+\beta_i(1-\alpha_i)\rm 1_{\{\Lambda_i=-y\}}+(1-\beta_i)\rm 1_{\{\Lambda_i=\rm 0\}})}\end{eqnarray}
事前確率は0.5なので、同時確率の分布は、
\begin{eqnarray}p(\Lambda,y)=\frac{1}{2}\prod _{ i=1 }^{m }{ ( \beta_i\alpha_i\rm 1_{\{\Lambda_i=y\}}+\beta_i(1-\alpha_i)\rm 1_{\{\Lambda_i=-y\}}+(1-\beta_i)\rm 1_{\{\Lambda_i=\rm 0\}})}\end{eqnarray}
となる。
任意の訓練データS\in Xを用意して、
\begin{eqnarray}L=\sum_{x\in S}\log\left(\sum_{y'\in \{-1,1\}}p(\lambda(x),y')  \right) \end{eqnarray}
として、最尤法により\alphaを求める。
論文では、確率的勾配法により\alphaを推定している。(調整過程は省略)
生成モデルのアプローチでは、

\lambda_1 \lambda_2 \lambda_3 \lambda_4 \lambda_5
x_1 1 0 1 1 1
x_2 1 1 1 0 0
x_3 -1 -1 0 -1 0

とデータがあった場合、
x_1,x_2y=+1の分布から、x_3は、y=-1の分布から生成されたとするのが尤もらしいと考える。