일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- machine translation
- 딥러닝
- NLP
- 데이터프레임
- 동시발생 행렬
- word embedding
- word2vec
- 역행렬
- 벡터간 유사도
- Transformer
- NMT
- DataFrame
- 밑바닥부터 시작하는 딥러닝2 2장
- pandas
- ReLU
- 선형대수학
- one-hot vector
- sigmoid
- 밑바닥부터 시작하는 딥러닝
- Python
- 프로그래머를 위한 선형대수
- 정칙행렬
- SVD
- 신경망 학습
- Linear Algebra
- RNN
- 연립일차방정식
- 판다스
- 자연어처리
- PPMI
- Today
- Total
생각하는감자
[밑바닥부터 시작하는 딥러닝2] 3장 - word2vec 본문
통계기반보다 훨씬 더 강력한 추론 기반 기법은, 추론을 하는 기법이고 이 과정에서 신경망을 사용하게 된다. 이때 word2vec이 등장하게 된다.
추론 기반 기법과 신경망
먼저, 통계 기반 기법의 문제점은 대규모 말뭉치를 다룰 때 발생한다. 현업에서 다루게 될 말뭉치의 어휘수는 매우 큰 단위인데, 어휘가 100만개라고 했을때, 만들어지는 행렬은 100만 X 100만 이기 때문에, 이런 거대한 행렬에 SVD를 적용하는 것은 현실적이지 못하다. 또한, 통계 기반 기법에서는 1회의 처리로만 단어의 분산 표현을 얻는다. 하지만, 추론 기법에서는 미니배치로 학습하게 되는데, 이것은 말뭉치의 어휘 수가 많아 계산량이 커진 작업인 경우에도 신경망을 학습시킬 수 있다는 것을 의미한다. GPU를 이용한 병렬 계산도 가능해졌기에 학습속도르 ㄹ높일 수 있어 추론 기반 기법이 더 매력적이게 되었다고 할 수 있다.
빈칸이 있는 문장이 있을 때, 주변 단어들을 보고 해당 빈칸에 어떤 단어가 들어가는지를 추측하는 작업이 '추론'이며, 추론 문제를 풀고 학습하는 것이 '추론 기반 기법'이 다루는 문제이다. 추론 문제를 반복해서 풀면서 단어의 출현 패턴을 학습하는 것이다. 추론 기반 기법에는 모델이 등장하는데, 이 모델은 맥락 정보를 입력받아 출현할 수 있는 각 단어의 출현 확률을 출력한다. 모델이 올바른 추측결과를 출력할 수 있도록 학습시키는 것이고, 이 결과로 단어의 분산 표현을 얻는 것이 추론 기반 기법의 전체적인 그림이다.
신경망에서의 단어 처리
one-hot vector
신경망 안에서 단어를 처리할 때에 텍스트 자체를 사용할 수 없으므로 고정길이의 벡터로 변환해 주어야 하는데, 이 때 사용하는 대표적인 방법이 단어를 one-hot vector로 변환하는 것이다. one-hot vector이라는 것은 벡터의 원소들 중 하나만 1이고 나머지는 모두 0인 벡터이다.
예를 들어보자면, "You say goodbye and I say hello."라는 문장이 있을 때, 이 말뭉치에는 어휘가 총 7개 등장한다. ("."포함) 제일 첫 단어인 you를 원핫벡터 형식으로 나타내 보면 (1, 0, 0, 0, 0, 0, 0)이라고 표현할 수 있다. 이와 같이 단어를 고정 길이 벡터로 변환하면 신경망의 입력층은 뉴런의 수를 고정할 수 있다. 즉, 신경망을 구성하는 계층들이 벡터를 처리할 수 있고 이는 단어를 신경망으로 처리할 수 있다는 말과 같다.
완전연결 계층에 의한 변환
완전연결 계층에 의한 변환을 간단하게 표현한 그림이다. 각각의 가중치를 7X3 행렬로 표현하였다. one-hot vector와 행렬이 곱해져서 은닉층으로 들어가게 되는데, onet-hot vector이므로 단어id에 대응하는 원소만 1이고 그 외는 0인 벡터이다. 따라서, 입력벡터와 행렬의 곱은 결국 가중치행렬인 W에서 행벡터 하나를 뽑아내는 것과 같다.
단순한 word2vec
word2vec에서 제안하는 CBOW(Continuous Bag-Of-Words) 모델이 있다. 이 모델은 맥락으로부터 중앙 단어를 추측하는 용도의 신경망이다. 우리가 할 일은 이 모델이 정확하게 추론하도록 학습시켜서 단어의 분산표현을 얻어내는 것이다. CBOW 모델의 입력으로는 단어들의 목록인 맥락이다. 가장 먼저 할 일은, 맥락을 one-hot vector로 변환하여 모델이 처리할 수 있도록 준비해 주는 것이다.
은닉층의 뉴런은 입력층의 완전연결계층에 의해 변환된 값이 되고, 입력층이 여러개라면 평균값을 구하면 된다. 출력층에서도 뉴런 하나하나가 각각의 단어에 대응하며, 각 단어의 '점수'를 가지고 있어, 이 점수가 높을수록 대응하는 단어의 출현 확률이 높아진다. 이 점수는 확률로 해석되기 전의 값이고 확률값으로 해석되기 위해서는 소프트맥스 함수를 적용한다. (*소프트맥스 함수 통과 후 값들을 출력층이라고 하기도 함)
입력층에서 은닉층으로의 변환에서 사용되는 가중치 행렬이 단어의 분산 표현의 정체이고, 모델의 학습이 진행될수록 맥락에서 출현하는 단어를 잘 추측하는 방향으로 분산 표현들이 갱신될 것이다.
* 은닉층의 뉴런의 수를 입력층보다 적게 하는 것이 핵심이다. 그렇게 해야 단어 예측에 필요한 정보를 간결하게 담아 표현할 수 있다. 은닉층의 정보를 나타내는 것이 인코딩이고, 은닉층으로부터 원하는 결과를 얻는 작업이 디코딩이다.
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.randn(7, 3)
W_out = np.random.rand(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(j)
print(s)
코드 상으로 가장 먼저 할 일은 필요한 가중치들을 초기화하는 것이다. W_in 과 같은 경우 입력층의 뉴련은 7개 이고, 3개의 뉴런으로 구성된 은닉층으로 보내는 것이므로 7X3 이고 W_out은 그 반대이다. 또한, 예로 든 것은 입력 계층이 2개 였기 때문에 in_layer을 총 2개 생성하였고, 순전파 과정에서 0.5*(h0+h1)을 해주어 평균값을 전달하였다. 이때, 입력층의 계층은 W_in을 공유하는 형태이다. 출력층에서 각 단어의 점수가 구해졌다면, 이 점수에 Softmax함수를 적용하여 확률을 얻을 수 있고, 이 확률은 전후단어(맥락)이 주어졌을 때 중앙에 어떤 단어가 출현하는지를 나타내게 된다. 예측한 중앙 단어에 해당하는 뉴런의 값이 가장 클 것이다.
CBOW 모델의 학습
모델의 학습은 간단하다. 올바른 예측을 하 ㄹ수 있도록 가중치를 조정하는 것이다. 위에서 계속 예시를 들었던 문장인 "You say goodbye and I say hello."라는 문장에서 you와 goodbye에 해당하는 원핫벡터를 입력값으로 넣는다면, say 에 해당하는 뉴런의 값이 가장 크게 출력되는 모델이 학습이 잘 된 모델인 것이다.
학습을 진행할 때에는 Softmax 와 Cross Entropy Error만 이용하면 된다. 먼저 소프트맥스 함수를 통해 점수를 확률로 변환해 준다. 그 후에, 확률과 정답 레이블로부터의 교차 엔트로피 오차를 구할 수 있는데, 이 오차값을 손실로 사용하여 학습을 진행하게 된다.
word2vec의 가중치와 분산표현
위의 그림에서 알 수 있듯이, 입력 측 완전연결 계층의 가중치를 Win이라고 하고, 출력 측 완전연결 계층의 가중치를 Wout이라고 한다. Win의 각 행은 각 단어의 분산표현에 해당한다. Wout에도 단어의 의미가 인코딩된 벡터가 저장되고 있다고 생각할 수 있는데, 출력 측의 가중치의 경우, 단어의 분산 표현이 열 방향으로 저장된다.
최종적으로는 두 가중치를 사용해도 되고 둘 중 하나의 가중치 행렬만 사용해도 되는데, 많은 연구에서 입력측 가중치인 Win만을 최종 단어의 분산 표현으로서 이용한다.
CBOW 모델과 확률
어떤 맥락이 주어졌을때, 앞뒤 단어를 이용해 중간에 오는 단어를 예측하는 것은 확률적으로 아래와 같이 표현할 수 있다.
사건 A와 사건 B가 동시에 일어날 확률을 P(A,B)라고 표기한다. 또, B라는 정보가 주어졌을 때 A가 일어날 확률인 사후확률은 P(A|B)리고 표기한다. CBOW 에서는 w(t-1)과 w(t+1)이라는 단어가 주어졌을때, w(t) 가 일어날 확률이라고 생각할 수 있으므로 위와 같이 표현할 수 있다.
교차엔트로피를 구하는 수식은 아래와 같다.
교차엔트로피 식을 활용하여 CBOW 모델의 손실함수를 구해본다면 아래와 같다.
CBOW 모델의 학습은 이 손실 함수의 값을 가능한 작게 만드는 것이고, 이때 가중치 매개변수가 우리가 얻고자 하는 단어의 분산 표현이다.
skip-gram모델
word2vec은 두 가지 모델을 제안하고 있는데, 하나가 CBOW 모델이고, 다른 하나가 skip-gram 모델이다. CBOW가 여러개의 맥락이 존재할 때 그 맥락으로부터 중앙의 단어를 추측하는 것이라면, skip-gram은 중앙의 단어로부터 주변의 여러단어(맥락)을 추측한다. 즉, CBOW 에서 다루는 맥락과 타깃단어를 역전시킨 모델이 skip-gram 모델인 것이다.
skip-gram에서는 입력층이 1개이고, 출력층이 맥락 수만큼 존재한다. 개별적으로 손실을 모두 구한 다음, 그 모든 손실의 합을 최종 손실함수의 값으로 하는 것이다.
CBOW 와 반대되는 개념이라고 생각하면 되므로, 조금 더 식을 쉽게 이해할 수 있을 것이다.
skip-gram모델은 맥락의 수만큼 추측하기 때문에, 손실 함수는 각 맥락에서 구한 손실의 총합일 것이다. CBOW와 skip-gram중에서는 skip-gram의 성능이 더 뛰어난 경향이 있다. 모델이 수행하는 학습을 생각해봤을때, skip-gram이 더욱 어려운 문제에 도전하는 것이라고 생각할 수 있다. 그러한 상황에서 학습하는 만큼, 모델이 주는 단어의 분산 표현이 더 정밀하고 뛰어날 가능성이 높다고 할 수 있다. 하지만, 학습 속도 측면에서는 CBOW 가 더 빠르며, skip-gram은 손실을 맥락 수 만큼 구해야하기 때문에 계산 비용이 그만큼 커지게 된다.
'NLP' 카테고리의 다른 글
Machine Translation (0) | 2023.01.24 |
---|---|
Text Generation (0) | 2023.01.24 |
GPT (0) | 2023.01.20 |
BERT (0) | 2023.01.16 |
Transformer (0) | 2023.01.15 |