KT-Aivle School (AI)/딥러닝

[언어지능 딥러닝] CNN for NLP

똔똔똔 2022. 10. 7. 19:20
학습이 된 신경망 모델은 파라미터
“Learn” features as a layer-wise hierarchical representation

 

 

Chapter 1. CNN 기반 자연어처리

CNN 기초부터 다시 정리

➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔ ➔ 

 

CNN은 본디 이미지 분류를 위한 신경망 모델

 

NLP에서 CNN은 데이터가 텍스트인 것

 

 

CNN 개요 (Convolutional Neural Network)

전통적인 기계학습 (분류)

- 전문가들이 디자인한 자질로 표현

- 분류기 학습

 

 

딥러닝 (Deep Learning)

= 무엇을 피처로 볼 것인지 알고리즘 자체가 계층적으로 학습을 한다.

“Learn” features as a layer-wise hierarchical representation

 

 

 

Pipeline of training ML systems

1) Collect a data: training set, validation set, test set
    - training: 실제 학습 용도
    - validation: overfitting 방지 용도
    - test: 실제 평가 용도
2) Hypothesis set: 사용할 신경망 구조 선택, 하이퍼 파라미터 변화 등
3) Loss function: Define a loss function (손실 함수)
    - Regression(회귀) -> MSE (Mean Squared Error, 평균제곱오차/오차의 제곱에 대한 평균)
    -  Classification(분류) -> NLL (Negative Log Likelihood, 음의 로그우도)
4) Optimize
    - 최적화란 loss function을 최소화시키는 가중치 벡터 W 를 찾아가는 과정

      (옵티마이저의 역할 = 파라미터 최적화)
    - SGD(Stochastic Gradient Descent)
    - Adagrad
    - ADAM (adaptive하게 learning rate를 조절) -> 가장 많이 사용

 

 

overfitting

= Overfitting이란 너무 학습 데이터에만 과하게 학습이 되어서

새로운 (처음보는) 데이터가 들어왔을 때는 성능이 안 좋아지는 문제.

(보통 training loss 는 낮은데, test error 는 높아질 때 발생)

 

regularization

Dropout: Randomly turn off

Early stopping: Stop training once the validation loss starts to increase

 

드롭아웃과 얼리스타핑

 

다중신경망 (Multi-Layer Neural Network)

# of dimensions in output layer = # of classes

 

 

Convolutional Neural Networks (CNN)

 - Convolution 연산을 활용하여 입력 이미지의 특징을 찾는 과정

 - 컨볼루션 (Convolution) Layer와 풀링 (Pooling) Layer들이 순차적으로 쌓여져 있는 Network

 - 전체 이미지가 아닌 구역별로 나누어(커널) 학습 후 분류

CNN모델의 기본구조

 

 

32x32x3 레이어에서 크기5의 필터 6개(stride=1)로 학습을 진행하니 (32-5+1) 즉, 28x28x6 사이즈의 레이어가 되었다.

 

 

Activation Function – ReLU (Rectified Linear Unit)

<활성함수로 비선형 함수를 쓰는 이유>

 활성함수가 선형함수라면 층을 아무리 쌓아도 하나의 층을 쌓은 것과 동일한 효과가 됨

 

- ReLU는 음의 값인 경우 0으로, 양의 값은 그 값 그대로 치환되어 계산속도가 빠름

 

 

 

Why Pooling?

- 피처들 중 가장 두드러진 피처를 골라내면서 입력의 사이즈를 줄여 효율을 높임

- 분류하고자하는 클래스를 맞춰주기 위해 중간값(핵심값을 찾아가는)의 사이즈를 맞춰줌

 

 

Softmax function

- 신경망이 내놓은 n개의 클래스 구분 결과를 확률처럼 해석하도록 만들어준다

- 보통 output 노드 바로 뒤에 부착

위 그림에서 마지막 뉴런은 10개의 값을 가지고 가장 높은 확률 값을 가지는 클래스가 입력값의 클래스가 된다.

 

 


 

CNN 기반 텍스트 분류

- CNN은 문장의 지역 정보를 보존하면서 각 문장 성분의 등장 정보를 학습에 반영하는 구조

- 학습할 때 각 필터 크기를 조절하면서 언어의 특징 값을 추출하게 되는데 기존의 ngram(2그램, 3그램) 방식과 유사

- max pooling 후 fully connected layer를 이용해 classification

 

I like this movie very much!

입력데이터 = 1x7x5

 

문장에서 지역정보는 인접한 단어의 정보 (인접한 단어 - 필터의 크기)

그림 한 장으로 보는 CNN 기반 텍스트 분류 (영화 리뷰 긍부정 분류)

 

 

 

 

 

CNN for Text Classification

 

감성분석

= 감성 분석 (Sentiment Analysis) 또는 극성 분석 (Polarity Detection)

= 주어진 데이터가 긍정인지, 혹은 부정인지를 판단

 

영화 리뷰 감성 분석

 

네이버 영화리뷰 학습데이터

 

 

NSMC (Naver Sentiment Movie Corpus)

- NSMC Dataset

- 네이버 영화 리뷰 크롤링 데이터 총 200K

- 평가 9~10: 긍정(1), 1~4:부정(0), 이외의 리뷰문은 학습데이터에서 제외

 

 

 

Text to embedded text

B = Batch Size

Input: Tensor (B x N)

    B: Batch size

    N: Max sentence (문장의 최대 길이(단어수))

 

Embedding

    Input (B x N) ➔ Embedded Input (B x N x D)

    D: 단어 벡터의 dimension

 

# torch.nn.Embedding(num_embeddings, embedding_dim)
# 1000개 단어 x 100차원 벡터를 생성(랜덤값 부여)
m = nn.Embedding(1000, 100)

 

 

 

Image example and Convolution layer

mini batch이므로 한번에 들어오는 데이터의 건수 고려 필요 &rarr; 1차원 증가

# torch.nn은 미니배치 형태의 입력만 지원
# 따라서 input은 4D 형식이어야 함
# → (데이터건수 x 채널수 x 높이 x 너비)
input = torch.randn(20, 1, 28, 28)  # batch=20
# Input 채널 1, output 채널 16
m = nn.Conv2d(1, 16, 5, stride=2)

 

 

 

Image example and Text example

그러나 텍스트를 입력하는 경우, 이미지처럼 RGB채널 같은 채널이 없다.

1) 텍스트는 채널 정보가 없다
     Conv2d를 사용하려면, 채널 정보를 추가할 필요가 있다.

     ➔ Use unsqueeze
2) Convolution (filter)
    Image: 3 x 3 filter
    Text: 3 x embedding dim(D)


input = torch.randn(20, 100, 100) # batch=20, blue = dimension, 차원 추가
input = input.unsqueeze(1) # 20 x 1 x 100 x 100

#Conv2d (in_channels, out_channels, kernel_size, stride=1)
# 필터(kernel)은 3x100 사이즈짜리, 100개 적
m = nn.Conv2d(1, 100, (3, 100)) # 100 = D

output = m(input) # output 텐서의 차원 → 20x100x98x1
= (미니배치x커널개수x필터를 거친 레이어 사이즈)


Conv layer with activation function (Text)

 

input = torch.randn(20, 100, 100)
input = input.unsqueeze(1) # 20 x 1 x 100 x 100

m1 = nn.Conv2d(1, 100, (3, 100)) #필터갯수: 100, 3단어를 보겠다는 의미
m2 = nn.Conv2d(1, 100, (4, 100)) #필터갯수: 100, 커널 사이즈 4x100
m3 = nn.Conv2d(1, 100, (5, 100)) #필터갯수: 100

output1 = m1(input) # 20 x 100 x 98 x 1
output2 = m2(input) # 20 x 100 x 97 x 1
output3 = m3(input) # 20 x 100 x 96 x 1

output1 = F.relu(output1)
...

 

 

Pooling layer (Text)

 

output1 = F.relu(output1) # 20 x 100 x 98 x 1, 텐서
output2 = F.relu(output2)
output3 = F.relu(output3)

How to pooling? What dims?

p1 = nn.MaxPool1d(output1.size(2)) # or F.max_pool1d(output, output1.size(2)) 같은 기능이나 호출 인자 다름
(98개 (size(2) - 2차원)에서 가장 중요한 값 maxpooling)

output1 = p1(output1) → Error! MaxPool1D는 3D 입력만 받음.
(입력이 4차원이므로 3차원으로 차원 값을 맞춰줘야 함)
→ Use squeeze (remove the dimensions of input of size 1)

output1 = p1(output1.squeeze(3)) # 20 x 100 x 98

(차원은 0부터 셀 수 있음)
20 x 100 x 98 x 1
(0,     1,    2,     3차원)

squeeze(3) [3]차원 날리기

 

Fc layer (Text)

 

# max pooling 결과
output1 = p1(output1.squeeze(3)) # 20 x 100 x 1
output2 = p2(output2.squeeze(3)) # 20 x 100 x 1
output3 = p3(output3.squeeze(3)) # 20 x 100 x 1
(max pooling을 통해 하나의 가장 큰 값만 남기고 20x100x1 의 크기로 맞춰짐)

# concatenate (output1, output2, output3)
output1 = output.squeeze(2) # 20 x 100, → [2]차원 날리기

output = torch.cat((output1,output2,output3), 1) #1x300

fc = nn.Linear(300, C) # C is class num
out = fc(x)

 

텍스트 입력 텐서 표현 예

 

기계학습 모델의 성능 평가

모델의 성능을 어떻게 수식화할 수 있을까

 

f1 score값 구하기

 

 

 

+
Tip)

때때로, 모델의 성능을 측정할 때 F1 아니라 accuracy로도 충분할 때가 있다.
       테스트 셋이 균형있는 분포로 잡혀 있는 경우.
     (ex. 긍부정 분류에서 긍정50%, 부정50%로 데이터가 공평한 경우)

F1 score는 데이터 label이 불균형 구조일 때, 모델의 성능을 정확하게 평가할 수 있으며, 
성능을 하나의 숫자로 표현