Kerasのドキュメントは、これが実際に何であるかを明確にしていません。これを使用して、入力フィーチャ空間をより小さなものに圧縮できることを理解しています。しかし、これはニューラルデザインの観点からどのように行われますか?オートエノクダー、RBMですか?
Kerasのドキュメントは、これが実際に何であるかを明確にしていません。これを使用して、入力フィーチャ空間をより小さなものに圧縮できることを理解しています。しかし、これはニューラルデザインの観点からどのように行われますか?オートエノクダー、RBMですか?
回答:
私の知る限り、埋め込みレイヤーは、単語を対応する単語の埋め込みに変換する単純な行列乗算です。
埋め込みレイヤーの重みは、形状(vocabulary_size、embedding_dimension)です。各トレーニングサンプルの入力は、特定の単語を表す整数です。整数は語彙サイズの範囲内です。埋め込みレイヤーは、各整数iを埋め込み重み行列のi番目の行に変換します。
これを行列乗算としてすばやく実行するために、入力整数は整数のリストとしてではなく、ワンホット行列として格納されます。したがって、入力図形は(nb_words、vocabulary_size)であり、1行に1つの非ゼロ値があります。これに埋め込みウェイトを掛けると、出力はシェイプで得られます
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
したがって、単純な行列乗算を使用して、サンプル内のすべての単語を対応する単語の埋め込みに変換します。
Keras
Embedding
層は、任意の行列の乗算だけで、それを実行していません。
1. (vocabulary_size)x(embedding_dimension)次元の重み行列を作成します
2.この重み行列にインデックスを付けます
クラスが何をするのかを理解するためにソースコードを見ておくことは常に役に立ちます。この場合、Layerと呼ばれる基本レイヤーから継承するclass
埋め込みを見てみましょう。class
(1)- (vocabulary_size)x(embedding_dimension)ディメンションのウェイトマトリックスの作成:
これはbuild
、Embeddingの機能で発生しています。
def build(self, input_shape):
self.embeddings = self.add_weight(
shape=(self.input_dim, self.output_dim),
initializer=self.embeddings_initializer,
name='embeddings',
regularizer=self.embeddings_regularizer,
constraint=self.embeddings_constraint,
dtype=self.dtype)
self.built = True
基本クラスLayerを見ると、add_weight
上記の関数がトレーニング可能な重みの行列(この場合は(vocabulary_size)x(embedding_dimension)ディメンション)を作成していることがわかります。
def add_weight(self,
name,
shape,
dtype=None,
initializer=None,
regularizer=None,
trainable=True,
constraint=None):
"""Adds a weight variable to the layer.
# Arguments
name: String, the name for the weight variable.
shape: The shape tuple of the weight.
dtype: The dtype of the weight.
initializer: An Initializer instance (callable).
regularizer: An optional Regularizer instance.
trainable: A boolean, whether the weight should
be trained via backprop or not (assuming
that the layer itself is also trainable).
constraint: An optional Constraint instance.
# Returns
The created weight variable.
"""
initializer = initializers.get(initializer)
if dtype is None:
dtype = K.floatx()
weight = K.variable(initializer(shape),
dtype=dtype,
name=name,
constraint=constraint)
if regularizer is not None:
with K.name_scope('weight_regularizer'):
self.add_loss(regularizer(weight))
if trainable:
self._trainable_weights.append(weight)
else:
self._non_trainable_weights.append(weight)
return weight
(2)-このウェイトマトリックスのインデックス作成
これはcall
、Embeddingの機能で発生しています。
def call(self, inputs):
if K.dtype(inputs) != 'int32':
inputs = K.cast(inputs, 'int32')
out = K.gather(self.embeddings, inputs)
return out
この関数は、Embedding
レイヤーの出力を返しますK.gather(self.embeddings, inputs)
。何tf.keras.backend.gather正確に行うことは重み行列インデックスにあるself.embeddings
(参照build
に応じて上記の機能)をinputs
正の整数のリストであるべきです。
これらのリストは、たとえば、テキスト/単語入力をKerasのone_hot関数に渡し、テキストをサイズnの単語インデックスのリストにエンコードする場合に取得できます(これは1つのホットエンコーディングではありません。詳細については、この例も参照してください:https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/)。
したがって、これですべてです。行列の乗算はありません。
それどころか、このKeras
Embedding
レイヤーは、行列乗算の実行を正確に回避し、一部の計算リソースを節約するためにのみ有用です。
それ以外の場合は、(入力データをエンコードした後)Keras
高密度レイヤーを使用して、((vocabulary_size)x(embedding_dimension)次元の)トレーニング可能な重みの行列を取得し、単純に乗算を行って正確に出力を取得できますEmbedding
レイヤーの出力と同じです。
関数をよりよく理解するには、ソースコードを確認することをお勧めします。 これは埋め込み用です基本的にはトレーニング可能なルックアップテーブルです。
Kerasでは、Embedding
層がある、NOT(通話以下の機能やオリジナルの参照単純マトリクス倍層が、ルックアップテーブル層の定義を)。
def call(self, inputs):
if K.dtype(inputs) != 'int32':
inputs = K.cast(inputs, 'int32')
out = K.gather(self.embeddings, inputs)
return out
何それがないことは、既知の各整数をマッピングすることであるn
にinputs
トレーニング可能な特徴ベクトルにW[n]
その次元のいわゆる組み込み長編です、。
Embedding
層は実際に行列の乗算です。