본문 바로가기
Music AI/Deep Learning

[Deep Learning] 03 로지스틱 회귀의 벡터화 | W3 파이썬과 벡터화 | C1 신경망과 딥러닝 | Andrew Ng

by 2den 2025. 11. 7.
728x90
반응형

https://youtu.be/okpqeEUdEkY?si=xAs1CF9793uYAUrQ

 

벡터화가 코드 속도를 어떻게 높여주는지 얘기해봤습니다. 이 영상에선 로지스틱 회귀를 벡터화하여 전체 훈련 세트에 대한 경사 하강법의 한 반복문에서 for 문을 하나도 쓰지 않고 구현하는지 알아 보겠습니다. for 문이 하나도 없는 신경망을 소개하려니 매우 신나네요. 시작하죠.

 

일단 정방향 전파부터 살펴보죠. $m$개의 훈련 샘플이 있을 때 처음 샘플을 예측 하려면 이것을 계산해야 합니다 : $z^{(1)}=w^Tx^{(1)}+b$, $a^{(1)} =\sigma(z^{(1)})$. 익숙한 이 공식으로 $z$를 계산하고 활성값 $a$, $\hat{y}$도 계산해야 합니다. 두 번째 훈련 샘플을 예측하려면 이 값을 계산해야 하죠 : $z^{(2)}=w^Tx^{(2)}+b$, $a^{(2)} =\sigma(z^{(2)})$. 세 번째를 예측하기 위해서는 이 값을 계산해야 합니다 : $z^{(3)}=w^Tx^{(3)}+b$, $a^{(3)} =\sigma(z^{(3)})$. $m$개의 훈련 샘플이 있다면 이것을 $m$번 해야 합니다. 정방향 전파 단계를 실행하기 위해선, 그러니까 $m$개의 훈련 샘플에 대해 이 예측값을 계산하는데 for 문 없이 계산하는 방법이 있습니다. 어떻게 하는지 살펴봅시다.

 

$X = \begin{bmatrix} \vert & \vert && \vert \\ x^{(1)} & x^{(2)} & \dots & x^{(m)} \\ \vert & \vert && \vert \end{bmatrix}$

 

$X$는 훈련 입력을 열로 쌓은 행렬이란 걸 기억합시다. 이렇게 행렬이 있죠. $n_x$ X $m$ 행렬이죠. 파이썬 NumPy 방식으로 썼습니다 : (n_x, m) $X$가 $\mathbb{R}^{n_x\times m}$ 행렬이라는 것이죠. 먼저 보여주고 싶은 것은 $z^{(1)}$, $z^{(2)}$, $z^{(3)}$ 등을 한 단계 혹은 한 줄의 코드로 계산하는 법입니다.

 

$Z=\begin{bmatrix}z^{(1)}&z^{(2)}&\dots&z^{(m)}\end{bmatrix} = w^TX+\begin{bmatrix}b&b&\dots&b\end{bmatrix}$

 

행벡터이기도 한 1X$m$ 행렬을 먼저 만들죠. 여기에 $z^{(1)}$, $z^{(2)}$에서 $z^{(m)}$까지 동시에 계산할 것입니다. 이건 $w^TX$와 $b$로 이루어진 벡터의 합으로 표현될 수 있습니다. $b$로 이루어진 이것은 1X$m$ 벡터 혹은 1X$m$ 행렬입니다. $m$차원 행벡터이죠.

 

$w^TX+\begin{bmatrix}b&b&\dots&b\end{bmatrix} = \begin{bmatrix}w^Tx^{(1)}+b&w^Tx^{(2)}+b&\dots&w^Tx^{(m)}+b\end{bmatrix}$

 

여러분이 행렬 곱셈에 익숙하다면 w^T에 x^(1), x^(2)부터 x^(m)로 이루어진 행렬을 곱하면 ($w^T$는 행벡터입니다.), 첫 항은 $w^Tx^{(1)}$이 되고 두 번째 항은 $w^Tx^{(2)}$이 되고 $w^Tx^{(m)}$까지 이어진다는 것을 알 수 있습니다. $b$로 이루어진 행벡터를 더하면 각 요소에 $b$를 더하게 됩니다. 결국엔 1X$m$ 벡터를 얻게 되죠. 첫 요소와 두 번째 요소부터 $m$번째 요소까지 적혀있습니다. 위의 정의를 살펴보면 첫 번째 요소는 $z^{(1)}$의 정의와 일치하고 두 번째 요소는 $z^{(2)}$의 정의와 일치한다는 걸 알 수 있습니다 $X$가 훈련 샘플을 가로로 쌓은 결과인 것처럼 대문자 $Z$를 소문자 $z$들을 가로로 쌓은 것이라고 정의하겠습니다. 소문자 $z$ 변수를 가로로 쌓으면 대문자 $Z$를 얻습니다.

 

이 값을 계산하는 NumPy 명령어는 Z = np.dot(w.T, X) + b입니다. 파이썬에서 미묘한 점은 b는 하나의 수입니다. (1, 1) 행렬이라고도 할 수 있는 실수이죠. 이 벡터와 이 실수를 더한다면 파이썬은 실수 b를 자동으로 (1, m) 행벡터로 바꿔줍니다. 이 이상한 연산은 파이썬에서 브로드캐스팅이라고 불립니다. 지금은 걱정하시지 않아도 되고 다음 영상에서 더 자세히 다루겠습니다. 여기서 얻어갈 점은 이 한 줄의 코드로 $Z$를 계산할 수 있다는 것입니다. 대문자 $Z$는 소문자 $z^{(1)}$부터 $z^{(m)}$까지를 포함하는 1X$m$ 행렬이 됩니다.

 

$Z$는 저렇게 계산했지만 $a$는 어떻게 할까요? 다음에 찾고 싶은 건 $a^{(1)}$부터 $a^{(m)}$을 동시에 계산하는 방법입니다.

 

$A=\begin{bmatrix}a^{(1)}&a^{(2)}&\dots&a^{(m)}\end{bmatrix}=\sigma(Z)$

 

소문자 $a$를 가로로 쌓아 대문자 $A$라는 새로운 변수를 정의하겠습니다. 프로그래밍 과제에서 벡터 값을 가지는 시그모이드 함수를 구현하여 함수가 이 대문자 $Z$를 입력으로 받고 효율적으로 대문자 $A$를 반환하는 걸 보겠습니다. 자세한 내용은 프로그래밍 과제에서 보게 될 것입니다.

 

복습하자면 이 슬라이드에서 볼 수 있듯이 소문자 $z$와 $a$를 하나씩 계산하기 위해 $m$개의 훈련 샘플을 순환하는 대신 이 한 줄의 코드로 모든 $z$를 동시에 계산하고 적절한 $\sigma$의 구현으로 한 줄의 코드로 모든 $a$를 동시에 계산할 수 있습니다. 이렇게 모든 $m$개의 훈련 샘플을 동시에 정방향 전파하는 벡터화된 구현을 할 수 있습니다. 요약하자면 벡터화를 통해 소문자 $a$로 표현되는 활성값을 동시에 효율적으로 계산하는 방법을 보았습니다. 벡터화를 통해 역방향 전파의 도함수도 효율적으로 구할 수 있습니다. 다음 영상에서 더 살펴보죠.

 

Coursera

 

728x90
반응형

댓글