연습장

01. 딥러닝 본문

카테고리 없음

01. 딥러닝

js0616 2023. 9. 25. 17:40

퍼셉트론 : 인공신경망 구성의 기본단위로 선형함수 + 활성화함수 구조이다.

 

1. 선형함수 

y= ax+b 와 같은 선형

y = W1X1 + W2X2 + b  ...0

y = W1X1 + W2X2 + b  ...1

 

2. 활성화 함수

 

계단함수

0 , 1 의 값을 가진다. (비활성화 / 활성화 )

- 단점 미분이 불가능하다.

 

 

Sigmoid

 

 

0 ~ 1 사이의 값을 가지며 미분이 가능하다.

 

 

다층 퍼셉트론

입력층(input layer) : X.shape 에 영향을 받음

중간층 (hidden layer) : 어떻게 쌓느냐에 따라 모델 성능이 바뀐다. 

출력층(output layer) : y 값에 영향을 받음

 

 


예시 코드 

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Flatten # 모델을 쌓기위한 도구
from tensorflow.keras.optimizers import SGD, Adam # 옵티마이저
from tensorflow.keras.datasets import fashion_mnist # 패션데이터
from tensorflow.keras.utils import to_categorical # 분류 데이터 -> 정답을 확률로
from tensorflow.keras.callbacks import EarlyStopping # 얼리스탑
model1 = Sequential() # 뼈대를 세우는 클래스

#입력층
model1.add(InputLayer(input_shape = (28,28)));
model1.add(Flatten()) # 2차원 사진데이터를 1차원으로 평평하게 만듬 28*28 = 784 개 pixel 데이터로 만듬

#중간층
model1.add(Dense(128, activation='sigmoid'))
model1.add(Dense(256, activation='sigmoid'))
model1.add(Dense(128, activation='sigmoid'))

#출력층
model1.add(Dense(10, activation = 'softmax'))

#학습 및 평가방법 설정
model1.compile(loss='categorical_crossentropy',
               optimizer = SGD(learning_rate=0.01 , # momentum=  .. 클래스로 SGD 를 불러오면 파라미터 조정이 가능
                                                                )
               , metrics=['accuracy']) # 3개이상. 2진 - binary.. ,
   
# 조기학습중단
early = EarlyStopping(monitor = "val_accuracy",
                      patience = 10)
his1 = model1.fit(X_train, y_train_one_hot,
                  validation_split=0.2, #검증데이터 나누어줌
                  callbacks = [early],
                  epochs = 200
                 )

 

회귀와 분류에 따라서 출력층의 활성화 함수가 다르다.

회귀 : linear (항등함수 y=x) :  원래 데이터의 단위를 유지해야함. 활성화함수가 필요하다. 0~1 인 함수는 x -> 항등함수

분류 : sigmoid, softmax : 항상 일정한 값이 나와야 한다. 

 

Complie 의 loss 값의 경우

회귀 : mse ..? 

이진분류 : binary_crossentropy
다중분류 : category_crossentropy


오차 역전파 (Back Propagation)
- 순전파 : 입력데이터를 입력층에서부터 출력층으로 전파시키면서 출력값을 찾아가는 과정 : 추론
- 역전파 : 에러를 출력층에서 입력층쪽으로 전파시키면서 최적의 학습결과를 찾아가는 것 : 학습

                개별의 퍼셉트론이 관여한 오차만 수정 p.348

 

 

기울기 소실문제 (vanishing Gradient)

오차 역전파를 통해서 에러가 1/4 씩 감소 
입력층으로 갈수록 에러가 사라지고 업데이트가 안일어나게된다. 

 

 

기울기 소실문제를 해결하기 위해서

 

다른 활성화 함수가 등장하게된다. 

 

 

일반적으로 Relu가 성능이 좋고 나머지는 데이터나 모델에 따라서 바꾸는 모양.

 


각각의 모델에 대해 시각화

# 위에 임포트 코드 추가 해놓기
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.plot(his1.history['accuracy'], label = 'train_acc_sigmoid+SGD')
plt.plot(his1.history['val_accuracy'], label = 'train_acc_sigmoid+SGD')
plt.plot(his2.history['accuracy'], label = 'train_acc_relu+SGD')
plt.plot(his2.history['val_accuracy'], label = 'train_acc_relu+SGD')
plt.plot(his3.history['accuracy'], label = 'train_acc_relu+Adam')
plt.plot(his3.history['val_accuracy'], label = 'train_acc_relu+Adam')
plt.legend()
plt.show()

 

2번 모델인 relu + SGD 의 경우 학습이 잘 안되는데

-> relu의 층을 깊게 쌓거나

-> 학습률(learning_rate) 를 낮추면 좋은 결과가 나오게된다. 

 

(1의 모델에서 activation 을 sigmoid -> relu 로 바꾸고 learning_rate 만 1/10 로 낮추었음)

model2 = Sequential() # 뼈대를 세우는 클래스

#입력층
model2.add(InputLayer(input_shape = (28,28)));
model2.add(Flatten()) # 2차원 사진데이터를 1차원으로 평평하게 만듬 28*28 = 784 개 pixel 데이터로 만듬

#중간층
model2.add(Dense(128, activation='relu'))
model2.add(Dense(256, activation='relu'))
model2.add(Dense(128, activation='relu'))

#출력층
model2.add(Dense(10, activation = 'softmax'))

#학습 및 평가방법 설정
model2.compile(loss='categorical_crossentropy',
               optimizer = SGD(learning_rate=0.001 , # momentum=  .. 클래스로 SGD 를 불러오면 파라미터 조정이 가능
                                                                )
               , metrics=['accuracy']) # 3개이상. 2진 - binary.. ,
   

 

model 3의경우 optimizer 를 SGD가 아닌 Adam 을 사용 

 

 

model2를 수정 후 다시 시각화 하게되면 다음과 같이 나은 성능을 보인다. 

 

 


기타.

 

- 기본 경사하강법 GD : 전체 데이터를 이용해 업데이트  -> 오래걸린다, ram 이 터진다. 기기적 한계 , 자원확보 어려움,  
- 확률적 경사하강법 : Stochastic Gradient Descent : SGD : 기본값으로 사용.  keras - 32개 벤치 사이즈 . ,  
- 모멘텀 : Momentum : 경사하강법에 관성을 적용해 업데이트 0.9 정도 넣음. 
- 네스테로프 모멘텀 : Nesterov Accelrated Gradient : 개선된 모멘텀 방식
- 아다그리드 : Adaptive Gradient : 학습률 감소 방법을 적용해 업데이트 : 시간이 지날수록 학습률을 낮춰서 천천히 이동