본문 바로가기

AI

# 24.10.10_CBOW 임베딩 실습 + Skip-gram 임베딩

728x90

CBOW 임베딩

  • CBOW 모델은 활성화 함수를 사용하지 않는 간단한 구성의 신경망 모델이다.
  • 다중 분류 작업으로, 단어 텍스트를 스캔하여 단어의 문맥 윈도우를 만든 후, 문맥 윈도우에서 중앙의 단어를 제거하고, 문맥 윈도우를 사용해 누락된 단어를 예측한다. 이를 통해서 단어의 의미를 벡터 공간에 효율적으로 표현할 수 있게 된다.

CBOW 모델의 특징

  • 단순한 신경망 모델: CBOW 모델은 입력층과 출력층 사이에 하나의 은닉층만을 가지고 있으며, 활성화 함수 없이 선형 계산을 통해 단어 임베딩을 학습. 이는 매우 간단한 구조의 신경망으로 볼 수 있다.
  • 다중 분류 문제로 구성: CBOW 모델은 주변 단어들을 입력으로 받아, 중심 단어를 예측하는 다중 분류 작업을 수행. 예를 들어, 문장 "The quick brown fox"가 주어졌을 때, "quick"과 "brown"이 주변 단어라면, "fox"를 예측하는 방식
  • 문맥 윈도우 사용: CBOW 모델은 주어진 텍스트를 스캔하여 문맥 윈도우(예: 2개의 왼쪽 단어, 2개의 오른쪽 단어)로 단어의 문맥을 구성. 이 윈도우에서 중심 단어를 제거하고, 남은 문맥 단어들을 기반으로 중심 단어를 예측
  • 누락된 단어 예측: CBOW 모델의 주된 역할은 문맥에서 누락된 단어를 예측하는 것이다. 예를 들어, "The quick ___ fox"에서, "___"에 들어갈 단어가 "brown"임을 예측한다.

CBOW 모델 구현

  1. 입력 데이터의 벡터화:
  • 텍스트 데이터를 정수형 ID로 변환하고, 단어 ID를 임베딩 벡터로 변환하여 신경망의 입력으로 사용
  • 이 과정에서 nn.Embedding 레이어가 자주 사용되며, nn.Embedding은 주어진 토큰의 정수 ID를 해당 임베딩 벡터로 매핑해주는 역할을 한다.
  1. CBOW 모델의 학습:
  • 모델은 주변 단어를 입력으로 받아 중심 단어를 예측한다.
  • 중심 단어의 정답 레이블을 기반으로 손실(Loss)을 계산하고, 옵티마이저를 사용하여 손실을 최소화하는 방향으로 모델을 학습 시킨다.
  • 옵티마이저는 모델 가중치뿐만 아니라 nn.Embedding 레이어의 임베딩 벡터도 업데이트하여, 학습이 진행될수록 단어 벡터들이 의미적으로 정렬되도록 한다.
  1. 모델의 평가 및 추론:
  • 학습이 완료된 모델은 새로운 문맥을 입력으로 받아 중심 단어를 예측한다.
  • 모델의 성능은 정확도, 손실 등을 기준으로 평가할 수 있으며, 학습된 임베딩 벡터를 시각화하여 단어 간의 유사성을 분석할 수도 있다.

실습

  • 실습에서는 PyTorch를 사용하여 CBOW 모델을 구현하고, 모델을 학습 및 평가하는 과정을 진행했다.
1. 임베딩 행렬 구현 (nn.Embedding 사용)
  • nn.Embedding은 정수형 토큰 ID를 해당 임베딩 벡터로 매핑해주는 역할을 한다.
  • 예를 들어, 단어 "fox"의 정수 ID가 7이라면, nn.Embedding은 이 ID를 길이 50의 벡터로 변환하여 신경망의 입력으로 사용할 수 있는 것이다.
  • 이 과정에서 임베딩 벡터는 초기에는 무작위 값으로 설정되지만, 학습이 진행됨에 따라 손실을 최소화하는 방향으로 업데이트 되어진다.
2. 옵티마이저를 통한 모델 학습
  • 옵티마이저는 손실을 최소화하기 위해 모델의 가중치와 임베딩 벡터를 업데이트한다.
  • 일반적으로 SGD, Adam 등의 옵티마이저가 사용되며, 학습률, 모멘텀 등의 하이퍼파라미터를 조정하여 모델의 학습 속도와 성능을 최적화할 수 있다.
3. 프랑켄슈타인 (Frankenstein) 데이터셋 사용
  • 실습에서는 문학작품 **프랑켄슈타인(Frankenstein)**을 데이터셋으로 사용하여, 단어 임베딩을 학습한다.
  • 작품 내 단어들을 분석하고, 단어 간의 의미적 관계를 학습하는 데 사용되어진다.
4. 토큰에서 벡터의 미니배치를 만드는 벡터화 파이프라인
  • 대규모 텍스트 데이터를 처리할 때는, 데이터를 배치(batch) 단위로 나누어 학습하는 것이 일반적이다.
  • 이를 위해 미니배치 형태로 벡터화하여 입력 데이터셋을 구성하고, 학습 과정에서 효율적으로 데이터를 공급한다.
5. CBOW 분류모델 및 Embedding 층 사용
  • CBOW 모델은 nn.Embedding 층을 통해 입력 데이터를 벡터화하고, 이 벡터를 입력으로 받아 중심 단어를 예측하는 분류 모델을 구성하며
  • 출력층은 소프트맥스(Softmax) 함수를 사용하여 중심 단어의 확률 분포를 계산한다.
6. 모델 학습 후 모델 평가 및 추론
  • 학습이 완료된 모델은 새로운 문맥을 입력으로 받아 중심 단어를 예측하고, 이를 통해 모델의 성능을 평가한다.
  • 또한, 학습된 임베딩 벡터를 시각화하여 단어 간의 유사성을 확인하고, 임베딩 벡터의 의미적 관계를 분석할 수 있다.

Skip-gram 임베딩

  • 하나를 가지고 여러개를 분류
  • CBOW 와 반대의 개념?!?!
  • 입력하고자 하는 문자열
    • Duct tape works anywhere. Duct tape is magic and should be worshiped.
    • (덕트 테이프는 어디서나 작동합니다. 덕트 테이프는 마법이며 숭배해야 합니다.)
  • 핵심부분만 보기 위하여 사전처리를 직접 정리해 둠
    • 모든 단어의 소문자화: duct tape works anywhere. duct tape is magic and should be worshiped.
    • 의미없는 조동사, be동사, 접속사, 마침표 등을 제거하고 동사는 원형으로 변형: duct tape work anywhere duct tape magic worship
    • 같은 단어 제거: duct tape work anywhere magic worship
    • 최종 결과: ["duct", "tape", "work", "anywhere", "magic", "worship"]
  • 코드에서 하려고 하는 작업
    • "tape"가 주어지면 앞뒤로 어떤 단어가 나올 것인지 추론

오늘 학습한 내용의 파일이 담긴 깃허브 주소

 

Machine-Learning-Frameworks-/pytorch/2024_10_10_word_embedding.ipynb at main · Astero0803/Machine-Learning-Frameworks-

Contribute to Astero0803/Machine-Learning-Frameworks- development by creating an account on GitHub.

github.com

 

  • 임베딩 행렬을 캡슐화하는 파이토치 모듈인 nn.Embedding 층을 사용하여 토큰의 정수 ID를 신경망 계산에 사용되는 벡터로 매핑
  • 옵티마이저는 모델 가중치를 업데이트할 때, 이 벡터값도 업데이트하여 손실을 최소화
  • 메리 셸리(Mary Shelley)의 프랑켄슈타인(Frankenstein) 데이터셋 사용
  • 토큰에서 벡터의 미니배치를 만드는 벡터화 파이프라인 적용
  • CBOW 분류모델과 Embedding 층을 사용함
  • 모델 학습 후 모델 평가, 추론 및 모델 검사 수행

10.08일에 진행했었던 Word2Vec이용 사전 학습된 단어 임베딩에 이어서 CBOW 모델을 이용해서 진행해봄

2024_10_08_Word2Vec.ipynb

 

Machine-Learning-Frameworks-/pytorch/2024_10_08_Word2Vec.ipynb at main · Astero0803/Machine-Learning-Frameworks-

Contribute to Astero0803/Machine-Learning-Frameworks- development by creating an account on GitHub.

github.com

 

 

 

이슈

  • 코드에서 딥러닝 모델의 학습 및 검증 루프를 구현하는 단계에서 너무나도 오랜시간이 걸렸었다.
  • 해당 과정에서는 모델을 훈련시키고 에폭(epoch)마다 손실(loss)와 정확도(accuracy)를 계산하고, 조기 종료 및 학습률 조정을 위한 로직을 작성한 부분인데
  • 다중 클래스 분류 문제를 위해 CrossEntropyLoss를 사용하고, Adam 옵티마이저를 사용하여 모델의 가중치를 업데이트 했으며, ReduceLROnPlateau를 사용하여 검증 손실(val_loss)이 개선되지 않을 경우 학습률을 감소 시켰다.
  • tqdm 라이브러리를 이용해서 훈련과 검증의 진행 상태를 시각적으로 표현한 것이였는데, 위에 사진에서 보듯 시간이 매우 오래걸린것을 알 수 있다.
  • 해당 코드는 구글 코랩 T4-GPU를 사용해서 실행한 것인데도 너무나도 많은 시간이 걸린것을 보아 CPU를 사용해서 했으면 엄청나게 오랜 시간이 걸렸을 것 같다(실제로 cpu를 사용해서 진행한 동료는 5개 train을 보는데 3분51초의 시간이 걸림)
  • 이를 통해서 ml은 혼자 개인 컴퓨터로 진행하는 것이 얼마나 어려운 일인지 다시한번 복기할 수 있던 시간이였다.

 

https://github.com/Python-Backend-Team3/Team-TIL/blob/main/10.1%20~%2010.15%20%ED%9A%8C%EA%B3%A0/2024-10-10%20-%20%EC%A7%80%EC%9B%85.md

 

Team-TIL/10.1 ~ 10.15 회고/2024-10-10 - 지웅.md at main · Python-Backend-Team3/Team-TIL

Today Learned repository. Contribute to Python-Backend-Team3/Team-TIL development by creating an account on GitHub.

github.com

- 오늘의 공부 회고

728x90