Transformers
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조 현재는 seq2seq + attention에서는 하나의 벡터로…
2025/04/27
Jinsoolve.
Categories
Tags
4월 안에는 꼭...
About
자연어 처리(Natural Language Processing, NLP)의 하위 분야인 감성 분석(sentiment analysis)에 대해서 알아보는 장이다.
영화 리뷰를 읽고 각 리뷰가 긍정인지 부정인지 구별하는 예측기를 구축하자.
모델에 데이터를 주기 전에 모델이 잘 학습할 수 있도록 preprocessing을 해줘야 한다. 다음과 같은 개념을 알고 활용해보자.
BoW 모델을 사용하여 범주형 데이터를 수치로 변경해주겠다.
BoW의 과정은 다음과 같다.
아래의 내용들은 BoW 모델에 대한 지식들이다.
텍스트나 단어 같은 범주형 데이터는 수치 형태로 인코딩해줘야 한다. BoW(Bag-of-Word)를 사용하자.
수로 이루어진 특성 벡터로 나타냄
행: 문서 d, 열: 단어 t -> 값: 문서 d에 단어 t가 몇 개 있는가 = tf(t,d)
즉 tf(t,d)의 행렬을 생성함.
tf-idf(Term Frequency - Inverse Document Frequency)
문서마다 자주 나오는 단어는 중요하지 않을 가능성이 높다. 해당 단어의 가중치를 낮춰주자.
가중치를 낮추는 방법은 아래 처럼 를 곱해주는 것이다.
1을 더해주거나 log를 취해주는 이유는 값을 원하는 범위로 맞추고 싶기 때문이다.
원래는 정규화를 한 후에 idf를 계산해야 하지만 사이킷런의 TfidfTransformer에서는 tf-idf 자체를 L2 정규화한다.
이모티콘을 제외하고 구두점 같은 필요없는 문자를 제거해준다.
여기서는 정규표현식으로 했으나 파이썬의 HTML 파서 모델이 더 다양한 기능을 제공한다.
문서를 토큰 즉, 단어로 나누는 가장 간단한 방법은 공백이지만 너무 대충이라 다른 방법을 찾아보자.
어간 추출 방법인 Porter stemmer 알고리즘을 사용할 수 있다. nlkt라이브러리에 구현되어 있다. 어간은 핵심 단어요소로 running에서 어간은 run이 된다.
어간 추출 알고리즘은 초기 알고리즘인 Porter 말고도 발전된 Snowball, Lancaster 등이 있다.
다만 어간 추출은 약간의 오류가 있는데, thus -> thu를 추출하는 경우가 그러하다. 이러한 오류를 없애고 정확하게 추출하는 알고리즘을 표제어 추출이라고 하는데 이는 계산이 어렵고 비용이 많이 든다.
실전에서는 어간추출과 표제어추출의 성능 차이가 크지 않기 때문에 어간추출을 많이 사용한다. (한글은 조사와 어미가 발달되어 있어 표제어 추출방식이 적합하다)
문장의 구조에 중요한 역할을 하지만 의미는 크지 않는 불용어(stop-word)를 제거할 때가 있다. 예시로는 is, and, has, like가 있다. 이미 tf-idf를 통해 가중치 값이 많이 낮았지만 이를 미리 제공된 불용어 리스트를 적용시켜 해결한다.
데이터 전처리를 끝냈으니, 이제 모델링을 해보자.
이제 전처리(빈도 수 가중치 조절, 텍스트 정제, 토큰 나누기 등)을 마쳤으니 로지스틱 회귀 모델에 넣어 훈련시키자.
(각 단어의 값) -> (주로 긍정/부정 결과이더라)
NLP는 계산비용이 많고 그로 인한 하드웨어적 한계를 극복하기 위해 외부 메모리 학습(out-of-core learning)을 사용한다.
외부 메모리 학습은 작은 일괄(batch)로 분할아여 메모리에 한 번에 가져오지 않고 순차적으로 학습 시키는 과정이다.
데이터를 한 번에 가져오지 않는 만큼 tf-idf를 사용하기 위한 CountVectorizer와 TfidVectorizer를 사용할 수 없다.
대신 해시 함수를 사용하기 때문에 어휘사전이 필요 없는 HashingVectorizer를 사용한다.
모델은 확률적 경사 하강법(Stochastic Gradient Descent)를 사용한 SGDClassifier를 이용하여 데이터를 학습시켰다.
model1: 전체 데이터, GridSearch, Logistic 모델
model2: batch 데이터, SGD 모델
model1이 model2보다 계산 비용이 훨씬 높음에도 불구하고 성능 차이는 얼마나지 않는다.
online learning은 실시간으로 데이터를 작은 단위로 받아서 학습시키는 것이고
mini-batch learning은 데이터를 미니 배치로 나눠서 각 미니 배치에 대한 손실을 계산하고 이를 기반으로 가중치를 업데이트한다.
online learning보다 mini-batch가 조금 더 오래 걸리지만 성능이 좋은 걸로 알고 있다.
BoW모델을 대체할 수 있는 word2vec 모델도 있다.
word2vec은 신경망을 기반으로 한 비지도 학습 알고리즘으로 단어들간의 관계를 학습한 기법이다.
비지도 데이터에 대해서 사용한다.
예를 들면, 뉴스 기사를 읽고 스포츠, 금융, 세계 뉴스, 정치 등으로 토픽을 분류하는 작업을 말한다.
인기 있는 토픽 분류 모델링 기법인 잠재 디리클레 할당(Latent Dirichlet Allocation, LDA)를 소개하겠다.
LDA는 BoW 행렬을 문서-토픽 행력과 단어-토픽 행렬으로 분리한다. 유일한 단점은 미리 토픽 개수를 정해야 한다는 것이다.
사이킷런에 구현된 LDA를 사용하면 토픽을 구별해낼 수 있다.
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조 현재는 seq2seq + attention에서는 하나의 벡터로…
2025/04/27
언어 모델이라는 건, 사실 다음에 올 단어를 확률로 예측하는 것이다. 이러한 언어 모델들을 어떻게 발전시켜왔는 지 살펴보자. 이미 이전 포스트에서 자세히 살펴보았던 내용이다.…
2025/04/27
이전 포스트에서 RNN에서 Vanishing Gradient로 인해 장기 의존성 문제가 있다는 사실을 이야기했다. 이런 Vanishing Gradient를 해결하기 위해 크게…
2025/04/27
기존 RNN의 병목 현상을 해결하기 위해 Attention이 등장했다. Decoder에서 한 단어를 예상할 때, 해당 단어와 특별히 관련되어 있는 Encoder의 특정 단어를…
2025/04/27