👄

[NLP] Text Classification

뉴욕대 조경현 교수님의 '딥러닝을 이용한 자연어 처리' 를 읽고 정리한 것입니다.

문장을 표현하는 방법

문장이란 길이가 정해지지 않은 토큰들의 Sequence이다.
토큰은 Vocabulary 집합 VV의 원소 xtx_t이다.
토큰이라고 하는 이유는 글자, 형태소, Space, 어절, 숫자 등 다양한 단위로 나누기 위함.
문장을 인코딩하면 문장은 정수 인덱스의 모음으로 바뀌게 된다.

토큰을 표현하는 방법

토큰은 Integer Indices이다.
언어라는 것은 인위적이고, Integer Indices도 인위적으로 만들어낸 것이다.
One Hot Encoding을 통해서 토큰을 벡터로 바꿀 수 있다.
장점 : 모든 토큰 간의 Distance가 1이다.
단점 : 토큰간의 Distance가 달라져야 단어간의 유사도나 관계를 판단할 수 있다.
NN이 토큰의 의미를 잡아낼 수 있도록 하려면 어떻게 해야 할까?
One Hot Vector는 Descrete한 Space기 때문에 Metric을 모른다.
각 토큰을 Continous Vector Space로 투영시킨다. == Embedding
Table Look Up : One hot Code와 Weight Matrix를 곱하는 것은 Weight Matrix의 한 Column이나 Row를 꺼내는 것과 같고, 이를 통해 토큰은 연속적이고 높은 차원의 벡터를 가진다.
위와 같은 과정을 통해 첫번째 Node가 지나고 나면 문장은 Sequence of Vector가 된다.
문장은 가변 길이이기 때문에 Classification등을 하려면 가변 길이의 문장은 Representation 할 수 있는 고정 길의의 무언가로 만들어야 한다.

CBoW

단어가 represent된 vector 들의 집합이다.
문장은 CBoW 안에 있는 vector들의 평균 벡터가 문장의 representation이 된다.
N-Gram 등을 활용해서 Generalize한다.
N-Gram이란 BoW를 개선하기 위한 방법으로 여러개의 Token을 합쳐서 하나의 Gram으로 만들고, 이를 사용하는 것이다.
BoW는 단어간의 순서를 고려하지 않는 집합이므로, N-Gram의 경우 어느 정도는 순서를 고려할 수 있게 된다.
성능이 매우 좋기 때문에 Baseline Model로 삼아야 한다.
Facebook의 FastText가 진짜 좋다.

CBoW를 이용한 Classifier

Backprop, SGD등으로 학습시키면 된다.

Relation Network

Token들의 Pair를 이용해서 학습하는 방법이다.
만들 수 있는 모든 Pair들의 Representation의 Average가 문장의 Representation이 된다.
장점 : 여러 단어로 된 표현을 탐지할 수 있다.
단점 : 모든 단어간의 관계를 보기 때문에 연관이 없는 단어도 보게된다.

RN을 이용한 Classifier

문장 안에 있는 모든 토큰 쌍(pair, nC2개 있겠지)을 만든다.
각 pair에 대해서 NN을 만들고, Pair의 Representation을 만든다.
적당히 잘 섞어 주면 된다. 이는 전체 RN의 Subgraph이다. (아래에서 확인)
만들어진 Representation Pair Vector들을 Average 하고 똑같이 학습시키면 된다.

Convolutional Neural Network

Local한 어떤 Structure가 있을때 그것을 뽑고자 하면 주로 사용하는게 CNN
Text에서는 1-D CONV를 사용함
k-Gram을 Convolution하는 Layer를 Hierachically하게 쌓는다.
Token - 여러 단어 - 표현 - 구 - 문장 등으로 우리가 생각하는 어떤 직관과 잘 부합하게 된다.
단점 : 엄청 먼 거리에 Dependency가 있으면 파악할 수 없다.

최근의 발전

Multi Width Convolutional Layer
Dilated Convolutional Layer
Gated Convolutional Layer
?

Self Attention

RN, CNN과의 비교

RN
모든 관계를 전부 따짐 → 가중치가 전부 1
CNN
Stride에 있는 친구들은 따지는데 다른 친구들은 안따짐 → RN에서 주변 친구들은 가중치가 1, 다른 친구들은 가중치가 0이라고 생각할 수 있음
그렇다면 가중치를 학습시킬 수 있다면 멀리 있는 Token과의 관계도 중요하게 따질 수 있지 않을까?

개요

ht=t=1Tα(xt,xt)f(xt,xt)h_t = \sum_{t'=1}^T \alpha(x_t, x_{t'})f(x_t,x_{t'})
α\alpha는 RN에다가 두개를 넣은 값을 Softmax 등으로 씌운것 등을 사용할 수 있음
장점 : 계산이 복잡함
단점 : Counting 같은 것이 쉽지 않다.

Recurrent Neural Network

토큰을 읽을 때마다 현재까지 읽은 토큰들의 정보를 저장해서 활용할 수 있다.
단점 : 문장이 길어질수록 Information loss가 생김. 순차적으로 계산하기 때문에 다른 네트워크보다 느리다.
Bidirectional Network나 LSTM, GRU 같은 것을 사용한다.