이진 분류와 다중 분류에 대해 차근차근 알아보자
인공신경망의 과정을 정리하자.
이 내용은 혁펜하임님의 'ALL DEEP DIVE' 강의를 기반으로 작성함.
위와 같이 두었을 때, 결과는 1 또는 0이므로 unit step function을 가진다고 볼 수 있다.
이를 그림으로 표현하면 다음과 같다.
여기서 웨이트와 바이어스가 필요한데, unit step function 같은 경우에
미분이 불가하기 때문에 GD, SGD 같은 가중치 업데이트가 어렵다...
그렇지만 어느 정도 웨이트를 계산했다고 가정하고 웨이트를 적절히 넣으면 다음 그림으로 볼 수 있다!
이 그림을 해석하면, 이면 출력으로 1, 조건을 불만족하면 0으로 출력한다고 볼 수 있다.
이 식을 다시 표현하면 이 되고, 이 식이 선형 분류의 기준이 된다!
그리고, 위 그림처럼 hidden layer 없이 unit step function을 activation으로 사용하면 이를 '퍼셉트론'이라고 부른다!
위 예시를 가지고 그래프로 표현하면 다음과 같다.
(아래 그래프처럼 선형으로 갈라치기 하는 것을 선형 분류라고 함.)
그리고 이에 대한 출력값은 3D로 표현되는데, 이를 그림으로 다시 표현하면 다음과 같다.
위 그림처럼 3D(...?)로 표현했을 때, 입력과 출력 간의 관계는 비선형적이라는 것을 알 수 있다!
결론적으로, unit step function에는 두 가지 큰 문제점이 있는데, 이는 다음과 같다.
1. 미분 불가하다 (GD 못 씀).
2. 너무 빡빡하게 분류한다. (살짝 애매한 위치도 모 아니면 도 형식으로 분류를 해버리니까 중간을 판단하기 어렵다.)
sigmoid의 경우 입력과 출력의 관계에서 전 구간 미분가능하고, 좀 더 부드러운 분류가 가능하다!
이를 위의 예시로 보면 다음과 같다.
그리고 sigmoid의 특징은 다음과 같다.
sigmoid의 활용성을 알기 위해서 sigmoid를 활용한 예시를 가지고 자세히 파헤쳐보겠다!
입력으로 3 X 100 X 100 인 (강아지 or 고양이) 사진이라고 하고, 곧바로 출력층에 올라간다고 가정하자! (여기서 3은 RGB를 뜻하고, 100 by 100 짜리 사진을 의미한다.)
위의 사진을 보면 총 30000 (weight) + 1 (bias)의 개수만큼 학습 파라미터가 있다는 것을 알 수 있다.
그리고 머신의 출력을 강아지 사진일 확률 로 정의하고 강아지면 가 1에 가까운 값이 되고, 고양이면 가 0에 가까운 값으로 나오도록 하자!
머신의 출력이 이고, 정답(label)을 라고 하자.
(강아지 사진은 , 고양이 사진은 / 출력을 가지고 머신의 결과값으로 1 or 0을 배출한다!)
[*] 여기서 고양이 사진에 대한 출력 노드는 두지 않는 이유?
강아지가 라면 고양이는 이기 때문!
자 그리고 손실함수를 정의하기 위해 우리의 목표를 보자.
학습을 시킨다는 것은 가 1을 향하도록 하거나, 0에 향하도록 하는 것이다. 그리고 이를 위해 의 값을 변화시켜야 한다!
그러므로 "이 나오도록 하자 = "를 키우자" 이고, "이 나오도록 하자 = "를 키우자"인 것이다.
[*] 그렇게 무작정 키워도 되나??
키워도 된다! sigmoid이기에 아무리 키워도 값은 0에서 1 사이의 값으로 나오기 때문.
이는 함수로 표현하면 다음과 같다.
if (강아지)
를 maximize
else if (고양이)
를 maximize
그런데, 우리가 를 가지고 labeling을 진행했기 때문에, 위의 네 줄을 아래처럼 한 줄로 줄일 수 있다.
위의 식을 해석하면.. 예를 들어 강아지 사진이라고 판명하면 이다. 그러므로 강아지 사진이 나오도록 한다는 것은 로 고정하고 푸는 것이다. 그러므로 위 식에 을 대입하면 만 남게 된다! 그리고 를 maxmize하는 것이 로 향하는 것이라고 할 수 있다!!!
(고양이 사진의 경우는 정반대로 똑같음.)
즉, 내가 키우고자 하는 방향(값)을 고정하고, 이에 맞춰 해당 확률을 maximize하는 것이라고 볼 수 있다!!
그리고 을 첫번째 사진에 대해 머신이 예측한 해당 동물일 확률로 정의하겠다!
우리가 학습을 할 때, 데이터를 하나를 넣는 것이 아닌 여러 개를 넣게 된다.
그리고 머신은 하나 넣은 것에 대한 확률을 보는 것이 아닌, 데이터 여러 개에 대한 종합적인 확률을 보아야 한다..! (여러 케이스들을 보고 종합적으로 판단하는 것이 당연하기 때문...!)
그런데, 데이터를 넣는 행위는 '독립시행'이다.
그렇기에 여러 데이터에 대한 종합적인 확률 을 보기 위해선 독립 시행의 특징대로 을 구하는 것, 즉 곱한 확률을 구해야 하고, 곱한 확률을 키워야 한다!
[*] 독립시행의 특징 :
여기까지를 정리하자면 '손실함수'는 우리가 원하는 값을 향하기 위해 을 가지고 maximize하는 것이고, 데이터가 여러 개이기 때문에 를 maximize하는 것으로 볼 수 있다!!
그런데... 은 0과 1 사이의 값인데, 이를 계속 곱해도 될까..?
예를 들어 의 값이 가 나온다고 할 때, 데이터가 100개면 를 구해야 한다.
그리고 이 값은 0에 아주 가까운 값이 되는데.. 컴퓨터는 과 의 차이를 구별하지 못한다..!
(이를 underflow라고 한다.)
즉, 데이터들이 많아지면 데이터 개수의 근소한 차이에 대한 확률 차이를 컴퓨터가 구별하지 못하게 된다.!
그러므로 이를 해결하기 위해 를 취해준다!
[*]그렇다면 를 맘대로 취해줘도 되는가..?
상관없다!
앞서서 우리가 MSE를 공부할 때 편차의 제곱을 loss로 사용하였는데, 이를 데이터 개수로 나누어 주지 않았다. 그 이유로 어차피 나누든 말든 minimize하는 방향과 결과는 똑같이 나오기 때문이었는데..!
위의 예시도 똑같이 maximize하는 방향이 똑같이 때문에 취하는 말든 상관이 없다!!
(이를 '단조증가'라고 한다!)
에 를 취하면 다음과 같다.
마지막으로, 우리는 손실함수는 줄여야 할 목표이기에 위 식에 -를 붙이면 "손실함수를 줄인다!"라는 의미가 된다!
손실함수 :
이제 위의 식을 weights에 대해 미분해서 반대 방향으로 나아가면 끝!!
위와 같이 손실함수를 구하고, 이를 최적화까지 하는 이런 과정을 로지스틱 회귀 모델을 사용한다고 말한다.
그런데, 우리가 이항적인 부분은 classification이라고 하고, 연속적인 부분은 regression이라고 하였는데..!
"정확히 보자면 분류(classification) 또한 회귀(regression)인 것이다!"
자세히 설명하면 "classification이 logit을 regression를 한 것"이라고 볼 수 있다.
그렇다면 logit은 무엇인가?
logit은 'log + odds'를 말한다.
여기서 odds는 '승산'으로 실패 대비 성공 확률을 말하는 것인데, 이를 식으로 나타내면 다음과 같다.
odds = (성공 확률 : , 실패 확률 : )
logit은 이를 log 취한 것이다. ( )
그리고 logit을 regression하는 것은 모델의 결과를 logit으로 나타내고 이 logit을 보고 정답()을 정하는 것이라고 말할 수 있다!
그림으로 나타내면 다음과 같다.
위 그림에서 모델이 하는 일을 보자면 "입력 받아서 linear activation을 통과해 을 구하는 것"을 의미한다!!그리고 이 값을 가지고 sigmoid를 통과해 를 구하고, 이를 가지고 loss 함수를 minimize하는 것이 이진 분류이다.
중요한 부분은 logistic regression이 logit( )을 linear regression한 것이라는 것!
여기서 우리가 loss 함수를 만들기 위해서는 logit (= )에서 값을 알아내야 한다!
(위 그림을 보면 을 구하고 이를 가지고 를 구하게 된다..! 여기서 값을 알아내는 것이 loss 함수를 구하는 과정인 것이다.)
이를 위해 로 식을 정리하면 다음과 같다.
놀랍게도 를 구하는 식이 즉 sigmoid였던 것이다!!
이를 정확히 해석하자면 을 가지고 를 알아내는 것, 즉 loss를 만들기 위해 logit을 구하는 함수의 역함수인 sigmoid를 통과시켜서 를 구하게 한 것이다!!
결국 sigmoid가 필요한 이유(갑자기 sigmoid를 쓰게 된 이유)는 sigmoid가 로지스틱 회귀 모델에서 결과적으로 필요한 존재가 되기 때문이라고 볼 수 있다.
위의 내용을 정리하다 보면 드는 의문이 있다.
우리가 loss 함수를 새롭게 정의하였는데, 그냥 전에 배운 MSE를 쓰면 안 되나??
정답은 "둘 다 가능은 하다!"이다. 하지만 는 성능이 그렇게 좋지는 않다는 것을 알 수 있는데, 그 이유에 대해 서술하겠다.
일단 강아지 사진이 하나가 들어왔을 때를 가정하고 비교를 해보면 다음과 같다.
여기서 값은 sigmoid로 인해 0과 1 사이의 값이므로 그 구간만 보면 첫번째 이유인 두 함수의 차이를 볼 수 있다.
바로, 의 경우에 더욱 민감하게 반응한다는 것이다.
예를 들어 에 1이 들어갔을 때, loss 함수로 은 1밖에 손실이 안 났다라고 말하는데, 는 만큼 손실이 났다고 말한다. 결국 민감도의 차이가 클수록 비교가 쉽기 때문에 가 더 효율이 좋다.
다음 이유는 다른 예시를 들어 설명하겠다.
위 그림처럼 한 픽셀에 대해 웨이트 w가 존재하는데, 다른 학습 파라미터들은 0이라고 가정하겠다.
또한, 해당 픽셀의 입력값이 1이라고 가정을 하면 출력층에 들어가는 값이 w이므로 값은 다음과 같다.
그리고 위의 두 loss 함수 식으로 표현하면 가 된다.
이에 대해 또 다시 그래프를 그리면 다음과 같다.
위의 그래프의 차이를 보면 의 경우 convex한 상태이고, 는 non-convex한 상태가 나온다.
[*] convex : '볼록'을 의미한다. 두 번 미분을 하였을 때, 항상 양수값으로 가는 것을 의미.
non-convex는 두 번 미분을 하였을 때, 양수값, 음수값 둘 다 가지고 있는 왔다갔다하는 것을 의미.
convex한 상태는 최적화를 진행할 때, minimize하는 곳이 확실히 정해져있지만, non-convex한 상태는 최적화를 진행할 때, local minimum에 빠질 확률이 생긴다.
실제로 위의 함수를 보았을 때, 은 최적화를 진행하며 계속 내려가지만, 은 4가 들어갔을 경우에 local minimum 문제에 빠져 그 자리에 정착해버릴 수 있다는 문제가 있다!
즉, 가 보다 local minimum에 빠질 확률이 적다!
물론, 실제 딥러닝은 학습 파라미터가 하나가 아니라 여러 개이고, layer도 많아서 두 loss함수 모두 non-convex해진다. 그러나, 아래의 경우에는 무조건적으로 가 더 좋다.
위 그림의 경우에서 파란 선에 해당하는 층은 두 loss 모두 non-convex하게 나올 것이다.
그러나, 빨간 선의 경우 는 convex하고 는 non-convex하기에 둘 다 non-convex한 를 고르는 것보단 를 고르는 것이 더 효율적인 선택이라고 볼 수 있다!
일단 이 파트에서 말할 내용을 선요약하자면 다음과 같다.
사실 위에 쓴 과 모두 MLE (Maximum Likelihood Estimation)이다!!
위에서 가중치 를 알기 위해 썼던 함수 를 다시 살펴보면
이거 사실 '베르누이 분포'(이항 분포)이다! 그리고 얘를 Likelihood로 삼아서 본 것이다!
[*] Likelihood란?
색|주를 주머니의 함수로 본 것. ( 색 : 색칠한 공인지 아닌지, 주 : 어떤 주머니인지 )
(조건부 확률은 주머니에서 색깔이 나올 확률을 고르는데, Likelihood는 색깔을 보고 어떤 주머니에서 나올지 보는 것이다! 어떤 주머니인지 고를 때, 조건부 확률을 보고 가장 나올 확률이 큰 주머니를 고르는 것이 바로 MLE이다!!)
이진 분류에서는 Likelihood로 입력 사진로 보고, 이것을 w의 함수로 본 다음 maximize한 것이다! 즉, 내가 고르고 싶은 것이 확률이 높아지도록 만든 것이다!
( 는 인공 신경망이 '함수'이고, w(가중치)를 찾아가는 함수이기에 이렇게 적었다. )
위의 강아지 사진을 예시로 들면 강아지 사진()이 정답인데, 내가 강아지 사진을 보고 어떤 w(가중치)일 때, 가장 강아지 사진일 확률이 크도록(maximize) 만든 것!
더 쉽게 말하자면..!
우리가 전에 가중치를 최적화하는 목적에 "가 들어갔을 때, 와 비슷한 출력이 나오게끔 학습하자!"라고 해석할 수 있었는데,
이를 "가 들어갔을 때, 에 대한 확률을 키우자!"라고 해석하자는 것..!
결국 우리는 Likelihood를 '어느 한 분포'로 가정하고, 이 Likelihood를 maximize하는 것이다!
이 분포가 달라도 결국 우리는 MLE(최대 우도 측정)을 사용한다는 것이다!!!!
더 자세히 보자면 MSE와 Log-likelihood를 비교한 것도 다음과 같이 볼 수 있다.
번째 입력값 에 대한 머신의 출력값이 로 주어져 있을 때, 정답 의 분포 가
1. 베르누이 분포(이항 분포)라고 가정한 다음, 머신의 출력 를 강아지일 확률 로 삼고 NLL(Negative Log-Likelihood = ) 식을 세운 것인가!
2. 가우시안 분포(정규 분포)라고 가정한 다음, 머신의 출력 를 평균 값 로 삼고 NLL 식을 세운 것인가!
의 차이이다..!
사실 둘 다 'NLL'(이것이 loss함수 최적화를 의미하기 때문.)이지만 가정한 분포에 따라서 출력값의 정의가 달라진 것일 뿐이다! 결국 Likelihood가 높은 것을 추정한다는 것은 동일하다는 것! (MLE)
실제 식으로 보면 다음과 같다. (데이터가 여러개 들어갈 때의 loss 함수)
Likelihood (y의 분포)를 로 가정, loss 함수는 NLL로 하여 으로 나온다.
Likelihood (y의 분포)를 로 가정, loss 함수는 NLL로 하여 (상수 제외) 이다. 그리고 는 loss 함수에 대해 영향을 안 주니 제외하면 로 MSE가 나온다!
그렇지만, 위의 분류에서는 를 쓰는게 '적절한 가정'이었기 때문에 가 여러모로 좋았던 것이다! (MSE는 앞에서 했던 키와 몸무게 추정 같은 확률밀도함수에서 와 반대의 결과 나올 것!!)
결국, "학습"이라 함은 w에 대한 MLE인 것!!
여기서 앞에서 배운 내용을 떠올려 보자면 "인공신경망은 MLE 기계이다!"라고 하였다.
그 이유는 데이터 가 인공신경망 에 들어가서 출력값 를 나오게 하는 것이고,
어떤 인공신경망이던지 loss 함수는 인 것이다!
(여기서 데이터가 여러개이면 독립시행이니 취해서 더해주면 끝!)
그리고 이것이 딥러닝의 뿌리 이론인 "모든 loss 함수는 Likelihood를 적절히 정해서 목표값(출력값)을 삼고 MLE로 정의해준다."이다! 즉, 모든 loss 함수는 MLE로 통한다는 것이다.
위에서 했던 예시대로 3 X 100 X 100인 사진에 이번엔 강아지 or 고양이 or 소로 하자
이렇게 했을 때, 이진 분류는 하나의 확률만 알면 됐는데 , 이번엔 세 확률이 필요하다!
그렇기에 이번엔 하나의 노드가 아닌 세 노드로 보고 인공신경망이 만들어진다.
그리고 학습 파라미터의 개수는 으로 90300개이다.
이젠 loss 함수만 잘 정의하면 분석은 SGD의 여러가지의 방법으로 하면 된다!
그리고 우리는 이것이 결국 MLE라는 뿌리를 가지게 되는 것을 알기에 Likelihood와 내가 원하는 출력값을 잘 정의할 생각만 하면 된다!
일단 여기서 정답(label) 는 강 : , 고 : , 소 : ( one-hot-encoding)으로 잡겠다.
[*] one-hot-encoding란?
내가 표현하고자 하는 것을 1, 나머지를 0으로 부여하는 벡터 표현 방법.
위와 같이 정답을 잡았을 때, 머신의 출력은 확률 분포 값(강, 고, 소 확률)으로 나오게 되는 셈이다.
그런데 우리가 위의 그림처럼 학습을 진행했을 때, 각 노드당 30003개의 곱하고 더한 값으로 따로따로 나오기에 세 노드의 관계성이 없고 확률 분포라고 보기 어렵다.
그래서 확률 분포가 출력될 수 있도록 마지막 activation에 softmax를 써준다! (아래 그림 참조.)
위의 그림을 보면 강, 고, 소에 대해 linear activation으로 통과한 다음, Softmax가 3개의 입력을 받고, 3개의 출력을 내보낸다. 즉, softmax는 각각의 노드에 확률 분포의 관계성을 넣어주는 역할을 한다!
그리고 softmax의 출력값들은 PMF를 만족해야 한다.
[*] PMF?
Probability Math Function으로 확률 질량 함수를 의미.
조건은 확률값이 0과 1 사이의 값이고, 모든 합이 1이 되어야 한다.
softmax의 출력값은 다음과 같이 나오게 된다.
각각 분모는 입력값에 e로 exponential한 값을 모두 더하고, 분자는 입력값에 e로 exponential한 값을 각각 넣는다. 그리고 이는 위의 PMF 조건을 모두 만족하는 출력값이 된다!
[*] 그렇다면 는 안 될까?
된다. 그렇지만, 내 생각에 세 가지 불편한 요소로 인해 쓰지 않는다.
1. NLL을 보통 취하기에 인 것이 편하다.
2. 초기 입력값은 0 근처의 값인데, 0 근처의 값이 분모이면 아무래도 튀는 값이 나올 확률이 커져 불안정하다.
3. 똑같은 값에 +, -를 구분하기 어렵다.
[*] 그렇다면 그냥 sigmoid를 쓰고, 가장 높은 값을 MLE로 삼으면 안 될까?
되는 것 같은데, 이는 Mulit-lable classification (다중 정답)에 쓰일 수 있음.
예를 들어 강아지와 고양이가 같이 있는 사진에서 softmax는 하나의 정답을 추구하고 sigmoid를 쓰면 다중 정답을 추구할 수 있는 것.
그렇기에 상황에 맞춰서 쓴다는 느낌으로 이해하면 된다.
이제 머신의 출력을 정하였으니 y의 분포 Likelihood를 가정해야 하는데,
여기선 multinoulli 분포(= )로 가정하면 된다!
(multinoulli 분포는 categorical 분포라고도 함.)
[*]여기선 y 값이 아닌 분포로 보는 이유
노드 값이 하나가 아니라 여러 개이기 때문에 각각의 y값에 대한 분포가 나온다.
위의 경우, 로 나오고 이에 대한 값으로 로 나오기에 함수는 다음과 같이 나온다!
그리고 여기에 를 취한 가 loss 함수가 된다.
그리고 이를 전개하면 생각치도 못한 결과가 나온다.
이고, 이는 앞에서 배운 Cross-Entropy가 된다..!
[*]Cross-Entropy : 예측된 확률 분포와 실제 데이터의 확률 분포의 차이를 측정하는 개념
식은 로 나오고 를 와 가깝게 해서 Entropy()와 최대한 가깝게 한다.
정리하자면, NLL로 전개했을 때, 가 된다!
위에서 가 되는 이유는 one-hot-encoding으로 labeling했기 때문에 값이 0인 값 쪽은 값이 사라지고 인 것만 남기 때문이다.
( : 해당 동물의 index, 엄밀히는 으로 표기하여 sum해줘야 한다..!)
그리고 을 Cross-Entropy 관점에 보았을 때,
가 된다.
(에 해당하는 것을 로 바꾸면 Cross-Entropy에서 Entropy가 되기에..!)
또한, Entropy는 one-hot-encoding 값을 어떤 것을 넣든 이 나오고 이 값은 0이 된다.
그리고 중요한 부분인 학습 방향은 Entropy에 가까워지도록 Cross-Entropy를 최적화해야 하기에 값을 값에 가깝도록 해야 하고,
이 말은 가 에 가까워지도록 하는 것이 Cross-Entropy의 minimum을 향하는 것이다.
위의 말을 한마디로 간단히 정리하면 그냥 값에 대해 대응되는 값이 나오게끔 분포 차이를 나타내는 Cross-Entropy를 loss 함수로 삼았다고 보면 된다!
위에서 배운 Softmax를 사용하는 다중 분류를 Softmax regression이라고 하고,
이 Softmax regression 또한 logit을 regression한 것이다!
그리고 다중 분류를 위한 logit을 구하는 함수의 역함수인 Softmax를 통과시켜 확률을 출력했다고 볼 수 있다!!
logit을 구하는 함수의 역함수가 Softmax라는 것을 증명하면 다음과 같다.
다중 분류에서 logit은 중 하나를 기준으로 잡고 처럼 나타낸다.
그리고 e로 exponential하면 이 된다.
여기서 이고 이 된다.
그리고 1을 넘기고 뒤집어주면 가 되고, 이기에 가 된다!
(도 동일하게 구해짐.)
[*]그렇다면 Cross-Entropy를 이진 분류에서 쓸 수 있을까?
(이진 분류에서 노드를 하나로 보는 것이 아닌 두 개로 보고 Softmax로 이어준다는 것..!)
된다! 실제 계산을 해보면 로 볼 때, loss 함수는 가 된다.
(이 loss 함수를 BCE라고 부른다.)
그리고 여기에 one-hot-encoding된 값을 넣으면 위와 똑같이 가 되는데,
사실 이것은 베르누이(에서 를 0으로 본 값.)를 사용했을 때의 계산과 똑같다!
이것으로 확인한 것은 결국 Cross-Entropy를 하나 베르누이를 하나 똑같이 MLE라는 것이다.
이 부분은 혁펜하임님의 ppt 강의 내용 중 일부를 가져와 정리하였음.

(사실 위에서 정답의 분포 가정과 출력을 보는 것은 loss 정의와 더 관련이 있어 보임.)
- 퍼셉트론으로 선형 분류를 하였을 때, 입력과 출력값의 관계를 표현하면 비선형적이다. 그러므로 sigmoid를 써줘서 선형적으로 만들어준다.
- loss 함수는 내가 구하고자 하는 출력을 무엇으로 볼지 정하고 어느 한 분포(Likelihood)를 정답의 분포로 가정하여 NLL하고 이를 MLE하는 방향으로 가는 것이다!
- 출력의 함수를 정의하는 것은 logit을 구하는 함수의 역함수를 넣어 출력을 구한다고 생각하면 된다.
- 데이터를 넣는 행위는 독립시행이므로 어느 한 데이터에 대한 정답의 분포를 곱한다.
- 이진 분류의 loss는 출력으로 둘 중 하나의 확률 를 나타내고 출력 구하는 것은 sigmoid를 쓴다. 그리고 Likelihood로 베르누이를 가정하여 NLL하여 loss 함수를 나타낸다.
- 다중 분류의 loss는 출력으로 정답 분포를 나타내고 출력 구하는 것은 softmax()를 쓴다. 그리고 Likelihood로 Cross-entropy를 가정하여 NLL해 loss 함수를 나타낸다.