Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기
NLP

비정형 데이터 - Word2Vec

by 볼록티 2019. 12. 16.
728x90
반응형

이번장에서는 단어 임베딩 기법 word2vec을 알아본다.

Word2Vec

텍스트를 딥러닝에 인풋으로 넣을 수 없다. 하지만 숫자는 인풋으로 넣을 수 있다.

텍스트를 숫자로 만들어라.잘. 임베딩.

 

원핫인코딩같은게 자주 사용되는데, 이런거는 유사도가 없고 수치는 의미가 없다.

그래서 인코딩 대신에 임베딩을하게 된다.

 

임베딩을 하게 되면 차원도 저차원이고, 유사도를 가질 수 있게 된다. 그 임베딩을 하는 첫 단추가 word2vec 방법이다.

word2vec은 중심단어와 주변단어 벡터의 내적이 코사인 유사도가 되도록 단어벡터를 벡터공간에 임베딩한다고 한마디로 요약을 합니다. 이 말은 내 주변에 단어들이 학습을 거치면 이제 텍스트가 아닌 벡터 수치로 여전히 가까워 보이게 남기는 것이라고 할 수 있을 것 같다.

 

우선 복잡한 수식보다는 아주 쉬운 예로 천천히 살펴보도록 하겠다.

아래의 그림은 그렇다 단어x단어 행렬을 '원-핫-인코딩' 한 것이다. 독립적인 벡터로 '인코딩' 한 것이다.

아래의 그래프 처럼 원 핫 인코딩은 모든 벡터간의 거리가 동일하다. 각도도 전부 90도로 유사한걸 찾을 수가 없다.

 

 

 

 

임베딩을 사용한다. 차원이 적어지도, 유사도를 가질 수 있게 된다.

아래의 표처럼 4차원에서 2차원으로 저차원으로 줄인 것을 볼 수 있다.

 

word2vec은 비슷한 위치에 있는 단어들 사이에서 유사도를 얻을 수 있다. 

 

 

 

아래의 그림은 skip-gram에서 window를 1로 한 경우. 해당 단어의 좌우 한개씩의 단어만 체크 한다. 컴터가 워드랑 타겟값을 만든다.

그런 의미에서 사람들은 unsupervised-learning이라고 하거나 self-learning이라고 한다.

 

 

 

아래의 표처럼 윈도우 크기를 2로 할 경우 해당 단어의 좌우 각각 두개씩 단어를 고려한다.

 

 

 

아래의 표는 위의 표에 있는 두 열을 쫙 갈라서 각각 원핫인코딩 벡터를 표시해본 것입니다.

 

위의 표에서 인코딩된 수치형 열만 가져와서 아래의 그림처럼; 그래서 이 값들을 input과 target으로 두고 hiddenlayer에서 행렬을 구하라고 시키게 됩니다.

 

 

 

아래의 그림은 word2vec 임베딩 값을 얻기위한 딥러닝 모델의 아키텍처이다. 총 3개의 층이 있는 것을 확인할 수 있다. input, hidden, output layer가 있다. 아래의 그림에서는 우선 예로 king 단어를 가져왔고, 원-핫-인코딩이기 때문에 벡터의 차원(V)은 단어의 개수가 된다. 즉 지금은 총 6개의 차원이다. 

 hidden층에는 노드가 2개 뿐이다. 이는 사용자가 지정해주어야 하는 부분이다. 왜냐하면 hidden층이 word2vec이 될 것이기 때문에 지정을 해줘야한다. 차원의 수를 정해준다고 생각해도 된다. 원-핫-인코딩보다 적은 차원의 벡터를 갖게해서 유사도를 가질 수 있게 하기 위함이다. 

 

아래의 그림 king([1,0,0,0,0,0])의 이웃은 brave였고, brave 같은 경우에는 [0,1,0,0,0,0] 이다.

input이 들어가고, hidden층에 "어떤값"(초기에는 랜덤하게 주는 것 같음.)이 들어가고, 그다음 아웃풋으로 소프트맥스(softmax)를 취한다(소프트 맥스 값으로 얻은 값들의 합은 1이다.).

 

이제 아래의 그림처럼 아웃풋 값과 타켓벨류 간의 차이 값을 가지고 크로스 엔트로피를 계산함으로써 back propagation을 실시한다. 그래서 점차적으로 w값이 변하게 된다.

 

 

아래의 그림, king과 man의 경우.

 

아래의 그림, brave와 man의 경우.

 

 

이렇게 계속해서 feed forward backpropagation을 하면서 점차적으로 w가 유사도를 갖기 위한 값으로 변하게 된다.

 

 

 

아래의 그림은 이제 w가 값을 최종적으로 갖게 된 상황이다.

 

 

아래의 그림처럼 2차원으로 된  w값인 임베딩 값을 얻었다.

 

예를 들면, hidden층의 첫번째 레이블 값인 [1,1]이 임베딩된 값 즉, word2vec이 된다.

 

 

이제 아래의 그림처럼 바로 look-up table로 사용할 수가 있다. king-man, queen-woman이 가까운 위치에 있는 것을 알 수 있다.

 

인풋으로 w (1xm)를 넣고 뭔지모를 hidden 층에서 내가 정한 차원(n)에 맞는 행렬(mxn)을 곱해서 output을 소프트 맥스를 적용하여 내고, window로 열심히 주변단어를 둘러보았기에 그 target벡터와 output 벡터를 비교하고, 그 차이를 가져다가 크로스엔트로피를 구하고 backpropagation을 통해 w값(word2vec값)을 내가 정한 계산량만큼 계산하면서 수정해서 최종적으로 그 hidden층에 있는 w를 임베딩 값으로 사용하여 단어들 간의 유사도를 비교해볼 수 있다.

 

 

 

 

여기서 소프트맥스와 크로스 엔트로피값에 대해 우선 짚고 넘어가야 한다. 그래야 output의 결과가 뭔지 알 수 있고, 또 target과의 차이를 비교하는 것도 이해하게 될 것이다. 쉽게 설명이된 wikidocs의 설명을 통해 배웠다.

Softmax(소프트맥스): 분류해야하는 클래스가 k라 할 때, 똑같이 k차원의 벡터를 입력받고, 각 클래스에 대한 확률을 추정한다. k차원의 값들의 합은 당연히 1이 된다.

 

1.수식으로 설명하기

아주 좋은 데이터인 iris데이터에서 품종 3가지를 분류하는 것을 예시로 들어 설명한다.

k차원의 벡터에서 i번째 원소가 zi번째 클래스가 정답일 확률을 pi로 나타낸다고 할 때, 소프트맥스 함수를 다음과 같이 정의한다.

우리가 분류할 클래스는 3개이므로 k=3이 된다. iris로 부터 z=[z1,z2,z3]의 입력을 받으면 아래와 같이 출력한다.

 

$[p_{1},p_{2},p_{3}]$ 는 각각 클래스가 1,2,3 일 확률 값으로 나타나게 되고, 확률이 가장 큰 클래스로 최종 분류하는 것이다.

---> 분류하고자 하는 클래스가 k개 일 때, k차원의 벡터를 입력받아서 k차원의 벡터에 클래스에 대한 각각의 확률 값을 리턴한다고 생각하면 간단하다.

 

 

2.그림으로 설명하기

 

 아래의 그림에서 첫번째 질문인 '소프트맥스 함수의 입력으로 어떻게 바꿀까?' 위그림처럼 입력할 때 차원과 클래스의 개수가 다르다는 것을 알 수 있고, 이를 해결해야합니다.

 

iris의 소프트맥스를 통한 분류 모델

 

 

 

아래의 그림은 위의 그림에서 input에서의 벡터차원과 output에서의 벡터차원인 k가 서로 다른데, 이는 차원축소로 해결한다. 소프트맥스 함수의 입력벡터 z의 차원수만큼 결과값이 나오도록 가중치 곱을 진행한다. 아래의 그림에서 화살표는 (4 x 3 = 12)이며 전부 다른 가중치를 가지고 있고, 학습 과정에서 점차적으로 오차를 최소화하는 가중치로 값이 변경된다.

 

 

아래의 그림처럼 소프트맥스의 입력에 맞추어 차원도 축소했고, 이제 예측값을 얻어냈다. 소프트맥스 회귀에서는 실제값을 원-핫 벡터로 표현하여 이 값과 예측값사이의 오차를 구하게 됩니다. 

 

 선형 회귀나 로지스틱 회귀와 마찬가지로 오차로부터 가중치를 업데이트 합니다.

 

 

 

 

더 정확히는 선형 회귀나 로지스틱 회귀와 마찬가지로 편향 또한 업데이트의 대상이 되는 매개 변수입니다. 소프트맥스 회귀를 벡터와 행렬 연산으로 이해해봅시다. 입력을 특성(feature)의 수만큼의 차원을 가진 입력 벡터 $x$라고 하고, 가중치 행렬을 $W$, 편향을 $b$라고 하였을 때, 소프트맥스 회귀에서 예측값을 구하는 과정을 벡터와 행렬 연산으로 표현하면 아래와 같습니다.

 

 

- 크로스 엔트로피 함수

 

소프트맥스 회귀에서는 비용 함수로 크로스 엔트로피 함수를 사용한다.

아래에서 y는 실제값을 나타내며, k는 클래스의 개수로 정의한다. yj는 실제값 원-핫 벡터의 j번째 인덱스를 의미하고, pj는 샘플 데이터가 j번째 클래스일 확률을 나타낸다. 표기에 따라서 ˆyj 로 표기하기도 한다.

비용 함수

 

n개의 전체 데이터에 대한 평균을 구한다고 하면 최종 비용 함수는 다음과 같이 나타난다.

최종 비용 함수

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

서울과학기술대 이영훈 교수님 강의, ratsgo blog, 허민석 유투버의 자료를 거의 다 베끼다시피 필기하고 있음을 명시합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

'NLP' 카테고리의 다른 글

비정형 데이터 - LDA  (0) 2019.12.16
비정형 데이터 - GloVe  (0) 2019.12.16
비정형 데이터 - Classifier_Basic  (0) 2019.12.16
비정형 데이터 - LSA / pLSA  (0) 2019.12.16
비정형 데이터 - TF-IDF  (0) 2019.12.16

댓글