Skip to main content

튜토리얼: CNN을 사용한 텍스트 분류

이 짧은 초급자용 동영상 튜토리얼에서는 임베딩을 활용해 합성곱 신경망(CNN)을 사용한 텍스트 분류 작업을 살펴봅니다. 이는 AI 번역 기사입니다. 오역이 있다면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15


이 영상에서는 CNN을 사용한 텍스트 분류를 소개합니다.

프로젝트

분류기를 구축하기 위한 여기에 Amazon 리뷰를 입력하세요.

텍스트 분류, 임베딩, 1D 합성곱

이 튜토리얼에서는 임베딩을 활용해 합성곱 신경망을 사용한 텍스트 분류를 살펴보겠습니다. 이미지 처리에서 소개했던 많은 개념을 텍스트에도 적용할 수 있으니, 복습이 필요하다면 합성곱 신경망을 다룬 튜토리얼 3를 참고하세요.

텍스트 처리

지금까지 텍스트를 처리하는 몇 가지 방법을 살펴봤습니다. 첫 번째는 bag-of-words로, 문서에서 각 단어가 등장하는 횟수를 세는 방식입니다. 이 방법을 적용하면 각 단어가 벡터로 표현되며, 그 벡터의 길이는 해당 문서에 등장한 단어의 수와 같습니다.

하지만 bag-of-words의 문제는 단어의 순서가 사라진다는 점입니다. 단어의 순서는 매우 중요하므로, 이를 더 잘 처리할 수 있는 방법이 있는지 살펴보겠습니다.
문자의 순서를 고려하는 또 다른 방법은 문자 인코딩입니다. 텍스트의 모든 문자를 원-핫 인코딩하고, 모든 벡터의 길이가 같도록 패딩을 추가해 고정 길이 벡터로 맞춥니다. 그러나 이 방법의 문제는 단어 전체와 공백이 매우 중요함에도 불구하고, 문자 인코딩만으로는 이를 충분히 반영하지 못한다는 점입니다.


단어 임베딩

최상의 결과를 얻으려면 문자 인코딩과 bag-of-words의 중간에 있는 방법, 즉 단어 임베딩이 필요합니다. 이를 위해 각 단어를 고정 길이의 인코딩으로 변환합니다. 이 경우 각 단어는 항상 동일한 네 개의 숫자로 매핑되며, 그 네 개의 값에 해당 단어에 대한 정보가 인코딩됩니다. 이 계산은 오토인코더에서 수행되는 방식과 유사하며, 고정 길이 배열 안에 단어의 의미를 응축해 담으려는 시도라는 점에서 같습니다.


이러한 임베딩을 학습해서 사용할 수도 있고, 미리 계산된 임베딩을 사용할 수도 있습니다. 예를 들어, GloVe는 Stanford에서 방대한 코퍼스로 학습해 만든 단어 임베딩입니다. 이 임베딩들은 매우 흥미로운 성질을 갖고 있습니다. 예컨대 king의 임베딩에서 man의 임베딩을 빼고 woman의 임베딩을 더하면, 실제로 queen의 임베딩에 가까운 결과가 나옵니다. 이는 임베딩이 단어의 의미와 관련된 의미 정보를 실제로 인코딩하고 있음을 보여줍니다.
이런 임베딩은 내려받아 우리 데이터셋에 바로 사용할 수 있습니다. 이제 임베딩을 확보했으니, 이를 신경망에서 어떻게 활용하면 될까요?

2D 합성곱 복습

기억하듯이, 합성곱은 서로 인접한 데이터 조각들 사이의 관계를 인코딩하는 데 도움이 됩니다. 텍스트의 경우에는 단어의 순서를 인코딩하고자 합니다. 1D 합성곱을 이해하려면, 이미지에 대해 수행했던 2D 합성곱을 복습하는 것이 유용합니다. 우리는 입력을 받아 픽셀 입력의 한 블록에 어떤 가중치(커널)를 곱하고, 그 가중합을 출력 이미지에 기록했습니다. 그런 다음 커널을 계속 이동시키면서 각 지점에서 가중합을 구해 나가며, 출력 이미지의 나머지 부분을 채웠습니다.

합성곱에서 출력 채널을 여러 개로 만들 수도 있습니다. 이를 위해서는 동일한 입력 이미지를 사용하되, 서로 다른 가중치 집합(서로 다른 커널)을 적용하면 됩니다. 커널을 슬라이딩하면서 각 위치에서 입력에 서��� 다른 값들을 곱하게 되므로, 결과적으로 여러 개의 출력 특성 맵(이미지)이 생성됩니다.

입력을 여러 개로 구성할 수도 있습니다. 예를 들어 입력 이미지가 세 장이라면, 서로 다른 가중치 블록(커널) 세 개를 적용한 뒤, 각 블록의 결과를 합산하여 하나의 출력을 만들 수 있습니다.

1D 합성곱

텍스트 데이터에도 같은 합성곱 직관이 적용되지만, 이제 데이터는 1차원입니다. 임베딩의 각 행을 채널이라고 부릅니다. 2차원 블록을 사용하는 대신, 채널을 따라 길이 3의 1차원 블록을 사용합니다. 블록의 각 요소에 가중치를 곱한 뒤, 그 가중합을 출력에 기록합니다. 그런 다음 이 가중합 계산을 모든 채널에 걸쳐 수행합니다.

각 채널마다 가중치를 학습합니다. 이 과정은 단어들을 더 작은 값으로 압축하면서, 단어의 쌍(바이그램)과 세 단어 묶음(트라이그램)에 대한 정보를 학습합니다.

맥스 풀링

이미지에서 픽셀 블록마다 최댓값을 취하는 맥스 풀링을 했던 것도 기억할 것입니다. 이 연산은 이미지를 축소하여 합성곱을 여러 스케일에서 적용하고 패턴을 찾을 수 있게 해줍니다. 동일한 연산을 텍스트에도 적용할 수 있습니다. 이번에는 차원이 하나뿐이며, 모든 채널에 걸쳐 이 연산을 수행합니다.

일반적으로 합성곱 다음에 풀링, 그 다음 다시 합성곱을 이어서 쌓는 형태가 흔합니다. 이렇게 하면 텍스트에서 더 장기적인 의존 관계를 찾는 데 도움이 됩니다. 이제 이것을 코드로 어떻게 구현하는지 살펴보겠습니다.

이 글은 AI가 번역한 기사입니다. 오역이 있을 수 있으니 댓글로 알려주세요. 원문 보고서는 다음 링크에서 확인할 수 있습니다: 원문 보고서 보기