비전공자도 이해할 수 있는 AI지식 -구글은 어떻게 언어를 숫자로 바꿨는가-

1. Word2Vec, 언어를 숫자로 바꾸다

 

2013년 구글은 단어의 의미를 벡터로 표현하는 매우 획기적인 방법을 발표합니다.

 

그 방법의 이름은 Word2Vec으로, 단어를 벡터로 바꾼다는 매우 직관적인 이름입니다.

 

 

무엇보다 놀랍도록 정교하게 단어의 의미를 표현해내 많은 이가 깜짝 놀랐습니다.

 

이처럼 단어를 벡터라는 숫자로 표현하는 것은 단어 각각의 특징을 추출해 수치화하는 것과 비슷합니다.

 

예를 들어 '단맛', '크기', '둥근 정도'라는 3가지 특징으로 단어 '캐러멜', '호박', '태양'을 표현해보죠.

 

관련이 전혀 없다면 0.01, 관련이 매우 높다면 0.99까지 가중치를 준다고 해봅시다.

 

단어 단맛 크기 둥근 정도
캐러멜 0.92 0.06 0.02
호박 0.23 0.29 0.62
태양 0.01 0.99 0.99

 

 

먼저 '캐러멜'은 [0.92,0.06,0.02]정도로 표현할 수 있을 것 같습니다.

 

매우 달지만 크지도, 그다지 둥글지도 않기 때문이죠.

 

'호박'은 [0.23,0.29,0.62]입니다. 조금 달고, 조금 크면서 꽤 둥글기 때문입니다. 

 

이번에는 '태양'입니다. [0.01,0.99,0.99]로 전혀 달지도 않지만 엄청나게 크고 완벽하게 둥급니다.

 

 

우리가 정한 특징에 대한 값을 벡터 공간에 표현해봤습니다.

 

단맛이 강한 캐러멜은 혼자서 멀찍이 떨어져 있지만, 비슷하게 큼직하고 둥그스름한 호박과 태양은 가까이 모여있죠.

 

이렇게 좌표로 표현하면 서로의 특징을 위치로 분명하게 구분할 수 있습니다.

 

유사도도 판별할 수 있죠.

 

호박은 태양과 더 가까이에 있으니, 호박은 캐러멜보다는 태양과 더 비슷하다고 말할 수 있습니다.

 

여기서 핵심은 어떤 특징을 어떤 값으로 추출할 것인가입니다.

 

앞선 예시에서는 우리가 3가지 특징을 임의로 정하고 그 값 또한 임의로 지정했습니다.

 

하지만 모든 단어의 값을 이렇게 사람이 하나하나 임의로 지정하기는 어렵겠죠.

 

Word2Vec은 이 값을 수동으로 설정하지 않습니다. 대신 엄청나게 많은 문장을 학습하여 컴퓨터가 이 값을 자동으로 찾도록 하죠.

 

Word2Vec이 등장한 2013년만 해도 아직 딥러닝이 지금처럼 인기를 끌거나 활발히 연구되던 시절은 아니었습니다.

 

Word2Vec은 신경망 구조를 채택하긴 했으나 지금의 딥러닝보다는 매우 얕은 구조에 불과했죠.

 

하지만 문장에서 특징을 찾아낸다는 점은 매우 혁신적이었고 실제로 잘 작동했습니다.

 

그렇다면 Word2Vec은 어떻게 자동으로 학습했을까요?

 

 

2. Word2Vec의 학습방식

 

Word2Vec의 학습방식중 하나인 CBOW에 대해 알아보겠습니다.

 

 

학습 데이터는 '아이들은 일요일에 집에서 레고를 갖고 놀기 좋아한다'는 문장으로 해보죠.

 

문장 학습은 문장 중간에 빈칸을 설정하고 해당 위치에 들어갈 단어가 무엇인지 맞추면서 차례로 진행됩니다.

 

먼저 학습할 윈도우 사이즈(Window size)를 정합니다. 문장 전체에서 window안에 있는 단어만 활용합니다.

 

예를 들어 window size가 5이면 빈칸을 기준으로 앞에 단어 2개, 뒤에 단어 2개를 입력해 가운데 빈칸에 들어갈 단어를 맞추는 거죠.

 

 

물론 단어 자체가 아닌 벡터로 된 숫자를 맞춥니다.

 

Word2Vec에서 입출력 숫자를 구성하는 방법은 간단합니다.

 

문장에서 단어를 추출하여 가나다 순으로 쭉 늘어놓고, 해당 번호의 위치를 맞추는 식입니다.

 

해당하는 단어가 있는 위치는 1이 되고, 나머지는 모두 0이 되기 때문에 이를 one-hot vector라고 합니다.

 

위치 단어
1 갖고
2 놀기
3 레고를
4 아이들은
5 일요일에
6 좋아한다
7 집에서

 

 

예를 들어 위 사전에서 '레고를'이란 단어를 one hot vector로 표현하면 [0,0,1,0,0,0,0]이 됩니다.

 

이렇게 입력에 해당하는 one hot vector를 이용해 출력에 해당하는 one hot vector가 정답 one hot vector와 일치하도록 계속 가중치를 바꾸면서 학습합니다.

 

정답이 '집에서'를 나타내는 one hot vector가 되어야 한다면, 계산 결과가 [0,0,0,0,0,0,1]이 되도록 가중치를 조절한다는 거죠.

 

 

그렇게 학습을 끝내면 계속해서 곱하기, 더하기를 해나갔던 각 단어의 가중치는 이제 단어의 의미를 표현하는 벡터가 됩니다.

 

 

 

예를 들어 5개의 단어 '나는 태연의 노래를 듣기 좋아한다'로 학습을 끝낸 가중치 행렬이 위와 같을때, 4번째 단어 '듣기'를 벡터로 나타내면 [10,12,19]가 된다는 뜻이다.

 

여기서는 단순히 3개의 숫자를 표현했지만, 실제로 큰 모델은 수천개, 수만개 넘게 되기도 한다. 10000차원 벡터가 된다는 뜻이다.

 

물론 차원이 커질수록 정교하게 표현해낼 수 있지만, 그만큼 학습데이터는 훨씬 더 많이 필요합니다.

 

'아이들은 일요일에 집에서 레고를 갖고 놀기 좋아한다.'

 

'아이들은 일요일에 집에서 공을 갖고 놀기 좋아한다.'

 

'아이들은 일요일에 집에서 포켓몬을 갖고 놀기 좋아한다.'

 

라는 유사한 세 문장이 있다고 해보죠.

 

Word2Vec은 '레고', '공', '포켓몬'이 다른 수많은 문장에서 어떻게 쓰이는지를 학습하여, 세 단어가 유사한 관계에 있음을 모델링합니다.

 

놀랍게도 이렇게 학습한 결과는 단어의 의미를 매우 잘 표현해냈습니다. 

 

비슷한 의미를 지닌 단어를 가까운 숫자로 표현할 수 있었죠.

 

뿐만 아니라 관계에 대한 정의도 가능합니다.

 

예를 들어 '남자'와 '여자'의 관계가 '왕'과 '여왕'의 관계와 일치하도록 표현해낸 거죠.

 

이것을 위치로 표현하면 '왕'에서 '남자'를 빼고, '여자'를 더했을때, '여왕'이라는 결과가 나옵니다.

 

왕-남자+여자 = 여왕

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=saltluxmarketing&logNo=221607368769

 

 

마찬가지로 '런던'에서 '영국'을 빼고 '대한민국'을 더하면 우리나라의 수도인 '서울'이 결과로 나옵니다.

 

런던에서 영국을 뺀 값이 '수도'라는 의미를 지니고 있었던 거죠.

 

https://word2vec.kr/search/?query=%EB%9F%B0%EB%8D%98-%EC%98%81%EA%B5%AD%2B%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD

 

이처럼 Word2Vec은 수많은 문장에서 자동 학습을 통해 단어의 의미를 매우 정교하게 숫자로 표현해냈습니다.

 

그리고 일단 숫자로 표현한 이후에는 컴퓨터의 엄청난 계산 능력을 마음껏 활용할 수 있기 때문에 장점이 많죠.

 

그렇다면 이렇게 벡터로 잘 표현해낸 단어 중에서 비슷한 단어는 어떻게 판별할 수 있을까요?

 

 

3. 벡터와 벡터 사이의 거리로 비슷한 단어를 찾다

 

벡터 공간에서 위치로 표현한 단어는 가까운 단어끼리 비슷한 의미를 지닌다고 했습니다.

 

단어간 유사도는 벡터와 벡터 사이 직선 거리, 그러니까 좀 더 쉽게 표현하면 점과 점 사이의 직선거리로 판별할 수 있습니다.

 

앞서 계산했던 캐러멜, 호박, 태양도 각 점 사이의 직선거리로 유사도 여부를 쉽게 계산할 수 있죠.

 

 

이러한 점과 점 사이의 직선 거리는 '유클리드 거리'로 구합니다.

 

거리를 구할 때 유용하게 쓰이는 방법 중 하나죠. 줄자로 거리를 재는 것과 비슷합니다.

 

그런데 한 가지 문제가 있습니다. 벡터 공간의 크기가 달라질 수 있다는 점이죠.

 

앞서 호박과 태양을 예로 들 때는 0.01~0.99에서 값을 정했지만, 훨씬 더 표현력을 높이기 위해 9.99까지 최댓값을 높이면 어떻게 될까요?

 

 

왼쪽 벡터 공간의 최댓값은 9.99이고 오른쪽은 0.99입니다. 왼쪽 벡터 공간이 10배 더 크죠.

 

두 벡터 공간에서 호박과 태양의 거리가 같을까요? 

 

그렇지 않습니다. 두 점의 직선 거리는 양쪽이 서로 다릅니다.

 

눈으로만 봐도 차이가 보입니다.

 

이처럼 벡터 공간의 크기가 달라지면, 유클리드 거리도 달라집니다.

 

이렇게 되면 멀고 가까움의 기준을 정하기가 어렵죠. 벡터 공간의 크기에 따라 거리가 달라지니까요.

 

그렇다면 서로 크기가 다른 벡터 공간에서도 동일한 거리로 측정할 수 있는 알고리즘이 있을까요?

 

 

4. 코사인 거리, 벡터 공간의 크기가 달라져도 동일하다

 

각도를 측정하면 어떨까요?

 

 

벡터 공간의 크기가 다르더라도 두 점의 각도는 왼쪽, 오른쪽이 모두 동일합니다.

 

각도는 어떤 벡터 공간에서도 일정한 값을 갖기 때문에, 벡터 공간이 10배, 100배 차이가 나더라도 항상 같은 값이 나옵니다.

 

그래서 각도를 이용해 두 점의 거리를 측정하기로 하죠.

 

이를 각도의 코사인 값을 사용한다고 하여 코사인 거리(cosine distance)라고 합니다.

 

 

여기서 코사인은 코사인 법칙에 따른 값을 말합니다. 

 

각도를 일정한 값으로 표현하기 위해 코사인 법칙을 활용하는 거죠. 

 

그런데 코사인 법칙에 따르면 각도가 클수록 값이 작아지므로, 이를 통해 표현한 값을 코사인 유사도(cosine similarity)로 정합니다.

 

그리고 1에서 코사인 유사도를 뺀 값이 코사인 거리가 되는 겁니다.

 

$$cosinedistance = 1 - cosine$$

 

이제 각도가 클수록 값도 커지게 되는 거죠.

 

각도가 클 때 거리도 같이 멀어지게 되는 겁니다.

 

이제 코사인 거리를 사용하면 거리가 멀다, 가깝다의 기준을 어떤 공간에서든 일정하게 표현할 수 있어 매우 유용합니다.

 

 

5. 컴퓨터가 말을 하는 방법

 

여기까지 위치가 갖는 의미와 거리를 계산하는 방법을 모두 살펴봤습니다.

 

다시 원래 주제였던 단어 유사도의 문제로 돌아와보죠.

 

벡터 공간에서 한 단어와 각도가 작은 다른 단어, 즉 코사인 거리가 가장 가까운 단어를 유사한 단어로 판단할 수 있다고 했습니다.

 

그렇다면 '예금 금리'와 '저축 이자'는 가까운 위치에 있을 것이고, 이제 둘은 서로 유사한 단어로 판단할 수 있겠죠.

 

문장도 마찬가지입니다.

 

문장 전체를 벡터로 잘 표현해내면 거리가 가까운 문장을 유사한 문장으로 볼 수 있지 않을까요?

 

예를 들어 '체크카드 한도가 궁금합니다'라는 문장을 입력했다고 하면, FAQ중에서 가장 가까이에 있는 질문을 찾습니다.

 

'체크카드를 해외에서 이용할 경우 수수료가 있나요?'라는 질문은 거리가 멀어서 유사하지 않다고 판단할 것이고,

 

'체크카드 한도가 어떻게 되나요?'라는 질문은 가까운 거리에 있기 때문에 유사하다고 판단할 수 있죠.

 

이제 이 질문에 딸린 답변을 정답으로 보여주면 답변이 나오게 되겠죠.

 

 

이러한 과정을 거쳐 챗봇은 고객의 질문을 이해하고 답변합니다.

 

아직까지 완벽한 기술은 아니지만, 충분히 사용자에게 도움을 주는 유용한 서비스가 될 수 있죠.

 

기업 입장에서도 단순한 반복 작업을 많이 줄여줘서 큰 도움이 됩니다.

 

사실 지금의 검색엔진이 하고 있는 일도 비슷합니다.

 

검색도 완벽한 기술은 아니지만 우리는 이미 검색 서비스가 없는 세상을 상상할 수 없죠.

 

챗봇 또한 점점 더 발전하면서 우리는 챗봇에 일상적인 도움을 받게 될 거에요.

 

 

 

 

 

 

 

09-02 워드투벡터(Word2Vec) - 딥 러닝을 이용한 자연어 처리 입문 (wikidocs.net)

 

09-02 워드투벡터(Word2Vec)

앞서 원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다는 단점이 있음을 언급한 적이 있습니다. 그래서 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를…

wikidocs.net

 

Word2Vec의 학습 방식 · ratsgo's blog

 

Word2Vec의 학습 방식 · ratsgo's blog

이번 포스팅에서는 최근 인기를 끌고 있는 단어 임베딩(embedding) 방법론인 Word2Vec에 대해 살펴보고자 합니다. Word2Vec은 말 그대로 단어를 벡터로 바꿔주는 알고리즘입니다. Neural Network Language Model(

ratsgo.github.io

 

 

TAGS.

Comments