1. Vectorization
- gradient descent를 통해 값을 update하는 과정의 속도를 빠르게 만들어주는 방식이 vectorization이다.
단순히 python의 for loop를 사용하는 것이 아니라 numpy의 dot를 통해 vector인 w와 x를 빠르게 연산해준다.
- n차원으로 이루어진 벡터 w,x를 계산하는 것은 np.dot을 이용하는 것이 for loop를 이용하는 것보다 약 300배 이상 빠르다.
이는 강의 내 주피터 노트북을 이용한 실습을 통해 확인할 수 있었다.
이를 explicit for loop의 사용을 피하고 build in functions 사용을 지향하는 것으로 표현할 수 있다. - 처음에는 for loop 내에서 왜 z에 저장되는 값을 계속 더해야하는가 했는데 여기서는 w,x 내적을 구하면 한 개의 scalar 값으로 바뀌기 때문이다. ( 1 x n size, n x 1 size 벡터를 곱하는 것이기 때문에 그렇다)
- GPU와 CPU 중에서 이런 연산을 잘 처리 및 수행하는 것은 GPU이다.
2. More Vectorization Examples
Neural network programming guideline
- explicit for-loop 사용을 지양하고 built-in function을 사용한 또다른 예시다.
여기서는 이중으로 중첩된 for-loop 사용을 피할 수 있다.
- 벡터에 특정 함수를 적용하고 싶은 경우 numpy의 built-in 함수를 이용하는 것이 훨씬 효율적인 여러 예시들이다.
여기서는 exponential, log, absolute 등을 보여주고 있다.
- 파란색으로 작성된 코드는 기존에 Logistic Regression이 처리되는 과정을 적은 코드다.
위에서 언급했던 것처럼 for-loop 대신 built-in function을 사용하여 처리 속도를 개선한 것을 초록색으로 작성하였다.
3. Vectorizaing Logistic Regression
- 여기서도 마찬가지로 for-loop 대신 built-in function을 이용하여 vectorize를 시도한다.
- 가중치벡터 W를 transpose하여 행백터(row vector)로 만들어 입력 벡터 X와 곱해준다.
여기에 real number(실수)인 편향 b를 더해준다.
행렬과 실수는 그냥 더할 수 없으므로 편향 b를 1 x m 사이즈 벡터(행렬)로 변환하는 broadcasting이 자동적으로 발생한다.
이때 행렬곱을 위해 사용되는 함수는 np.dot 이고, 편향 b를 더해줄 때는 그냥 + 기호를 사용하면 된다. - 활성화 함수 sigmoid는 위에서 행렬곱과 편향을 더해 구한 z에 적용하면 된다.
원래는 여기서도 for-loop를 사용했지만 내장함수를 이용하여 간단하게 구현할 수 있다.
4. Vectorizaing Logistic Regression's Gradient Output
- 추정값에서 정답값을 빼는 것으로 정의되는 z를 1 x m 사이즈의 벡터로 표현할 수 있다.
이때 사용되는 변수 a,y 또한 행벡터로 표현하여 전자에서 후자를 빼면 된다. - 그럼에도 w,b의 값을 업데이트하는 과정은 for-loop로 구현된다.
이를 vectorizing하는 코드는 위 그림의 오른쪽이다.
np.sum 함수를 이용하면 벡터를 구성하는 원소의 총합을 한 번에 구할 수 있다.
w는 입력벡터 X와 z의 곱을 적용하면 된다.
- 지금까지 배운 logistic regression의 gradient descent를 정리하면 위와 같다.
각 변수들을 코드로 구현할 때 어떻게 작성해야 하는지 정확히 이해하고 기억할 필요가 있는 것 같다. - 이와 같은 방식으로 for-loop를 제거하고 built-in function을 이용하여 최대한 효율적으로 학습을 진행할 수 있다.
그럼에도 불구하고 이 시행을 여러 번 반복하기 위해서는 for-loop로 감싸줄 수밖에 없다.
교수님도 이 부분은 대체 방법이 없다고 언급하셨다.
출처: Coursera, Neural Networks and Deep Learning, DeepLearning.AI
'Neural Networks and Deep Learning > 2주차' 카테고리의 다른 글
Programming Assignments (2) | 2022.10.03 |
---|---|
Python and Vectorization(2) (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 |