Programing/Python programming

tf.keras로 Embedding layer 뜯어보기, 구현해보기

sosal 2023. 3. 8. 11:33
반응형

Embedding layer가 어떻게 동작하는지 정확하게 알기 위해서,

가장 쉬운 예제를 통해 이해하려고 노력해봤습니다.

 

import tensorflow as tf
from tensorflow.keras.utils import plot_model

query_input = tf.keras.Input(shape=(5), dtype='int32')
token_embedding = tf.keras.layers.Embedding(input_dim=5, output_dim=10)
query_embeddings = token_embedding(query_input)
Model = tf.keras.models.Model(inputs = query_input, outputs=query_embeddings)

 

Model: "model_7"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_19 (InputLayer)       [(None, 5)]               0         
                                                                 
 embedding_9 (Embedding)     (None, 5, 10)             50        
                                                                 
=================================================================
Total params: 50
Trainable params: 50
Non-trainable params: 0
_________________________________________________________________

 

정말 간단하게 구현해봤습니다.

 

Input layer에서는 5개의 숫자를 입력받습니다.

(5개의 단어라고도 할 수 있겠죠)

 

각 하나의 단어 (숫자로 주어진) 는 10개의 embedded feature로 변환될 것입니다.

 

그럼, 주어진 Input과 embedding layer를 거친 Output이 어떻게 연산되는지만 확인하면,

우리는 embedding layer를 완벽하게 이해할 수 있습니다.

tmpInput = [ 0, 1, 1, 4, 4 ]
embedding_weights = Model.layers[1].get_weights()[0]

res = Model.predict(tmpInput)

tmpInput은 [0, 1, 1, 4, 4]로 주었고

embedding_weights 에는 위 모델에서 embedding feature를 뽑아내는 parameter들의 weight 값들이 들어있습니다.

 

embedding_weights는 참고로 input_dim=5, output_dim=10 이므로, 5*10의 shape를 가집니다.

 

 

 

tmpInput과 embedding_weights의 어떤 계산을 통해, res와 같은 값을 만들어낸다면

우리는 embedding layer의 완벽한 모방을 한 것이겠죠?

 

 

Embedding layer의 동작 방식

 

embeddings = [embedding_weights[i] for i in tmpInput]
embeddings = np.array(embeddings)

embeddings == res
array([[ True,  True,  True,  True,  True,  True,  True,  True,  True, True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True, True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True, True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True, True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True, True]])

그렇습니다, Embedding layer는 사실 weights가 있지만 이게 input 값과 곱해지는것이 아닌, 단순히 '몇번째 row의 value로 바꿀것이냐' 를 선택하는 것이었습니다.

 

** Embedding layer에 대하여

Input은 오직 정수형태인 정수인코딩이 되어있어야 한다.

Input 정수는 embedding layer의 input dimension K 사이값이여야한다. (0, K-1)

Embedding layer의 output은, 각 정수를 몇개의 feature로 바꿀것이냐를 뜻한다.

Embedding layer의 weights는 곱하거나 더하는것이 아닌, Input 정수로 선택되는 것이다.