딥러닝

[DL]5. 오차 역전파

CodeJaram 2023. 9. 15. 11:32

딥러닝_05_오차 역전파

 

  1. 오차 역전파(Back Propagation)
  • 순전파: 입력데이터를 입력층에서부터 출력층까지 정방향으로 이동시키며 출력값을 예측해나가는 과정
  • 역전파: 출력층에서 발생한 오차를 입력층 쪽으로 전파하며 오차에 관여하는 가중치를 수정하여 오차를 줄이는 방향으로 최적의 결과를 학습해나가는 과정

 

 

2. sigmoid 함수의 문제점: 역전파과정에서 출력층이 많을수록  미분값이 0에 가까워져 기울기 소실문제가 발생하여 학습이 제대로 되지 않음

 

 

3. ReLU:  입력값이 양수일 경우 입력값에 상관없이 미분값이 항상 동일한 값(1)을 유지하여  역전파 과정에서 기울기가 소실되는 문제를 해결

-단점: 입력값이 음수인 경우 미분값이 0이 됨(=데이터 손실), 데이터스케일링 시 사용 x

 

 

4. 최적화함수의 종류

1)확률적 경사하강법(Stochastic Gradient Descent): 확률적으로 선택된 일부 데이터를 이용해 업데이트

  • 경사하강법의 문제점: 전체 데이터를 이용해 업데이트하므로 대량의 데이터를 딥러닝 진행했을 때 메모리 문제가 발생함
  • batch size: PC 메모리의 한계 및 속도저하를 막기 위해 epoch에 학습데이터를 조절하는 것, 개수를 조절하여 성능향상(기본값 32개)

-batch size를 줄이면 메모리 소모가 적고(저사양), 학습속도 느림, 정확도

-batch size를 높이면 메모리 소모가 크고, 학습속도 빠름, 정확도

  • 장점: GD보다 더 빨리 더 자주 업데이트를 하여 지역 최저점을 빠져나갈 수 있음
  • 단점: 탐색경로가 비효율적(진폭이 크고 불안정함)

 

 

2)모멘텀(Momentum)

  • 경사하강법에 관성을 적용해 가중치를 수정하기 전 이전 방향을 참고하여 업데이트
  • 지그재그 형태로 이동하는 현상이 감소

 

 

3)네스테로프 모멘텀: 개선된 모멘텀 방식으로, 다음방향을 계산하여 이전방향을 조절함

 

4)에이다그래드(Adaptive Gradient): 초반에는 학습률을 높이고 학습률을 점차 줄이는 방법을 적용해 업데이트

 

 

 

5)Adam



*tensorflow 사용설명

https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/legacy/SGD

 

[손글씨 데이터 역전파 실습]

 

  1. 목표
  • 활성화 함수와 최적화 함수 비교
  • 모델링에 도움이 되는 callback 함수(모델 저장, 조기학습중단)
  • 활성화 함수: sigmoid→relu(오차 역전파 시 기울기 소실문제)
  • 최적화 함수: SGD→Adam(비효율적 학습 보완)

 

2. 데이터 불러오기

#손글씨 데이터 불러오기(keras 제공)

from tensorflow.keras.datasets import mnist

 

#학습용/테스트용 데이터, 문제/정답데이터 구분된 상태

 

(X_train, y_train), (X_test, y_test)=mnist.load_data()



3. 활성화 함수, 경사하강법 성능 비교

from tensorflow.keras.models import Sequential #뼈대

 

from tensorflow.keras.layers import Dense, InputLayer, Flatten #층

 

#최적화 함수

from tensorflow.keras.optimizers import SGD, Adam

 

1)sigmoid+SGD 조합

  • 신경망 모델 구조 설계(add)

#1. sigmoid+SGD 조합

#1. 신경망 모델 구조 설계

#1-1. 뼈대

digit_model=Sequential()

 

#1-2. 입력층

#사진 1장의 크기: 28*28

#2차원 데이터

digit_model.add(InputLayer(input_shape=(28,28)))

 

#1-3. 중간층

#2차원 데이터를 1차원 데이터로 변경(선형모델)

digit_model.add(Flatten()) 

 

#중간층 쌓기

digit_model.add(Dense(units=64, activation='sigmoid'))

digit_model.add(Dense(units=128, activation='sigmoid'))

digit_model.add(Dense(units=256, activation='sigmoid'))

digit_model.add(Dense(units=128, activation='sigmoid'))

digit_model.add(Dense(units=64, activation='sigmoid'))

 

#1-4. 출력층

#각 클래스별 확률 출력(클래스별 확률 총합: 100%)

digit_model.add(Dense(units=10, activation='softmax'))

 

  • 모델 학습 방법 및 평가방법 설정(compile)

#2.모델 학습방법 및 평가방법 설정(loss값 설정)

digit_model.compile(loss='sparse_categorical_crossentropy',

                    optimizer=SGD(learning_rate=0.01),

                    metrics=['accuracy']

                     # callbacks=[mckp, early] #callback 함수 사용

                    )

 

  • 모델 학습(fit)

#3.모델 학습

h1=digit_model.fit(X_train, y_train,

               validation_split=0.2,

                epochs=20, batch_size=32

                   )

 

#층을 많이 만들면서 미분값이 적어져 정확도가 떨어짐

#기울기 소실문제 발생하여 정확도 떨어짐

 

2)relu+SGD 조합

#2. relu+SGD 조합

#1. 신경망 모델 구조 설계

#1-1. 뼈대

digit_model2=Sequential()

 

#1-2. 입력층

#사진 1장의 크기: 28*28

#2차원 데이터

digit_model2.add(InputLayer(input_shape=(28,28)))

 

#1-3. 중간층

#2차원 데이터를 1차원 데이터로 변경(선형모델)

digit_model2.add(Flatten()) 

 

#중간층 쌓기

digit_model2.add(Dense(units=64, activation='relu'))

digit_model2.add(Dense(units=128, activation='relu'))

digit_model2.add(Dense(units=256, activation='relu'))

digit_model2.add(Dense(units=128, activation='relu'))

digit_model2.add(Dense(units=64, activation='relu'))

 

 

#1-4. 출력층

#각 클래스별 확률 출력(클래스별 확률 총합: 100%)

digit_model2.add(Dense(units=10, activation='softmax'))

 

#2.모델 학습방법 및 평가방법 설정(loss값 설정)

digit_model2.compile(loss='sparse_categorical_crossentropy',

                    optimizer=SGD(learning_rate=0.001), 

               #SGD 기본 learning_rate 0.01

                    metrics=['accuracy']

                    )

 

#3.모델 학습

h2=digit_model2.fit(X_train, y_train,

               validation_split=0.2,

                epochs=20, batch_size=32)

 

3)relu+Adam 조합

# 3. relu+Adam 조합

#1. 신경망 모델 구조 설계

#1-1. 뼈대

from tensorflow.keras.models import Sequential

digit_model3=Sequential()

 

#1-2. 입력층

#사진 1장의 크기: 28*28

#2차원 데이터

digit_model3.add(InputLayer(input_shape=(28,28)))

 

#1-3. 중간층

#2차원 데이터를 1차원 데이터로 변경(선형모델)

digit_model3.add(Flatten()) 

 

#중간층 쌓기

digit_model3.add(Dense(units=64, activation='relu'))

digit_model3.add(Dense(units=128, activation='relu'))

digit_model3.add(Dense(units=256, activation='relu'))

digit_model3.add(Dense(units=128, activation='relu'))

digit_model3.add(Dense(units=64, activation='relu'))

 

 

#1-4. 출력층

#각 클래스별 확률 출력(클래스별 확률 총합: 100%)

digit_model3.add(Dense(units=10, activation='softmax'))

 

#2.모델 학습방법 및 평가방법 설정(loss값 설정)

digit_model3.compile(loss='sparse_categorical_crossentropy',

                    optimizer=Adam(learning_rate=0.001), 

                #Adam 기본 learning rate: 0.001

                    metrics=['accuracy']

                    )

 

#3.모델 학습

h3=digit_model3.fit(X_train, y_train,

               validation_split=0.2,

                epochs=20, batch_size=32)

 

  • 활성화함수, 최적화 함수조합 비교

plt.figure(figsize=(15,5))

# sigmoid + SGD 조합

plt.plot(h1.history['accuracy'], label="sigmoid+SGD train acc")

plt.plot(h1.history['val_accuracy'], label="sigmoid+SGD validation acc")

 

# relu + SGD 조합

plt.plot(h2.history['accuracy'], label="relu+SGD train acc")

plt.plot(h2.history['val_accuracy'], label="relu+SGD validation acc")

 

# relu + Adam 조합

plt.plot(h3.history['accuracy'], label="relu+Adam train acc")

plt.plot(h3.history['val_accuracy'], label="relu+Adam validation acc")

 

plt.legend()

plt.show()

 

 

4. callback 함수

 

1)모델 저장:딥러닝 모델 학습 시 지정된 모든 epochs를 진행하면 과대적합 위험→중간에 일반화된(성능이 좋은) 모델을 저장하는 기능

 

2)조기학습중단: epohs를 크게 설정했을 때 일정 횟수 이상으로 성능개선이 되지 않음→성능이 더 이상 개선되지 않을 경우 조기학습 중단 필요

 

  • callback 함수 불러오기

#callback 함수 불러오기

 

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

 

  • best 모델 저장

#best 모델 저장

#1. 드라이브 마운트

#2. 경로 설정

 

model_path='/content/drive/MyDrive/Colab Notebooks/DeepLearning/data/digit_model/dm_{epoch:02d}_{val_accuracy:0.2f}.hdf5'

 

mckp=ModelCheckpoint(filepath=model_path, #저장경로

                verbose=1, #데이터 저장로그 출력

                save_best_only=True

                  #모델의 성능이 최고점을 갱신할 때마다 저장

                monitor='val_accuracy' #최고점의 기준

                )

 

  • 조기학습 중단

#조기학습 중단

early=EarlyStopping(monitor='val_accuracy', #조기중단의 기준

                    verbose=1, #로그 출력

                    patience=10 #조기중단을 위해 모델성능 개선을 기다리는 최대 횟수

                    )

 

#best 모델과 조기학습중단의 monitor값은 동일하게 하는 것이 바람직함

 

  • callback 함수 적용하여 신경망 모델 학습: best 모델일 때 조기학습중단됨

#callback 적용하여 신경망 모델 학습

#1. 신경망 모델 구조 설계

#1. 뼈대

digit_model1=Sequential()

 

#2. 입력층

#사진 1장의 크기: 28*28

#2차원 데이터

digit_model1.add(InputLayer(input_shape=(28,28)))

 

#3. 중간층

digit_model1.add(Flatten()) #2차원 데이터를 1차원 데이터로 변경(선형모델)

 

digit_model1.add(Dense(units=256, activation='sigmoid'))

digit_model1.add(Dense(units=128, activation='sigmoid'))

digit_model1.add(Dense(units=64, activation='sigmoid'))

 

 

#4. 출력층

#각 클래스별 확률 출력(클래스별 확률 총합: 100%)

digit_model1.add(Dense(units=10, activation='softmax'))

 

#모델 학습방법 및 평가방법 설정(loss값 설정)

digit_model1.compile(loss='sparse_categorical_crossentropy',

                    optimizer=SGD(learning_rate=0.01),

                    metrics=['accuracy']

                    )

 

#모델 학습

h1_call=digit_model1.fit(X_train, y_train,

               validation_split=0.2,

                epochs=1000, batch_size=32,

                callbacks=[mckp, early] #callback 함수 사용

                   )

 

 

  • 저장된 모델 중 정확도가 가장 높은 모델 불러오기

#모델 불러오는 도구

 

from tensorflow.keras.models import load_model

 

#저장된 모델 중 정확도가 가장 높은 모델 불러오기

best_model=load_model("/content/drive/MyDrive/Colab Notebooks/DeepLearning/data/digit_model/dm_38_0.96.hdf5")

 

  • 정확도가 가장 높은 모델 평가하기(evaluate)

print(best_model.evaluate(X_test, y_test))

 

#loss: 0.15

#accuracy: 0.95

 

'딥러닝' 카테고리의 다른 글

[DL]7. 과대적합 제어 및 전이학습  (1) 2023.09.21
[DL]6. CNN  (0) 2023.09.20
[DL]4. 다중분류  (0) 2023.09.14
[DL]3. 퍼셉트론, 다층퍼셉트론  (0) 2023.09.11
[DL]2. 딥러닝 개요  (0) 2023.09.09