Deep Learning/CS224N

[CS224N] ConvNets for NLP

언킴 2021. 9. 6. 20:35
반응형

해당 강의에서는 CNNs을 다루기 전 RNN의 단점에 대해서 먼저 다룬다. RNN은 Prefix(접두사) context를 모두 포함하게 되며 Piece of sentence로 나누지 못한다는 단점이 있고, Sequence to Sequence의 모델을 살펴볼때 앞 단 Encoder부분의 RNN에서 Decoder로 보내주는 과정의 Last hidden state는 Last token에 영향을 많이 받게 된다. 또한 단어의 길이가 길어지면 정보의 손실이 발생할 수 있다는 것이 큰 문제이다. GRU나 LSTM 등 모델을 사용하거나 Encoder 부분에 Attention을 사용해 문제를 보완하곤 했다. 

 

 

CNNs

CNNs 에서는 특정 길이로 Sub-sequence로 분할한 후 Feature를 추출하는 과정으로 접근했다. Window size 만큼 짤라 진행하며 언어학적 idea가 아니기 때문에 문법적으로 맞는지 확인이 불가하며 Vision 분야에 많이 적용하고 있다. 그렇다면 NLP에서의 CNN은 어떤 식으로 작동할까? 

 

학습되어야할 파라미터들의 Filter가 하나 있다고 가정하자. (size=3) 거기에 맞는 token의 embedding vector가 있다고 가정하면, Filter size의 영역만큼 convolve하게 되며 결과값을 출력하게 된다.  NLP에서는 이미지와 달리 한 단어의 정보를 모두 속해야 하기 때문에 한 방향으로 진행할 수 밖에 없다. 그래서 1d Convolution 이라고도 불린다. 해당 단어들을 filter로 계속해서 convolve하면서 stride만큼 이동하며 계산하면 원래의 차원보다 줄어드는 것을 알 수 있다. 이러한 문제를 해결하기 위해 이미지에서 한 zero-padding과 같이 위 아래에 공집합($\phi$)을 넣어 정보 손실을 없앤다. 원래 sequence를 보존하기 위함이다. 

 

 

 

Pooling

위 예시는 하나의 Filter를 가지고 convolve 했지만, 여러개의 Filter로 단어를 convolve하게 되면 더 많은 정보를 얻을 수 있는 장점이 있다. 뽑혀진 feature를 summarize하고 싶을 때 주로 사용되는 기법은 Max pooling 기법이 있다. Max pooling 기법은 각 Filter 중에서 가장 큰 값을 뽑아주어 하나의 vector로 만들어준다. K-max pooling은 Max pooling과 달리 하나의 feature만 뽑는 것이 아니라 가장 큰 k개의 feature를 뽑는 기법이다. 이때 주의해야할 점이 출력된 값의 크기대로 정렬해서 적어주는 것이 아니라 값이 있는 그 위치를 보존해 적어주어야한다. 위치를 보존하게 되면 그 단어의 위치에 대한 정보까지 반영이 된다고 한다. Average pooling은 말 그대로 Filter의 평균값을 적어주는 기법이다. 하지만 NLP에서는 각 문장에서의 단어의 중요도나 위치값이 필요하기 때문에 이방법은 잘 사용하지는 않는다. 예시에서는 Stride를 1로 convolve를 했다. Stride를 1이 아닌 다른 값으로 하면 어떻게 될까? Stride를 2로 크게두어 진행하게 되면 상대적으로 연산량이 많이 줄어들고, 출력되는 Sequence의 길이 역시 줄어들게 된다. 하지만 NLP에서는 단어들의 정보를 중요시(?)하기 때문에 이런 방식을 잘 사용하지 않는다.  local max pooling은 Vision에서는 엄청 많이 사용되는 기법 중 하나이다. stride를 2 두고 해당 영역의 Local max pooling을 통해서 값을 산출하고, 계산하는 방식이다. 

 

 

Dilated convolution

Dilated convolution은 Pooling후 나온 값들을 가지고 연산을 한다. Dilation rate=2라고 하면 Sequence의 차이가 2라는 말이며, 1, 3, 5 / 2, 4, 6 / 3, 5, 7 행들을 각각 Filter를 적용해 convolve 하는 방식으로 진행된다. Dilated convolution은 적은 parameter로 넓은 범위의 Sequence의 정보를 담을 수 있다는 장점이 있다. 

 

 

 

1$\times$1 Convolutions

Kernel size(Filter) 를 1로 두고 1d convolution을 하는 것을 말한다. kernel size를 1로 두었기 때문에 파라미터를 적게 사용하면서 channel을 축소할 수 있다. channel을 축소했기 때문에 Fully conneted layer의 input으로 사용이 가능하다. 차원을 많이 축소했기 때문에 다음 Layer에서도 파라미터를 적게 사용할 수 있다. 

 

Batch Normalization

BN은 해당 노드에 대해서 Batch 단위로 정규화를 하는 방법이다. ( $\mu = 1, \sigma = 1$ ) 정규화 계층마다 scaling과 shifting을 하게된다. 계속적으로 shifting과 scaling을 해주기 때문에 Paramter의 initialization에 덜 민감하다. Learning rate에 대한 tuning 역시 쉬워진다. ( vanishing gradient ploblem이 완화? 해소? 된다 ) BN을 사용하면 일반적으로 성능이 조금 더 좋게 나온다. 

 

$\hat{x_i} \leftarrow \frac{x_i-\mu_{\mathcal{B}}}{\sqrt{\sigma^2_{\mathcal{B}}} + \epsilon}$

$ y_i \leftarrow \gamma \hat{x_i} + \beta \equiv \mathbf{BN}_{\gamma,\beta}(x_i)$

 

 

 

 

Sentence Classification

Sentence Classification을 CNN으로 접근한 가장 대표적인 논문은 Convolutional Neural Networks for Sentence Classification(2014)다. 이 논문은 매우 간단한 구조로 이루어져 있다. 오로지 한 번의 convolution 연산과 pooling을 통해서 마지막 fully connected layer를 사용해 classification을 하는 모델이다. 주로 CNN에서 convolution 연산을 하게 되면 주로 Matrix 구조로 연산을 하게 된다. 해당 논문에서는 Matrix가 아니라 단어 vector를 concat해서 연산을 했다.  해당 논문은 특이하게 마지막 convolution 연산 뒤에 padding을 해주고, Filter 연산 후 출력된 $\mathbf{c}$에 max pooling을 통해 $\hat{c} = max{c}$를 도출해낸다. 해당 논문에서는 Filter 를 여러개를 만들었지만 열과적으로는 max pooling을 해주기 때문에 filter size가 변화하거나 문장 길이를 여러개로 하는 부분에 대해 대처가 가능하다. 

 

- Word vector : $X_i \in R^k$

- Sentence : $X_{1:n} = [X_1 ; X_2 ; \cdots\ ; X_n]$

- convolutional filter : $W \in R^{hk}$ ( window size : $h$)

- $c_i = f(w^Tx_{i:i+h-1} + b)$

- $f$ : non-linear function (hyperbolic tangent)

- Feature map 의 결과 : $ \mathbf{c} = [c_1, c_2, \cdots\ ,c_{n-h+1}] \in \mathbb{R}^{n-h+1}$

 

 

Multi-channel input

본 논문에서는 Multi-channel 기법을 사용했다. Multi-channel 은 하나의 Pre-trained된 word vector를 두 set을 만들고 하나의 set은 fine tuning을 시키고, 다른 하나의 set에는 fine-tunin을 시키지 않고 학습을 하게 되는 것이다. 그 후 CNN연산을 통해 계산을 하고 Fully conneted layer와 softmax를 이용해 classification을 수행한다. 

 

Dropout

마지막 FCN node에서만 Dropout(p=0.5)을 해주었다. ( $y = softmax(W^{(S)}(r \circ z) + b)$, r : masking vector ) Dropout을 사용하면 이전보다 2~4% 성능이 향상된다. (test set에는 dropout을 사용하지 않고 p를 곱해줘서 scaling을 해주어야한다. $\hat{W^{(S)}} = pW^{(S)}$ ) 

 

L2 norms

$W^{(S)}$의 각 행에 L2 norm 을 적용한다. 

$||W^{(S)}_{c\cdot}|| > s $ 이면 $||W^{(S)}_{c\cdot}|| = s$로 re-scaling (s=3)

자주 사용되는 방법은 아니다.

 

 

 

Alexis Conneau(2017) : Very Deep Convolutional Networks for Text Classification

2017년에 Text classification을 Vision style로 실험한 논문이다. 이 모델은 기존 NLP의 모델들인 RNN, LSTM 등과 비교하면 상당히 Deep한 구조를 가지고 있지만, Vision 분야에 비해서는 상대적으로 Deep하지 않은 구조라고 할 수 있다. 해당 논문에서는 Character 단위로 embedding을 진행하였고, text size는 일정하게 지정했다. ( 긴문장인 경우 truncated, 짧은 문장일 경우 padded) Local pooling으로 문장 길이를 축소했지만 feature는 두 배로 증가했다. pooling을 하게 되면 길이가 2배로 축소되기 때문에 feature, channel 을 두 배로 증가시켜 정보를 비슷하게 맞춰준다고 할 수 있다. 

 

Convolutional block

2개의 convolutional layer로 구성되어 있으며 Batch normalization & ReLU를 적용하고 Filter size =3, Padding을 사용해 input 길이를 고정시켰다. 

 

layer의 층이 깊어질수록 성능이 더 좋은 것을 확인할 수 있었고, MaxPooling, KMaxPooling 들 중 어느 것이 더 좋은가하는지에 대한 문제는 데이터 셋마다 조금씩 다른 결과를 나오는 것을 확인할 수 있다. 

'Deep Learning > CS224N' 카테고리의 다른 글

[CS224N] ELMo, ULMfit  (0) 2021.09.26
[CS224N] Subword Model - BPE, Wordpiece  (0) 2021.09.14
[CS224N] Machine Translation (MT), Attention  (0) 2021.09.03
[CS224N] Language Model (n-gram, NNLM, RNN)  (0) 2021.09.01
[CS224N] Parsing  (0) 2021.08.31