언어모델(Language Model)은 자연어처리 분야에서 주인공이죠. 대량의 텍스트 데이터에 대한 문장의 구조, 의미, 문맥을 완벽히 소화해내는 달인이라고 생각해요. 언어 모델은 새로운 문장을 생성하는 능력이 뛰어난데요, 가끔은 언어모델에게 배울게 많다는 생각이 들어요. 그래서 어떤 문장을 내뱉을지, 기대감이 느껴지기도 해요. 예를 들어, 텍스트 입력으로 '나는 점심에 식사를 하러 ____ ____'
라는 입력이 들어왔을 때, 언어 모델은 빈칸에 알맞은 우주로 날아갔다'
와 같은 단어를 예측해줘요! 그래서 자동 요약, 기계 번역, 검색 엔진, 문장 완성 등 다양한 분야에서 활용되고 있답니다. 언어 모델의 마법같은 힘, 정말 신기하죠!
문장을 확률로 표현하기(체인룰)
나는 오늘 점심에 밥을 먹었다"라는 문장은 공백 단위로 구분해 “나는”, “오늘”, “점심에”, “밥을”, “먹었다"라는 단어(또는 토큰)의 시퀀스에 대한 확률을 계산할 수 있습니다. 이렇게 각각의 단어가 협력해서 확률을 계산하면서 문장이 완성되는 모습, 마치 단어들의 힘을 모아 한 가지 목표를 향해 달려가는 어드벤처 같지 않나요?
P(BOS, "나는 오늘 점심에 밥을 먹었다.", EOS) = P(BOS) * P("나는" | BOS) * P("오늘" | BOS, "나는") * P("점심에" | BOS, "나는", "오늘") * P("밥을" | BOS, "나는", "오늘", "점심에") * P("먹었다." | BOS, "나는", "오늘", "점심에", "밥을") * P(EOS | BOS, "나는", "오늘", "점심에", "밥을", "먹었다.")
여기서 BOS는 문장의 시작을 나타내는 특수 토큰입니다. “나는”, “오늘”, “점심에”, “밥을”, “먹었다.“는 문장의 단어들을 의미하며, EOS는 문장의 끝을 나타내는 특수 토큰입니다. 이전 단어를 토대로 다음 단어의 확률을 예측하는 건 마치 마법사가 과거의 흔적을 참고해 미래를 예측하는 것 같아요. 이렇게 단어들의 확률을 서로 연결해가면서 계산하는 것을 ‘연쇄법칙'이라고 한답니다. 어쩌면 이게 마법 같은 과정일지도요! 두개의 단어 A, B가 주어졌을때 베이즈 정리에 따라 다음과 같이 정리할 수 있습니다.
P(A, B) = P(A|B) * P(B)
세개의 단어 A, B, C가 주어졌을때는 다음과 같이 정리할 수 있습니다.
P(A, B, C) = P(A | B, C) × P(B, C) = P(A | B, C) × P(B | C) × P(C)
N개의 단어로 구성된 문장의 확률은 체인룰로 다음과 같이 표현할 수 있어요.
P(w₁, w₂, ..., wₙ) = P(w₁) * P(w₂ | w₁) * P(w₃ | w₁, w₂) * ... * P(wₙ | w₁, w₂, ..., wₙ₋₁)
체인룰은 문장의 확률을 문장을 구성하는 단어들의 조건부 확률
의 곱으로 표현하는 규칙입니다. 따라서 위의 표현은 문장의 확률을 각 단어의 조건부 확률
의 곱으로 표현하고 있습니다. 체인룰은 문장의 구조와 문맥 파악에 유리리하고, 장기적인 의존성을 고려할 수 있는 장점이 있습니다. 반면 체인룰 방식은 문장을 단어들의 연쇄적인 조건부 확률로 분해하므로 계산량이 많아지고, 단어들의 조합이 길어졌을때 확률이 0이 되는 희소성(sparsity) 문제가 있어, 드물게 등장하는 단어들이나 단어 시퀀스의 조합에 대한 확률을 정확하게 추정하기 어려울 수 있습니다. 각 조건부 확률은 해당 단어가 이전 단어들에 얼마나 의존하는지를 나타냅니다. 구축된 언어모델은 마치 문장을 추론하는 마법사처럼, 단어들의 확률을 조합해 문장의 자연스러움을 예측해낸답니다!
문장을 확률로 표현하기(n-gram)
체인 룰 외에도 n-gram
과 같은 방식도 있습니다. n-gram은 조합하는 단어의 개수에 따라 1-gram(uni-gram), 2-gram(bi-gram), 3-gram(tri-gram)이라고 부릅니다. 물론 코퍼스가 굉장히 크다는 가정하에 4-gram 이상의 조합도 고려해볼 수 있지만, 적정한 규모의 코퍼스가 주어졌다고 했을때 3-gram을 많이 사용하고 있습니다. n-gram은 체인 룰에 비해 다음과 같은 장점이 있습니다.
- n-gram은 체인룰에 비해 계산이 빠르고 간단합니다. 체인룰은 문장의 길이에 비례하여 조건부 확률을 계산해야 하지만 n-gram 모델은 단어의 출현 빈도를 기반으로 확률을 추정해 계산이 더 효율적입니다.
- 체인룰은 많은 조건부 확률 값을 추정해야 해서 희소성 문제가 발생할 수 있지만, n-gram 모델은 고정된 개수의 단어만을 고려하기 때문에 희소성 문제가 상대적으로 덜 겪을 수가 있습니다.
하지만 n-gram 모델은 체인룰을 사용하는 언어 모델에 비해 문맥을 파악하는 능력은 약하다고 알려져 있습니다. 장기적인 의존성이나 긴 문장에서의 문맥 파악에 한계가 있을 수 있습니다. 다른말로 바꿔 말하면, n-gram 모델은 짧은 문장을 좋아해요. 긴 문장에 적용하면 조금 당황스러울 수도 있어요! 만약 “나는 아침을 먹고 학교에 갔다"라는 문장을 훈련 데이터로 사용한 결과, 다음과 같은 빈도가 나왔다고 가정해봅시다.
Count(나는) = 100
Count(아침을) = 80
Count(먹고) = 60
Count(학교에) = 200
Count(갔다) = 50
Unigram 모델 수식에 넣으면 다음과 같이 계산할 수 있습니다.
P(나는) = 100 / N
P(아침을) = 80 / N
P(먹고) = 60 / N
P(학교에) = 200 / N
P(갔다) = 50 / N
여기서 N은 훈련 데이터에 있는 총 단어 수를 나타냅니다. Bigram을 고려해 보겠습니다. 먼저 각 단어 썅(bi-gram)의 빈도를 셉니다.
Count(나는, 아침을) = 40
Count(아침을, 먹고) = 30
Count(먹고, 학교에) = 20
Count(학교에, 갔다) = 30
Bigram 모델 수식에 숫자를 넣으면 다음과 같이 계산할 수 있습니다.
P(아침을 | 나는) = Count(나는, 아침을) / Count(나는) = 40 / 100 = 0.4
P(먹고 | 아침을) = Count(아침을, 먹고) / Count(아침을) = 30 / 80 = 0.375
P(학교에 | 먹고) = Count(먹고, 학교에) / Count(먹고) = 20 / 60 = 0.333
P(갔다 | 학교에) = Count(학교에, 갔다) / Count(학교에) = 30 / 200 = 0.15
“나는” 다음에 “아침을"이 나타날 확률은 0.4이고, “아침을” 다음에 “먹고"가 나타날 확률은 0.375, “먹고” 다음에 “학교에"가 나타날 확률은 0.333, “학교에” 다음에 “갔다"가 나타날 확률은 0.15입니다. 이렇게 구한 확률을 사용하여 언어 모델을 생성하고 다양한 자연어 처리 태스크에 활용할 수 있습니다. 다음으로 tri-gram을 고려해 보겠습니다. 먼저 각 단어 쌍(tri-gram)의 빈도를 셀 수 있습니다.
Count(나는, 아침을, 먹고) = 30
Count(아침을, 먹고, 학교에) = 20
Count(먹고, 학교에, 갔다) = 30
이제 Tri-gram 모델을 사용하여 확률을 계산해봅시다. 각 단어 쌍의 확률은 해당 단어 쌍의 빈도를 이전 두 단어 쌍의 빈도로 나눈 값입니다.
P(먹고 | 나는, 아침을) = Count(나는, 아침을, 먹고) / Count(나는, 아침을) = 30 / 40 = 0.75
P(학교에 | 아침을, 먹고) = Count(아침을, 먹고, 학교에) / Count(아침을, 먹고) = 20 / 30 = 0.66
P(갔다 | 먹고, 학교에) = Count(먹고, 학교에, 갔다) / Count(먹고, 학교에) = 30 / 30 = 1
이렇게 구한 확률을 사용하여 Tri-gram 언어 모델을 만들 수 있습니다. 이처럼 n-gram 모델은 단어의 출현 빈도를 이용해 확률을 추정하므로 계산이 더 쉽고 빠르게 할 수 있답니다.
언어 모델의 학습 과정
언어 모델은 다양한 학습 방법이 있지만 일반적으로 다음과 같은 단계들을 고려할 수 있어요.
- 데이터 수집 : 학습에 사용할 대량의 텍스트 데이터를 수집할 수 있습니다. 웹크롤링을 할 수 도 있지만 공개 데이터셋을 활용할 수 도 있습니다. 다양한 방식으로 데이터를 수집합니다.
- 데이터 전처리 : 수집한 데이터를 전처리하여 모델 학습에 적합한 형태로 가공합니다. 이 단계에서 토큰화, 정제, 정규화 작업 등을 수행합니다.
- 언어 모델의 아키텍처 선택 : 언어 모델의 아키텍처를 선택합니다. BERT, T5등 다양한 아키텍처 중에서 적합한 아키텍처 모델을 선택하여 이를 초기화하고, 텐서플로우, 파이토치, Huggingface transformers 라이브러리 등을 사용하여 모델을 구현할 수 있습니다.
- 모델 학습 : 전처리된 데이터를 사용해 모델을 학습할 수 있어요. 모델 학습에는 대량의 하드웨어(GPU or TPU)가 필요할 수 있습니다. 학습 속도와 성능에 영향을 주는 하이퍼파라미터(학습률, 배치 크기, 에폭 수 등)을 조정해 모델을 학습 시키면 됩니다.
- 모델 평가 : 학습된 언어 모델을 평가를 수행합니다. 대표적인 평가 지표에는 (PPL, BLEU, ROUGE 등)을 이용할 수 있어요.
학습된 언어 모델은 다양한 자연어 처리 태스크에 활용될 수 있습니다. 이는 문장 생성, 질의 응답, 기계 번역, 챗봇, 자동 요약, 검색 엔진 개선, 문서 분류, 감성 분석, 개체명 인식 등을 포함합니다. 또한 음성 인식 시스템과 광학 문자 인식(OCR) 분야에서도 유용하게 사용될 수 있습니다. 이러한 다양한 분야에서 언어 모델은 자연어 처리 작업을 향상시키고, 응용 프로그램에 더욱 정확하고 유용한 기능을 제공할 수 있습니다.