학습이 된 신경망 모델은 파라미터
“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)
Convolutional Neural Networks (CNN)
- Convolution 연산을 활용하여 입력 이미지의 특징을 찾는 과정
- 컨볼루션 (Convolution) Layer와 풀링 (Pooling) Layer들이 순차적으로 쌓여져 있는 Network
- 전체 이미지가 아닌 구역별로 나누어(커널) 학습 후 분류
Activation Function – ReLU (Rectified Linear Unit)
<활성함수로 비선형 함수를 쓰는 이유>
➔활성함수가 선형함수라면 층을 아무리 쌓아도 하나의 층을 쌓은 것과 동일한 효과가 됨
- ReLU는 음의 값인 경우 0으로, 양의 값은 그 값 그대로 치환되어 계산속도가 빠름
Why Pooling?
- 피처들 중 가장 두드러진 피처를 골라내면서 입력의 사이즈를 줄여 효율을 높임
- 분류하고자하는 클래스를 맞춰주기 위해 중간값(핵심값을 찾아가는)의 사이즈를 맞춰줌
Softmax function
- 신경망이 내놓은 n개의 클래스 구분 결과를 확률처럼 해석하도록 만들어준다
- 보통 output 노드 바로 뒤에 부착
CNN 기반 텍스트 분류
- CNN은 문장의 지역 정보를 보존하면서 각 문장 성분의 등장 정보를 학습에 반영하는 구조
- 학습할 때 각 필터 크기를 조절하면서 언어의 특징 값을 추출하게 되는데 기존의 ngram(2그램, 3그램) 방식과 유사
- max pooling 후 fully connected layer를 이용해 classification
I like this movie very much!
입력데이터 = 1x7x5
문장에서 지역정보는 인접한 단어의 정보 (인접한 단어 - 필터의 크기)
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
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
# 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)
텍스트 입력 → 텐서 표현 예
기계학습 모델의 성능 평가
모델의 성능을 어떻게 수식화할 수 있을까
+
Tip)
때때로, 모델의 성능을 측정할 때 F1 아니라 accuracy로도 충분할 때가 있다.
➔ 테스트 셋이 균형있는 분포로 잡혀 있는 경우.
(ex. 긍부정 분류에서 긍정50%, 부정50%로 데이터가 공평한 경우)
F1 score는 데이터 label이 불균형 구조일 때, 모델의 성능을 정확하게 평가할 수 있으며,
성능을 하나의 숫자로 표현
'KT-Aivle School (AI) > 딥러닝' 카테고리의 다른 글
[언어지능 딥러닝] Transformer (0) | 2022.10.09 |
---|---|
[언어지능 딥러닝] RNN for NLP (1) | 2022.10.08 |
[언어지능 딥러닝] 워드 임베딩 (0) | 2022.10.05 |
[언어지능 딥러닝] 텍스트 마이닝 (0) | 2022.10.05 |
[언어지능 딥러닝] NLP (자연어 처리) (2) | 2022.10.04 |