ニューラルネットワークの埋め込み層とは何ですか?


92

多くのニューラルネットワークライブラリには、KerasLasagneのような「埋め込み層」があります。

ドキュメントを読んでも、その機能を理解しているかどうかはわかりません。たとえば、Kerasのドキュメントには次のように記載されています。

正の整数(インデックス)を固定サイズの密ベクトルに変換します。[[4]、[20]]-> [[0.25、0.1]、[0.6、-0.2]]

知識のある人がそれが何をするのか、いつそれを使うのかを説明できますか?


編集:ドキュメントの貼り付けに関して、ドキュメントから貼り付けることはあまりないので、私の質問です。私はそれがどのような変換を行うのか、なぜそれを使用すべきなのか理解していません。

とにかく、これはケラスで説明されている方法です:

埋め込み

keras.layers.embeddings.Embedding(input_dim、output_dim、init = 'uniform'、input_length = None、weights = None、W_regularizer = None、W_constraint = None、mask_zero = False)正の整数(インデックス)を固定サイズの密ベクトルに変換します、たとえば [[4]、[20]]-> [[0.25、0.1]、[0.6、-0.2]]

入力形状:形状を持つ2Dテンソル:(nb_samples、sequence_length)。出力形状:形状を持つ3Dテンソル:(nb_samples、sequence_length、output_dim)。引数:

input_dim:int> =0。語彙のサイズ。1+入力データで発生する最大整数インデックス。output_dim:int> =0。密な埋め込みの次元

そして、それはラザニアでそれがどのように説明されるかです:

単語を埋め込むためのレイヤー。入力は整数型のテンソル変数でなければなりません。

パラメーター:incoming:Layerインスタンスまたはタプル

このレイヤーに入力するレイヤー、または予想される入力形状。

input_size:int

さまざまな埋め込みの数。最後の埋め込みのインデックスはinput_size-1です。

output_size:int

各埋め込みのサイズ。

W:Theano共有変数、式、numpy配列または呼び出し可能

埋め込み行列の初期値、式または初期化子。これは、形状(input_size、output_size)の行列でなければなりません。詳細については、lasagne.utils.create_param()を参照してください。

>>> from lasagne.layers import EmbeddingLayer, InputLayer, get_output
>>> import theano
>>> x = T.imatrix()
>>> l_in = InputLayer((3, ))
>>> W = np.arange(3*5).reshape((3, 5)).astype('float32')
>>> l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)
>>> output = get_output(l1, x)
>>> f = theano.function([x], output)
>>> x_test = np.array([[0, 2], [1, 2]]).astype('int32')
>>> f(x_test) array([[[  0.,   1.,   2.,   3.,   4.],
                      [ 10.,  11.,  12.,  13.,  14.]],
                     [[  5.,   6.,   7.,   8.,   9.],
                      [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

1
質問を理解して回答するために必要なコンテキストを貼り付けてください。人々は他の場所に行き、あなたの質問に答えるためにドキュメントを読みたくないでしょう。
グング

1
私はあなたが尋ねた変更を行った
フランチェスコ

私も同じ疑問を抱いていて、それについて語る文書をいくつか見つけました。:ここではいくつかの興味深いものですcs.cmu.edu/afs/cs/academic/class/15782-f06/slides/... fromthebottomoftheheap.net/2011/01/21/...は、どうやらそれはinputed時系列に遅延を適用していることを考えます新しいベクトルとしての遅延。
-abutremutante

このビデオを見て:youtube.com/watch?v=bvZnphPgz74を。約30分後、彼は埋め込みについて話します。
ピーター

回答:


69

Word2Vecとの関係

==========================================

簡単な図のWord2Vec:

word2vec pic

より詳細な説明:

これは最近の自然言語処理におけるWord2Vecの革新に関連していると思います。大まかに言うと、Word2Vecは私たちの語彙が離散的であることを意味し、各単語を連続したベクトル空間に埋め込むマップを学習します。このベクトル空間表現を使用すると、語彙の連続した分散表現が可能になります。たとえば、データセットがn-gramで構成されている場合、連続ワード機能を使用して、n-gramの分散表現を作成できます。言語モデルのトレーニングの過程で、この単語埋め込みマップを学習します。希望は、連続表現を使用することにより、埋め込みが類似の単語を類似の地域にマッピングすることです。たとえば、画期的な論文である「言葉とフレーズの分散表現とその構成性」、セマンティックの観点から、特定のフレーズには非常に優れた最近傍フレーズがあることを表6および7で観察してください。この連続空間に変換することにより、類似性の連続メトリック概念を使用して、埋め込みのセマンティック品質を評価できます。

ラザニアコードを使用した説明

ラザニアのコードスニペットを分解しましょう。

x = T.imatrix()

xは整数の行列です。いいよ、大丈夫。ボキャブラリの各単語は、整数または1ホットスパースエンコーディングで表すことができます。したがって、xが2x2の場合、2つのデータポイントがあり、それぞれが2グラムです。

l_in = InputLayer((3, ))

入力レイヤー。3は、語彙のサイズを表します。単語があります。w0,w1,w2

W = np.arange(3*5).reshape((3, 5)).astype('float32')

これが単語埋め込み行列です。エントリ0〜14の3行5列のマトリックスです。

これまでのところ、次の解釈があります。ボキャブラリーには3つの単語があり、5次元のベクトル空間に単語を埋め込みます。たとえば、ある単語と別の単語と別の単語、たとえばホットスパースエンコーディングとして表すことがます。行列は、行列乗算を介してこれらの単語を埋め込んでいると見なすことができます。したがって、最初の単語同様に。 w0=(1,0,0)w1=(0,1,0)w2=(0,0,1)Ww0w0W=[0,1,2,3,4].w1w1W=[5,6,7,8,9]

使用しているワンホットスパースエンコーディングのため、テーブルルックアップとも呼ばれることに注意してください。

l1 = EmbeddingLayer(l_in, input_size=3, output_size=5, W=W)

埋め込み層

 output = get_output(l1, x)

埋め込み用のシンボリックテアノ式。

f = theano.function([x], output)

埋め込みを計算するTheano関数。

x_test = np.array([[0, 2], [1, 2]]).astype('int32')

ここで一時停止して、x_testの正確な意味を説明します。最初に、すべてのx_testエントリが{0、1、2}、つまりrange(3)にあることに注意してください。x_testには2つのデータポイントがあります。最初のデータポイント[0,2] 2グラム表す及び第二データポイントは、2グラム表す。(w0,w2)(w1,w2)

ここで、単語埋め込みレイヤーを使用して2グラムを埋め込みます。それを行う前に、埋め込み関数fによって何が返されるべきかを明確にしましょう。2グラムは[[ ]、[0、0、1]]行列と同等です。このスパース行列に埋め込み行列Wを適用すると、[[0、1、2、3、4]、[10、11、12、13、14]]が得られます。行列の乗算を機能させるには、2グラムのスパース行列表現に右乗算により単語埋め込み行列を適用する必要があります。(w0,w2)W

f(x_test) 

返却値:

          array([[[  0.,   1.,   2.,   3.,   4.],
                  [ 10.,  11.,  12.,  13.,  14.]],
                 [[  5.,   6.,   7.,   8.,   9.],
                  [ 10.,  11.,  12.,  13.,  14.]]], dtype=float32)

3が実際に語彙サイズを表していることを確信させるには、マトリックスを入力してみてくださいx_test = [[5, 0], [1, 2]]。マトリックスの不一致エラーが発生することがわかります。


2
この答えは良いです。私はこの質問の拡張機能を1つ持っています。埋め込み層はどのようにImdbセンチメントサンプル(または他のデータセット)をベクトルに変換しますか。これらは単語の集まりです。
直感

1

https://stackoverflow.com/questions/45649520/explain-with-example-how-embedding-layers-in-keras-works/私は、2つの文を使用した例を準備するためにkerasのtexts_to_sequencesを試してみました

'This is a text' --> [0 0 1 2 3 4]

埋め込みレイヤー。基づいてKeras「埋め込み」層はどのように機能するの?埋め込み層はまず埋め込みベクトルをランダムに初期化し、次にネットワークオプティマイザーを使用して、kerasの他のネットワーク層と同様に更新します。

[0 0 1 2 3 4] --> 
[-0.01494285, -0.007915  ,  0.01764857],
[-0.01494285, -0.007915  ,  0.01764857],
[-0.03019481, -0.02910612,  0.03518577],
[-0.0046863 ,  0.04763055, -0.02629668],
[ 0.02297204,  0.02146662,  0.03114786],
[ 0.01634104,  0.02296363, -0.02348827]

上記は、(最大)6単語の文と3のoutput_dimの初期埋め込みベクトルです。

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