조건부 랜덤 필드(CRF)란? AI에서 문맥과 라벨의 연결을 함께 보고 순서를 예측하는 방법
TL;DR
조건부 랜덤 필드(Conditional Random Field, CRF)는 주어진 입력을 조건으로 서로 연결된 출력 라벨의 확률을 모델링하는 방법입니다. 문장에 태그를 붙이는 선형 연쇄 CRF는 각 위치의 단서와 이웃 라벨의 관계를 함께 평가합니다. HMM처럼 입력의 생성 분포를 따로 모델링하지 않으며 전이 점수·전체 경로·위치별 확률과 라벨 제약을 구분해 읽습니다.
핵심 3줄 요약
- 핵심 1
라벨의 연결을 함께 봅니다. 각 단어에 어울리는 태그와 앞뒤 태그의 조합을 모아 전체 라벨열을 평가합니다. - 핵심 2
입력은 주어진 조건입니다. 문장 자체가 나올 확률보다 그 문장에 어떤 정답 라벨열이 어울리는지 학습합니다. - 핵심 3
점수와 확률은 다릅니다. 전이 가중치나 최적 경로의 점수를 그대로 정답 확률로 읽지 않습니다.
이 글에서 다룰 내용
- 조건부 랜덤 필드의 한 문장 정의
- 이름표 예시로 이해하는 문맥과 라벨 연결
- 방출 점수·전이 점수·전체 정규화의 역할
- Viterbi와 위치별 주변확률의 차이
- HMM·독립 토큰 분류·NER·CTC와의 비교
- 정답 태그와 시퀀스 경계를 점검하는 순서
- 라벨 제약·평가 단위·실시간 입력의 주의점
조건부 랜덤 필드를 한 문장으로 정의하면 무엇인가요?
조건부 랜덤 필드는 입력이 주어졌을 때 그래프로 연결된 출력 변수들의 조건부 확률분포를 표현하는 판별 모델입니다. 한국어로 조건부 무작위장이라고도 부릅니다. 여기서 조건부는 입력 문장 같은 관측을 이미 알고 있다는 뜻이며, 랜덤이라는 말이 태그를 아무렇게나 고른다는 뜻은 아닙니다.
이 글은 출력 라벨을 한 줄로 연결하는 선형 연쇄 CRF를 중심으로 설명합니다. 가장 기본적인 형태에서는 이웃한 라벨 사이의 관계를 점수에 넣습니다. CRF 전체가 반드시 이런 사슬 구조만 쓰는 것은 아니며 다른 그래프 구조에서는 계산 방법과 비용도 달라집니다.
원 논문은 관측과 라벨의 쌍으로 입력이 주어졌을 때의 라벨 분포를 학습한다고 설명합니다. 입력의 주변분포를 별도로 모델링하지 않아 단어, 글자 모양, 주변 문맥처럼 서로 겹치는 입력 단서를 함께 사용하기 편합니다.
한 줄 정리: CRF는 입력을 알고 있는 상황에서 서로 연결된 정답 라벨의 조합을 평가합니다.
쉬운 예시로 이해해 볼까요?
문서에서 조직 이름을 찾는 상황을 가정해 보겠습니다. 설명을 단순하게 하려고 서울 감자 연구소 방문이라는 표현을 네 토큰으로 나누고, 앞의 세 토큰을 하나의 가상 조직 이름으로 정합니다. 실제 모델을 실행한 결과가 아니라 라벨의 연결을 설명하기 위한 예시입니다.
BIO 방식에서는 B-ORG를 조직 이름의 시작, I-ORG를 같은 조직 이름의 내부, O를 해당 개체 밖에 있는 토큰으로 씁니다. 이 예시의 정답은 서울에 B-ORG, 감자와 연구소에 I-ORG, 방문에 O를 붙인 순서입니다.
각 토큰을 따로 분류하면 서울을 장소로 보고 연구소만 조직으로 고를 수도 있습니다. CRF는 토큰별 조직 점수와 조직의 시작 뒤에 내부 태그가 이어지는 조합의 점수를 함께 봅니다. 각 위치에서 가장 높은 점수만 고른 결과와 전체 합이 높은 경로는 다를 수 있습니다.
다만 CRF를 붙였다고 이 가상 이름을 반드시 알아보지는 않습니다. 학습 데이터의 표현과 태그가 부실하면 전체 경로도 틀립니다. 라벨 연결은 단어의 의미를 알아내는 모든 문제를 대신 해결하지 않습니다.
쉬운 예시: 단어마다 이름표를 따로 붙이기보다 이름표들이 한 조직 이름의 시작과 이어짐을 이루는지 함께 살펴봅니다.
왜 AI에서 조건부 랜덤 필드가 중요한가요?
출력 사이의 관계를 학습합니다
정보 추출에서는 앞 토큰이 조직 이름의 시작인지에 따라 다음 토큰의 라벨을 다르게 해석합니다. 선형 연쇄 CRF는 이런 연결을 전이 가중치로 표현합니다. 출력이 서로 무관하다는 가정보다 문제의 구조를 직접 반영합니다.
여러 입력 단서를 함께 씁니다
sklearn-crfsuite의 공식 예제는 현재 단어, 접미사, 대소문자 형태, 품사와 이웃 단어의 정보를 특징으로 사용합니다. 입력 특징끼리 독립이어야 한다는 조건은 없습니다. 한국어에서는 영어의 대문자 특징을 그대로 복사하기보다 조사나 형태소 등 과제에 맞는 단서를 검토합니다.
문장 전체를 기준으로 후보를 비교합니다
CRF는 입력 문장에 가능한 라벨열 전체를 기준으로 확률을 정규화합니다. 원 논문은 이를 상태별로 따로 정규화하는 MEMM과 구분합니다. 다음 선택지가 적은 상태로 확률이 치우치는 라벨 편향 문제를 다루는 설계이지만 데이터 편향까지 없애 준다는 뜻은 아닙니다.
조건부 랜덤 필드는 어떤 순서로 작동하나요?
1. 위치별 라벨 점수를 만듭니다
각 토큰의 특징과 라벨의 조합에 점수를 줍니다. 신경망과 결합하면 Bi-LSTM 같은 인코더가 입력을 읽고 위치마다 태그 점수를 만듭니다. PyTorch 예제는 이를 방출 점수로 설명합니다. 이름이 같아도 HMM의 관측 방출 확률과 그대로 같지는 않습니다.
2. 이웃 라벨의 전이 점수를 더합니다
기본 신경망 CRF에서는 앞 태그에서 다음 태그로 이어질 때의 가중치를 더합니다. 시작·종료 태그와의 연결을 포함하는 구현도 있습니다. 가중치는 음수일 수 있고 전이 행의 합이 1일 필요도 없습니다. 점수 행렬의 행과 열이 어느 방향을 뜻하는지는 구현마다 확인합니다.
3. 전체 후보로 정규화하며 학습합니다
한 라벨열의 점수를 지수화하고 모든 후보 라벨열의 지수화한 점수 합으로 나누면 그 라벨열의 조건부 확률이 됩니다. 학습에서는 정답 라벨열의 확률이 높아지도록 가중치를 조정합니다. 기본 선형 연쇄 구조는 전방 알고리즘으로 이 합을 계산하므로 모든 경로를 직접 나열하지 않습니다.
4. 가장 점수가 높은 경로를 찾습니다
예측 때는 Viterbi 알고리즘으로 전체 점수가 가장 높은 라벨열을 찾습니다. 학습에 필요한 후보 전체의 합과 예측에 필요한 최댓값은 다른 계산입니다. 같은 문장을 넣어도 전체 경로를 고르는 방식과 각 위치의 주변확률에서 가장 큰 라벨을 따로 고르는 방식은 결과가 다를 수 있습니다.
핵심 인사이트: 정규화는 후보 전체의 점수 합을, Viterbi는 가장 높은 경로를 구합니다. 합산과 경로 선택을 같은 출력으로 해석하지 않습니다.
라벨과 주요 설정은 무엇을 뜻하나요?
태그 집합과 전이 제약을 구분합니다
B-ORG·I-ORG·O 같은 태그는 사람이 정한 정답 표현입니다. 전이 가중치를 학습하는 것만으로 BIO 규칙 위반을 완전히 막지는 못합니다. 허용하지 않을 전이가 있다면 학습이나 디코딩에서 해당 제약을 명시하는지 확인합니다. 시작·종료 제약만 넣었다고 모든 BIO 규칙까지 적용되는 것은 아닙니다.
c1·c2는 특정 구현의 규제 설정입니다
sklearn-crfsuite의 c1은 L1, c2는 L2 규제의 계수입니다. 문서상 c1은 lbfgs에서, c2는 lbfgs와 l2sgd에서 지원합니다. 규제는 데이터에 지나치게 맞춘 가중치를 억제하는 데 쓰며, 최적값은 분리한 검증 데이터로 고릅니다. 다른 CRF 라이브러리에도 같은 옵션이 있다고 가정하지 않습니다.
모든 전이 특징을 만드는 옵션은 금지 규칙이 아닙니다
all_possible_transitions를 켜면 학습 자료에서 관측되지 않은 라벨 쌍의 전이 특징도 만듭니다. 학습할 특징의 범위를 넓히는 설정이지 올바른 BIO 조합만 허용하는 스위치가 아닙니다. max_iterations는 최적화 반복의 상한이므로 상한 도달과 검증 성능 개선도 따로 확인합니다.
조건부 랜덤 필드와 헷갈리는 용어는 무엇이 다른가요?
은닉 마르코프 모델과의 차이
HMM은 숨은 상태와 관측이 함께 나타날 확률을 모델링합니다. CRF는 주어진 관측에서 어떤 라벨열이 나올지를 직접 모델링합니다. 둘 다 순서와 Viterbi를 다룰 수 있지만 입력 분포의 가정과 학습 목적이 다릅니다. 은닉 마르코프 모델 용어 설명과 비교하면 생성 모델과 판별 모델의 차이를 읽기 쉽습니다.
독립 토큰 분류·NER과의 차이
토큰마다 소프트맥스로 라벨을 고르는 모델은 출력 태그 사이의 전이를 별도 점수로 넣지 않을 수 있습니다. CRF는 그 연결을 명시합니다. NER은 사람·장소·조직을 찾는 작업의 이름이고 CRF는 그 작업을 구현하는 모델의 한 종류입니다. NER에 반드시 CRF가 필요한 것은 아닙니다.
CTC·Bi-LSTM과의 차이
일반적인 선형 연쇄 CRF 학습은 각 입력 위치에 맞춘 정답 태그열을 사용합니다. CTC는 입력과 출력의 세부 정렬을 미리 주지 않고 경로를 합산하는 방식입니다. Bi-LSTM은 문맥 특징을 만드는 신경망 구조이므로 CRF와 결합해도 둘의 역할은 구분됩니다.
실전에서는 어디에 쓰이나요?
문서에서 이름과 구간을 추출합니다
조직명이나 제품명처럼 여러 토큰이 하나의 대상을 이루는 정보를 추출할 때 후보 모델로 사용합니다. sklearn-crfsuite 공식 튜토리얼은 NER 데이터로 특징을 만들고 태그를 학습하는 예를 제시합니다. 문서 검색에 연결하려면 예측 태그를 원문 위치와 다시 연결하는 처리도 필요합니다.
품사 태깅과 신경망의 출력층에 씁니다
원 논문은 품사 태깅을 평가 과제로 다루며 PyTorch는 Bi-LSTM의 특징 위에 CRF를 얹은 NER 구현을 보여 줍니다. 직접 만든 특징을 쓰는 모델과 신경망 결합 모델 모두 가능합니다. 이미 잘 작동하는 토큰 분류기에 CRF를 추가할지는 경계 오류와 처리 시간을 실제 데이터에서 비교해 결정합니다.
조건부 랜덤 필드를 적용할 때 어떤 순서로 확인하나요?
1. 토큰과 정답의 위치를 맞춥니다
토큰 하나마다 정답 라벨이 대응하는지 확인합니다. 서브워드로 다시 나눈다면 기존 단어 라벨을 어떤 규칙으로 옮길지 정합니다. 원문 문자 위치도 함께 저장하면 잘못 합쳐진 개체 구간을 추적하기 쉽습니다. 학습과 서비스에서 토큰화 규칙이 달라지지 않도록 합니다.
2. 문장 경계와 데이터 분리를 지킵니다
서로 다른 문장을 하나의 연속 시퀀스로 붙이면 존재하지 않는 태그 전이를 학습합니다. 문장별 목록 구조를 유지하고 같은 문서의 유사 문장이 학습과 평가에 섞이지 않도록 나눕니다. 데이터에서 사전이나 특징을 학습한다면 그 과정도 학습 부분에만 맞춥니다.
3. 평가 단위와 출력 형식을 정합니다
토큰 정확도, 라벨별 F1, 개체의 시작·끝과 유형을 모두 맞힌 성능을 구분합니다. 대부분의 토큰이 O라면 토큰 정확도가 높아도 필요한 이름을 놓칠 수 있습니다. sklearn-crfsuite의 flat 지표는 시퀀스 항목 기준이므로 개체 구간 전체를 맞힌 F1과 같은 지표로 보고하지 않습니다.
4. 실제 업무 오류를 확인합니다
새 회사명, 띄어쓰기 변화, 긴 이름과 드문 라벨을 따로 점검합니다. 틀린 태그 하나가 검색 색인이나 자동 입력에 어떤 영향을 주는지도 봅니다. 위치별 주변확률을 검토 대상을 고르는 단서로 쓸 수 있지만 확률이 높은 예측도 원문과 맞는지 평가합니다.
실전 팁: 모델과 함께 토큰화 규칙, 라벨 목록, 허용 전이, 평가 단위를 저장하세요. 같은 모델도 입력과 태그의 대응이 바뀌면 결과가 달라집니다.
사용할 때 무엇을 주의해야 하나요?
전이 가중치를 확률로 읽지 않습니다. state_features_와 transition_features_는 특징의 계수를 보여 줍니다. 큰 양수는 해당 점수를 높이는 방향이지만 그 숫자가 정답 비율은 아닙니다. predict_marginals는 위치마다 각 라벨의 확률을 반환하므로 전체 경로 점수와 출력 의미가 다릅니다.
미래 문맥을 사용한 결과를 실시간 성능으로 보고하지 않습니다. 문장 전체를 읽는 인코더나 뒤 토큰을 쓰는 특징은 아직 도착하지 않은 입력을 활용합니다. 실시간 처리가 목적이면 실제로 사용할 수 있는 문맥 범위와 지연 시간을 같은 조건으로 평가합니다.
복잡한 그래프에도 같은 계산법이 된다고 가정하지 않습니다. 이 글의 효율적인 전방·Viterbi 설명은 기본 선형 연쇄 구조에 해당합니다. 먼 라벨 사이의 연결을 추가하거나 그래프를 바꾸면 정확한 추론이 어려워질 수 있으므로 사용하는 모델의 가정을 확인합니다.
예제의 성능과 코드를 그대로 보장으로 삼지 않습니다. 공식 튜토리얼의 데이터, 라이브러리와 평가 방식은 현재 환경과 다를 수 있습니다. 특히 오래된 scikit-learn 모듈 경로가 포함된 예제는 설치 버전의 API와 대조합니다. 문서의 예시 점수를 한국어 업무 성능으로 옮겨 적지 않습니다.
주의: 문맥을 함께 본다는 사실만으로 정답이나 개인정보 탐지의 완전성이 보장되지는 않습니다. 중요한 정보 추출에는 누락 검증과 사람 검토를 둡니다.
자주 묻는 질문
Q1. CRF는 딥러닝 모델인가요?
CRF 자체는 조건부 확률 모델입니다. 사람이 만든 특징으로 학습할 수도 있고 신경망이 만든 특징과 결합할 수도 있습니다. Bi-LSTM-CRF라는 이름에서는 앞부분이 문맥 특징을 만들고 뒷부분이 라벨의 연결을 평가합니다.
Q2. 정답 라벨이 없어도 바로 학습하나요?
여기서 설명한 일반적인 지도학습 CRF는 입력과 대응하는 정답 태그열이 필요합니다. HMM의 숨은 상태 학습처럼 관측만 넣으면 같은 방식으로 라벨을 발견한다고 이해하면 안 됩니다. 부분 라벨이나 잠재 변수를 쓰는 확장은 별도 설정입니다.
Q3. BIO 태그의 잘못된 순서는 자동으로 사라지나요?
보장되지 않습니다. 데이터에서 드문 전이에 낮은 점수를 배울 수는 있지만 그것이 불가능한 전이라는 뜻은 아닙니다. 반드시 지킬 규칙은 허용 전이 제약과 시작·종료 처리에 실제로 반영되는지 확인합니다.
Q4. 위치별 가장 높은 확률만 모으면 Viterbi 결과인가요?
항상 같지는 않습니다. 위치별 주변확률은 다른 위치의 가능한 라벨들을 합산해 구합니다. Viterbi는 전체 경로 하나의 점수를 최대화하므로 따로 고른 라벨들의 묶음과 다를 수 있습니다.
Q5. CRF를 붙이면 NER 정확도가 항상 오르나요?
항상 오르지는 않습니다. 기존 인코더, 데이터 규모, 라벨 품질과 평가 방식에 따라 효과가 달라집니다. 같은 데이터 분리에서 개체 구간 성능과 처리 비용을 함께 비교하고 필요한 오류가 실제로 줄었는지 확인합니다.
출처
마무리
조건부 랜덤 필드는 주어진 입력에서 어떤 라벨 조합이 어울리는지 학습하는 모델입니다. 선형 연쇄 CRF는 위치별 단서와 이웃 태그의 전이를 함께 점수화하고 전체 후보를 기준으로 확률을 정의합니다.
처음에는 입력 특징과 출력 라벨을 구분하고 정답 태그가 토큰과 맞는지 확인하세요. 그다음 전이 점수와 확률, 최적 경로와 위치별 예측을 나눠 읽으면 됩니다. 성능은 라벨의 모양만 보지 말고 실제로 필요한 개체 구간과 오류 비용으로 평가합니다.
