* 모두연 박은수님, Pytorch로 시작하는 딥러닝의 내용들을 공부하면서 정리한 내용입니다.  https://www.youtube.com/watch?v=mG6N0ut9dog

1) Data 준비

Text는 연속된 문자 또는 연속된 단어의 형태로 되어있는 순차 (Sequence) 데이터이다. 그렇기 때문에 RNN 같은 순차 모델은 자연어 처리, 문서 이해, 요약, 감성 분류에 활용되고 있다. RNN에서는 이러한 순차 데이터가 가진 feature를 파악하는데 유용하다. 하지만 모델도 기계에서 구동해야 하기 때문에 이러한 텍스트 데이터를 숫자로 변환 (벡터화) 해야 한다. 이때 텍스트의 가장 작은 단위를 토큰 (Token)이라고 하고 이렇게 변환하는 것을 Tokenization이라고 한다. 그리고 이 토큰을 벡터에 대응시키는 작업으로 사용되는 방법은 One-Hot Encoding, Word Embedding이 있다.

일반적인 Tokenization 방법으로 spaCy 또는 split, list를 이용해 문자를 단어로 단어를 글자로 바꾼다. N-그램은 글자나 단어 단위가 아니라 묶음으로도 벡터화 할 수 있다. 이러한 방식으로 Feature space를 개선할 수도 있지만, 순서 정보를 잃어버릴 수 있다. 그렇기 때문에 이것 대신 RNN에서는 주로 사용하지 않는다.

그다음으로 벡터화 방법으로 사용되는 One-hot Encoding, Word Embedding 중 One-hot Encoding은 단어의 길이 (N)을 기준으로 N 길이의 벡터를 만들고 각각의 토큰에 번호를 부여한다. 다만 (0100000)처럼 요소의 값만 1이고 나머지는 0으로 처리한다. 이러한 특징 때문에 데이터가 대부분이 0이 되어 버리고 단어 수가 증가할수록 문제가 될 수 있다. Word Embedding은 부동 소수점 형태의 수로 채워진 Dense Vector로 이를 표현하고 의미가 비슷한 단어일수록 비슷한 값을 가지게 하여 공간에서 근처에 배치되게 한다. (https://wikidocs.net/33520)

2) RNN Model

RNN은 데이터의 순서 특성을 가장 잘 이용하는 모델로, 인간처럼 자연어 등을 순차적이고 반복적으로 처리하는 구조를 갖고 있다. 그리고 이러한 특성 덕분에 길이가 다른 벡터를 사용할 수 있고, 아래 이미지처럼 output의 크기도 다양하다. One to Many의 경우 이미지가 들어왔을 때 글을 생성할 수도 있고 (Image Captioning), Many to one은 어떤 단어들의 요약, Many to many는 Machine Translation 등으로 활용될 수 있다.

http://karpathy.github.io/2015/05/21/rnn-effectiveness/

위의 이미지에서처럼 RNN 모델의 한 셀에서 State vector (초록), Output vector (파랑)를 출력한다. 이 Previous Hidden Vector를 사용하는 이유는 아래 이미지로 쉽게 이해가능하다. 이전 input을 기준으로 계속 넣어준다면 모든 데이터를 알기어렵겠지만, Previous Hidden 방식으로 최종 Output에 모든 input data들을 다 함축해 가지고 있는것을 볼 수 있다. 이처럼 RNN은 이전의 Hidden data를 포함하게끔 하는 딥러닝 뉴럴 네트워크 구조이다. (첫 Hidden은 0으로 초기화함). 만약 input - prev_Input 관계로 되어있었다면 마지막은 보라2/초록2이 될 것 이다.

수식적 설명: https://dacon.io/forum/406031

RNN의 학습 과정은 예를 들어 many-to-many 모델에서 파란 셀의 결과 (y)값들을 기준으로 loss를 각각 계산하고, 그 값들을 모두 합친 Loss (Cross entropy)의 크기를 줄여주는 방향으로 weight를 줄여주는 방식으로 학습을 하게 된다. 이 과정에서 SGD 등의 방식을 사용하게 된다.

3) LSTM Model

크기가 큰 데이터를 사용할 때 RNN에서 발생하는 vanishing gradients, gradient explosion과 같은 문제를 해결하기 위한 변형 알고리즘이 LSTM이다. 예를 들어 위의 이미지를 보아도 길이가 긴 문장을 사용할 때에는 RNN의 기본 모델로는 초반 부분에 대한 데이터를 모두 다 기억하고 있기 어려운 부분이 있다. LSTM이라는 이름에서 알 수 있듯이 손실되는 데이터들을 메모장에 필기하듯이 저장해두는 방식으로, 내부셀에 선형 레이어 대신 각각에 작은 네트워크를 만들어 장/단기간으로 정보를 기억할 수 있는 모델을 만들었다. 

https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/

이 또한 nn.LSTM pytorch layer로 구현이 되어있으며 자세한 수식적 내용은 https://elham-khanche.github.io/blog/RNNs_and_LSTM/를 참고하면 된다. 이미지에서 보면 LSTM에서 윗 부분 (C)에 해당하는 부분이 메모리에 해당하는 부분이고, O로 표시된 작은 네트워크 (Forget gate)에서 활성화 함수로 활용되며 메모리의 값들에서 버릴 것, 유지할 것을 선별하는 작업을 한다고 보면된다. + 기호에서는 내용을 메모리에 update를 하게된다. 

4) 마무리

어느 모델이 그렇듯 LSTM도 한계가 있다. RNN의 셀마다 전달되는 벡터에 모든 내용이 저장되고 업데이트 되는데, 이는 비효율적이므로 메모리에 넣어두고 필요할때마다 만드는 방식을 사용하는 Attention과 더 나아가 Self-Attention을 사용하는 Transformer (Leo Dirac)이 주목을 받았고 최근에 또 새로운 방식이 나온듯하다. 이 부분에 대해서는 GAN 이후에 좀더 공부해보려한다.

https://synergy-ai.github.io/2021-03-23-Transformer-is-all-you-need/

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

6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

Conv1D

 

Conv1D

 - stride: 연결을 n개씩 이동 (default=1)

 - padding: data가 모자라서 tensor의 양 끝에 0을 추가

 

Conv2D

 - Gradient descent, Backpropagation으로 Kernel 값 초기화

 - kernel_size = 1,3,5,7,9 가 일반적이고, 클수록 필터의 영역이 커짐. 초기에는 7 or 9를 사용함

 

Pooling

 - conv2d layer 뒤에 주로 추가하는 것으로 feature map (input img에 filter를 한 결과)의 크기와 Conv2d의 크기를 줄여줌

 - stride와 비슷하지만 가중치는 없음

 - kernel의 크기에서 최대값 (MaxPool2d) 또는 평균값으로 계산

 

ReLU

 - MaxPooling 이후 수행하는 단계로 비선형 layer를 연결하는 형태로 쓰임

 - Feature map을 Activation map으로 변환

 

View

 - 이미지 문제는 보통 마지막에 Fully connected or linear layer를 두어 결과를 출력

 - 다차원 Tensor를 1차원으로 변환함, view(-1, 320) 으로 사용

https://highsg.tistory.com/29

위와 같은 방법으로 모델 설계시 계산할 수 있어야함!!

 

모델 학습

 1) model.train(): dropout으로 일정 비율 제거, 기울기 계산하여 parameter 변경

 2) model.eval(): dropout, parameter 변경 하지 않음!

 

Transfer Learning

 - 사전에 학습된 알고리즘을 유사한 Dataset에 재사용하여 처음부터 학습하지 않음

 - 적은 양의 데이터로도 작동할 수 있는 방법

 - 대부분 Layer의 Parameter는 그대로 사용하고, 마지막 Classifier (FC Layer)만 미세조정

 - 출력을 분류하려는 Class 수에 맞게 수정하고, feature.param = False로 classifier.param=optimizer로 설정해야 함

 

* Learning 속도 향상시키기: Transfer learning 처럼 마지막 layer에만 param을 바꿀 때, 들어오는 값은 동일하게 된다. 그러면 Conv 계산 결과를 저장하여 재사용하도록 한다.

 1) Dataset, Model을 인자로 받아 모든 Dataset의 Conv feature list, label 목록을 반환하는 함수를 만들고

 2) DataLoader로 label, feature로 batch를 생성하도록 함

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

1. 문제정의 & Dataset 만들기

 - 입력 데이터, 문제 유형(회기, 분류 등)을 명확히 정의하기

 - Domain 지식을 활용해 목적에 맞는 Data 수집

 - ML의 가정: 미래 Data는 과거 Data가 묘사하는 Pattern과 유사할 것!

 

2. 모델평가 기준

 - Class Data 분포가 균등할 경우: ROC, AUC (Area Under the Curve)

 - Class Data 분포가 불균등할 경우: 정밀도 (Precision, Recall)

 - 랭킹 문제: mAP (mean Average Precision)

 

3. Dataset 평가

 - Hold-out 검증 set / k-fold 교차 검증 / 반복 k-fold 검증

 

4. Data 준비

 - Data Vectorization 후에 Tensor화 (정규화가 잘 되었는지 확인)

 

5. Baseline 모델

문제 유형 활성화 함수 오차 함수
이진 분류 Sigmoid CrossEntropyLoss
다중 클래스 분류 Sigmoid CrossEntropyLoss
다중 레이블 분류 Sigmoid CrossEntropyLoss
회귀 - MSE
벡터 회귀 - MSE

 - 최적화: Adam, RMSprop 주로 사용하지만 실험이 필요

 

6. Overfitting 정도의 모델

 - Layer, weight, epoch 늘리기

 - 학습 Acc는 증가, 검증 Acc는 증가 안하고 정확도가 떨어지기 시작하면 Overfitting으로 학습 중단시킴

 

7. 가중치 규제 적용

 - Dropout 추가 (실험 필요)

 - 아키텍쳐 변경

 - L1, L2 규제 적용 (2개중 1개만)

 - 특성추가 및 학습 Dataset 늘리기

 - 학습률 변경: torch.optim.lr_schedular의 StepLR, MultiStepLR, ExponentialLR, ReduceLROpPlateau를 사용 (일정 주기로 LR을 조정함; 주로 오차 및 Acc이 정채될 때 변경하는 ReducedLROpPlateau를 사용함)

 

 

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

ML 유형

  * 지도학습: 분류, 회기 (예측), 이미지 분할, 음성인식, 언어 번역

  * 비지도학습: 데이터에 label이 없어 Clustering (그룹화) 및 차원축소 등의 방법으로 Data를 이해함.

  * 강화학습: opentutorials.org/course/4548/28949

 

강화학습 Reinforcement Learning - 생활코딩

 

opentutorials.org

 

Model Evaluation

1) 데이터 셋을 학습 데이터셋 (learning) / 검증 데이터셋 (hyper-param 튜닝) / 테스트 데이터셋 (성능 측정)으로 나눔

2) ML의 변수

  - 가중치: optimizer에 의해 변경 or 역전파 과정 튜닝

  - Hyper-param: 아키텍쳐의 형태 (Layer 수, Learning rate), 구성, 동작 방식을 결정하는 변수로 주로 수동으로 변경해야 함

3) Overfitting / Underfitting: 학습 데이터셋에서는 잘 작동하지만, 검증과 테스트셋에서는 잘 작동안하는 경우 일반화 능력이 떨어지므로 overfitting이고, 그 반대의 경우는 underfittng. 이런 문제를 해결하기 위해 Holdout dataset, k-fold 검증, 반복 k-fold 검증 방법을 사용함. 예를 들어 k-fold 검증은 test dataset을 여러개로 나누고 1개를 검즈으로 번갈아가며 사용한 뒤에 평균값으로 판단하는 방법임. 추가적으로 상황에 따라 데이터 혼합 방법을 사용하기도 함. 

* 데이터 혼합 시 유의해야할 점!!

  - 데이터 표현력: 한쪽에 치중되지 않게 임의의 순서로 섞거나 층화 추도법(stratified sampling) 사용

  - 시간 민감도: 순서 정보가 있다면 도메인 지식을 기반으로 기준 설정해주어야 함

  - 데이터 중복: 일반화가 잘 안될수도 있음

 

Data Preprocessing & Feature Engineering

1) Data Preprocessing

  - Vectorization: Data를 Pytorch Tensor 형태로 변환

  - Normalization: Data 특성을 평균을 0, 표준편차 1로 만들어 정규화하여 더 빠른 학습과 성능 효과가 있을 수 있음. MinMaxScaler 함수를 사용하여 정규화를 할 수 있음

  - Missing value: 도메인 별로 해결방법이 다름 (숫자 대체, 예측 등)

2) Feature Engineering : 도메인 지식 base로 model에 전달할 새로운 변수 및 feature를 만들어 내는 것. 데이터가 부족하다면 feature engineering 이 도움이 될 수 있음.

 

Overfitting & Underfitting 대처법

1) Overfitting: 학습 데이터셋을 완전 암기한 상태로 noise까지 학습해버려서 오히려 새 Data 및 검증 데이터셋에 성능이 안나오는 현상, 단순한 model로 만들어서 해결함

 - 더 많은 데이터 확보: 특정 패턴보단 일반 패턴을 학습할 수 있는 데이터를 확보하고, 더 구할수 없을 땐 데이터 도메인 이해 하에 Data Augmentation (회전, 자름 등)을 이용할 수도 있음

 - 네트워크 크기 줄이기 (선형 Layer수, 가중치수)

 - 가중치 규제 적용: Network가 가중차기 큰 값을 갖지 않도록 regularization을 통해 가중치가 큰 값을 가지면 불이익을 줌. L1 규제(절댓값 weight 계수 총합) 또는 L2 규제 (weight 계수 제곱합)을 cost(Data 오차 합)에 추가함

torch.optim.Adam(params, lr=0.001, weight_decay=1e-5)

- Dropout: model의 중간 layer에 적용되어 일정 비율의 출력을 0으로 설정 (nn.dropout(x, train=True))

2) Underfitting: 학습이 제대로 되지 않는 현상으로 학습 Data를 늘리거나, layer 및 가중치 수를 늘려보도록 한다. (이 경우 가중치 규제는 사용하지 말 것!!)

 

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
3. 신경망 구조  (0) 2021.01.19
2. 신경망 구성 요소  (0) 2021.01.13

1) Layer (신경망 기본 블록)

  - 선형 Layer, 즉 y=wx+b를 의미함 (= Dense, Fully Connected Layer)

  - 각 Layer은 개별적 학습 parameter를 가짐, but 선형 Layer를 여러개 쌓는다고 성능이 좋아지는 것은 아니다. 이는 결국 1개의 선형 Layer로 표현될 수 있기 때문에 결국 1개의 Layer와 차이가 없어진다.

  - 그래서 여러 비선형 활성 함수를 같이 사용해야 한다! (Sigmoid, Tanh, ReLU, Leaky ReLU)

   비선형 활성 함수

     Sigmoid: 실수를 취해 0~1 사이를 출력하도록 한다. input이 음수이면 0에, 양수이면 1에 가까운 값을 반환함. 단점으로는 0 or 1에 가까워 지면 기울기가 0이 되면서 가중치가 더 이상 조정되지 않으며 dead neuron이 됨.

     Tanh: -1에서 1 사이의 값으로 반환, 이 함수도 기울기가 0이 되는 경우가 존재하지만 출력값이 0을 기준으로 만들어지므로 변화폭이 더 큼

      ReLU: f(x) = max(0,x) 로, 음수는 0, 양수는 그대로 반환하게 한다. (단, Leaky ReLU는 음수를 0.001과 같은 매우 작은 수로 반환함). 최근에 가장 많이 사용되는 방법으로 SGD(Stochastic Gradient Descent)가 더 빨리 수렴하고 연산 비용이 적다라는 장점이 있지만, 이 또한 기울기가 크면 죽는 경우가 있어 learning rate를 조정해야 한다.

 

2) Neural Network 구축

    - Pytorch의 nn.Module class를 상속하여 init, forward method를 구현

        * init: 선형 Layer를 초기화

        * forward: init 메소드에서 초기화한 Layer에 입력 데이터를 전달하고 최종 출력 반환 (여기서 ReLU 같은 비선형 함수 사용)

class LinearRegressionModel(nn.Module): 
    def __init__(self): 
        super().__init__()
        self.linear = nn.Linear(5, 2)
        self.linear = nn.Linear(2, 1)

    def forward(self, x):
        return self.linear(x)

model = LinearRegressionModel()

     Model 아키텍쳐

      회기: 예측 문제로 1개의 숫자를 반환함 (마지막 Layer는 선형)

      이진분류: Sigmoid 함수를 마지막 layer에 배치하여 이미지의 output을 A 또는 B 중에 선택하게 함

      다중분류: 마지막 Layer에 softmax 함수를 사용하여 입력 데이터가 각 class로 분류될 확률을 구함 (전체 합=1)

 

3) 오차함수

    - Gradient descent optimizer (scalar를 입력 받기 때문에 loss func도 scalar로 반환해야 함)

    ML은 오차함수에서 나오는 값을 최소화하는 반복 과정으로, 2개의 오차함수가 있어도 1개의 Scalar 형태로 만들어야 함 (part 4 참고). 회기 문제는 nn.MSELoss(), 이진 및 다중 분류 문제는 cross-entropy Loss 등등을 사용하고 L1, NLL, NLL Loss 2d 등이 있다. (nuguziii.github.io/dev/dev-002/)

 

4) 최적화

    - 오차를 줄이고, 알고리즘 정확도를 향상시키기 위해 가중치 최적화하는 과정으로 optim = optim.SGD(model.parm(), lr=0.01)로 사용하고, lr은 학습 param 변경 비율을 의미함. 그리고 계속 누적되기 때문에 반복문 안에서 zero_grad()를 호출하여 기울기 초기화 과정이 필요함

for input.target in dataset:
    #초기화
    optimizer.zero_grad()

    #기울기 계산
    output = model(input)
    loss = loss_fn(output, target)
    loss.backward()

    #학습 param에 적용
    optimizer.step()

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
2. 신경망 구성 요소  (0) 2021.01.13

<해당 글은 'Pytorch로 시작하는 딥러닝' 책을 읽으면서 공부한 내용을 정리한 블로그입니다. 중요한 내용 위주로 정리해서 개인적으로 이해가 된 부분들은 생략되어 있을 수 있습니다.>

1) 데이터 준비 (Tensor)

- Scalar (0차원 텐서)

- Vector (1차원 텐서)

- 행렬  (2차원 텐서)

- 3차원 텐서: image에서 (height x width x RGB Channel)

- 4차원 텐서: batch (주로 16, 32, 64) 로 여러 이미지들의 묶음 (img 수 x height x width x RGB Channel)

- 5차원 텐서: batch x fps (동영상; batch 내 영상 클립 수 x fps x height x width x RGB Channel)

2) Variable 및 계산 그래프

    y=wx+b 라는 선형 모델을 사용할 때, 임의의 값으로 초기화되어 학습하며 이 변하는 w,b는 학습 parameter이고, dataset을 기반으로 정해지는 x, y는 고정 parameter이다. Pytorch의 경우 변수 선언 시 requires.grad를 true (학습), false (고정) varuable로 설정할 수 있다.

3) 신경망 모델 (Fitting)

4) 네트워크 구현

5) 오차함수: Sum of squared (SSE), MSE, Cross-Entropy 등을 이용한다. backward() 함수로 w,b의 변화 정도를 계산하여 측정할 수 있다. (단, 여러번 사용시에는 param.grad.data.zero_()로 앞서 계산된 값을 지워줘야함)

6) 신경망 최적화 (Optimize): Learning rate 등의 hyper-parameter 습 파라미터 (w,b) 조정 시 사용하는 비율을 의미함. Adam, RmsProp, SGD 등이 있다.

7) 데이터 로딩 (DataLoader class): Dataset class에서 init, len, getitem 메소드에 대한 구현 후 DataLoader class를 사용해 batch 형태로 변환한다.

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

7. Recurrent Neural Networks (RNN) & LSTM  (0) 2022.04.08
6. Convolution Neural Network (CNN)  (0) 2021.02.04
5. 머신러닝 Workflow  (0) 2021.02.01
4. 머신러닝 입문  (0) 2021.01.22
3. 신경망 구조  (0) 2021.01.19

+ Recent posts