Keras「埋め込み」レイヤーはどのように機能しますか?


70

Kerasライブラリの「埋め込み」レイヤーの動作を理解する必要があります。Pythonで次のコードを実行します

import numpy as np
from keras.models import Sequential
from keras.layers import Embedding

model = Sequential()
model.add(Embedding(5, 2, input_length=5))

input_array = np.random.randint(5, size=(1, 5))

model.compile('rmsprop', 'mse')
output_array = model.predict(input_array)

次の出力が得られます

input_array = [[4 1 3 3 3]]
output_array = 
[[[ 0.03126476  0.00527241]
  [-0.02369716 -0.02856163]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]
  [ 0.0055749   0.01492429]]]

input_arrayの各値はoutput_arrayの2要素ベクトルにマップされるため、1 X 4ベクトルは1 X 4 X 2ベクトルを与えることを理解しています。しかし、マッピングされた値はどのように計算されますか?


1
良いスタートかもしれません:github.com/fchollet/keras/issues/3110
FNL

このブログでは、Keras
embedding

回答:


87

実際、出力ベクトルは、数学演算を使用して入力から計算されません。代わりに、すべての可能なベクトルを含むテーブルにアクセスするためのインデックスとして、各入力整数が使用されます。これが、最初の引数として語彙のサイズを指定する必要がある理由です(したがって、テーブルを初期化できます)。

このレイヤーの最も一般的なアプリケーションは、テキスト処理です。簡単な例を見てみましょう。トレーニングセットは、2つのフレーズのみで構成されています。

早く会いましょう

またお会いできてうれしいです

したがって、各単語に一意の整数番号を割り当てることで、これらのフレーズをエンコードできます(たとえば、トレーニングデータセットの出現順)。次に、フレーズを次のように書き換えます。

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

ここで、最初の層が埋め込み層であるネットワークをトレーニングしたいと考えてください。この場合、次のように初期化する必要があります。

Embedding(7, 2, input_length=5)

最初の引数(7)は、トレーニングセット内の個別の単語の数です。2番目の引数(2)は、埋め込みベクトルのサイズを示します。input_lengthの argumetは、当然のことながら、各入力配列のサイズを決定します。

ネットワークがトレーニングされると、埋め込み層の重みを取得できます。この場合、サイズは(7、2)で、整数を埋め込みベクトルにマッピングするために使用されるテーブルと考えることができます。

+------------+------------+
|   index    |  Embedding |
+------------+------------+
|     0      | [1.2, 3.1] |
|     1      | [0.1, 4.2] |
|     2      | [1.0, 3.1] |
|     3      | [0.3, 2.1] |
|     4      | [2.2, 1.4] |
|     5      | [0.7, 1.7] |
|     6      | [4.1, 2.0] |
+------------+------------+

したがって、これらの埋め込みによると、2番目のトレーニングフレーズは次のように表されます。

[[0.7, 1.7], [0.1, 4.2], [1.0, 3.1], [0.3, 2.1], [4.1, 2.0]]

最初は直感に反するように思えるかもしれませんが、基礎となる自動微分エンジン(TensorflowやTheanoなど)は、モデルの他のパラメーターと同様に、各入力整数に関連付けられたこれらのベクトルを最適化します。異なるドメインの他のメソッド/人が学習した埋め込みを使用することも興味深いです(https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.htmlを参照) [1]で行います。

[1]López-Sánchez、D.、Herrero、JR、Arrieta、AG、&Corchado、JM適応可能なクリックベイト検出のためのメトリック学習とケースベースの推論のハイブリッド化。応用知能、1-16。


4
答えてくれてありがとう。埋め込みレイヤーの重みがどのように取得されるかというクエリが1つあります。インデックス0と同様に、[1.2、3.1]はどのように取得されますか。
プラシャンス

5
インデックスを埋め込みベクトル(つまり、埋め込みレイヤーの重み)に関連付けるテーブルの内容は、ランダムに初期化され、その後、トレーニングアルゴリズム(勾配勾配など)によって最適化されます。
ダニエルロペス

3
ありがとう。オプティマイザが何に対してオプティマイザを使用するのか、まだ少しわかりません。たとえば、損失関数を計算できる「正解」とは何ですか?または、別の言い方をすると、フォワードパスとバックワードパスで何をしているのでしょうか?
bwest87

2
そう...埋め込みは、基本的に少ない入力にダウン任意のワンホットエンコードされた入力を減少させる全体的なアーキテクチャのちょうどサブネットワークである、afaict ..
マイク・キャンベル

1
埋め込みレイヤーはトレーニング可能であるため、トレーニングセットで欠落している値に対してどの程度敏感ですか?たとえば、トレーニングセットに10個、テストセットに5個の単語があります-ボキャブラリーの長さは15 ...ですが、トレーニング中にこれらの5つの「テスト」単語によってレイヤーが実際にアクティブになることはありません。この状況を説明してください。
ミカライ

6

私も同じ質問をして、いくつかの投稿と資料を読んだ後、埋め込み層の役割が何であるかを理解したと思います。

この投稿も理解に役立つと思いますが、ダニエルの答えは消化するのに便利だと思います。しかし、私はまた、主に埋め込み単語を理解することによって、その背後にあるアイデアを得ました。

レイヤーを埋め込むことでワンホットエンコーディング入力を減らして入力を減らすと言うのは不正確だと思います。結局、ワンホットベクトルは1次元のデータであり、実際にはこの例では2次元に変換されます。と言われる方が良い

埋め込み層は、別の次元の入力の関係を考え出します

2次元またはそれ以上です。

また、単語の埋め込みと主成分分析の間に非常に興味深い類似点があります。名前は複雑に見えるかもしれませんが、概念は簡単です。PCAが行うことは、いくつかの一般的な規則(いわゆる主成分)に基づいてデータのセットを定義することです。したがって、データを持っているようなもので、2つのコンポーネントのみを使用してそれを記述したいのです。この意味で、これは単語の埋め込みに非常に似ています。両方とも、異なるコンテキストで同じような仕事をします。詳細はこちらをご覧ください。PCAを理解することで、類似性を通してレイヤーの埋め込みを理解するのに役立つと思います。

最後に、「値をどのように計算するのか?」という投稿の元の質問に対する答えは次のようになります。

  • 基本的に、ニューラルネットワークは入力の基本構造(私たちの文)をキャプチャし、最適化によって語彙の単語間の関係をより高い次元(たとえば2)に配置します。
  • 理解が深まると、語彙の影響から別の単語とともに出現する各単語の頻度がわかります(非常に単純なアプローチでは、手動で計算できます)
  • 前述の頻度は、NNがキャプチャできる多くの基本構造の1つである可能性があります
  • 埋め込みの単語を説明するYouTubeリンクで直感を見つけることができます。

7
ビューのいいポイント。ただし、word2vecなどの単語埋め込み手法は、結果として生じる埋め込みの単語の完全な意味をキャプチャしようとしますが、監視されたネットワークの埋め込み層は、そのような意味的に豊かで一般的な表現を学習しない可能性があることに注意する価値があると思います。たとえば、ネットワークがセンチメント分類を行うようにトレーニングされている場合、おそらく「感情的な」負荷に従って埋め込みの単語をグループ化またはクラスタ化します。それにもかかわらず、私の経験に基づいて、大きなコーパスでword2vecによって学習された重みで埋め込みレイヤーを初期化することがしばしば役立ちます。
ダニエルロペス

2
ワンホットベクトルは1次元データではありません。その次元は語彙のサイズです。
ビヌジャシム

2
@BinuJasimあなたは正しい。ワンホットベクトル語彙を表す一次元データではありません。しかし、それが表す情報は確かに1次元であり、語彙内のすべてのエンティティは1次元データです。確かに、n * w(n =語彙サイズ、w =ビット数)要素がありますが、各バイナリ値は1次元の入力であるベクトルを表します。
ノビンShahroudi

@NovinShahroudi Brilliant、説明ありがとう。
ベニヤミンジャファリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.