해당 포스팅은 '파이토치로 배우는 자연어 처리(Natural Language Processing with PyTorch)'를 참고하여 정리한 글입니다.
NLP (Natural language processing)
NLP는 언어학 지식에 상관없이 텍스트를 이해하는 통계적인 방법을 사용해 실전 문제를 해결하는 일련의 기술입니다.
텍스트의 이해는 주로 텍스트를 계산 가능한 표현으로 변환함으로써 이루어지고,
이 표현은 벡터, 텐서, 그래프, 트리같이 이산적이거나 연속적으로 조합한 구조입니다.
딥러닝
- 계산 그래프(computational graph)와 수치 최적화 기술을 사용해 데이터에서 표현을 효과적으로 학습하는 기술
파이토치
- 딥러닝 알고리즘을 구현하는 파이썬 기반의 계산 그래프 프레임워크
지도 학습
머신러닝에서 지도 또는 지도 학습은 샘플(observation)에 대응하는 target(예측하는 값)의 정답을 제공하는 방식을 말합니다.
용어
- 샘플
- \(x\) : 예측에 사용하는 아이템
- 입력(input)
- 타깃
- \(y\) : 예측되는 대상
- 샘플에 상응하는 레이블(label)
- 정답(ground truth)
- 모델
- 수학식이나 샘플 \(x\)를 받아 타깃 레이블 값을 예측하는 함수
- 파라미터
- \(w\) : 가중치(weight)
- 파라미터가 모델을 규정
- 예측
- 모델이 추측하는 타깃 값
- 예측(prediction), 추정(estimate)라고 함
- \(y\)의 예측은 \(\hat{y}\)으로 표기 (hat 표기를 사용해 나타냄)
- 손실 함수(loss function)
- 훈련 데이터에 대한 예측이 타깃과 얼마나 멀리 떨어져 있는지 비교하는 함수
- 타깃과 예측이 주어지면 손실 함수는 손실(loss)이라 부르는 실수 스칼라 값을 계산
- 손실이 낮을수록 타깃 예측을 더 잘하는 모델
- L로 표현
수학적으로 기술해보면
- 샘플 \(n\)개로 이루어진 데이터셋 \(D = \{X_i,y_i\}^n_{i=1}\) 가 있다고 가정
- 이런 데이터셋이 주어질 때 가중치 \(w\)를 파라미터로 받는 함수(모델) \(f\)를 학습하려 함
- 즉, 우리가 가정한 \(f\)의 구조하에서 학습된 가중치 \(w\)의 값이 모델을 완전하게 설명할 것임
- 모델은 주어진 입력 \(X\)에 대한 타깃 \(\hat{y}\)을 예측
- \(\hat{y} = f(X, w)\)
- 지도 학습에서는 훈련 샘플의 진짜 타깃 \(y\)를 앎
- 이 샘플의 손실은 \(L(y, \hat{y})\)
- 지도 학습은 샘플 \(n\)개의 전체의 누적 손실을 최소화하는 최적의 파라미터 혹은 가중치 \(w\)를 찾는 과정
(확률적) 경사 하강법을 사용한 훈련
지도 학습의 목적은 주어진 데이터셋에서 손실 함수를 최소화하는 파라미터 값을 고르는 것입니다.
데이터셋이 크면 메모리 제약 때문에 전체 데이터 셋을 사용하는 전통적인 경사 하강법을 적용하기 어렵고 계산 비용이 높아 매우 느리게 됩니다.
따라서 경사 하강법 대신 근사 버전인 확률적 경사 하강법(stochastic gradient descent(SGD))를 사용합니다.
- 확률적인 방법에서는 데이터 포인트를 하나 또는 일부 랜덤 하게 선택하여 그래디언트(gradient)를 계산
- 데이터 포인트를 하나 사용하는 방법은 순수 SGD(pure SGD)라고 부름
- 여러 개(두 개 이상) 사용하는 방법은미니 배치 SGD(minibatch SGD)라고 부름
- 순수 SGD는 업데이터에 잡음이 많아 수렴이 매우 느리므로 실전에서 거의 사용하지 않음
- 일반적인 SGD 알고리즘의 수렴 속도를 높이는 여러 가지 파생 알고리즘 몇 가지가 생김
- 역전파(backpropagation) : 파라미터를 반복적으로 업데이트하는 과정
- 역전파의 각 단계(에포크 epoch)는 정방향 계산(forward pass)과 역방향 계산(backward pass)으로 구성
- 정방향 계산은 현재 파라미터 값으로 입력을 평가하여 손실 함수를 계산
- 역방향 계산은 손실의 그래디언트를 사용하여 파라미터를 업데이트
Sample과 Target의 인코딩
샘플(텍스트)을 머신러닝 알고리즘에 사용하려면 수치로 표현해야 합니다.
인코딩이란 샘플과 타깃을 벡터나 텐서의 수치로 표현하는 것을 의미합니다.
수치 벡터는 텍스트를 표현하는 간단한 방법이고, 사실 이런 매핑이나 표현을 수행하는 방법은 수없이 많이 존재합니다.
원-핫 표현(One-hot representation)
0 벡터에서 시작해 문장이나 문서에 등장하는 단어에 상응하는 원소를 1로 설정하는 방법입니다.
- 문장을 토큰(token)으로 나누고 구두점을 무시한 다음 모두 소문자로 바꿈
- 만약 단어가 총 8개면 각 단어를 8차원 원-핫 벡터로 표현할 수 있음 (8 x 8)
- 구, 문장, 문서의 원-핫 벡터는 이를 구성하는 단어의 원-핫 표현을 단순하게 논리합(logical OR) 한 것임
- ex) [0, 0, 1, 0, 0, 0, 0, 0]
이진 인코딩
- 텍스트/구를 어휘 사전 크기의 벡터 하나로 표현
- 여기에서는 0과 1이 한 단어의 등장 여부를 나타냄
- ex ) [0, 0, 0, 1, 1, 0, 0, 1]
TF(Term-Frequency) 표현 (문서 빈도)
구, 문장, 문서의 TF 표현은 단순히 소속 단어의 원-핫 표현을 합해 만듭니다.
각 원소는 해당 단어가 문장(말뭉치)에 등장하는 횟수입니다.
- 단어 w의 TF는 TF(w)라고 표기
- 이 표현 방법을 단어 가방 모델(Bag of Words, BoW)이라고 부름
- ex) [1, 2, 2, 1, 1, 0, 0, 0]
※ NLP 분야에서는 데이터셋을 말뭉치 또는 코퍼스라고 부름.
TF-IDF(Term-Frequency-Inverse-Document-Frequency)
TF
- 등장 횟수에 비례하여 단어에 가중치를 부여
IDF (역문서 빈도, Inverse-Document-Frequency)
$$ IDF(w) = log{\frac{N}{n_w}} $$
- 벡터 표현에서 흔한 토큰의 점수를 낮추고 드문 토큰의 점수를 높임
- 희귀한 단어는 다주 나오지 않지만 문서의 특징을 잘 나타낼 수 있음
- \(n_w\) : 단어 \(w\)를 포함한 문서의 개수
- \(N\) : 전체 문서 개수
TF-IDF
$$ TF(w) * IDF(w) $$
- 모든 문서에 등장하는 (즉 \(n_w = N)\) 매우 흔한 단어는 \(IDF(w)=0\)이고 TF-IDF 점수=0 임
- 따라서 이 단어를 완전히 제외
- 반면 단어가 한 문서에만 등장하는 것처럼 아주 드물면 \(IDF = log{N}\) (최댓값)
사이킷런에서는 \(IDF(w) = log{\frac{N+1}{n_w+1}}+1\) 식을 사용
- 단어를 모두 포함한 가상의 문서가 있는 것처럼 하여 분모가 0이 되는 상황 방지
- 또한 마지막에 1을 더해 모든 문서에 포함된 단어가 있을 때 IDF가 0이 되지 않게 함
- 그러고 나서 사이킷런은 TF-IDF를 계산한 후 L2 노름으로 정규화
딥러닝의 목적은 표현 학습이므로 보통 TF-IDF와 같이 경험적인 방법으로 입력을 인코딩하지 않음
주로 정수 인덱스를 사용한 원-핫 인코딩과 특수한 임베딩 룩업(embedding lookup) 층을 신경망의 입력을 구성
타깃 인코딩
타깃 변수의 정확한 형태는 풀려는 NLP 문제에 따라 다릅니다.
예를 들면, 기계 번역, 요약, 질의응답 문제에서는 타깃도 텍스트이며 앞서 설명한 원-핫 인코딩과 같은 방식으로 인코딩합니다.
사실 많은 NLP 작업은 모델은 고정된 한 세트의 레이블 중 하나를 예측해야 하는 범주형 레이블 사용합니다.
이를 인코딩할 때는 레이블마다 고유한 인덱스를 부여하는 방법을 가장 많이 사용합니다.
하지만 이런 간단한 표현은 출력 레이블 수가 너무 커지면 문제가 될 수 있습니다.
이전에 본 단어를 입력하면 다음 단어를 예측하는 언어 모델링(language modeling)이 그런 예
- 레이블 규모가 한 언어의 전체 어휘가 된다
- 특수 문자, 이름 등을 포함하여 금방 수십만 개로 늘어날 수 있음
일부 NLP 문제는 주어진 텍스트에서 수치를 예측합니다.
이럴 때는 타깃을 범주형 구간(bin)으로 바꾸고 순서가 있는 분류 문제로 다루는 방법을 사용하고,
구간은 균등하지 않아도 되며 데이터에 따라 나눌 수 있습니다.
- 수필에 숫자 등급이나 가독성 점수를 매길 때
- 음식점 리뷰의 소수점 첫째 자리까지 평점을 예측할 때
- 트윗 문장을 보고 사용자의 연령대를 예측할 때
'Data Science > NLP' 카테고리의 다른 글
[NLP] Bag-of-Words, Classical NLP (0) | 2022.05.23 |
---|---|
[NLP] NLP briefing (0) | 2022.05.04 |
[NLP] Attention Mechanism (0) | 2022.03.28 |
[NLP] GRU (Gated Recurrent Unit) (0) | 2022.03.28 |
[NLP] LSTM (Long Short-Term Memory, 장단기 메모리) (0) | 2022.03.28 |
댓글