본문 바로가기
Music AI/Deep Learning

[Deep Learning] 10 m개 샘플의 경사하강법 | W2 신경망과 로지스틱 회귀 | C1 신경망과 딥러닝 | Andrew Ng

by 2den 2025. 8. 26.
728x90
반응형

https://youtu.be/KKfZLXcF-aE?si=E2lLsQBXvUPnCNyO

 

지난 동영상에서는 도함수를 계산해 단일 샘플에 대한 로지스틱 회귀의 경사 하강법을 구현해 보았습니다. 이제 이를 $m$개의 훈련 샘플에 대해서 해 보려고 합니다.

 

$\mathcal{J}(w,b)=\frac{1}{m}\sum^m_{i=1}\mathcal{L}(a^{(i)},y)$

 

그 시작으로 비용 함수 $\mathcal{J}$의 정의를 다시 살펴봅시다. $w$, $b$에 대한 비용 함수는 다음과 같이 평균 값입니다. $\frac{1}{m}$에 $i = 1$부터 $m$까지 샘플 $y$에 대한 출력값 $a^{(i)}$의 손실의 합을 곱한 것이죠.

 

$a^{(i)}=\hat{y}^{(i)}=\sigma(z^{(i)})=\sigma(w^Tx^{(i)}+b)$

 

$a^{(i)}$는 $i$번째 샘플의 예측값을 나타내고 $σ(z^{(i)})$와 같습니다. 이는 다시 $\sigma(w^Tx^{(i)} + b)$와 같습니다.

 

지난 강의에서는 아무 단일 샘플에 대해 도함수를 계산하는 방법을 보았습니다. 훈련 샘플이 하나일 때 말이죠. $dw_1^{(i)}$, $dw_2^{(i)}$, $db^{(i)}$는 이제 $i$를 사용해 전 강의에서처럼 계산했을 때 각각 해당하는 값을 나타냅니다. 단일 훈련 샘플 $(x^{(i)}, y^{(i)})$를 사용했을 때 말입니다.

 

$\frac{\partial}{\partial w_1}\mathcal{J}(w,b)=\frac{1}{m}\sum^m_{i=1}\frac{\partial}{\partial w_1}\mathcal{L}(a^{(i)},y^{(i)})$

 

식을 보면 $\frac{1}{m}$이 있으니 비용 함수는 각 손실의 평균이라 할 수 있습니다.그래서 계산해 보면 $w_1$에 대한 전체 비용 함수의 도함수도 $w_1$에 대한 각 손실 항 도함수의 평균입니다. 그리고 이 항을 계산하는 방법은 이미 보았습니다. 지난 예제에서 단일 샘플에 대해 $dw_1^{(i)}$를 계산했었습니다. 그래서 지난 예제에서처럼 단일 훈련 샘플의 도함수를 구해 그 평균을 구하면 경사 하강법에 사용할 전체적인 경사를 구할 수 있습니다.

 

많은 정보가 주어졌는데 정리해서 알고리즘을 만들어 봅시다. 경사 하강법을 사용한 로지스틱 회귀를 구현하는 방법을 알아보는 것이죠. 다음과 같이 해 볼 수 있습니다.

 

$\mathcal{J} = 0$, $dw_1 = 0$, $dw_2 = 0$, $db = 0$

이라고 초기화 해 봅시다. 그리고 훈련 세트를 반복해 각 훈련 샘플에 대한 도함수를 계산하고 이를 더합니다.

 

For i=0 to m

$i = 1$에서 훈련 샘플의 개수 $m$까지인 for문에서

$z^{(i)} = w^Tx^{(i)} + b$

와 예측값

$a^{(i)} = σ(z^{(i)})$

를 계산하고 $\mathcal{J}$에 더해 줍니다.

$\mathcal{J} += -[y^{(i)} \log a^{(i)} + (1 - y^{(i)}) \log(1 - a^{(i)})]$

입니다. 그리고 전에 보았듯이

$dz^{(i)} = a^{(i)} - y^{(i)}$

이고

$dw_1 += x_1^{(i)} dz^{(i)}$

$dw_2 += x_2^{(i)} dz^{(i)}$

입니다.

 

지금 계산은 특성이 두 개, $n = 2$라고 가정하고 한 것입니다. 아니라면 $dw_1$, $dw_2$, $dw_3$ 등으로 더 계산해야겠죠. for 문은 이렇게 끝납니다. 평균을 계산하는 것이기 때문에 $m$으로 나누어야 합니다.

 

$dw_1 /= m$ ; $dw_2 /= m$, $db /= m$

으로 평균을 계산합니다. 각 매개변수 $w_1$, $w_2$, $b$에 대한 비용 함수 $\mathcal{J}$의 도함수를 계산하였는데, 몇 가지 짚고 넘어가자면 $dw_1$, $dw_2$, $db$는 값을 저장하는 데 쓰고 있습니다. 따라서 계산을 다 하고 나면 $dw_1$은 $w$에 대한 전체 비용 함수의 도함수와 같습니다. $dw_2$와 $db$의 경우도 마찬가지입니다. $dw_1$과 $dw_2$는 첨자 $i$가 없는데 훈련 세트 전체를 합한 값을 저장하고 있기 때문입니다. 비교해보면 $dz^{(i)}$는 훈련 샘플 하나의 $dz$라서 계산하고 있는 훈련 샘플 하나를 나타내기 위해 첨자를 사용합니다.

 

이 모든 계산을 끝냈고 경사 하강법의 한 단계를 구현하려면

w_1 := w_1 - (alpha)dw_1, w_2 := w_2 - (alpha)dw_2, b := b - (alpha)db

라고 구현하면 됩니다. 여기서 $dw_1$, $dw_2$, $db$는 방금 계산한 값을 씁니다. 그리고 여기 $\mathcal{J}$도 정확한 비용 함수의 값입니다. 여기 있는 슬라이드는 모두 경사 하강법 한 단계에 사용되는 것인데, 경사 하강법을 여러 번 진행하려면 이것을 계속 반복해야 합니다. 이것들이 너무 복잡하다고 느껴져도 아직은 크게 걱정할 필요 없습니다. 프로그래밍 숙제를 하다 보면 더 명확해질 겁니다.

 

그런데 이런 방식으로 구현한 계산 방식에는 두 가지 약점이 있습니다. 이렇게 로지스틱 회귀를 구현하려면 for 문을 두 개 만들어야 합니다. 첫 번째 for 문은 $m$개의 훈련 샘플을 반복하고, 두 번째 for 문은 여기처럼 특성을 반복합니다. 여기는 $n = 2$, 특성이 두 개뿐이지만 특성이 더 많다면 $dw_1$, $dw_2$도 있고 $dw_3$도 같은 방식으로 계산해 $dw_n$까지 있을 것이기 때문에 $n$개의 특성을 반복하는 for 문이 필요합니다.

 

딥러닝 알고리즘을 구현할 때 코드에서 이런 명시적인 for 문은 알고리즘을 비효율적으로 만듭니다. 딥러닝의 전성기에 접어들면서 데이터 집합이 점점 더 커졌기 때문에 코드를 명시적인 for 문 없이 구현하는 것이 중요해졌습니다. 그렇게 해야 더 큰 데이터 집합도 처리할 수 있죠. 그러한 방법 중 벡터화라는 것이 있습니다. 명시적인 for 문을 제거할 수 있게 해줍니다. 딥러닝이 뜨기 전에는 벡터화는 있으면 좋은 것일 뿐이었습니다. 속도 향상을 위해 가끔 쓸 때도 있고 안 쓸 때도 있었죠. 하지만 딥러닝의 시대에 들어와서는 이런 for 문을 없애주는 벡터화가 아주 중요해졌습니다. 아주 큰 데이터 집합을 사용하기 때문에 코드를 효율적으로 만드는 것이 아주 중요하기 때문입니다.

 

다음 동영상들에서는 벡터화와 이 모든 것을 for 문 하나 없이 구현하는 법을 살펴보겠습니다. 로지스틱 회귀의 경사 하강법 구현 방법이 이해되었으면 합니다. 프로그래밍을 해 보면 더 확실해질 것입니다. 프로그래밍을 해 보기 전에 먼저 벡터화에 대해 이야기 해 봅시다. 경사 하강법의 완전한 한 단계를 for 문을 사용하지 않고 구현할 수 있게 될 겁니다.

 

Coursera

 

728x90
반응형

댓글