반응형

https://hanglestocks.tistory.com/102

 

내가 시험공부하려고 만든 자연어처리-전처리 1탄(전처리의 필요성과 텍스트전처리)

텍스트 전처리 최종 요약본1. 텍스트 전처리의 필요성: 왜 해야 하는가?가장 근본적인 이유는 사람이 사용하는 **자연어(Natural Language)**와 컴퓨터가 이해하는 **형식 언어(Formal Language)**의 차이 때

hanglestocks.tistory.com

https://hanglestocks.tistory.com/103

 

내가 시험공부하려고 만든 자연어처리-전처리 2탄(토큰화)

영어 vs 한국어 문장 나누기(토큰화) 핵심 차이점결론부터 말하면, 문장을 의미 단위로 나눌 때 영어는 '띄어쓰기'가 기준이 되는 반면, 한국어는 '형태소'가 기준이 됩니다. 그 이유는 두 언어의

hanglestocks.tistory.com

 

 

 

여기서 나는 의문이 들었다. 근데 BPE가 문자단위부터 시작하는데 근데 lover loving loves 이런 게 있으면 lo랑 lov가 빈도가 똑같고 원래 단어는 love는 빈도가 적으면 lo랑 lov가 lexicon에 들어가고 ,love는 lexicon에 안 들어가나?? 

 

love는 렉시콘(lexicon)에 들어갈 확률이 매우 높습니다.

그 이유는 BPE가 최종 단어의 빈도를 보는 것이 아니라, 매 단계에서 가장 빈번하게 등장하는 '인접한 쌍(pair)'을 탐욕적(Greedy)으로 병합하기 때문입니다.


BPE 시뮬레이션으로 이해하기

loves (5번), loving (5번), lover (5번), glove (5번) 이라는 단어들이 있다고 가정해 보겠습니다.

1단계: 초기화

모든 단어를 글자 단위로 분해합니다.

  • l, o, v, e, s
  • l, o, v, i, n, g
  • l, o, v, e, r
  • g, l, o, v, e

2단계: 첫 번째 병합

이제 가장 자주 나타나는 글자 쌍을 찾습니다.

  • (o, v) 쌍의 빈도: loves(5) + loving(5) + lover(5) + glove(5) = 20번
  • (l, o) 쌍의 빈도: loves(5) + loving(5) + lover(5) = 15번
  • (v, e) 쌍의 빈도: loves(5) + lover(5) + glove(5) = 15번

가장 빈도가 높은 (o, v) 쌍을 먼저 합쳐서 ov라는 새로운 토큰을 만듭니다.

3단계: 두 번째 병합

이제 우리의 토큰들은 l, ov, e, s / l, ov, i, n, g / l, ov, e, r / g, l, ov, e 형태가 되었습니다. 이 상태에서 다시 가장 빈번한 쌍을 찾습니다.

  • (l, ov) 쌍의 빈도: loves(5) + loving(5) + lover(5) = 15번
  • (ov, e) 쌍의 빈도: loves(5) + lover(5) + glove(5) = 15번

여기서는 빈도가 같으니, 둘 중 하나(예: l, ov)를 합쳐 lov라는 새 토큰을 만듭니다.

4. 세 번째 병합

이제 토큰들은 lov, e, s / lov, i, n, g / lov, e, r / g, l, ov, e 가 되었습니다.

  • (lov, e) 쌍의 빈도: loves(5) + lover(5) = 10번
  • (ov, e) 쌍의 빈도: glove(5) = 5번

가장 빈도가 높은 (lov, e) 쌍을 합쳐 드디어 love 라는 토큰이 만들어집니다.


결론

  • BPE는 최종 단어의 빈도를 계산하지 않습니다. love라는 단어가 한 번도 등장하지 않았더라도, l-o-v-e라는 글자 순서가 lover, loving, loves, glove 등 여러 단어에 걸쳐 자주 등장했기 때문에 (l,o) → lo, (lo,v) → lov, (lov,e) → love 순서로 병합될 가능성이 매우 큽니다.
  • 렉시콘에는 중간 산물도 포함됩니다. 이 과정에서 만들어진 ov, lov 같은 중간 토큰들도 모두 렉시콘에 포함됩니다. 따라서 최종 렉시콘에는 lo, lov, love가 모두 들어있을 수 있습니다.

 

## 토큰화 단계: 학습된 규칙을 적용하는 과정

학습을 통해 우리는 "어떤 글자 쌍을 합쳐야 하는지"에 대한 **우선순위가 정해진 레시피 북(규칙 목록)**을 가지고 있습니다. 토큰화는 이 레시피 북을 그대로 따라가는 과정입니다.

예를 들어, lowest라는 새로운 단어를 토큰화한다고 해보겠습니다.

  1. 초기 분해: 먼저, 단어를 글자 단위로 모두 쪼갭니다.
    • lowest → ['l', 'o', 'w', 'e', 's', 't', '</w>']
  2. 규칙 적용 (Greedy Search): 이제 학습된 '레시피 북'을 처음부터 끝까지 훑으면서, 현재 글자 뭉치에 적용할 수 있는 병합 규칙이 있는지 찾습니다. 가능한 한 가장 긴 토큰을 만드는 것을 목표로 합니다.
    • 1차 스캔: 레시피 북에 (e, s) → es 규칙이 있다면 적용합니다.
      • ['l', 'o', 'w', 'es', 't', '</w>']
    • 2차 스캔: 다시 레시피 북을 훑습니다. (es, t) → est 규칙이 있다면 적용합니다.
      • ['l', 'o', 'w', 'est', '</w>']
    • 3차 스캔: 또다시 훑습니다. (l, o) → lo 규칙을 적용합니다.
      • ['lo', 'w', 'est', '</w>']
    • 4차 스캔: 마지막으로 (lo, w) → low 규칙을 적용합니다.
      • ['low', 'est', '</w>']
  3. 최종 결과: 더 이상 레시피 북에 있는 규칙을 적용하여 합칠 수 있는 쌍이 없으면 토큰화를 멈춥니다.
    • lowest의 최종 토큰화 결과는 ['low', 'est', '</w>'] 가 됩니다.

## 요약: 학습 vs. 토큰화

  • 학습 (요리법 개발): 어떤 재료(글자)를 합치는 것이 최선인지, 수많은 데이터를 보고 가장 효율적인 요리법(병합 규칙)을 만드는 과정입니다. 시간과 계산이 많이 필요합니다.
  • 토큰화 (요리): 이미 만들어진 요리법을 가져와 새로운 재료(단어)에 순서대로 적용해 요리(토큰 분해)를 완성하는 과정입니다. 매우 빠릅니다.

 

BPE가 자주 쓰는 단어는 통째로 하나의 토큰으로 만들고, 드물게 쓰는 단어는 여러 개의 작은 토큰 조각으로 나눠서 표현한다는 의미예요.

결과적으로, 자주 쓰는 단어는 1개의 ID로 짧게 표현되고, 드문 단어는 여러 개의 ID로 길게 표현되는 압축 효과가 나타납니다.


## 압축적 표현의 원리: 'the' vs. 'floccinaucinihilipilification'

예를 들어, 아주 흔한 단어 **'the'**와 세상에서 가장 긴 단어 중 하나인 'floccinaucinihilipilification'(무언가를 무가치하게 여기는 습관)가 있다고 상상해 보세요.

1. 학습(Training) 단계

BPE 알고리즘이 수많은 텍스트를 학습합니다.

  • 'the'의 경우: 이 단어는 워낙 자주 등장하기 때문에, (t, h) 쌍이 합쳐져 th가 되고, 곧이어 (th, e) 쌍이 합쳐져 **'the'**라는 단어 자체가 하나의 토큰으로 어휘집(Vocabulary)에 등록될 가능성이 100%에 가깝습니다.
  • 'floccinaucinihilipilification'의 경우: 이 단어는 너무 희귀해서 학습 데이터에 아예 없거나 한두 번 나올까 말까 합니다. 따라서 (f, l), (l, o) 등 앞부분의 일부 쌍은 합쳐질 수 있어도, 단어 전체가 하나의 토큰으로 합쳐질 일은 절대 없습니다. 대신, flocci, nauci, nihili, pili, fication처럼 더 흔하게 사용되는 여러 개의 작은 조각들로 나뉘어 어휘집에 등록됩니다.

2. 토큰화(Tokenization) 단계

이제 학습된 토크나이저로 두 단어를 토큰화합니다.

  • 'the' 토큰화: 어휘집에 **'the'**가 통째로 등록되어 있으므로, 이 단어는 단 1개의 토큰으로 처리됩니다.
    • ['the'] → (예시 ID) → [252] (표현이 짧음)
  • 'floccinaucinihilipilification' 토큰화: 어휘집에 이 단어는 없지만, 단어를 구성하는 작은 조각들은 존재합니다. 따라서 여러 개의 토큰으로 분해됩니다.
    • ['flocci', 'nauci', 'ni', 'hili', 'pili', 'fication'] → (예시 ID) → [3142, 5821, 98, 721, 1344, 4520] (표현이 길어짐)

이처럼 BPE는 빈도를 기반으로 어휘집을 효율적으로 구축하기 때문에, 자주 쓰는 단어는 하나의 압축된 토큰으로 짧게 표현하고, 드물게 쓰는 단어는 이미 아는 토큰들의 조합으로 길게 풀어 설명하는 효과를 갖게 됩니다.

 

BPE의 어휘집(lexicon)은 글자, 중간 토큰, 완성된 단어 토큰까지 모두 포함하기 때문에, 단순 단어 목록보다 어휘집 자체의 크기는 오히려 더 커질 수 있습니다.

여기서 말하는 **'압축적'**이라는 표현은 어휘집 파일의 크기가 작다는 의미가 아닙니다. 바로 두 가지 다른 차원의 압축을 의미합니다.

## 1. '토큰 시퀀스 길이'의 압축

이것이 가장 직접적인 의미의 압축입니다. 토큰화가 끝난 후의 결과물 길이가 효율적으로 압축된다는 뜻입니다.

  • 자주 쓰는 단어 (the): [252] → 1개의 토큰으로 압축됨
  • 드문 단어 (antidisestablishmentarianism): [43, 91, 524, 88, ...] → N개의 토큰으로 길게 풀어냄

즉, 전체 텍스트에서 자주 나오는 부분을 짧게 표현하고(압축), 드문 부분을 길게 풀어냄(해제)으로써 전체적인 토큰 시퀀스의 정보 밀도를 높이는 것입니다.

## 2. '표현 가능성'의 압축 (⭐ 가장 중요한 의미 ⭐)

이것이 BPE의 진짜 혁신적인 부분입니다.

  • 기존 방식 (Word-based): 세상의 모든 단어를 표현하려면 어휘집에 그 모든 단어가 들어있어야 합니다. 신조어가 생길 때마다 어휘집은 무한히 커져야만 OOV(미등록 단어)를 막을 수 있습니다. 무한한 단어 → 무한한 어휘집
  • BPE 방식: BPE는 어휘집 크기를 30,000개와 같이 유한한 크기로 고정합니다. 그리고 이 유한한 개수의 '레고 블록(서브워드)' 조합을 통해 세상의 모든 단어, 심지어 미래에 생길 신조어까지도 표현해냅니다.

즉, **무한한 표현 가능성을 유한한 어휘집 안에 '압축'**해 넣은 것입니다. 어휘집의 크기를 늘리지 않고도 OOV 문제를 해결한 것, 이것이 BPE가 가진 가장 강력한 '압축적' 특성입니다.


결론적으로, BPE의 '압축'은 어휘집(사전 파일)의 물리적 크기를 줄인다는 뜻이 아니라, ① 자주 쓰는 단어의 표현 길이를 줄이고, ② 유한한 어휘집으로 무한한 단어를 표현할 수 있다는 '개념적 압축'을 의미합니다

반응형

+ Recent posts