word2vec 속도 개선

업데이트:

4. word2vec 속도 개선

앞장에서 구현한 CBOW모델은 2층 신경망이라 간단하게 구현할 수 있었다. 하지만, 이 모델은 어휘 수가 많아지면 계산 속도가 오래 걸린다는 단점이 있다.

이번에는 속도 개선을 목표로 Embedding이라는 계층과 네거티브 샘플링이라는 손실 함수를 추가하여 개선해보자.

4.1. word2vec 개선 1

CBOW계층에 어휘가 100만개가 들어가면 어떻게 될까?

  • 아래 그림처럼 될 것인데…. 두 가지 문제점이 존재한다.

    4%20word2vec%20%E1%84%89%E1%85%A9%E1%86%A8%E1%84%83%E1%85%A9%20%E1%84%80%E1%85%A2%E1%84%89%E1%85%A5%E1%86%AB%20536fb7c82e2045d1b5888d3d5eed00dd/fig_4-2.png

    1. 입력층에서 one-hot 표현과 가중치 행렬 $\mathbf{W}_\text{in}$의 곱 계산
      • 단어가 많은데, 이것을 one-hot으로 표현하니 벡터가 너무 커진다. (단어 수만큼 벡터가 커짐)
      • 그리고 이 커진 벡터에 가중치를 곱하는 과정에서도 비용이 크다.
    2. 은닉층과 가중치 행렬 $\mathbf{W}_\text{out}$의 곱, Softmax 계층 계산
      • 은닉층과 가중치 행렬 곱은 계산량이 많고,
      • Softmax 계층에서도 다루는 단어가 많아지는 만큼 계산량이 증가한다.

4.1.1. Embedding 계층

먼저, 입력층과 가중치의 곱을 생각해보자. 언뜻 보면 엄청나게 큰 벡터와 행렬간의 곱으로 보인다. 하지만 다시 생각해보면… 결국 이 곱셈의 결과물은, 가중치 행렬에 있는 n번째 요소를 추출하는 것이다!

  • 그림으로 살펴보면 좀 더 쉬움

    4%20word2vec%20%E1%84%89%E1%85%A9%E1%86%A8%E1%84%83%E1%85%A9%20%E1%84%80%E1%85%A2%E1%84%89%E1%85%A5%E1%86%AB%20536fb7c82e2045d1b5888d3d5eed00dd/fig_4-3.png

결국, one-hot 변환과 가중치와의 곱 계산은 필요가 없는 것이다.(추출만 하면 되니까) Embedding 계층을 도입함으로써 이 문제를 해결할 수 있다.

4.1.2. 구현

추가 바람…

4.2. word2vec 개선 2

이번에는 은닉층 이후의 행렬 곱과 Softmax 계층 계산을 개선해보자. 네거티브 샘플링(부정적 샘플링)이라는 기법을 Softmax 대신 사용하면 단어가 많아져도 계산 비용을 줄일 수 있다.

4.2.1. 은닉층 이후 계산의 문제점

다시 한 번 단어가 100만개고, 은닉층 크기가 100인 문제를 생각해보자. 처음 입력층과 가중치가 곱해지는 연산은 Embedding을 통해 계산 비용을 덜 수 있었다.

하지만 그 이후에는 100개의 뉴런과 다시 (100x100만)의 크기를 가진 가중치 행렬과의 곱을 계산해야한다. (출력층에서 100만개에 대한 점수를 나타내야하기 때문) 그리고, 이 은닉층 뉴런들과 가중치 행렬과의 곱으로 나온 100만 개의 출력층에 대해 Softmax계층을 계산하는 데에서도 많은 계산 비용을 소모해야한다. (어휘가 많아지면 당연히도 Softmax의 계산량도 많아진다.)

4.2.2. 다중 분류에서 이진 분류로

댓글남기기