おそらく、wordvec_sizeは隠れ層に与える単語ベクトルの次元を示しており、モデルの構造を決定するために使われます。
自然言語処理におけるRNNは、以下のような構造になっています。
0.単語(形態素)に対するone-hotベクトル(もしくは数字)を作成する
1.one-hotベクトルに重み行列embed_Wをかけて、隠れ層へ与える単語ベクトルを作成する
2.単語ベクトル、1ステップ前の隠れ層の出力より、隠れ層の出力を決定する
※この出力は1ステップ後の隠れ層の入力になる
3.隠れ層の出力より、予測する単語ベクトルを決定する
重みの初期設定についてのコードを以下に示します(コメント部分は自分が追加)。
python
1###SimpleRnnlm
2
3 def __init__(self, vocab_size, wordvec_size, hidden_size):
4 V, D, H = vocab_size, wordvec_size, hidden_size
5 rn = np.random.randn
6
7 # 重みの初期化
8 #単語(one-hotベクトルもしくは数字表現)をベクトル化する行列
9 embed_W = (rn(V, D) / 100).astype('f')
10
11 #隠れ層の出力を決めるための重み行列
12 rnn_Wx = (rn(D, H) / np.sqrt(D)).astype('f')#単語ベクトルに対して
13 rnn_Wh = (rn(H, H) / np.sqrt(H)).astype('f')#1ステップ前の隠れ層の出力に対して
14 rnn_b = np.zeros(H).astype('f')#バイアス
15 #3つの重みを使って計算したベクトルを活性化関数の入力とし、その時の出力が隠れ層の出力になる
16
17 #隠れ層の出力を単語にするための行列
18 affine_W = (rn(H, V) / np.sqrt(H)).astype('f')
19 affine_b = np.zeros(V).astype('f')
deep-learning-from-scratch-2/ch05/simple_rnnlm.py(github)
one-hotベクトルから単語ベクトルへの変換についてわかり易く説明した記事があるので、参考として読んでみてください。記事後半における12がvocab_size,3がwordvec_sizeにあたります。
word2vec(Skip-Gram Model)の仕組みを恐らく日本一簡潔にまとめてみたつもり
その他参考記事:One hot表現を実装してみた
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/25 02:00