*다음 내용은 Andrew ng의 Deep Learning Specialization 과정 중 일부 강좌를 정리한 강의 노트입니다. 틀린 내용이 있다면 말씀해주세요. (네트워크 문제로 자꾸 글이 날아가서 다소 짧습니다..)
신경망을 계산할 때, forward pass (순방향) 이 있고, backward pass (역방향) 전달이 있다. 이번주에는 왜 전파가 되는지, 왜 역방향 전파가 되는지에 대해 소개해보도록 한다. logistic regression을 통해 이를 설명할 예정이다. 이미 알고 있는 개념이라고 해도 새로운 아이디어를 몇가지 얻을 수 있을 것이다.
Binary Classification
Notation (이 강의에서 사용할 몇 가지 표기법 정리)
(x, y)
x = x차원을 가진 특징 벡터
y = 0 혹은 1의 값을 가지는 레이블
X : training set x값을 간결하게 표현하기 위한 행렬 정의
X.shape = (nx, m)
=> nx는 하나의 입력 벡터의 크기를, m은 training set example 개수를 말한다.
Y 출력값 또한 편의를 위해 행렬로 구성한다. (차원 : 1 * m)
Logistic Regression
logistic regression은 Binary Classification (이진 분류)를 위한 알고리즘이다.
y hat은 x(입력)가 주어졌을 때 y가 1일 확률이다. 따라서 y hat은 0과 1 사이 값이어야 한다. 하지만 wtx + b는 그렇지 않기 위해 스케일링을 위해 활성화함수를 사용한다. 보통 시그모이드 함수를 사용한다.
Logistic Regression cost function
기존 linear regression에 sigmoid함수를 씌운 것이 logistic regression이다.
학습의 목표는 y hat을 y와 최대한 유사하게 만드는 것이다. 이를 계산하기 위해 loss(error) function을 정의한다.
하지만 이 loss function은 단순히 빼서 제곱하는 것은 의미가 없는데, 그 이유는 convex problem 때문이다.
이는 사진 상처럼 기울기가 0이 되는 지점이 여러군데이므로 global minimum을 찾기 어려운 현상을 의미한다.
따라서 이를 해소하기 위해 로그를 씌어준다.
이것은 자주 쓰는 loss function 중에 하나인 cross entropy loss이다. (당연한 말이지만, 손실함수가 최소가 되어야 한다.)
이 강의에서는 이 loss function에 대해 informly하게 증명한다.
y가 1이라고 가정하면, L = -log(y hat)이 된다.
비용을 최소화하기 위해서는 y가 1일때는 y hat (시그모이드를 거친 함수이므로 암만 커봤자1)을 최대로 해줘야 한다.
반대로 y가 0일때는 L = -log(1-y hat)이고, 반대로 y hat을 최소로 해주어야 한다.
로지스틱 회귀는 아주 작은 신경망이다.
이러한 loss function을 전체 training set에 대해서 계산하고, 그 평균을 낸 것을 J (cost) function이라고 한다.
Gradient Descent
손실함수의 평균인 비용함수에서 최저점을 찾아야 한다. (가장 적은 손실을 찾기 위해)
로지스틱 회귀에서는, 일반적으로 w, b를 0으로 초기화한다. 이 함수는 볼록함수이기때문에 어느 지점에서 시작하더라도 거의 똑같은 지점에 도달할 것이다.
Gradient Descent는 (간단화를 위해 일단 b는 배제) 매개변수 w를 지속적으로 업데이트하는 과정이다.
그렇다면 어떻게 업데이트를 하는가? w의 기울기값을 빼는 방식으로 업데이트를 한다. 이게 왜 가능한지는 직접 변수를 대입해서 구해보면 알 수 있다.
Derivatives with a Computation Graph
계산 그래프의 도함수
- v의 값을 바꾸면 j값에 어떤 영향을 끼칠까?
- J의 도함수만큼의 영향을 끼칠 것. (v가 0.001 증가한다면, j는 0.003 증가할 것)
- a의 값을 바꾸면 j값에 어떤 영향을 끼칠까?→ 수식화하면, a를 변화시킬 때 변하는 v양 * v값이 변할때 변하는 j양
- 마찬가지로, j의 증가량은 a의 증가량의 3배일 것.
이것을 미적분학에서 "chain rule"이라고 한다.
j가 나오기가지의 영향 (즉 도함수)을 구하려면 오른쪽에서 왼쪽으로 계산이 진행되어야 한다. 이것을 부분적인 역전파라고 할 수 있겠다.
Logistic Regression Gradient Descent
중요한것은 "무엇을 구현하는가."이다. 즉 우리는 "로지스틱 회귀를 위한 Gradient Descent"를 구현해야 한다.
해당 영상에서는 이를 computational graph로 구현하고자 한다.
logistic regression 식에 대한 복습이다.
위와 같이 computational graph를 구성할 수 있다.
우리는 최종적인 손실함수에 대한 도함수를 계산하고자 한다.
dz를 계산하면 a-y가 된다.
강의에서 증명을 하지는 않아 따로 dz = a - y임을 도출해보았다.
w1, w2, b에 대해서 도함수를 구하고, 이를 빼주는 방식으로 로지스틱 회귀를 구현할 수 있다.
단일 훈련 예제에 대한 로지스틱 회귀를 설명했다.
Gradient Descent on m Examples
이번 영상에서는 전체 훈련 세트에서 gradient descent가 어떻게 동작하는지를 살펴본다.
단순하게 확장한 위 식에서는 2개의 for loop(반복문)가 필요하다.
첫 번째 loop은 training set의 개수인 m번의 loop이고,
두번째 loop은 가중치의 개수에 따른 loop이다. 여기에서는 n=2, 즉 w1, w2에 대해서만 계산하지만,
실제로는 w 함수가 훨씬 많을 수 있다. 그러한 경우에는 알고리즘 효율이 떨어지게 된다.
⇒ 명시적인 for loop 없이 똑같이 구현할 방법은 없을까?
→ 이러한 생각에서 나온 것이 벡터화 기법이다. 딥러닝 시대에는 매우 큰 데이터 셋에 대해서도 처리해야하므로 벡터화 기법이 매우 중요하다. 다음 영상에서는 어떻게 벡터화 기법을 적용해서 풀 수 있을지를 살펴볼 것이다.
Vectorization
벡터화는 코딩에서 명시적 for 루프를 제거하는 기술이라고 할 수 있다.
벡터화하지않으면 왼쪽처럼 일일이 for문을 돌면서 더해줘야하는 데에 반해, 벡터화하면 오른쪽처럼 훨씬 빠르게 계산이 가능하다.
같은 c값에 대해서 벡터화한 계산과 벡터화하지않고 for문을 돌린 계산이 약 150배 정도의 차이가 난다.
이렇게 함으로써 병렬화가 가능해졌기 때문이다. (이는 CPU, GPU 모두에 해당된다.)
numpy를 쓰는 이유에 대해 확실히 이해했다!
More Vectorization Examples
뉴럴 네트워크 프로그래밍에서 중요한 것은 가능한 한, 명시적 for loop을 피하는 것이다.
for loop을 쓰고 싶을 때마다 넘파이 내장 함수에 이미 있지는 않은지 찾아볼 것!
두개의 for loop 중 하나(dw)를 위와 같이 np를 사용해서 벡터화하여 없앴다.
Vectorizing Logistic Regression
Vectorizing Logistic Regression's Gradient Output
두번째 for문은 전체 for loop. 즉 훈련 예제에 대한 반복문이었다. 이 for문은 db의 경우 넘파이 연산으로 구한 것의 평균을, dw인 경우 행렬 연산을 구한 후 평균을 구하면 된다.
Broadcasting in Python
수직으로 연산은 axis = 0, 수평으로 연산은 axis = 1이다. (항상 헷갈린다..)
위 식은 파이썬에서 자동으로 행렬이 확장되는 Broadcasting의 예시이다.
A Note on Python/Numpy Vectors
브로드캐스팅이 가능하다보니 파이썬은 편리하지만 심각한 버그가 발생해도 알아채기 어렵다는 단점이 있다.
위에서 정의한 a는 rank one array(그냥 배열과 같다.)라고 하며, 행벡터도, 열벡터도 아니다. 따라서 전치를 하거나 inner product를 해도 의도한 결과가 나오지 않는다. 그러므로 신경망에서는 위 같이 선언하지 않도록 주의하자.
우리가 아는 행렬 형태로 하려면 np.random.randn(5, 1)로 정의해야 한다. 행렬과 배열 차원을 조심하고, reshape을 마음껏 쓸 것 (딱히 계산량이 크지 않다.)
Explanation of Logistic Regression Cost Function (Optional)
왜 logistic regression에서 위에서 정의한 비용함수(크로스 엔트로피) 를 사용하는지 확률 관점에서 살펴보자.
위 두 식을 아래 형태로 하나로 합칠 수 있다.
log function이 strictly monotonically increasing funciton (단조함수) 이기 때문에, log p(y|x)를 최대화하는 것은 p(y|x)와 유사한 결과가 나올 수 있다.
loss를 최소화하는 것은, 로그 가능도를 최대화하는 것과 같다.
지금까지는 단일 훈련 예제에 대해 살펴보았다면, 전체 m개의 훈련 샘플에 대해 살펴보자.
우리는 전체 training set labels 확률 중에서 확률을 최대화하는 parameter을 찾고자 한다. 이를 살펴보는 것은 로그를 씌운 확률을 살펴보는 것과 같다.
따라서 전체 trainin gset에서 label의 log probability는 각 변수에 대한 log probability의 합과 같다.
확률론에서는 이것을 MLE (maximum likelihood estimation)라고 한다. 이것은 파라미터를 최대화하는 것을 고르는 것을 의미한다.
*likelihood function (가능도 함수)란, '주어진 데이터(관찰 데이터)들이 어떤 확률 분포에 맞는 정도'를 수치화한 함수라고 할 수 있다. (밑 링크 참조)
우리는 likelihood를 최대화하는 것 대신, cost를 최소화하기를 원하므로 음수를 없애고, 편의를 위해 1/m 계수를 추가한다.
즉, 우리는 training sample이 IID (identically independently distributed)라는 가정 하에, cost function인 J를 최소화함으로써 logistic regression model에서 MLE를 수행하고 있다.
예전에 강의 들을 때는 어려워서 스킵했던 부분인데, 그때보다는 이해가 잘 된다. 아직 통계 부분은 어렵고 헷갈린다..
참조
https://curt-park.github.io/2018-09-19/loss-cross-entropy/
[손실함수] Binary Cross Entropy
확률, 정보이론 관점에서 살펴보는 Binary Cross Entropy 함수
curt-park.github.io
https://www.kaggle.com/code/waybackwhale/likelihood-function
Likelihood function 이란 무엇인가?
Explore and run machine learning code with Kaggle Notebooks | Using data from No attached data sources
www.kaggle.com
'Deep Learning Specialization 강의 > Neural Networks and Deep Learning' 카테고리의 다른 글
Deep Neural Networks (4주차) 정리 (0) | 2024.07.11 |
---|---|
Shallow Neural Network (3주차) 정리 (0) | 2024.07.11 |
Introduction to Deep Learning (1주차) 정리 (2) | 2024.07.03 |