코세라 앤드류 응 AI 강의 리뷰

[인공지능 강의 리뷰] 28 - 프로그래밍 과제. 심층 신경망 구축하기 2편

파요요요 2022. 7. 29. 20:34

 

지난번 글에서는 1 ,2 ,3 과정을 배웠으니, 이번 글에서는 이어서 4,5,6 과정을 배워보겠습니다


 

4. 순정파 과정 ( 과제 2단계 )

순전파 단계 - deeplearning.Ai

저희는 목차 3에서 매개변수를 초기화했으니, 이제 본격적으로 순전파 단계를 수행할 수 있게 됐습니다.

아래의 1~3 단계 순서로 코딩을 진행하시면 됩니다.

 

1단계 : Linear

---> 각각의 퍼셉트론마다 들어온 입력값들을 총합하는 과정입니다.

2단계 : Linear --> Activation

-----> 총합한 값을 활성화 함수에 입력하는 과정, 활성화 함수는 Relu or sigmoid

3단계 : [Linear -> Relu] * (L-1) --> Linear --> sigmoid

---> 직전 층의 퍼셉트론에서 계산된 각각의 활성화 함수의 값들을 다음 층의 입력값으로 보내는 과정


 

코딩 연습 3 - linear_forward 1단계

순방향 전파의 선형 부분을 만듭니다.

지침 :

선형 과정(Linear)의 수적 표현은 𝑍[𝑙]=𝑊[𝑙]𝐴[𝑙−1]+𝑏[𝑙] 입니다.

여기서 사용된 곱셈은 단순 곱셈이 아니라, 행렬의 곱셈이므로 np.dot()  사용해야 합니다.

 

 

저번 주와 마찬가지로, 아래의 빈칸에 알맞은 코드를 작성해야 합니다.

 

 

음... 일단 지침을 참고해 보겠습니다.

 

 

지침에 답이 명확하게 나와있어서 딱히 설명할 필요가 없을 것 같습니다. 이대로 작성해 줍시다.

 

 

코드를 작성 후 실행하여 정답인지 확인해 봅시다.

 

 

정답이네요! 이제 1단계를 마쳤으니, 2단계로 넘어 어가 봅시다,

 

참고))  np.dot()에 대해서 모르시는 분들 위해서 간략하게 설명드리겠습니다.

np란, 행렬의 계산을 도와주는 파이썬 라이브러리 numpy의 약자입니다. 저희가 밥을 지을 때 밥솥의 도움을 받아서 쉽게 밥을 짓는 것처럼, 사람이 파이썬 코딩을 할 때 numpuy의 도움을 받아서 손쉽게 코딩을 진행할 수 있는 것이죠

np.dot()은 np.dot(A, B)의 형태로 사용하며, A와 B 간의 행렬 곱을 진행해 주는 코드입니다.

 


4-2 순전파 과정 - 선형 계산

 

이번 과제 만들 모델에서는 2가지 활성화 함수를 사용할 것입니다.

 

1. sigmoid 함수 = 𝜎(𝑍) = 𝜎(𝑊𝐴+𝑏) = 1/ { 1 + e ( WA+b) }

활성화 값 "a"와 "Z"를 포함하는 "cahce"의 두 항목을 반환하는 시그모이드 함수가 제공되었습니다. 다음을 호출하여 sigmoid 함수를 사용하면 됩니다.

A, activation_cache = sigmoid(Z)

2. ReLU 함수 = A = RELU(Z) =max(0, Z)

활성화 값 "A"와 "Z"를 포함하는 "cahce"의 두 항목을 반환하는 Relu 함수가 제공되었습니다. 다음을 호출하여 sigmoid 함수를 사용하면 됩니다

A, activation_cache = relu(Z)

 

 

편의를 위해 두 가지 기능(선형 및 활성화)을 하나의 기능(LINEAR->ACTIVATION)으로 그룹화합니다.

즉, LINEAR 단계를 먼저 수행한 다음 ACTIVATION 단계를 수행합시다.

 

코딩 연습 4 - linear_activation_forward 2단계

LINEAR->ACTIVATION 레이어의 순방향 전파를 구현합니다. 수학적 단계는 다음과 같습니다.

𝐴[𝑙] = 𝑔(𝑍[𝑙]) = 𝑔(𝑊[𝑙]𝐴[𝑙−1]+ 𝑏[𝑙])

 

 

저번과 마찬가지로 #your code stars hear 부분에 코드를 작성하면 됩니다.

총 2군데의 빈칸이 존재하는데, 일단 sigmoid 부분부터 채워보겠습니다.

 

 

이 부분을 채워야 합니다. 일단 지침에서 지시한 대로 Linear 단계부터 진행해보겠습니다.

 

 

Lnear 부분은, 바로 직전에 만들어준 linear_forward를 불러서 위 줄의 코드를 작성하면 될 것 같고,

 

 

과제의 지침에서 sigmoid 함수를 제공해 주었으므로, 아래 줄의 코드는 이것을 호출 주면 될 것 같습니다!

 

 

이렇게 코드를 작성해 주면 완성입니다.

아래의 relu 부분도 같은 원리로 구성되므로, 마찬가지로 작성해 줍시다.

sigmoid --> relu로 바꿔서 작성해 주면 됩니다.

 

 

이렇게 코드를 작성하고, 실행해 보겠습니다.

 

 

성공입니다! 이제 3단계로 넘어갑시다!

 

 

𝐿 -층의 신경망을 구현할 때는 편의성을 위해 이전 함수(RELU가 있는 linear_activation_forward) 𝐿−1번을 복제한 다음,

SIGMOID가 있는 하나의 linear_activation_forward로 뒤따르도록 파이썬 함수를 작성합니다.

 

위의 그림에서 보라색으로 강조된 부분을 참고하세요!

신경망의 층층마다 하나씩 하나씩 복사하는 건 너무 비효율적이기 때문에, L-1번 복사하는 방식으로 진행합니다.

 

코딩 연습 5 - L 층에서의 순정파 3단계

위의 모델에서의 순정파 과정을 구현할 것입니다.

 

지침 :

1. 아래 코드에서, 변수 AL 𝐴[𝐿]=𝜎(𝑍[𝐿])=𝜎(𝑊[𝐿]𝐴[𝐿−1]+𝑏[𝐿]) 를 나타냅니다

2. 이전에 작성한 파이썬 함수를 사용하세요

----> 코딩으로 만든 기능 하나하나를 "함수"라고 부릅니다. 수학에서의 "함수"와는 다른 개념입니다.

3. for 루프를 사용하여 [LINEAR->RELU](L-1) 번 복제하기

4. "caches " 목록을 추적하는 것을 잊지 마십시오. 목록에 새 값 c를 추가하려면 list.append(c)를 사용할 수 있습니다.

----> 역전파 과정에서 Z [l] 값을 사용하기 위해서, 순정파 과정에서 계산한 값들을 cache라는 변수에 값을 넣어 기억한다고 언급했습니다.

 

 

이번에도 채워줘야 할 부분은 2 부분입니다.

그런데 이번에는, 단순히 힌트만 바라보고 풀기에는 너무 복잡한 구조로 이뤄져 있네요.

전체적인 구성을 간략하게 이해하고 넘어가야 코드를 작성할 수 있을 것 같습니다.

 

저희는 for 구문을 통해서 1~L-1 층까지 반복시키고, L-1~ L 층 부분은 따로 빼내어 코딩할 것입니다.

1 ~ L -1 부분은 위 빈칸이 되고. L-1 ~ L 부분은 아래 빈칸이 되는 것이죠.

 

여기서 알아야 할 부분 1~L-1 층 구간에서 사용되는 활성화 함수는 Relu 함수라는 점과,

L-1 ~ L 층에서 사용되는 활성화 함수는 sigmoid 함수라는 점을 꼭 숙지해야 하고 넘어가야 합니다.

대략적인 구성을 알았다면, 이제 지침을 살펴보며 실마리를 찾아보도록 하겠습니다.

 

 

이전에 작성한 파이썬 함수를 사용하라는 이야기는 바로 직전에 만들었던 파이썬 함수를 사용하라는 이야기이고,

 

 

caches 목록을 추적하는 것을 잊지 말라는 이야기는 신경망의 층층마다 구해준 값들을 list.append(c) 사용하여, caches 목록에 차곡차곡 넣어주라는 의미입니다.

이 두 가지 힌트를 참고하여, 코드를 작성하면 아래의 형태입니다.

 

 


 

아! 여기서 헷갈리는 부분을 짚고 넘어가자면,

l은 L 층을 의미하는 게 아니라 , for 구문에서 대문자 i를 의미합니다

 


다시 본론으로 돌아가겠습니다.

아래의 빈칸 부분은 위의 코드에서 relu --> sigmoid로 바꿔주고,

for 구문을 이제 탈출했기 때문에 I --> L로만 바꿔주면 됩니다.

 

 

이렇게 코드를 작성하고, 실행하면 완성입니다!

 

 

저희는 "입력 X를 사용하고 예측치를 뜻하는 𝐴[𝐿]를 출력하는 완전한 순방향 전파"를 구현했고,

"caches"에 모든 중간 값을 기록하여 역전파 과정에서 이용할 수 있게 됐습니다.

또한, 𝐴[𝐿]를 사용하여 손실을 계산할 수 있게 되었습니다!

 

A [L]은 정답 Y에 대한 딥러닝 모델의 예상치 Y-hat을 의미합니다.

다시 말해, (정답-예상치) 값을 의미하는 "손실"을 통하여, 오차를 최소화하는 역전파 과정을 진행할 수 있게 되었다는 이야기입니다.
 

 

이제 순정파 과정을 마쳤으니, 다음 과정인 "손실 계산 과정"을 구현해 봅시다.

 

그런데 글을 작성하다 보니까 분량이 너무 길어져서, 여기서 한 번 더 끊어야 할 것 같습니다....

다음 글에서 나머지 부분을 진행하고, 최종적으로 만든 딥러닝 모델의 성능을 테스트해 봅시다!

 


위 글은, 교육적 목적으로 코스라 딥러닝 강좌의 프로그래밍 과제의 내용을 쉽게 풀이한 글입니다.

혹시 글의 내용이 맘에 드셨다면, 댓글이나 공감 부탁드립니다...! 많은 도움 됩니다!

---> 내용에 관한 궁금증, 글에 대한 피드백이나 아쉬운 점, 개인적인 궁금증 등등... 다 환영합니다!

 

 

반응형