Open IKKO-Ohta opened 7 years ago
五頁目の式、S[t],B[t]などのベクトル表現を得るための式で、Vを線形写像として x = max(0,V[w; w_LM; t] + b) とあるけれども、得られる値がスカラーかベクトルかで迷った。結論から言うとmax(0,X)はcomponent wiseなReLU関数なので、S[t],B[t]はベクトルなのだ、という理解でよいはず。
しかしwとw_LMの何が違うのかよくわからない。 wはword typeでw_LMはa fixed vector representation from a neural netowork modelとあるが、このときwがカテゴリ変数でw_LMがword2vec(より高級なものを使っているらしいけど)から得られた単語分散表現という意味か。で、それらを縦にconcatして、提案手法たるstacked-LSTMに突っ込んでcomponents-wise ReLUをするということ? という風に文章は読めるが、fig.4と整合的ではないように見える。
stacked-LSTMはポインタをもったLSTMブロック。というか分化する計算グラフ。push/popによって層のコネクションが分化する(一度pushされた層がなくなってしまうわけではない)。正直言ってこれがstackなのかどうかよくわからない(確かに後入れ先出しで計算を解決していくイメージはあるかも)
dependency parsingでは語と語の繋がりが次々になるわけではなく、飛び石になることがあり、そのような場合に計算グラフを分化させてうまく計算しようという意味だと思われる。
しかしparser側とどういう連動をするのか? このLSTM自体の訓練は? 動的に層が増えていくのはどうやって実現しているのか? この2つのLSTMも、parserのw,gと同時に訓練するという意味?
""" これは全然違う。誤読 9/21 """
たぶんこういうこと:
大まかに見取り図を書いたらコーディングに移る。
chainerで実装中。 https://github.com/IKKO-Ohta/e2l/blob/master/parsing/bin/lstmParser.py
9/20 15:40 confとtransitionアクションができて雰囲気がparserっぽくなる。 課題は部分木の再帰部分で、僕の理解だと次元の数のつじつまが合わない気がする。
Arc-standardをsubtreeの計算以外では実装。 次は入力とembedding側に回る。
学習時の形式は標準的な(?) oracleにしたやつを用いる。oracleはtransition-basedのバッファ・部分木の状況を記録したファイル形式で、配布されているプログラムでconllから抽出できる。oracle化するプログラムはhttps://github.com/clab/lstm-parser から拝借。 Done
Todo
def oracle_dump() """ オラクル形式を読み取ってデータ対に落とし込む """ をembedding以外の部分で実装した。
データ対に落とし込むための関数が必要。buffer側・stack側の両方でword embedding. stack側のほうでは、部分木をベクトル表現に直す工夫が必要となる。Dyer(2014) ではRichard Socher(2013)を参照している。Socherは、部分構文木をembeddingして感情分析にかける。 http://www.aclweb.org/anthology/D13-1170 木をベクトルに潰す処理としてはかなり高名っぽい。
クラス全体が肥大化してきた。 パーザのクラスを分割する。 parser
構文木のコンポジション[ベクトル埋め込み]はシンプルなRecursive Neural Networkで行う。 [a,(b,c)]という部分木があったら、
p1 = W[b;c] + b
p1 = ReLU(p1)
p2 = W[a:p1] + b
p2 = ReLU(p2)
となってp2が答え。同一の非線形写像オブジェクトを使い回してバックプロップするという理解。
RecNNを書いた。
(C.Dyer 2014) parsing program implement
init
pred
train
encode
trainsition
[L,R,SH] nltk.parsingと同じ規格で良い