모두를 위한 딥러닝 시즌2

[모두를 위한 딥러닝 시즌2][Lab 7] application and tips

햄스틴 2021. 11. 2. 00:21

 

 

 

 

이번 시간에는 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)