데이터 벡터화

벡터화(Vectorization)는 데이터 작업의 효율성을 향상시키는 과정으로, 특히 대량의 데이터 세트를 처리할 때 여러 데이터 포인트에서 동시에 작업을 수행함으로써 유용합니다. 이는 배열 프로그래밍의 기본적인 요소입니다.

전통적으로 데이터 관리 작업은 각 데이터 조각에 대해 순차적으로 작업을 수행하는 루프에 의존했으며, 이를 스칼라 컴퓨팅(Scalar Computing)이라고 합니다. 이러한 스칼라 접근 방식은 대량의 데이터를 처리할 때 느리게 작동하는 경향이 있습니다.

반면에 벡터화는 계산의 병렬 실행을 촉진합니다. 즉, 개별 데이터 포인트를 하나씩 처리하는 것이 아니라 전체 데이터 배열에 대해 동시에 작업을 수행할 수 있게 합니다. 이렇게 함으로써 벡터화는 현대 GPU의 설계를 활용하여 병렬 작업을 효율적으로 처리합니다. 파이썬의 NumPy와 같은 라이브러리는 벡터화 작업을 최적화하여 잘 활용되고 있습니다.

자연어 처리(NLP) 분야에서는 이를 단어 임베딩(Word Embeddings)이라고 부릅니다.

따라서 벡터화 또는 단어 임베딩은 텍스트 데이터를 수치 벡터로 변환하는 과정입니다. 이후 이 벡터는 다양한 기계 학습 모델을 구축하는 데 사용됩니다. 이와 같은 방식으로, 텍스트를 통해 여러 자연어 처리 모델을 구성하는 데 필요한 특성을 추출한다고 할 수 있습니다. 텍스트 데이터를 수치 벡터로 변환하는 다양한 방법이 있으며, 이에 대해서는 후속에서 논의할 것입니다.

이 과정은 컴퓨팅 파워, 특히 GPU의 지원이 필요합니다.

다양한 유형의 단어 임베딩

일반적으로 단어 임베딩은 다음 두 가지 범주로 분류할 수 있습니다.:

  • 빈도 기반 또는 통계 기반 단어 임베딩

  • 예측 기반 단어 임베딩

주로 사용되는 단어 임베딩 기술에는 다섯 가지가 있습니다.: 원-핫 인코딩(One-Hot Encoding), 카운트 벡토라이저(Count Vectorizer), 행렬 수식(Matrix Formulation), 단어 가방(Bag-of-Words, BoW), N-그램 벡토리제이션(N-grams Vectorization), 그리고 TF-IDF 벡토리제이션(TF-IDF Vectorization).

1. 원-핫 인코딩 (One-Hot Encoding, OHE)

이 기술에서는 각 고유 단어가 어휘 내에서 고유한 토큰으로 표현됩니다. 이때 단어가 존재하는 위치에는 1이 할당되고, 나머지 위치에는 0이 할당됩니다. 쉽게 말해, 원-핫 인코딩된 벡터의 표현은 1과 0으로 구성되어 있으며, 1은 단어가 존재하는 위치를 나타내고, 0은 다른 모든 위치를 의미합니다.

예를 들어, 다음 문장을 고려해 보겠습니다.:

Sentence: I am teaching NLP in Python

이 문장에서 사용할 수 있는 단어는 “NLP”, “Python”, “teaching” 등이 될 수 있습니다.

어휘 사전(Dictionary)은 문장 내의 모든 고유 단어의 목록입니다. 따라서 어휘 사전은 다음과 같이 보일 수 있습니다. -

Dictionary: [‘I’,’am’, ’teaching’,’ NLP’,’ in’, ’Python’] 

따라서 위의 사전에 따르면 이 형식의 벡터 표현은 다음과 같습니다.

Vector for NLP: [0,0,0,1,0,0] 
Vector for Python:  [0,0,0,0,0,1]

단어를 벡터 형태로 표현하는 가장 간단한 방법은 원-핫 인코딩(One-hot Encoding)입니다. 하지만 원-핫 인코딩에는 몇 가지 단점이 있습니다.

원-핫 인코딩의 단점

  1. 벡터 크기: 원-핫 인코딩의 벡터 크기는 어휘의 고유한 단어 수와 같기 때문에, 대규모 어휘를 사용하는 경우 벡터가 매우 커질 수 있습니다.

  2. 단어 간의 관계 미포착: 원-핫 인코딩은 서로 다른 단어 간의 관계를 포착하지 못합니다. 따라서 문맥에 대한 정보를 전달하지 않습니다.

2. 카운트 벡터라이저(Count Vectorizer)

카운트 벡터라이저는 텍스트 벡터화의 가장 간단한 방법 중 하나입니다. 이 방법은 문서 용어 행렬(document-term matrix)을 생성하며, 특정 단어가 문서에 나타나는지를 나타내는 더미 변수의 집합입니다.

카운트 벡터라이저는 단어 어휘를 학습하고 문서 용어 행렬을 생성하려고 시도합니다. 이 행렬에서 개별 셀은 특정 문서에서 해당 단어의 빈도를 나타내며, 이를 용어 빈도(term frequency)라고도 합니다. 행렬의 열은 말뭉치(corpus)의 각 단어에 할당됩니다.

3. 행렬 수식화(Matrix Formulation)

어떤 말뭉치(Corpus) CD개의 문서 {d1, d2, ..., dD}가 있다고 가정해 봅시다. 여기서 N개의 고유한 토큰을 추출합니다. 이제 이들 N개의 토큰으로 구성된 사전(dictionary)이 생기고, 형성된 카운트 벡터 행렬 M의 크기는 D × N이 됩니다. 이 행렬 M의 각 행은 문서 D(i)에서의 토큰 빈도를 설명합니다.

4.Bag-of-Words(BoW)

Bag-of-Words(BoW) 벡터화 기법은 텍스트 내용을 숫자 특성 벡터로 변환하는 방법입니다. BoW는 말뭉치에서 문서를 가져와 해당 문서의 각 단어를 기계 학습 모델에 대한 특성 벡터로 매핑하여 숫자 벡터로 변환합니다. 이 방식은 단어의 순서나 문맥을 무시하고 단지 단어의 존재 여부에만 집중합니다.

5. N-grams 벡터화

N-grams 벡터화 방법도 카운트 벡터라이저와 유사하게 문서 용어 행렬을 생성하며, 각 셀은 단어의 빈도를 나타냅니다. 그러나 N-grams에서는 인접한 단어들의 조합을 고려하여 길이 n인 단어 시퀀스를 생성합니다. 카운트 벡터화는 n=1인 N-grams의 특별한 경우로, 여기서 n은 1, 2, 3 등으로 증가할 수 있습니다(예: 1-gram, 2-gram 등). N-grams은 단어의 순서를 유지하면서, 단어 쌍의 맥락을 반영합니다.

6. TF-IDF 벡터화

앞서 언급한 BoW 기법은 간단하고 효과적이지만, 모든 단어를 동등하게 취급합니다. 이로 인해 자주 사용되는 단어와 드물게 사용되는 단어를 구별하지 못하는 한계가 있습니다. 이러한 문제를 해결하기 위해 TF-IDF(Term Frequency-Inverse Document Frequency)가 등장했습니다.

TF-IDF는 특정 단어가 문서와 전체 말뭉치에서 얼마나 중요한지를 측정하는 방법으로, 단어가 문서 내에서 얼마나 자주 발생하는지(단어 빈도)와 전체 문서에서의 희소성을(역 문서 빈도) 고려합니다. 이를 통해 흔히 사용되는 단어보다 특정 문서에 더 의미 있는 단어를 강조할 수 있습니다.

네트워크에서의 계산 노드

네트워크에서의 계산 노드는 파란색 사각형으로 강조 표시되어 있습니다(그림 1 참조). 이 노드는 검증 노드에서 검증된 데이터셋을 수락하여 벡터 형식으로 변환하며, 이를 통해 모델 학습을 위한 준비를 합니다.

The functionality of the computation node will do the following to produce the vector. Take the processing for Tweet for example:

특징 추출: 이 단계에서는 Bag of Words (BOW) 모델을 사용하여 Twitter 피드에서 특징을 추출합니다. 이 모델에서는 각 문서 샘플이 단어와 그 단어의 발생 빈도를 연결하여 표현됩니다. 텍스트 콘텐츠 내의 단어 순서는 중요하지 않다고 간주됩니다. BOW 특징을 얻은 후에는 Zemberek와 Lucene의 접근 방식을 사용하여 불용어 제거, 형태소 분석, 텍스트 정규화 단계를 적용합니다.

표현 및 용어 가중치 부여 (Representation and Term Weighting): 각 트윗은 VSM (벡터 공간 모델)을 사용하여 TTF 데이터셋에서 특징 벡터로 표현됩니다. VSM에서는 각 특징이 숫자를 사용하여 해당 단어의 빈도수 또는 가중치 값으로 표현됩니다. 따라서 용어 가중치는 샘플 벡터 내 각 관련 특징의 중요성을 나타내기 위해 가중치를 부여하는 중요한 단계입니다. 이 단계에서는 텍스트 분류에서 가장 일반적으로 사용되는 가중치 부여 방식인 TF-IDF (Term Frequency-Inverse Document Frequency) 방법이 사용됩니다. TF-IDF는 특정 특징에 가중치를 부여하는데, 이 가중치는 역문서 빈도와 용어 빈도 요소를 기반으로 합니다. 즉, 더 많은 트윗에 등장하는 용어는 덜 중요해지며, 따라서 가중치도 낮아집니다.

여기서 tf_ij, N, 및 n_j는 각각 다음을 나타냅니다:

  • tf_ij​: 트윗 i에서 용어 j의 원시 단어 빈도

  • N: 데이터셋 내 총 트윗 수

  • n_j: 용어 j가 등장하는 트윗 수

GPU 병렬 컴퓨팅 아키텍처 및 CUDA 프로그래밍 모델:

CUDA는 NVIDIA의 GPU 성능을 활용하여 컴퓨팅 성능을 획기적으로 향상시키는 병렬 컴퓨팅 아키텍처입니다. TESLA GPU 아키텍처의 발전 덕분에 NVIDIA는 GPU를 프로세서처럼 프로그래밍할 수 있음을 보여주었습니다. 이전에는 GPU가 주로 그래픽 응용 프로그램에 사용되었으나, CUDA 아키텍처에 대한 연구 결과 CPU보다 더 높은 성능을 발휘한다는 사실이 밝혀졌습니다. 이러한 성능 차이는 GPU 아키텍처가 그래픽 처리와 같이 높은 정도의 병렬 계산과 연산 집약적 작업을 요구하는 작업을 위해 개발되었기 때문입니다.

CPU의 흐름 제어 작업과는 달리, GPU는 데이터 처리, 이미지 처리, 3D 렌더링 및 신호 처리와 같은 반복적이고 수치 연산이 집약된 작업을 대상으로 합니다. 그림 3에서 보여주듯이, GPU의 병렬 계산 구조는 CPU의 캐시 메모리와 흐름 제어 메커니즘 대신 데이터 처리에 전념하는 많은 트랜지스터로 구성되어 있습니다. 멀티코어 GPU와 일반 용도의 멀티코어 CPU 간의 성능 차이는 두 프로세서 간의 기본 설계 차이에서 기인합니다. CPU에 비해 GPU는 더 많은 ALU(산술 논리 장치)를 포함하고 있으며, 캐시 메모리와 흐름 제어와 같은 구성 요소는 상대적으로 적습니다. 이는 병렬 산술 연산을 수행하는 데 필요한 높은 산술 연산 능력과 용량을 확보하는 데 필수적입니다.

GPU는 또한 SIMD(단일 명령어 다중 데이터) 프로그래밍을 준수하여 서로 다른 데이터 요소에 동일한 작업을 수행할 수 있게 합니다. GPU의 작은 캐시 메모리는 애플리케이션에서 요구하는 대역폭을 제어할 수 있게 하여, 동일한 메모리 영역에 있는 데이터에 접근하는 스레드가 DRAM(동적 임의 접근 메모리)으로 다시 돌아갈 필요가 없습니다. 결과적으로, 병렬화 가능한 기능이 있는 애플리케이션에서 GPU에서 실행될 때 훨씬 더 빠른 결과를 얻을 수 있습니다.

CUDA는 스레드 관리 구조가 간단하고 GPU에서 사용할 수 있는 공유 메모리 소프트웨어 덕분에 매우 유용하고 실용적입니다. 또한, CUDA는 CPU에서 작성된 C 프로그래밍 언어로 작성된 애플리케이션을 그래픽 프로세서에서 다중 스레드를 사용하여 실행할 수 있게 해주며, C 기반의 병렬 프로그래밍 언어로서의 특성을 지니고 있습니다. 이와 같은 측면에서, NVIDIA GPU와 함께하는 CUDA 프로그래밍은 비그래픽 애플리케이션을 위한 적절한 API도 제공합니다.

병렬 구현: k-NN 알고리즘은 병렬 방식으로 구현됩니다. 이를 선택한 주된 이유는 다음과 같습니다.:

• k-NN은 일반적으로 머신러닝 알고리즘 중 가장 느린 알고리즘입니다. 그렇기 때문에 텍스트 분류에서 계산 복잡도나 정확도 면에서 다른 잘 알려진 분류기(예: 결정 트리, 나이브 베이즈 등)보다 종종 더 뛰어난 성능을 보입니다.

• 다른 분류 알고리즘과 비교할 때, 이 방법은 이웃 탐색이 독립적으로 계산될 수 있으므로 병렬 모드에서 실행하는 데 더 적합합니다. 이 작업은 k-NN의 가장 시간 소모적인 부분입니다.

다른 분류기를 구현하는 것도 가능하지만, 각 알고리즘은 고유의 계산 전략을 가지며 모든 알고리즘이 동일한 병렬화 가능성을 갖고 있는 것은 아닙니다. 예를 들어, k-NN과 비교할 때, 나이브 베이즈 알고리즘을 병렬로 실행하는 것이 직렬 실행에 비해 현저한 성능 차이를 보이지 않을 수 있습니다. 따라서 본 연구에서는 텍스트 분류에서 특히 계산이 집약적으로 요구되는 지연 학습기인 k-NN 알고리즘을 선택하였습니다. 거리 계산이 k-NN 분류에서 가장 시간 소모적인 부분이므로, 우리는 거리 계산 커널을 사용하여 이 계산을 병렬로 수행하였습니다.

K-최근접 이웃 분류기 (k-NN): k-NN은 샘플 간 거리(또는 유사성)를 기반으로 하는 감독 학습 알고리즘입니다. 이 방법의 분류 과정은 시간이 많이 소요되며, 적절한 k 값을 추정하기가 어렵습니다. k-NN 분류기는 거리 함수에 따라 k개의 가장 가까운 이웃을 찾아 이 이웃들의 카테고리 가중치를 사용하여 테스트 샘플에 카테고리를 할당합니다. 거리(예: 유클리드 거리, 맨해튼 거리, 민코프스키 거리 등) 또는 유사성 함수는 다를 수 있지만, 일반적으로 유클리드 거리가 k-NN 분류기에서 가장 가까운 이웃을 결정하는 데 사용됩니다.

테스트 샘플을 d0 ​ , k개의 가장 가까운 이웃을 𝑑j ∈ 𝑘𝑘 − 𝑁𝑁(𝑑0), 그리고 카테고리 집합을 𝐶로 나타냅니다. 그러면 k개의 가장 가까운 이웃의 카테고리 가중치를 사용하여 테스트 샘플에 카테고리를 할당하는 과정은 다음의 식 (2) 및 (3)과 같이 수행됩니다.:

벡터화 과정에서는 이전에 검증된 데이터 세트가 앞서 설명한 계산 방법을 통해 벡터 형태로 변환됩니다. 이 단계에서는 상당한 계산 자원이 요구되며, 데이터의 연속적인 벡터 변환을 지원하는 기본 하드웨어로 그래픽 처리 장치(GPU)가 사용됩니다.

앞서 언급한 장에서는 계산 노드가 이러한 벡터화 작업을 수행하도록 지정되어 데이터 세트 변환 과정의 무결성과 신뢰성을 보장한다고 설명했습니다. 계산 노드는 허가된 방식으로 운영되며, 이는 정해진 하드웨어 기준을 충족하는 노드만 계산 노드로 기능할 수 있다는 것을 의미합니다. 이러한 요구 사항은 계산 요구를 충족하기 위해 필요한 성능 효율성이 보장된다는 점에서 중요합니다.

最后更新于