6. 자연어 처리와 언어 데이터¶
이 장의 질문¶
문장을 신경망이 계산할 수 있는 값으로 어떻게 바꾸고, 그 순서를 어떻게 처리할까?
자연어 처리(Natural Language Processing, NLP)는 컴퓨터로 사람의 언어를 분석하거나 생성하는 분야다. 문장을 토큰의 수열로 바꾸는 과정부터 순환 신경망(RNN), 시퀀스-투-시퀀스(seq2seq), 어텐션으로 이어지는 흐름을 살펴본다.
이 장을 마치면 다음을 설명할 수 있어야 한다.
- 말뭉치(corpus), 토큰, 어휘(vocabulary), 토큰 ID, 임베딩의 관계
- 분류, 시퀀스 레이블링, 번역, 언어 모델링이 서로 다른 출력 문제인 이유
- RNN이 과거 정보를 은닉 상태에 담는 방식
- 고정 길이 문맥 벡터가 긴 수열에서 병목이 되는 이유
읽기 수준과 선수지식 확인
읽기 전에 확인할 내용¶
다음 용어가 문장에서 어떤 역할을 하는지 알면 이 장을 읽을 수 있다.
- 범주형 변수와 벡터
- 시퀀스와 순서
- 조건부확률 \(p(y \mid x)\)
- 분류와 다음 단계 예측
- 행렬의 행과 열, 벡터 내적
1. 언어를 데이터 단위로 나누기¶
연구자가 모은 전체 텍스트 집합을 말뭉치(corpus)라고 한다. 말뭉치에는 여러 문서(document)가 있고, 문서는 문장과 더 작은 단위로 나눌 수 있다. 신경망이 직접 처리하는 가장 기본적인 단위를 토큰이라고 한다.
토큰은 반드시 단어 하나와 같지 않다.
- 단어 토큰화는 문장을 단어 단위로 나눈다. 직관적이지만 새로운 단어와 활용형을 처리하기 어렵다.
- 문자 토큰화는 글자 단위로 나눈다. 미등록 단어 문제는 줄지만 수열이 길어진다.
- 부분단어 토큰화는 자주 등장하는 문자열은 하나로, 드문 문자열은 여러 조각으로 나눈다. 현대 언어 모델에서 널리 쓰이는 절충안이다.
예를 들어 딥러닝을 공부한다는 공백 기준 단어 토큰화에서는 딥러닝을, 공부한다의 두 토큰으로 나뉜다. 부분단어 수준에서는 딥, 러닝, 을처럼 더 잘게 나뉠 수 있다. 정확한 분할은 토크나이저가 사용하는 규칙과 어휘에 따라 달라진다.
어휘와 토큰 ID¶
어휘(vocabulary)는 모델이 구분하는 토큰의 목록이다. 토크나이저(tokenizer)는 각 토큰을 어휘 목록의 정수 색인(index)인 토큰 ID로 바꾼다. 이 정수는 크기나 거리를 의미하지 않는다. ID 200이 ID 100보다 두 배 큰 개념이라는 뜻이 아니다.
토크나이저는 단순한 전처리 부품이 아니다. 어떤 정보를 보존하는지, 수열이 얼마나 길어지는지, 희귀한 이름과 과학 기호를 어떻게 나누는지에 영향을 준다. 전문 분야 말뭉치에서는 일반 토크나이저가 화학식이나 재료명을 지나치게 잘게 나눌 수도 있다.
2. 정수 ID를 벡터로 바꾸기¶
신경망은 토큰 ID 자체보다 연속적인 벡터를 입력으로 사용한다. 가장 직접적인 표현은 어휘 크기만큼 긴 원-핫 벡터다. 해당 토큰 위치만 1이고 나머지는 0이다. 그러나 어휘가 크면 매우 길고 희소하며, 토큰 사이의 유사성을 나타내지 못한다.
임베딩은 각 토큰에 학습 가능한 조밀한 벡터를 대응시킨다. 임베딩 행렬을 \(E\), 토큰 ID를 \(i\)라 하면 해당 토큰의 표현은 행 \(E_i\)를 선택한 것으로 볼 수 있다.
비슷한 맥락에서 쓰이는 토큰이 학습을 통해 비슷한 벡터를 가질 수 있다는 점이 핵심이다. 다만 벡터가 가까우면 언제나 사람의 의미 판단과 일치한다는 보장은 없다. 학습 말뭉치의 편향과 목적 함수가 임베딩에도 반영된다.
정적 임베딩과 문맥형 임베딩¶
Word2Vec 같은 정적 임베딩은 같은 토큰에 항상 같은 벡터를 준다. 따라서 눈이 내린다와 사람의 눈에서 눈의 표현이 같다. 문맥형 임베딩은 주변 토큰을 함께 보고 같은 토큰에도 문맥에 따라 다른 표현을 만든다. 7장의 트랜스포머는 문맥형 표현을 만드는 대표적인 구조다.
핵심 흐름 펼쳐보기: 배치, 언어 과제, 순환 신경망
3. 길이가 다른 문장을 배치로 만들기¶
문장은 길이가 서로 다르다. 여러 문장을 하나의 배치 텐서로 묶으려면 보통 다음 처리가 필요하다.
- 패딩은 짧은 수열 뒤에 특별한 패딩 토큰을 붙여 길이를 맞춘다.
- 잘라내기는 최대 길이를 넘는 수열 일부를 자른다.
- 마스크는 패딩처럼 계산에서 제외해야 할 위치를 모델에 알려준다.
잘라내기는 단순한 메모리 설정이 아니다. 중요한 정보가 문서 뒤쪽에 있다면 입력을 자르는 정책이 성능과 해석을 바꾼다. 마스크를 잘못 적용하면 모델이 실제 문장 대신 패딩 위치까지 참고한다.
4. 같은 텍스트라도 출력 문제는 다르다¶
NLP는 하나의 과제가 아니라 여러 예측 문제의 모음이다.
- 텍스트 분류는 문서나 문장 전체에 하나의 레이블을 예측한다. 감성 분류와 문서 주제 분류가 예다.
- 시퀀스 레이블링은 각 토큰에 레이블을 예측한다. 품사 태깅과 개체명 인식이 예다.
- 시퀀스-투-시퀀스는 입력 수열로부터 다른 수열을 만든다. 번역과 요약이 예다.
- 언어 모델링은 주어진 문맥에서 토큰의 확률을 학습한다.
자기회귀 언어 모형은 앞의 토큰 \(x_{<t}\)가 주어졌을 때 다음 토큰의 조건부 확률을 학습한다.
이 분해는 문장을 한 번에 외우는 대신, 지금까지의 문맥으로 다음 토큰을 예측하는 문제로 바꾼다. 다음 토큰을 하나 고르는 규칙까지 포함해야 실제 생성이 되며, 가장 확률이 높은 토큰만 고르는 방식과 확률적으로 샘플링하는 방식은 서로 다른 결과를 낸다.
신경망 이전의 기준 모델¶
단어 주머니와 TF-IDF는 문서에 어떤 단어가 얼마나 나타나는지를 나타내는 특성 표현이다. 언어 모델 자체는 아니며, 선형 분류기 같은 모델과 결합하면 강력한 기준 모델이 될 수 있지만 일반적으로 단어 순서를 직접 표현하지 않는다. 이 가운데 n-그램 언어 모형은 바로 앞의 제한된 토큰들을 조건으로 다음 토큰을 추정하는 언어 모델이다. 이 방법들은 단순하기 때문에 실패 원인을 분석하기 쉽고, 신경망 모델의 개선이 실제로 필요한지 확인하는 비교 기준이 된다.
5. 순환 신경망은 순서를 어떻게 처리하는가¶
피드포워드 신경망은 고정된 입력을 한 번에 처리한다. 반면 순환 신경망(RNN)은 수열을 왼쪽에서 오른쪽으로 읽으며 이전 정보를 은닉 상태에 누적한다.
\(x_t\)는 현재 토큰의 임베딩, \(h_{t-1}\)은 이전 단계까지의 요약, \(h_t\)는 갱신된 은닉 상태다. 같은 갱신 함수를 모든 시점에 공유하므로 길이가 달라도 같은 원리로 처리할 수 있다.
그러나 긴 수열에서는 먼 시점의 정보를 은닉 상태에 유지하기 어렵고, 시간 순서대로 계산해야 해서 병렬화가 제한된다. LSTM과 GRU는 정보를 보존하거나 버리는 게이트를 도입해 기본 RNN의 장기 의존성 문제를 완화한다. 이를 완전히 없애는 것은 아니다.
양방향 RNN은 왼쪽과 오른쪽 문맥을 모두 본다. 전체 입력이 이미 주어진 분류나 레이블링에는 유용하지만, 미래 토큰을 볼 수 없어야 하는 자기회귀 생성에는 그대로 사용할 수 없다.
6. 인코더와 디코더로 시퀀스를 변환하기¶
번역처럼 입력과 출력의 길이가 다른 문제에서는 인코더-디코더 구조를 사용할 수 있다. 인코더 RNN은 입력 문장을 읽어 문맥 벡터를 만들고, 디코더 RNN은 그 벡터를 바탕으로 출력 토큰을 하나씩 생성한다.
학습 중에는 디코더의 이전 입력으로 실제 정답 토큰을 넣는 교사 강요를 사용할 수 있다. 추론 중에는 실제 정답이 없으므로 모델이 직전에 생성한 토큰을 다시 입력해야 한다. 이 차이 때문에 학습 중에는 잘 작동하던 모델이 생성 중 누적 오류를 겪을 수 있다.
초기 시퀀스-투-시퀀스 모형에서는 입력 전체를 하나의 고정 길이 벡터에 압축했다. 짧은 문장에서는 가능하지만 긴 문장의 모든 관계를 한 벡터에 보존하기 어렵다. 번역할 출력 단어마다 참고해야 하는 입력 위치도 다르다. 바로 이 병목이 다음 장의 질문을 만든다.
디코더가 매 시점마다 인코더의 모든 위치를 살펴보고, 지금 필요한 입력에 더 큰 가중치를 줄 수는 없는가?
이 장에서 기억할 내용¶
꼭 이해할 내용¶
- 원문에서 토큰, ID, 임베딩 텐서로 이어지는 변환
- 토크나이저 선택이 어휘와 시퀀스 길이에 미치는 영향
- NLP 과제마다 출력 단위와 학습 목표가 다르다는 사실
- RNN 은닉 상태와 시퀀스-투-시퀀스 모형의 고정 문맥 병목
다음 공부를 위해 알아둘 내용¶
- 단어 주머니, TF-IDF, n-그램
- Word2Vec의 CBOW와 스킵그램(Skip-gram)
- 바이트 쌍 인코딩(BPE), WordPiece
- LSTM, GRU, 양방향 모형
- 교사 강요
- 가린 토큰 예측과 다음 토큰 예측
세부 알고리즘을 모두 유도할 필요는 없다. 어떤 문제를 해결하기 위해 등장했고, 입력과 출력이 무엇인지 말할 수 있으면 된다.
자주 하는 혼동과 한계
자주 생기는 혼동과 한계¶
토큰은 단어와 같지 않다
하나의 단어가 여러 부분단어 토큰으로 나뉠 수 있고, 공백이나 문장 부호가 독립 토큰이 될 수도 있다. 토큰 수와 단어 수를 같은 것으로 해석하면 안 된다.
토큰 ID에는 순서나 의미 거리가 없다
정수 ID는 어휘에서 토큰을 찾기 위한 색인다. 의미적 관계는 임베딩과 이후 문맥 처리에서 학습된다.
언어 모형은 사실 데이터베이스가 아니다
다음 토큰의 조건부 분포를 학습했다는 사실만으로 사실성, 최신성, 출처 추적이 보장되지는 않는다.
- 말뭉치의 표본 편향과 중복은 모델의 표현과 평가에 영향을 준다.
- 무작위 훈련/테스트 분할은 같은 문서의 중복이나 가까운 문장이 양쪽에 들어가는 누출을 만들 수 있다.
- 긴 입력을 자르면 과제에 필요한 근거가 사라질 수 있다.
- 같은 정확도라도 희귀 범주, 고유명사, 전문 용어에서 실패 양상이 다를 수 있다.
다섯 질문으로 다시 보기¶
- 입력과 출력: 토큰 ID 수열을 받아 문장 레이블, 토큰 레이블 또는 다음 토큰 분포를 출력한다.
- 구조적 가정: 토큰의 순서와 주변 문맥이 중요하다.
- 표현: 이산 토큰을 임베딩으로 바꾸고 수열 문맥을 은닉 상태나 문맥형 벡터에 담는다.
- 학습 신호: 과제 레이블, 다음 토큰 또는 가려진 토큰이 정답이 될 수 있다.
- 기준 모델: 최빈 범주, TF-IDF와 선형 분류기, n-그램 모델처럼 단순한 기준을 먼저 둔다.
- 평가와 변화: 문서 출처, 시간, 도메인, 언어가 달라졌을 때도 성능이 유지되는지 확인한다.
앞뒤 장과의 연결¶
7장에서는 입력 전체를 하나의 고정 벡터로 압축하지 않고, 현재 출력에 필요한 위치를 직접 선택하는 어텐션을 다룬다. 토큰화와 임베딩은 그대로 유지되지만, 수열의 관계를 모으는 방식이 RNN의 순환에서 자기 어텐션으로 바뀐다.
스스로 확인하기¶
- 토큰 ID와 임베딩 벡터는 각각 어떤 정보를 담는가?
- 텍스트 분류, 시퀀스 레이블링, 언어 모델링은 출력 단위가 어떻게 다른가?
- 정적 임베딩과 문맥형 임베딩은 같은 토큰을 어떻게 다르게 표현하는가?
- RNN 인코더의 고정 문맥 벡터가 어텐션의 필요성으로 이어지는 이유는 무엇인가?
더 읽을 자료¶
- Mikolov et al., Efficient Estimation of Word Representations in Vector Space, 2013. Word2Vec의 대표 1차 자료
- Sennrich, Haddow, and Birch, Neural Machine Translation of Rare Words with Subword Units, 2016. BPE 기반 부분단어를 번역에 적용한 논문
- Hochreiter and Schmidhuber, Long Short-Term Memory, 1997. LSTM 원 논문
- Sutskever, Vinyals, and Le, Sequence to Sequence Learning with Neural Networks, 2014. 초기 신경망 시퀀스-투-시퀀스의 대표 논문
- Jurafsky and Martin, Speech and Language Processing. NLP 개념을 더 넓게 연결하는 공개 교재 초안