본문 바로가기

딥러닝

4장 9. 학습률(learning rate) p.132

밑바닥부터 시작하는 딥러닝 p.132 참고

 

학습률(learning rate) 이란?

한번의 학습으로 얼마만큼 매개변수(가중치와 바이어스)를 갱신할 지를 결정하는 하이퍼 파라미터

 

가중치 = 가중치 - 학습률*기울기 

 

학습률을 잘 조절해야하는 이유

학습률이 너무 ↑ : 학습은 빠르지만 global minimum을 지나칠 수 있습니다.

학습률이 너무 ↓ : global minum을 지나칠 염려는 없지만 학습이 너무 느려서 수렴을 못합니다.

 

 

[실습 ]

학습률이 너무 큰 경우와 작은 경우를 텐써플로우를 이용해 확인해보자

경사하강법은 RMSprop 을 사용하는 코드를 가지고 확인해보았다.

 

1. 학습률이 너무 큰 경우 

 

■ 기존의 코드에서 러닝레이트를 조절하는 부분 

from tensorflow.keras import backend as k 

   #  하이퍼파라미터를 직접 조정하고 싶을 때 사용하는 모듈이다(텐써플로우는 자동으로 셋팅되어있으니) 

k.set_value(model.optimizer.learning_rate, 0.5) 

    # 학습률을 0.5로 줘보겠다. 

from tensorflow.keras import backend as K  # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈 
                                           # 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용
#6. 모델을 훈련 시킵니다.
K.set_value(model.optimizer.learning_rate, 0.5) #러닝레이트 크게 주기 # 파라미터 커스터마이징 
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)

전체 코드

#3. RMSprop 으로 필기체 데이터 학습시키는 텐써 플로우 코드 


# 1. 필요한 패키지 가져오는 코드 

import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Flatten  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
from tensorflow.keras import backend as K  # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈 
                                           # 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용 

tf.random.set_seed(777)

#2. 입력데이터 불러오고 정규화 진행
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
    
# 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 
x_train = (x_train.reshape((60000, 28 * 28))) / 255 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

# 3. 정답 데이터를 준비한다. 

# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 2층 신경망으로 구성
model = Sequential()
model.add(Flatten(input_shape = (784,)))   # 0층
model.add(Dense(100, activation = 'relu'))  # 1층
model.add(Dense(10, activation = 'softmax'))   #2층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='RMSprop', 
              loss = 'categorical_crossentropy', 
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 

#6. 모델을 훈련 시킵니다.

K.set_value(model.optimizer.learning_rate, 0.5) #러닝레이트 크게 주기 # 파라미터 커스터마이징 
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)

# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

0.5

[4.290281295776367, 0.3456000089645386]

설명: 학습률을 너무 크게 주니까 발산을 해버리면서 정확도가 0.34 가 나왔다.

 

2. 학습률이 너무 작은 경우

학습률 0.000001 로 주었다.

#3. RMSprop 으로 필기체 데이터 학습시키는 텐써 플로우 코드 


# 1. 필요한 패키지 가져오는 코드 

import tensorflow as tf   # 텐써 플로우 2.0 
from tensorflow.keras.datasets.mnist import load_data  # 텐써플로우에 내장되어있는 
                                                                         # mnist 데이터를 가져온다.
from tensorflow.keras.models import Sequential  # 모델을 구성하기 위한 모듈
from tensorflow.keras.layers import Dense,Flatten  # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
from tensorflow.keras import backend as K  # 상세한 하이퍼 파라미터를 셋팅하고자 하기위한 모듈 
                                           # 직접 커스터마이징 하여 파라미터 조정하고 싶을 때 사용 

tf.random.set_seed(777)

#2. 입력데이터 불러오고 정규화 진행
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz')  # mnist 데이터 로드
    
# 정규화 진행 
# 3차원 ---> 2차원으로 차원축소하고서 정규화 진행  ( 한 픽셀이 0~255 로 되어있는데)
# 0 ~ 1 사이로 변경 
x_train = (x_train.reshape((60000, 28 * 28))) / 255 
x_test = (x_test.reshape((10000, 28 * 28))) / 255

# 3. 정답 데이터를 준비한다. 

# 하나의 숫자를 one hot encoding 한다. (예:  4 ---> 0 0 0 0 1 0 0 0 0 0 ) 
y_train = to_categorical(y_train)  # 훈련 데이터의 라벨(정답)을 원핫 인코딩
y_test = to_categorical(y_test)    # 테스트 데이터의 라벨(정답)을 원핫 인코딩 

# 4. 모델을 구성합니다. 2층 신경망으로 구성
model = Sequential()
model.add(Flatten(input_shape = (784,)))   # 0층
model.add(Dense(100, activation = 'relu'))  # 1층
model.add(Dense(10, activation = 'softmax'))   #2층 

# 5. 모델을 설정합니다. ( 경사하강법, 오차함수를 정의해줍니다. )
model.compile(optimizer='RMSprop', 
              loss = 'categorical_crossentropy', 
              metrics=['acc'])  # 학습과정에서 정확도를 보려고 

#6. 모델을 훈련 시킵니다.

K.set_value(model.optimizer.learning_rate, 0.000001) #러닝레이트 작게 주기 # 파라미터 커스터마이징 
print(model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)

# 7.모델을 평가합니다. (오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test)

1e-06

[1.0210216045379639, 0.8087000250816345]

 

설명 : 30 에폭으로는 수렴하지 못했다. 에폭수를 늘리면 수렴할 수 있으나 시간이 오래걸린다.

 

학습률이 너무 크면 발산하여 정확도가 안나오고,

학습률이 너무 작으면 수렴하지 못한다!