8 경사하강법 - p.129
오차가 최소화 되는 지점을 찾아가기 위해 global minimum 으로 내려오는 방법들
ㅇ경사하강법의 종류 ?
1. SGD(Stochastic Gradient Descent)
2. momentum
3. Adagrade
4. Adam
1.SGD(stochastic gradient descent) : 확률적 경사하강법
GD(gradient descent)는 학습 데이터를 다 입력하고 한 걸음 이동하는 경사감소법입니다.
그래서 GD는 학습하는데 시간이 많이 걸립니다. 일부 표본을 뽑아서 입력하는데 어제 배운 미니배치에 GD를 결합한 방법으로 학습하는데 확률적 경사하강법입니다.
SGD는 아래로 내려올 때 심하게 지그재그로 내려옵니다. 배치의 크기가 크면 지그재그의 정도가 덜한데, 배치의 크기가 작으면 술취한 사람처럼 지그재그로 내려옵니다..
-> local minimum에 잘 빠짐
2. momentum : 관성을 이용해 local minumum에서 빠져나가게 설계된 경사하강법
텐서플로우 2.0에는 모멘텀이 없지만, Adam에 모멘텀 장점이 포함되어져 있음.
3. Adagrade : 학습률(learning rate)를 자동조절되게하는 경사하강법
예를 들어 산 위에 있을 때는 발검음을 크게해서 내려오고 목적지에 도달했을때는 촘촘 걸음으로 내려오게 하는게 adagrade.
4. Adam : momentum의 장점(관성) + Adagrade의 장점(learning rate 자동조절)을 살린 경사하강법
ㅇ 텐서플로우 2.0에서 경사하강법의 종류를 기술하는 코드
model.compile(optimizer = 'Adagrade', #Adam, SGD, RMSprop
loss = 'categorical_crossentropy',
metrics = ['acc'])
+) RMSprop : Adagrade의 장점을 더 좋게 만든 경사하강법. 발걸음이 자동조절되는데 목표지점에 도달할 때 이전에 내려오던 그 걸음걸이를 살펴서 발걸음(learning rate)를 조절함.
ㅇ경사하강법을 변경해서 mnist 필기체 데이터를 학습하는 코드를 실험하기
#SGD(확률적 경사 하강법)으로 구현한 전체 코드
# 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 # 완전 연결계층을 구성하기 위한 모듈
from tensorflow.keras.utils import to_categorical # one encoding 하는 모듈
tf.random.set_seed(777)
(x_train, y_train), (x_test, y_test) = load_data(path='mnist.npz') # mnist 데이터 로드
# 2. 정규화 진행
# 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,)))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))
# 5. 모델 설정
model.compile(optimizer='SGD', #확률적 경사하강법 사용.
loss = 'categorical_crossentropy',
metrics=['acc'])
#6. 모델 훈련
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델 평가(오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test) #[0.17040033638477325, 0.9503999948501587]
문제77. 이번에는 Adam으로 실험하시오.
#Adam으로 구현한 전체 코드
# 5. 모델 설정
model.compile(optimizer='adam', #확률적 경사하강법 사용.
loss = 'categorical_crossentropy',
metrics=['acc'])
#6. 모델 훈련
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델 평가(오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test) #[0.12375976890325546, 0.9740999937057495]
문제78. 이번에는 RMSprop로 실험하시오.
#RMSprop로 구현한 전체 코드
# 5. 모델 설정
model.compile(optimizer='RMSprop', #확률적 경사하강법 사용.
loss = 'categorical_crossentropy',
metrics=['acc'])
#6. 모델 훈련
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델 평가(오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test) #[0.11766887456178665, 0.9765999913215637]
9 러닝레이트(learning rate, 학습률) - p.132
한번의 학습으로 얼마만큼 매개변수(가중치와 바이어스)를 갱신할지를 결정하는 하이퍼 파라미터
가중치 = 가중치 - 학습률*기울기
위의 학습률은 신경망 개발자가 0.01이나 0.1과 같이 알아서 줘야하는데 일반적으로 이 값이 너무 크거나 작으면 global minimum 지점에 도착할 수 없습니다.
학습률이 너무 크면 -> 학습은 빠르지만 global minimum을 지나칠 수 있음
학습률이 너무 작으면 -> global minumum을 지나칠 염려는 없지만 학습이 너무 느려서 수렴하지 못함
결론을 먼저 이야기하면 텐서플로우를 사용하고, 경사하강법 종류중에 Adam,Adagrade를 사용하게 되면 학습률이 학습중에 자동 조절되므로 학습률은 신경쓰지 않아도 됨.
예제1. 텐서플로우 신경망 코드에 학습률을 세팅하는 코드 추가하기
#6. 모델 훈련
K.set_value(model.optimizer.learning_rate, 0.01) # 러닝레이트를 0.01로 하겠다
print("Learning rate before second fit : ", model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)
문제29. 학습률이 너무 크면 global minimum을 지나칠 수 있는지 실험하시오.
#6. 모델 훈련
K.set_value(model.optimizer.learning_rate, 0.5) # 러닝레이트를 0.01로 하겠다
print("Learning rate before second fit : ", model.optimizer.learning_rate.numpy())
model.fit( x_train, y_train, epochs=30, batch_size=100)
# 7.모델 평가(오차, 정확도가 출력됩니다.)
model.evaluate(x_test, y_test) #[2.677607297897339, 0.3986000120639801]
-> 오차도 크고, 정확도도 매우 낮음. 학습률을 너무 크게 줘서 문제
'Study > class note' 카테고리의 다른 글
딥러닝 / 패션 mnist 신경망에 사진을 넣고 잘 예측하는지 확인하기(+구글 코랩) (0) | 2022.04.10 |
---|---|
딥러닝 / 날코딩으로 2층 신경망 클래스 구현 (0) | 2022.04.07 |
딥러닝 / 텐서플로우로 신경망 구현하기 (0) | 2022.04.07 |
딥러닝 / 미니배치, 수치미분, 편미분, 신경망에서 기울기 (0) | 2022.04.06 |
딥러닝 / 크로스엔트로피 오차함수, 평균 제곱 오차함수 (0) | 2022.04.05 |