코딩로그
신경망과 딥러닝 - 파이썬과 벡터화 본문
- 벡터화
- 벡터화란 코드를 작성하는 데 있어 for 문을 없애는 것입니다.
- z = wt+b라는 식이 있을때 벡터화에서는 z = np.dot(w,t)+b 로 표현합니다.
- SIMD(Single Instruction Multiple Data)는 병렬 프로세서의 한 종류로, 하나의 명령어로 여러 개의 값을 동시에 계산하는 방식입니다. 이는 벡터화 연산을 가능하게 합니다. 따라서 for문으로 하나의 값을 연산하는 것 보다 벡터로 만들어서 한번에 연산하는 것이 더 효율적입니다
- 로지스틱 회귀의 벡터화
- 아래의 식은 for문을 이용해 i의 값을 변화시키며 계산해야 합니다.
- z(i)=WTx(i)+b
- a(i) = sig(z(i))
- 하지만 계산의 효율정을 증가시키기 위해 벡터를 이용하면 다음과 같이 계산할 수 있습니다.
- Z = np.dot(np.transpose(W),X)+b
- 위의 코드에서 (1,m)크리의 행렬과 상수 b를 더하기에 오류가 날 것 같지만, 파이썬이 자동적으로 상수를 (1,m)크기의 행렬로 브로드캐스팅 해주기에 오류가 발생하지 않습니다.
- 브로드 캐스팅은 곧 배울 예정이니 아직 모르시는 분도 걱정하지 않으셔도 괜찮습니다.
- 아래의 식은 for문을 이용해 i의 값을 변화시키며 계산해야 합니다.
- 로지스틱 회귀의 경사 계산을 벡터화 히기
- Logistic Regression Gradient Descent 강의에서 dz(i)=a(i)−y(i) 를 통해 계산할 수 있음을 배웠습니다.
- for문을 사용한다면 아래와 같이 계산해야 합니다.
계산 속도의 향상을 위해 벡터를 사용한다면 아래와 같이 계산할 수 있습니다.
- 로지스틱 회귀의 비용함수 설명
- 앞서 로지스틱 회귀에서 배운 손실함수를 상기해봅시다.
- y값이 1 이 될 확률 : P(y=1∣x)=y^
- y값이 0 이 된 확률 : P(y=0∣x)=1−y^
- 위 두가지 경우를 하나의 수식으로 나타내면 아래와 같습니다.
- P(y∣x)=y^y(1−y^)(1−y)
- 만약에 y = 1 일 경우, P(y∣x)=y^1(1−y^)0=y^
- 만약에 y = 0 일 경우, P(y∣x)=y^0(1−y^)1=1−y^
- 또한, 로그함수의 단조적인 성격 때문에 위 식은 아래와 동일 합니다.
- logP(y∣x)=log(y^y(1−y^)(1−y))=ylogy^+(1−y)log(1−y^)
- 우리의 목적은 확률( logP(y∣x) )을 최대화 시키는 것이기 때문에 이와 등치인 -1 을 곱한 확률 ( −logP(y∣x) )를 최소화를 목적으로 손실함수를 정의 합니다.
- 따라서, 훈련 샘플 하나의 손실함수는 아래와 같이 정의 됩니다.
- L(y^,y)=−logP(y∣x)=−(y^y(1−y^)(1−y))
- 비용함수는 m개 훈련 세트 중, 각 샘플 ( x(i) )이 주어졌을 때, 샘플에 해당하는 라벨( y(i) )값이 1 혹은 0 이 될 확률의 곱으로 구할 수 있습니다.
- P(labels in training set)=∏i=1mP(y(i)∣x(i))
- 양변에 로그를 취하고, 손실함수 부분을 치환 해주면, 위의 식은 아래와 같습니다.
- logP(labels in training set)=log∏i=1mP(y(i)∣x(i)) =−∑i=1mL(y^(i),y(i))
- 따라서 비용함수는 손실함수들의 평균을 최소화 하는 것으로 정의하고 아래와 같습니다.
- J(w,b)=−logP(labels in training set)=m1∑i=1mL(y^(i),y(i))
'코딩로그 > Andrew Ng's ML class' 카테고리의 다른 글
신경망과 딥러닝 - 심층 신경망 네트워크 (0) | 2019.12.24 |
---|---|
신경망과 딥러닝 - 얕은 신경망 네트워크 (0) | 2019.12.24 |
신경망과 딥러닝 - 신경망과 로지스틱 회귀 (0) | 2019.12.24 |
Numpy 기초, 기본 정리 (0) | 2019.12.05 |