1. Broadcasting in python
Boradcasting example
- 세 개의 행 중에서 Carb가 차지하는 비중을 for-loop 없이 해결하는 코드를 작성해보자.
- 각 열의 값들을 모두 더하여 구한 값으로 각 원소들을 나눠준 뒤 100을 곱하면 percentage를 구할 수 있다.
이를 for-loop가 아닌 built-in function으로 구현하면 위 사진의 맨 아랫 부분 두 줄의 코드에 해당한다. - sum(axis=0) 함수를 사용하면 2차원의 matrix에 대해 '세로로' 합을 구해준다.
즉 각 열의 합을 더하여 (4,) 사이즈의 vector가 되는 것이다. - 마지막으로 reshape(1,4)는 vector의 사이즈를 2차원인 (1,4)로 조정해주는 것인데 사실 쓰지 않아도 자동적으로 (1,4)로 확장된다.
하지만 교수님은 본인이 구현하는 코드의 정확도와 이해도를 높이기 위해 reshape 함수로 검증한다고 말씀하셨다. - 그렇다면 (3,4) 사이즈의 행렬을 (1,4) 사이즈로 나누면 어떻게 될까?
(1,4) 사이즈의 행렬이 (3,4) 사이즈로 변환된다.
이때 변환은 복사를 하여 확장하는 방식으로 수행된다.
즉, (1,4) 사이즈로 구성된 행렬이 두 행 더 추가되는 것이다.
General Principle
- broadcasting은 기본적으로 행과 열 중에서 맞지 않는 부분을 조정해주는 것으로 이해할 수 있다.
이것이 neural network에서 사용되는 broacasting의 굵직한 내용이고,
추가적인 내용들을 확인하고 싶다면 numpy의 documentation을 참고할 수 있다.
2. A Note on Python/Numpy Vectors
>>> a = np.random.randn(5)
>>> a
array([ 0.88248431, 0.87480907, -1.11434198, 0.57737752, -0.2354557 ])
>>> a.shape
(5,)
>>> a.T
array([ 0.88248431, 0.87480907, -1.11434198, 0.57737752, -0.2354557 ])
>>> np.dot(a,a.T)
3.174631708083337
>>> a = np.random.randn(5,1)
>>> a
array([[ 0.29962105],
[-1.18726583],
[-1.38419883],
[ 2.18912385],
[ 0.71582923]])
>>> a.T
array([[ 0.29962105, -1.18726583, -1.38419883, 2.18912385, 0.71582923]])
>>> np.dot(a,a.T)
array([[ 0.08977277, -0.35572983, -0.4147351 , 0.65590758, 0.2144775 ],
[-0.35572983, 1.40960016, 1.64341198, -2.59907195, -0.84987958],
[-0.4147351 , 1.64341198, 1.9160064 , -3.03018267, -0.99084998],
[ 0.65590758, -2.59907195, -3.03018267, 4.79226323, 1.56703883],
[ 0.2144775 , -0.84987958, -0.99084998, 1.56703883, 0.51241148]])
- 코드를 구현할 때 1차원 array는 2차원으로 작성하는 것이 좋다.
위 코드블럭에 작성된 예시에서 볼 수 있듯이 1차원 array는 벡터로 취급되지 않기 때문에 dot 연산을 수행하더라도 scalar 값을 반환하게 된다.
반면 2차원 array로 reshape한 뒤 dot 연산을 수행하면 broad casting된 결과로 5 x 5 size matrix가 반환되는 것을 볼 수 있다. - 1차원 array를 사용하게 되면 길게 작성된 전체 코드 내에서 어디가 문제를 야기한 것인지 정확히 파악하기 어려워진다.
따라서 습관적으로 2차원으로 reshape하는 것을 권장한다.
3. Quick tour of Jupyter/iPython Notebooks
- Start Code Here - End Code Here 사이에 답안을 작성할 것
- 해당 cell을 실행시키기 위해 shift + enter를 입력하면 됨
- 위에 있는 cell도 실행을 시켜줘야 아래의 cell이 정상적으로 작동(ex. import numpy as np)
- instruction이 쓰여있는 곳을 double click한 경우 esc / shift + enter로 빠져나올 수 있음
- connection이 끊어진 경우 kernel을 restart하면 됨
- 과제를 모두 완료하면 Submit Assignment를 클릭하여 제출
4. Explanatoin of Logistic Regression Cost Function(Optional)
Logistic regression cost function
- 추정치 y hat은 sigmoid함수로 구현되고 그 의미는 input x가 주어졌을 때 y가 1일 확률이다.
y = 1 일 때와 y = 0 일 때로 구분하는 binary classification에 관한 문제가 logistic regression이다.
- y = 1 일 때와 y = 0 일 때를 한 번에 표현한 식을 여기에서 확인할 수 있다.
각각 나머지 항의 지수가 0이 되며 1을 곱하는 꼴이 되는 것을 알 수 있다. - 여기에 log를 취하게 되면 우리가 앞에서 확인했던 loss function을 정의할 수 있다.
결국 이 log 값이 작아져야 x가 주어졌을 때의 y일 확률이 높아지게 되는 것이다.
Cost on m examples
- training set의 labels를 확률을 구하는 식은 결국 x가 주어졌을 때 y일 확률들을 모두 곱하는 것이 된다(독립시행 개념으로 보인다).
- 모든 항들을 곱하는 식에 log를 취하게 되면 덧셈으로 바꿀 수 있게 된다.
이때 - 부호가 포함되는 것을 놓치면 안된다.
여기서는 우변의 값(loss)을 최소화하는 것이 좌변의 확률을 최대화하는 방법이다.
이는 maximum likelihood estimation과 관련된 내용이다. - 최종적으로 우리는 이 loss function을 이용하여 cost(J(w,b))를 구하게 된다.
cost는 최소화해야 하므로 우변의 - 부호를 버리고 항의 개수인 m으로 시그마 값을 나누어 평균치를 구하면 된다.
출처: Coursera, Neural Networks and Deep Learning, DeepLearning.AI
'Neural Networks and Deep Learning > 2주차' 카테고리의 다른 글
Programming Assignments (2) | 2022.10.03 |
---|---|
Python and Vectorization(1) (0) | 2022.10.03 |
Logistic Regression as a Neural Network(2) (0) | 2022.10.02 |
Logistic Regression as a Neural Network(1) (0) | 2022.10.02 |