멋사 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