📝 상세 정리 # 지금까지 살펴본 신경망은 피드포워드 유형의 신경망이다. 이는 흐름이 단방향인 신경망을 말한다. 하지만 이에는 시계열 데이터를 잘 다루지 못한다는 단점이 있는데… 따라서 여기서 순환 신경망이 등장한다. 5.1 확률과 언어 모델 # 5.1.1 word2vec을 확률 관점에서 바라보다 $t$번째 단어를 타깃으로, 그 전후 단어를 맥락으로 취급해보자. CBOW모델은 $w_{t-1}, w_{t+1}$로부터 $w_t$를 추측하는 일을 수행할 것이다. 이 확률을 수식으로, $P(w_t | w_{t-1}, w_{t+1})$ 로 나타낼 수 있겠다. 그런데, 맥락이 좌우대칭이 아니어도 되지 않나? $P(w_t | w_{t-1}, w_{t-2})$같은걸 생각해보자. 이걸 어따 써먹지? 5.1.2 언어 모델 언어 모델은 단어 나열에 확률을 부여한다. 단어 $w_1, w_2, \cdots , w_m$이 있다고 해보자. 이들이 순서대로 출연할 확률은 $P(w_1, \cdots, w_m)$이다. 이는 분해해서 다음과 같이 쓸 수 있다. $P(w_1, \cdots, w_m) = P(w_m | w_1, \cdots, w_{m-1}) \cdots P(w_2 | w_1) P(w_1)$ 5.1.3 CBOW 모델을 언어 모델로? $P(w_1, \cdots, w_m) = \prod\limits_{t = 1}^mP(w_t|w_1, \cdots, w_{t-1} \approx \prod\limits_{t = 1}^mP(w_t | w_{t-2}, w_{t-1})$ 맥락을 두개 단어로 한정! 이를 2층 마르코프 연쇄라고도 볼 수 있겠다. 하지만 고정 길이의 한계로, 대답하기 곤란한 문장들이 생긴다. Tom was watching TV in his room. Mary came in to the room. Mary saind hi to $w$ 또한, 은닉층에서 평균내는 특징상 단어 순서가 무시된다. 그렇다면 평균내지 말고 은닉층에서 연결해볼까…? 그러면 맥락의 크기에 비례해 매개변수가 너무 커진다. 5.2 RNN이란 # Recurrent Neural Network 재발하다 / 주기적으로 일어나다 / 순환하다라는 뜻 5.2.1 순환하는 신경망 순환하다? 반복해서 되돌아가다? 이를 위해선 어떤 닫힌 경로가 필요하다. ![[Pasted image 20260203151615.png]] 이때 $x_t$를 입력 받는데, $t$는 시각을 의미한다. $x_t$는 벡터이다. 예를 들어 문장 (단어 순서)를 다루는 경우 각 단어의 분산 표현(단어 벡터)가 $x_t$가 된다. 이것이 순서대로 하나씩 RNN에 입력되는 것. 위의 순환 과정을 펼치면 다음과 같다. ![[Pasted image 20260203151754.png]] 이제 여태까지의 피드포워드 신경망과 비슷하게 보인다! 하지만, 이제는 다수의 RNN계층 모두가 실제로는 같은 계층이라는 차이가 있다. 이 계산의 수식은 다음고 같다. $h_t = tanh(h_{t-1}W_h + x_t W_x + b)$ $x$를 $h$로 변환하기 위한 가중치 $W_x$ RNN 출력을 다음 시각의 출력으로 변환하기 위한 가중치 $W_h$ 편향 $b$ 세가지가 존재한다. 행렬 곱을 계산하고, 그 합을 계산해서 쌍곡탄젠트함수를 먹인다. 그 결과가 시각 $t$의 출력 $h_t$가 된다. 이는 다른 계층을 향해 위쪽으로 출력되는 동시에, 다음 시각의 RNN계층을 향해 오른쪽으로도 출력된다. $h_t$는 $h_{t-1}$에 의해 계산되므로, RNN 계층을 상태를 가지는 계층, 혹은 메모리가 있는 계층이라고 한다. 5.2.3 BPTT ![[Pasted image 20260203152426.png]] 순환 구조에서도 똑같이 오차역전파법을 수행할 수 있다. 이를 시간 방향으로 펼친 신경망의 오차역 전파법이란 뜻으로 BPTT(BackPropagation Through Time) 라고 한다. 하지만 시계열 데이터의 시간 크기가 커지는것에 비례해서 BPTT가 소비하는 컴퓨팅 자원이 늘어난다는 단점이 있다… 기울기도 불안정해지고 5.2.4 Truncated BPTT 큰 시계열 데이터를 처리할때는 신경망 연결을 적당한 길이로 끊자. 작은 신경망 여러개로 만들자! 이것을 Truncated BPTT라고 한다. 사실 제대로 구현하려면, 순전파는 그대로 두고 역전파만 끊어야 한다. 그리고 그 잘린 단위로 학습 ![[Pasted image 20260203153224.png]] 1000개 깊이의 RNN계층이라도 10개단위로 학습하도록 이렇게 자를 수 있다! 이 하나의 단위를 블록이라고 하자. 5.2.5 Truncated BPTT의 미니배치 학습 ![[Pasted image 20260203153906.png]] 두번째 미니배치를 학습 넣을 때 데이터를 시작 위치로 옮겨서 다시 순서대로 데이터를 제공해야 한다. 5.3 RNN 구현 # 구현구현 5.4 시계열 데이터 처리 계층 구현 # 구현구현 5.5 RNNLM 학습과 평가 # 5.5.1 RNNLM 구현 5.5.2 언어 모델의 평가 언어 모델의 예측 성능을 평가하는 척도로 퍼플렉서타를 이용한다. Perplexity, 혼란도 이는 확률의 역수값 이는 직관적으로 분기 수로 해석할 수 있다. 입력데이터가 여러개라면? $L = -\frac{1}{N}\sum\limits_{n}\sum\limits_{k}t_{nk}\log y_{nk}$ $\text{perplexity} = e^L$ 5.6 정리 # 이번 장의 주제는 순환 신경망 이를 이용해 데이터를 순환시켜서, 과거 -> 현재 -> 미래로 데이터를 흘려보낸다. 이를 이용해서 언어 모델을 만들었고, 이는 단어 시퀀스에 확률을 부여하고 다음에 출연할 단어의 확률을 계산한다. 이론적으로는 아무리 긴 시계열 데이터라도 RNN의 은닉상태에 정보를 기억하게 할 수 있지만, 실제로는 잘 학습하지 못하는 경우가 많다. 다음장에서 LSTM, GRU등을 알아보겠다. ❔질문 사항 # 미니배치를 만들 때, 문장의 시작이 아닐 때도 있지 않을까? 그러니까, 미니배치에 넣기 좋게 문장이 생긴 데이터가 아닐 경우가 더 많을 것 같은데… 🔗 참고 자료 #
📝 상세 정리 # 기존의 CBOW모델은 말뭉치에 포함된 어휘 수가 많아지면 계산량도 커진다는 단점이 있었다. 이를 Embedding 계층과 네거티브샘플링이라는 새로운 손힐함수를 이용하여 개선할 것이다. 4.1 word2vec 개선 1 # 기존의 CBOW모델에서 어휘가 100만개가 된다고 가정해보자. 그렇다면 입력층은 $W_{in} = 1000000 * 100, W_{out} = 100 * 1000000$의 행렬이 된다. 심지어 원핫 벡터라 상당히 sparse한데.. 이를 Embedding 계층 도입으로 해결해보자. $W_{in}$은 Embedding으로, $W_{out}$은 네거티브 샘플링으로 해결할 것이다. 4.1.1 Embedding 계층 다시한번 어휘 수가 100만개인 상황을 상상해보자. 단어의 원핫벡터는 100만차원.. 그런데, 이 연산이 무엇을 의미하는걸까? 이는 그저 행렬의 특정 행을 추출하는 것뿐이다! 다시말해, 원핫표현으로의 변환가 행렬 곱연산은 사실 큰 필요가 없다. 가중치 매개변수로부터 단어 ID에 해당하는 행을 추출하기만 하면 된다. 해당 계층을 만들어보자. 이를 Embedding 계층이라고 하고, 단어 임베딩이라는 용어에서 유래했다. Embedding 계층에 단어의 분산 표현을 저장할 것이다. 4.1.2 Embedding 계층 구현 행렬에서 특정 행을 추출하는것은 꽤나 쉽다. $W$가 2차원 numpy 배열이라면, W[2]처럼 원하는 행을 명시하면 끝 입력층 단어가 일때도 쉽게 된다. 따라서 구현에서도 W[idx]로 인덱싱만 진행하면 된다. 역전파에서도 똑같이 전해진 기울기를 idx번째 행에 전달하면 된다. 그런데 여기서 문제가 발생한다. idx의 원소가 중복된다면? 예를 들어 입력층에서 넣은 단어인덱스 배열이 [0, 2, 0, 4]라면? 이 문제를 해결하기 위해 구현 시 dW의 층을 0으로 초기화하고 각 인덱스에 대해 더해주자. 4.2 word2vec 개선 2 # 여기서는 은닉층 이후의 처리, 즉 행렬곱과 Softmax계층의 계산 파트의 병목을 해소할 것 네거티브 샘플링을 이용할 것이다. 4.2.1 은닉층 이후 계산의 문제점 언제나 그랬듯 어휘가 100만개, 은닉층 뉴런이 100개라고 생각해보자. $W_{out} = 100 * 1000000$ 의 행렬 연산을 해서 100만 길이의 출력층을 만들고 이에 softmax 함수를 적용해서 확률을 얻어내야 한다. 4.2.2 다중 분류에서 이진 분류로 이 기법의 핵심 아이디어는 다중 분류(multi-class classification)을 이중 분류(binary classification)으로 근사하는데 있다. 100만개의 단어 중 옳은 단어 하나를 고르는 문제를, 맥락이 주어졌을 때 타깃 단어는 say 입니까? 라는 이진 분류, 즉 결정 문제로 바꿀 수 있다. 그렇다면 출력층에는 뉴런을 하나만 준비하면 된다! 따라서 연산은 $W_{out}[idx] = 100 * 1$ 로 바뀌게 되고, 길이 1의 출력층만 sigmoid를 적용하면 되게 되었다. 4.2.3 시그모이드 함수와 교차 엔트로피 오차 이진 분류 문제를 신경망으로 풀 때에는 점수에 시그모이드 함수를 적용해 확률로 변환하고 손실을 구할 때에는 손실 함수로 교차 엔트로피 오차를 사용한다. 시그모이드 함수는 앞에서 배운것과 같이 다음과 같고, $y = \frac{1}{1+e^{-x}}$ 교차 엔트로피 오차는 다음과 같다. $L = -(t\log y + (1-t)\log (1-y))$ $y$는 시그모이드 함수의 출력, $t$는 정답 레이블 $t = 1$일 때 Yes, $t = 0$일때 No 따라서 $t = 1$일때 $-\log y$가, $t = 0$일 때 $-\log (1-y)$가 출력된다 이때 역전파 계산 결과, Chain Rule로 계산을 완료하면 전달되는 오차(기울기)가 $y-t$가 된다. $t = 0$일때는 $y$가 크면 크게 학습하고, $y$가 작으면 작게 학습한다는 의미도 된다! 4.2.4 다중 분류에서 이진 분류로 ![[Pasted image 20260127170240.png]] 위의 모든 최적화를 거친 그림은 위와 같다. 여기서 출력층의 Embedding 계층과 내적 연산을 합쳐서 Embedding dot 계층으로 표현하면 조금 더 간단하게도 그릴 수 있다. Embedding dot 계층은 $h, idx$를 입력받아서 점수를 반환한다. 내적은 $\text{Score} = \sum\limits_{i=1}^d{h_i \cdot w_i} = h \cdot w_{target}$ 이라고 생각할 수 있고, 곱의 결과로 나온 벡터가 실제 정답과 얼마나 유사한지에 대한 값이라고 생각할 수 있다. 4.2.5 네거티브 샘플링 위는 정답의 예만 신경썼고, 오답의 예를 신경쓰지 않았다. 이를 어떻게 학습시키면 좋을까? 모든 오답에 대해서 이진 분류를 학습시키면 어떨까? 그렇다면 다시 어휘의 수에 연산량이 비례하게 된다…. 따라서 근사적인 해법으로, 부정적인 예를 조금만 선택하자! 이를 네거티브 샘플링이라고 한다. 4.2.6 네거티브 샘플링의 샘플링 기법 샘플링을 단순히 무작위로 할 것인가? 더 좋은 방법이 있다. 말뭉치의 통계 데이터를 기초로 샘플링하자! 자주 등장하는 단어를 많이 추출하고, 드물게 등장하는 단어를 적게 추출하자. 단어의 출현 횟수를 확률분포로 나타내고, 그 확률분포대로 단어를 샘플링하면 된다. 그런데, word2vec의 네거티브 샘플링에서는 각 확률분포에 0.75승을 하라고 권장한다. 이는 출현확률이 낮은 단어를 버리지 않게하기 위함으로, 낮은 출현율의 단어의 확률을 조금 끌어올릴 수 있다. 4.2.7 네거티브 샘플링 구현 앞과 크게 다르지 않다. 4.3 개선판 word2vec 학습 # PTB 데이터셋으로 학습해보자. 4.3.1 CBOW 모델 구현 4.3.2 CBOW 모델 학습 코드 4.3.3 CBOW 모델 평가 4.4 word2vec 남은 주제 # 4.4.1 word2vec을 사용한 애플리케이션의 예 전이 학습 한 분야에서 배운 지식을 다른 분야에 적용하는 기법 자연어 문제를 풀 때, 처음부터 학습하는 것이 아니라 위키백과나 구글 뉴스등의 큰 말뭉치로 학습을 끝낸 후, 우리가 원하는 작업에 돌입하자. 문장을 고정크기 벡터로 변환할 때에는 단어 벡터들의 합을 이용하자. 4.4.2 단어 벡터 평가 방법 우리가 얻어낸 분산 표현이 좋은지는 어떻게 평가할 수 있을까? 단어의 유사성 사람이 작성한 단어 유사도를 검증 세트로 사용해 평가하는 것 유추 문제를 이용한 평가 “king : queen = man : ?” 과 같은 문제를 출제해서 정답률로 측정 4.5 정리 # CBOW모델은 말뭉치의 어휘 수 증가에 비례해 계산량이 증가하는 문제가 있었다. 이를 Embedding계층 구현, 네거티브 샘플링 두가지 방법을 도입해서 해결하였다. 핵심은 어휘 모두를 처리하는 것이 아니라 일부 단어만을 대상으로 하는 것이다. ❔질문 사항 # yes / no 결정문제로 만들면 no가 나오면 yes가 나올때까지 돌리는건가? 근데 그러면 똑같이 시간복잡도가 $O(N)$인거 아닌가? 아하, 위는 학습에서나 나오는 이야기고, 결국 나중에 디코딩할때는 = 단어를 찾을 때는 어떤 벡터의 결과값으로 가장 가까운 단어를 찾아가는건가? 그건 어떻게 이루어지지? 벡터공간에서 가장 가까운 점 찾기가 쉽나? -> 근사 최근접 이웃 (Approximate Nearest Neighbor, ANN) 알고리즘을 이용한다. [[260127_TIL_Approximate Nearest Nighbor 알고리즘]] 🔗 참고 자료 # https://word2vec.kr/search/
📝 상세 정리 # 이번 장도 단어의 분산 표현 앞 장에서 통계 기반 기법을 이용했다면, 이번에는 추론 기반 기법을 이용하겟다. 3.1 추론 기반 기법과 신경망 # 3.1.1 통계 기반 기법의 문제점 결국 동시발생 행렬을 만들고 SVD를 적용해야하는데, 이는 큰 말뭉치에서 너무 어렵다 동시발생행렬의 크기는 $O(N^2)$ SVD 연산 시간은 $O(N^3)$ 이라 어휘가 100만개 단위로 되면 현실적으로 불가능해진다 추론 기반 기법에서는 소량(미니배치)씩 학습해서 가중치를 갱신한다. 어휘량이 많아도 가능하고 여러 GPU를 이용한 병렬 계산도 가능하다! 3.1.2 추론 기반 기법 개요 추론: 주변 단어(맥락)이 주어졌을때 빈칸에 무슨 단어가 들어가는지를 추측하는 작업 추론을 통해 신경망으로 각 단어의 출현 확률을 만들자. 3.1.3. 신경망에서의 단어 처리 신경망은 단어를 그대로 처리할 수 없으니, 원핫 벡터로 변환하자. 원핫벡터: 벡터의 원소중 하나만 1이고 나머지는 모두 0인 벡터 3.2 단순한 word2vec # 3.2.1 CBOW모델의 추론 처리 CBOW모델은 맥락으로부터 타겟을 추측하는 용도의 신경망 타겟은 중앙 단어, 맥락은 주변 단어 N개의 단어를 맥락으로 사용하기로 결정했다면, N개의 원핫벡터가 입력층이 된다. 은닉층에 들어갈 값은 여러개의 입력층의 결과의 평균이다. 첫번째 입력층의 결과가 $h_1$, 두번째 입력층의 결과가 $h_2$라면 은닉층의 뉴런은 $\frac{1}{2}(h_1 + h_2)$ 이 된다. 출력층의 뉴런 하나하나는 각각의 단어에 대응되고, 해당 단어의 점수가 나온다. 점수는 확률로 해석되기 전의 값으로, softmax함수로 확률을 얻어낸다. 은닉층의 뉴런수를 입력층의 뉴런수보다 적게 하는것이 중요하다. 이렇게 해야 은닉층이 단어 예측에 필요한 정보를 간결하게 담게 되며, 결과적으로 밀집벡터 표현을 얻을 수 있다. 단어 벡터를 은닉층에 넣어서 사람이 알아보지 못하게 되는걸 인코딩, 반대로 은닉층의 정보를 사람이 알아볼 수 있는 결과로 만드는 작업을 디코딩이라고 한다. CBOW모델은 활성화 함수를 사용하지 않는 간단한 신경망이다. 여러개의 입력층은 같은 가중치를 공유한다. 3.2.2 CBOW 모델의 학습 위에서 구한 점수에 softmax함수를 적용하면 확률을 얻을 수 있다. 3.2.3 word2vec의 가중치와 분산 표현 $W_{in}$의 가중치의 각 행은 각 단어의 분산표현에 해당하고, $W_{out}$에서는 각 단어의 분산 표현이 열 방향으로 저장된다. 행렬의 차원중 어디가 각 단어에 대응되는지 알면 직관적인듯 3.3 학습 데이터 준비 # 3.3.1 맥락과 타깃 이전에 말한대로 맥락은 주변단어, 타깃은 중앙 한단어 맥락은 여러개가 될수 있으므로 contexts라고 복수형 표현을 권장 이전에 했던것과 같이 텍스트를 단어 ID로 바꾸고, 이를 배열로 저장한다. 3.3.2 원핫 표현으로 변환 학습에 사용하기 위해 이를 원핫 벡터로 바꾼다. 8개짜리, 7종류 단어의 문장이어서 (6, 2 )의 단어 ID 벡터가있었다면 이는 단어 ID가 원핫 베겉로 바뀌며 (6, 2, 7 )의 벡터가 된다. 3.4 CBOW 모델 구현 # 간단하게 두개의 맥락을 $W_{in}$ 을 통과켜서 평균을 내고, $W_{out}$을 거쳐서 softmax를 통해 Loss를 얻어내는 모델을 구상해보자. 3.4.1 학습 코드 구현 일반적인 신경망 학습과 완전히 같다! (1장 참조) 입력층의 가중치, 즉 $W_{in}$을 꺼내봄으로 단어 ID의 분산표현을 잘 확인할 수 있다. 하지만 아직 큰 맒룽치에서는 처리속도가 느리다는 문제점이 있다. 3.5 word2vec 보충 # 3.5.1 CBOW 모델과 확률 CBOW모델을 확률 표기법으로 기술해봦. 맥락이 두개인 경우, 조건부 확률 식으로 $P(w_t | w_{t-1}, w_{t+1})$ 과 같이 나타낼 수 있다. 이를 이용해 손실함수도 간결하게 표현할 수 있다. $L = -\log P(w_t | w_{t-1}, w_{t+1})$ $L = -\frac{1}{T} \sum\limits_{t = 1}^{T}\log P(w_t | w_{t-1}, w_{t+1})$ 말뭉치 전체에 대한 식 3.5.2 skip-gram 모델 CBOW모델과 맥락과 타깃을 역전시킨 모델 중앙 단어 하나로 주변 단어를 예측하자 $P(w_{t-1}, w_{t+1} | w_t) = P(w_{t-1}| w_t) P(w_{t+1} | w_t)$ $L = -(\log P(w_{t-1}| w_t) + \log P(w_{t+1} | w_t))$ $L = -\frac{1}{T} \sum\limits_{t = 1}^{T}(\log P(w_{t-1}| w_t) + \log P(w_{t+1} | w_t))$ 단어 분산의 정밀도 면에서 skip-gram 모델이 CBOW모델보다 더 좋을 때가 많다. 하지만 학습 면에서는 cbow 모델이 더 빠르다. 손실을 맥락의 수만큼 구해야하기 때문 3.5.3 통계 기반 vs 추론 기반 통계 기반은 전체를 보면서 1회, 추론 기반은 미니배치를 보면서 일부씩 여러번 학습했다. 여러가지 추가 상황들을 생각해보자. 어휘에 추가할 새 단어가 생겨난 경우 통계기반 방법은 계산을 처음부터 다시 해야함 추론기반 방법은 학습된 가중치를 초깃값으로 추가 학습을진행하면 됨 얻게되는 분산표현의 성격이나 정밀도 의외로 단어의 유사성을 정량평가한 결과, 둘 사이에 우열은 없었음 skip-gram과 네거티브 샘플링을 이용한 모델은 동시발생행렬에서 특수한 행렬 분해를 적용한 결과와 같았다!! ❔질문 사항 # 🔗 참고 자료 #
📝 상세 정리 # 야호! 자연어처리의 세계로 들어왔다! 문제의 본질은 컴퓨터가 우리의 말을 이해하게 만드는 것 2.1 자연어 처리란 우리가 평소에 쓰는 말을 자연어라고 한다. 자연어 처리 (NLP)는 이 자연어를 처리하는 분야. 컴퓨터가 우리말을 이해하게 만들자 우리의 말은 문자로 구성되며, 말의 의미는 단어로 구성된다. 단어는 의미의 최소단위이다. 따라서 컴퓨터에게 단어의 의미를 이해시키는게 중요하다. 그 방법으로는 시소러스를 활용한 기법 통계 기반 기법 추론 기반 기법 (word2vec) 2.2 시소러스 단어의 의미를 나타내기 위해, 사람이 직접 단어의 의미를 정의해보자. 표준국어 대사전처럼 각각의 단어에 그 의미를 설명해 넣을 수 있을까? EX) 자동차 원동기를 장치하여 그 동력으로 어쩌구 시소러스는 유의어 사전으로, 뜻이 같은 단어나 비슷한 단어를 한 그룹으로 묶은 것 동의어 / 유의어 상위와 하위, 전체와 부분 등 더 세세한 관계까지 정의해둔 경우도 있다. 이 그래프 구조를 단어 네트워크라고 생각하고, 컴퓨터한테 가르칠 수 있지 않을까? WordNet 자연어 처리에서 가장 유명한 시소러스 그런데 이런 시소러스에도 문제가 있는데.. 시대 변화에 대응하기 어렵다 사람을 쓰는 비용은 크다 단어의 미묘한 차이를 표현할 수 있다 2.3 통계 기반 기법 이제부터는 말뭉치(corpus) 를 이용할 것 대량의 텍스트 데이터 맹목적으로 수집한거 말고, 연구나 어플리케이션을 위해 수집한 것 말뭉치 안에는 자연어에 대한 사람의 지식이 충분히 담겨있다고 볼 수 있다! 자연어 처리에는 다양한 말뭉치가 이용되는데 위키백과나 구글뉴스등도 되고 셰익스피어나 나츠메소세키씨 작품이라던지 일단 한번 연습을 해보자. 전처리 텍스트 데이터를 단어로 분할하고 그 분할된 단어들을 단어 ID 목록으로 변환하는 일 단어의 분산 표현 색을 코발트블루/싱크레드처럼 이름붙일수도 있지만, RGB기호로 나타낼 수도 있을 것이다 심지어 그쪽이 색을 더 정확하게 명시할수도 있고, 3개의 성분으로 간결한 표현도 된다 관련성 여부도, 정량화하기도 쉽다!! 그렇다면 단어도 이렇게 벡터로 표현할 수 있을까? 이를 단어의 분산 표현 이라고 하자 분포 가설 많은 연구들과 기법들이 있었는데, 그 뿌리는 다음과 같다. 단어의 의미는 주변 단어에 의해 형성된다 이를 분포 가설이라고 한다. 이는 단어 자체에는 의미가 없고, 그 단어가 사용된 맥락이 의미를 형성한다는 것을 내포한다. 앞으로 맥락이란 주변에 놓인 단어들을 가리킬 것이다. 윈도우 크기가 k라면 좌우 k단어씩, v[idx-k:idx+k+1] 을 의미한다. 일단 먼저 주변 단어를 세어보는 방법이 자연스럽게 떠오른다! 이를 통계 기반 기법이라고 하자. id값의 종류를 크기로 하는 벡터를 id에 대해 연결해서, $N^2$ 행렬을 만들 수 있다. 이를 동시발생 행렬이라고 하자. 이제 벡터 사이 유사도를 측정하자. 내적.. 유클리드거리.. 등등 모두 쓸 수 있겠지만 우리는 코사인 유사도를 이용하자. $\text{similarity}(\mathbf{x}, \mathbf{y}) = \frac{\mathbf{x} \cdot \mathbf{y}}{||\mathbf{x}|| \, ||\mathbf{y}||} = \frac{x_1 y_1 + \cdots + x_n y_n}{\sqrt{x_1^2 + \cdots + x_n^2} \sqrt{y_1^2 + \cdots + y_n^2}}$ 이때 ${||\mathbf{x}||}$는 노름이다. 값은 -1에서 1 사이가 나온다. 이걸로 내림차순을 하든 뭘하든 해서 유사도를 계산할 수 는 있지만… 말뭉치가 작으면 문제가 많다. 2.4 통계 기반 기법 개선하기 두 단어를 그냥 이렇게 생으로 하면.. 문제가 깊다 the car의 the같이 괘씸한 놈이 존재함 점별 상호정보량 (PMI) $\text{PMI}(x, y) = \log_2 \frac{P(x, y)}{P(x)P(y)}$ $P(x), P(y), P(x, y)$ 는 각각 x가 일어날 확률, y가 일어날 확률, 동시에 일어날 확률 이 PMI값이 높을수록 관련성이 높다 이는 동시발생 행렬을 이용해서 다시 쓸 수 있는데 $= \log_2 \frac{\frac{C(x, y)}{N}}{\frac{C(x)}{N} \frac{C(y)}{N}} = \log_2 \frac{C(x, y) \cdot N}{C(x) C(y)}$ 하지만 이때 동시발생횟수가 0이면 $log_2 0$ 을 계산해야한다는 문제가 있다… 따라서 양의 상호정보량을 사용하자. $= \text{PPMI}(x, y) = \max(0, \text{PMI}(x, y))$ 0 이상의 실수로 표현하는게 가능해졌다! 거대한 문제가 생겼다 단어가 $N$개면 차원 또한 $N$개가 된다!!! 심지어 대부분은 0이다 차원 감소 물론 중요한 정보는 최대한 유지하면서 차원을 줄여야한다. sparse한 행렬/벡터를 중요한 축을 잘 찾아서 dense한 행렬/벡터로 만들어야 한다 특잇값분해(SVD) 임의의 행렬을 세 행렬의 곱으로 분해 $\mathbf{X} = \mathbf{U}\mathbf{S}\mathbf{V}^T$ $\mathbf{U}, \mathbf{V}$는 직교행렬 $\mathbf{S}$는 대각행렬 근데 이게 시간복잡도가 $O(N^3)$이라서, Truncated SVD같은걸 이용하기도 한다. 특잇값이 작은걸 버리는 방식 PTB 데이터셋 본격적인 적당한 말뭉치를 이용해보자! 여러가지 전처리는 좀 해두셨다 희소한 단어를 <unknown>으로 바꾸기 구체적인 숫자르 N으로 수정하기 각 문장의 끝에 <eos> (end of sentence) 추가하기 결과가 재밌다! 신기하네 2.5 정리 우리는 단어의 의미를 벡터로 인코딩하는데 성공했다! 와! 심지어 SVD를 이용해서 차원을 감소시키고 더 좋은 벡터를 얻어냈다! 와!! ❔질문 사항 # 윈도우를 이용해서 하면, 문법적인것 (굴절어, 교착어 등)에 대한 정보가 손실되지 않나? I say hello와 hello say I가 같은 의미를 가지게 되니까. 직교행렬을 공부하자 선형대수를 공부해야한다 ㅁㄴㅇㄹㅁㄴㅇㄹ 🔗 참고 자료 #