research notes

케라스 임베딩 층(Keras embedding layer) 본문

자연어/Basic

케라스 임베딩 층(Keras embedding layer)

forest62590 2022. 4. 13. 22:47
728x90

*** 딥 러닝을 이용한 자연어 처리 입문 (위키북스) 내용 요약 ***

 

케라스는 임베딩 층의 입력이 원-핫 벡터가 아니어도 동작을 하는데 그 이유는 케라스는 단어를 정수 인덱스로 바꾸고 원-핫 벡터로 변환 후 임베딩 층의 입력으로 사용하는 것이 아니라, 단어를 정수 인코딩까지만 진행 후 임베딩 층의 입력으로 사용하기 때문이다.

 

임베딩 층은 입력 정수에 대해 밀집벡터(dense vector)로 맵핑하고 이 밀집 벡터는 인공 신경망의 학습 과정에서 가중치가 학습되는 것과 같은 방식으로 훈련되며, 이 밀집 벡터를 임베딩 벡터라고 부른다.

 

정수를 밀집벡터 또는 임베딩 벡터로 맵핑한다는 것은 특정 단어와 맵핑되는 정수를 인덱스로 가지는 테이블로부터 임베딩 벡터 값을 가져오는 룩업 테이블이라고 볼 수 있다. 그리고 이 테이블은 단어 집합의 크기만큼의 행을 가지므로 모든 단어는 고유한 임베딩 벡터를 가진다.

위의 그림은 단어 great이 정수 인코딩 된 후 테이블로부터 해당 인덱스에 위치한 임베딩 벡터를 꺼내오는 모습을 보여준다. 단어 great은 정수 인코딩 과정에서 1,918의 정수로 인코딩이 되었고 그에 따라 단어 집합의 크기만큼의 행을 가지는 테이블에서 인덱스 1,918번에 위치한 행을 단어 great의 임베딩 벡터로 사용한다. 이 임베딩 벡터는 모델의 입력이 되고 역전파 과정에서 단어 great의 임베딩 벡터값이 학습된다.

*** Keras Embedding layer hyperparameters ***

from tensorflow.keras.layers import Embedding

model = Sequential()
model.add(Embedding(16, 4))

- Embedding() 함수는 최소 2개의 매개변수를(입력과 출력의 크기) 필요로 한다.

- Embedding(16, 4)가 의미하는 바는 입력될 총 단어 수는 16, 임베딩 후 출력되는 크기는 4로 하겠다는 뜻이다.

- 여기에 단어를 매번 얼마나 입력할지를 추가로 지정할 수 있으며, Embedding(16, 4, input_length=2)는 총 입력되는 단어 수는 16개이나 매번 2개씩만 넣겠다는 뜻이 된다.

→ 총 몇개의 단어 집합에서(입력), 몇 개의 임베딩 결과를 사용할 것인지(출력), 그리고 매번 입력될 단어의 수는 몇 개로 할지(단어수)를 정해야 한다.

import numpy
import tensorflow as tf
from numpy import array
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
 
# 텍스트 리뷰 자료를 지정합니다.
docs = ["너무 재밌네요","최고예요","참 잘 만든 영화예요","추천하고 싶은 영화입니다","한번 더 보고싶네요","글쎄요","별로예요","생각보다 지루하네요","연기가 어색해요","재미없어요"]

# 긍정 리뷰는 1, 부정 리뷰는 0으로 클래스를 지정합니다.
classes = array([1, 1, 1, 1, 1, 0, 0, 0, 0, 0])

# 토큰화 
token = Tokenizer()
token.fit_on_texts(docs)
print(token.word_index)
x = token.texts_to_sequences(docs)
print("\n리뷰 텍스트, 토큰화 결과:\n",  x)

# 패딩, 서로 다른 길이의 데이터를 4로 맞추어 줍니다.
padded_x = pad_sequences(x, 4)  
print("\n패딩 결과:\n", padded_x)

#임베딩에 입력될 단어의 수를 지정합니다.
word_size = len(token.word_index) +1
 
#단어 임베딩을 포함하여 딥러닝 모델을 만들고 결과를 출력합니다.
model = Sequential()
model.add(Embedding(word_size, 8, input_length=4))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(padded_x, classes, epochs=20)
print("\n Accuracy: %.4f" % (model.evaluate(padded_x, classes)[1]))

References:

[1] 딥 러닝을 이용한 자연어 처리 입문, 위키북스, https://wikidocs.net/33793

[2] 모두의 딥러닝, 조태호, 길벗

728x90

'자연어 > Basic' 카테고리의 다른 글

NLP를 위한 합성곱 신경망(Convolution Neural Network)  (0) 2022.04.12
순환 신경망 (RNN)  (0) 2022.02.14
Comments