1. Key Concepts on Deep Neural Netoworks (Quiz)
- 어려운 내용은 아닌데 다 맞히기가 어려워서 몇 번이고 시도했다...
- cache는 forward를 진행하는 과정에서 backward 계산을 편리하게 하기위해 저장하는 변수값이다.
이때 저장되는 Z는 미분계수를 구하는데 사용된다. - parameter에는 W,b가 포함된다. activation function, number of layers 등은 hyper parameter에 속한다.
- vecotirzation을 통해 explict한 for-loop를 줄일 수 있지만 각 layer에 대한 계산을 수행하는데 있어서는 for-loop를 제외할 수 없다.
- Z,A를 각 layer에 대해 계산하는 알맞은 코드를 고른다.
결과적으로 Z[1]-Z[l] 만큼의 matrix가 생성되는데, 이때 가중치 W와 입력 A의 차원에 유의하도록 한다. - network의 layer 수는 hidden layer의 개수 +1로 파악하는 것이 통상적이다.
- backpropagation을 수행함에 있어서 어떤 활성화함수가 사용되었는지가 영향을 준다.
코드를 구현할 때는 사용된 활성화함수의 종류에따라 다른 함수를 적용한다.(라이브러리에서 구현된 것을 가져다 쓴다) - 같은 결과를 도출하기 위해 layer의 수를 줄일 수도 있다.
하지만 그럴 경우 노드 수가 증가하면서 필요한 연산의 횟수도 기하급수적으로 증가하게 된다.
- cache는 forward를 진행하는 과정에서 backward 계산을 편리하게 하기위해 저장하는 변수값이다.
2. Building your Deep Neural Network: Step by Step
- initialize_parameters(n_x, n_h, n_y)
- 2 layer NN은 hidden layer가 두 개, 즉 w1,b1,w2,b2가 존재할 것
- w1 = (n_h,n_x), b1 = (n_h,1), w2 = (n_y,n_h), b2 = (n_y,1)
- initialize_parameters_deep(layer_dims)
- vectorize를 통해 각 layer의 w와 b를 초기화할 수 있다.
- W = (current layer, previous layer), b = (current layer,1)
- linear_forward(A, W, b)
- Z = W @ A + b 로 정의된다. (사실은 이전 layer의 A여야 하는데 여기서는 일단 A로 입력을 주었다.)
- Cache = (A,W,b) 정보를 저장한다.
- linear_activation_forward(A_preve, W, b, activation)
- Z, linear_cache = linear_forward(prev_A,W,b)를 입력한다.
- A, activation_cache = sigmoid(or relu)(Z)
- linear_cache 에는 이전과 마찬가지로 (prev_A,W,b) 정보가 저장되고, activation_cache 에는 Z가 저장된다.(document 참조)
- L_model_forward(X, parameters)
- X는 입력 feature (input size, examples)
- parameters은 initialize_parameters_depp()의 output 이다.(w1,b1, …, wl,bl)
- Output layer직전까지는 for문으로 linear_activation_forward(‘rely’)를 실행
- 마지막 output에서는 linear_activation_forward(‘sigmoid)를 실행.
- caches 리스트에 forward에서 발생하는 모든 cache를 저장
- compute_cost(AL, Y)
- AL : L_model_forward 의 output, y hat, (1, examples)
- Y : 정답 레이블 (1, examples)
- Cost = -1/m * np.sum(Y * np.log(AL) + (1-Y) * np.log(1-AL)) 로 정의된다.
- 이 cost는 np.squeeze(cost)를 거쳐야 한다.
np.array의 형태가 아닌 scalar값으로 반환하기 위함이다.
- Backward Propagation Module
- np.sum 에서 axis = 0 또는 1, 그리고 keepdims = Ture
- Axis = 1은 열을 압축시킨다. 즉 행은 그대로 두고 각 행의 열들을 합친 값을 반환한다.
- Axis = 0은 행을 압축시킨다. 즉 열은 그대로 두고 각 열의 행들을 합친 값을 반환한다.
- linear_backward(dZ, cache)
- Cache = A_prev, W, b 가 저장되어있다. 따라서 backward에 필요한 모든 cache값들을 불러온 것이다.
- m은 examples의 수가 된다.
- dW = 1/m * (dZ @ A_prev.T)
- db = 1/m * np.sum(dZ, axis=1,keepdims=True)
- 두 변수는 m개의 example에 대한 평균을 구해야한다. 그리고 axis=1은 row에 대해서 sum을 수행하도록 한다.
- dA_prev = W.T @ dZ
- linear_activation_backward(dA, cache, activation)
- dA는 linear_backward의 return값
- dZ = relu_backward(dA,cache[1]), cache[1]은 activation_cache를 담고 있다.
- dA_prev,dW,db = linear_backward(dZ,cache[0])
현 함수에서 구한 dZ를 이용해서 backward를 진행한다. 이때 필요한 dA_prev,dW,db는 cache[0]에서 불러온다.
- L-model_backward(AL, Y, caches)
- AL은 forward propagation의 마지막 결과값
- Y는 정답 레이블, .reshap(AL.shape)를 통해 모양을 맞춰준다.
- m은 examples의 개수
- dAL = -(np.divide(Y,AL) - np.divide(1-Y,1-AL))로 정의된다.
- current_cache에서 caches[-1]을 꺼내온다.
- linear_activation_backward(dAL, current_cache, ‘sigmoid’)를 적용하고 dA_prev_temp, dW_temp, db_temp를 저장한다.
- 이제 나머지 l-1 개의 layer에 대해 linear_activation_backward(dA, current_cache, ’relu’)를 수행하고 각 변수를 저장한다.
- update_parameters(params, grads, learning_rate)
- paramas : W,b 를 꺼내올 파라미터 딕셔너리
- grads : dW, db를 꺼내올 미분 파라미터 딕셔너리
- 각 step마다 Wl = Wl - learning rate * dW, bl = bl - learning rate * db
3. Deep Neural Network - Application
def initialize_parameters(n_x, n_h, n_y):
...
return parameters
def linear_activation_forward(A_prev, W, b, activation):
...
return A, cache
def compute_cost(AL, Y):
...
return cost
def linear_activation_backward(dA, cache, activation):
...
return dA_prev, dW, db
def update_parameters(parameters, grads, learning_rate):
...
return parameters
- parameters = initialize_parameters(n_x, n_h, n_y)
파라미터는 이 함수를 통해 입력, 히든사이즈, 출력 사이즈를 입력하여 랜덤값을 초기화한다. - A1, cache1 = linear_activation_forward(X,W1,b1,’relu’)
A2, cache2 = linear_activation_forward(A1,W2,b2,’sigmoid’)
이 함수를 사용하여 계산된 Z = A(l) 값을 얻고 사용된 변수 A(l-1), W, b를 저장할 수 있다.
이때 A(0) = input이고, A(2) = output이 된다.(y hat) - cost = compute_cost(A2, Y)
우리가 forward를 통해 구한 y hat인 A2와 정답 레이블 Y 사이의 cost를 계산하는 함수다.
계산은 -(y log(a) - (1-y) log(1-a)) 를 한다. - dA1,dW2,db2 = linear_activation_backward(dA2,cache2,’sigmoid’)
dA0, dW1, db1 = linear_activation_backward(dA1,cache1,’relu’)
backpropagation을 수행하는 함수다.
A2부터 시작하여 A0까지 역으로 연산을 수행하야 하므로 숫자에 유의한다.
입력으로 준 dA2 -> dA1이 되고, cache2에 저장된 W,b를 미분한 dW2,db2가 반환되는 것을 확인할 수 있다. - parameters = update_parameters(parameters,grads,learning_rate)
사용된 매개변수들, 미분값들, 학습률을 매개변수로 입력하여 업데이트를 진행할 수 있다.
예를 들어 W = W - learning rate * dW 와 같이 계산한다.
def initialize_parameters_deep(layers_dims):
...
return parameters
def L_model_forward(X, parameters):
...
return AL, caches
def compute_cost(AL, Y):
...
return cost
def L_model_backward(AL, Y, caches):
...
return grads
def update_parameters(parameters, grads, learning_rate):
...
return parameters
- parameters = initialize_parameters_deep(layers_dims)
파라미터를 초기화하는 방식은 동일하다.
단, deep NN 에서는 layer 개수가 많으므로 리스트 형태로 각 layer의 차원수를 입력해준다. - AL, caches = L_model_forward(X, parameters)
여기서 독특한 점은 입력 X의 차원을 미리 조정하지 않아도 된다는 것이다.
원래는 flatten을 통하여 (features, examples) 형태로 변형했는데 그대로 입력해준다. - cost = compute_cost(AL, Y)
cost 정의도 간단하게 할 수 있다.
마지막으로 logit으로 구한 AL과 Y로 cost를 정의한다. - grads = L_model_backward(AL, Y, caches)
미분값은 시작값 AL, 정답레이블 Y, 필요한 변수들 caches를 입력하여 구할 수 있다. - parameters = update_parameters(parameters, grads, learning_rate)
지금까지의 변수의 값, 미분값, 학습률을 이용하여 기존 파라미터들을 업데이트 한다(W,b)
출처: Coursera, Neural Networks and Deep Learning, DeepLearning.AI
'Neural Networks and Deep Learning > 4주차' 카테고리의 다른 글
Deep Neural Network(3) (1) | 2022.10.15 |
---|---|
Deep Neural Network(2) (1) | 2022.10.15 |
Deep Neural Network(1) (1) | 2022.10.15 |