부스트캠프 week6 day1 추가학습

Dae Hee Lee·2021년 9월 6일
0

BoostCamp_NLP

목록 보기
2/14
post-thumbnail

1. Word2Vec

일반적으로, 단어를 Bag-of-Words로 표현하고 원핫 벡터로 표현하게 된다면 단어 간 유사도를 계산할 수 없다. 따라서, 단어 간 유사도를 계산하여 단어의 의미를 벡터화할 수 있는 방법으로 나온 것이 바로 Word2Vec이다.

여기에서는 Word2Vec을 이용한 단어 사이의 관계를 직접 알아볼 수 있다.

희소 표현

원-핫 벡터들은 표현하고자 하는 단어의 인덱스의 값만 1이고, 나머지 인덱스에는 전부 0으로 표현되는 벡터 표현 방법이다. 이렇게 벡터 또는 행렬(matrix)의 값이 대부분이 0으로 표현되는 방법을 희소 표현(sparse representation)이라고 한다.

하지만 이러한 표현 방법은 단어간 유사성을 표현할 수 없다는 단점이 있고, 이를 위한 대안으로 단어의 '의미'를 다차원 공간에 벡터화하는 방법을 찾게되는데, 이러한 표현 방법을 분산 표현(distributed representation)이라고 한다. 그리고 이렇게 분산 표현을 이용하여 단어의 유사도를 벡터화하는 작업은 워드 임베딩(embedding) 작업에 속하기 때문에 이렇게 표현된 벡터 또한 임베딩 벡터(embedding vector)라고 하며, 밀집 벡터(dense vector)에도 속한다.

분산 표현

분산 표현(distributed representation) 방법은 기본적으로 분포 가설(distributional hypothesis)이라는 가정 하에 만들어진 표현 방법이다. 이 가정은 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'라는 가정이다. 강아지란 단어는 귀엽다, 예쁘다, 애교 등의 단어가 주로 함께 등장하는데 분포 가설에 따라서 저런 내용을 가진 텍스트를 벡터화한다면 저 단어들은 의미적으로 가까운 단어가 된다.

이렇게 표현된 벡터들은 원-핫 벡터처럼 벡터의 차원이 단어 집합(vocabulary)의 크기일 필요가 없으므로, 벡터의 차원이 상대적으로 저차원으로 줄어든다.

예를 들어 단어가 10,000개 있고 인덱스가 1부터 시작한다고 하였을 때 강아지란 단어의 인덱스는 5였다면 강아지란 단어를 표현하는 원-핫 벡터는 다음과 같다.

Ex) 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0]

하지만 Word2Vec로 임베딩 된 벡터는 굳이 벡터의 차원이 단어 집합의 크기가 될 필요가 없다. 강아지란 단어를 표현하기 위해 사용자가 설정한 차원을 가지는 벡터가 되면서 각 차원은 실수형의 값을 가진다.

Ex) 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]

요약하면 희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현한다. 이런 표현 방법을 사용하면 단어 간 유사도를 계산할 수 있다.

CBOW(Continuous Bag of Words)

예문 : "The fat cat sat on the mat"

주변 단어로부터 가운데 단어를 예측하는 것이 CBOW 이다. {"The", "fat", "cat", "on", "the", "mat"}으로부터 sat을 예측하는 것은 CBOW가 하는 일이다. 이 때 예측해야하는 단어 sat을 중심 단어(center word)라고 하고, 예측에 사용되는 단어들을 주변 단어(context word)라고 한다.

중심 단어를 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정했다면 이 범위를 윈도우(window)라고 한다. 예를 들어서 윈도우 크기가 2이고, 예측하고자 하는 중심 단어가 sat이라고 한다면 앞의 두 단어인 fat와 cat, 그리고 뒤의 두 단어인 on, the를 참고한다.

윈도우 크기를 정했다면, 윈도우를 계속 움직여서 주변 단어와 중심 단어 선택을 바꿔가며 학습을 위한 데이터 셋을 만들 수 있는데, 이 방법을 슬라이딩 윈도우(sliding window)라고 한다.

위 그림에서 좌측의 중심 단어와 주변 단어의 변화는 윈도우 크기가 2일때, 슬라이딩 윈도우가 어떤 식으로 이루어지면서 데이터 셋을 만드는지 보여준다. 또한 Word2Vec에서 입력은 모두 원-핫 벡터가 되어야 하는데, 우측 그림은 중심 단어와 주변 단어를 어떻게 선택했을 때에 따라서 각각 어떤 원-핫 벡터가 되는지를 보여준다. 위 그림은 결국 CBOW를 위한 전체 데이터 셋을 보여주는 것이다.

CBOW의 인공 신경망을 간단히 도식화하면 위와 같다. 입력층(Input layer)의 입력으로서 앞, 뒤로 사용자가 정한 윈도우 크기 범위 안에 있는 주변 단어들의 원-핫 벡터가 들어가게 되고, 출력층(Output layer)에서 예측하고자 하는 중간 단어의 원-핫 벡터가 필요하다.

또한 위 그림에서 알 수 있는 사실은, Word2Vec은 딥 러닝 모델(Deep Learning Model)은 아니라는 점이다. 보통 딥 러닝이라함은, 입력층과 출력층 사이의 은닉층의 개수가 충분히 쌓인 신경망을 학습할 때를 말하는데 Word2Vec는 입력층과 출력층 사이에 하나의 은닉층만이 존재한다. 이렇게 은닉층(hidden Layer)이 1개인 경우에는 일반적으로 심층신경망(Deep Neural Network)이 아니라 얕은신경망(Shallow Neural Network)이라고 부른다. 또한 Word2Vec의 은닉층은 일반적인 은닉층과는 달리 활성화 함수가 존재하지 않으며 룩업 테이블이라는 연산을 담당하는 층으로 일반적인 은닉층과 구분하기 위해 투사층(projection layer)이라고 부르기도 한다.

이 그림에서 주목해야할 것은 두 가지이다. 하나는 투사층의 크기가 M이라는 점이다. CBOW에서 투사층의 크기 M은 임베딩하고 난 벡터의 차원이 된다. 다시 말해, 위의 그림에서 투사층의 크기는 M=5이기 때문에 CBOW를 수행하고나서 얻는 각 단어의 임베딩 벡터의 차원은 5가 될 것이다.

두번째는 입력층과 투사층 사이의 가중치 W는 V × M 행렬이며, 투사층에서 출력층사이의 가중치 W'는 M × V 행렬이라는 점이다. 여기서 V는 단어 집합의 크기를 의미한다. 즉, 위의 그림처럼 원-핫 벡터의 차원이 7이고, M은 5라면 가중치 W는 7 × 5 행렬이고, W'는 5 × 7 행렬이 될 것이다. 주의할 점은 이 두 행렬은 동일한 행렬을 전치(transpose)한 것이 아니라, 서로 다른 행렬이라는 점이다. 인공 신경망의 훈련 전에 이 가중치 행렬 W와 W'는 대게 굉장히 작은 랜덤 값을 가지게 된다. CBOW는 주변 단어로 중심 단어를 더 정확히 맞추기 위해 계속해서 이 W와 W'를 학습해가는 구조이다.

위 그림에서는 각 주변 단어의 원-핫 벡터를 xx로 표기했다. 입력 벡터는 원-핫 벡터이다. i번째 인덱스에 1이라는 값을 가지고 그 외의 0의 값을 가지는 입력 벡터와 가중치 W 행렬의 곱은 사실 W행렬의 i번째 행을 그대로 읽어오는 것과(lookup) 동일하다. 그래서 이 작업을 룩업 테이블(lookup table)이라고 부른다. 여기서 lookup해온 W의 각 행벡터가 Word2Vec을 수행한 후의 각 단어의 M차원의 크기를 갖는 임베딩 벡터들이다.

이렇게 각 주변 단어의 원-핫 벡터에 대해서 가중치 W가 곱해서 생겨진 결과 벡터들은 투사층에서 만나 이 벡터들의 평균인 벡터를 구하게 된다. 만약 윈도우 크기 n=2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터로 사용된다. 그렇기 때문에 평균을 구할 때는 4개의 결과 벡터에 대해서 평균을 구하게 된다. 투사층에서 벡터의 평균을 구하는 부분은 CBOW가 Skip-Gram과 다른 차이점이기도 하다.

이렇게 구해진 평균 벡터는 두번째 가중치 행렬 W'와 곱해진다. 곱셈의 결과로는 원-핫 벡터들과 차원이 V로 동일한 벡터가 나온다.

이 벡터에 CBOW는 소프트맥스(softmax) 함수를 취하는데, 소프트맥스 함수로 인한 출력값은 0과 1사이의 실수로, 각 원소의 총 합은 1이 되는 상태로 바뀐다. 이렇게 나온 벡터를 스코어 벡터(score vector)라고 한다. 스코어 벡터의 각 차원 안에서의 값이 의미하는 것은 아래와 같다.

스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률을 나타낸다. 그리고 이 스코어 벡터는 우리가 실제로 값을 알고있는 벡터인 중심 단어 원-핫 벡터의 값에 가까워져야 한다. 스코어 벡터를 y^\hat{y}라고 하고 중심 단어를 yy로 했을 때, 이 두 벡터값의 오차를 줄이기위해 CBOW는 손실 함수(loss function)로 cross-entropy 함수를 사용한다. cross-entropy 함수에 실제 중심 단어인 원-핫 벡터와 스코어 벡터를 입력값으로 넣고, 이를 식으로 표현하면 아래와 같다.

H(y^,y)=j=1Vyjlog(y^j)H(\hat{y}, y)=-\sum_{j=1}^{|V|} y_{j} \log \left(\hat{y}_{j}\right)

그런데 y\mathrm{y} 가 원-핫 벡터라는 점을 고려하면, 이 식은 아래와 같이 간소화시킬 수 있다.

H(y^,y)=yilog(y^i)H(\hat{y}, y)=-y_{i} \log \left(\hat{y}_{i}\right)

c\mathrm{c} 를 중심 단어에서 1 을 가진 차원의 값의 인덱스라고 한다면, y^c=1\hat{y}_{c}=1y^\hat{y}yy 를 정확하게 예측한 경우가 된다. 이를 식에 대입해보면 1log(1)=0-1 \log (1)=0 이 되기 때문에, 결과적으로 y^\hat{y}yy 를 정확하게 예측한 경우의 cross-entropy의 값은 0 이 된다. 즉,

H(y^,y)=j=1Vyjlog(y^j)H(\hat{y}, y)=-\sum_{j=1}^{|V|} y_{j} \log \left(\hat{y}_{j}\right) \quad

이 값을 최소화하는 방향으로 학습해야 한다.
이제 역전파(Back Propagation) 를 수행하면 W\mathrm{W}W\mathrm{W}^{\prime} 가 학습이 되는데, 학습이 다 되었다면 M\mathrm{M} 차원의 크기를 갖는 W\mathrm{W} 의 행이나 W\mathrm{W}^{\prime} 의 열로부터 어떤 것을 임베딩 벡터로 사용할지를 결정하면 된다. 때로는 W\mathrm{W}W\mathrm{W}^{\prime}평균치를 가지고 임베딩 벡터를 선택하기도 한다.

Skip-gram

Skip-gram은 CBOW를 이해했다면 메커니즘 자체는 동일하므로 쉽게 이해할 수 있다. 앞서 CBOW에서는 주변 단어를 통해 중심 단어를 예측했다면, Skip-gram은 중심 단어에서 주변 단어를 예측한다. 앞서 언급한 예문에 대해서 동일하게 윈도우 크기가 2일 때, 데이터셋은 다음과 같이 구성된다. 전반적으로 Skip-gram이 CBOW보다 성능이 좋다고 알려져 있다.

2. GloVe

논문
Standford- GloVe
글로브
글로브2

1. 기존 방법론에 대한 비판

기존의 방법론 중 하나인 LSA는 DTM이나 TF-IDF 행렬과 같이 각 문서에서의 각 단어의 빈도수를 카운트 한 행렬이라는 전체적인 통계 정보를 입력으로 받아 차원을 축소(Truncated SVD)하여 잠재된 의미를 끌어내는 방법론이다. 반면, Word2Vec는 실제값과 예측값에 대한 오차를 손실 함수를 통해 줄여나가며 학습하는 예측 기반의 방법론이다. 서로 다른 방법을 사용하는 이 두 방법론은 각각 장, 단점이 있다.

LSA는 카운트 기반으로 코퍼스의 전체적인 통계 정보를 고려하기는 하지만, 왕:남자 = 여왕:? (정답은 여자)와 같은 단어 의미의 유추 작업(Analogy task)에는 성능이 떨어진다. Word2Vec는 예측 기반으로 단어 간 유추 작업에는 LSA보다 뛰어나지만, 임베딩 벡터가 윈도우 크기 내에서만 주변 단어를 고려하기 때문에 코퍼스의 전체적인 통계 정보를 반영하지 못한다. GloVe는 이러한 기존 방법론들의 각각의 한계를 지적하며, LSA의 메커니즘이었던 카운트 기반의 방법과 Word2Vec의 메커니즘이었던 예측 기반의 방법론 두 가지를 모두 사용한다.

2. 윈도우 기반 동시 등장 행렬(Window based Co-occurrence Matrix)

단어의 동시 등장 행렬은 행과 열을 전체 단어 집합의 단어들로 구성하고, i 단어의 윈도우 크기(Window Size) 내에서 k 단어가 등장한 횟수를 i행 k열에 기재한 행렬을 말한다. 예제를 보자.

Ex)
I like deep learning
I like NLP
I enjoy flying

윈도우 크기가 N일 때는 좌, 우 각각에 존재하는 N개의 단어만 참고하게 된다. 윈도우 크기가 1일 때, 위의 텍스트를 가지고 구성한 동시 등장 행렬은 다음과 같다.

위 행렬은 행렬을 전치(Transpose)해도 동일한 행렬이 된다는 특징이 있다. 그 이유는 i 단어의 윈도우 크기 내에서 k 단어가 등장한 빈도는 반대로 k 단어의 윈도우 크기 내에서 i 단어가 등장한 빈도와 동일하기 때문이다.

3.동시 등장 확률(Co-occurrence Probability)

동시 등장 확률 P(ki)P(k|i)는 동시 등장 행렬로부터 특정 단어 i의 전체 등장 횟수를 카운트하고, 특정 단어 i가 등장했을 때 어떤 단어 k가 등장한 횟수를 카운트하여 계산한 조건부 확률이다.

P(ki)P(k|i)에서 i를 중심 단어(Center Word), k를 주변 단어(Context Word)라고 했을 때, 위에서 배운 동시 등장 행렬에서 중심 단어 i의 행의 모든 값을 더한 값을 분모로 하고 i행 k열의 값을 분자로 한 값이라고 볼 수 있다. 다음은 GloVe의 제안 논문에서 가져온 동시 등장 확률을 표로 정리한 하나의 예다.

위의 표를 통해 알 수 있는 사실은 ice가 등장했을 때 solid가 등장할 확률 0.00019은 steam이 등장했을 때 solid가 등장할 확률인 0.000022보다 약 8.9배 크다는 것이다. 그도 그럴 것이 solid는 '단단한'이라는 의미를 가졌으니까 '증기'라는 의미를 가지는 steam보다는 당연히 '얼음'이라는 의미를 가지는 ice라는 단어와 더 자주 등장할 것이다. 이는 x값에 따라 완전히 달라질 수 있는 값이 되고, 이러한 형태를 동시 등장 확률이라고 부른다.

4. 손실 함수(Loss function)

먼저 핵심 용어를 정리해보자.

  • XX : 동시 등장 행렬(Co-occurrence Matrix)
  • XijX_{i j} : 중심 단어 i가 등장했을 때 윈도우 내 주변 단어 j\mathrm{j} 가 등장하는 횟수
  • Xi:jXij:X_{i}: \sum_{j} X_{i j}: 동시 등장 행렬에서 i행의 값을 모두 더한 값
  • Pik:P(ki)=XikXi:P_{i k}: P(k \mid i)=\frac{X_{i k}}{X_{i}}: 중심 단어 i가 등장했을 때 윈도우 내 주변 단어 kk 가 등장할 확률
  • PikPjk:Pik\frac{P_{i k}}{P_{j k}}: P_{i k}PjkP_{j k} 로 나눠준 값
    Ex) P(P( solid \mid ice )/P() / P( solid \mid steam )=8.9)=8.9
  • wiw_{i} : 중심 단어 i의 임베딩 벡터
  • w~k:\tilde{w}_{k}: 주변 단어 k\mathrm{k} 의 임베딩 벡터

GloVe의 아이디어를 한 줄로 요약하면 '임베딩 된 중심 단어와 주변 단어 벡터의 내적이 전체 코퍼스에서의 동시 등장 확률이 되도록 만드는 것'이다. 즉, 이를 만족하도록 임베딩 벡터를 만드는 것이 목표이다. 이를 식으로 표현하면 다음과 같다.

dotproduct(wiw~k)P(ki)=Pik\operatorname{dot} \operatorname{product}\left(w_{i} \tilde{w}_{k}\right) \approx P(k \mid i)=P_{i k}

뒤에서 보게되겠지만, 더 정확히는 GloVe는 아래와 같은 관계를 가지도록 임베딩 벡터를 설계한다.

dotproduct(wiw~k)logP(ki)=logPik\operatorname{dot} \operatorname{product}\left(w_{i} \tilde{w}_{k}\right) \approx \log P(k \mid i)=\log P_{i k}

임베딩 벡터들을 만들기 위한 손실 함수를 처음부터 차근차근 설계해보자. 가장 중요한 것은 단어 간의 관계를 잘 표현하는 함수여야 한다는 것이다. 이를 위해 앞서 배운 개념인 Pik/PjkP_{i k} / P_{j k} 를 식에 사용한다. GloVe의 연구진들은 벡터 wi,wj,w~kw_{i}, w_{j}, \tilde{w}_{k} 를 가지고 어떤 함수 FF 를 수행하면, Pik/PjkP_{i k} / P_{j k} 가 나온다 는 초기 식으로부터 전개를 시작한다.

F(wi,wj,w~k)=PikPjkF\left(w_{i}, w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}

아직 이 함수 FF 가 어떤 식을 가지고 있는지는 정해진 게 없다. 위의 목적에 맞게 근사할 수 있는 함수식은 무수히 많겠으나 최적의 식에 다가가기 위해서 차근, 차근 디테일을 추가해보겠다. 함수 FF 는 두 단어 사이의 동시 등장 확률의 크기 관계 비(ratio) 정보를 벡터 공간에 인코딩하는 것이 목적이다. 이 를 위해 GloVe 연구진들은 wiw_{i}wjw_{j} 라는 두 벡터의 차이를 함수 FF 의 입력으로 사용하는 것을 제안한다.

F(wiwj,w~k)=PikPjkF\left(w_{i}-w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}

그런데 우변은 스칼라값이고 좌변은 벡터값이다. 이를 성립하기 해주기 위해서 함수 FF 의 두 입력에 내적(Dot product)을 수행한다.

F((wiwj)Tw~k)=PikPjkF\left(\left(w_{i}-w_{j}\right)^{T} \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}}

정리하면, 선형 공간(Linear space)에서 단어의 의미 관계를 표현하기 위해 뺄셈과 내적을 택했다.
여기서 함수 FF 가 만족해야 할 필수 조건이 있다. 중심 단어 ww 와 주변 단어 w~\tilde{w} 라는 선택 기준은 실제로는 무작위 선택이므로 이 둘의 관계는 자유롭게 교환될 수 있도록 해야한다. 이것이 성립되게 하기 위해서 GloVe 연구진은 함수 FF 가 실수의 덧셈과 양수의 곱셈에 대해서 준동형(Homomorphism)을 만족하도록 한다. 즉, aabb 에 대해서 함수 FFF(a+b)F(a+b)F(a)F(b)F(a) F(b) 와 같도록 만족시켜야 한다는 의미이다.(Log함수이기 때문에 덧셈이 곱셈으로 변한다.)

F(a+b)=F(a)F(b),a,bRF(a+b)=F(a) F(b), \forall a, b \in \mathbb{R}

전개하던 GloVe 식에 따르면, 함수 FF 는 결과값으로 스칼라 값 (PikPjk)\left(\frac{P_{i k}}{P_{j k}}\right) 이 나와야 한다. 준동형식에서 aabb 가 각각 벡터값이라면 함수 FF 의 결과값으로는 스칼라 값이 나올 수 없지만, aabb 가 각각 사실 두 벡터의 내적값이라고 하면 결과값으로 스칼라 값이 나올 수 있다. 그러므로 위의 준동형식을 아래와 같이 바꿔볼 수 있다. 여기서 v1,v2,v3,v4v_{1}, v_{2}, v_{3}, v_{4} 는 각각 벡터값이다. 아래의 VV 는 벡터를 의미한다.

F(v1Tv2+v3Tv4)=F(v1Tv2)F(v3Tv4),v1,v2,v3,v4VF\left(v_{1}^{T} v_{2}+v_{3}^{T} v_{4}\right)=F\left(v_{1}^{T} v_{2}\right) F\left(v_{3}^{T} v_{4}\right), \forall v_{1}, v_{2}, v_{3}, v_{4} \in V

그런데 앞서 작성한 Glove 식에서는 wiw_{i}wjw_{j} 라는 두 벡터의 차이를 함수 FF 의 입력으로 받았다. GloVe 식에 바로 적용을 위해 준동형 식을 뺄셈에 대한 준동형식으로 변경한다. 그렇게 되면 곱셈도 나눗셈으로 바뀐다.

F(v1Tv2v3Tv4)=F(v1Tv2)F(v3Tv4),v1,v2,v3,v4VF\left(v_{1}^{T} v_{2}-v_{3}^{T} v_{4}\right)=\frac{F\left(v_{1}^{T} v_{2}\right)}{F\left(v_{3}^{T} v_{4}\right)}, \forall v_{1}, v_{2}, v_{3}, v_{4} \in V

이제 이 준동형 식을 Glove 식에 적용해보자.

F((wiwj)Tw~k)=F(wiTw~k)F(wjTw~k)F\left(\left(w_{i}-w_{j}\right)^{T} \tilde{w}_{k}\right)=\frac{F\left(w_{i}^{T} \tilde{w}_{k}\right)}{F\left(w_{j}^{T} \tilde{w}_{k}\right)}

그런데 이전의 식에 따르면 우변은 본래 PikPjk\frac{P_{i k}}{P_{j k}} 였으므로, 결과적으로 다음과 같다.

PikPjk=F(wiTw~k)F(wjTw~k)F(wiTw~k)=Pik=XikXi\begin{gathered} \frac{P_{i k}}{P_{j k}}=\frac{F\left(w_{i}^{T} \tilde{w}_{k}\right)}{F\left(w_{j}^{T} \tilde{w}_{k}\right)} \\ F\left(w_{i}^{T} \tilde{w}_{k}\right)=P_{i k}=\frac{X_{i k}}{X_{i}} \end{gathered}

좌변을 풀어쓰면 다음과 같다.

F(wiTw~kwjTw~k)=F(wiTw~k)F(wjTw~k)F\left(w_{i}^{T} \tilde{w}_{k}-w_{j}^{T} \tilde{w}_{k}\right)=\frac{F\left(w_{i}^{T} \tilde{w}_{k}\right)}{F\left(w_{j}^{T} \tilde{w}_{k}\right)}

이는 뺄셈에 대한 준동형식의 형태와 정확히 일치한다. 이제 이를 만족하는 함수 FF 를 찾아야 한다. 그리고 이를 정확하게 만족시키는 함수가 있는 데 바로 지수 함수(Exponential function)이다. FF 를 지수 함수 expe x p 라고 가정하자.

exp(wiTw~kwjTw~k)=exp(wiTw~k)exp(wjTw~k)exp(wiTw~k)=Pik=XikXi\begin{gathered} \exp \left(w_{i}^{T} \tilde{w}_{k}-w_{j}^{T} \tilde{w}_{k}\right)=\frac{\exp \left(w_{i}^{T} \tilde{w}_{k}\right)}{\exp \left(w_{j}^{T} \tilde{w}_{k}\right)} \\ \exp \left(w_{i}^{T} \tilde{w}_{k}\right)=P_{i k}=\frac{X_{i k}}{X_{i}} \end{gathered}

위의 두번째 식으로부터 다음과 같은 식을 얻을 수 있다.

wiTw~k=logPik=log(XikXi)=logXiklogXiw_{i}^{T} \tilde{w}_{k}=\log P_{i k}=\log \left(\frac{X_{i k}}{X_{i}}\right)=\log X_{i k}-\log X_{i}

그런데 여기서 상기해야할 것은 앞서 언급했듯이, 사실 wiw_{i}w~k\tilde{w}_{k} 는 두 값의 위치를 서로 바꾸어도 식이 성립해야한다. XikX_{i k} 의 정의를 생각해보면 XkiX_{k i} 와도 같다. 그런데 이게 성립되려면 위의 식에서 logXi\log X_{i} 항이 걸림돌이다. 이 부분만 없다면 이를 성립시킬 수 있다. 그래서 GloVe 연구팀은 이 logXi\log X_{i} 항을 wiw_{i} 에 대한 편향 bib_{i} 라는 상수항으로 대체하기로 한다. 같은 이유로 w~k\tilde{w}_{k} 에 대한 편향 bk~\tilde{b_{k}} 를 추가한다.

wiTw~k+bi+bk~=logXikw_{i}^{T} \tilde{w}_{k}+b_{i}+\tilde{b_{k}}=\log X_{i k}

이 식이 손실 함수의 핵심이 되는 식이다. 우변의 값과의 차이를 최소화는 방향으로 좌변의 4 개의 항은 학습을 통해 값이 바뀌는 변수들이 된다. 즉, 손실 함수는 다음과 같이 일반화될 수 있다.

 Loss function =m,n=1V(wmTw~n+bm+bn~logXmn)2\text { Loss function }=\sum_{m, n=1}^{V}\left(w_{m}^{T} \tilde{w}_{n}+b_{m}+\tilde{b_{n}}-\log X_{m n}\right)^{2}

여기서 VV 는 단어 집합의 크기를 의미한다. 그런데 아직 최적의 손실 함수라기에는 부족하다. GloVe 연구진은 logXik\log X_{i k} 에서 XikX_{i k} 값이 0 이 될 수 있음을 지적한다. 대안 중 하나는 logXik\log X_{i k} 항을 log(1+Xik)\log \left(1+X_{i k}\right) 로 변경하는 것이다. 하지만 이렇게 해도 여전히 해결되지 않는 문제가 있다.

바로 동시 등장 행렬 XX 는 마치 DTM(Document Term Matrix)처럼 희소 행렬(Sparse Matrix)일 가능성이 다분하다는 점이다. 동시 등장 행렬 XX 에는 많은 값이 0 이거나, 동시 등장 빈도가 적어서 많은 값이 작은 수치를 가지는 경우가 많다. GloVe의 연구진은 동시 등장 행렬에서 동시 등장 빈도의 값 XikX_{i k} 이 굉장히 낮은 경우에는 정보에 거의 도움이 되지 않는다고 판단한다. 그래서 이에 대한 가중치를 주는 고민을 하게 되는데 GloVe 연구팀이 선택한 것은 바로 XikX_{i k} 의 값에 영향을 받는 가중치 함수(Weighting function) f(Xik)f\left(X_{i k}\right) 를 손실 함수에 도입하는 것이다.
GloVe에 도입되는 f(Xik)f\left(X_{i k}\right) 의 그래프를 보자.

XikX_{i k} 의 값이 작으면 상대적으로 함수의 값은 작도록 하고, 값이 크면 함수의 값은 상대적으로 크도록 한다. 하지만 XikX_{i k} 가 지나치게 높다고해서 지나친 가중치를 주지 않기위해서 또한 함수의 최대값이 정해져 있다. (최대값 1) 예를 들어 'It is'와 같은 불용어의 동시 등장 빈도수가 높다고해서 지나친 가중 을 받아서는 안 된다. 이 함수의 값을 손실 함수에 곱해주면 가중치의 역할을 할 수 있다.
이 함수 f(x)f(x) 의 식은 다음과 같이 정의된다.

f(x)=min(1,(x/xmax)3/4)f(x)=\min \left(1,\left(x / x_{\max }\right)^{3 / 4}\right)

최종적으로 다음과 같은 일반화 된 손실 함수를 얻어낼 수 있다.

 Loss function =m,n=1Vf(Xmn)(wmTw~n+bm+bn~logXmn)2\text { Loss function }=\sum_{m, n=1}^{V} f\left(X_{m n}\right)\left(w_{m}^{T} \tilde{w}_{n}+b_{m}+\tilde{b_{n}}-\log X_{m n}\right)^{2}

3. Negative Sampling

Negative sampling
Word2vec과 negative Sampling

profile
Today is the day

0개의 댓글