이번 주차에서는 심화된 "딥러닝"에 대한 학습이 이뤄졌습니다. 다양한 딥러닝 모델에 대한 소개와 실습 코드를 통해 재학습을 하는 과정을 거쳤습니다. 27일은 휴강이었고, 28일은 심한 편도염으로 수업에 불참하였습니다.
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
에 대해 학습한 이후 이를 활용하여 다양하게 모델들을 정의하는 방식을 확인할 수 있었습니다. 이외에도 그전에 볼 수 없었던, 다중 출력 모델, 다중 입력 모델들을 예시와 함께 학습할 수 있는 좋은 시간이었습니다.
RNN
과 LSTM
에 대한 내용을 듣고 바로 주식 데이터 를 직접 다운받아서 해당 기법들을 실행할 수 있어 좋았습니다.
GAN
모델에 대해 학습하면서 "Down sampling"과 "Up sampling" 에 대한 내용을 추가로 알 수 있었고, tensorflow.keras.layers.Conv2DTranspose
layer를 통해 Up sampling 하는 방법에 대한 학습을 진행하였습니다. 이후 fashion_mnist 데이터를 이용해 DCGAN
(Deep Convolutional Network + GAN) 모델을 직접 구현할 수 있는 좋은 경험을 진행하였습니다.
model.add(keras.layers.GlobalAveragePooling2D())
이런 방식을
Transfer Learning (전이 학습)
이라고 한다.
VGGNet(VGG16)
ResNet (Residual Networks)
MobileNet
"Channel Reduction"
"Distillation & Compression"
Compression
"Depthwise Seperable Convolution"
Remove Fully-Connected Layers
Kernel Reduction
Early Spaced Downsampling
" " => MobileNet 에서 적용한 방법.
Bottlenet
, height와 width를 유지하면서 Channel의 크기를 조절 하기 위하여 사용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)
concatenate(list, axis=-1)/Concatenate(axis=-1)([list])
list
: 합칠 레이어들을 리스트에 묶어 전달axis
: 합칠 기준축. (기본값: -1 : 마지막 축기준)add(list)/Add()(list), substract(list)/Subtract()(list), multiply(list)/Multiply()(list)
list
: 합칠 레이어들을 리스트에 묶어 전달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)
: 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은 생성모델임. 생성모델이란 그럴듯한 가짜를 만들어내는 모델을 말한다.
그럴듯하단의 수학적 의미: 실제 데이터의 분포와 비슷한 분포를 가지는 데이터
Generator와 Discriminator 네트워크
Discriminator 훈련
: 진짜 샘플과 Generator가 생성한 가짜 샘플을 학습한다.
Generator 훈련
: 생성한 가짜 샘플의 Label을 진짜로 하여 학습한다.
Discriminator가 진짜로 판별하면 손실이 적어 져서(가짜를 진짜로 판단했으므로 generator입장에서는 성공이므로 적은 손실을 발생시킨다.) Generator의 파라미터가 적게 업데이트 될 것이고 가짜로 판별하면 손실이 커져 Generator의 파라미터가 크게 업데이트 되어 다음 샘플 생성시 좀더 진짜 sample에 가깝게 생성하게 된다.
글 잘 봤습니다.