*** 교수님의 주의사항 ***
만약 coursera 수강생이라면,
프로그래밍 과제는 최대한 스스로의 힘으로 해보고, 도저히 막히는 부분이나 이해가 가지 않은 부분만을
남의 도움을 받기를 추천한다고 합니다.
저번 글에 이어서, 바로 4-3부터 진행하겠습니다.
저번 4-2에서는 매개변수를 초기화해주었으니,
이제 순정파 과정을 통해서 예측치를 구하고, 이를 이용하여 손실을 계산해야 합니다.
forward_propagation () 함수에서 구현할 방정식들 :
- 𝑍[1] = 𝑊[1]𝑋 + 𝑏[1](1)
- 𝐴[1] = tanh(𝑍[1])(2)
- 𝑍[2] = 𝑊[2]𝐴[1] + 𝑏[2](3)
- 𝑌-hat = 𝐴[2] = 𝜎(𝑍[2])(4)
사용해야 할 것 :
1번 : sigmoid() , tanh() 함수를 사용해야 합니다.
2번: parameters [" "] 코드를 사용하여,
initialize_parameters()의 출력인 "parameters의 딕셔너리"에서 각 매개변수를 검색 후 ,
𝑍[1], 𝐴[1] , 𝑍[2] , 𝐴[2](훈련 세트의 모든 예제에 대한 모든 예측의 벡터)를 계산해야 합니다.
-----------> 순전파 함수를 코드로 프로그래밍해봅시다.
문제에서 알려준 대로,
매개변수 W1 , b1 , W2 , b2는 4-2 과정에서 저장해 준 변수 parameters의 딕셔너리에서 가져옵니다.
그리고, 위에 나와있는 Z1 , A1 , Z2 , A2에 대한 계산식을 보고, 그대로 코드로 정의해 주면 됩니다.
주의* -->
W1 * X는 단순 곱이 아니라, 행렬의 곱이므로 np.dot을 사용해서 연산해야 합니다.
예측치를 뜻하는 A2를 구했으니, 이제 예측치를 통해서 손실과 비용을 구해봅시다.
--> 손실은 단일 트레이닝 예시에 대한 오차, 비용은 전체 트레이닝 예시에 대한 오차를 뜻합니다.
4.4 - compute the cost (손실 계산)
지침서(설명서):
교차 엔트로피 손실을 구현하는 방법에는 여러 가지가 있습니다.
이것은 for 루프 없이 방정식의 한 부분을 구현하는 한 가지 방법입니다.
logprobs = np.multiply(np.log(A2), Y)
cost = np.sum(logprobs)
이를 사용하여 비용 함수의 전체 표현식을 작성하십시오.
np.multiply() 다음 np.sum() 또는 직접 np.dot()를 사용할 수 있습니다.
np.multiply 다음에 np.sum을 사용하면 최종 결과는 float 유형이 되는 반면,
np.dot를 사용하면 결과는 2D numpy 배열이 됩니다.
np.squeeze()를 사용하여 중복 차원을 제거할 수 있습니다.
float()를 사용하여 배열을 float 유형으로 캐스팅할 수도 있습니다.
---> 손실을 계산하는 함수를 프로그래밍해봅시다.(여기서 함수는 수학적 의미가 아닌, 파이썬 함수)
Logprods는 개별 트레이닝 예시에 대한 손실을 뜻하고,
cost는 전체 트레이닝 예시에 대한 손실의 합, 즉 비용을 뜻합니다.
logprods와cost 모두 지침서에서 지시한 대로 코드를 진행하면 됩니다.
비용을 구했으니, 비용을 이용하는 역전파 과정을 통해서 도함수 값을 구합시다.
*참고 : (경사 하강법을 사용하기 위해) 도함수 값을 구하고, 매개변수 업데이트를 함
*주의 -----> np.dot과 np.multifly의 차이점
np.dot은 행렬의 곱을 뜻하지만, np.multifly는 행렬의 요소 곱을 의미합니다.
--> 요소 곱게 대해서는 아래의 링크를 참고하세요!
https://www.journaldev.com/32966/numpy-matrix-multiplication
4.5 - Implement Backprogation ( 역전파 계산 )
매개변수를 수정하기 위해서 필요한 도함수 값을 "역전파 과정"으로 구해봅시다.
Backward_propagation() 함수를 구현합니다.
지침서(설명서) :
역전 파는 일반적으로 딥 러닝에서 가장 어려운(가장 수학적인) 부분입니다.
도움을 드리기 위해 다시 역전파에 대한 강의 슬라이드를 제공해 드리겠습니다.
벡터화된 구현을 구축 중이므로, 이 슬라이드의 오른쪽에 있는 6개의 방정식을 구현하세요.
힌트 :
dZ1을 계산하려면 𝑔[1]′(𝑍[1]) 을 계산해야 합니다.
𝑔[1]() 은 tanh 활성화 함수이므로, 𝑎=𝑔[1](𝑧) 이면 𝑔[1]′(𝑧)=1−𝑎2입니다.
따라서, (1 - np.power(A1, 2))를 사용하여 𝑔[1]′(𝑍[1])을 계산할 수 있습니다.
-------> 역전파 계산 함수 구현하기
저번과 마찬가지로,
W1과 W2는 parameters 딕셔너리에서A1과 A2는 cache 딕셔너리에서 꺼내와 줍니다.
그 후, db, dz, dw는 지침서에서 지시한 대로 코딩해 주면 됩니다.
np.power()는 행렬에서 제곱을 수행해 주고, keepdims는 계산 과정에서 행렬의 형태를 유지시켜줍니다.
axis의 개념에 대해서는 복잡하기에, 아래의 링크를 참고 주세요!
이제 역전파 계산을 했으니, 이를 통해서 매개변수를 수정해 봅시다.
4.6 - Update Parameters (매개변수 업데이트) + 연습문제 7번
경사 하강법을 이용하여, 매개변수를 업데이트하겠습니다.
(W1, b1, W2, b2)를 업데이트하기 위해서, (dW1, db1, dW2, db2)를 사용합니다.
일반 경사 하강법: θ = θ − α * (dj/d θ) 여기서 𝛼은 학습률이고 𝜃는 매개변수를 나타냅니다.
그림 1은 좋은 예시이고, 그림 2는 학습률을 너무 높게 해서 학습이 오래 걸리는 안 좋은 예시입니다.
함수에 매개변수로 전달되는 목록이나 사전을 복사할 때 copy.deepcopy(...)를 사용하세요.
---> 입력 매개변수 (parameters, grads, Learning_rate =1.2)가 수정되는 걸 방지해 줍니다.
일부의 상황에 이에서는 이것이 비효율적일 수 있지만, 과제 채점 목적으로 필요합니다.
------> 매개변수 업데이트 프로그래밍으로 구현하기
W1 , W2 , b1 , b2는 이전과 마찬가지로 parameters 딕셔너리에서 가져오되,
copy.deepcopy(...) 코드를 사용하여 가져옵시다.
grads는 매개변수로 사용되지 않으므로, 그냥 가져오면 됩니다.
이제 θ = θ − α * (dj/d θ)을 각 문자에 맞게 코딩하여 작성해 주면 완성입니다.
---> W1 = W1 - dW1 * learning_rate
b1 = b1 - db1 * learning_rate
W2 = W2 - dW2 * learning_rate
b2 = b2 - db2 * learning_rate
이제 구현해 준 함수들을 불러와 모두 합쳐주면 끝입니다.
글이 너무 길어져서, 여기에서 한번 끊고 다음 글에서 이어서 진행하겠습니다!
4-6까지 오늘 진행하였고, 4-7부터 다음 글에서 진행하겠습니다.
이 내용들은 모두 coursera에서 앤드루 응 교수님의 강의를 요약정리 및 쉽게 재 풀이하여 적은 글이며,
내용에는 생략되거나 변형된 부분이 많으니 직접 강의를 들어보시는 걸 추천드립니다!
이 글은 상업적 목적이 아닌, 한국에서 인공지능을 배우고 싶은 분들을 위해 적은 교육적 목적에서 작성하였습니다.
'코세라 앤드류 응 AI 강의 리뷰' 카테고리의 다른 글
[인공지능 강의 리뷰] 22 - 딥러닝에서 행렬의 크기 알아보기(Getting your matrix dimensions right) (0) | 2022.06.01 |
---|---|
[인공지능 강의 리뷰] 21 - L층의 뉴럴 네크워크(Deep L-layer Neural Networks) (0) | 2022.05.31 |
[인공지능 강의 리뷰] 20 - 하나의 숨겨진 레이어를 사용한 평면 데이터 분류. 프로그래밍 과제 (0) | 2022.05.19 |
[인공지능 강의 리뷰] 18 - 하나의 숨겨진 레이어를 사용한 평면 데이터 분류. 프로그래밍 과제 (2) | 2022.05.17 |
[인공지능 강의 리뷰] 17 - 총정리 퀴즈. 얕은 신경망(Shallow Neural Network) (0) | 2022.05.17 |
[인공지능 강의 리뷰] 16 - 왜 활성화 함수에 비선형 함수를 써야할까? (0) | 2022.05.17 |
[인공지능 강의 리뷰] 15 - 뉴럴 네트워크 And 벡터화 표현 (0) | 2022.05.17 |