신경망에 입력이 들어와 층층이 순전파를 거쳐 마지막 층에서 출력되는 값은
"입력에 대한 예측값"이다. 지난 장에서 살펴본 모델은 마지막 층의 노드가
하나이며, 하나의 예측값을 출력한다.
예측값을 여러 개 출력하는 모델은 어떻게 생겼을까? 또 이 모델로 어떤 일들을 할
수 있을까?
위와 같은 모델을 생각해보자. 데이터가 입력으로 들어오면, 그 데이터에 대해
'개'와 '고양이'라는 두 클래스 중 하나를 예측하는 모델이다. 이때 마지막 층의
노드를 두 개로 설정하고, 각각을 '개'와 '고양이' 클래스에 대한 예측값을
출력하게 할 수 있다.
처음 살펴본 모델은 하나의 예측값으로 어떤 하나의 값('집의 가격')을 예측하는
회귀(regression) 모델이다. 두번째로 살펴본 모델은 여러 가지
클래스(class) 중 하나를 예측하는
분류(classification) 모델이다.
회귀와 분류가 잘 기억나지 않는다면
1.4장을 참고할
것
회귀 모델의 경우에는 정답(레이블)이 '5400'과 같은 값으로 주어져, 단순히 모델을
통해 출력되는 예측값과의 거리를 계산해 오류를 구할 수 있었다. 분류 모델의 경우
조금 더 복잡하다.
예를 들어, 예측값1이 0.2, 예측값2가 0.3이 나왔다고 하면, 정답과의 거리를
어떻게 구할 수 있을까? 우선 분류 문제에서 정답이 [1, 0]과 같은 형태로
주어진다고 하자.* 우리는 출력된 예측값 [0.2, 0.3]을 가지고 위의 정답과의
거리를 구하고자 한다.
* 해당 데이터의 정답이 '개'라면 [1, 0], '고양이'라면 [0, 1]이다.
우리는 위와 같이 예측값들을 해당 클래스의 확률값으로 바꿔주는 어떤 함수를
생각해볼 수 있다. 이 함수를 소프트맥스라고 하는데, 이를 살펴보기 전에 먼저
확률값으로 바꿔준다는 것의 의미를 알아보자.
이제 0.4와 0.6이라는 두 값을 더하면 1이 된다. 즉, 각각 40%, 60%라는 확률값으로
변환된 것이다. 하지만 이대로 사용하기에는 하나의 문제점이 있다. 바로 예측값이
음수로 나올 수 있다는 점이다.
심지어 최악의 경우에는 위와 같이 분모가 0이 될 수도 있다. 이 경우에는 컴퓨터로
계산이 불가능하기 때문에 '0으로 나누기 불가능' 오류(zero division error)가
발생한다. 어떻게 해결할 수 있을까?
해결책은 0이나 음수가 들어오더라도 모조리 양수로 바꿔주는 함수를 찾아서, 모든
예측값에 적용해주는 것이다. 우리는 이미 중학교 수학 시간에 지수함수에 대해
다뤄본 적이 있다.
입력으로 양수, 0, 음수가 들어올 때 모두 양수가 출력된다는 것을 볼 수 있다. 이 함수의 밑으로 2 대신 2.7을 넣어도 모두 양수가 출력되며, 2.718... 이라는 값을 갖는 자연상수 e를 넣어도 모두 양수가 출력된다.
일반적으로 자연상수 e를 밑으로 갖는 지수함수를 사용한다. 그 이유는 이름에서도
알 수 있듯이 '자연스러운' 수이기 때문에, 특히 로그(log) 계산이 들어갈 때
계산식이 매우 쉽게 계산되기 때문이다. 확률값으로 바꾼 뒤 정답과의 거리를
계산하는 과정에서 크로스엔트로피(cross entropy)라는 걸 사용하게
되는데,* 이때 로그 계산이 들어가기 때문에 자연상수를 밑으로 사용하게 되면
계산이 간편해진다.
* 크로스엔트로피 결과를 '거리'라고 말하는 것은 엄밀하게는 맞지 않다.
왜냐하면 A, B 사이의 거리는 A에서 B로 가는 값과 B에서 A로 가는 값이
동일해야하는데, 크로스엔트로피는 '정답'과 '예측값'의 위치를 바꾸면 값이
달라지기 때문이다. 하지만 정답과 예측값이 얼마나 다른지 계산하는 것이
목적이라는 점에서는 거리와 맥락을 같이한다.
예측값들을 모두 e를 밑으로 갖는 지수함수에 통과시킨 후에 확률값을 계산하면
위와 같다. 이 경우에는 다음과 같이 '0으로 나누기 불가능' 오류가 발생하지
않는다.
이 분류 모델의 전체 과정을 살펴보면 다음과 같다.
먼저 데이터가 주어지고, 신경망을 통과하면서 이전층의 여러가지 조합으로
데이터의 구체적인 특성들이 추출된다. 마지막 층에서 '개'와 '고양이'에 해당하는
특성 두 개가 예측값을 결정하며, 이 두 값이 소프트맥스를 통과해 각각의 확률을
출력한다.
이때 이미지가 어떻게 입력 벡터로 한줄로 들어오는지는 어렵지 않다. 이미지는
픽셀로 이루어져 있는데, 최소단위의 정사각형 점이라고 생각하면 된다. 흔히
말하는 풀에이치디(FHD) 화질의 경우 가로로 1920개의 픽셀과 세로로 1080개의
픽셀이 있다. 픽셀마다 0~256 사이의 숫자가 있는데, 해당 위치의 밝기를 나타낸다.
따라서 이런 데이터를 모델에 입력시킬 때는 단순히 가로로 한줄씩 자르고, 한줄씩 이어붙여서 하나의 긴 벡터 형태가 된다고 생각하면 된다. 즉, 각각의 픽셀이 입력의 특성들에 해당되는 것이다. 이에 대해서는 컴퓨터 비전에서 사용하는 합성곱 신경망(CNN)을 설명할 때 더 다뤄보도록 하자.
이렇게 두 클래스로 분류하는 것을 살펴보았는데, 더 많은 클래스의 경우에는
어떻게 될까?*
* 전자를 이진 분류(binary classification), 후자를 다항 분류(multi-class
classification)라고 한다.
'사람'이라는 클래스가 하나 추가된 모델이다. 사실 이 경우에도 크게 다르지 않다.
마지막 층에서 세 개의 특성이 추출되며, 각각이 '개', '고양이', '사람'에 대한
예측값을 출력하며 소프트맥스를 통해 확률값으로 변환된다.
이때 정답이 주어지는 일반적인 형태까지 살펴보자.
일반적으로 데이터에서 입력 특성들(여기서는 이미지)이 주어지고, 해당 데이터에
대한 정답(레이블)이 함께 주어진다. 이 정답은 0번부터 순서대로 정해놓는 것이
일반적이다.
* 원-핫인코딩이 기억나지 않는다면
2.4장을 복습할
것.
예를 들어 위와 같이 확률값들이 출력되었다고 하자. 그럴 경우 오차는 어떻게
계산할 수 있을까?
물론 위와 같이 분류 모델에서도 클래스별로 정답과 예측의 거리를 계산하고 단순히
더하는 방식으로 오차를 계산하는 것이 가능하다. 하지만 회귀 문제에서는 단순히
예측과 정답과의 차이를 역전파에 피드백시키는 것이 중요한 문제지만, 분류 문제에
있어서는 예측한 분류가 정답을 맞췄는지 아닌지가 더 중요한 문제다. 즉, 정답이
'고양이'인 데이터에 대해서 '개'라고 예측한 경우에는, 단순히 확률값과 정답의
차이만큼이 아닌 더 큰 패널티를 줘야한다.
이때 크로스 엔트로피(cross entropy)를 사용한다. 엔트로피란 '불확실성의
정도'라고 알려져 있는데, 여기서는 '정보량'의 개념으로 이해하면 된다.
크로스엔트로피는 '정답'과 예측한 '확률값' 사이에서 얼마나 차이가
발생하는지(얼마나 정보가 발생되는지)를 계산한다. 계산식을 살펴보면 다음과
같다.
어려워보이지만, 사실 기호들이 무엇을 의미하는지만 파악하면 생각보다 간단하다.
즉, 크로스 엔트로피는 위와 같이 클래스별로 정답과 예측(확률값)의 차이를
계산하고 전부 더해서 오차를 계산한다고 생각하면 된다. 정답의 분포와 예측의
분포의 차이를 줄여나가기 위해 그 오차를 계산하는 방법이라고 이해해도 좋다.
오차를 계산하는 손실함수(loss function)로 크로스 엔트로피를 사용하면
위와 같이 계산된다. 정답에 해당하지 않는 클래스에 대해서는 정답인 0이 로그
앞에 곱해지기 때문에 결과가 0이 된다.
즉, 데이터의 정답이 아닌 '개' '고양이' 클래스에 대한 오차는 0이 되고, '사람'
클래스에 대한 오차는 -log(예측확률값)이 된다.
1. 예측된 확률값들이 [0, 0, 1]이 되어 정답을 완벽하게 맞췄다면 (즉 세번째
확률값이 1이었다면) 크로스 엔트로피는 0이 되어 오차도 0이 된다.
2. 예측된 확률값들이 [1, 0, 0]이 되어 완전히 틀리게 되면 크로스 엔트로피는
무한대로 커진다.
더 알아보기
2 댓글
혹시 실례가 안된다면, 제 블로그에 사진 인용해도 될까요?
답글삭제안녕하세요, 반갑습니다.
삭제출판된 저작물이기도 하기 때문에, 인용시 출처를 밝혀주시길 바랍니다.