2021. 8. 16. 17:34ㆍAI/Deep learning
- 목차
데이터를 training과 testing으로 분할
보통 8:2 혹은 9:1
파라미터를 추정하는데는 많은 데이터가 필요하므로, training을 크게
testing은 모형들의 성능을 구별할 정도만 되면 충분하므로 작게
training에 과적합되면 testing에서 성능이 낮아짐
training과 testing의 data가 섞이지 않도록 주의
섞일 시, testing 결과의 성능이 좋게 됨
다른 data를 가지고 test하게 되면 성능이 높지 않게 나옴
즉, 객관적인 성능 수치를 파악하기 어려움
Validation / Development set
딥러닝에서는 다양한 hyperparameter의 결정이 필요
hyperparameter
은닉층 개수, filter size 등
테스트셋 데이터를 이용해서 결정하면 hyperparameter가 test set에 과적합될 우려
별도의 validation 혹은 development set을 이용해서 hyper parameter 결정
training data로
hyperparameter tuning 후,
cross validation data로 결정
training data와 cross validation data는 교체해 가면서 사용
model.fit(x_train, y_train, epochs=1, validation_split=0.1)
0.1 즉, 10%의 data를 학습시키지 않고 keep
val_accuracy
별도 10%의 data로 정확도를 평가함
과적합의 진단/해결
training set에서는 성능이 높으나, validation set에서는 성능이 낮을 경우,
overfitting 되었을 가능성이 높음
-> 모형의 복잡도(은닉층 개수, filter 수 등)/용량을 낮추는 방향으로 구조/hyperparameter를 조절
training set에서도 성능이 낮을 경우
-> underfitting이 되었을 가능성이 높음
-> 모형의 복잡도/용량을 높이는 방향으로 구조/하이퍼파라미터를 조정
Bayes Error
오차 0% 다양한 이유로 실현 불가능
ex. 테스트 이미지의 label의 오류 등
데이터로부터 도달할 수 있는 이론적 최소 오차
Bayes error를 실제로 추정하기는 불가능
보통 사람의 오차를 베이즈 오차 대용으로 사용
Hyperparameter types
신경망의 구조
. 은닉층의 수
. 각 층의 폭
. 활성화 함수
학습 및 최적화
. 학습률
. 배치의 크기
. 최적화 알고리즘
. 에포크 수
. 학습 중단 방식
정규화
드롭아웃
Hyperparameter tuning
Hyperparameter: 모형의 성격이나 학습 방법과 관련된 설정
학습률, 은닉층의 수, 은닉층의 크기 등
데이터로부터 학습될 수 없고 시행착오를 통해 튜닝
보통 1, 2,3, .. 으로 증가하지 않고,
1, 10, 100, ...등으로 크게 증가
격자 탐색 (grid search)
Hyperparameter가 여러 종류일 경우
각 parametrer의 설정값을 정하고, 이들을 조합하여 하나씩 시도
|
학습률 | * * *
|
| * * *
|
+-------------- 은닉층 크기
위와 같은 조합은 충분히 다양한 학습 시도가 힘듦
래서 사실은 무작위로 조합하여 하나씩 시도
| *
학습률 | *
| *
| * *
| *
+-------------- 은닉층 크기
두 개의 param의 값이 다르기에 더 많은 경우를 cover할 수 있음
무작위 탐색이 더 나은 이유
모형의 성능은 특정한 hyperparameter에 좌우
무작위 탐색이 각각의 hyperparametr를 더 다양하고 촘촘하게 탐색
|
학습률 > * * *
|
| * * *
| ^ ^ ^
+-|---|---|---- 은닉층 크기
> *
학습률 > *
> *
> * *
> *
+-^^^--^-^-^--- 은닉층 크기
Sequential Model-based Optimization
hyperparameter와 성능의 관계를 모형화
-> 즉, 실제로 hyperparam 변경하여 돌려보지 않아도 예측치를 알 수 있음
모델이 2개
실제 학습 시킬 모델
모델에 설정값 (HP)과 모델의 성능에 대한 모델
문제
본 모델은 많은 데이터를 가지고 학습
델 검증 모델은 본 모델의 결과를 가지고 학습하기에 학습이 낮음
그래서 모델 검증 모델은 보통 DNN을 사용하지 않음
모형을 바탕으로 최적의 hyperparameter를 선택하여 학습
학습 결과를 바탕으로 모형을 수정의 과정을 반복
설정값 ----> 본모형(model)
이 학습 결과를 가지고 별도의 '모델'을 학습
이는 data량이 많지 않기에, DNN을 사용하지 않음
MAB 방식
Multi Armed Band
카지노의 slot machine들
잘 되는지 안 되는지 확인하려면, 실제로 카지노 암을 땡겨 봐야 알 수 있음
여러 모델이 있을 시,
어느 모델을 학습 시킬 것이냐 (다 돌릴 돈이 없을 시)
잘 될거 같은 모델을 선택해서 학습을 몰빵하겠다는 것
Hyper parameter tuning
Keras-tuner
여러 학습 방식을 알아서 적용하고 학습하는 tool
pip install -U keras-tuner
-q: 화면에 출력되는 것 제거
-U: 기존 설치된 경우 upgrade
import kerastuner as kt
import kerastuner as kt
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dropout
mnist = tf.keras.datasets.mnist # Keras Handwriting image
(x_train, y_train), (x_test, y_test) = mnist.load_data()
model = tf.keras.Sequential()
model.add(Flatten(input_shape=(28, 28))) # to use 'Dense' Layer
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='softmax'))
model.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) (None, 784) 0
_________________________________________________________________
dense (Dense) (None, 16) 12560
_________________________________________________________________
dense_1 (Dense) (None, 10) 170
=================================================================
Total params: 12,730
Trainable params: 12,730
Non-trainable params: 0
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer='adam',
loss=loss_fn,
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=1)
tf.nn.softmax(model(x_test[0:1]))
model.weights
model.weights[0].shape
def build_model(hp):
units la= hp.Int('units', min_value=32, max_value=512, step=32)
model = tf.keras.Sequential()
model.add(Flatten(input_shape=(28, 28))) # to use 'Dense' Layer
model.add(Dense(units=units, activation='relu'))
model.add(Dense(10, activation='softmax'))
# learning rate
learning_raet = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
optim_fn = tf.keras.optimizers.Adam(learning_rate=learning_rate)
model.compile(optimizer=optim_fn,
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
'AI > Deep learning' 카테고리의 다른 글
DLFS - CH 3 (0) | 2021.09.27 |
---|---|
텐서(Tensor) (0) | 2021.08.16 |
data partitioning, hyper-parameter tuning (0) | 2021.08.16 |
Back-propagation (역전파) (0) | 2021.08.16 |
딥러닝 성능 향상 (0) | 2021.08.16 |