딥러닝을 이용한 자연어처리(2)
Sentence representation을 어떻게 할까
Continous bag-of words(CBow)
단어장을 단어 주머니로 보게되고, 이에 따라 단어의 순서는 무시합니다.
문장에 대해서는 token의 순서를 무시하고 각각의 개별 토큰의 벡터화한 합을 average한다.
효과가 제일 좋기 때문에(경험상) classification 할 때 baseline으로 두고 시도하는게 좋다고 합니다.
관련해서 FastText[Bojanowski, 2017]를 언급하셨는데 저번에 sentiment analysis 공부하다 pytorch로 구현한 링크를 보아서 첨부하겠습니다.
하지만 단어 순서를 무시하고 단순히 토큰벡터의 평균으로 문장을 표현하는거보다는 단어와 단어의 관계나 문장관의 관계를 좀 더 생각하면 좋겠죠.
Relation Network[Santoro et al.2017] : Skip Bigrams
token을 개별적으로 따로 보았던 앞의 CBow와는 다르게 skip-gram은 token의 pair를 묶어서 보게됩니다.
따라서 CBow가 잡아내지 못했던 토큰들간의 관계를 파악할 수는 있지만 모든 pair를 다 계산해야하는 번거로움이 생깁니다. 첫 단어와 끝 단어를 묶어서 생각하는 것이 맞는 걸까? 라는 의문이 들 수 있지요.
그걸 개선한 것이 Convolution Neural Network(CNN)입니다.
k-gram을 계층적으로(hierachically) 보게되어 max-pooling을 통해서 가장 잘 represent하는 vector를 찾아낼 수 있습니다. Layer 를 쌓을 때 마다, 점진 적으로 넓은 범위를 보기 때문에, "단어> 다중 단어 표현> 구절 > 문장"순으로 보는 인간의 인식과도 알맞습니다.
만약 문장 혹은 문단이 인풋일 때 가장 중요한 특징이 제일 처음과 끝에 있다고 가정해봅시다. 그렇다면 CNN의 레이어를 충분히 딥하게 짜지 않는 이상 이 패턴들을 파악하기 쉽지 않을 것입니다. 그에 비해 Relation network 같은 경우는 이런 멀리떨어진 토큰들간의 관계를 너무 많이 본다고 할 수 있습니다. 정리하자면 Relation network는 전체를 , 반면CNN은 local을 파악하는데 더 치우쳐있다고 볼 수 있습니다.
RN : ht=f(xt,x1)+⋯+f(xt,xt−1)+f(xt,xt+1)+⋯+f(xt,xT)
CNN: ht=f(xt,xt−k)+⋯+f(xt,xt)+⋯+f(xt,xt+k)
여기서 CNN을 가중치가 부여된 RN의 형태로 이해하여 보자. 그렇다면 식은
ht=∑t′=1TI(∣t′−t∣≤k)f(xt,xt′) where I(S)=1 if S is True & 0 otherwise 이며 local인 데서만 가중치가 1로 해석하면 됩니다. 인제 여기서 가중치를 0~1 사이의 값으로 계산한 것이 self attention 입니다.
- ht=∑t′=1Tα(xt,xt′)f(xt,xt′)
- α(xt,xt′)=∑t′=1Texp(β(xt,xt′))exp(β(xt,xt′))
- where β(xt,xt′)=RN(xt,xt′)
self attention의 장점은 앞선 두 이론의 long range dependency와 short range dependency를 모두 극복할 수 있다는 것과 낮은 relationship의 토큰은 억제하고 높은 것만 강조할 수 있다는데 있으나 계산 복잡도가 높고 counting같은 연산이 어렵다는 점에서 단점이 있습니다.
Recurrent Neural Network(RNN): RNN은 input이 sequential 하게 연결되어 있고 hidden에 메모리를 저장하여 순차적으로 메모리를 update하는 방식으로 최종적으로 업데이트된 벡터를 내뱉게 됩니다. 따라서 문장의 정보를 시간 순서에 따라서 압축할 수 있습니다. 하지만 마찬가지로 문장이 길어지게 된다면 앞에서 학습된 정보가 뒤로갈수록 잊혀지게 되는 문제가 발생합니다. 또한 모던 하드웨어와 다르게 distribute된게 아니기 때문에 트레이닝 속도가 느립니다.
하지만 이러한 대부분의 문제는 LSTM 이나 GRU를 사용함으로써 해결됩니다.
'machine learning' 카테고리의 다른 글
[3Blue1Brown] 신경망이란 무엇인가 (0) | 2021.12.18 |
---|---|
[CS224N] Introduction and Word Vectors (0) | 2019.07.19 |
딥러닝을 이용한 자연어 처리(3) (0) | 2019.07.19 |
딥러닝을 이용한 자연어 처리(1) (0) | 2019.06.29 |
댓글
이 글 공유하기
다른 글
-
[3Blue1Brown] 신경망이란 무엇인가
[3Blue1Brown] 신경망이란 무엇인가
2021.12.18 -
[CS224N] Introduction and Word Vectors
[CS224N] Introduction and Word Vectors
2019.07.19 -
딥러닝을 이용한 자연어 처리(3)
딥러닝을 이용한 자연어 처리(3)
2019.07.19 -
딥러닝을 이용한 자연어 처리(1)
딥러닝을 이용한 자연어 처리(1)
2019.06.29