밑바닥 DL

[밑바닥 DL] 4.word2vec와 추론 기반 기법 (feat.CBOW와 Skip-gram 모델로 단어 학습)

독립성이 강한 ISFP 2024. 5. 1. 22:43
728x90
반응형


단어의 의미를 이해하고 처리하는 방법으로는 세 가지가 있다고 앞에서 설명했습니다.

  • 1. 시소러스를 활용한 기법
  • 2. 통계 기반 기법
 

시소러스와 통계 기반 기법(feat.동시 발생행렬, 코사인 유사도)

자연어 처리란? 자연어 처리(Natural Language Processing, NLP)는 인간의 언어를 컴퓨터가 처리하도록 하는 인공지능의 한 분야입니다. NLP의 목표는 인간의 언어를 이해하고 생성할 수 있는 시스템을 개

resultofeffort.tistory.com

 

 

PPMI의 한계와 차원 감소(feat.SVD)

1.PPMI의 한계 PPMI 에는 몇 가지 제약이 존재합니다. 가장 중요한 문제 중 하나는 말뭉치 내 어휘의 수가 증가함에 따라, 단어 벡터의 차원 또한 비례하여 증가한다는 것입니다. 예를 들어, 어휘 수

resultofeffort.tistory.com

 

  • 3. 추론 기반 기법(예: word2vec)

이번엔 마지막으로 추론 기반 기법에 대해서 알아보려고 합니다.


 

1. 통계 기반 기법의 한계

이전 포스팅에서는 주변 단어의 등장 빈도에 기반해 단어를 표현하는 통계 기반 기법에 대해 배웠습니다. 이 방식에서는, 말뭉치의 전체 통계 데이터(동시발생 행렬, PPMI 등)를 사용해서 한 번의 큰 처리(SVD)로 단어의 벡터를 만들어냅니다. 하지만 이런 접근법은 대규모의 데이터를 처리할 때 제한이 있습니다.

실제 업무에서 접하는 어휘의 규모는 매우 큽니다. 영어 어휘의 경우, 100만 개가 넘는 단어들이 사용됩니다. 이를 가정하면, 통계 기반 기법에서는 100만 x 100만 크기의 거대한 행렬을 만들어내야 하는데, 이는 현실적으로 처리하기 어렵죠.

 

통계 기반 방식은 전체 학습 데이터를 일괄적으로 처리하는 배치 학습을 사용합니다.

반면에 추론 기반 기법에서는, 신경망을 사용하는 경우가 흔한데이는 일반적으로 작은 데이터 덩어리인 미니배치를 이용해 학습합니다. 미니배치 학습을 통해 신경망은 작은 샘플을 여러 번 처리하며 조금씩 가중치를 갱신해 나가죠. 이 접근법의 큰 장점은 어휘 수가 많아서 처리가 어려운 크기의 데이터셋도, 작은 단위로 나누어 학습함으로써 신경망을 학습시킬 수 있다는 것입니다.

 

2. 추론 기반 기법의 이해

추론 이미지


추론 기반 기법에서는 '추론'이 핵심적인 작업이 됩니다. 주어진 문장에서 빈칸에 들어갈 단어를 유추하는 것이죠. 그림에서 처럼, 주변 단어들을 바탕으로 빈칸에 들어갈 단어를 예측하는 문제를 풀고 이를 통해 학습하는 것입니다. 이 과정을 반복함으로써, 컴퓨터는 단어들의 패턴을 점차 학습하게 되는 거죠.

모델 관점


이런 유형의 문제를 모델 관점에서 볼 때, 신경망과 같은 모델을 사용하게 됩니다. 이 모델은 주변 단어, 즉 맥락을 입력으로 받아 각 단어가 등장할 확률을 출력합니다. 이렇게 말뭉치를 활용해 모델을 학습시켜 올바른 단어를 예측하도록 하고, 이 과정을 통해 단어의 분산 표현을 얻는 것이 추론 기반 기법입니다.

 

3. 단어의 원핫 인코딩 및 신경망에서의 벡터 표현

이제 신경망을 통해 단어들을 다룰 건데요, 신경망은 'you', 'say'와 같은 자연어를 직접 이해하지 못합니다. 따라서, 단어들을 신경망이 처리할 수 있는 형태로 변환해 줘야 합니다. 이를 위해 자주 사용되는 방법이 바로 원핫 인코딩입니다. 원핫 인코딩은 전체 벡터 중 하나의 원소만 1이고 나머지는 모두 0으로 채워진 벡터를 만드는 것을 의미합니다.

'You say goodbye and I say hello.'이 한 문장으로 이루어진 말뭉치를 예로 들어볼게요. 이 말뭉치에는 총 7개의 서로 다른 단어가 나오죠 'you', 'say', 'goodbye', 'and', 'I', 'hello', '.' (마침표). 

원핫 인코딩 적용

위 그림과 같이 단어들은 텍스트로 주어지고 각각 고유한 단어 ID(문장에서 몇 번째에 위치하는지) 받습니다. 'you'는 0번, 'goodbye'는 2번이죠. 그리고 이 단어들을 원핫 벡터로 바꿔주면, 'you'는 첫 번째 위치가 1이고 나머지는 0인 벡터가 되고, 'goodbye'는 세 번째 위치가 1인 벡터로 변환됩니다. 

모든 단어 원핫 인코딩 적용

이렇게 변환한 원핫 벡터들은 신경망에 입력될 때 사용되며, 신경망의 입력층 뉴런 수를 '고정'할 수 있게 해 줍니다, 즉 단어의 개수만큼 뉴런을 설정할 수 있게 되는 거죠.

 

위 이미지에서 각 단어( 'you', 'say', 'goodbye', 'and', 'I', 'hello', '.')는 하나의 뉴런과 연결되어 있고, 해당 단어가 텍스트에 존재할 때 그 뉴런은 '활성화'됩니다. 이러한 활성화를 통해 단어는 7차원 벡터로 변환되는데, 이것은 신경망이 이해하고 처리할 수 있는 데이터 형태입니다. 

 

4. 완전 연결 계층을 통한 입력 데이터의 변환과 정보 흐름

완전 연결 계층(fully connected layer)

위 그림은 인공신경망에서 사용되는 완전 연결 계층(Fully Connected Layer)의 변환을 단순화해서 보여주고 있습니다. 완전 연결 계층은 입력 벡터에 가중치 행렬을 곱하여 새로운 차원의 출력을 생성하는 네트워크의 일부입니다.

그림에서 '입력층'은 왼쪽에 위치하고 있으며, '가중치'는 중앙에 W (7x3 크기의 행렬)로 표현되어 있습니다. '출력층'은 오른쪽에 있습니다.

'입력층'에 있는 각 노드(검은 원)는 입력 신호의 각 요소를 나타냅니다. 입력 벡터는 세로로 7개의 요소를 갖고 있는데요. "you say goodbye and I say hello."라는 문장이 각 요소에 대응됩니다. 신경망에서 이러한 각 입력 노드는 단어의 특성(feature)을 나타내는 값으로 해석됩니다.

 

W는 가중치 행렬이며, 이 행렬은 입력층과 출력층 사이의 연결 강도를 나타냅니다. 이 행렬에 입력 벡터를 곱함으로써, 네트워크는 입력 데이터를 새로운 공간(출력층)으로 변환합니다. 

'출력층'은 변환된 신호가 다음 계층으로 전달되는 곳입니다. 여기에는 3개의 노드가 있으며, 이는 가중치 행렬에 의해 변환된 7개의 입력 요소가 3개의 출력 요소로 변환된 것을 나타냅니다. 출력층의 각 노드는 변환된 입력 데이터의 새로운 특성을 나타내며, 이는 더 깊은 신경망의 다음 계층으로 전달되거나 최종 출력으로 사용될 수 있습니다.

위 그림은 신경망에서 한 계층에서 다음 계층으로의 정보 흐름을 간소화하여 나타낸 것이며, 실제 신경망에서는 활성화 함수, 편향(bias), 그리고 다양한 최적화 기법이 이 과정에 포함됩니다.

 

지금까지의 과정을 코드로 살펴볼게요.

 

5. 원-핫 인코딩 된 단어의 가중치 행렬 변환

mport numpy as np
C =np.aray([[1,0,0,0,0,0,0]) # 입력
W= np. random. rand(7, 3) # 가중치
h = np. matmul(c, W) # 중간 노드
print(h) 
---------------------------------------------------------
【-0.7012195 0.25204755 -0.79774592]

 

단어 ID가 0인 단어를 원핫 벡터로 표현한 후, 완전 연결 계층을 통과시켜 결과를 변환하는 과정입니다. 완전 연결 계층은 행렬 곱을 이용하여 계산됩니다. (편향은 제외) `c`는 원핫 벡터로, 단어 ID에 해당하는 원소만 1이고 나머지는 모두 0인 벡터입니다. 따라서 `c`와 `W`의 행렬 곱은 사실상 가중치에서 해당하는 행 벡터를 선택하는 것과 같아요.(아래 이미지 참고)

 

 

6. Word2Vec의 CBOW 모델 소개

지금까지 추론 기반 기법을 배우고 신경망을 이용한 단어 처리 방법을 코드로 살펴보았습니다. 이제는 Word2Vec 모델을 구현해 보겠습니다. Word2Vec에서 제안하는 CBOW(Continuous Bag-of-Words) 모델을 중심으로 다루게 됩니다.  Word2Vec 내에서 CBOW 모델과 Skip-gram 모델은 가장 대표적인 신경망 구조 중 하나입니다.

7. CBOW 모델의 신경망 아키텍처와 맥락 기반 단어 예측

CBOW 모델은 주변 단어(맥락)를 통해 중앙의 타깃 단어를 예측하는 신경망입니다. '타깃'은 추론해야 할 중앙 단어이며, 그 주변 단어들이 '맥락'을 형성합니다. 
CBOW 모델의 입력은 맥락인데, "you"와 "goodbye"와 같은 단어 목록을 포함합니다. 이 맥락을 원핫 벡터로 변환하여 CBOW 모델이 처리할 수 있도록 준비합니다. 

위 그림은 Word2Vec의 CBOW 모델의 신경망 구조를 나타냅니다. 모델에는 두 개의 입력층이 있고, 그다음으로는 은닉층, 그리고 마지막으로 출력층이 있습니다. 각 입력층은 맥락의 단어를 나타내며, 여기서는 단어가 두 개로 설정되어 있어 입력층도 두 개입니다. 실제 상황에서는 맥락에 포함될 단어의 수(N)에 따라 입력층의 수도 N개가 됩니다.

입력층에서 은닉층으로의 변환은 동일한 가중치 \( W_{in} \)을 사용하는 완전 연결 계층이 처리하고, 은닉층에서 출력층으로 가는 변환은 또 다른 완전 연결 계층인 \( W_{out} \)이 처리합니다.

은닉층의 특징은 입력층에서 전달된 값들의 평균을 계산한다는 것입니다. 예를 들어, 첫 번째 입력층의 단어 벡터가 \( h_1 \)로 변환되고 두 번째 입력층의 단어 벡터가 \( h_2 \)로 변환되면, 은닉층의 뉴런은 이 둘의 평균, 즉 \( (h_1 + h_2) / 2 \)가 됩니다.

마지막으로 출력층을 살펴보면, 총 7개의 뉴런이 있으며, 각 뉴런은 말뭉치 내의 각각의 단어에 대응됩니다. 출력층 뉴런은 단어의 '점수'를 나타내며, 점수가 높을수록 해당 단어의 출현 확률이 높아집니다. 여기서 점수란 확률로 해석되기 전의 원시값으로, 소프트맥스 함수를 적용하여 이 점수들을 확률로 변환할 수 있습니다. 이러한 과정을 통해 모델은 주어진 맥락에서 가장 가능성 높은 타깃 단어를 예측하게 됩니다.

 

8.  단어의 분산 표현과 의미 학습

각 단어의 의미를 나타내는 분산 표현 W

 

위 그림에서 가중치 \( W_{in} \) 에는 각 행이 하나의 단어를 나타내는 분산 표현을 포함하고 있습니다. 이런 분산 표현은 단어의 의미를 수치화한 것으로, 모델이 학습을 진행함에 따라 점점 더 풍부한 의미를 담게 됩니다.

분산 표현은 단어들의 의미적 관계와 유사성을 벡터 공간에서의 거리로 나타내는 방법입니다. 단어들이 유사한 맥락에서 자주 등장하면, 이 벡터 공간에서도 서로 가까워지게 됩니다. 학습 과정 동안, 가중치 행렬 \( W \)는 이러한 패턴을 포착하여, 주어진 주변 단어들을 기반으로 중심에 올 단어를 얼마나 정확히 예측할 수 있는지를 결정하는 데 도움을 줍니다. 이는 CBOW 모델에서 매우 중요한 부분으로, 신경망이 중심 단어를 효과적으로 예측할 수 있게 만드는 핵심 요소입니다.

학습 과정은 이 가중치를 지속적으로 갱신하며, 최종적으로 이 가중치 행렬 \( W \)에서 각 단어의 의미가 벡터로 잘 표현되어 있게 됩니다. 결과적으로, 단어의 의미, 문법적 특성, 심지어 그 단어가 사용되는 다양한 문맥까지도 이 벡터에 반영되게 되는데, 이렇게 학습된 벡터들은 자연어 처리에서 다양한 작업에 활용할 수 있습니다.

 

9.  CBOW의 아키텍처 코드 실습

import sys
sys.path.append('..')
import numpy as np
from common.layers import MatMul

# 샘플 맥락 데이터
c0 = np.array([1, 0, 0, 0, 0, 0, 0])  # 첫 번째 맥락 단어의 원핫 인코딩 벡터
c1 = np.array([0, 0, 1, 0, 0, 0, 0])  # 두 번째 맥락 단어의 원핫 인코딩 벡터

# 가중치 초기화
W_in = np.random.rand(7, 3)  # 입력층 가중치
W_out = np.random.randn(3, 7)  # 출력층 가중치

# 계층 생성
in_layer0 = MatMul(W_in)  # 첫 번째 맥락 단어를 위한 계층
in_layer1 = MatMul(W_in)  # 두 번째 맥락 단어를 위한 계층
out_layer = MatMul(W_out)  # 출력층 계층

# 순전파
h0 = in_layer0.forward(c0)  # 첫 번째 맥락 단어의 은닉층 표현
h1 = in_layer1.forward(c1)  # 두 번째 맥락 단어의 은닉층 표현
h = 0.5 * (h0 + h1)  # 두 은닉층 표현의 평균
s = out_layer.forward(h)  # 최종 점수

# 최종 점수 출력
print(s)

 

이 코드는 Word2Vec 모델의 CBOW 아키텍처를 구현한 예로, 자연어 처리에서 단어의 분산 표현을 학습하는 과정의 일부인데요, 간단하게 말하면 단어들을 벡터로 바꿔서 컴퓨터가 이해할 수 있도록 만드는 것이죠.

가장 먼저 해야 할 일은 가중치 \( W_{in} \)과 \( W_{out} \)를 무작위 값으로 설정해 주는 것입니다. 이 가중치들이 업데이트되면서 단어의 의미를 담게 되는 거예요. 그다음, 입력층을 처리할 'MatMul' 계층을 두 개 만들어요. 왜 두 개냐고요? 그건 맥락을 이루는 단어가 두 개이기 때문이죠. 이 계층들은 동일한 \( W_{in} \) 가중치를 사용해서 각각의 맥락 단어를 변환하는 데 쓰여요.

이 변환된 맥락 단어 벡터들은 그다음, 서로 합쳐진 후에 평균을 낸 뒤 출력층으로 전달되는데, 출력층에선 \( W_{out} \) 가중치가 사용돼요. 여기서 나오는 값은 단어들의 점수이며, 점수가 높은 단어일수록 맥락에서 나타날 가능성이 높다고 해석할 수 있어요.

이렇게 CBOW 모델 활성화 함수 없이, 입력층의 맥락 단어들로부터 타깃 단어를 예측하는 비교적 단순한 신경망이에요. 하지만, 여러 입력층이 같은 가중치를 공유하는 것이 중요한 포인트죠. 

 

이제 이 모델을 훈련시켜 실제로 단어의 의미를 담아내는 분산 표현을 얻어보겠습니다!

 

10.  CBOW 모델을 통한 맥락 기반 단어 예측 과정

 

 

CBOW 모델의 학습 과정에서는 신경망이 주어진 맥락, 즉 주변 단어들을 기반으로 중간에 올 단어를 예측하도록 설계되어 있습니다. 예를 들어, "You"와 "goodbye"라는 맥락 단어가 주어졌을 때, 모델은 실제로는 "say"가 중간에 위치하는 경우의 확률을 예측해야 합니다. 이 예측은 모델의 출력층에서 나오는 점수에 소프트맥스 함수를 적용함으로써 확률로 변환됩니다.

학습 과정에서는 이 확률 분포와 실제 단어의 분포 사이의 차이를 줄이기 위해 가중치를 조정합니다. 이는 크로스 엔트로피 손실 함수를 통해 이루어지며, 손실 함수의 값을 최소화하는 방향으로 가중치를 업데이트하게 됩니다. 이러한 업데이트 과정을 통해 \( W_{in} \)과 \( W_{out} \)에는 단어의 의미와 문법적 패턴을 반영하는 정보가 점차적으로 쌓이게 되며, 이로 인해 단어의 분산 표현이 학습됩니다. 

결과적으로, CBOW 모델은 맥락 속에서 각 단어가 어떻게 쓰이는지, 그리고 단어들 사이의 관계가 어떻게 구성되는지를 이해하게 됩니다. 대규모 말뭉치를 이용한 실험에서는 이 모델을 통해 얻은 단어 벡터들이 실제 단어의 의미를 잘 반영하는 것으로 나타났습니다. 예컨대 위키백과와 같은 대규모 데이터를 활용하면, 더 정교하고 풍부한 의미를 포함한 단어의 분산 표현을 얻을 수 있습니다.

 

11.  Word2Vec의 가중치 구조

Word2Vec 모델, 특히 그중에서도 skip-gram 모델을 이해하는 데 있어 중요한 개념은 가중치와 단어의 분산 표현입니다. Word2Vec 신경망은 두 종류의 가중치를 가지는데, 하나는 입력층에 연결된 완전 연결 계층의 가중치 \( W_in \)이고, 다른 하나는 출력층에 연결된 완전 연결 계층의 가중치 \( W_out \)입니다.

각 단어의 분산 표현은 입력층의 가중치 \( W_in \)의 각 행에 저장됩니다. 이는 단어가 벡터 공간에서 어떤 위치를 차지하는지를 나타내며, 단어의 의미를 포착하는 데 사용됩니다. 한편, 출력층의 가중치 \( W_out \)에도 단어의 의미가 인코딩 된 벡터가 저장되어 있다고 볼 수 있는데, 이는 단어 벡터가 가중치 행렬의 열(수직 방향)에 저장되는 방식으로 표현됩니다.

 

12.  Word2Vec 학습 준비: 맥락과 타깃 데이터의 구성

Word2Vec 모델을 학습시키기 위해 우리는 먼저 학습 데이터를 준비해야 합니다. 예를 들어, "You say goodbye and I say hello."라는 간단한 문장을 사용할 때, 학습 과정에 필요한 것은 '맥락(contexts)'과 '타깃(target)'이라고 하는 두 종류의 데이터입니다.

신경망에 입력되는 '맥락'은 타깃 단어의 주변에 위치한 단어들로 구성됩니다. 반면에 '타깃'은 예측하고자 하는 중앙의 단어입니다. Word2Vec 모델의 목적은 맥락을 주어졌을 때 신경망이 타깃 단어를 정확히 예측하도록 하는 것입니다. 다시 말해, 우리는 맥락을 바탕으로 타깃 단어의 출현 확률을 최대로 높이는 방향으로 모델을 학습시킬 필요가 있습니다.


위 그림에 나타난 것처럼, 우리는 문장에서 타깃 단어를 중심으로 그 주변 단어들을 '맥락'으로 선택합니다. 이 과정은 말뭉치의 모든 단어에 대해 수행되어, '맥락'과 '타깃' 데이터 쌍을 만듭니다. 이렇게 생성된 맥락의 각 행은 신경망의 입력으로 사용되고, 타깃의 각 행은 정답 레이블(예측해야 하는 단어)로 사용됩니다. 이 예시에서는 맥락이 두 개이지만 타깃은 항상 하나입니다.

 

13.  CBOW 모델 VS. skip-gram 모델

자연어 처리 분야에서는 단어의 의미를 벡터로 변환하는 다양한 모델이 사용됩니다. 그중에서도 'CBOW(Continuous Bag of Words)' 모델과 'Skip-gram' 모델은 특히 주목할 만합니다. 이 두 모델은 비슷해 보이지만, 각각의 작동 방식은 매우 다릅니다.

CBOW 모델은 주변 단어들, 즉 맥락을 사용하여 중앙의 단어(타깃)를 예측합니다. 예를 들어, "The cat ___ on the mat"이라는 문장에서 빈칸에 들어갈 단어를 맞추는 것이 CBOW 모델의 작업입니다. 이 모델은 주변 단어들의 정보를 종합하여 중앙의 단어를 추측하는 데 유용하며, 문맥적 의미 파악에 강점을 보입니다.

반면, Skip-gram 모델은 중앙의 단어를 기반으로 주변 단어들을 예측합니다. 같은 예로, "cat"이라는 단어가 주어졌을 때, 이 단어 주변에 올 가능성이 있는 단어들을 예측하는 것이 Skip-gram 모델의 목표입니다. 이 모델은 주로 각 단어가 어떤 맥락에서 사용되는지를 학습하는 데 탁월합니다.

이 두 모델은 각기 다른 상황에서 유용하게 활용될 수 있으며, 단어의 분산 표현을 학습하는 데 있어서 중요한 역할을 합니다. CBOW는 속도가 빠르고 효율적인 반면, Skip-gram은 더 풍부한 단어 관계를 모델링하는 데 뛰어난 성능을 보여줍니다.

CBOW vs. Skip-gram
skip-gram 모델의 신경망 구성 예

 

728x90
반응형