Introduction
Conditional random field는 (CRF) 레이블의 인접성에 대한 정보를 바탕으로 레이블을 추측하는 기계학습 기법이다. CRF를 활용하여 여러 가지 재미있는 것들을 할 수 있는데, 이를 활용하는 방법에 대해 이야기하겠다. [1]
하지만 그래도 CRF가 어떤 식으로 동작하는 지 대충은 알아야 하니 대략적인 설명을 해보도록 하자. 보통 품사 태깅을 (Part-of-speech tagging) 예로 많이 드니, 이를 예로 들도록 하겠다. [2]
Part-of-Speech Tagging
다음과 같은 문장이 주어졌다고 가정하자.
"Bob drank coffee at Starbucks"
각 단어에 품사를 붙여보면 다음과 같다.
"NOUN VERB NOUN PREPOSITION NOUN"
전통적인 supervised learning 기법을 적용한다고 생각해보면 트레이닝 데이터가 있을 것이고 데이터로부터 의미 있는 특징을 (feature) 뽑아내는 과정이 있을 것이다.
CRF에서는 특징 함수를 (feature function) 정의하여 사용한다. 특징 함수는 문장과 해당 문장을 구성하는 단어들의 위치 및 레이블 정보를 입력으로 받아서 어떤 실수를 (주로 0, 1) 출력하게 된다. 각 특징 함수는 개별적인 가중치를 갖는데, 결국 어떤 문장이 주어지면 어떤 레이블이 얼마나 적합한 레이블인지를 weighted feature sum으로 계산하게 된다.
특징 함수의 장점은 임의의 특징을 표현하는 것이 가능하다는 점이다. 몇 가지 특징 함수의 예를 들어보면 다음과 같다.
- 만약 i 번 레이블이 ADVERB 이고 "-ly"로 해당 단어가 끝나면 1, 아니면 0을 리턴하는 함수
- 만약 i 번 레이블이 VERB 이고 문장이 물음표로 끝나면 1, 아니면 0을 리턴하는 함수
- 만약 i-1 번 레이블이 ADJECTIVE이고 i번 레이블이 NOUN이면 1, 아니면 0을 리턴하는 함수
보는 바와 같이 특징 함수는 매우 자유로운 형태를 띌 수 있다. CRF는 이처럼 자유롭게 특징 함수를 만들고, 각각의 특징 함수에 가중치를 부여하고 그 합을 구해서 사용하게 된다. 최종적으로 문장이 주어졌을 때, 특정한 레이블이 얼마나 그럴싸한지는 해당 레이블의 점수를 (weighted feature sum) 모든 가능한 레이블의 점수로 나눠주면 된다.
가중치를 어떤 식으로 학습하는지, 다른 종류의 더 복잡한 CRF에 대한 설명은 생략하기로 하고 이런 CRF를 어떻게 다른 용도로 활용하는 것이 가능한지 살펴보자.
Different Uses
CRF는 특징 함수를 매우 자유롭게 설정할 수 있기 때문에 다른 유용한 것들을 할 수 있다. 가령 띄어쓰기가 되어 있지 않은 문장을 자동으로 띄어쓰기 해주는 것이 가능하다. 어떤 문장이 주어졌을 때, 레이블로 각 문자마다 여기서 띄어쓰기를 해야 하는지 아닌지 정보를 0/1로 주는 것을 상상할 수 있다. 가령,
CRF로띄어쓰기를해보자
라는 문장이 주어진 경우, 올바른 형태는
CRF로_띄어쓰기를_해보자
일 것이다. 여기에 레이블을 붙여보면,
C/0
R/0
F/0
로/1
띄/0
어/0
쓰/0
기/0
를/1
해/0
보/0
자/1
정도로 붙여보는 것이 가능하다. 이런 식으로 레이블이 붙어 있을 때, 이로부터 유용한 띄어쓰기 정보를 뽑아내는 특징 함수만 만들어 주면 CRF를 사용해서 이를 학습할 수 있다. 가령 어떤 문자가 나타난 경우 그 앞의 문자와의 관계 등을 특징 함수에 넣어주는 것을 쉽게 상상할 수 있다. 한국어 위키피디아 등의 데이터를 활용하면 쉽게 트레이닝 데이터를 만들 수 있고, 바로 CRF로 학습을 하면 끝이다. [3]
[1]: 자세한 이야기는 매우 복잡하지만 남들이 쌓아둔 개념/도구를 가져다 사용하는 것은 공학자의 미덕이다.
[2]: Edwin Chen의 Introduction to Conditional Random Fields를 참고하였다.
[3]: 사실 우리말로 된 유용한 말뭉치 집합을 얻는 것은 매우 어렵다. 그런 맥락에서 한국어 위키피디아 문서는 아주 좋은 데이터셋이다.