Keras 'Embedding'레이어는 어떻게 작동합니까?


70

Keras 라이브러리에서 'Embedding'레이어의 작동을 이해해야합니다. 파이썬에서 다음 코드를 실행합니다.

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
Фаиль Гафаров

답변:


87

실제로, 출력 벡터는 수학 연산을 사용하여 입력으로부터 계산되지 않습니다. 대신, 각 입력 정수는 모든 가능한 벡터를 포함하는 테이블에 액세스하기위한 인덱스로 사용됩니다. 그렇기 때문에 어휘의 크기를 첫 번째 인수로 지정해야합니다 (테이블을 초기화 할 수 있음).

이 레이어의 가장 일반적인 응용 프로그램은 텍스트 처리입니다. 간단한 예를 보자. 우리의 훈련 세트는 두 가지 문구로 구성됩니다.

곧 Hope기를 바랍니다

다시 만나서 반갑다

따라서 각 단어에 고유 한 정수를 할당하여 이러한 문구를 인코딩 할 수 있습니다 (예 : 훈련 데이터 세트의 모양 순서). 그런 다음 문구를 다음과 같이 다시 작성할 수 있습니다.

[0, 1, 2, 3, 4]

[5, 1, 2, 3, 6]

이제 첫 번째 레이어가 포함 레이어 인 네트워크를 훈련시키고 싶다고 상상해보십시오. 이 경우 다음과 같이 초기화해야합니다.

Embedding(7, 2, input_length=5)

첫 번째 주장 (7)은 훈련 세트에서 구별되는 단어의 수입니다. 두 번째 인수 (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] |
+------------+------------+

이러한 임베딩에 따르면 두 번째 교육 문구는 다음과 같이 표현됩니다.

[[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 및 JM Corchado, 적응 형 클릭 베이트 탐지를위한 메트릭 학습 및 사례 기반 추론. 응용 지능, 1-16.


4
답변 감사합니다. 임베딩 레이어의 가중치를 어떻게 얻었는지 한 번만 쿼리하십시오. 인덱스 0과 마찬가지로 [1.2, 3.1]은 어떻게 구할 수 있습니까?
prashanth

5
인덱스를 임베딩 벡터 (즉, 임베딩 레이어의 가중치)와 관련시키는 테이블의 내용은 무작위로 초기화 된 후 훈련 알고리즘 (예를 들어, 그라디언트 디센트)에 의해 최적화된다.
Daniel López

3
감사. 나는 아직도 옵티마이 저가 옵티 마이저에 대해 무엇을 확신하지 못하는가? 마찬가지로 손실 함수를 계산할 수있는 "정답"은 무엇입니까? 또는 다른 방법으로, 앞뒤 패스를 위해 무엇을하고 있습니까?
bwest87

2
그래서 ... 임베디드는 기본적으로 전체 아키텍처의 서브 네트워크 일 뿐이며, 핫 인코딩 된 입력을 더 적은 수의 입력으로 줄입니다.
Mike Campbell

1
포함 레이어는 학습 가능하므로 교육 세트에서 누락 된 값에 얼마나 민감합니까? 예를 들어, 훈련 세트에는 10 개의 단어가 있고 테스트 세트에는 5 개의 단어가 더 있습니다. 어휘 길이는 15 개입니다. 그러나 실제로는 훈련 중에이 5 개의 '테스트'단어에 의해 레이어가 활성화되지 않습니다. 이 상황을 설명해 주시겠습니까?
mikalai

6

나는 또한 같은 질문을했고 몇 가지 게시물과 자료를 읽은 후 포함 레이어 역할이 무엇인지 알아 냈습니다.

나는 게시물이 이해하는 데 도움이된다고 생각 하지만, Daniel의 대답은 소화하기에 편리하다는 것을 알았습니다. 그러나 나는 또한 임베디드 단어 를 이해함으로써 그 배경에 대한 아이디어를 얻었습니다 .

임베드 레이어를 사용하면 원핫 인코딩 입력을 더 적은 입력으로 줄이는 것이 부정확하다고 생각합니다. 모든 one-hot 벡터는 1 차원 데이터이며 실제로는 2 차원으로 바뀝니다. 그 말을하는 것이 좋습니다

임베딩 레이어는 다른 차원의 입력 관계를 나타냅니다.

2 차원 이상이든 상관 없습니다.

또한 주성분 분석에 단어를 삽입하는 것 사이에 매우 흥미로운 유사성이 있습니다. 이름이 복잡해 보이지만 개념은 간단합니다. PCA가하는 일은 몇 가지 일반적인 규칙 (소위 기본 구성 요소)을 기반으로 데이터 세트를 정의하는 것입니다. 따라서 데이터를 갖는 것과 같으며 설명하지만 2 개의 구성 요소 만 사용하려고합니다. 이런 의미에서 단어 삽입과 매우 유사합니다. 그들은 서로 다른 맥락에서 같은 일을한다. 자세한 내용은 여기 를 참조 하십시오 . PCA를 이해하면 유추를 통해 포함 레이어를 이해하는 데 도움이되기를 바랍니다.

결론적으로, 게시물의 원래 질문에 대한 대답은 " 어떻게 값을 계산합니까? "입니다.

  • 기본적으로, 우리의 신경망은 입력 (우리의 문장)의 기본 구조를 포착하고 어휘의 단어들 사이의 관계를 최적화에 의해 더 높은 차원 (2라고합시다)으로 만듭니다.
  • 더 깊은 이해는 어휘 영향에서 다른 단어와 함께 나타나는 각 단어의 빈도를 말합니다 (매우 순진한 접근 방식으로 손으로 계산할 수 있음)
  • 앞서 언급 한 빈도는 NN이 포착 할 수있는 많은 기본 구조 중 하나 일 수 있습니다.
  • 당신은 삽입 단어를 설명하는 유튜브 링크 에서 직감을 찾을 수 있습니다

7
좋은 견해. 그러나 word2vec와 같은 단어 임베딩 기술이 결과 임베딩에서 단어의 전체 의미를 포착하려고 시도하지만 감독되는 네트워크의 임베딩 레이어는 의미가 풍부하고 일반적인 표현을 배우지 못할 수 있습니다. 예를 들어, 네트워크에서 정서 분류를 수행하도록 훈련 된 경우 "정서적"로드에 따라 포함에서 단어를 그룹화 / 클러스터 할 수 있습니다. 그럼에도 불구하고, 내 경험에 따르면, 큰 말뭉치에서 word2vec에 의해 배운 가중치로 포함 레이어를 초기화하는 것이 종종 유용합니다.
Daniel López

2
1- 핫 벡터는 1 차원 데이터가 아닙니다. 그 차원은 어휘의 크기입니다.
Binu Jasim이

2
@BinuJasim 당신이 맞아요. 하나의 핫 벡터 어휘 표현은 일차원 데이터 아니다. 그러나 그것이 나타내는 정보는 실제로 1 차원이며 어휘 내의 모든 실체는 1 차원 데이터입니다. n * w (n = 어휘 크기, w = 비트 수) 요소가 있지만 각 이진 값은 다시 1 차원 입력 인 벡터를 나타냅니다.
Novin Shahroudi

@NovinShahroudi Brilliant, 설명해 주셔서 감사합니다.
Benyamin Jafari
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.