플레이데이터 부트캠프 데이터 엔지니어링 트랙 8주차 (7.24~28)

안인균·2023년 8월 1일
0
post-thumbnail

이번 주차에서는 심화된 "딥러닝"에 대한 학습이 이뤄졌습니다. 다양한 딥러닝 모델에 대한 소개와 실습 코드를 통해 재학습을 하는 과정을 거쳤습니다. 27일은 휴강이었고, 28일은 심한 편도염으로 수업에 불참하였습니다.


Liked

  • Small data sets 학습의 방법으로 나온 "Data augmentation" 과 "Pre-trained 모델" 중 Pre-trained 모델 에 대한 내용을 시작으로 모델이 결국 함수라는 점을 통해 다른 모델의 한 layer 로서 추가가 가능한 점, 이미 학습된 모델이므로 계산량을 줄일 수 있다는 점들을 한 단계씩 알아가면서 결국 Transfer learning (전이학습) 의 전반적인 내용 이해에 많은 도움이 되었습니다. 또한 학습하고자 하는 데이터 셋의 크기와 class 간의 유사성에 따라 다른 Fine-tuning 에 대한 내용을 학습하였는데, 충분한 이론 설명과 예제 덕분에 이해하는데 수월했고, 마지막으로 직접 코드를 확인하면서 해당 내용에 대해 잘 알게 되어 좋았습니다.

  • ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회, 2010년 부터 2017년 까지 진행된 컴퓨터 비전 경진대회, 에 대해 알게 되었고, 해당 대회에서 나온 다양한 CNN 모델들의 구조에 대해 알 수 있었습니다. VGGNet(VGG16), ResNet (Residual Networks), MobileNet 모델들이 어떻게 문제 없이 성능을 높이는 지를 학습하였고, Transfer learning 을 통해 직접 해당 모델을 경험할 수 있는 좋은 기회였습니다.

  • MobileNet 이 사용한 Depthwise Seperable Convolution 방법을 학습하였고, 해당 방법이 어떻게 연산량을 줄이고, 속도를 높였는 지에 대해 알 수 있었습니다. 직접 표준 Convolution layer 와 연산량을 비교하여 그 차이를 더욱 잘 알 수 있었습니다.

  • Class 에서 __call__() magic method 에 대해 학습한 이후 이를 활용하여 다양하게 모델들을 정의하는 방식을 확인할 수 있었습니다. 이외에도 그전에 볼 수 없었던, 다중 출력 모델, 다중 입력 모델들을 예시와 함께 학습할 수 있는 좋은 시간이었습니다.

  • RNNLSTM 에 대한 내용을 듣고 바로 주식 데이터 를 직접 다운받아서 해당 기법들을 실행할 수 있어 좋았습니다.

  • GAN 모델에 대해 학습하면서 "Down sampling"과 "Up sampling" 에 대한 내용을 추가로 알 수 있었고, tensorflow.keras.layers.Conv2DTranspose layer를 통해 Up sampling 하는 방법에 대한 학습을 진행하였습니다. 이후 fashion_mnist 데이터를 이용해 DCGAN (Deep Convolutional Network + GAN) 모델을 직접 구현할 수 있는 좋은 경험을 진행하였습니다.

Lacked

  • 건강관리를 잘 하지 못해 수업에 불참한 것이 매우 아쉬웠습니다. 이른 아침에 일어나서 저녁까지 학습에 집중하는 습관을 들이는데 어느 정도 적응하였으나 건강관리, 컨디션 조절 실패가 매우 안좋았습니다. 한번 아프면 여태 해온 습관들이 무너지는 느낌을 받았기 때문에 앞으로는 건강관리에도 신경 쓸 것입니다.

Learned

  • GlobalAveragePooling (GAP)

    • 입력 Feature map의 채널별(->Global)로 평균값을 추출하여 1 x 1 x channel 의 Feature map을 생성하는 Pooling
    • model.add(keras.layers.GlobalAveragePooling2D())
    • Feature Extraction layer에서 추출한 Feature map을 Classifier layer로 Flatten해서 전달하면 많은 연결노드와 파라미터가 필요하게된다.
      • GAP를 사용하면 노드와 파라미터의 개수를 효과적으로 줄일 수 있다.
    • Feature map의 채널수가 많을 경우 GAP를 사용하는 것이 효과적이나 채널수가 적다면 Flatten을 사용하는 것이 좋다.
    • 보통 256~512개 정도 이상의 채널 수를 가진 데이터에 대해 GAP를 사용하는 것이 보편적이다.
  • Pre-trained Model

    • (다른 목적을 위해)미리 학습된 모델.
    • Pre-trained model을 현재 해결하려는 문제에 이용한다.
    • 대부분 내가 만들려는 네트워크 모델에 포함시켜 사용한다.
    • Pre-trained Model의 Feature Extractor 부분(Backbone network)을
      "내가 만드는 모델의 Feature Extractor로" 추가하여 모델을 구성한다.

이런 방식을 Transfer Learning (전이 학습)이라고 한다.

  • Transfer learning (전이학습)

    • "사전에 학습된 모델"의 구조와 파라미터를 재사용해서 새로운 모델를 만든 뒤 해결하려는 문제를 위해 내 데이터(Custom data)를 "재 학습" 시킨다.
    • Transfer Learning을 이용해 다음을 해결할 수 있다.
      • 1. 데이터 부족문제
        • 딥러닝은 대용량의 학습데이터가 필요하다.
        • 충분한 데이터를 수집하는 것은 항상 어렵다.
        • 대용량 데이터를 이용해 미리 학습한 Layer들을 이용하므로 적은 데이터를 학습시켜도 좋은 결과를 얻을 수 있다.
      • 2. 과다한 계산량
        • 딥러닝 모델을 학습하는데 엄청난 양의 계산 자원이 필요하다.
        • Transfer Learning은 미리 학습된 모델의 Layer들을 사용하기 때문에 새로 학습하는 것 보다 적은 학습으로 좋은 결과를 얻을 수 있다.
        • 순전파 계산은 진행되나, 역전파 진행 시 Pre-trained 모델은 제외되어 계산량이 줄어든다.
  • Fine-tuning(미세조정)

    • Transfer Learning을 위한 Pretrained 모델을 내 데이터셋(Custom Dataset)으로 재(추가)학습시키는 것을 fine tunning 이라고 한다.
    • 주어진 문제에 더 적합하도록 Feature Extractor(backbone)의 가중치들도 조정 한다.
    • 1. 전체 모델을 전부 학습시킨다. (1번)
      • Train dataset의 양이 많고 Pretrained 모델이 학습했던 dataset과 Custom dataset의 class간의 유사성이 낮은 경우 적용.
      • 학습에 시간이 많이 걸린다.
    • 2. Pretrained 모델 Bottom layer들(Input과 가까운 Layer들)은 고정시키고 Top layer의 일부를 재학습시킨다.(2번)
      • Train dataset의 양이 많고 Pretrained 모델이 학습했던 dataset과 Custom dataset의 class간의 유사성이 높은 경우 적용.
      • Train dataset의 양이 적고 Pretained 모델이 학습했던 dataset과 Custom dataset의 class간의 유사성이 낮은 경우 적용
    • 3. Pretrained 모델 전체를 고정시키고 classifier layer들만 학습시킨다.(3번)
      • Train dataset의 양이 적고 Pretrained 모델이 학습했던 dataset과 Custom dataset의 class간의 유사성이 높은 경우 적용.
  • 1. 주요 CNN 모델

VGGNet(VGG16)
ResNet (Residual Networks)
MobileNet
  • 2. Small Deep Neural Network위한 방법

"Channel Reduction"
"Distillation & Compression"
Compression
"Depthwise Seperable Convolution"
Remove Fully-Connected Layers
Kernel Reduction
Early Spaced Downsampling

" " => MobileNet 에서 적용한 방법.
  • 2.1. Depthwise Separable Convolution

    • Depthwise Convolution 구조에 Pointwise Convolution 구조를 합쳐 기존 Convolution layer보다 연산량을 줄여서 속도를 증가
    • Depthwise Convolution은 한개의 Filter는 한개의 Channel에만 Convolution 연산
    • Pointwise Convolution은 1 X 1 필터를 이용해 Convolution 연산을 처리, 사용하는 구조를 Bottlenet, height와 width를 유지하면서 Channel의 크기를 조절 하기 위하여 사용
  • 3. Functional API

input_tensor = Input(shape=(16,))
dense = layers.Dense(32, activation='relu')(input_tensor)
output_tensor = layers.Dense(32, activation='sigmoid')(dense)

model = models.Model(input_tensor, output_tensor)
  • 4. 여러개의 출력결과를 합치는 Layer[¶]

    • concatenate(list, axis=-1)/Concatenate(axis=-1)([list])
      : 레이어들을 단순히 합친다. (붙이는 처리)
      - list: 합칠 레이어들을 리스트에 묶어 전달
      - axis: 합칠 기준축. (기본값: -1 : 마지막 축기준)
      - add(list)/Add()(list), substract(list)/Subtract()(list), multiply(list)/Multiply()(list)
      : 같은 index의 값들을 계산해서(더하기, 빼기, 곱하기) 하나의 레이어로 만든다.
      - list: 합칠 레이어들을 리스트에 묶어 전달
  • RNN

    Memory System (기억시스템)
    : 4일간의 주가 변화로 5일째 주가를 예측하려면 입력받은 4일간의 주가를 순서를 기억하고 있어야 한다.
    Fully Connected Layer나 Convolution Layer의 출력은 이전 Data에 대한 출력에 영향을 받지 않는다.

  • Simple RNN 구조

    Recurrent Layer의 unit(layer)은 Dense layer unit 구조에 순환(반복)의 개념이 들어간 것으로 이해할 수 있다.
    각 입력 데이터는 순서대로 들어오며 Node/Unit은 입력데이터( 𝑥𝑛 )와 이전 입력에 까지의 처리결과( ℎ𝑛−1) 를 같이 입력받는다.
    입력 데이터에 weight를 가중합한 값과 이전입력에대한 출력 값에 weight를 가중한 값을 더해 activation을 통과한 값이 출력값이 된다. 그리고 이 값을 다음 Sequence 데이터 처리에 전달한다.

  • Simple RNN의 문제

    "Sequence가 긴 경우", 앞쪽의 기억이 뒤쪽에 영향을 미치지 못해 학습능력이 떨어진다.
    ReLU activation, parameter initialization의 조정 등 보다 모형의 구조적으로 해결하려는 시도
    : "Long Short Term Memory(LSTM; Hochreiter & Schmidhuber, 1997)"
    Gated Recurrent Unit(GRU; Kyunghyun Cho et al., 2014)

  • LSTM

    : Simple RNN을 개선한 변형 알고리즘
    바로 전 time step의 처리리결과와 전체 time step의 처리결과를 같이 받는다.
    오래 기억할 것은 유지하고 잊어버릴 것은 빨리 잊어버리자

- LSTM 이전 기억
: 1. Cell State : Long term memory 로 전체 step에 대한 누적 기억값(처리결과)
2. Hidden State : Short term memory 로 이전 sequence 에 대한 기억값(처리결과)

- LSTM의 구조
1. Forget gate :입력된 cell state에서 얼마나 잊어 버릴지를 처리.
2. Input gate : 현재 sequence의 입력데이터를 cell state에 더한다.
3. Output gate : 현재 sequnce의 입력데이터를 처리해서 output으로 출력(hidden state)
  • GAN

    : GAN은 생성모델임. 생성모델이란 그럴듯한 가짜를 만들어내는 모델을 말한다.
    그럴듯하단의 수학적 의미: 실제 데이터의 분포와 비슷한 분포를 가지는 데이터

  • Generator와 Discriminator 네트워크

    • Generator

      • 입력: 랜덤한 숫자로 구성된 벡터(잡음)
      • 출력: 최대한 진짜 처럼 보이는 가짜 샘플
      • 목표: 훈련 데이터셋에 있는 샘플과 구별이 불가능한 가짜 샘플만들기
    • Discriminator

      • 입력
        1. 훈련데이터셋에 있는 진짜 샘플
        2. Generator가 생성한 가짜 샘플
      • 출력: 입력 샘플이 진짜일 예측 확률
      • 목표: 생성자가 만든 가짜 샘플과 훈련 데이터셋의 진짜 샘플을 구별하기
  • Discriminator 훈련
    : 진짜 샘플과 Generator가 생성한 가짜 샘플을 학습한다.

  • Generator 훈련
    : 생성한 가짜 샘플의 Label을 진짜로 하여 학습한다.

Discriminator가 진짜로 판별하면 손실이 적어 져서(가짜를 진짜로 판단했으므로 generator입장에서는 성공이므로 적은 손실을 발생시킨다.) Generator의 파라미터가 적게 업데이트 될 것이고 가짜로 판별하면 손실이 커져 Generator의 파라미터가 크게 업데이트 되어 다음 샘플 생성시 좀더 진짜 sample에 가깝게 생성하게 된다.

  • DCGAN
    Deep Convolutional Network + GAN
    처음 GAN 모델은 Dense Layer를 사용했는데 이것을 Convolution Layer로 변경함.

Longed for

  • 향후 공부할 방향과 하고 싶은 일에 대해 탐색할 예정입니다.
  • 알고리즘 학습과 코딩 테스트 문제 풀이를 할 예정입니다.
  • 이전 학습에 대한 복습을 진행할 것 입니다.
  • 건강관리에 신경쓸 예정입니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 1일

글 잘 봤습니다.

답글 달기

관련 채용 정보