밑바닥부터 시작하는 딥러닝 - word2vec (1)
이번 글에서는 추론 기반 기법과 신경망에 대해 알아볼 것이다.
지난 글까지 통계 기반 기법에 대해 배웠다.
하지만 통계 기반 기법에는 문제점이 존재한다. 대규모 말뭉치를 다룰 때 문제가 발생한다.
영어의 어휘 수는 100만이 넘는다고 하는데, 어휘가 100만 개라면, 통계 기반 기법에서는 100만 X 100만이라는 엄청나게 큰 행렬을 만들게 된다.
이렇게 큰 행렬에 SVD를 적용하는 일은 현실적이지 않다.
추론 기반 기법 개요
추론 기반 기법에서는 '추론'이 주된 작업이다. 추론이란 아래 그림처럼 주변 단어(맥락)가 주어졌을 때 "?"에 무슨 단어가 들어가는지를 추측하는 작업이다.
추론 문제를 풀고 학습하는 것이 '추론 기반 기법'이 다루는 문제이다. 이러한 추론 문제를 반복해서 풀면서 단어의 출현 패턴을 학습하는 것이다.
신경망에서의 단어 처리
신경망은 'you'와 'say' 등의 단어를 있는 그대로 처리할 수 없으니 단어를 '고정 길이의 벡터'로 변환해야 한다.
이때 사용하는 대표적인 방법이 단어를 원핫 벡터로 변환하는 것이다. 원핫 벡터란 벡터의 원소 중 하나만 1이고 나머지는 모두 0인 벡터를 말한다.
위의 그림처럼 총 어휘 수만큼의 원소를 갖는 벡터를 준비하고, 인덱스가 단어 ID와 같은 원소를 1로, 나머지는 모두 0으로 설정한다.
입력층의 뉴런은 총 7개이다. 이 7개의 뉴런은 차례로 7개의 단어들에 대응한다.
Word2Vec
지금까지 추론 기반 기법을 배우고, 신경망으로 단어를 처리하는 방법을 배웠다.
지금부터 모델을 신경망으로 구축하는 것을 진행할 것이다. 이번에 신경망으로 word2vec에서 제안하는 CBOW모델을 사용할 것이다.
CBOW 모델의 추론 처리
CBOW 모델은 맥락으로부터 타깃을 추측하는 용도의 신경망이다.
입력층이 2개가 있고, 은닉층을 거쳐 출력층에 도달한다. 두 입력층에서 은닉층으로의 변환은 똑같은 완전연결계층이 처리한다. 그리고 은닉층에서 출력층 뉴런으로의 변환은 다른 완전연결계층이 처리한다.
은닉층을 보면, 뉴런은 입력층의 완전연결계층에 의해 변환된 값이 되는데, 입력층이 여러 개이면 전체를 '평균'하면 된다.
출력층을 보면, 뉴런은 총 7개인데, 여기서 중요한 것은 이 뉴런 하나하나가 각각의 단어에 대응한다는 것이다. 그리고 출력층 뉴런은 각 단어의 '점수'를 뜻하며, 값이 높을수록 대응 단어의 출현 확률도 높아진다.
여기서 점수란 확률로 해석되기 전의 값이고, 이 점수에 소프트맥스 함수를 적용해서 '확률'을 얻을 수 있다.
CBOW 모델의 가장 앞단에는 2개의 MatMul 계층이 있고, 이어서 이 두 계층의 출력이 더해진다. 그리고 더해진 값에 0.5를 곱하면 '평균'이 되며, 이 평균이 은닉층 뉴런이 된다. 마지막으로 은닉층 뉴런에 또 다른 MatMul 계층이 적용되어 점수가 출력된다.
CBOW 모델의 추론 처리 코드
# 샘플 맥락 데이터
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.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)
가장 먼저, 필요한 가중치들을 초기화한다. 그리고 입력층을 처리하는 MatMul 계층을 맥락 수만큼 생성하고, 출력층 측의 MatMul 계층은 1개만 생성한다. 이때 입력층 측의 MatMul 계층은 가중치 W_in을 공유한다.
다음은 입력층 측의 MatMul 계층들의 forward() 메서드를 호출해 중간 데이터를 계산하고, 출력층 측의 MatMul 계층을 통과시켜 각 단어의 점수를 구한다.
이상이 CBOW 모델의 추론 과정이다. CBOW 모델은 활성화 함수를 사용하지 않는 간단한 구성의 신경망이다.
CBOW 모델의 학습
CBOW 모델의 학습에서는 올바른 예측을 할 수 있도록 가중치를 조정하는 일을 한다. 그 결과로 가중치 W(in)에 단어의 출현 패턴을 파악한 벡터가 학습된다.
이 모델은 다중 클래스 분류를 수행하는 신경망이다. 따라서 이 신경망을 학습하려면 소프트맥스와 교차 엔트로피 오차만 이용하면 된다.
소프트맥스 함수를 이용해 점수를 확률로 변환하고, 그 확률과 정답 레이블로부터 교차 엔트로피 오차를 구한 후, 그 값을 손실로 사용해 학습을 진행한다.