# 쉬어가기: 멀티 레이블 분류

필자가 자연어 처리 강의를 진행하면서 만난 수강생 중에는 자연어 처리 기술 자체에 대해서 궁금해하는 분들도 있었고, 실제로 번역 또는 텍스트 분류와 같은 업무가 주어져 실무에서의 필요성 때문에 찾아오신 분들도 있었습니다. 특히 수강생 여러분이 실제로 담당하는 프로젝트에서 텍스트를 활용하여 다양한 분류를 하려는 경우가 많았습니다. 현업에서는 멀티 레이블 분류에 대한 수요가 의외로 높은 것도 확인할 수 있었습니다.

이번 절에서는 멀티 레이블 분류에 대해서 살펴봅니다. 멀티 레이블 분류란 기존의 소프트맥스 분류와는 달리 여러 개의 클래스가 동시에 정답이 될 수 있는 것을 의미합니다. 기존의 소프트 맥스 분류에서는 문장의 클래스가 여러 후보 중에 한 개만 해당될 수 있었을 겁니다. 예를 들어 다음과 같은 사용자의 리뷰에 대해 감성 분석을 해야 한다고 가정하겠습니다.

* 상품 품질은 참 좋은데, 배송이 너무 느리네요.

이 리뷰의 감성 분석 결과는 '긍정'일까요 '부정'일까요? 품질에 대한 반응은 긍정적이지만 배송에 대한 반응이 부정적이니 '중립'으로 보는 게 맞을까요? 게다가 단순히 사용자의 반응이 궁금한 게 아니라, 특정 항목에 대한 사용자의 반응이 궁금할 수 있습니다. 예를 들어 '품질'에 대한 감성 분석과 '배송'에 대한 감성 분석이 동시에 필요할 수도 있습니다. 그렇다면 애초에 레이블링 작업을 수행할 때 각 항목에 대한 레이블을 달아 주어야 합니다.

| 문장                         | 품질 | 배송 |
| -------------------------- | -- | -- |
| 상품 품질은 참 좋은데, 배송이 너무 느리네요. | 상  | 하  |

## 이진분류

이 문제를 여러 개의 이진 분류binary classification 문제로 접근할 수도 있습니다. 이때 이진 분류를 위해서는 어떤 활성화 함수와 손실 함수를 사용하면 좋을까요?

먼저 신경망의 마지막 계층은 2개의 노드에 softmax 함수를 사용하는 대신, 1개의 노드에 시그모이드sigmoid 함수를 사용합니다. 얼핏 생각하면 기존에 n개의 클래스를 분류하기 위해 n개의 노드를 갖는 마지막 계층에 softmax 함수를 사용했지만, 2개의 클래스만을 갖는 이진 분류 문제에서는 1개의 노드의 값이 결정되면 다른 1개 노드의 값이 결정되는 것은 당연하므로 1개 의 노드만 갖는 것이 맞습니다. 즉, 이진 분류 상황(또는 베르누이 분포)에서는 다음의 수식을 항상 만족합니다.

$$P(\text{y}=1|x)=1-P(\text{y}=0|x)$$

그리고 이진 분류에는 이진 교차 엔트로피 손실binary cross entropy loss(BCELoss) 함수를 활용할 수 있습니다. BCELoss는 기존의 교차 엔트로피 손실 함수의 한 케이스로, 이진 분류에 특화된 버전이라고 볼 수 있습니다.

$$\text{BCELoss}(\hat{y}, y)=-\big(y\times\log{\hat{y}}+(1-y)\times\log{(1-\hat{y})}\big)$$

이 수식에서 $y$ 는 0 또는 1의 값을 갖는 불연속적인 값입니다. 그리고 $\hat{y}$ 은 시그모이드 함수의 출력값이 됩니다. 따라서 0에서 1사이의 연속적인 실숫값을 갖습니다.

![이진 분류 모델 신경망 구조의 예](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Lii6RQWmE0eo3fdkvGo%2F-Lii6SdoVbMLFrUEIXzz%2F08-06-01.png?generation=1561994321649438\&alt=media)

## 멀티 이진 분류

다시 멀티 레이블 문제로 돌아와서, 이진 분류를 문제에 어떻게 적용할까요? 매우 간단합니다. n개의 항목을 갖는 분류 문제에 대해서는 신경망의 마지막 계층에 n개의 노드를 주고 모두 시그모이드 함수를 적용하면 됩니다. 그럼 하나의 모델로 여러 개의 이진 분류 작업을 수행할 수 있습니다.

![멀티 이진분류 모델 신경망 구조의 예](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Lii6RQWmE0eo3fdkvGo%2F-Lii6Se05RAQ9lzu-fnc%2F08-06-02.png?generation=1561994321699500\&alt=media)

그렇다면 최종 손실 함수는 다음과 같을 것입니다.

$$\begin{gathered} \mathcal{L}=\sum_{i=1}^n{\text{BCELoss}(\hat{y}_i,y_i)} \\ \text{where }\text{BCELoss}(\hat{y}_i,y_i)=-\big(y_i\times\log{\hat{y}_i}+(1-y_i)\times\log{(1-\hat{y}_i)}\big) \end{gathered}$$

## 이진 분류가 아닌 경우

우리가 분류하고자 하는 문제가 이진 문제가 아닐 경우에는 어떻게 할까요? 감성 분석을 단순히 '긍정'과 '부정'으로 나누기보다는 '중립'과 같이 더 세밀한 분류가 필요할 수도 있습니다. 게다가 다음과 같이 사용자가 언급하지 않은 항목에 대해서는 '긍정'과 '부정'을 레이블링할 수도 없을 것입니다.

| 문장                         | 품질 | 배송 | 가격 |
| -------------------------- | -- | -- | -- |
| 상품 품질은 참 좋은데, 배송이 너무 느리네요. | 상  | 하  | 중  |
| 가격도 싸고, 품질도 너무 만족스럽네요!     | 상  | 중  | 상  |

이때는 어쩔 수 없이 여러 개의 softmax 계층이 필요할 것입니다. 만약 '상·중·하' 3개의 레이블만 존재한다면 3개의 노드를 갖는 계층이 필요하겠지요. 그런데 해당 softmax 계층이 n 개의 항목에 대해 각각 필요할 겁니다. 다음의 그림은 각각의 서로 다른 레이블에 대해서 각각 분류를 수행하기 위해 n개의 softmax 계층이 적용된 신경망의 예입니다.

![이진 분류가 아닌 경우에 대한 멀티 레이블 분류 신경망 구조의 예](https://2195376183-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LFzjkZt6ljMBd4YGVCn%2F-Lii6RQWmE0eo3fdkvGo%2F-Lii6Se488q84bKkGgnj%2F08-06-03.png?generation=1561994322076617\&alt=media)

그러면 최종적인 손실 함수는 다음과 같을 것입니다.

$$\begin{gathered} \mathcal{L}=\sum_{i=1}^n{\text{CrossEntropy}(\hat{y}_i,y_i)} \\ \text{where }\hat{y}_i\in\mathbb{R}^3,y_i\in\{0,1\}^3\text{ and }|y_i|=1. \\ \begin{aligned} \text{CrossEntropy}(\hat{y}i,y_i)&=-y_i\times\log{\hat{y}_i} \\ &=-\sum_{j=1}^3{y_{i,j}\times\log{\hat{y}_{i,j}}} \end{aligned} \\ \end{gathered}$$

이와 같이 우리는 하나의 신경망 모델로 여러 항목에 대해 분류를 진행할 수 있습니다.
