3️⃣ 딥러닝의 학습방법
딥러닝은 출력값과 실제값을 비교하여 그 차이를 최소화하는 가중치(weight)와 편향(bias)의 조합을 찾는다. 이때 가중치는 오차를 최소화하는 방향으로 모델이 스스로 탐색한다.
오차계산은 실제 데이터를 비교하며, 손실함수(오차의 정확도를 계산하는 수식, MAE/MSE 등)를 최소화하는 값을 탐색하며, 문제유형에 따라 알맞은 손실함수를 선정해야 한다.
모델을 컴파일 하는 부분에서 옵티마이저로 경사하강법의 원리를 이용하여 알맞은 손실함수를 찾아 최소화시키도록 학습한다.
👉 결국, 손실함수를 최소화하는 가중치와 편향을 찾는 방향으로 학습하는 것이 궁극적인 목표이다.
💡 손실함수
머신러닝 혹은 딥러닝 모델의 예측값과 실제값의 차이를 수치화해주는 함수이며, ‘오차가 작다’는 말은 ‘손실함수가 작다’는 말과 같다. 예를 들어 손실함수가 2차함수라면 기울기(미분)가 0이 되는 지점에서 손실함수의 최솟값을 찾게 된다.
✅ 분류문제에 사용되는 손실함수
✏️ binary_crossentropy(이항교차엔트로피)
- 이진분류일 때 자주 사용하는 손실함수
- 활성화함수로 sigmoind를 사용함
✏️ categorical_crossentropy(범주형 교차 엔트로피)
- 출력값을 클래스 소속 확률에 대한 예측으로 이해할 수 있는 문제, 즉 멀티 클래스 문제에 사용한다
- 활성화함수로 softmax를 사용한다
- label이 원핫인코딩된 형태로 제공될 때 가능하다
✏️ sparse_categorical_crossentropy
- 범주형 교차 엔트로피와 동일하게 멀티클래스 분류에 사용한다
- label이 원핫인코딩된 필요 없이 정수 인코딩 상태일때 수행가능하다
✅ 회귀문제에 사용되는 손실함수
✏️ MSE(means squared error, 평균제곱오차손실)
✏️ MAE(mean absolute error, 평균 절댓값 오차)
✏️ RMSE(root mean squared error, 평균 제곱근 오차)
💡 Optimizer
데이터와 손실함수를 기반으로 모델이 업데이트 되는 알고리즘, 다시 말해 손실함수를 최소화하는 방향으로 가중치를 갱신하는 알고리즘이다.
경사하강법에 기반을 둔 옵티마이저로는 SGD, RMSProp, Adagrad, ⭐Adam⭐등이 있다.
✅ 경사하강법(Gradient Descent)❓
손실함수의 현재위치에서 조금씩 손실이 낮아지는쪽으로 가중치를 움직이며 최솟값을 찾는 방법이다. 딥러닝은 손실함수의 형태가 복잡하고, **미분이 0이되는 값이 여러개 존재(Local minima문제가 발생)**하므로 경사하강법과 같은 최적화방법을 이용하게 된다.
✅ 확률적 경사하강법(Stochastic Gradient Descent, SGD)❓
경사하강법과 다르게 한번 학습할 때 모든 데이터의 가중치를 조절하는 것이 아니라, 랜덤하게 추출된 일부 데이터에 대해 가중치를 조절하며 최적해를 찾는다. 기존 경사하강법과 달리 속도는 개선되나, 극소(local minima)문제가 발생한다
✅ 극소(local minima)문제❓
옵티마이저는 손실함수에서 최소점(global minimum)이 최소가 되는 부분을 찾아야하지만, 수많은 극소점 중 최소점에 해당하지 않는 극소점을 찾는 문제가 발생하게 된다.
👉 이 문제들을 극복하고, 최적화 방향과 스텝사이즈도 적절하게 유지하며 적절한 상태로 모델을 최적화시키는 옵티마이저는 Adm이다!!
👉 딥러닝은 손실함수의 형태가 복잡하고, 미분이 0이되는 값이 여러개 존재(Local minima문제가 발생)하므로 경사하강법과 같은 최적방법을 이용하여 손실함수가 최솟값을 가질 수 있도록 손실이 낮아지는 쪽으로 움직여 weight와 bias를 업데이트한다.
4️⃣ 딥러닝 모델링
출처: 오늘의코드
⚙️ step1. 층구성: keras.sequential(): 딥러닝 레이어 만들기
- 신경망의 기본 구성요소는 층(layer)이다.
- 입력층 - 은닉층(Hidden layer) - 출력층 으로 구성되어 있다
- 층은 주입된 데이터에서 표현을 추출한다
- 대부분의 딥러닝은 간단한 층을 연결하여 구성된다
- tf.keras.layers.Dense와 같은 층들의 가중치(parameter)는 훈련하는 동안 학습된다.
model = tf.keras.models.Sequential()
- Sequential 모델은 각 층에 정확히 하나의 입력 텐서와 하나의 출력텐서가 있는 일반 레이어 스텍이 적합하다.
- 첫번째 Dense 층은 128개의 노드(또는 뉴런)을 가진다
Dense Layer
- 밀집 연결(densely-connected) 또는 완전 연결층(fully-connected)이라 부른다
- 완전 연결 계층(Fully Coneected Layer)인 밀집층은 내부뉴런이 이전 계층의 모든 뉴런에 연결되는 계층으로, 1차원 벡터로 변환된 레이어를 하나의 벡터로 연결한다.
- 모든 매개변수가 완전 연결 계층에 점유되기 때문에 과적합 발생이 높으므로, 이는 드롭아웃으로 해결한다
드롭아웃(dropout): tf.keras.layers.Dropout()
- 신경망에서 가장 효과적이고 널리 사용하는 규제 기법 중 하나이다.
- 완전 연결 계층이므로 과적합 방지를 위해 제외시키고 학습할 비율을 가르킨다.
- 훈련하는 동안 층의 출력 특성을 랜덤하게 끈다. 즉 0으로 만든다
- 보통 0.2~0.5사이를 사용한다
- 테스트 단계에서는 어떤 유닛도 드롭아웃하지 않는다. 훈련 단계보다 더 많은 유닛이 활성화되지 때문에 균형을 맞추기 위해 층의 출력 값을 드롭아웃 비율 만큼 줄인다.
- 바로 이전 층의 출력에 드롭아웃이 적용됨을 기억하자!
출력층 : 활성화함수는 출력층에서!
- 분류의 출력층
- 예측 값이 n개 일 때 : tf.keras.layers.Dense(n, activation='softmax')
- 예측 값이 둘 중 하나일 때 : tf.keras.layers.Dense(1, activation='sigmoid')
- 회귀의 출력층
- tf.keras.layers.Dense(1)
- 이는 항등함수(identity function)로 즉 계산된 값을 그대로 출력한다.
⚙️ step2. 모델 컴파일: model.compile()
optimizer
- 손실합수의 값을 가능한 낮추는 매개변수 탐색
- 오차가 최소가 되는 지점을 찾기 위해서, 기울기, 방향, learning rate등을 고려함,
loss: 손실율 측정
- 훈련 중 모델이 얼마나 정확한지 측정한다. 모델을 올바른 방향으로 "조정"하려면 이 함수를 최소화해야 한다
- label이 다중클래스에 정수형태이므로 sparse_categorical_crossentropy를 사용한다
metrics: 평가지표
- 훈련 및 테스트 단계를 모니터링하는 데 사용된다. 분류문제이므로 정확도 평가지표를 사용한다.
- 회귀: MSE, MAE
- 분류
- Binary(예측할 값의 종류가 둘 중 하나)
- Multi class(예측할 값의 종류가 2개이상)
- categorical crossentropy(one-hot형태의 클래스 예: [0, 1, 0, 0])
- sparse categorical crossentropy(정답값이 0, 1, 2, 3, 4 와 같은 형태일 때)
⚙️ step3. 요약: model.summary()
Param = (입력채널 input node) * (출력채널 output node) + (출력채널의 bias)
⚙️ step4. 학습: model.fit()
model.fit(x_train, y_train, epoch = , batch_size = , iteration = )
- 훈련하는 동안 훈련 데이터에 대한 모델의 손실과 정확도 정보가 출력됨
- 에포크(epoch): 모델 학습시 전체 데이터를 학습한 횟수
- 신경망에서 전체 데이터에 대해 순전파와 역전파가 끝난 상태, 즉 순전파 → 역전파가 1epoch, 학습횟수를 뜻한다
- 배치크기(batch_size): 모델 학습에 한번에 입력할 데이터 셋
- 몇개의 데이터 단위로 매개변수를 업데이트하는지 설정하는 값, 실제값과 예측값의 오차로부터 계산하고 옵티마이저가 가중치를 업데이트
- 이터레이션(iteration): 한번 에포크를 끝내기 위해서 필요한 배치수
- 스텝(step):(모델학습의 경우)하나의 배치를 학습한 횟수
⚙️ step5. 평가: model.evaluate()
model.evaluate(x_test, y_test)
- 모델에 설정된 손실값 및 메트릭 값을 반환한다.
✏️ summary
- 출력값은 활성화함수를 사용해 도출된다
- 출력값을 다시 작성하면 output = activation(dot(input, kernel) + bias) 이다
- 이 출력값과 실제값 사이의 오차를 최소화시켜주어야 하며, 이를 최적화시켜주는(기울기가 0, 미분값이 0) 가중치와 편향을 찾아야한다 → 이차함수의 기울기를 생각하자!
- 테일러의 급수전개에 따른 Quardratic approximation(2차다항식으로의 근사)
- 이때 딥러닝의 경우 계산식이 복잡하고 미분해서 0이 되는 지점이 많으므로 경사하강법 원리를 이용한 옵티마이저를 설정해줘 적절한 경사하강법을 수행해 최소점을 찾을 수 있도록 해야 한다.