DNN
Train process
- 입력 텐서 Layer 통과
- 예측값, 실제 타깃 손실 함수 통해 비교
- 가중치를 어떻게 업데이트할지 예측결과와 Ground Truth(실제정답) 사이의 차이를 정의
- 옵티마이저 이용해 가중치를 곱해 layer 통과
- optimizer : 가중치를 업데이트하여 모델의 성능을 최적화
- 반복
Unit
- Node, Neuron 전부 같은 의미
- Tensor를 입력받아 처리 후 Tensor를 출력하는 데이터 처리 모듈
- 입력 값에 Weight(가중치)를 곱해 bias(편향)을 더한 결과를 Activation 함수에 넣어 최종 결과를 출력하는 계산을 처리
- Logistic Regression처럼 z = w1x1 + w2x2 + w3x3 + b 구조
- Logistic Regression : 선형회귀 알고리즘을 이용한 이진 분류 모델, sigmoid 함수
- Activation(활성) 함수 : 선형 결합한 결과를 비선형화 시키는 목적
Layer
- unit들로 구성되어 있으며 Network를 구성하고 있다
- 학습에서 단계를 표현하며 input, output의 경우 사용자 정의 불가
- hidden layer들의 구조 사용자 정의
- 전체 과정 중에 사람이 설정하는 것은 모델(네트워크)의 구조 밖에 없다
- 종류
- Fully Connected Layer (Dense layer) : 추론 단계에서 많이 사용
- Convolution Layer : 주로 이미지 특성 추출할 때 사용
- Recurrent Layer : Sequential(순차) 데이터의 Feature extraction으로 주로 사용
- Embedding Layer : Text 데이터의 Feature extraction으로 주로 사용
Output Layer
- 모델의 최종 예측결과를 출력하는 노드들로 구성된 Layer
keras.layers.Dense(10, activation='softmax')
Hidden Layer
- Input Layer와 Output Layer 사이에 존재하는 Layer
- 특성 추출(Feature Extraction), 추론하는 역할을 담당
- Layer 개수, Layer 당 unit의 개수, Layer별 활성함수 선정
- 공식적으로 정해진 것이 아닌 경험이나 테스트에 많이 의존
- 대부분 ReLU 또는 ReLU 계열 활성함수 사용
- Dropout, Pooling Layer와 같이 parameter가 없는 Layer도 존재
모델(Network)
- Layer들을 연결한 형태
- 적절한 Network 구조(architecture)를 찾는 것은 공학적이기 보다는 경험적(Art) 접근이 필요
모델 성능
- 딥러닝 자체가 복잡한 모델을 사용하기에 과대적합에 취약
- 데이터에 비해 모델이 복잡한 경우에 과대적합 발생 확률 높기때문에 데이터가 복잡한 경우에 사용
- ex) 비정형데이터
- 모델이 과소적합인 경우
- 모델 네트워크 크기를 키움
- Epoch or step 수를 늘린다
- 성능이 계속 개선되는 과정에 멈췄다면 더 학습 시켜준다
- 과대적합인 경우
- 데이터 더 많이 수집 -> 현실적으로 힘듬
- 이미지의 경우는 Image Augmentation 이용해 데이터의 양 늘릴 수 있다
- 모델의 복잡도 낮춤
- Epoch or step 수 낮춤
- Validation 성능 지표가 가장 좋았던 Epoch까지만 학습
모델 규제(성능향상을 위한)
- 과적합의 종류에 따라 모델의 성능 개선을 위해 모델을 변화시킨다
Overfitting 규제
Optimizer의 Learning rate(학습율) 조정을 통한 성능향상
- Optimizer의 Learning rate가 너무 크거나 너무 작으면 최적의 파라미터를 찾지 못할 수 있다
- Learning rate는 모델 성능과 밀접한 관계가 있는 아주 중요한 Hyper Parameter
- 너무 크면 exploding, 너무 작으면 epoch 횟수가 끊나 제대로 학습 불가
- high learning rate의 경우 최적점 주변을 계속 맴돈다
- 학습하면서 고정된 하나의 learning rate를 사용할 수 있지만 learning rate의 변화를 주어 최적의 성능을 뽑아 낼 수 있다
- 종류
- Learning Rate Decay
- 일정한 step 마다 일정한 비율로 Learning rate를 변경
- 보통 초반에는 크게 설정하고 갈수록 줄여주는 방향으로 구현
- 일반적으로 5 에폭마다 절반으로 줄이거나 20 에폭마다 1/10씩 줄이기도 한다
lr_scheduler = keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=LEARNING_RATE,
decay_steps=len(train_dataset)*5,
decay_rate=0.2,
staircase=True,
)
- Callback
- 일정 step동안 검증 성능지표가 향상되지 않으면 그때 learning rate를 조정
- Callback : 학습 도중 특정 이벤트(변화)가 발생하면 호출되도록 정의한 기능
- 사용자가 호출하는 것이 아닌 실행환경이 호출하는 함수
- 종류
- event handler - 비정기적
- life cycle - 정기적
from keras.callbacks import ReduceLROnPlateau, EarlyStopping, ModelCheckpoint
lr_cb = ReduceLROnPlateau(monitor='val_loss',
factor=0.2,
patience=3,
verbose=2)
활성 함수(Activation Function)
- 각 유닛이 입력과 Weight간에 가중합을 구한 뒤 출력결과를 만들기 위해 거치는 함수
- Layer별로 활성함수 다름
- Output Layer의 경우 출력하려는 목적에 따라 활성함수 결정
- Hidden Layer의 경우 비선형을 주어 각 Layer가 처리하는 일을 분리하는 것을 목적으로 사용
- 가중치 합을 구한 선형 형태인 경우 분배법칙이 가능해 Layer 존재 의미 없어짐
- Layer가 많은 것이 학습에 유리하며 선형 형태인 경우 Layer의 의미가 없어지므로 활성함수를 사용
- ReLU나 ReLu 계열 사용
- 회귀의 경우 None(사용X)
Sigmoid
- Logistic Function
- 출력 값의 범위 0과 1사이
- 층을 깊게 쌓을 경우 기울기 소실(Gradient Vanishing) 문제를 발생시켜 학습이 안되는 문제
- Gradient Vanishing : 최적화 과정에서 gradient가 0이 되어서 Bottom Layer의 가중치들이 학습이 안되는 현상
- 여기서 Bottom은 Input Layer 부근
- 함수의 중심이 0이 아니기에 학습이 느려지는 단점
- Binary classification(이진 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 사용
- Hidden Layer의 활성함수로는 잘 사용 X
Hyperbolic tangent
- 출력 값의 범위 -1과 1 사이
- 형태는 sigmoid와 같은 형태, 범위만 차이
- Output이 0을 중심으로 분포하므로 sigmoid보다 학습에 효율적
- 마찬가지로 기울기 소실(Gradient Vanishing) 문제를 발생
ReLU(Rectified Linear Unit)
- 출력 값
- 입력 값 음수 : 0반환, 입력 값 양수 : 양수 반환
- 기울기 소실(Gradient Vanishing) 문제를 어느정도 해결
- Dying ReLU
- 0이하의 값(z <= 0)들에 대해 뉴런이 죽는 단점
- Forwardpropagation 과정에서 어떤 뉴런의 음수값이 한번 들어왔다하면 Backpropagation 과정에서 0이라는 real value가 가중치에 곱해지면서 해당 노드가 통째로 죽는 현상
Leaky ReLU
- ReLU의 Dying ReLU 현상을 해결하기 위해 나온 함수
- 음수 입력을 0으로 반환하지 않고 alpah (0 ~ 1 사이 실수)를 곱해 반환
Softmax
- Multi-class classification(다중 분류)를 위한 네트워크의 Output layer(출력층)의 활성함수로 주로 사용
- Layer의 unit들의 출력 값들을 정규화 하여 각 class에 대한 확률값으로 변환
- 출력노드들의 값은 0 ~ 1사이의 실수로 변환되고 그 값들의 총합은 1
- 이 과정에서 확률 극대화시킴(더 극단적으로 분포 나오게끔 된다)
손실함수(Loss Funtion, 비용함수)
- 모델의 예측값과 실제 데이터의 차이를 계산하는 함수
- 네트워크 모델을 훈련하는 동안 Loss 함수가 계산한 Loss값(손실)이 최소화 되도록 파라미터(가중치와 편향)을 업데이트
- 해결하려는 문제의 종류에 따라 표준적인 Loss function 존재
분류의 경우
- cross entropy(log loss) 사용
- log(정답에 대한 확률)
- log를 이용해 오차를 극대화 시켜 학습이 잘 되도록 유도
Binary classification
- 두 개의 클래스를 분류 : 양성(1)의 확률을 출력
- Output Layer의 unit 개수를 1로 하고 activation 함수로 sigmoid를 사용하여 positive(1)의 확률로 예측 결과를 출력하도록 모델을 정의 한 경우 binary_crossentropy를 loss function으로 사용
Multi-class classification
- categorical_crossentropy와 sparse_categorical_crossentropy를 loss function으로 사용
회귀의 경우
Regression (회귀)
- 연속형 값을 예측
- Mean squared error를 loss function으로 사용
평가지표
평가지표 vs 손실함수
- 손실함수(Loss Function)와 차이
- 손실함수는 모델을 학습할 때 가중치 업데이트를 위한 오차를 구할 때 사용
- 평가지표 함수는 모델의 성능이 확인하는데 사용
최적화 방법
- Training시 모델 네트워크의 parameter를 데이터에 맞춰 최적화 하는 알고리즘
- 딥러닝의 경우 경사하강법(Gradient Descent)와 오차 역전파(back propagation) 알고리즘을 기반으로 파라미터들을 최적화
- 종류
- 정규방정식
- 경사하강법
- 딥러닝의 경우 경사하강법 사용, 정규방정식은 없음
Gradient Decent (경사하강법)
- 최적화를 위해 파라미터들에 대한 Loss function의 Gradient값을 구해 Gradient의 반대 방향으로 일정크기 만큼 파라미터들을 업데이트 하는 것
오차 역전파(Back Propagation)
- 딥러닝 학습시 파라미터를 최적화 할 때 추론한 역방향으로 loss를 전달하여 단계적으로 파라미터들을 업데이트
- Loss에서부터(뒤에서부터) 한계단씩 미분해 gradient 값을 구하고 이를 Chain rule(연쇄법칙)에 의해 곱해가면서 파라미터를 최적화
batch size와 관련된 파라미터 업데이트 단위
Batch Gradient Decent (배치 경사하강법, 일반 경사하강법이라 생각하면 된다)
- Loss를 계산할 때 전체 학습데이터를 사용해 그 평균 loss(오차)값을 기반으로 파라미터를 최적화
- 학습 안정적
- 많은 계산량이 필요해서 속도가 느리다. 학습 데이터가 클 경우 메모리가 부족할 수 있다
Mini Batch Stochastic Gradient Decent (미니배치 확률적 경사하강법, SGD)
- Loss를 계산할 때 전체 데이터를 다 사용하지 않고 지정한 데이터 양(batch size) 만큼 마다 계산해 파라미터를 업데이트
- 메모리 문제 없다
- 계산은 빠른 장점이 있지만 최적값을 찾아 가는 방향이 불안정하여 부정확
- 반복 횟수 늘릴 경우 Batch Gradient Decent의 결과로 수렴한다
- step : 한번 파라미터를 업데이트하는 단위
- mini-batch마다 parameter update의 방향성이 일정하지 않을 수 있는 가능성 존재
Batch SGD upgrade관련, Adam
- 방향성 개선한 방법
- Momentum
- NAG(Nesterov Accelerated Gradient)
- 학습률 개선
- 방향성 + 학습률 개선 최적화 방법
계산 그래프(Computational Graph)
- 딥러닝 네트워크 구조를 구현하는 방식
- 그래프는 노드(Node)와 엣지(Edge)로 구성
- 노드: 연산을 정의
- 엣지: 데이터가 흘러가는 방향
- 장점
- 복잡한 계산을 단계적으로 나눠 처리하므로 문제를 단순하게 만들어 계산할 수 있다(딥러닝에서 역전파를 이용해 각 가중치 업데이트를 위한 미분(기울기) 계산을 효율적으로 할 수 있게 된다)
- 연쇄법칙을 이용한 forward, back propagation 그림이라 생각하면 된다