강의 목차
- 신경망으로서의 로지스틱 회귀
- 파이썬과 벡터화
1. 신경망으로서의 로지스틱 회귀
신경망을 구현할 때 중요한 몇 가지 기술
- m개의 훈련 예제를 가진 훈련 세트가 있을 때 훈련 예제에 대해 for문을 돌리며 하나씩 훈련 세트를 처리해 왔을 것
하지만 신경망을 구현할 때 전체 훈련 세트를 for문 없이 처리해야함 - 순전파, 역전파
로지스틱 회귀
: 이진 분류를 위한 알고리즘
비용 함수
손실 함수(loss function)는 학습 모델(머신러닝 등)의 예측값(ŷ)이 실젯값(y)과의 차이 정도를 수치로 나타내는 함수
비용 함수(cost function)는 모든 입력에 대해 계산한 손실 함수의 평균값으로 계산
수식으로 나타내면 이렇습니다.
또한 로지스틱 회귀는 아주 작은 신경망으로도 볼 수 있다고 합니다.
경사하강법
: J(w, b)가 최솟값을 가질 수 있도록 w, b를 찾아내는 방법
경사 하강법을 하기 위해선 비용 함수 형태가 볼록해야 합니다. 임의의 점을 시작으로 함수의 기울기를 따라 비용 함수의 최솟점을 찾아가는 과정을 진행합니다.
도함수가 0보다 클 때: w는 기존의 w보다 작은 방향으로 이동
도함수가 0보다 작을 때: w는 기존의 w보다 큰 방향으로 이동
미적분과 도함수
a = 2 -> f(a) = 4
a = 2.001 -> f(a) = 4.004
a가 2일 때 기울기 : 4
알아야 할 것
그 기울기는 함수가 위치하고 있는 지점에 따라 값이 달라질 수 있다는 점
함수의 기울기를 의미
왼쪽에서 오른쪽(파란 화살표) : J(최소화하려고 하는 비용 함수)값을 계산
오른쪽에서 왼쪽(빨간 화살표) : 도함수 계산
a가 v에 영향을 주면 변화된 v값은 J에도 영향을 줍니다.
a의 값을 약간 변경하면 J가 변하는 양은 $\frac{dv}{da}$(a를 변화시킬때 변하는 v의 양) x $\frac{dJ}{dv}$ (v값이 변할때 변하는 J의 양)입니다.
미적분에서는 이것을 연쇄법칙이라 합니다.
로지스틱 회귀 기울기 경사법
목적: L 함수의 손실을 줄이기 위해 매개변수 w, b를 수정해야 합니다.
dz = a - y
훈련 데이터셋이 m개
$\frac{dL}{dz} = a - y$ 인 이유
J = - { y - ln($\sigma(z)$) + (1 - y) * ln(1 - $\sigma(z)$)}
$\sigma(z) = \frac{1}{1+e^{-z}}$
$\frac{\sigma(z)}{dz} = \sigma(z) * (1 - \sigma(z)) = a(1-a)$
$\frac{dJ}{dz} = \frac{dJ}{da} * \frac{da}{dz}$
J = - ${y lna + (1 - y) * ln(1 - a)}$
$\frac{dJ}{da} = - \frac{y}{a} + \frac{1-y}{1-a}$
$\frac{dJ}{dz} ( -\frac{y}{a} + \frac{1-y}{1-a}) * a(1-a)$ = a - y
2. 파이썬과 벡터화
벡터화는 코딩에서 for루프를 제거하는 기술
$z = w^T + b$
$w \in \mathbb{R^{nx}}$
$x \in \mathbb{R^{nx}}$
z와 w는 열벡터
왼쪽은 for루프를 사용한 잘못된 예(시간이 오래걸림)
로지스틱 회귀 벡터화하기
M 훈련 예제에서 이러한 예측을 계산하기 위해선 다음과 같이 1부터 m까지 연산을 진행하여야 합니다.
이 루프를 for문을 사용하지 않고 벡터화시켜 연산하여야 합니다.
파이썬에서는 np.dot()함수를 통해 두 행렬의 곱을 연산합니다.
따라서 z = np.dot(w.T, x) + b로 나타낼 수 있습니다.
로지스틱 회귀의 기울기 출력 벡터화하기
$dz^{(1)} = a^{(1)} - y^{(1)} , dz^{(2)} = a^{(2)} - y^{(2)}, ··· dz^{(m)} = a^{(m)} - y^{(m)}
파이썬 / Numpy 벡터에 대한 참고 사항
상단에 a는 행벡터로 보일 수 있지만 전치 후 곱했을 때 값이 이상하게 나오는 것을 볼 수 있습니다.
따라서 (5,) 구조가 아닌 (5,1)구조로 만들어야 합니다.
연산이 잘 되는 모습을 볼 수 있습니다.
a = np.random.randn(5)
a는 rank 1 배열이라고 할 수 있습니다. 행벡터나 열벡터로 동작하지 않기 때문에 행벡터, 열벡터를 만들려면 (5,1)와 같은 식으로 꼭 명시해줘야 합니다.
프로그래밍을 하다가 어떤 벡터의 shape을 확인하고싶다면 가정설정문 assert를 통해 검사할 수 있습니다.
assert[조건],[오류메세지]
예)
assert(a.shape == (5, 1)
assert(a.shape == (5, 1))
assert a == 999, "a is not 999"
브로드캐스팅
브로드캐스팅 성립 조건
1. 원소가 하나인 배열은 어떤 배열이나 브로드캐스팅이 가능 a.shape(5,)
2. 하나의 배열이 1차원 배열인 경우, 브로드캐스팅이 가능 a.shape(5,1) or a.shape(1,5)
2-1. 두 배열이 모두 2차원 배열이면, 브로드캐스팅이 불가
3. 차원의 짝이 맞을때 브로드캐스팅이 가능
'Coursera > Neural Networks & Deep Learning' 카테고리의 다른 글
Neural Networks and Deep Learning [4주차] (0) | 2024.01.18 |
---|---|
Neural Networks and Deep Learning [3주차] (1) | 2024.01.11 |
Neural Networks and Deep Learning [1주차] (0) | 2023.12.30 |