1. 도입
저번에는 통계 기반 기법으로 단어의 분산 표현을 얻었는데 이번에는 추론 기반 기법을 통해서 분산 표현을 얻어보겠습니다.
우선 처음이니깐 가장 간단한 word2vec 구현을 해봅시다.
2.통계 기반 기법의 문제점
한번에 말뭉치 전체를 학습하다보니 시간복잡도가 높고, 단어가 추가되면 전체를 다시 학습해줘야한다. + 단어의 유사성만 인코딩된다.
반면에 추론 기반 기법은 미니배치로 학습하고 병렬 학습이 가능해서 학습 속도를 높일 수 있고, 단어가 추가되도 전체를 다시 학습할 필요가 없다. + 단어의 유사성뿐만 아니라 패턴도 학습한다. 예를 들어서, king + man - woman = queen
-> "improving distributional similarity with lessons learned from word embeddings"를 참고하자.
3. 추론 기반 기법
주변 단어들을 맥락으로 사용해 ?에 들어갈 단어를 추측합니다. 이러한 추론 문제를 반복해서 풀면서 단어의 출현 패턴을 학습합니다.
즉, 맥락 -> 모델 -> 확률분포의 구조를 따릅니다.
4. 신경망에서의 단어 처리
단어를 벡터로 표현해야 단어를 신경망으로 처리할 수 있습니다. 신경망의 계층들은 벡터를 처리할 수 있기 때문입니다.
그래서 단어와 단어ID를 이용해서 one-hot-vector을 만들 수 있습니다.
5. 단순한 word2vec 구현
앞서 추론 기반 방법과 단어를 벡터로 표현하여 신경망으로 단어를 처리하는 방법을 살펴봤습니다. 이제 구현해볼 차례입니다.
word2vec은 skip-gram, cbow로 나뉘게 되는데 맥락으로부터 중심단어를 추론하는 continous bag of words 모델에 대해 먼저 알아보겠습니다.
n개의 입력층에서 matmul 과정을 거치고 평균내서 은닉층 값을 얻을 수 있고 또 matmul을 거쳐서 최종 점수를 알 수 있습니다.
이때 Win의 행벡터는 각 단어의 분산표현이 담겨있습니다. 즉, 우리는 단어의 분산 표현을 알 수 있게 됩니다.
학습을 하면서 더욱 의미와 문법을 담은 분산 표현들이 갱신될 것 입니다.
5-1. CBOW 추론 과정 코드
5-2. 학습
매개변수를 갱신시키다보면 적절한 가중치를 얻게 되고 이것이 단어의 분산 표현이다. 그런데 이 분산 표현은 말뭉치가 어느 분야(음악, 스포츠 .. 등)인지에 따라서 다르게 표현된다.
그리고 multi class classification 문제라서 softmax와 cross entropy를 합친 softmax with loss layer을 사용하여 학습을 진행한다.
5-3. 가중치와 분산 표현
Win과 Wout 모두에 단어의 분산표현이 있는데, 입력층 가중치에는 행벡터로 단어의 분산표현이 있고, 출력층의 가중치에는 열벡터로 단어의 분산표현이 있다. 어떤 걸 단어의 벡터로 사용해야할지는 "Trying word vectors and word classifiers: a loss framework for language modeling"에 의하면, Win을 사용하는 것이 좋다고 한다.
5-4. 학습 데이터 준비
말뭉치에서 맥락과 중심 단어를 위한 원-핫 벡터를 구하는 과정.
대규모 documents -> (preprocess) -> corpus -> (create_contexts_target) -> contexts, target -> (convert_one_hot) -> context vectors, target vectors
문서를 전처리해서 말뭉치로 바꾸고 거기서 맥락과 타겟을 얻는다. 이 맥락이 입력이 되고, 타겟이 정답 레이블이 된다. 근데 맥락과 타겟이 단어ID로 구성되어 있으므로 원핫벡터로 변환하자.
5-5. CBOW 모델 구현
어휘 수와 은닉층의 뉴런 수 사이즈를 받아야 가중치의 shape을 결정할 수 있다. 그래서 vocab size, hidden size를 받는다.
그리고 가중치를 random.randn으로 초기화한다.
in_layer 2개와 out layer 1개, loss layer 1개를 만들어서 리스트에 모은다.
기울기와 파라메터를 모을 수 있는 리스트를 만든다.
마지막으로 Win을 통해 word_vec을 구해준다.
구조는 되었고 이제 forward, backward를 구현한다.
forward는 두 입력층에서 나온 결과를 평균내고 출력층에서 forward하면 score가 나오고 손실층을 통해 Loss를 구할 수 있다.
반면에 backward는 dout -> ds -> da를 구하고 0.5를 곱하고 두 입력층에 backward를 하면 된다.
5-6. CBOW 모델 학습
window_size
hidden_size
batch_size
max_epoch
text -> (preprocess) -> corpus -> (create_contexts_target) -> contexts, target -> (convert_one_hot) -> contexts, target vectors -> model -> optimizer -> trainer -> fit & plot
5-7. cbow와 확률
텍스트 시퀀스가 이렇게 주어졌다면 두 맥락으로 부터 중심 단어를 유추하는 것이라고 할 수 있다.
이를 확률로 표현하면 W_t-1과 W_t+1이 동시에 발생했을 때 W_t가 발생할 확률이라고 표현할 수 있다. 그리고 이것을 이전에 배운 cross entropy에 대입하면 위와 같은 식이 된다.
하나의 샘플 데이터가 아닌 배치 사이즈로 늘린다면 위와 같은 식이 된다.
5-8. skip-gram
cbow가 맥락으로 부터 중심 단어를 추론했다면 반대로 중심 단어로부터 맥락을 파악하는 모델이다.
따라서 loss 함수도 달라지는데 아래 식과 같다.
둘을 비교해보면, skip-gram이 성능이 더 뛰어나고, cbow는 학습 속도가 빠르다. 상황에 따라서 선택하면 된다.
마지막으로 추론 기반 기법과 통계 기반 기법을 융합한 glove기법도 확인해보자.
"glove vectors for word representation"
총정리.
통계 기반 방법은 시간 복잡도가 높고, 새로운 단어를 갱신하는 게 어렵다. 또, 단어의 유사성만을 알아내기때문에 추론 기반 방법을 생각했다. 추론 기반 방법은 맥락으로부터 중심 단어를 추론하는 것이다. 즉, 추론 문제를 풀면서 신경망을 거쳐서 단어들의 확률 분포를 내뱉고 그 중에 확률이 가장 높은 값이 중심 단어가 된다. 이를 실제로 구현해보기 위해서 word2vec의 cbow를 구현해보았다. 먼저 단어를 숫자로 바꿔서 신경망에서 사용할 수 있게 해줘야하는데, 이를 위해서 document -> (preprocess) -> corpus -> (create_contexts_target) -> contexts, target -> (convert_one_hot) -> context, taget vectors 과정을 거쳐서 데이터를 준비했고, 두 개의 Input_layer과 한 개의 output_layer, loss_layer을 통과시켜서 학습을 시켰다. 손실함수는 softmax with cross_entropy를 사용했고, 학습을 통해 입력층 가중치에서 단어의 분산 표현을 얻을 수 있었다. 추가로 skip-gram이 더 어려운 task를 풀기때문에 일반적으로 성능이 좋으며 현재는 통계 기반 방법과 추론 기반 방법이 합쳐진 glove 기법도 사용한다고 한다.
'이제는 사용하지 않는 공부방 > Artificial intelligence' 카테고리의 다른 글
[자연어처리] (2) 텍스트 분류 실습 (0) | 2021.06.09 |
---|---|
[자연어처리] (1) 텍스트 분석 (0) | 2021.06.08 |
[tensorflow] 텐서플로우 여러가지 기능 (0) | 2021.06.02 |
[추천시스템] (3) LearningToRank 실습정리 (0) | 2021.05.29 |
[추천시스템] (2) LearningToRank 논문정리 (0) | 2021.05.29 |