[모두를 위한 딥러닝 시즌2][Lab 7] application and tips
이번 시간에는 Learning rate, Data preprocessing 그리고 Overfitting에 대해 공부하고
Data sets과 다양한 Learning 방법들을 알아볼 것이다.
Learning rate
데이터를 통해 모델을 만들어 갈 때 필요한 설정 값이다.
기울기와 Learning rate로 모델의 최적의 값을 찾아간다.
Learning rate를 어떻게 설정하느냐에 따라 학습할 때 값이 달라진다.
Learning rate가 크다는 것은 한번 변화하는 양이 크다는 것이다.
적절한 Learning rate를 사용해야 최적 값을 빨리 찾을 수 있다.
보통 Learning rate 값은 0.01이다.
Adam optimizer에서 최적의 Learning rate 값은 3e - 4(0.0003)다.
학습을 하면서 Loss값이 점점 작아지는 것이 바람직한 경우이다.
반대로 점점 커진다면 잘못된 Learning rate를 설정한 것이다.
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
Learning rate Decay
학습을 하는 과정에서도 Learning rate를 적절히 조정하는 것이 중요하다.
학습을 진행하면서 어느 순간부터 더 이상 학습이 이뤄지지 않는 구간이 생긴다.
이때 Learning rate를 감소시키는 Learning rate decay로 적절하게 학습을 진행할 수 있다.
Learning rate decay 기법의 방식은 여러 가지가 있다.
Stap decay, Exponential decay, 1/t decay 등등
파이썬에서 다양한 기법들을 라이브러리로 지원하고 있다.
아래 Tensorflow Code는 Stap decay기법이다.
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_stap, 1000, 0.96, staircase)
Data preprocessing
데이터 전처리
Feature Scaling
전체 데이터에서 대부분의 데이터 분포에서 많이 떨어진 소수의 데이터들(Noisy Data)은 학습할 때 불필요하다.
그래서 이 쓸모없는 데이터들을 없애기 위해 구조화해야 한다.
Standardization(표준화)
평균에서부터 얼마큼 떨어져 있냐
Standardization = (data - np.mean(data)) / sqrt(np.sum((data - np.mean(data))^2) / np.count(data))
Nomalization(정규화)
Normalization = (data - np.min(data, 0)) / (np.max(data, 0) - np.min(data, 0))
Overfitting
트레이닝 데이터와 평가 데이터로 학습할 때는 학습이 잘 되었는데,
모델의 학습에 쓰이지 않은 데이터를 학습하면 오히려 정확성이 떨어지는 경우를 볼 수 있다.
학습이 덜 된 상태: underfit
학습이 너무 많이 된 상태(특정한 데이터에만 맞게): overfit
Set a feature
feature를 잘 정해서 Overfitting을 해결할 수 있다.
Get more training data - 학습할 때 data를 더 많이 넣어서 변화량을 희석시킴
Smaller set of features - feature의 수를 줄임으로서(차원을 줄임으로서) (PCA)
Add additional features - 모델을 구체화할 때 사용
Regularization(정규화)
loss값에 term(λ)을 줌으로써 모델을 정규화해서 Overfitting을 해결한다.
L2_loss = tf.nn.l2_loss(w)
이제 실제 데이터를 어떻게 구성하는지에 대한 방법과 학습에 사용되는 여러 가지 방법들을 알아보자.
Data sets
학습을 하면서 평가 과정을 거치게 되는데, 이때 데이터의 구성을 잘하는 것이 굉장히 중요하다.
Training - 학습할 때 사용하는 데이터
Validation - 평가할 때 사용되는 데이터
동일한 training data로 반복적으로 학습하면서 네트워크 구조와 Learning rate 같은 설정값들을 바꿔주는 과정을 통해
99%의 모델을 만들어 간다.
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
model.fit(x_train, y_train, validation_split=0.2, epochs=5)
이런 모델을 만들었다면 학습하는 데 사용하지 않은 data들로 hypothesis를 평가해야 한다.
test_acc = accuracy_fn(softmax_fn(x_test), y_test)
model.evaluate(x_test, y_test)
Anomaly detection
모델을 평가할 때 이상치를 탐지한 경우 새로운 방법으로 모델을 만든다.
Learning
학습에 대한 여러 방법들을 알아보자.
Online Learning vs Betch Learning
- 데이터가 인터넷에 연결된 상태에서 지속적으로 변화
- 데이터가 정적인 상태에서 학습
Original Model에서 익숙하지 않은(학습한 데이터와 다른) 데이터가 온다면 잘 구별해내지 못할 수 있다.
이때 그 새로운 데이터를 Fine Tuning(weight 값을 미세하게 조정) 통해 학습하는 방법이 있다.
또 다른 방법인 Feature Extraction은 기존의 모델을 건드리지 않고 새로운 task에 대해서만 따로 학습시킨다.
saver = tf.train.import_meta_graph('my-model-1000.meta')
saver.restore(tf.train.latest_checkpoint('./'))
Efficient Models(효과적인 모델)
실제 만든 모델이 결과를 도출해내는데 속도(performance)도 중요하다.
inference time을 최소화하기 위해 inference time에 영향을 많이 미치는 weight 값을 경량화하는 게 중요하다.
tf.nn.depthwise_conv2d(input, filter, strides, padding)