콘텐츠로 이동

트랜스포머 모델 아키텍처

트랜스포머가 한국어를 분석하는 방식 — 바른의 모델 아키텍처

바른의 한국어 형태소 분석은 트랜스포머(Transformer) 기반 딥러닝 모델 위에서 동작합니다. 하나의 거대한 모델이 모든 일을 처리하는 대신, 분절을 담당하는 모델(seg-model.onnx)품사 태깅을 담당하는 모델(tag-model.onnx) 두 개를 나누어 사용합니다. 이 글은 그 두 모델이 한국어 문장을 받아 어떻게 분석 결과를 만들어내는지 설명합니다.

성능을 떠받치는 3개의 기둥

바른의 분석 성능은 다음 세 가지가 결합되어 나옵니다.

  1. 분절 모델 — 트랜스포머 인코더 기반으로, 음절(글자) 단위에 분절 레이블을 붙여 형태소 경계를 찾습니다. 분절 레이블은 모두 116개(그중 14개는 오류 탐지용)입니다.
  2. 태깅 모델 — 분절된 조각에 국립국어원 기준 47품사를 배정하는 트랜스포머 모델입니다.
  3. 형태정보를 포함한 워드 임베딩 — 표면형이 같아도 형태가 다른 단어를 각각 다른 토큰으로 임베딩해 중의성을 줄여줍니다.

이 세 기둥이 함께 작동해, 사전에 기댄 단순 매칭으로는 풀기 어려운 한국어의 활용·축약·생략과 동음이의 문제를 문맥으로 풀어냅니다.

두 개의 모델, 두 개의 역할

바른은 한국어 형태소 분석을 한 번에 풀지 않고 끊는 문제이름표를 붙이는 문제로 나눕니다.

graph TD
  IN[입력 문장] --> SEG[seg-model.onnx<br/>분절 모델];
  SEG --> TAG[tag-model.onnx<br/>품사 태깅 모델];
  TAG --> POST[후처리];
  POST --> OUT[형태소 결과];
모델 파일 시퀀스 길이 역할
분절 모델 seg-model.onnx 80자 글자 단위로 분절 레이블을 붙여 형태소 경계를 찾음
태깅 모델 tag-model.onnx 40 분절된 조각에 47품사 중 하나를 배정

분절 모델 — 글자 단위로 끊는다

분절 모델은 트랜스포머 인코더 구조로, 입력 문장을 음절(글자) 단위로 읽어 각 음절에 분절 레이블을 붙이는 음절 단위 레이블링 모델입니다. 한 번에 처리하는 시퀀스 길이는 80자(SegmentSequenceLength=80)이며, 이보다 긴 문장은 적절히 나누어 처리한 뒤 다시 합칩니다. 분절 레이블은 모두 116개이며, 그중 14개는 형태적 오류를 잡아내는 오류 탐지용 레이블입니다.

이 단계에서 어절 내부가 체언(N), 조사(J), 용언(V), 어미(E) 등의 8대 형태 단위로 구분됩니다. 예를 들어 학교에서학교/N에서/J로 나뉘는 경계가 이 단계에서 정해집니다.

태깅 모델 — 47품사를 배정한다

분절된 조각 하나하나에 품사를 붙이는 일은 태깅 모델이 맡습니다. 시퀀스 길이는 40(PosTagSequenceLength=40)이며, 출력 레이블은 49개입니다. 0~46번은 47개 품사, 47번은 공백, 48번은 패딩을 나타냅니다(MaxLabelToken=49).

가방을  →  가방/NNG + 을/JKO
먹었다  →  먹/VV + 었/EP + 다/EF

ONNX 런타임으로 추론한다

두 모델은 모두 ONNX 형식으로 저장되어 있으며, 바른은 onnxruntime_go를 통해 추론합니다.

추론 한 사이클

  1. 입력 문장을 정수 토큰 인덱스의 2차원 배열(int32)로 변환합니다.
  2. 이 배열로 텐서를 만들어 ONNX 세션에 전달합니다.
  3. 모델이 각 위치마다 레이블별 점수를 출력합니다.
  4. softmax로 확률 분포를 만든 뒤, 가장 높은 값(argmax)을 정답 레이블로 고릅니다.

softmax로 얻은 확률은 그대로 각 형태소의 probability 값(태깅 확신도)이 됩니다. 확신도가 낮은 형태소는 분석이 모호한 지점이라는 신호로 활용할 수 있습니다.

실행 환경 자동 폴백

CoreML, CUDA 등 가속 실행 프로바이더(EP)를 사용하다가 초기화에 실패하면 바른은 자동으로 CPU 추론으로 폴백합니다. 덕분에 환경이 달라도 분석이 멈추지 않습니다.

왜 트랜스포머인가

한국어는 교착어라서 하나의 어절 안에 여러 형태소가 붙고, 활용·축약·생략이 끊임없이 일어납니다. 사전에 단어를 일일이 등재하는 방식으로는 신조어나 구어체를 따라잡기 어렵습니다. 트랜스포머 모델은 문맥 전체를 보고 분절과 품사를 추론하므로, 사전에 없는 단어도 주변 문맥으로 추측해냅니다. 그 결과가 품사 태깅 99.6%, 어절 분리/복원 99.7%의 정확도입니다.

자주 묻는 질문

Q. 분절 모델과 태깅 모델을 왜 따로 두나요?

끊는 문제와 품사를 붙이는 문제는 성격이 다릅니다. 두 모델로 나누면 각 모델이 더 단순하고 명확한 문제만 풀게 되어, 전체 분석 정확도가 올라갑니다.

Q. 시퀀스 길이 80자를 넘는 긴 문장도 분석되나요?

네. 분절은 80자 단위로 나누어 처리하므로 긴 문장도 문제없이 분석합니다. 태깅 단계의 시퀀스 길이는 40입니다.

Q. GPU가 없어도 동작하나요?

네. 가속 실행 프로바이더 초기화에 실패하면 자동으로 CPU 추론으로 폴백하므로 GPU가 없는 환경에서도 동일한 분석 결과를 얻을 수 있습니다.

Q. 분절 모델은 어떤 트랜스포머 구조인가요?

분절 모델은 트랜스포머 인코더 기반으로, 음절(글자) 단위에 분절 레이블을 붙이는 음절 단위 레이블링 모델입니다. 분절 레이블은 모두 116개이며, 그중 14개는 형태적 오류를 잡아내는 오류 탐지용 레이블입니다.

Q. 바른 분석 성능을 떠받치는 핵심 요소는 무엇인가요?

분절 모델(트랜스포머 인코더, 116개 음절 단위 레이블), 태깅 모델(47품사), 그리고 형태정보를 포함한 워드 임베딩의 세 기둥이 결합되어 있습니다. 이 세 가지가 함께 한국어의 활용·축약·생략과 동음이의 중의성을 문맥으로 풀어냅니다.

도움이 되었나요?