1,word2vecのネットワークの構造について
2,データセットについて
学習に使用する文章コーパスをどのような形でcsvファイルに書き込むのか。
分かち書きしたものに整数値でインデックスをつけるところまでは分かるのですが、
作成した膨大な単語を横に列で書き込むのか、縦に行で書き込むのか、1つのテキストファイルを1つのcsvファイルにするのかが分かりません。
また、評価データも必要でしょうか。
3,ヘッダー部について
海外のフォーラムでは横1列にされていましたがその際ヘッダー部がx_1,x_2...となっていたのですが
これは出した結果を別のプログラムを作って対応する単語に変換するということでしょうか。直接日本語に変換はできないのでしょうか。
また、海外のフォーラムではx_1,x_2...の後、yの値が1になっていたのですがこれは何を意味するのでしょうか。
非常に初歩的な質問だと思いますがお答えいただけると幸いです。よろしくお願いいたします。
海外のフォーラムは以下のポストかと推察しますが、
こちらはClassificationタスクに関するご質問でしたので、識別対象のカテゴリIndexとして
y列を用意しております。
https://groups.google.com/forum/#!topic/neural_network_console_users/upKeAJoU-J0
> 1、Encoder側とDecoder側の重みの共有について
> 他のライブラリを参考に下記のようなネットワークを作成しているのですが、2つのLSTMの間で状態を共有するにはどうすればいいのでしょうか。パラメータスコープを左側(Encoderのつもり)のものと同一にするのかと思い、それは実行済みです。2つのネットワークをつなげればいけないのならば、どのようにつなげればいいのでしょうか。
Softmax-cross-entropyを用いることにより、時刻ごとの単語Indexのスコア(単語数次元)が得られるかと思います。
各時刻において、もっとも値の大きい次元が、Decoderの予測した単語ととらえることができます。
seq2seqの実装について、データセットの中身をword2vecで200次元のベクトルにしたところ無事に実装できました。
何度も申し訳ないのですが、いくつか単語Indexを入力する方法の実装で疑問があったので質問させてください。
前提条件として、
会話の生成では、
発話データ入力 > Embedで任意の次元の単語ベクトル(埋め込みベクトル)を生成 > エンコーダー側の中間層(RNNやLSTM)に入力、中間ベクトル作成 > デコーダ側の中間層(RNNやLSTM)に入力 > 生成されたベクトルを単語数次元に変換、softmaxで出力 > 交差エントロピーで損失計算
のモデルを適用すると解釈しています。(今回ベクトルを入力した時はベクトルをそのまま出力し、二乗誤差で損失計算しました。)
以下は入力から出力までのNNC上のパラメータ
データセットのinput=21,1のデータ(文章長21、単語indexでの入力)
>Embedで100次元のベクトルに変換=21,100
>中間層サイズを100とする=21,100
ベクトルを単語数次元に変換(単語数は3000とする=
21,3000
>これをsoftmaxにかけて損失計算=1
1、Embedを使う際の入力データについて
Embedは入力が単語Indexとあるのですがこれは
[0:”EOS”,1:”こんにちは”…](pythonの辞書型)と言った1単語につき1つの数字で表したものか、
one-hot表現(次元数は語彙)で表したものか
どちらを使うべきでしょうか。
2、交差エントロピーについて
1の前者の方法で入力する際csvへの記載は発話された単語時系列に沿って上から入力されると理解しています。
ex)私 は “名前” です > 0
0 1 2 3 > 1
2
3 左は1つのcsvの入力
また、各Indexは各単語を表すラベルと捉えられると解釈しています。
つまり、一つのcsv内に複数のラベルが存在している状況になります。ex)文章長21なら21,1のデータ
この複数ラベルが入ったcsvファイルを交差エントロピーのT.Datasetのデータとすることは可能でしょうか。できるならどのように入力すればいいですか。
また、交差エントロピーのAxisは何を表していますか。
3、強化学習の実装はできますか。(DQNなど)
以上、3点をお願いいたします。
また、前提条件で間違っているところがあれば、指摘していただければ幸いです。
はい、Embedレイヤーの入力は、上に書かれているように整数(int)の各値が
単語の種類を表すIndexになります。
Transpose(Axes=1,0) # 行と列を入れ替えて、100,21に
Reshape(OutShape=100,1,21) # 100枚の21(w)×1(h)画像の形に変換
Convolution(KernelShape=1,5, BorderMode=same) # 時間方向のカーネル幅が5のConvolutionを行う
Reshape(OutShape=100,21) # 再び行列に戻す
Transpose(Axes=1,0) # 行と列を入れ替えて、100,21に戻す
ロス関数については、RecurrentOutputで各時刻の予測単語のベクトルをまとめた結果の
サイズが(時間数,単語ベクトル次元数)である行列について、
教師ベクトルとの二乗誤差を計算するとよいかと思います。