무냐의 개발일지

[Coursera ML Specialization] C2 Neural Networks / Week2 (신경망 훈련)/ loss, cost function의 차이 본문

Coursera

[Coursera ML Specialization] C2 Neural Networks / Week2 (신경망 훈련)/ loss, cost function의 차이

무냐코드 2024. 3. 6. 11:20

1. Neural Network Training

| 훈련 단계

 

 

1) 모델을 지정해준다 (주어진 파라미터 w,b 를 가지고 output을 어떻게 계산할지 결정한다)

 

2) 특정 손실함수 지정해서 모델을 compile(엮어준다) (숫자 확인 시, binary classification 문제가 된다.  

*compile 단계 : 사용할 손실함수(오차함수)를 정해준다

*비용함수, 손실함수의 차이

- loss function : single trianing에서 계산한 오차함수

- cost function : 전체 훈련 세트에 대해 계산된 loss function의 평균

* binary cross entropy loss function (교차 엔트로피 함수임, 이진분류 문제인 걸 강조하려고 binary를 써줌)

 

3) 모델 학습

*epoch : 경사하강법을 수행할 시간을 결정한다 (number of steps in gradient descent)

* 마지막 단계 경사하강법을 통해, tensorflow를 이용해 cost function을 최소화해준다 (dj_dw : J 함수를 w에 대해 편미분해주는 거)

 

 


 

2. Activation functions (sigmoid function 대신 쓸만한 거)

| ReLu 활성화 함수

ex) demand 예측할 때 인지도가 있으면, '잘 안다', '모른다'의 binary로 나누는 게 아니라, 그 정도에 따라 단계적으로 나눌 수 있다.

Sigmoid는 0, 1 로 나누는거니까, 다른 활성화함수(activation function)을 쓴다

 

* ReLu (Rectified Linear Unit, 별 의미없음) : sigmoid activation function말고, 이걸 많이 쓴다!

 

| Activation Functions (대표적으로 3가지) + (나중에 softmax activation도 배울거야)

 

 

 

신경망의 다른 뉴런들에 대해 각기 다른 activation 함수를 선택할 수 있다!

 

* Hidden Layer

- Relu를 기본 활성화함수로 사용하는 걸 추천 (sigmoid 함수보다 ReLu가 계산이 더 빠르다)

 

* Output Layer

- binary classification 문제면 -> sigmoid 함수!

- regression 문제면 (결과가 +/ -) -> 내일 주가를 예측하려 할 때, linear 함수!

- regression인데 y가 0이나 양수만 취할 수 있는 경우 (결과가 + | 주택 가격 예측) -> ReLu 함수!

 

 

| 왜 신경망에는 Activation Function이 중요하고 필요합니까??

만약, 여러 hidden 에 linear, output에 linear -> 이 모델은 완선히 선형회귀와 동일한 값을 출력할 것이다. 

하지만, hidden에 linear, output 에 logistic -> 이 모델은 logistic regression과 같아진다.

-> linear을 hidden 에 쓴다는 건 no activation function이랑 다를 바가 없다!

따라서, hidden layers에 linear을 쓰지 말고, ReLu를 쓰는게 완전 괜찮다.

 

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LeakyReLU
from tensorflow.keras.activations import linear, relu, sigmoid

 

3. Muticlass Classification

output이 2개 이상의 output label을 가질 수 있는 것

ex) MNIST 예시 : 각기 다른 숫자 10개를 분류해 내는 문제, 부품 제조의 결함 문제 

 

 

- binary : 1일지 1이 아닐지를 구한다

- multiclass : y가 1, 2, 3, 4와 같을 확률을 각각 나눈다

 

| Softmax regression algorithm (이진분류모델 logistic regression을 Multiclass에서 사용할 수 있게 일반화한 것)

 

 

| Neural Network with Softmax output

- 앞에 계산은 다 똑같은데, 10개 숫자를 분류한다고 하면, output은 1개가 아니라 10개가 된다.

 

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

#specify the model
model = Sequential([
		Dense(units = 25, activation='relu'),
        Dense(units = 15, activation='relu'),
        Dense(units = 10, activation='softmax')
        ])
        
#specify loss function (L(f(x),y))
from tensorflow.keras.losses import SparseCategoricalCrossentropy
model.compile(loss= SparseCategoricalCrossentropy()

#Train on data to minimize cost function (J(w,b))
model.fit(X, y, epochs=100)

 

- Sparse : y를 1~10까지의 범주형으로 나눈다 & sparse의 의미는 1~10 중 오직 하나만 고를 수 있다는 것.

- 근데 이 코드 쓰지 말고, 더 잘 작동하는 코드를 뒤에서 설명할 것이다.

 

| 더 좋은 구현 방법 ! 

컴퓨터에서 같은 양의 연산을 하는 방법 

 

- 반올림 등으로 소숫점이 조금 다를 수 있는 걸 이렇게 구현하면 더 정확하다 (logits = z) (가독성은 조금 안좋지만)

- 로지스틱회귀에서는 어떻게 계산하든 결과가 똑같지만, 소프트맥스에서는 이 방법이 효과적으로 오차를 줄여준다.

- When you set from_logits=True, then it expects the output layer of the model to be 'linear' (logits), because the loss function calculates the softmax itself with a more numerically stable method.

 

 

| Classification with multiple outputs 

* Multi-label Classification

ex) 사진에서 사람, 자전거, 차, 버스를 구분하는 것 (이미지 하나에 3개의 다른 레이블이 있으니까)

 

Multi-label 이다 (Multi-class랑 다르다)

- car, bus, pedestrian 가 있는지 여부에 따라 각각 0, 1의 레이블을 다는 문제이다.

 

 

* Adam Optimizer(Adaptive Moment estimation) :
Loss function의 최솟값을 찾는 알고리즘으로 Momentum과 RMSProp의 기본 아이디어를 합친 알고리즘이다.
model.compile(
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    optimizer=tf.keras.optimizers.Adam(0.01),
)

- optimizer Adam은 요런 식으로 사용한다

 


4. Additional Neural Network Concepts

1) Optimization

- Gradient Descent : 최적화 알고리즘 (많이 사용된다. 선형 회귀, 로지스틱 회귀 등)

- 경사하강법보다 모델을 더 효과적으로 훈련하는 더 좋은 알고리즘이 많다 !!  (Adam)

 

* 경사하강법

 

: 한 단계씩 내려가서 최적점을 찾아간다. 이 때 learning rate 알파를 더 키우면 더 빨리 찾을 수 있지 않을까?

:  반대로, 너무 알파가 크면, 또 비효율적으로 진동한다.

: 이런 작업을 Adam은 알파를 더 효율적으로 바꿔준다. 

 

 

| Adam 

: Adam은 학습률이 너무 낮아서 비슷한 방향으로 계속 작은 단계만 반복 시, 알파를 키워주고, 너무 커서 진동 시, 알파를 줄여준다.

 

: 학습률을 자동으로 조정한다

: do not use just one alpha (알파를 여러개 사용한다)

 

 

- 경사하강법보다 빠르다

- 실무자가 신경망을 훈련시키는 데 있어서 표준으로 사용된다.

- 그냥 기본적으로는경사하강법 말고 Adam을 사용한다.

 

 

2) Additional Layer Types 

- Convolutional Layer : 입력 영상의 특정 영역만 확인하는 것. 각각의 뉴런은 앞선 layer 결과의 일부만 확인한다 (

- CNN의 장점 : 계산이 빠르다, 적은 training data만 필요하다 (과적합될 경향이 적다)

 

-  이 convolutional layer가 여러개 있는 경우, 이것을 CNN (convolutional neural network)라고 부른다

 

마지막에는 심장병이 있나 없나 구분하는 sigmoid를 사용

 

 

이렇게 1~5, 2~6, 3~7 이런 식으로 일부 데이터만 쪼개서 하나의 뉴런을 구성. 그 여러개의 뉴런이 모인게 convolutional layer.

이 convolutional layer가 여러개 모인게 convolutional neural network 이다.

 


 

| 역전파가 미적분학 

 

 

 

- 미분은 기울기니깐 !