Keras에서 임베딩이란 무엇입니까?


97

Keras 문서는 이것이 실제로 무엇인지 명확하지 않습니다. 나는 이것을 사용하여 입력 기능 공간을 더 작은 공간으로 압축 할 수 있음을 이해합니다. 그러나 이것은 신경 디자인 관점에서 어떻게 이루어 집니까? autoenocder, RBM입니까?

keras 

7
그것은 훈련을 할 수있는 조회 테이블의
gokul_uf

1
단순히 가중치 행렬을 만들고 색인을 생성합니다. 아래의 자세한 답변을 참조하십시오 ( stackoverflow.com/a/53101566/9024698 ).
Outcast

3
가장 많이 득표 한 답변은 행렬 곱셈이라고 말하지만 소스 코드와 기타 답변은 실제로 학습 가능한 행렬이라는 것을 보여줍니다. 입력 단어는이 행렬의 각 행을 선택합니다.
Daniel Möller

답변:


67

내가 아는 한 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)

따라서 간단한 행렬 곱셈을 사용하면 샘플의 모든 단어를 해당 단어 임베딩으로 변환합니다.


3
확실히 유효한 접근 방식입니다 ( 반 감독 시퀀스 학습 참조 ). 또한 오토 인코더로 임베딩을 학습 한 다음이를 임베딩 레이어의 초기화로 사용하여 신경망의 복잡성을 줄일 수 있습니다 (임베딩 레이어 이후에 다른 작업을 수행한다고 가정합니다).
Lorrit

3
다음 은 단어 임베딩과 그 장점에 대한 멋진 블로그 게시물입니다.
sietschie

3
내가 제시 한 경우 각 학습 입력은 단어 집합 (문장 일 수 있음)입니다. 각 단어는 원-핫 벡터로 표현되고 고밀도 벡터에 포함됩니다. 이 접근 방식의 단점은 입력 길이가 일정해야하므로 모든 문장에 동일한 수의 단어가 있어야한다는 것입니다. 대안은 문장, 단락 또는 문서를 벡터에 삽입 할 수 있는 단락 벡터입니다.
Lorrit

4
Embedding 레이어는 손실을 최소화하기 위해 가중치를 최적화합니다. 의미 론적 유사성을 고려할 것이라는 의미 일 수도 있고 그렇지 않을 수도 있습니다. 신경망에 대해서는 알 수 없습니다. 임베딩이 특정 공식 (예 : w2v)을 따르는 지 확인하려면 공식을 사용하십시오. 데이터가 충분한 경우 Embedding 레이어를 사용하고 임베딩을 훈련 할 수 있습니다. 시도하고 결과가 마음에 드는지 확인하십시오.
Lorrit 2017-07-08

2
user36624 (아래 답변)에 동의합니다. 단순한 행렬 곱셈 이 아닙니다 .
Daniel Möller

21

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양수 목록되어야한다.

이 목록은 예를 들어 텍스트 / 단어 입력을 Kerasone_hot 함수에 전달하여 검색 할 수 있습니다.이 함수는 텍스트를 n 크기의 단어 인덱스 목록으로 인코딩합니다 (이것은 하나의 핫 인코딩이 아닙니다. 자세한 내용은이 예제를 참조하십시오. https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/ ).


따라서 그게 다입니다. 행렬 곱셈이 없습니다.

반대로, 정확하게는 행렬 곱셈을 수행하기 때문에 회피 층에만 유용 하고, 따라서 그것은 몇몇 연산 리소스에 economizes.Keras Embedding

그렇지 않으면 Keras Dense 레이어 (입력 데이터를 인코딩 한 후)를 사용하여 ((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

keras가이 곱셈을 수행하지 않는 것을 제외하고는. "임베딩 = 학습 가능한 행렬"을 정의하고 입력 인덱스를 사용하여 행렬에서 단어를 수집합니다.
Daniel Möller

따라서이 임베딩은 단순히 입력의 원-핫 버전을 생성하지 않음으로써 많은 메모리를 절약합니다.
Daniel Möller

1

간단히 말해서 (기능적 관점에서) 원-핫 인코더완전 연결 계층 입니다. 레이어 가중치는 학습 가능합니다.

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