Keras 문서는 이것이 실제로 무엇인지 명확하지 않습니다. 나는 이것을 사용하여 입력 기능 공간을 더 작은 공간으로 압축 할 수 있음을 이해합니다. 그러나 이것은 신경 디자인 관점에서 어떻게 이루어 집니까? autoenocder, RBM입니까?
Keras 문서는 이것이 실제로 무엇인지 명확하지 않습니다. 나는 이것을 사용하여 입력 기능 공간을 더 작은 공간으로 압축 할 수 있음을 이해합니다. 그러나 이것은 신경 디자인 관점에서 어떻게 이루어 집니까? autoenocder, RBM입니까?
답변:
내가 아는 한 Embedding 레이어는 단어를 해당 단어 임베딩으로 변환하는 간단한 행렬 곱셈입니다.
Embedding 레이어의 가중치는 모양 (vocabulary_size, embedding_dimension)입니다. 각 훈련 샘플의 입력은 특정 단어를 나타내는 정수입니다. 정수는 어휘 크기 범위에 있습니다. Embedding 레이어는 각 정수 i를 임베딩 가중치 행렬의 i 번째 줄로 변환합니다.
이를 행렬 곱셈으로 빠르게 수행하기 위해 입력 정수는 정수 목록이 아니라 원-핫 행렬로 저장됩니다. 따라서 입력 형태는 (nb_words, vocabulary_size)이며 한 줄에 0이 아닌 값이 하나씩 있습니다. 임베딩 가중치를 곱하면 다음과 같은 형태로 출력됩니다.
(nb_words, vocab_size) x (vocab_size, embedding_dim) = (nb_words, embedding_dim)
따라서 간단한 행렬 곱셈을 사용하면 샘플의 모든 단어를 해당 단어 임베딩으로 변환합니다.
Keras
Embedding
층은 매트릭스 승산 만이를 수행되지 않는다 :
1. (vocabulary_size) x (embedding_dimension) 차원 의 가중치 행렬을 만듭니다.
2.이 가중치 행렬 색인
클래스가하는 일을 이해하기 위해 소스 코드를 살펴 보는 것은 항상 유용합니다. 이 경우 Layer 라는 기본 레이어에서 상속 된 class
Embedding 을 살펴 보겠습니다 .class
(1)- (vocabulary_size) x (embedding_dimension) 차원 의 가중치 행렬 만들기 :
이것은 Embeddingbuild
기능 에서 발생합니다 .
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)-이 가중치 행렬 인덱싱
이것은 Embeddingcall
기능 에서 발생합니다 .
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 크기의 단어 인덱스 목록으로 인코딩합니다 (이것은 하나의 핫 인코딩이 아닙니다. 자세한 내용은이 예제를 참조하십시오. https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).
따라서 그게 다입니다. 행렬 곱셈이 없습니다.
반대로, 정확하게는 행렬 곱셈을 수행하기 때문에 회피 층에만 유용 하고, 따라서 그것은 몇몇 연산 리소스에 economizes.Keras
Embedding
그렇지 않으면 Keras
Dense 레이어 (입력 데이터를 인코딩 한 후)를 사용하여 ((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
레이어 는 실제로 행렬 곱셈입니다.