본문 바로가기

AI 머신러닝, 딥러닝

[딥러닝] Neural Network, Activation Function, Backward propagation, Forward propagation

input layer - hidden layer - output layer 

입력층은 층의 갯수에서 제외하고, 2 layer의 neuron network (입력층은 공식 레이어에서 제외) 

a^[1] -superscript : layer층을 나타냄 

   1   -subscript : layer 내에서 몇 번째 노드인지 순서를 나타냄 

 

로지스틱 회귀 = 시그모이드 함수를 활용한 출력층 하나만 있는 것과 유사 

a[1] <- 영향을 주는 파라미터 w[1] = (4, 3) / b[1] = (4, 1)

 

<Vectorized Implementation>

Z[1] = W[1] X + b[1]

A[1] = g[1](Z[1]) 

Z[2] = W[2]A[1] + b[2]

A[2] = g[2](Z[2])

 

<Activation Function>

(1) sigmoid 함수 

a = 1 / 1 + exp(-z) 

: 이진 분류 문제 제외하곤 잘 사용하지 않는다. 

(2) tanh 함수 (탄젠트 함수, 쌍곡선 탄젠트 함수) 

a = tanh / (z)

exp(z) - exp(-z)  / exp(z) + exp(-z) 

: 데이터의 평균을 0에 가깝게 함으로써 계산을 더 간단하게 해준다. 

(3) relu 함수 

a = max(0, Z) 

: 기울기가 0과 매우 다름 -> 빠르게 학습 가능 

(4) Leaky Relu 

a = max(0.012, Z) 

: Relu에서 음수일때 기울기가 0인 단점을 보완해주지만 Relu를 압도적으로 많이 사용한다. 

 

신경망 - 비선형 활성화 함수를 필요로 한다. 

왜냐하면, 비선형 활성화 함수를 넣지 않으면 많은 계산을 잘 해낼 수 없다 => 은니층에서는 선형활성화 함수를 거의 사용X

 

<Gradient Descent for neural network>

parameters : W[1], b[1], W[2], b[2]

cost functions : J(W[1], b[1], W[2], b[2]) - (1/m) * np.sum(L(y_hat, y))

Gradient descent : 

-> Repeat {

                   compute predicts (y_hat)

                   dW[1] = dJ / dW[1], db[1] = dJ / db[1]

                   W[1] -= alpha * dW[1]

                   b[1] -= alpha * db[1] }

 

<Forward propatgation>
Z[1] = W[1] X + b[1]
A[1] = g[1](Z[1])
Z[2] = W[2] A[1] + b[2] 
A[2] = g[2](Z[2])

<Backward propagation>
dZ[2] = A[2] - Y
dW[2] = (1/m) dZ[2] A[1].T
db[2] = (1/m) np.sum(dZ[2], axis =1, keepdims = True) # 차원의 배열 유지 
dZ[1] = np.dot(W[2].T dZ[2] * g[1]'(Z[1])
dW[1] = (1/m) dZ[1] X.T
db[1] = (1/m) np.sum(dZ[1], axis=1, keepdims = True)

<Random Initializaion>

: 0이 아닌 아주 작은 값으로 초기화하기 

W[1] = np.random.randn((2, 2)) * 0.01