멋사 AISCOOL 7기 Python/TIL

[TIL]1129: 딥러닝기초, 레이어구성, 활성화함수, 옵티마이저, MNIST, FMNIST

dundunee 2022. 11. 29. 20:45

https://www.youtube.com/watch?v=aircAruvnKk 

박조은 강사님께서 딥러닝에 개념을 잡기 좋은 영상으로 추천해주셨다

딥러닝 영상 리뷰

  • 28x28 이미지로 학습을 하는데 왜 입력에 784개가 들어갈까요? --> 28 * 28 = 784여서 --> 1차원으로 받기 위해서 --> 1치원으로 평탄화해서 이미지를 분류하기 위해서 --> Fully Connected Network에는 1차원 형태로만 주입이 가능하기 때문에 --> 네트워크에 데이터를 주입하기 위햐서 CNN, RNN에서는 전처리 기능을 제공하고 있고 --> 마지막에 Fully Connected Network를 통과하게 된다
  • 완전연결신경망(Fully Connected Network): 층을 깊게 쌓을 수 있기 때문에 Deep Neural Network이라 부른다 > Deep Learning
  • Fully Connected Network 에는 1차원형태로 네트워크에 데이터를 주입해야 하는데 어떻게 비정형 데이터(표형태가 아니라 이미지, 음성, 텍스트 등)를 잘 다룰까요? --> 전처리 레이어에서 이미지, 음성, 텍스트 등을 전처리하는 기능을 따로 제공한다. --> DNN(Deep Neural Network) > CNN > RNN순으로 배울것이다.
  • 가중치(식에서 'W')는 weight, 편향(식에서는 'b')은 bias: 학습을 할때 마다 계속해서 업데이트해줌
  • sigmoid함수는 활성화함수로, relu, swish등이 있다 시그모이드는 기울기소실문제가 있으며, 이를 해결하기 위해 렐루나 리키렐루함수를 사용하기도한다.

딥러닝 기초

13p <Model architecture>

  • drop out? 일부 노드를 제거하고 사용하는 것, 과대적합(과적합, 오버피팅)을 방지하기 위해서

31p <(분류)Cross Entropy Loss>

  • 분류결과의 품질을 측정하기 위해 크로스엔트로피를 사용하는데
  • 양수로 만들어주기 위해 식 앞에 마이너스를 붙임

69p <분류의 출력>

  • 소프트맥스 다중클래스분류일 때 분류의 출력층에서 사용
  • N개로 반환(클래스개수만큼)되며 합이 1이됨
  • 가장 큰 값을 반환되는 값을 해당 클래스로 선택함
  • 특정 클래스에 대한 출력이 [0.1, 0.05, 0.7, 0.15] 이렇게 결과가 나왔다면 여기에서 예측값의 답을 무엇으로 하면 될까요?
  • 가장 큰 값이 0.7이므로, 이에 대한 인덱스 또는 클래스인 2를 반환한다
  • 그렇다면 위와 같이 출력되었다면 이 정답클래스의 종류는 몇개인가?
  • 4개이다. 즉 이 모델은 4개중 1개를 예측하는 모델이다.
  • np.argmax 는 가장 큰 값의 인덱스를 반환한다.

Optimizer

  • Gradient를 사용하는 이유는 오차를 측정하기 위해서이다.
  • Gradient Deccent < SGD <Adam!!

beginner 실습

레이어구성: tf.keras.models.Sequential

  • 입력층: tf.keras.layers.Flatten(input_shape=(28, 28))
  • Hidden layer: tf.keras.layers.Dense(units = 128, activation='relu'), tf.keras.layers.Dropout(0.2)
  • 출력층: tf.keras.layers.Dense(10, activation='softmax')

Dense layer의 기능

  • output = activation(dot(input, kernel) + bias): 출력 = 활성화함수(행렬곱(input, kernel)+편향)
  • 가중치와 편향이 포함된 수식이 이를 의미함
  • 코드 예시: tf.keras.layers.Dense(units = 128, activation='relu')
  • units은 네트워크에서 동그라미의 개수
  • units(노드) 개수, 층(레이어)수는 하이퍼파라미터이다.

compile

optimizer

  • 오차가 최소가 되는 지점을 찾기 위해서, 기울기, 방향, learning rate등을 고려함, 라이브러리 종류가 많지만 'adam'을 써도 됨
  • 모델이 인식하는 데이터와 해당 손실 함수를 기반으로 모델이 업데이트되는 방식

loss: 손실율 측정

  • 훈련 중 모델이 얼마나 정확한지 측정합니다. 모델을 올바른 방향으로 "조정"하려면 이 함수를 최소화해야 합니다

metrics: 평가지표

  • 훈련 및 테스트 단계를 모니터링하는 데 사용됩니다. 다음 예에서는 올바르게 분류된 이미지의 비율인 정확도를 사용합니다.

loss

  • loss => 모델이 학습을 하고 결과값이 나오면 실제값과 얼마나 차이가 있는지 평가하는 손실함수이다.
  • 분류에서는 주로 크로스엔트로피를 사용한다

모델 훈련 및 평가

  • 학습을 여러번하면 loss가 점점 줄어드는데, 학습을 하며 weight와 bias값을 업데이트 하기 때문이다.

epoch = 5

  • 순전파 -> 역전파 이 과정을 5번 반복하며, 반복할 수록 최적의 weight와 bias를 찾아간다.

실습2: 패션 MNIST 데이터셋 임포트하기

모델 컴파일

  • SparseCategoricalCrossentropy: ordinal encoding되어있는 label일 때 사용

모델 학습(model.fit)

  • epoch가 증가할수록 loss가 줄어들고, accuracy가 올라간다
  • epoch가 증가할수록 loss가 감소하지 않고, accuracy가 나아지지 않는다면 더 이상 학습하지 않고 중단할 수도 있다.
  • loss는 cross entropy를 사용하는 데, 그 확률값이 얼마나 섞여있느냐를 본다.
  • 0에 가까울 수록 다른 확률값이 섞여있지 않다.

summary

  • 다른 데이터에 적용한다면 층 구성을 어떻게 할것이나? 입력-은닉-출력층으로 구성된다
  • 예측하고자 하는 값이 분류(이진or멀티클래스), 회귀인지에 따라 출력층 구성, loss설정이 달라진다
  • 측정지표는 분류, 회귀에 따라 측정지표 정하기
  • 활성화 함수는 기본적으로 relu, 옵티마이저로는 adam을 사용하면 baseline 모델을 구성할 수 있다.
  • fit을 할 때 epoch를 통해 여러번 학습을 진행하는데, 이때 epoch수가 많을 수록 대체적으로 좋은 성능을 내지만 과대적합(오버피팅)이 될 수 있다.
  • epoch수가 너무 적다면 과소적합(언더피팅)이 될 수도 있다.

MNIST 실습과 FMNIST 실습의 차이점?

  • 데이터가 달랐다 ㅋ
  • mnist는 dropout을 해줬다
  • fmnist에서는 출력층에 softmax를 안써주고 10을 써줬다
  • 결과를 시각화해서 보기 좋았다
  • 확률값도 시각화해서 직관적이었다.
  • mnist는 compile loss를 파라미터 스트링으로 사용했고, fmnist는 api를 사용했다.

pima 데이터 실습

활성화함수: activation: tf.keras.activations.{activation}(x)

  • sigmoid: y축의 값이 0~1사이의 값을 가진다.
  • tanh: y축의 값이 -1~1사이의 값을 가진다. 시그모이드보다 빠르다
  • swish: y축의 값이 양수이며, 0에서 약간의 꺾임이 있다.
  • relu: 입력값이 0보다 작을 경우 0, 0보다 클 경우 입력값 그대로 출력한다, swish와 비슷한 특징을 가진다. 기울기소실문제의 해결법이다.

출력층 틀렸으니 주의하자

  • 예측 값이 n개 일 때 : tf.keras.layers.Dense(n, activation='softmax')
  • 예측 값이 둘 중 하나일 때 : tf.keras.layers.Dense(1, activation='sigmoid')

학습

early_stop

  • EarlyStopping은 loss나 accuracy의 성능이 더 나아지지 않으면 일찍 학습을 종료하는 기능
  • 시간과 비용을 아끼기 위하여 유용한 기능이다
  • val_loss 기준으로 값이 나아지지 않으면 멈추게한다
  • early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
  • 텐서플로우와 파이토치의 차이는 라이브러리 도구의 API차이이다. 이는 직접 딥러닝 모델을 밑바닥부터 짜서 구현할 수 있지만, 기능들을 함수나 메서드로 감싸서 여러 줄을 한 두줄의 API를 호출해서 사용할 수 있게 만들어준 도구이다.

✏️ summary

  • 다른 데이터에 적용한다면 층 구성을 어떻게 할것이나? 입력-은닉-출력층으로 구성된다
  • 예측하고자 하는 값이 분류(이진or멀티클래스), 회귀인지에 따라 출력층 구성, loss설정이 달라진다
  • 측정지표는 분류, 회귀에 따라 측정지표 정하기
  • 활성화 함수는 기본적으로 relu, 옵티마이저로는 adam을 사용하면 baseline 모델을 구성할 수 있다.
  • fit을 할 때 epoch를 통해 여러번 학습을 진행하는데, 이때 epoch수가 많을 수록 대체적으로 좋은 성능을 내지만 과대적합(오버피팅)이 될 수 있다.
  • epoch수가 너무 적다면 과소적합(언더피팅)이 될 수도 있다.
  • 활성화 함수를 이용해서 은닉층에서 찾는 것은 편향과 가중치이다.
  • 딥러닝과정에서 부분적인 오차를 최저오차로 인식하여 더이상 학습을 진행하지 않는 경우를 local minima라 한다
  • 은닉층과 출력층의 노드 출력값을 결정하는 함수는 활성화함수이다.
  • 활성화함수인 시그모이드와 하이퍼볼릭탄젠크의 미분 범위가 짦아 정보 소실이 발생되는 문제를 기울기소실문제라 한다
  • 실제값과 예측값의 차이를 수치화해주는 함수를 손실함수라고한다.
  • 은닉층에서 오버피팅을 막기위한 방법으로, 뉴럴 네트워크가 학습중일 때 랜덤하게 뉴련의 연결을 삭제해 학습을 방해함으로써 학습이 학습용 데이터에 치우치는 과대적합을 방지하는 방법은 드롭아웃이다.
  • 하용호님 자료: https://www.slideshare.net/yongho/ss-79607172