tf.keras로 Embedding layer 뜯어보기, 구현해보기
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의 완벽한 모방을 한 것이겠죠?
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 정수로 선택되는 것이다.