Natural Language Processing with PyTorch
  • 소개글
  • 서문
  • Index
  • 딥러닝을 활용한 자연어 처리 개요
    • 자연어 처리란 무엇일까?
    • 딥러닝 소개
    • 왜 자연어 처리는 어려울까?
    • 무엇이 한국어 자연어 처리를 더욱 어렵게 만들까?
    • 자연어 처리의 최근 추세
  • 기초 수학
    • 서문
    • 랜덤 변수와 확률 분포
    • 쉬어가기: 몬티 홀 문제
    • 기대값과 샘플링
    • Maximum Likelihood Estimation
    • 정보 이론
    • 쉬어가기: MSE 손실 함수와 확률 분포 함수
    • 마치며
  • Hello 파이토치
    • 딥러닝을 시작하기 전에
    • 설치 방법
    • 짧은 튜토리얼
    • 쉬어가기: 윈도우즈 개발 환경 구축
  • 전처리
    • 전처리란
    • 코퍼스 수집
    • 코퍼스 정제
    • 분절
    • 병렬 코퍼스 정렬
    • 서브워드 분절
    • 분절 복원
    • 토치텍스트
  • 유사성과 모호성
    • 단어의 의미
    • One-hot 인코딩
    • 시소러스를 활용한 단어 의미 파악
    • 특징
    • 특징 추출하기: TF-IDF
    • 특징 벡터 만들기
    • 특징 유사도 구하기
    • 단어 중의성 해소
    • Selectional Preference
    • 마치며
  • 단어 임베딩
    • 들어가며
    • 차원 축소
    • 흔한 오해 1
    • Word2Vec
    • GloVe
    • Word2Vec 예제
    • 마치며
  • 시퀀스 모델링
    • 들어가며
    • Recurrent Neural Network
    • Long Short Term Memory
    • Gated Recurrent Unit
    • 그래디언트 클리핑
    • 마치며
  • 텍스트 분류
    • 들어가기
    • 나이브 베이즈를 활용하기
    • 흔한 오해 2
    • RNN을 활용하기
    • CNN을 활용하기
    • 쉬어가기: 멀티 레이블 분류
    • 마치며
  • 언어 모델링
    • 들어가며
    • n-gram
    • 언어 모델의 평가 방법
    • SRILM을 활용한 n-gram 실습
    • NNLM
    • 언어 모델의 활용
    • 마치며
  • 신경망 기계번역
    • 들어가며
    • Sequence-to-Sequence
    • Attention
    • Input Feeding
    • 자기회귀 속성과 Teacher Forcing 훈련 방법
    • 탐색(추론)
    • 성능 평가
    • 마치며
  • 신경망 기계번역 심화 주제
    • 다국어 신경망 번역
    • 단일 언어 코퍼스를 활용하기
    • 트랜스포머
    • 마치며
  • 강화학습을 활용한 자연어 생성
    • 들어가며
    • 강화학습 기초
    • 정책 기반 강화학습
    • 자연어 생성에 강화학습 적용하기
    • 강화학습을 활용한 지도학습
    • 강화학습을 활용한 비지도학습
    • 마치며
  • 듀얼리티 활용
    • 들어가며
    • 듀얼리티를 활용한 지도학습
    • 듀얼리티를 활용한 비지도학습
    • 쉬어가기: Back-translation을 재해석하기
    • 마치며
  • NMT 시스템 구축
    • 파이프라인
    • 구글의 NMT
    • 에딘버러 대학의 NMT
    • MS의 NMT
  • 전이학습
    • 전이학습이란?
    • 기존의 사전 훈련 방식
    • ELMo
    • BERT
    • GPT-2
    • XLNet
    • 마치며
  • 이 책을 마치며
  • 참고문헌
Powered by GitBook
On this page
  • 이진분류
  • 멀티 이진 분류
  • 이진 분류가 아닌 경우
  1. 텍스트 분류

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

PreviousCNN을 활용하기Next마치며

Last updated 5 years ago

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

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

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

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

문장

품질

배송

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

상

하

이진분류

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

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

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

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

BCELoss(y^,y)=−(y×log⁡y^+(1−y)×log⁡(1−y^))\text{BCELoss}(\hat{y}, y)=-\big(y\times\log{\hat{y}}+(1-y)\times\log{(1-\hat{y})}\big)BCELoss(y^​,y)=−(y×logy^​+(1−y)×log(1−y^​))

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

멀티 이진 분류

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

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

L=∑i=1nBCELoss(y^i,yi)where BCELoss(y^i,yi)=−(yi×log⁡y^i+(1−yi)×log⁡(1−y^i))\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}L=i=1∑n​BCELoss(y^​i​,yi​)where BCELoss(y^​i​,yi​)=−(yi​×logy^​i​+(1−yi​)×log(1−y^​i​))​

이진 분류가 아닌 경우

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

문장

품질

배송

가격

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

상

하

중

가격도 싸고, 품질도 너무 만족스럽네요!

상

중

상

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

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

L=∑i=1nCrossEntropy(y^i,yi)where y^i∈R3,yi∈{0,1}3 and ∣yi∣=1.CrossEntropy(y^i,yi)=−yi×log⁡y^i=−∑j=13yi,j×log⁡y^i,j\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}L=i=1∑n​CrossEntropy(y^​i​,yi​)where y^​i​∈R3,yi​∈{0,1}3 and ∣yi​∣=1.CrossEntropy(y^​i,yi​)​=−yi​×logy^​i​=−j=1∑3​yi,j​×logy^​i,j​​​

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

이진 분류 모델 신경망 구조의 예
멀티 이진분류 모델 신경망 구조의 예
이진 분류가 아닌 경우에 대한 멀티 레이블 분류 신경망 구조의 예