Skip to content

Instantly share code, notes, and snippets.

@hongsw
Created March 27, 2025 09:28
Show Gist options
  • Save hongsw/061e58dd6ffa2d82a0a32ecacc88db7e to your computer and use it in GitHub Desktop.
Save hongsw/061e58dd6ffa2d82a0a32ecacc88db7e to your computer and use it in GitHub Desktop.

CBOW에서 Skip-gram으로 변환할 때 달라진 주요 부분을 전후 비교로 설명해드리겠습니다:

1. 입력과 타겟 교체

CBOW 코드:

# 2. 문맥 단어와 타겟 단어 설정
context_words = ["this", "is", "a", "comparison"]
target_word = "visual"  # 정답 단어
target_idx = vocab.index(target_word)

Skip-gram 코드:

# 2. Skip-gram에서는 중심 단어로 문맥 단어를 예측
center_word = "visual"  # 중심 단어
center_idx = vocab.index(center_word)
context_words = ["this", "is", "a", "comparison"]  # 예측할 문맥 단어들
context_idxs = torch.tensor([vocab.index(w) for w in context_words])

2. 가중치 구조 변경

CBOW 코드:

# 기본 가중치 텐서 (학습 과정에서 업데이트할 값)
weight_data = torch.randn(vocab_size, embedding_dim) * 0.1

Skip-gram 코드:

# 두 가지 가중치 텐서 (Skip-gram은 일반적으로 두 임베딩 행렬을 사용)
# W: 입력 단어 -> 임베딩 (중심 단어)
# W_out: 임베딩 -> 출력 단어 (문맥 단어)
W = torch.randn(vocab_size, embedding_dim) * 0.1
W_out = torch.randn(vocab_size, embedding_dim) * 0.1

3. 임베딩 추출 방식

CBOW 코드:

# 4. 문맥 벡터 평균 계산 - einops 사용
context_vectors = embeddings[context_idxs]
h = reduce(context_vectors, 'n d -> d', 'mean')

Skip-gram 코드:

# 4. 중심 단어 벡터 구하기
h = center_embeddings[center_idx]  # 중심 단어 임베딩

4. 손실 계산 방식

CBOW 코드:

# 7. 손실 계산 (Cross Entropy Loss)
loss = -torch.log(target_prob)

Skip-gram 코드:

# 7. 손실 계산 (모든 문맥 단어에 대한 Cross Entropy Loss의 평균)
# Skip-gram은 여러 문맥 단어에 대한 확률을 계산함
context_probs = probs[context_idxs]
log_context_probs = torch.log(context_probs)
loss = -torch.mean(log_context_probs)  # 평균 손실

5. 파라미터 업데이트

CBOW 코드:

# 9. 수동으로 파라미터 업데이트 (PyTorch 텐서 직접 업데이트)
with torch.no_grad():
    # 원본 weight_data 텐서 업데이트
    weight_data -= learning_rate * embeddings.grad

Skip-gram 코드:

# 9. 수동으로 파라미터 업데이트
with torch.no_grad():
    # 원본 가중치 텐서 업데이트
    W -= learning_rate * center_embeddings.grad
    W_out -= learning_rate * context_embeddings.grad

6. 평가 및 출력 방식

CBOW 코드:

predicted_word = vocab[torch.argmax(probs).item()]
print(f"예측된 단어: {predicted_word}")
print(f"타겟 단어 확률: {target_prob.item():.4f}")
print(f"정답 여부: {predicted_word == target_word}")

Skip-gram 코드:

# 가장 확률이 높은 문맥 단어들 출력
_, top_indices = torch.topk(probs, 4)
predicted_context = [vocab[idx.item()] for idx in top_indices]
print(f"예측된 문맥 단어들: {predicted_context}")
print(f"실제 문맥 단어들: {context_words}")

이러한 변경 사항들이 Skip-gram의 핵심 원리를 구현하는데 필요한 주요 수정 사항입니다.

https://colab.research.google.com/drive/1pDHSzmvWrK623nDr2yUBBY2oH97L0VAm?usp=sharing

@hongsw
Copy link
Author

hongsw commented Mar 27, 2025

CBOW와 Skip-gram 언어 모델의 완성도와 한계를 파악하기 위한 질문들...

데이터 관련 질문

  1. 데이터 충분성: "현재 훈련 코퍼스의 크기가 언어의 의미적, 구문적 관계를 충분히 학습하기에 적절한가요?"
  2. 데이터 다양성: "특정 도메인이나 장르에 편중된 코퍼스가 일반적인 언어 이해에 미치는 영향은 무엇인가요?"
  3. 다국어 데이터: "여러 언어를 동시에 학습할 때 언어 간 지식 전이는 어떻게 일어나나요?"
  4. 희소 단어 문제: "등장 빈도가 낮은 단어들의 임베딩 품질을 어떻게 보장할 수 있나요?"

모델 구조 관련 질문

  1. 임베딩 차원 최적화: "단어 임베딩 차원은 어떻게 결정되며, 언어적 뉘앙스를 포착하기에 300차원이 충분한가요?"
  2. 윈도우 크기 영향: "문맥 윈도우 크기(예: 5단어)가 단어 의미 파악에 미치는 영향은 무엇인가요?"
  3. 서브워드 토큰화: "단어 수준 대신 서브워드 토큰화를 적용했을 때의 이점과 단점은 무엇인가요?"
  4. 학습 파라미터: "네거티브 샘플링 수, 학습률, 다운샘플링 임계값이 임베딩 품질에 미치는 영향은 무엇인가요?"

언어적 특성 포착 관련 질문

  1. 문법적 관계: "CBOW와 Skip-gram이 포착하는 문법적 관계(시제, 복수형 등)의 정확도는 어떠한가요?"
  2. 의미적 유사성: "동음이의어나 다의어(bank, spring 등)의 문맥 의존적 의미를 어떻게 구분하나요?"
  3. 유추 능력: "king:man::queen:woman과 같은 유추 관계가 항상 선형적 벡터 연산으로 표현 가능한가요?"
  4. 구문 구조: "단어의 선형적 나열 이상의 복잡한 구문 구조를 CBOW/Skip-gram이 포착할 수 있나요?"

평가 관련 질문

  1. 내재적/외재적 평가: "단어 유사성 태스크와 실제 다운스트림 NLP 태스크에서의 성능 간 상관관계는 어떠한가요?"
  2. 문맥 특화 평가: "문맥에 따른 단어 의미 변화를 얼마나 정확히 포착하는지 평가할 수 있나요?"
  3. 다국어 평가: "서로 다른 언어 간 개념적 일치도를 어떻게 평가할 수 있나요?"
  4. 희소 단어 평가: "희소 단어의 임베딩 품질을 별도로 평가하는 방법은 무엇인가요?"

기술적 한계 파악

  1. 문맥 제한: "고정된 윈도우 크기로 인해 장거리 의존성을 포착하지 못하는 문제를 어떻게 해결할 수 있나요?"
  2. 정적 임베딩: "문맥에 따라 의미가 달라지는 단어의 정적 임베딩 한계를 어떻게 극복할 수 있나요?"
  3. 문장/문서 표현: "단어 수준을 넘어 문장이나 문서 수준의 의미를 어떻게 효과적으로 표현할 수 있나요?"
  4. 언어 진화: "신조어나 의미 변화를 반영하기 위해 임베딩을 지속적으로 업데이트하는 방법은 무엇인가요?"

근간 기술의 한계

  1. 분산 가설 한계: "단어의 의미가 그 분포적 맥락으로 완전히 정의된다는 가정의 한계는 무엇인가요?"
  2. 언어학적 기반: "형식 언어학, 인지 언어학 관점에서 CBOW/Skip-gram 모델의 이론적 한계는 무엇인가요?"
  3. 차원 축소 영향: "300차원으로 압축된 표현이 언어의 복잡성을 얼마나 손실하나요?"
  4. 언어 보편성: "언어마다 다른 문법 구조와 의미 체계를 동일한 모델 구조로 포착할 수 있나요?"

현대적 접근법과의 비교

  1. 컨텍스트화된 임베딩: "BERT, ELMo와 같은 컨텍스트화된 임베딩과 비교했을 때 CBOW/Skip-gram의 강점과 약점은 무엇인가요?"
  2. 자기지도학습: "마스킹, 다음 문장 예측 등의 자기지도학습 목표와 CBOW/Skip-gram의 목표 함수 간 이론적 차이는 무엇인가요?"
  3. 주의 메커니즘: "주의 메커니즘을 기반으로 한 모델과 비교했을 때, 고정 윈도우 기반 모델의 한계는 무엇인가요?"
  4. 효율성 트레이드오프: "계산 효율성과 표현력 사이의 트레이드오프 관점에서 CBOW/Skip-gram의 위치는 어디인가요?"

이러한 질문들을 통해 CBOW와 Skip-gram 언어 모델의 강점과 한계를 종합적으로 평가하고, 현대 언어 모델로의 발전 과정에서 이들의 역사적 위치와 기여를 파악할 수 있을 것입니다. 또한 향후 언어 모델 연구 방향을 가늠하는 데도 도움이 될 것입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment