ichou1のブログ

主に音声認識、時々、データ分析のことを書く

Kerasメモ(Embeddingレイヤ)

https://www.oreilly.co.jp/books/images/picture978-4-87311-857-4.gif
「RとKerasによるディープラーニング」より)

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語を管理する)
f:id:ichou1:20190227205843p:plain
ベクトルの次元数に、文の長さ(青の部分)、サンプル数(赤の部分)を掛けた分だけメモリを消費する。

token embeddingを使った例

Kerasメモ(seq2seqで足し算) - ichou1のブログ

f:id:ichou1:20190227214449p:plain

一般的にベクトル(オレンジの部分)は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>]

f:id:ichou1:20190211173236p:plain

シーケンス長が可変のパターン

ただし、バッチごとに長さを揃える必要がある。

model = Sequential()
model.add(Embedding(input_dim=50000, output_dim=128))

f:id:ichou1:20190211175103p:plain