본문 바로가기
Study/NLP

Stanford CS224n - Lecture 1 Introduction and Word Vector

by GodKim 2021. 7. 10.

이 글은 https://youtu.be/8rXD5-xhemo 강의를 듣고 제가 더 편하게 이해하기 위해 정리한 글입니다. 혹시 제가 잘못 이해한 부분이 있다면 댓글로 친절히 알려주시면 감사하겠습니다!


1. Human Language

 인간의 언어는 인류 등장 10만년의 시간을 생각하면 생각보다 근래의 발명된 것으로 볼 수 있다. 인간의 언어는 의사소통의 수단으로 다른 동물들처럼 뿔을 만든다던지, 발톱을 발달시키지 않고 인류는 의사소통을 하나의 생존 수단으로 발전 시켜 지금까지의 발전을 이룩했다. 이런 언어는 몇 가지 신기한 특징을 지니고 있다. (물론 신기한건 내 기준!)

 

  • 인간의 언어는 아주 큰 컴퓨터 네트워크와 비슷하다
  • 하지만 빠른 것이 무엇보다 중요한 네트워크와는 다르게 인간의 언어는 느리다...
  • 인간의 언어가 느리더라도 지금까지 끊임없이 사용되는 이유는 효율적이기 때문이다. (가성비 ㅆㅅㅌㅊ~~)
    • 예를 들어, 내가 이 글을 읽는 여러분에게 "상상해보세요, 쇼핑몰, 안내 데스크와 안내원 2명, 많은 사람" 이렇게만 말해도 여러분은 각각 지니고 있는 지식을 가지고 수 많은 종류의 쇼핑몰을 떠올릴 것이다. 정보가 전달되는 시간과 이를 기반으로 여러분이 결과물을 떠올리기까지의 시간은 현대의 기술보다는 훨씬 느리지만 그에 비해 생성되는 결과물의 다양성과 그 구체성은 아주 높다는 것이다.

 정보전달의 수단인 언어, 그 언어를 구성하는 문장, 단어들은 각각 의미를 지니고 있다. 이런 단어들의 의미를 파악해서 우리는 상대방과 원할하게 의사소통을 진행할수 있는 것이다. 이때, '의미'는 무엇을 뜻할까? 

 

2. Word Net

 Word Net을 이해하기 전에 알고 넘어갈 것이 표시 의미론(Denotational Semantics)이다.

 표시 의미론은 쉽게 얘기해 단어가 표상하는 것이 의미라는 것이다. 오케이 내가 쓰고도 쉽지 않다고 느껴지는 데 쉽게 그림으로 설명하겠다.

 

이런 생각을 기반으로 표시 의미론은 컴퓨터 용어로 주로 사용되어왔다. 그 중 단어의 의미를 나타내기 위해서 고안된 것이 Word Net이다. 

 Word Net은 유의어와 상의어를 가진 거대한 전자 사전이다. 단어들의 의미를 유의어들과 그와 상반된는 상의어들로 컴퓨터 상에서 나타낼 수 있다는 생각으로 만들어진 것이다. 하지만 Word Net은 여러 문제점이 존재한다.

 

  • 유의어와 상의어로만 표현하다보니 단어 자체의 뉘앙스를 놓치는 경우가 많다.
  • 단어는 생산성이 아주 높기에 WordNet으로 모든 의미를 나타낼 수 없다. (+ 사람이 직접 추가하는 것이기에 노동력도 많이 든다.)
  • 주관적이다.
  • 단어간의 유사도(관계)를 파악하기 힘들다.

3. One-hot Vector

 원-핫 벡터는 전통 NLP에서 사용되던 방법으로, 단어를 0과 1로 구성된 벡터로 표현하는 것이다. 영상에서 사용한 예시를 보면 아래와 같이 표현되어있다.

hotel = [000000010000000]
motel = [000000000010000]

 이는 단어를 독립적인 요소로 보지않고 지엽적인 표현(localist representation)으로 본것에 기반한 것이다. 요컨대, 문장에서 표현하고자 하는 단어가 나타나는 위지(localist)에 따라 벡터 값 1을 부여하고 그 외에는 0을 부여하는 방식으로 표현한 것이다. 하지만 원-핫 벡터도 두 가지 큰 문제가 있다. 

  • 단어는 생산성이 아주 높아 무한하기에 이 모든 단어를 표현하기에 벡터의 차원 문제가 있다.
    • 무한한 단어에 맞추어 무한한 단어 공간(벡터)가 필요하기에 사실상 모든 단어를 표현하기엔 불가능
  • 단어간의 유사도를 표현하기 힘들다.
    • Word Net과 함께 단어간의 유사도를 표현하려했지만 모든 단어쌍에 대한 유사성을 표현하려면 끝도없이 커져 표현이 어렵다.

4. Word Vector

 위의 문제점들을 해결하고자 제시된 방법이 Word Vector이다. 이 방법은 표시 의미론과는 다른 분산 의미론(Distributional Semantics)에서 나타났다. 분산 의미론은 단어의 의미를 문맥을 통해 파악한다는 개념이다. 즉, 단어를 안다는 것은 단어가 무엇을 나타내기 보다는 어떠한 문맥에서 사용될 수 있는지 아는 것이 기준이된다는 주장이다. 

 예컨대, 영상의 나온 단어인 'banking'의 의미를 파악하기 위해선 'banking'이라는 단어가 나타난 다량의 문장을 모아 미리 설정한 개수만큼 'banking'의 주변 단어들을 통해 'banking'의 의미를 알아내는 것이다. 

 이때 distrbuted representation(분산 표현)이라는 개념이 등장한다. 더 이상, 지엽적인 요소(localist representation)에 따라 0과 1로 표현하는 것이 아닌 -1에서 1 값을 정해진 차원으로 표현하는 것이다. 최소 50개의 차원이 사용되며 50만이 넘지는 않는다고 한다. 이를 벡터 공간에 투영하면 비슷한 단어끼리 묶이는 것을 확인할 수 있으며 단어간의 유사성 또한 표현이 가능하다. 이론적인 것에 대한 더 구체적인 내용은 아래의 글을 확인하면 좋을 것이다.

https://godcode.tistory.com/22?category=908926 

 

자연어 처리의 꽃! - 워드 투 벡터(Word2Vec)

워드 투 벡터 (Word2vec) 1. 배경  기존의 단어 임베딩 방식은 원핫 인코딩(One-hot encoding)을 사용해왔다. 원핫 인코딩에 대한 설명은 아래의 게시글을 읽어보길 바란다. https://godcode.tistory.com/9?categ..

godcode.tistory.com

4.1. Word2Vec Algorithm

공대 수업답게 워드투벡 후반부에는 문과인 내가 고도의 집중력을 요하는 수식 해설이 주를 이루었다. 일단 차근 차근 내가 이해한 것을 정리해보도록 하겠다.

  1. 거대한 코퍼스 필요
  2. 코퍼스의 모든 단어에 random vector을 부여
  3. 중심 단어(c)와 주변(문맥) 단어(o)를 파악
  4. c과 나왔을 때 o가 나올 확률을 계산(Skip-Gram 방식)
  5. 4의 확률이 커질 수 있도록 단어 vector를 조정

위는 워드투벡 알고리즘이 진행되는 순서이다. 해당 수업에서는 skip-gram을 기반으로 설명을 진행하고 있었다. 이 반대 방식은 CBOW는 위에 링크를 보면 알 수 있다.

 

4.2. 수식

 

우도에 관한 수식(θ는 단어를 vector로 나타낸 파라미터)

  1. T는 전체 코퍼스의 크기를 나타내며 1부터 T까지 진행된다는 것을 의미한다.
  2. 설정한 window size(m)만큼 문맥 단어(o)를 파악한다.
  3. 중심단어(c)를 통해 문맥단어(o)가 나올 확률

 즉, 모든 단어(T)에 대해 fixed size window(m)의 단어(j)만큼 주변 단어의 확률을 곱하면 우도가 산출된다.

 

손실함수 수식

  1. 음수가 됨으로 J(θ)가 최소화할 수록 모델이 좋다는 것을 알 수 있다.
  2. 크기에 대한 의존을 줄이기 위해 평균을 내주어 scale을 줄여준다.
  3. 곱셈을 덧셈을 바꾸기위한 log 부여(최적화할때 log를 부여하면 더 좋은 결과를 낼 수 있다.)

 손실함수를 최소화해주는 것이 더 정확히 중심단어를 예측할 수 있게 해주는 것이다. 해당 수식에서 제일 마지막 확률을 구하는 부분을 보면 우도의 3번과 동일하다. 그럼 해당 수식은 어떻게 계산할까?

 단어 W에 대해 2개의 벡터 값을 부여하는 것이 그 방법이다. 2개의 벡터 값으로는 W가 중심단어(c)일때의 벡터값과, 문맥단어(o)일때의 벡터값이다. 이를 수식으로 나타내면 아래와 같다.

  1. 내적으로 o와 c의 유사도를 비교한다.
  2. 확률 분포를 위해 전체 단어에 대해 정규화를 진행한다.

 해당 수식은 중심단어가 나왔을 때 주변 단어가 나올 확률로 Softmax 함수와 상당히 유사한 것을 확인할 수 있다. Softmax 함수는 큰 확률을 더 크게 만들고(max) 동시에 여전히 작은 확률에 대해서 약간의 확률을 할당(soft)하기에 softmax라고 불린다. 요컨데, 임의이 값 Xi에 대해 확률분포 값 Pi를 출력하는 것이다.

 

 우도, 손실함수, 확률 계산법까지 알았으니 목표인 손실함수 최소화해야한다. 해당 과정을 최적화(optimization)라고 한다. J(θ)를 최소화하기 위해선 θ(word vectors)를 조정하며 최솟값을 산출해야한다. 

  1. 실제 문맥 단어
  2. 예측된 문맥 단어

 1과 2의 차이가 작을 수록 모델의 성능이 높아지는 것이기에 이를 위한 방향성을 제시할 수 있는 수식이 완성된 것이다. 이때 중요한점은 θ는 두 가지의 벡터값을 지니고 있다는 점이다. 따라서 이 θ값을 확인하고 위 수식대로 줄여나가는 것이 모델을 학습시키는 과정이다.

 

 


 일단 강의는 재밌다. 수식 관련 부분은 문과충인 내게 거부감이 들었지만, 자세히 잘 풀어 설명해줘서 재밌었다. 수식적인 부분을 제외하고도 word2vec에 대한 개념을 다시 다잡는 느낌이 들었고 앞으로도 꾸준히 정리한 것을 업로드 해보겠다.

반응형

댓글