인공지능/자연어 처리

자연어 처리 - CBOW으로 문장 표현하기

이게될까 2024. 1. 30. 00:07
728x90
728x90

token embedding

여긴 살짝 뭐라 하는지 모르겠네 GPT 도와줘!

"""
토큰 임베딩은 자연어 처리(NLP)에서 단어나 토큰을 컴퓨터가 이해할 수 있는 수치적 형태로 변환하는 방법입니다. 이 슬라이드는 토큰 임베딩을 어떻게 생성하는지 설명하고 있습니다. 여기서 설명하는 과정은 다음과 같습니다:

임베딩 테이블(W): 각 토큰에 대한 임베딩 벡터가 저장된 테이블로, 모델이 훈련 과정에서 학습합니다. 이 테이블은 일반적으로 d 차원의 벡터를 가지며, 각 토큰에 대해 하나의 벡터가 할당됩니다.

원-핫 인코딩(x̂): 특정 토큰을 나타내는 벡터로, 토큰의 인덱스 위치에만 1이 있고 나머지는 0으로 채워진 형태입니다.

테이블 룩업(Table Lookup): 원-핫 인코딩된 벡터를 사용하여 임베딩 테이블에서 해당 토큰의 임베딩 벡터를 검색합니다. 이는 원-핫 벡터(x̂)와 임베딩 테이블(W)의 곱셈으로 이루어지며, 실제로는 원-핫 벡터가 테이블에서 해당 인덱스의 벡터를 "선택"하는 것과 동일합니다.

예를 들어, x가 토큰의 인덱스라면, x̂는 x 위치에만 1이 있는 원-핫 인코딩 벡터가 됩니다. 이 벡터를 임베딩 테이블 W와 곱하면, x에 해당하는 임베딩 벡터 W[x]가 결과로 나옵니다.

이러한 과정을 통해 모델은 단어의 의미를 포함하는 밀집 벡터(dense vector)로 변환할 수 있으며, 이 벡터는 다양한 NLP 작업에 사용될 수 있습니다.
"""

그럼 임베딩 테이블이 뭔지 정확하게 물어봅니다.

"""
임베딩 테이블은 단어나 토큰을 고정된 크기의 벡터로 매핑하는 매트릭스입니다. 각 행은 고유한 단어나 토큰에 대응하는 벡터(임베딩)를 나타냅니다. 이 벡터는 해당 단어의 의미적 특성을 수치적으로 표현합니다.

토큰이 5개 있다면, 임베딩 테이블의 크기는 5개의 토큰 각각에 대해 하나의 임베딩 벡터를 가지게 됩니다. 그러나 임베딩 벡터의 차원은 토큰의 개수와 직접적인 관계가 없습니다. 예를 들어, 각 토큰을 100차원 벡터로 표현하고자 한다면 임베딩 테이블은 5x100 크기를 가지게 됩니다.

임베딩 테이블의 크기는 다음과 같이 정의됩니다:

행의 개수: 고유 토큰의 개수 (단어장의 크기)
열의 개수: 각 토큰의 임베딩 차원
임베딩 차원은 모델 설계자가 결정하며, 일반적으로 50, 100, 200, 300과 같은 크기를 가집니다. 이는 토큰의 의미적 정보를 충분히 포착하기 위해 선택된 차원의 수입니다.

따라서, 토큰이 5개 있고 각 토큰을 5차원 벡터로 표현하고 싶다면, 임베딩 테이블은 5x5 크기가 될 것입니다. 그러나 실제로는 토큰의 개수보다 훨씬 큰 차원을 사용하여 더 많은 정보를 포함시킬 수 있습니다.
"""

x = 자연어
class의 개수만큼 Logit가 나옴

토큰 임베딩

이건 한번 실습을 해봐야 알겠네여 ㅎㅎㅎ...

 

sentence encorder의 한 종류인 CBOW
CBOW

An arbitary sub-graph에선 많은 노드들이 있을 겁니다.

import tensorflow as tf
from tensorflow.keras.layers import Embedding, Dense, Lambda
from tensorflow.keras.models import Model
import tensorflow.keras.backend as K

# 가정: vocab_size는 어휘의 크기이고, embed_size는 임베딩 차원입니다.
vocab_size = 5000  # 어휘의 크기
embed_size = 300   # 단어를 임베딩할 벡터의 차원

# CBOW 모델 정의
class CBOW(Model):
    def __init__(self, vocab_size, embed_size):
        super(CBOW, self).__init__()
        self.embedding = Embedding(input_dim=vocab_size, output_dim=embed_size, input_length=context_window*2)
        self.lambda_ = Lambda(lambda x: K.mean(x, axis=1), output_shape=(embed_size,))
        self.dense = Dense(vocab_size, activation='softmax')
        
    def call(self, inputs):
        x = self.embedding(inputs)
        x = self.lambda_(x)
        x = self.dense(x)
        return x

# 모델 인스턴스 생성
cbow = CBOW(vocab_size, embed_size)

# 모델 컴파일
cbow.compile(loss='categorical_crossentropy', optimizer='adam')

# 요약 정보 출력
cbow.summary()

이 코드는 CBOW 모델을 구성하는 기본적인 부분을 설명합니다:

Embedding 층은 단어 인덱스를 해당하는 임베딩 벡터로 매핑합니다.
Lambda 층은 임베딩된 문맥 단어들의 평균을 계산하여 하나의 벡터로 만듭니다.
Dense 층은 softmax를 사용하여 어휘 사전의 각 단어가 중심 단어가 될 확률을 출력합니다.
모델을 컴파일할 때, 손실 함수로 categorical_crossentropy를 사용합니다. 이는 다중 클래스 분류 문제에 적합한 손실 함수입니다. 최적화기로는 일반적으로 adam을 사용합니다.

모델을 훈련시키기 전에는 적절한 데이터 전처리가 필요합니다. 여기에는 문맥 단어와 중심 단어를 추출하고, 문맥 단어들을 모델에 입력으로, 중심 단어를 예측 대상으로 설정하는 과정이 포함됩니다.

CBOW 모델은 주로 단어의 분산 표현을 학습하는 데 사용되며, 이렇게 학습된 단어 임베딩은 다른 자연어 처리 작업에 유용하게 사용됩니다.

728x90