많은 NLP 기법은 다음과 같은 이유로 단어를 atomic unit으로 취급함.
하지만 이런 모델들은 전사된 음성 데이터로만 학습했기 때문에 도메인이 특정된 자동 음성 인식은 한계가 있다.
기술 발달로 인해 더 큰 데이터셋에 복잡한 모델을 학습시키는 것이 가능해졌다. 이는 분포 포현을 사용하기 때문이라고 추측할 수 있다. ex. NN >> N-gram
방대한 양의 단어로부터 높은 수준의 단어 벡터를 학습하는 기술
아직까지 소개된 아키텍쳐로는 수백만 이상의 단어와 50~100 차원 이상으로 학습할 수 없음.
유사한 단어는 서로 가까이 위치
하고, 한 단어가 다양한 정도의 유사도
를 가질 수 있는 벡터 표현 기술을 제안한다.
단어 간격으로 벡터를 산술적으로 연산할 수 있다.
예) vector("King") - vector("Man") + vector ("Woman") = vector("Queen")
이 논문에서는
통사적 + 의미론적 선형규칙성
(King, Man, Woman, Queen 예시에서 보았듯이)을 보존하는 모델을 구현함으로써 벡터 표현의 정확도를 최대화 단어를 연속 벡터로 표현하는 연구는 계속되어 왔음.
NNLM은 선형 projection layer과 비선형 hidden layer로 구성된 feedforward NN임.
다른 NNLM은 단어 벡터가 하나의 은닉층으로 학습되고, 이 벡터들은 NNLM을 학습하기 위해 사용됨. 따라서 완전한 NNLM을 쌓지 않고도 학습이 되는 것.
본 논문에서는 이 모델 중 단어 벡터가 간단한 모델로 학습되는 부분에 집중. (이 구조를 가져온다는 뜻인가?)
하지만 이런 구조는 계산이 매우 복잡함.
LSA, LDA 등 연속 표현을 예측하는 모델은 많음.
*참고: continuous representation = distributed representation 임.
이 논문에서는 신경망으로 단어표현을 학습하는 방법에 집중. 이 방법이 단어간 선형 구칙성을 보존하는 데에 LSA보다 낫기 때문. 그리고 LDA는 큰 데이터셋에서 계산 복잡도가 높아짐
참고로 여기서 "computational complexity"라고 함은 모델을 학습할 때 필요한 파라미터의 개수를 의미함
계산 복잡도:
E: epoch
T: 단어의 개수
Q: 차차 설명한다고 함^^
주로 E=3~50, T는 10억 이하
+ 모델은 stochastic gradient descent & backpropagation
input, projection, hidden, output으로 구성된 모델
(논문 내내 투사층, 투사층 하는데 좋은 질문이 있어서 첨부함
스택오버플로우 질문)
N개의 단어가 1-of-V 코딩(V는 vocabulary 크기)으로 인코딩 됨.
입력층은 투사층 P(N x D, D는 지정된 차원)로 투사됨.
using a shared projection matrix
공유하는 하나의 투사 행렬이 대체 뭐임
As only N inputs are active at any given time, composition of the projection layer is a relatively cheap operation.
이 대체 무슨 뜻?
NNLM은 투사층이 dense하기 때문에 연산이 복잡하다. N이 10이면 P는 500~2000 정도이고, H는 500~1000 정도이다. 또한 은닉층은 모든 단어에 대한 확률분포를 계산하여 V 차원의 출력층을 갖게 된다.
계산 복잡도
단어를 Huffman 이진 트리로 표현하는 hierarchical softmax
사용.
Huffman
NN의 한계였던 길이 지정을 극복할 수 있는 모델
RNN은 더 복잡한 패턴을 표현할 수 있기 때문에 RNNLM은 투사층이 없음.
이 모델은 시간차를 두고 본인에게 다시 은닉층을 연결하는 recurrent matrix
가 존재한다는 점 -> short term memory 마듦.
계산 복잡도
word representations have the same dimensionality as the hidden layer -> 뭔말
여러 모델을 병렬로 돌릴 수 있는 DistBeleif 프레임워크를 사용하고, AdaGrad 사용
NN 모델들은 비선형의 은닉층 때문에 계산 복잡도가 높아짐. log-linear은 NN만큼은 아니지만 훨씬 효율적으로 대량의 데이터를 학습할 수 있는 방법임
NNLM에서 비선형 은닉층 없어지고 투사층이 모든 단어들에서 공유된 구조
단어의 순서가 투사에 영향을 주지 않기 때문에 bag-of-words
모델이라고 부름. 즉 이전 단어는 투사에 영향을 주지 않음. 앞으로 나올 단어도 사용하는데, 앞뒤로 4개씩 단어를 인풋으로 가지는 log-linear한 분류기를 사용함.
계산 복잡도
이 모델을 CBOW
라고 부르기로 함 그게 사회적 약속이라가지고
CBOW와 유사하지만 maximize classification of word(?)
현재 단어를 연속적인 투사층과 함께 log-linear한 분류기의 입력으로 사용하고 특정 범위의 앞뒤 단어를 예측.
범위를 늘리면 벡터 퀄이 좋아지지만 계산 복잡도도 올라감. 멀리 떨어질수록 현재 단워와 연관이 적기 때문에 샘플링을 적게 하도록 가중치를 둠.
계산 복잡도
이 실험에서는 C=10을 사용
big은 bigger, biggest와 모두 유사도를 가질 수 있다. 이 때 big-biggest 과 같은 관계 small과 유사한 단어를 벡터 연산으로 구할 수 있다.
거리 계산 후 코사인 거리로 벡터 공간에서 해당 단어를 찾으면 된다.
많은 데이터로 고차원의 벡터를 학습하면 미묘한 관계도 답변을 할 수 있다.
8869개의 semantic, 10675개의 syntactic 질문이 있음.
1. 손으로 유사쌍의 목록을 작성하고
2. 질문의 리스트가 단어쌍의 연결로 구성됨
학습을 위해 single token word만 사용 <-개인적으로 이 부분이 이 연구의 한계가 아닐까 생각
그리고 모든 타입에 대해, 각각 타입에 대해 정확도 평가. 가장 가까운 벡터가 답변과 같을 때 정답으로 간주.
구글 뉴스 말뭉치로 학습 (60억 개의 단어를 포함)
당연히 많은 데이터와 높은 차원으로 학습하면 정확도가 높아질 것이다. 하지만 현실적으로 둘 다 잡을 수 없기 때문에 차원, 데이터에 차이를 두고 학습을 시켜보았더니 다음의 결과가 나왔다.
학습률 0.025, 에폭 3으로 학습
모델 비교해봤더니 NNLM이 RNNLM보다 성능이 좋음.
한개의 CPU로 학습
결론적으로는 같은데이터로 3번 학습보다 2배 이상의 데이터로 한번 훈련시키는 것이 훨씬 낫다.
병렬처리 얘기... 걍 그렇구나 하고 넘어감
MRSCC는 각 문장에 한 글자가 빠져있는 1040개의 문장 사용, 5개의 선택지 중에 문장에 들어갈 단어를 찾는 태스크
이 중 Skip-gram으로 시험해 봄.
5천만개의 단어를 640의 차원으로 훈련
Skip-gram 자체로는 LSA에 못 미치지만, Skip-gram + RNNLM 은 58.9%의 성능을 냄
Paris-France+Italy = Rome
결과 잘 나왔다. 데이터를 더 늘리면 훨씬 좋을 성능을 낼 것. 정확도를 높이는 다른 방법은 관계에서 한 개 이상의 예시를 제공. 예를 들어 1개 대신 10개의 예를 사용했더니 정확도가 10% 정도 향상되었다고 함
또한, 벡터 연산을 통해 문맥에 어울리지 않는 단어를 찾는 등 다른 용도로 사용 가능
통사적, 의미론적 언어 태스크에서 유도된 벡터 표현의 성능을 연구함.
신경망 모델과 비교했을 때 간단한 모델을 사용해서도 좋은 퀄의 벡터 표현을 얻을 수 있음을 확인하였다.
계산 복잡도가 낮기 때문에 훨씬 거대한 데이터셋으로 정확한 고차원의 벡터를 연산할 수 있다.
이 연구는 단어 벡터가 Knowledge Bases의 확장과 이미 존재하는 사실을 증명하는 등에 쓰일 수 있을 것이다. 기계번역 역시 유망해보인다.
위키독스 NNLM< RNNLM 더 공부해야겠다,,, https://wikidocs.net/46496