Kerasメモ(Embeddingレイヤ)
Kerasネットワークは、入力として数値テンソルだけを受け付ける。テキストはそのままの形では渡せないため、変換が必要になる。
テキストを数値テンソルに変換することをベクトル化(vectorizing)と呼ぶ。
全てのベクトル化プロセスは、テキストに何らかのトークン化(tokenization)の方法を適用し、生成されたトークン(token)を数値ベクトルに対応付ける。
(文字、単語、N-gramといった、テキストを分割して得られるさまざまな単位のことを集合的にトークンと呼ぶ)
トークンに数値ベクトルを対応付ける方法はいくつかあり、よく使われるのは以下の2つ。
- one-hot encodeding(2値の疎ベクトル)
- token embedding(一般的に単語に対して使われるので、word embeddingとも呼ぶ)
one-hot encodingを使った例
Kerasメモ(seq2seqで文字レベル機械翻訳) - ichou1のブログ
一般的にベクトル(緑の部分)は20,000次元以上になる、と書かれている。
(20,000次元の場合、20,000語を管理する)
ベクトルの次元数に、文の長さ(青の部分)、サンプル数(赤の部分)を掛けた分だけメモリを消費する。
token embeddingを使った例
Kerasメモ(seq2seqで足し算) - ichou1のブログ
一般的にベクトル(オレンジの部分)は256次元か512次元、大規模な語彙を扱うときは1024次元ほど、と書かれている。
ベクトルの次元数に、文の長さ(青の部分)、サンプル数(赤の部分)を掛けた分だけメモリを消費する。
Embeddingレイヤは、整数のインデックス(特定の単語に対応)をベクトルにマッピングする辞書にあたる。
入力として整数を受け付け、内蔵辞書で整数をルックアップし、対応するベクトルを返す。
具体的に見てみる。
取り込むトークン数が「50,000」、ベクトルの次元が「128」のEmbeddingレイヤを定義する。
シーケンス長が固定のパターン
1sequence=1wordの場合、input_lengthの長さは"1"になる。
model = Sequential() model.add(Embedding(input_dim=50000, output_dim=128, input_length=1))
バージョン「1.12」での引数説明より抜粋。
Flattenレイヤに出力を渡す場合は、"input_length"の指定が必要。
tf.keras.layers.Embedding | TensorFlow Core r2.1
input_dim: Size of the vocabulary
output_dim: Dimension of the dense embedding
input_length: Length of input sequences, when it is constant. This argument is required if you are going to connect Flatten then Dense layers upstream.
レイヤ内部の重み(トークンベクトルの内部辞書)。トレーニングにより調整される。
# model.layers[0].weights # [<tf.Variable 'embedding_1/embeddings:0' shape=(50000, 128) dtype=float32_ref>]
シーケンス長が可変のパターン
ただし、バッチごとに長さを揃える必要がある。
model = Sequential() model.add(Embedding(input_dim=50000, output_dim=128))