Devendency

person

(테스트) 자연어 처리

딥러닝 이전에도 자연어 처리를 이용해서 기계 번역, 텍스트 요약 등의 작업이 이루어졌습니다.

그리고 기계 번역 등의 작업에서 학습된 모델의 성능을 판탄하기 위해 BLEU(Bilingual Evaluation Understudy) 같은 번역 정확도 지표를 사용해서 평가하는 흐름이 일반적이었습니다.

자연어 처리와 딥러닝

2000년대 이후, 자연어 처리 분야에서 딥러닝을 활용한 연구들이 시작되었습니다.

이때 처음으로 영향을 끼친 기술이 Word2Vec 기술입니다. Word2Vec은 단어를 벡터로 변환하는 방식으로, 대규모 텍스트 데이터를 학습하여 단어 의미를 수치적으로 표현합니다.

이때 모델은 언어학적 지식이나 규칙을 학습한 것이 아니라, 그 다음에 나올 단어를 확률적으로 계속 붙여나갑니다.

딥러닝 이전에는 자연어 처리를 위해 전체 문제를 여러 하위 작업으로 나누어 각각 독립적으로 해결하는 방식이 일반적이었습니다. 예를 들어 기계 번역 작업은 형태소 분석(단어 분리), 단어 정렬, 언어 모델, 번역 모델, 디코더 등 여러 구성 요소로 나뉘어 있었고, 각각을 따로 설계하고 처리하는 접근이 사용되었습니다.

딥러닝에서는 원본 문장을 입력하면 번역 문장이 바로 출력되는 하나의 단일 신경망 모델로 통합되었습니다. 이처럼 작업이나 모델을 여러 단계로 나누지 않고, 최종 목표에 해당하는 입력과 출력 데이터를 그대로 사용하여 전체 모델을 한번에 학습하는 end-to-end 학습을 사용합니다.

자연어 처리 방식의 변화: end-to-end -> 기반 모델 -> 문맥 기반 학습

기반 모델

기반 모델은 말 그대로 어떤 작업에서든 사용되는 기반이 되는 부분만 가지고 있는 토대가 되는 모델입니다.

댓글을 긍정/부정으로 분류하는 모델을 만들고 싶다면, 기반 모델을 가져와 긍정/부정 데이터만 추가해서 사용하면 되는 것이고,

영어를 한국어로 번역해야 한다면, 한국어로 매핑되는 데이터만 추가해서 사용할 수 있는 것입니다.

기반 모델을 특정 작업에 맞게 추가 학습시키는 것을 파인튜닝(Fine-tuning) 이라고 합니다.

문맥 기반 학습

문맥 기반 학습은 모델이 학습된 파라미터를 변경하지 않고 입력된 텍스트(문맥, 프롬프트 등) 안의 예시나 지침만 변경하여 새로운 문제를 해결하는 방식입니다.

예시

1 + 3 = 4
2 + 5 = 7
1 + 5 = ?
모델: 1 + 5 = 6

이런 것처럼 문맥 안에서 주어진 패턴을 파악하여 새로운 문제를 적용하는 것을 문맥 기반 학습이라고 합니다.

문자와 문자 코드

문자 코드

컴퓨터는 기본적으로 숫자만 다룰 수 있습니다. 그러기에 문자, 이모티콘 등을 숫자로 나타내어 표현하기 위해서 사용하는 것을 문자 코드(문자 인코딩)이라고 합니다.

현재는 유니코드(UTF-8)가 주로 사용되며, 다양한 인코딩 방식들이 있습니다.

EUC-KR, ISO-2022-KR 등

유니코드

유니코드(unicode)는 전 세계 다양한 문자를 통일된 방식으로 표현하려고 만든 규격입니다. 2023년 기준으로 유니코드 15.1에는 이모지를 포함하여 총 14만 9813자 포함되어 있습니다. 이젠 사용되지 않는 문자도 많이 포함되어 있습니다.

UTF-8, UTF-16 등은 유니코드 문자 세트를 컴퓨터에서 나타내기 위해서 만들어진 문자 인코딩으로, 대표적인 UTF-8은 유니코드 문자 세트를 8비트(1바이트) 단위로 인코딩하는 문자 코드입니다.

주로 사용하는 영어나 숫자는 1바이트, 아랍 문자, 힌디어 등은 2바이트로 인코딩됩니다. 한자나 한글 등은 보통 3바이트로 표현되며, 흔히 사용되지 않는 언어 문자나 이모지는 최대 4바이트로 표현됩니다.

ChatGPT가 다양한 언어로 자연스럽게 대화할 수 있는 것도 여러 언어의 학습 데이터를 통합하여 하나의 언어 모델로 학습했기 때문입니다. 언어마다 독립적인 인코딩 방식이 사용되었다면 하나의 모델로 통합하는 것이 사실상 불가능했을 것입니다.

단어와 토큰

컴퓨터는 단순히 문장을 단어 단위로 나누어 처리하지 않습니다. 방식에 따라 다른 장단점들이 있습니다. 현재 자연어 처리에서는 토큰 기반 분할 방식이 주로 사용되고 있습니다.

컴퓨터는 문장을 이해하기 위해서 문장을 작고 처리 가능한 단위로 분해하는 작업을 합니다. 과거 자연어 처리에서는 문장을 문자 단위나 단어 단위로 나누는 방식이 일반적이었습니다. 최근에는 효율성과 정확도를 위해서 문자와 단어의 중간 단위인 서브워드(subword) 기반 분할이 주로 사용됩니다.

이러한 식으로 분할 단위가 하나로 고정되어 있지 않으며, 이러한 단위를 일반적으로 토큰이라고 합니다. 그리고 특정 기준으로 문장을 토큰으로 변환하는 행위, 혹은 이를 수행하는 도구를 토그나이저(Tokenizer)라고 합니다.

단어 단위 분할

기존 자연어 처리에서는 단어 단위로 문장을 분할하는 방식이 일반적이었습니다.

영어 같은 외국어는 단어 사이에 공백이 있어 비교적 쉽게 분할이 가능하지만, 한국어는 띄어쓰기가 있어도 조사, 어미 결합과 합성어 때문에 공백문으로 정확하게 분할하기 어렵습니다. 그래서 형태소 분석기를 사용하여 어절을 형태소(어간, 조사, 어미 등) 단위로 분해하고 품사를 부착하는 과정이 필요합니다.

단어 단위로 문장을 분할하는 방식에는 몇 가지 근본적인 문제가 있습니다. 예를 들어 'White House'는 일반적으로 미국 대통령 관저를 의미하지만, 글자 그대로 분해하면 '하얀 집'이 되어버립니다.

다음 문제는 미지의 단어에 대한 대응입니다. 형태소 분석기는 사전 기반의 방식이라서, 사전에 없는 단어는 올바르게 분할할 수 없습니다.

또한 단어 분할 방식은 언어마다 특성이 다르기에 언어마다 단어 분할을 수행해야 해서 정확도가 충분히 높지 않다는 문제가 있습니다.

문자 단위 분할

단어 단위 분할 방식과 다르게 언어에 구애받지 않는 단순한 처리 방식이라는 장점이 있지만, 문자 종류가 지나치게 많다는 점과 새로운 문자에 대응하기 어렵다는 과제가 있습니다. 현재 유니코드에는 약 15만 자가 등록되어 있으며, 버전이 업데이트될 때마다 이수는 계속 증가하고 있습니다. 또 문자를 기준으로 분할할 경우 단위기 지나치게 세분화되어 당시 자연어 처리 기법으로는 의미를 효과적으로 다루기 어려웠다는 한계도 있습니다.

서브워드

딥러닝의 발전으로 하나의 언어 모델이 여러 언어를 동시에 처리할 수 있을 만큼 정확도가 향상되면서 기존 언어에 의존적인 단어 단위 분할 방식은 오히려 비효율적인 방식이 되었습니다. 이에 따라 언어에 구애받지 않는 분할 단위로, 문자와 단어 중간 형태인 서브워드(subword)를 사용하기 시작했습니다.

서브워드는 단어를 더 작은 부분 문자열 단위로 분할하기 때문에 영어 단어라고 해서 반드시 하나의 토큰으로 처리되지 않습니다. 예를 들어 'rainbow'는 'rain'과 'bow'로 나눌 수 있습니다.

이러한 분할 규칙은 다양한 방식으로 설계할 수 있지만, 일반적으로는 문서 전체를 분할했을 때 생성되는 토큰 수와 고유한 토큰 종류수가 적을수록 효율적인 분할로 간주됩니다. 대표적으로 Byte-Pair Encoding(BPE)이나 Unigram 모델은 이러한 서브워드 분할을 결정하는 대표적인 알고리즘입니다.

Byte-Pair Encoding 방식을 사용한다면 한국어가 많이 포함된 텍스트로 토크나이저를 학습시켜서 한국어 문장을 효율적으로 표현할 수 있어 모델 정확도와 성능 향상이 기대됩니다.

서브워드 분할은 학습 텍스트의 통계적 특성을 기반으로 하므로 의미나 언어 구조에 의존하지 않고 다양한 언어가 혼합된 문서도 처리할 수 있습니다.

서브워드는 미지의 단어 문제 역시 해결할 수 있습니다. 임의의 UTF-8 문자열은 바이트 시퀀스로 변환될 수 있으며, 1바이트는 최대 256가지 값을 가지므로 이 256가지 값을 기본 토큰으로 포함시켜 두면 어떤 문장이든 토큰으로 분할할 수 있습니다. 이를 byte-fallback이라고 합니다.

전통적인 단어 분할 방식에서는 단어 수에 제한이 없다는 점이 문제였지만, 서브워드 방식에서는 토크나이저를 학습할 때 서브워드 수를 미리 정해둘 수 있어 이러한 문제를 해결할 수 있습니다.

다만 서브워드 방식에도 단점은 있습니다. 특정 언어와 작업에 한정된 상황에서는 형태소 분석 기반의 토큰 분할이 서브워드보다 더 높은 정확도를 보이는 경향이 있습니다. 이는 형태소 분석이 문장 내 의미 단위의 경계를 명확하게 제공하는 반면, 서브워드는 이 정도를 고려하지 않아 이후 처리 작업의 난이도에 영향을 줄 수 있습니다.

BPE

aaabdaaabac

BPE은 반복되는 문자 조합을 찾아서 하나의 문자로 만드는 알고리즘입니다. 예를 들어 위의 문자열 중 가장 자주 등장하는 문자열은 'aa'입니다. 이 'aa'라는 바이트의 쌍을 하나의 바이트인 'Z'로 치환해보겠습니다.

ZabdZabac Z=aa 위 문자열 중에서 가장 많이 등장하고 있는 바이트의 쌍은 'ab'입니다. 이 'ab'를 'Y'로 치환합니다.

ZYdZYac Y=ab Z=aa 가장 많이 등장하고 있는 바이트의 쌍은 'ZY'입니다. 이를 'X'로 치환합니다.

XdXac X=ZY Y=ab Z=aa 더 이상 병합할 바이트의 쌍은 없으므로 BPE는 위의 결과를 최종 결과로 하여 종료됩니다.

토크나이저의 학습

토크나이저는 텍스트를 일정한 단위인 토큰으로 분할할 뿐만 아니라, 각 토큰을 고유한 ID로 변환하거나, 반대로 토큰 ID의 시퀀스를 원래 텍스트로 복원하는 역할도 수행합니다.

오늘날에는 문자나 단어 단위보다는 통계 기반인 서브워드 분할 방식이 주로 사용되며, 어떤 서브워드 단위가 효과적인지 학습하는 과정이 바로 토크나이저 학습의 핵심입니다.

토크나이저를 학습하려면 우선 특정 언어나 도메인에 적합한 충분한 양의 텍스트 데이터를 준비해야 합니다. 그다음 주어진 알고리즘에 따라 텍스트에서 유용한 토큰을 추출하고 이를 어휘에 추가합니다.

BPE 방식으로 토크나이저를 학습하는 경우, 먼저 훈련 데이터의 모든 단어를 글자 단위로 분리하고 이를 초기 어휘로 설정합니다.

훈련 데이터에 아래와 같은 단어들이 있다고 가정합니다.

# dictionary (단어 : 등장 빈도)
low : 5, lower : 2, newest : 6, widest : 3

모든 단어를 글자 단위로 분리하면 초기 어휘는 다음과 같습니다.

# dictionary
l o w : 5,  l o w e r : 2,  n e w e s t : 6,  w i d e s t : 3

# vocabulary
l, o, w, e, r, n, s, t, i, d

이후 전체 데이터에서 가장 자주 등장하는 글자 쌍을 찾아 하나의 새로운 토큰으로 병합하고 어휘에 추가합니다. 이 과정을 미리 정해둔 횟수만큼 반복합니다.

1회 - 빈도수 9로 가장 높은 (e, s) → es 로 병합
2회 - 빈도수 9로 가장 높은 (es, t) → est 로 병합
3회 - 빈도수 7로 가장 높은 (l, o) → lo 로 병합
...

10회 반복 후 최종 결과는 다음과 같습니다.

# dictionary
low : 5,  low e r : 2,  newest : 6,  widest : 3

# vocabulary
l, o, w, e, r, n, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest

이렇게 학습된 어휘를 사용하면 학습 중에 보지 못한 단어도 처리할 수 있습니다. 예를 들어 lowest라는 단어가 처음 등장하더라도, lowest라는 이미 학습된 서브워드로 분할하여 처리할 수 있습니다. 이것이 앞서 언급한 미지의 단어 문제를 해결하는 방식입니다.

어휘 수와 토큰 수의 트레이트 오프

토크나이저의 어휘 수는 학습 전에 미리 설정해야 합니다. 어휘 수를 적절히 조정하면 언어 모델의 정확도와 성능을 높일 수 있지만, 어휘 수가 너무 많거나 너무 적을 경우 문제가 될 수 있습니다.

어휘 수토큰 수 변화단점
줄이기늘어남모델의 정확도 및 처리 속도 저하, 처리 가능한 문장 길이 감소
늘리기줄어듦모델 규모 증가, 더 많은 학습 데이터 필요

어휘를 늘리면 텍스트를 표현하는 데 필요한 토큰 수가 줄어들어 언어 모델이 처리할 수 있는 최대 토큰 수의 한도 내에서 더 많은 정보를 담을 수 있습니다. 예시로 '고등', '학교'를 분할하기보다는 '고등학교'를 하나의 토큰으로 처리하는 것이 의미 측면에서도 더 정확하게 느껴집니다.

하지만 그에 비례해서 더 많은 학습 데이터가 필요합니다. 어휘 수에 비해 데이터가 부족할 경우 모델은 다양한 어휘를 충분히 학습하지 못하게 되어 오히려 정확도가 떨어질 가능성도 있습니다.

예를 들어 '고교 야구'라는 표현을 생각해보면, '고교'와 '야구'로 나누기보다는 하나의 토큰으로 묶는 편이 더 효율적일 수 있습니다. 그러나 '고교'나 '야구'에 비해 '고교 야구'라는 전체 표현은 텍스트에 등장하는 빈도가 매우 낮습니다.

문구를 구성하는 단어 수가 늘어날수록 가능한 조합 수는 기하급수저긍로 증가하지만, 각 문구의 실제 출현 빈도는 오히려 급격히 감소합니다.

위키피디아 기사를 기준으로 모델을 학습할 경우, '고교'나 '야구'는 각각 13만 회 이상 등장하므로 자주 학습되지만, '고교 야구'는 약 400회에 불과하여 학습 기회가 매우 제한적입니다. 딥러닝 모델은 파라미터를 반복적으로 조금씩 조정하며 학습하기에 등장 빈도가 적은 어휘는 충분히 학습되지 않아 정확도에 영향을 줄 수 있습니다.

따라서 어휘 수를 늘려 긴 표현까지 하나의 토큰으로 포함하려면 그만큼 해당 표현이 충분히 등장하는 대량의 학습 데이터가 필요합니다. 이것이 바로 대규모 언어 모델이 막대한 양의 텍스트 데이터를 요구하는 주요 이유 중 하나입니다.

Word2Vec

Word2Vec은 단어 의미를 수치 벡터로 표현하는 방법입니다. 대량의 텍스트 데이터를 기반으로 학습할 수 있으며, 이 벡터 표현을 이용하여 단어 간 유사성을 수치적으로 계산할 수 있습니다.

녹차 -> 1
홍차 -> 2
자동차 -> 5

녹차와 홍차 간의 거리 = 1
자동차와 홍차 간의 거리 = 3

'개념'을 다루는 방식

뇌 연구 분야에서는 인간 뇌가 '의미'를 어떻게 처리하는지에 여러 가지 가설이 제시되어 왔습니다. 그중 하나가 할머니 세포 가설입니다. 이 가설은 자신이 할머니를 보았을 때 '할머니'라는 개념을 담당하는 특정 신경 세포(뉴런)가 활성화되며, 이것으로 뇌가 해당 인물이 할머니임을 인식한다는 내용을 담고 있습니다.

이 방식은 할머니 뿐만 아니라 다양한 사물이나 개념에도 각각 고유한 신경 세포가 대응하고 있으며, 우리가 그것을 보거나 들었을 때 해당 뉴런이 발화함으로써 뇌가 그것을 인식하게 된다는 설명으로 확장됩니다.

할머니 세포 가설은 직관적으로 이해하기 쉬운 설명이지만, 여러 가지 문제점을 가지고 있습니다.

예를 들어 처음 보는 사람이나 개념에도 특정한 신경 세포가 있는지 의문이 듭니다. TV, 스피커, 옷장 등에 각각의 고유한 신경 세포가 있어야 한다는 것도 비현실적으로 보입니다. 또 안경을 쓰거나 머리 색을 바꾼 할머니를 기존과는 다른 신경 세포가 인식해야 한다면, 동일한 인물조차 조건에 따라 전혀 다른 방식으로 처리해야 하는 문제가 발생합니다.


이에 반해 분산 표현이라는 가설도 있습니다. 예를 들어 '사과'라는 개념은 '빨간색', '둥글다' 같은 속성에 해당하는 여러 신경 세포가 동시에 발화하ㅏ고, 반대로 '파란색'이나 '네모나다' 같은 관련 없는 속성은 발화하지 않는 방식으로 인식된다고 설명합니다. 분산 표현 가설은 앞서 언급한 할머니 세포 가설의 한계를 보완합니다. 또 발화 패턴 간 유사성을 비교함으로써 개념 사이의 관계나 의미적 가까움을 표현할 수 있다는 장점도 있습니다.

Word2Vec으로 단어의 벡터 표현

단어 의미를 컴퓨터가 이해하도록 표현하는 방법은 자연어 처리 분야의 핵심 주제 중 하나이며, 다양한 방법들이 제안되어 왔습니다.

그 중 하나는 사람이 직접 구축한 대규모 단어 DB, 즉 기계가 읽을 수 있는 사전을 활용하는 방식으로, 대표적인 예로 WordNet이 있습니다.

이와는 달리 사전을 사용하지 않고 언어를 수치화하는 방식도 널리 연구되어 왔습니다. 예를 들어 토픽 모델은 언어와 문장이 어떤 숨긴 구조를 기반으로 단어를 생성한다는 가정을 한 머신러닝 기법입니다.

이후 등장한 Word2Vec은 자연어 처리 분야에 큰 전환점을 가져왔습니다. Word2Vec은 단어를 일정 차원의 벡터(10차원)로 변환하는 모델로, 의미가 비슷한 단어들이 유사한 방향의 벡터로 표현되도록 학습합니다. 그 결과 단어 의미를 계산적으로 다루는 것이 가능해졌습니다.

image

Word2Vec이 단어 의미를 파악하는 원리

Word2Vec은 이러한 단어의 사용 특성을 모델링하여 유사한 문맥에서 자주 함께 등장하는 단어일수록 서로 가까운 벡터로 학습하도록 설계되었습니다.

이렇게 학습된 Word2Vec의 벡터는 신경 과학 용어를 빌려 분산 표현이라고 합니다. 벡터의 각 요소를 뉴런의 발화 강도로 간주하면, 발화 패턴이 유사한 뉴런 집합이 벡터 공간에서 유사한 위치에 있는 벡터와 대응한다고 볼 수 있습니다. Word2Vec이 학습한 벡터는 단어 간 의미의 유사성을 수치적으로 계산할 수 있을 뿐만 아니라, 가법 구성성이라는 특성도 있는 것으로 알려져 있습니다. 이는 의미를 더하거나 뺄 수 있는 성질로, 벡터로 단어 간 관계를 표현할 수 있습니다.

image
다음 그림을 확인해보겠습니다.

'왕 = 남자 군주'이라는 관계에서 '남자'를 빼면 '?? 군주'라는 일반적인 개념이 남습니다. 여기에 '여자'를 더하면 결과적으로 '여자 군주'를 나타내는 벡터가 된다고 볼 수 있습니다. 실제로 이 방식으로 '왕 - 남자 + 여자'라는 벡터 연산을 수행하면 그와 가장 유사한 단어로 '여왕'이 상위에 등장합니다.

Windows - Microsoft + Google = Android

임베딩 벡터

Word2Vec은 단어 의미를 벡터로 표현하는 모델이었지만, 문장 분할 단위가 단어에서 토큰(서브워드)으로 바뀌면서 이 벡터 역할도 확장되어 '임베딩 벡터'로 추상화 되었습니다.

토큰 벡터는 '의미'를 나타내지 않는다

일반적인 신경망 언어 모델에서는 입력 텍스트를 토큰 단위로 분할한 후 각 토큰에 고유한 ID를 부여하고, 이 ID에 대응하는 벡터를 신경망에 입력합니다. 이 벡터가 Word2Vec처럼 토큰 의미를 타나낸다고 설명하기도 하지만, 실제로는 그렇지 않은 경우가 많습니다.

cat -> 8415 -> 0.962, -0.377 ... -> 신경망


다음은 신경망 언어 모델에서 '한글'과 '학교'가 어떻게 토큰으로 분할되는지 보여주는 예시입니다. 두 문자열 모두 앞부분에 동일한 토큰이 등장하는 것을 확인할 수 있습니다.

ED 959CEA B880
1234
ED 9599EA B590
1567

이는 문자 '한'과 '학'을 UTF-8로 인코딩했을 때 바이트 시퀀스가 각각 'ED 95 9C', 'ED 95 99'가 되며, 토큰이 이들에 공통된 앞부분 'ED 95'에 해당하기 때문입니다. 서브워드 기반의 토큰 분할에서는 텍스트를 문자보다 더 작은 단위인 바이트 수준의 부분열로 나누기 때문에 이처럼 '문자 일부'에 해당하는 토큰도 있을 수 있습니다.

각 토큰 ID는 이에 대응하는 벡터로 변환되어 신경망 언어 모델에 입력됩니다. Word2Vec에서는 단어 하나가 하나의 벡터로 표현되며 이 벡터가 곧 그 단어 의미를 나타냈습니다. 그렇다면 공통하는 앞부분 'ED 95'에 해당하는 토큰 벡터는 정말 그 토큰 의미를 담고 있을까요? 예를 들어 이 토큰은 '한', '학', '함' 등 다양한 음절에서 사용될 수 있으므로, 정확히 어떤 의미를 나타내는지 알기 힘듭니다.

즉, 신경망 언머 모델에서 토큰에 대응하는 벡터가 표현하는 것은 단순한 '의미'가 아니라 일부분을 담당하는 '역할'입니다. 즉 벡터는 모델 계산식에 입력되어 과제를 해결하는데 기여하는 역할을 합니다. 단일 토큰이 명확한 의미를 가지지 않더라도 해당 토큰과 그 뒤를 잇는 다른 토큰들이 특정한 순서로 배열되면, 그 벡터들은 트랜스포머에 입력하여 계산한 결과는 '학교'나 '한글'이라는 의미로 작동하는 표현이 될 수 있습니다.

임베딩 벡터

토큰 벡터가 '의미'를 표현하지 않는다면 신경 과학에서 유래한 '분산 표현'이라는 이름을 쓸 수 없습니다. 그 대신 임베딩 벡터라는 좀 더 추상적인 이름이 사용됩니다. 이 명칭은 수학에서 '임베딩'이라는 개념에서 유래했으며, 이는 전체 데이터를 그 구조를 유지한 채 다른 공간으로 매핑하는 작업을 의미합니다. 특히 딥러닝에서는 임베딩 벡터가 고차원의 데이터를 더 낮은 차원의 벡터 공간으로 매핑하는 역할을 합니다.

IMG_0258
위의 이미지와 같이 3만 차원의 벡터에서 의미 있는 이미지만 추출합니다. 이 의미있는 이미지 전체는 3만 차원이라는 전체 공간에 비해 매우 작은 영역만 차지합니다. 그 이유는 이 고차원 공간에서 무작위로 한 점을 선택하면, 거의 100%의 확률로 아무 의미도 없는 랜덤 노이즈 이미지일 가능성이 높기 때문입니다. 따라서 이러한 의미 있는 이미지들만 보다 작은 차원의 공간으로 매핑하면 다루기 쉽습니다.

다양한 임베딩 벡터

임베딩 벡터는 단어나 토큰뿐만 아니라 문장, 이미지, 음성 등 인간이 보고 듣는 거의 모든 종류의 데이터에 적용할 수 있습니다. 예를 들어 문장에 대해 '의미가 유사한 문장은 벡터 공간에서 가까운 위치에 놓이도록' 임베딩을 설계하면 두 문장의 유사도를 벡터 간 연산만으로 계산할 수 있습니다. OpenAI의 Embedding API는 이러한 방식의 대표적인 사례입니다.

이미지 역시 마찬가지로 임베딩 벡터로 변환할 수 있습니다. 더 나아가 문장과 이미지를 동일한 벡터 공간에 임베딩하면 원래 데이터가 문장이든 이미지든 구분하지 않고 같은 방식으로 연산할 수 있습니다. 이를 바탕으로 문장과 이미지 간 의미적 유사도를 계산할 수 있는 모델이 바로 CLIP입니다.

image
CLIP은 이미지와 그에 대응하는 캡션(이미지를 설명하는 문장) 쌍을 학습 데이터로 사용합니다. 학습 과정에서는 정답 쌍의 이미지와 캡션 벡터는 서로 가까워지도록, 정답이 아닌 쌍은 서로 멀어지도록 조정됩니다. 이처럼 학습된 CLIP 모델을 활용하면 자연어로 이미지를 검색하는 시스템을 쉽게 구축할 수 있습니다.

또 CLIP을 이용하여 이미지를 벡터화한 후 이를 신경망 언어 모델에 입력하면 이미지를 이해하고 다룰 수 있는 언어 모델을 만들 수 있습니다. 이처럼 모델이 문장, 이미지, 음성 등 다양한 형태의 데이터를 동시에 처리할 수 있는 능력을 멀티모달이라고 합니다.

출처

https://wikidocs.net/22592

댓글 0