Kerasの埋め込みとは何ですか?


97

Kerasのドキュメントは、これが実際に何であるかを明確にしていません。これを使用して、入力フィーチャ空間をより小さなものに圧縮できることを理解しています。しかし、これはニューラルデザインの観点からどのように行われますか?オートエノクダー、RBMですか?

keras 

7
これは、トレーニング可能なルックアップテーブルです
gokul_uf

1
単純に重み行列を作成してインデックスを付けます。以下の詳細な回答を参照してください(stackoverflow.com/a/53101566/9024698)。
追放

3
最も投票された答えはそれが行列の乗算であることを示していますが、ソースコードと他の答えは、実際にはそれらがトレーニング可能な行列であることを示しています。入力ワードは、このマトリックスのそれぞれの行を選択するだけです。
DanielMöller18年

回答:


66

私の知る限り、埋め込みレイヤーは、単語を対応する単語の埋め込みに変換する単純な行列乗算です。

埋め込みレイヤーの重みは、形状(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)

したがって、単純な行列乗算を使用して、サンプル内のすべての単語を対応する単語の埋め込みに変換します。


3
間違いなく有効なアプローチ(半教師付きシーケンス学習を参照)。また、オートエンコーダーを使用して埋め込みを学習し、それらを埋め込みレイヤーの初期化として使用して、ニューラルネットワークの複雑さを軽減することもできます(埋め込みレイヤーの後に別のことを行うことを想定しています)。
ロリット2016

3
ここに単語の埋め込みとその利点についての素晴らしいブログ記事があります。
sietschie

3
私が提示した場合、各トレーニング入力は単語のセットです(文の場合もあります)。各単語はワンホットベクトルとして表され、密なベクトルに埋め込まれます。このアプローチの欠点は、入力が一定の長さである必要があるため、すべての文が同じ数の単語を持つ必要があることです。別の方法としては、パラグラフベクトルがあります。これは、文、パラグラフ、またはドキュメントをベクトルに埋め込むことができます。
Lorrit 16

4
埋め込みレイヤーは、損失を最小限に抑えるために、その重みを最適化します。多分それは意味的類似性を考慮することになるでしょう、多分それはしません。あなたはニューラルネットワークでは決して知りません。埋め込みが特定の式(w2vなど)に従っていることを確認したい場合は、式を使用します。十分なデータがある場合は、Embeddingレイヤーを使用して、埋め込みをトレーニングすることができます。試してみて、結果が気に入ったかどうかを確認してください。
ロリット2017

2
私はuser36624に同意します(以下の回答)。そのNOT単純マトリックス乗算。
ダニエル・メーラー

21

Keras Embedding層は、任意の行列の乗算だけで、それを実行していません。

1. (vocabulary_size)x(embedding_dimension)次元の重み行列を作成します

2.この重み行列にインデックスを付けます


クラスが何をするのかを理解するためにソースコードを見ておくことは常に役に立ちます。この場合、Layerと呼ばれる基本レイヤーから継承するclass 埋め込みを見てみましょう。class

(1)- (vocabulary_size)x(embedding_dimension)ディメンションのウェイトマトリックスの作成:

これはbuildEmbeddingの機能で発生しています。

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)-このウェイトマトリックスのインデックス作成

これはcallEmbeddingの機能で発生しています。

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レイヤーの出力と同じです。



4

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

何それがないことは、既知の各整数をマッピングすることであるninputsトレーニング可能な特徴ベクトルにW[n]その次元のいわゆる組み込み長編です、。


ワンホットで表現されたベクトルのセットに行列を掛けると、積はルックアップになります。つまり、Embedding実際に行列の乗算です。
yannis

ケラスがこの乗算をどこでも実行しないことを除いて。「embeddings = a trainable matrix」を定義し、入力インデックスを使用してマトリックスから単語を収集します。
DanielMöller18年

したがって、この埋め込みでは、入力のワンホットバージョンを作成しないだけで多くのメモリを節約できます。
DanielMöller18年

1

簡単に言うと(機能の観点から)、これはワンホットエンコーダーであり、完全に接続されたレイヤーです。レイヤーの重みはトレーニング可能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.