NLP

Word Embedding

알 수 없는 사용자 2021. 5. 2. 01:41
반응형

이 글은 Word Embedding을 CV의 관점에서 풀어보려 한다.

 

사실 지금 NIPS를 쓸 수도 있는(한 달 밖에 안남아서 교수님께서 일단 써보고 안되면 다른곳에 내자 하신) 실험을 진행중이다. 사람 마음이 참 그런게 학습 로그가 계속 눈에 들어온다... 내가 보고있으나 안보고 있으나 어차피 결과는 똑같을 것이고 학습이 끝난 뒤에 확인하면 될텐데 그게 안된다.. 그래서 학습 돌리는 중에는 다른 일을 못하겠어서 결과 확인을 계속 하면서 NLP를 정리하려 한다.

 

예전에 주식을 처음 시작했을 때, 정말 하루종일 차트에서 눈을 떼지 못했던 기억이 난다. 주식도 한 한달~두 달 지나니 차트를 하루에 한번 두달~6달 지나니 일주일에 한번만 봐도 괜찮은 상태가 되었었는데 학습돌리는 것도 같지 않을까 싶다.

 

잡소리는 여기까지 하고 오늘은 한 번 word embedding에 대해 정리해 보고자 한다.

 

그럼 우선 word embedding이란 무엇인가?

일단 word는 단어이다. 단어는 말 그대로 우리가 사용하는 단어들을 지칭한다.

그럼 embedding은 뭘까? 사전에 embedding을 치면 이렇게 나온다.

  • 어떤 위상(位相) 공간에서 다른 위상 공간으로의 동상 사상(同相寫像).

어렵다.

쉬운 말로 풀어보려 생각해봤지만 저 말 자체를 쉽게 푸는 것은 의미가 없는 것 같다.

word embedding이 뭔지 설명을 통해 저 말 뜻을 이해해보자.

 

word embedding은 단어를 벡터로 보내는 방법이라 생각하면 좋다. (벡터가 뭔지는 다들 알고있으리라 믿는다.)

단어를 벡터로 보낸다...? 감이 잘 잡히지 않을 것이다.

 

그렇기에 나는 이걸 CV를 통해 설명해보려 한다.

https://www.slideshare.net/NaverEngineering/ss-96581209

www.youtube.com/watch?v=o_peo6U7IRM이 링크를 통해 해당 슬라이드의 강의를 들어볼 수 있다.

나는 개인적으로 다 들었고, 큰 도움이 되었다.

 

위 슬라이드를 보면 오른쪽에 옛날 브라운관 티비에서 노이즈가 발생할 때 같은 사진이 뒤에 존재한다.

수학적으로 존재하는 200x200 사이즈의 사진은 10^96329 개의 경우의 수가 있다. 하지만 상식적으로 생각해 봤을 때 우리가 바라보는 세상을 찍은 사진들은 무언가 이런 아무렇게나 놓인 경우의 수들 중에 매우 일부만 차지할 것 같다.

전체 가능한 이미지의 경우의 수를 전체 공간이라 했을 때 우리는 이것보다 조금 더 작은 차원에서 (작은 경우의 수를 가지고) 우리의 세상을 표현 할 수 있을 것이다. (그렇게 생각이 되지 않는가?)

그렇다면 그 조금 더 작은 차원이라는 것은 어떤 차원을 말하는 것이며 어떤 일들이 이뤄져야 하는 것일까?

 

이해를 돕기 위해서 우리가 쉽게 생각할 수 있는 3차원 공간과 2차원 공간을 통해 살펴보자.

골프를 치고 있는 사람의 연속적인 사진이 양쪽 끝 두 장이다.

이 두 사진간의 중심점을 찾으려 하면 pixel의 모든 점에 대해 즉, 우리가 알고 있는 평균을 구하는 방식으로 그 중간을 구했을 때 중간의 사진처럼 될 것이다. 팔이 2개 있고 채도 2개 있고 어깨도 조금 흔들리는 듯한 사진 말이다.

가운데 사진은 완벽하게 양쪽 사진의 평균이다. 그러나 우리가 생각하는 세상의 중간 지점은 저 모습이 아니다.

우리가 원하는 것은 저 중간 지점에 채가 존재하는 모습이다!

그렇다면 우리가 원하는 공간은 모든 픽셀의 가능성을 포함하는 공간이 아닌 그림에서 나선 모양으로 표현되어 있는 평면인 것이다.

 

즉, 고차원 공간에서 거리가 가까움에도 불구하고 사실 실제로는 그 거리가 멀 수도 있는 것이고 고차원 공간에서 표현 할 수 있는 데이터임에도 불구하고 저차원 공간으로는 나타낼 수 없는 (사진으로 치면 위에 팔이 2개있는) 데이터도 있을 수 있는 것이다.

 

이를 대변하는 아주 전형적인 예시가 있다.

바로 Auto Encoder 이다.

 

https://www.researchgate.net/figure/The-structure-of-proposed-Convolutional-AutoEncoders-CAE-for-MNIST-In-the-middle-there_fig1_320658590

오토인코더란 무엇인가?

바로 사진을 어떤 벡터로 표현 할 수 있도록 만드는 녀셕이다.

 

사진을 벡터로 표현한다는 것은 어렵게 생각하지 않아도 된다.

이전 포스팅에서 말 한 것과 같이 딥러닝 이라는 과정 자체가 사진을 벡터로 표현시키는 과정이다.

 

https://medium.com/analytics-vidhya/image-classification-a-comparison-of-dnn-cnn-and-transfer-learning-approach-704535beca25

가장 기본적인 classification에 대해 생각해보자. 어떤 사진이 무슨 사진인지 컴퓨터가 알아맞추기 위해서는 최종적으로 어떤 사진을 하나의 output vector로 만드는 과정이 필요하다. 저 output vector는 보통 softmax를 통과해서 나온 벡터이다. 만약 100개의 class 중에 input 이미지가 무엇인지 알아야 한다면 그 100개들 중 어떤 것일 확률이 얼마나 높은지 나타내 준다고 생각하면 쉽다.

만약 첫번째 class가 로봇이라면(정답이라면) 정답 vector는 [1,0,0,0,0,0,,,,,,,,,,0,0] 일 것이다. 이런 식으로 표현하는 것을 one-hot vector라고 한다.

그리고 위 CNN network는 output vector로 예를 들면 [0.94, 0, 0, 0, 0.2, 0.1, 0, 0, 0,,,,,,] 이런 식으로 표현되는 것이다. 그러면 우리는 그것을 보고 로봇이라는 결과를 얻는 것이다.

이 모든 과정은 결국 이미지를 하나의 벡터로 표현하는 과정인 것이다.

 

https://www.researchgate.net/figure/The-structure-of-proposed-Convolutional-AutoEncoders-CAE-for-MNIST-In-the-middle-there_fig1_320658590

자 다시 이녀석으로 돌아와보자. Auto-Encoder라는 녀석이다.

오토인코더는 이미지를 넣어서 벡터로 만드는 과정까지는 위의 classification과 같다. 하지만 조금 다른 점이 있다. 바로 그 벡터로 부터 다시 원래 이미지를 만들 수 있어야 한다는 것이다.

이는 위에서 '벡터로 만드는 개념'을 설명하기 위해서 언급한 classification과 본질적으로 다르다. 둘 다 벡터로 만들지만 오토인코더는 그 벡터가 전체 이미지를 표현 할 수 있어야 하는 벡터인 것이다. 즉, 원래 '이미지'라는 고차원의 데이터를 '벡터'라는 저차원에다가 표현 할 수 있어야 한다는 것이다.

 

위쪽 사진 중 공간상의 나선형 평면을 찾았던 것 처럼, 3차원 안에서 2차원을 찾아낸 것 처럼

오토인코더는 사진이라는 거대한 데이터를 벡터라는 작은 차원에서 다 표현 가능한 공간을 찾는 것이다.

 

만약 우리가 그 작은 차원을 특정 분포를 따르게 만들고 싶고, 거기에 대한 제약을 추가한다면 그것은 VAE라 불리는 Variational Auto Encoder 가 된다.

이를 통해서 우리는 저 작은 벡터 값을 바꿨을 때 숫자를 변경시킬 수도 있다.

이런 식으로 말이다.

이미지를 어떤 한 벡터로 나타낼 수 있다면

 

또는 CVAE와 같은 모델을 활용하여 같은 숫자에 대해 벡터를 조절해보면

이와 같이 뭔가 위로 가면 숫자의 크기가 작고 오른쪽으로 가면 오른쪽으로 기울어진 숫자를 뽑아낼 수도 있다.

저 숫자들은 다 가운데 있는 벡터를 조절하여 만들어낸 숫자들이다. 나중에 CV관련 Posting을 통해 더 자세히 다뤄보도록 하겠다.

지금 개념적으로 전달하고 싶은 바는 어떤 숫자를 표현할 수 있는 벡터공간을 찾고 그곳으로 그 이미지를 투영시킬 수 있다면 우리는 고차원의 이미지를 저차원의 벡터로 표현 할 수 있다는 것이다. 그리고 반대로 저차원의 벡터를 고차원의 이미지로 만들수도 있는 것이고 말이다.

 

자 그렇다면 드디어 이제서야 word embedding에 대해 이야기해보자.

이미지 또한 고차원이지만 단어 또한 일종의 고차원이다.

우선 단어를 단순한 글자의 조합이라 생각해보면 강혀울희셔할 과 같은 아무 글자나 이어붙인다고 다 단어가 되는 것이 아니다.

또한 세상에 존재하는 단어만 생각하여도 "개가 학교를 쌌다." 와 같은 단어들의 배열은 의미가 없다. 이 말은 단어들이 존재하는 고차원에서 우리가 실제로 사용하는 단어들의 순서는 특정한 공간에 맞춰 있다는 이야기이다. 우리는 그것을 manifold라 부른다. 위 사진에서 나선형 모양의 그 공간 말이다.

 

그렇기에 우리는 embedding이라는 위상적 사상을 통해 즉, 다른 공간 우리가 찾는 manifold로의 투영을 통해 그 공간에 단어를 보내는 것이다.

우리는 잘생김 이라는 벡터와 남자라는 벡터를 더했을 때 미남에 해당하는 벡터가 나오는 그런 공간을 원하는 것이다. (뭘 하고 싶느냐에 따라 다르겠지만 이해를 위해서)

 

이를 Word2Vec라고 한다.

 

그러면 어떻게 단어를 우리가 원하는 manifold에 투영시킬 수 있을까?

옛날에 사용했던 아이디어들을 간단하게 짚어보며 흐름을 따라가보자.

(필자는 결코 모든것을 자세하게 쓰기 위해 포스팅을 하고 있지 않다... 세부 내용을 원한다면 검색을!)

 

1. CBOW

아키텍처 그림만 가지고도 모든걸 설명 할 수 있다. 사실 매우 간단한 아이디어를 적용한 네트워크이다. 바로 주변 단어들을 통해 해당 단어를 예측하자는 것이다.

 

"어제 밤을 샜더니 너무 ____."

위 문장의 빈칸에 들어갈 단어를 예측해 보자.

대충 졸리다, 피곤하다, 힘들다 이런 느낌의 단어가 들어갈 것이라는 것을 쉽게 알 수 있다.

우리는 단어의 주변 관계를 통해 빈칸의 단어를 충분히 예측 할 수 있다.

이를 적용시켜보자.

 

우선 모든 단어들을 one-hot vector로 만들어 둔다. one-hot vector들은 서로간의 아무런 상관관계를 지니지 않는다. 또한 차원이 고차원이다. (모든 단어의 개수만큼 차원이 존재한다.) 우리가 원하는 manifold라는 것은 이를 더 작은 차원으로 표현 하는 것이다.

 

모든 단어들을 one-hot vector로 만들어 특정 Weight(Wvn)에 곱한다. (한 단어를 중심으로 주변 단어들을 다 곱한다.) 그리고 주변 단어들의 곱들을 다 더하여 평균을 낸다. 그 값을 다시 다른 W에 넣는다. (Wnv) 이 때 나오는 값의 softmax값은 원래 단어가 나와야 한다.

이런 조건을 만족시키도록 식을 세우고 네트워크를 학습시킨 것이다. 이 때 Wvn을 통과해서 나온 벡터들이 word embedding 된 vector이다. 

 

2. Skip-gram

이제 아키텍처만 봐도 무슨 개념인지 알 수 있을 것이다.

CBOW와 반대로 가운데 단어만 가지고 주변 단어를 예측하는 것이다.

 

두 아키텍처는 각각 장단점이 있다.

• CBOW: several times faster to train than the skipgram, slightly better accuracy for the frequent words

좀 더 빠를 때가 있고 자주 등장하는 단어에 대해 조금 더 잘한다.

• Skip-gram: works well with small amount of the training data, represents well even rare words or phrases.

좀 작은 크기의 데이터에서 잘 작동하고 드문 단어일지라도 좋은 임베딩을 보여준다.

 

 

단어와 주변 단어간의 관계를 통해 임베딩을 시키는 방법에 대해 알아봤다.

 

이 외에도 당연히 여러 방법들이 있다. 한번 공부해 보길 바란다.

일단 임베딩이 뭔지에 대한 개념은 이정도면 충분하다고 생각한다.

반응형

'NLP' 카테고리의 다른 글

인공지능에서 Attention 이란? _ seq to seq  (0) 2021.06.11
NLP 벤치마크 GLUE  (0) 2021.06.11
RNN과 LSTM  (0) 2021.05.02
딥러닝에 대한 짧은 정리  (0) 2021.05.01
NLP 정리를 시작하며  (0) 2021.05.01