(테스트) 자연어 처리
딥러닝 이전에도 자연어 처리를 이용해서 기계 번역, 텍스트 요약 등의 작업이 이루어졌습니다.
그리고 기계 번역 등의 작업에서 학습된 모델의 성능을 판탄하기 위해 BLEU(Bilingual Evaluation Understudy) 같은 번역 정확도 지표를 사용해서 평가하는 흐름이 일반적이었습니다.
자연어 처리와 딥러닝
2000년대 이후, 자연어 처리 분야에서 딥러닝을 활용한 연구들이 시작되었습니다.
이때 처음으로 영향을 끼친 기술이 Word2Vec 기술입니다. Word2Vec은 단어를 벡터로 변환하는 방식으로, 대규모 텍스트 데이터를 학습하여 단어 의미를 수치적으로 표현합니다.
이때 모델은 언어학적 지식이나 규칙을 학습한 것이 아니라, 그 다음에 나올 단어를 확률적으로 계속 붙여나갑니다.
딥러닝 이전에는 자연어 처리를 위해 전체 문제를 여러 하위 작업으로 나누어 각각 독립적으로 해결하는 방식이 일반적이었습니다. 예를 들어 기계 번역 작업은 형태소 분석(단어 분리), 단어 정렬, 언어 모델, 번역 모델, 디코더 등 여러 구성 요소로 나뉘어 있었고, 각각을 따로 설계하고 처리하는 접근이 사용되었습니다.
딥러닝에서는 원본 문장을 입력하면 번역 문장이 바로 출력되는 하나의 단일 신경망 모델로 통합되었습니다. 이처럼 작업이나 모델을 여러 단계로 나누지 않고, 최종 목표에 해당하는 입력과 출력 데이터를 그대로 사용하여 전체 모델을 한번에 학습하는 end-to-end 학습을 사용합니다.
자연어 처리 방식의 변화: end-to-end -> 기반 모델 -> 문맥 기반 학습
기반 모델
기반 모델은 말 그대로 어떤 작업에서든 사용되는 기반이 되는 부분만 가지고 있는 토대가 되는 모델입니다.
댓글을 긍정/부정으로 분류하는 모델을 만들고 싶다면, 기반 모델을 가져와 긍정/부정 데이터만 추가해서 사용하면 되는 것이고,
영어를 한국어로 번역해야 한다면, 한국어로 매핑되는 데이터만 추가해서 사용할 수 있는 것입니다.
파인튜닝 설명하는게 좋을 듯
문맥 기반 학습
문맥 기반 학습은 모델이 학습된 파라미터를 변경하지 않고 입력된 텍스트(문맥, 프롬프트 등) 안의 예시나 지침만 변경하여 새로운 문제를 해결하는 방식입니다.
예시
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) 기반 분할이 주로 사용됩니다.