Conditional Random Field 설명 | Conditional Random Fields : Data Science Concepts 26682 명이 이 답변을 좋아했습니다

당신은 주제를 찾고 있습니까 “conditional random field 설명 – Conditional Random Fields : Data Science Concepts“? 다음 카테고리의 웹사이트 th.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: th.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 ritvikmath 이(가) 작성한 기사에는 조회수 8,630회 및 좋아요 336개 개의 좋아요가 있습니다.

Conditional Random Field 는 특정 상황일 때 특정 label 의 확률을 학습하는 모델입니다. CRF 와 비슷한 모델 중 Maximum Entropy Markov Model (MEMM) 이 있습니다.

Table of Contents

conditional random field 설명 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 Conditional Random Fields : Data Science Concepts – conditional random field 설명 주제에 대한 세부정보를 참조하세요

My Patreon : https://www.patreon.com/user?u=49277905
Hidden Markov Model : https://www.youtube.com/watch?v=fX5bYmnHqqE
Part of Speech Tagging : https://www.youtube.com/watch?v=fv6Z3ZrAWuU
Viterbi Algorithm : https://www.youtube.com/watch?v=IqXdjdOgXPM
0:00 Recap HMM
4:07 Limitations of HMM
6:40 Intro to CRFs
9:00 Linear Chain CRFs
10:44 How do CRFs Model P(Y|X)?

conditional random field 설명 주제에 대한 자세한 내용은 여기를 참조하세요.

Conditional Random Fields – ratsgo’s blog

CRF를 설명하는 데 있어 가장 유명한 그림 아닐까 싶습니다. 다음과 같습니다. CRF, MEMM, HMM과의 차이점은 다음과 같습니다.

+ 더 읽기

Source: ratsgo.github.io

Date Published: 4/15/2021

View: 8987

5. Conditional Random Field(CRF) 이해 및 구현 – 네이버 블로그

Conditional Random Field (CRF) 는 sequential labeling 문제에서 Recurrent Neural Network (RNN) 등의 deep learning 계열 알고리즘이 이용되기 이전에 …

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 3/20/2022

View: 9616

조건부 무작위장 – 위키백과, 우리 모두의 백과사전

조건부 무작위장(영어: conditional random field 조건부 랜덤 필드)이란 통계적 모델링 방법중에 하나로, 패턴 인식과 기계 학습과 같은 구조적 예측에 사용된다.

+ 자세한 내용은 여기를 클릭하십시오

Source: ko.wikipedia.org

Date Published: 7/3/2021

View: 8216

Conditional Random Field – sh. – — Sungjoo Ha

하지만 그래도 CRF가 어떤 식으로 동작하는 지 대충은 알아야 하니 대략적인 설명을 해보도록 하자. 보통 품사 태깅을 (Part-of-speech tagging) 예로 …

+ 여기에 표시

Source: blog.shurain.net

Date Published: 8/19/2022

View: 610

Conditional Random Field(CRF) – 카이제곱

이렇게 하나의 sequence를 보고 판단하는 것이 아니라 사진을 찍었던 순간 이전 혹은 이후를 참조해 지금 상태를 결정하는 것을 Conditional Random Field …

+ 여기에 더 보기

Source: vision0814.tistory.com

Date Published: 5/22/2021

View: 6741

Conditional Random Fields? – GitHub

CRF는 Conditional Random Field의 약자로 양방향 LSTM을 위해 탄생한 모델이 아니라 이전에 독자적으로 존재해왔던 모델입니다. 이를 양방향 LSTM 모델 …

+ 여기에 보기

Source: github.com

Date Published: 10/25/2022

View: 8045

CRF(Conditional Random Fields : 조건적 임의 필드)

CRFs에 대해 얘기할 때 보통 HMM과 MEMM을 함께 설명합니다. 본문에서 잘 설명해주셨듯 HMM은 Markov assumption이라는 강한 독립 가정 아래 모델링을 …

+ 자세한 내용은 여기를 클릭하십시오

Source: jeongyewon.tistory.com

Date Published: 10/3/2022

View: 8068

[Probabilistic Graphical Models] Conditional Random Fields

우선 Conditional random field 역시 네트워크의 특성을 나타내는 factor를 가지고 있습니다. Gibbs distribution때와 동일하게 그들을 곱해 전체 …

+ 여기에 표시

Source: fabj.tistory.com

Date Published: 8/27/2021

View: 3210

CRF (Conditional Random Field) 의 한글 설명

거의 유일한 설명인 듯… 일단 옮겨 보았음. Conditional Random Fields 에 대한 허접한 설명 한글이 꿈틀 한국어 문장에 조건적 임의 필드(CRF) …

+ 여기에 표시

Source: ysw1209.blogspot.com

Date Published: 12/15/2022

View: 7389

주제와 관련된 이미지 conditional random field 설명

주제와 관련된 더 많은 사진을 참조하십시오 Conditional Random Fields : Data Science Concepts. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Conditional Random Fields : Data Science Concepts
Conditional Random Fields : Data Science Concepts

주제에 대한 기사 평가 conditional random field 설명

  • Author: ritvikmath
  • Views: 조회수 8,630회
  • Likes: 좋아요 336개
  • Date Published: 2022. 3. 1.
  • Video Url link: https://www.youtube.com/watch?v=rI3DQS0P2fk

Conditional Random Field (CRF) 기반 품사 판별기의 원리와 HMM 기반 품사 판별기와의 차이점

품사 판별 (Part-of-Speech tagging) 은 string 형식의 문장으로부터 [(단어, 품사), (단어, 품사), … ] 형식으로 문장을 구성하는 단어와 품사를 인식하는 문제입니다. 한 문장은 여러 개의 단어/품사열 (sequence of word and tag) 의 후보가 만들어 질 수 있으며, 품사 판별 과정에서는 가능한 단어/품사열 후보 중 가장 적절한 것을 선택해야 합니다. 이는 길이가 인 input sequence 에 대하여 가장 적절한 output sequence 을 찾는 문제이기도 합니다. 이를 위하여 sequential labeling 이 이용될 수 있습니다. Sequential labeling 을 이용하는 초기의 품사 판별기는 Hidden Markov Model (HMM) 을 이용하였습니다. 그러나 구조적인 한계 때문에 이후에 Conditional Random Field (CRF) 가 제안된 뒤로 CRF 가 품사 판별 문제의 sequential labeling module 로 이용되었습니다. 최근에는 word embedding 을 features 로 이용하기 위하여 deep neural network 계열의 sequential labeling 방법이 이용되기도 합니다. 품사 판별기의 원리를 이해하기 위해서는 사람이 이해하기 쉬운 features 를 이용하는 CRF 기반 품사 판별기를 알아보는 것이 좋습니다. 이번 포스트에서는 CRF 를 이용하여 한국어 품사 판별기를 학습하고, 주어진 단어/품사열에 대한 적합성, score 를 계산하는 부분을 구현합니다. 단 Viterbi style 의 CRF decoding 과정은 다루지 않습니다.

Conditional Random Field (CRF)

일반적으로 classification 이라 하면, 하나의 입력 벡터 에 대하여 하나의 label 값 를 return 하는 과정입니다. 그런데 입력되는 가 벡터가 아닌 sequence 일 경우가 있습니다. 를 길이가 인 sequence, 라 할 때, 같은 길이의 을 출력해야 하는 경우가 있습니다. Labeling 은 출력 가능한 label 중에서 적절한 것을 선택하는 것이기 때문에 classification 입니다. 데이터의 형식이 벡터가 아닌 sequence 이기 때문에 sequential data 에 대한 classification 이라는 의미로 sequential labeling 이라 부릅니다.

띄어쓰기 문제나 품사 판별이 대표적인 sequential labeling 입니다. 품사 판별은 주어진 단어열 에 대하여 품사열 를 출력합니다.

.

.

띄어쓰기는 길이가 인 글자열에 대하여 [띈다, 안띈다] 중 하나로 이뤄진 Boolean sequence 를 출력합니다.

.

.

Conditional Random Field (CRF) 는 sequential labeling 을 위하여 potential functions 을 이용하는 softmax regression 입니다. Deep learning 계열 모델인 Recurrent Neural Network (RNN) 이 sequential labeling 에 이용되기 전에, 다른 많은 모델보다 좋은 성능을 보인다고 알려진 모델입니다.

Sequential labeling 은 길이가 인 sequence 형태의 입력값 에 대하여 길이가 인 적절한 label sequence 을 출력합니다. 이는 로 ㅍ현할 수 있습니다.

Softmax regression 은 벡터 에 대하여 label 를 출력하는 함수입니다. 하지만 입력되는 sequence data 가 단어열과 같이 벡터가 아닐 경우에는 이를 벡터로 변환해야 합니다. Potential function 은 categorical value 를 포함하여 sequence 로 입력된 다양한 형태의 값을 벡터로 변환합니다.

Potential function 은 Boolean 필터처럼 작동합니다. 아래는 두 어절로 이뤄진 문장, “예문 입니다” 입니다. 앞의 한글자와 그 글자의 띄어쓰기, 그리고 현재 글자를 이용하여 현재 시점 를 벡터로 표현할 수 있습니다.

.

if ‘예문’ else

if ‘예문’ & else

if ‘문입’ else

앞글자부터 현재 글자, 그리고 앞글자의 띄어쓰기 정보를 이용한다는 것을 템플릿으로 표현할 수 있습니다. 현재 시점을 가 아닌 이라 표현하였습니다.

templates . & .

그림은 위 예시 템플릿을 이용하여 ‘예문 입니다’에 potential functions 을 적용한 결과입니다. 마치 5 개의 문서에 대한 term frequency vector 처럼 보입니다.

품사 판별을 위한 sequential labeling 이라면 input sequence 는 단어열이며, output sequence 는 각 단어에 해당하는 품사열입니다. 이를 위해서는 아래와 같은 potential funtion 을 이용할 수 있습니다. 이 potential functions 의 의미는, 현재 단어 의 앞 단어인 이 ‘이것’일 경우라는 의미입니다. 앞/뒤의 단어 혹은 앞 단어의 품사 정보가 특정한 경우 ( ) 인지 True, False 로 확인하는 함수들입니다.

.

if ‘이것’ & ‘은’ else

if ‘이것’ & ‘예문’ else

if ‘은’ & ‘예문’ else

.

이처럼 potential functions 은 임의의 형태의 데이터라 하더라도 Boolean filter 를 거쳐 high dimensional sparse Boolean vector 로 표현합니다. Conditional Random Field 는 특정 상황일 때 특정 label 의 확률을 학습하는 모델입니다.

CRF 와 비슷한 모델 중 Maximum Entropy Markov Model (MEMM) 이 있습니다. MEMM 은 를 다음처럼 계산합니다.

는 potential function 입니다. Potential functions 에 의하여 차원의 sparse vector 로 표현된 와 coefficient vector 의 내적에 exponential 이 취해집니다. 다른 labels 후보 의 값들의 합으로 나뉘어집니다. 번의 softmax regression classification 을 순차적으로 하는 형태입니다. 하지만 MEMM 은 label bias 문제가 발생합니다. 이를 해결하기 위하여 CRF 가 제안되었습니다.

CRF 의 은 다음처럼 기술됩니다.

번의 logistic classification 이 아닌, vector sequences, 즉 matrix 에 대한 한 번의 logistic classification 입니다. 자세한 Conditional Random Field 의 설명은 이전 블로그 를, Conditional Random Field 를 이용하여 만든 띄어쓰기 교정기는 이 블로그를 참고하세요.

Why Conditional Random FIeld (CRF) is better than Hidden Markov Model (HMM) in sequential labeling?

Consider context (Solving unguaranteed independency problem of HMM)

단어열이 주어졌을 때, 한 단어 의 품사를 추정할 때에는 그 주변 단어들, 나 가 문맥적인 힌트가 됩니다. 그런데 앞선 HMM 의 포스트에서 언급하였듯이 HMM 은 unguaranteed independency problem 이란 문제가 있습니다. HMM 에서 는 만 그 상관성을 emission probability 로 학습할 수 있습니다. 이전에 에 어떤 단어가 등장하였는지는 상관하지 않습니다. HMM 은 문맥을 “직접적으로” 고려하는 기능이 없습니다. 단지 state 간의 transition probability 인 에 의하여 간접적으로 단어 간 문맥이 반영되길 바랄 뿐입니다. HMM 은 품사 판별처럼 앞, 뒤의 observation 을 함께 고려해야 하는 상황에서의 sequential labeling 에는 적합하지 않은 방법입니다.

그러나 CRF 는 앞, 뒤의 단어로 이뤄진 문맥을 직접적으로 이용합니다. Potential function 을 만들 때, 을 이용한다면, trigram 의 문맥에서 가운데 단어의 품사를 추정한다는 의미입니다. 예를 들어 아래와 같이 ‘이’ 앞에, = ‘남’, 뒤에 = ‘빼줬어’가 등장하였을 때, 가운데 단어 $$x_i$ = ‘이’는 Josa 일 가능성이 높다는 의미입니다.

남, 이, 빼줬어 -> [Noun, Josa, Verb]

만약 을 feature 로 이용한다면, 앞/뒤에 = ‘남’, = ‘빼줬어’이 등장한다면 그 가운데 단어는 무엇이 되던지 ( 를 feature 로 이용하지 않으므로) 가운데 단어의 품사를 추정한다는 의미입니다.

CRF 는 이처럼 앞/뒤에 등장하는 단어를 직접적으로 확인함으로써 특정 문맥에서의 의 품사를 추정할 수 있습니다.

CRF can learn context

HMM 은 emission probability, 에 의하여 단어가 등장할 가능성을 계산합니다. 그리고 이는 학습 말뭉치에 어떤 품사 에서 단어 가 등장했던 확률입니다. 즉 학습 말뭉치에 존재하지 않은 단어에 대해서는 emission probability 가 0 입니다. 그렇기 때문에 학습 말뭉치에 존재하지 않은 단어에 대해 품사를 부여하기가 어렵습니다.

물론 HMM 기반 방법은 특정 단어에 대하여 임의의 emission probability 를 부여함으로써 사용자 사전을 손쉽게 추가할 수도 있었습니다.

하지만 tagger 가 단어를 직접 외우지 않고, 그 단어의 문맥, 앞/뒤의 단어를 외운다면 가운데에 등장하는 임의의 단어에 대하여 품사를 추정할 수 있습니다. 앞서 살펴본 은 이런 기능을 합니다. Infrequent 한 여러 개의 단어를 외우기 보단, frequent words 로 이뤄진 infrequent word 의 문맥을 외움으로써 다양한 infrequent word 에 대한 품사를 추정할 수 있습니다.

Appending user dictionary

CRF based tagger 에도 사용자 사전을 입력하는 것이 어렵지 않습니다. 사용자 사전의 단어 를 품사 로 입력하려면 라는 state feature 를 만들고, 이 state feature 의 regression coefficient 를 해당 품사의 가장 큰 값으로 정의해주면 됩니다.

State feature 는 potential function 에 의하여 만들어진 feature 에 대한 품사 의 regression coefficient 입니다. Implementation code 를 살펴보면 이해가 더 빠를 것입니다.

Implementing CRF based Part-of-Speech Tagger

학습 말뭉치를 이용하여 품사 판별이나 형태소 분석용 tagger 를 학습하기도 합니다. 학습 말뭉치는 다음과 같은 데이터로 구성되어 있습니다.

아래는 세종 말뭉치의 예시입니다. 세종 말뭉치는 한국어 형태소 분석을 위하여 국립국어원에서 배포한 말뭉치입니다. 한 문장이 (morpheme, tag) 형식으로 기술되어 있습니다. 아래는 네 개의 문장의 스냅샷입니다.

[[‘뭐’, ‘NP’], [‘타’, ‘VV’], [‘고’, ‘EC’], [‘가’, ‘VV’], [‘ㅏ’, ‘EF’]] [[‘지하철’, ‘NNG’]] [[‘기차’, ‘NNG’]] [[‘아침’, ‘NNG’], [‘에’, ‘JKB’], [‘몇’, ‘MM’], [‘시’, ‘NNB’], [‘에’, ‘JKB’], [‘타’, ‘VV’], [‘고’, ‘EC’], [‘가’, ‘VV’], [‘는데’, ‘EF’]]

우리는 linear-chained CRF tagger 를 만들어봅니다. 이는 앞 시점의 tag 인 의 정보를 이용하는 CRF 입니다.

우리는 corpus 가 nested list 구조라 가정합니다. 각 문장 sent 는 [(word, tag), (word, tag), … ] 형식입니다. 이는 앞선 HMM based tagger에서 이용한 학습 말뭉치의 형식과 동일합니다.

Potential function

(단어, 품사)열로 구성된 문장의 앞/뒤에 ‘BOS’ 와 ‘EOS’를 추가합니다. 이 값은 자주 이용할 것이니 bos, eos 라는 변수로 따로 저장해둡니다.

Conditional Random Field 기반 알고리즘들은 potential function 을 자유롭게 디자인할 수 있습니다. 확장성을 위하여 potential function 의 abstract class 를 하나 만든 뒤, 모든 potential function 은 이를 상속하도록 합니다. AbstractFeatureTramsformer 라는 abstract class 를 만들었습니다. 그리고 공통적으로 이용되는 sentence_to_xy 라는 함수와 potential function 을 구현합니다.

FeatureTransformer 를 함수처럼 이용할 수 있도록 call 함수를 정의합니다. list of (word, pos) 형식의 sentence 가 입력되면 이를 feature 로 변환된 문장, encoded_sentence 와 품사열 tags 를 return 하는 sentence_to_xy 함수로 넘겨줍니다.

구현의 편의를 위하여 sentence 의 앞에 (bos, bos), 문장 뒤에 (eos, eos) 라는 (단어, 품사)를 입력합니다. 그리고 zip(*) 을 이용하여 단어열과 품사열을 분리합니다. 이를 각각 words_, tags_ 라 명합니다.

potential_function 은 단어열 words_ 와 품사열 tags_ 를 입력받아, 이로부터 품사를 만듭니다. words_, tags_ 의 맨 앞과 뒤에는 bos, eos 가 존재하므로, 0 이 아닌 1 번째 단어열부터 n 개의 시점에 대하여 to_feature 함수를 이용하여 features 를 만듭니다.

이제 모든 FeatureTransformer 는 abstact class 를 상속받고 to_feature 라는 함수만 구현하면 됩니다.

bos = ‘BOS’ eos = ‘EOS’ class AbstractFeatureTransformer : def __call__ ( self , sentence ): return self . sentence_to_xy ( sentence ) def sentence_to_xy ( self , sentence ): “””Feature transformer :param list_of_tuple pos: a sentence [(word, tag), (word, tag), …] “”” words , tags = zip ( * sentence ) words_ = tuple (( bos , * words , eos )) tags_ = tuple (( bos , * tags , eos )) encoded_sentence = self . potential_function ( words_ , tags_ ) return encoded_sentence , tags def potential_function ( self , words_ , tags_ ): n = len ( tags_ ) – 2 # except bos & eos sentence_ = [ self . to_feature ( words_ , tags_ , i ) for i in range ( 1 , n + 1 )] return sentence_ def to_feature ( self , sentence ): raise NotImplemented

BaseFeatureTransformer 는 다음의 features 를 이용하는 potential function 입니다.

format note x[0] 현재 단어. crf based tagger 가 단어를 외울 수 있도록 합니다 x[0] & y[-1] 현재 단어와 앞 단어의 품사. 앞 단어의 품사를 문맥으로 이용하도록 합니다. Noun + 이 일 경우, ‘이’가 Josa 일 가능성을 높여줍니다. x[-1:0] 앞 단어와 현재 단어입니다. 앞 단어를 문맥으로 이용합니다. x[-1:0] & y[-1] 앞 단어 뿐 아니라 그 단어의 품사까지 문맥으로 이용합니다. x[-1,1] 앞/뒤에 등장한 단어입니다. x[-1,1] & y[-1] 앞/뒤에 등장한 단어와 앞 단어의 품사 입니다.

class BaseFeatureTransformer ( AbstractFeatureTransformer ): def __init__ ( self ): super (). __init__ () def to_feature ( self , words_ , tags_ , i ): features = [ ‘x[0]=%s’ % words_ [ i ], ‘x[0]=%s, y[-1]=%s’ % ( words_ [ i ], tags_ [ i – 1 ]), ‘x[-1:0]=%s-%s’ % ( words_ [ i – 1 ], words_ [ i ]), ‘x[-1:0]=%s-%s, y[-1]=%s’ % ( words_ [ i – 1 ], words_ [ i ], tags_ [ i – 1 ]), ‘x[-1,1]=%s-%s’ % ( words_ [ i – 1 ], words_ [ i + 1 ]), ‘x[-1,1]=%s-%s, y[-1]=%s’ % ( words_ [ i – 1 ], words_ [ i + 1 ], tags_ [ i – 1 ]) ] return features

만약 HMM 이 이용하는 정보들만을 이용하는 CRF 를 만들고 싶다면 아래처럼 현재 단어 x[0] 만 이용하는 to_feature 함수를 만듭니다. 이제 모델이 학습하는 정보는 오로직 와 의 관계 뿐입니다.

class HMMStyleFeatureTransformer ( AbstractFeatureTransformer ): def __init__ ( self ): super (). __init__ () def to_feature ( self , words_ , tags_ , i ): features = [ ‘x[0]=%s’ % words_ [ i ], ] return features

우리는 crfsuite 를 Python 에서 이용할 수 있도록 wrapping 을 한 python-crfsuite 라이브러리를 이용할 것입니다. 이 라이브러리는 의 transition probability 를 따로 학습합니다. 즉 y[-1] feature 를 기본으로 학습합니다. HMM 은 transition probability 와 emission probability 를 학습해야 합니다. 위의 HMMStyleFeatureTransformer 를 이용하여 만드는 feature 는 emission probability 에 해당하는 부분입니다.

Trainer

학습을 위한 Trainer 를 class 로 만듭니다. 만약 Trainer 를 만들 때 init 함수에 학습 데이터가 입력되면 train 함수를 이용하여 학습을 합니다. 그 외의 min_count, l2_cost, l1_cost, max_iter, verbose 는 python-crfsuite 의 parameters 입니다. sentence_to_xy 는 우리가 앞서 만들어 둔 FeatureTransformer 입니다.

class Trainer : def __init__ ( self , corpus = None , sentence_to_xy = None , min_count = 3 , l2_cost = 1.0 , l1_cost = 1.0 , max_iter = 300 , verbose = True ): self . sentence_to_xy = sentence_to_xy self . min_count = min_count self . l2_cost = l2_cost self . l1_cost = l1_cost self . max_iter = max_iter self . verbose = verbose if corpus is not None : self . train ( corpus )

CRF 는 potential function 을 만들기에 따라서 수천만개의 features 가 만들어지기도 합니다. 즉 수천만 차원의 softmax regression 을 학습하는 경우들도 생기는데, 많은 종류의 features 의 빈도수는 매우 작습니다. 일반화 성능을 높이면서 모델을 가볍게 만들기 위하여 min frequency cutting 만 해줘도 모델이 가벼워집니다.

python-crfsuite 에는 min frequency cutting 을 하는 기능이 있습니다. 하지만, 메모리에 모든 features 를 올려둔 뒤에 frequency 를 계산합니다. 애초에 만들어둘 필요가 없는 features 를 한 번은 만들게 됩니다. 그리고 이 과정에서 out-of-memory issue 를 마주하기도 합니다.

이런 일을 방지하려면 python-crfsuite 를 이용하기 전에 min frequency cutting 을 하는 것이 좋습니다. 이를 위하여 scan_features 함수를 만듭니다. potential function 을 이용하여 features 를 만든 뒤, 미리 min frequency cutting 을 수행하여 모델이 이용할 features 만 counter 에 담아 return 합니다.

class Trainer : … def scan_features ( self , sentences , sentence_to_xy , min_count = 2 ): def trim ( counter , min_count ): counter = { feature : count for feature , count in counter . items () # memorize all words no matter how the word occured. if ( count >= min_count ) or ( feature [: 4 ] == ‘x[0]’ and not ‘, ‘ in feature ) } return counter counter = {} for i , sentence in enumerate ( sentences ): # transform sentence to features sentence_ , _ = sentence_to_xy ( sentence ) # count for features in sentence_ : for feature in features : counter [ feature ] = counter . get ( feature , 0 ) + 1 # remove infrequent features counter = trim ( counter , min_count ) return counter

train 함수는 sentences 가 입력되면 먼저 scan_features() 함수를 이용하여 모델이 이용할 features 를 입력 받습니다. 이후 정보를 보기 편한 형태로 기록하기 위하여 각 features 의 idx 와 count 를 Feature 라는 namedtuple 로 만들어둡니다. 이 정보는 self._features 에 넣어둡니다.

각 idx 가 어떤 feature 인지 inverse index 인 idx2feature 를 만듭니다. 이 값은 Feature.idx 기준으로 정렬하여 feature 를 list 에 넣어둡니다.

from collections import namedtuple Feature = namedtuple ( ‘Feature’ , ‘idx count’ ) class Trainer : … def train ( self , sentences ): features = self . scan_features ( sentences , self . sentence_to_xy , self . min_count , self . scan_batch_size ) # feature encoder self . _features = { # wrapping feature idx and its count feature : Feature ( idx , count ) for idx , ( feature , count ) in # sort features by their count in decreasing order enumerate ( sorted ( features . items (), key = lambda x : – x [ 1 ] )) } # feature id decoder self . _idx2feature = [ feature for feature in sorted ( self . _features , key = lambda x : self . _features [ x ]. idx ) ] self . _train_pycrfsuite ( sentences ) self . _parse_coefficients ()

모델이 이용할 features 만 선택한 다음 python-crfsuite 를 이용하여 CRF model 을 학습합니다. python-crfsuite 의 package name 은 pycrfsuite 입니다.

python-crfsuite 는 Trainer 를 만든 뒤 학습 데이터를 (x, y) 기준으로 Trainer.append() 함수에 넣어줘야 합니다.

python-crfsuite 는 L1, L2 regularization 을 제공합니다. 만약 l1_cost 를 0 으로 정하면 L2 regularization 만 됩니다. 소수의 features 만을 이용하여 classification 을 잘하고 싶은 것이 아니기 때문에, L2 regularization 만 이용합니다 (l1_cost 를 0 으로 설정합니다).

python-crfsuite 는 c++ 의 crfsuite 를 script 로 실행합니다. 그리고 그 결과를 Trainer.train() 함수에 입력되는 ‘temporal_model’ 파일에 적어둡니다. 학습된 모델을 이용하려면 이 파일로부터 trained model 을 읽어야 합니다.

import pycrfsuite class Trainer : … def _train_pycrfsuite ( self , sentences ): trainer = pycrfsuite . Trainer ( verbose = self . verbose ) for i , sentence in enumerate ( sentences ): # transform sentence to features x , y = self . sentence_to_xy ( sentence ) # use only conformed feature x = [[ xij for xij in xi if xij in self . _features ] for xi in x ] trainer . append ( x , y ) # set pycrfsuite parameters params = { ‘feature.minfreq’ : max ( 0 , self . min_count ), ‘max_iterations’ : max ( 1 , self . max_iter ), ‘c1’ : max ( 0 , self . l1_cost ), ‘c2’ : max ( 0 , self . l2_cost ) } # do train trainer . set_params ( params ) trainer . train ( ‘temporal_model’ )

학습된 모델을 읽어들여 coefficient 인 를 읽어들입니다. pycrfsuite.Tagger() 를 만든 뒤, 앞서 학습한 모델을 open 합니다. Tagger.info() 를 하면 모델의 parameters 를 얻을 수 있습니다.

state_features 는 (features, class) 간의 regression coefficient, 입니다. 아래와 같은 형식의 dict 입니다. 예를 들어 (x[0]=’뭐’, ‘Noun’): 7.960767 은 현재 시점의 단어 , ‘뭐’가 명사일 score 가 7.960767 이라는 의미이며, ‘x[0]=뭐, y[-1]=BOS’ 는, 문장의 첫 글자 ‘뭐’가 감탄사일 score 가 2.300112 라는 의미입니다.

{ (‘x[0]=뭐’, ‘Noun’): 7.960767 (‘x[0]=뭐’, ‘Exclamation’): 13.623959 (‘x[0]=뭐, y[-1]=BOS’, ‘Noun’): 2.345766 (‘x[0]=뭐, y[-1]=BOS’, ‘Exclamation’): 2.300112 (‘x[-1:0]=BOS-뭐’, ‘Noun’): 2.34576 … }

transitions 는 transition score 입니다. 아래와 같은 형식의 dict 입니다. = ‘Noun’ 일 때 = ‘Noun’ 일 score 가 9.027282 라는 의미입니다. 특히 (‘Noun’, ‘Eomi’) 처럼 명사 다음에 어미가 등장할 가능성은 거의 없기 때문에 negative score 인 -1.583352 이 학습됩니다. 즉 = ‘Noun’ 이면 는 ‘Eomi’ 가 될 가능성이 줄어든다는 의미입니다.

{ (‘Noun’, ‘Noun’): 9.027282, (‘Noun’, ‘Verb’): 6.565445, (‘Noun’, ‘Eomi’): -1.583352, (‘Noun’, ‘Josa’): 7.388192, … }

이 값을 class attribute 로 저장해둡니다.

class Trainer : … def _parse_coefficients ( self ): # load pycrfsuite trained model tagger = pycrfsuite . Tagger () tagger . open ( ‘temporal_model’ ) # state feature coeffitient debugger = tagger . info () self . state_features = debugger . state_features # transition coefficient self . transitions = debugger . transitions

Trainer 의 학습 결과를 JSON 으로 저장합니다. JSON 은 key 를 str 로 받아야 합니다. 하지만 state_feature 나 transition 은 tuple of str 입니다. 이를 str 로 변환하기 위하여 ‘ -> ‘.join() 을 실행합니다. 이 함수를 통하여 JSON 에 저장되는 state_features_json 는 다음과 같이 변환됩니다. 이후 load 할 때 ‘ -> ‘ 기준으로 split 하여 tuple 로 변환하면 됩니다.

{ ‘x[0]=뭐 -> Noun’: 7.960767, ‘x[0]=뭐 -> Exclamation’: 13.623959 ‘x[0]=뭐, y[-1]=BOS -> Noun’: 2.345766 ‘x[0]=뭐, y[-1]=BOS -> Exclamation’: 2.300112 ‘x[-1:0]=BOS-뭐 -> Noun’: 2.34576 … }

transition 에 대해서도 동일한 string concatenation 을 수행합니다.

JSON 으로 저장할 때에는 한글값이 있기 때문에 ensure_ascii=False 로 설정합니다. 또한 이후 파일을 직접 읽을 때 해석이 편하도록 indent=2 로 설정합니다. indent > 0 으로 설정하면 nested 구조에 맞춰 들여쓰기가 indent 값만큼 됩니다.

import json class Trainer : … def _save_as_json ( self , json_path ): # concatenate key that formed as tuple of str state_features_json = { ‘ -> ‘ . join ( state_feature ): coef for state_feature , coef in self . state_features . items () } # concatenate key that formed as tuple of str transitions_json = { ‘ -> ‘ . join ( transition ): coef for transition , coef in self . transitions . items () } # re-group parameters params = { ‘state_features’ : state_features_json , ‘transitions’ : transitions_json , ‘idx2feature’ : self . _idx2feature , ‘features’ : self . _features } # save with open ( json_path , ‘w’ , encoding = ‘utf-8’ ) as f : json . dump ( params , f , ensure_ascii = False , indent = 2 )

Sequential labeling 을 위한 CRF model 의 학습이 모두 끝났습니다.

Tagging using CRF

학습한 CRF 모델을 이용하여 word sequence 에 대한 score 를 계산해봅니다. 가능한 모든 후보들에 대한 score 의 합으로 이 값을 나눈다면, 각 후보에 대한 확률 형식이 됩니다. CRF 에서 가 가장 큰 를 찾는 것은 가 가장 큰 를 찾는 것과 같습니다.

사용 가능한 형태소 분석기나 품사 판별기를 만들려면 문장에서 단어열을 만드는 look-up 부분을 구현해야 합니다. 또한 가능한 문장 후보 (단어, 품사)열을 모두 열거한 다음에 각 후보의 확률을 계산하지도 않습니다. 문장이 조금만 길어져도 (단어, 품사) 열의 후보 개수는 기하급수적으로 늘어나며, 중복된 계산이 많아지기 때문입니다. 이때는 Viterbi style 의 decode 함수를 구현해야 합니다. 지금은 CRF tagger 의 작동 원리를 이해하는 것이 목적이므로, 주어진 단어열의 score 를 계산하는 score() 함수를 구현합니다.

JSON 형식으로 저장한 CRF model 의 coefficients 를 읽습니다. 앞서 저장한 것과 반대로 ‘ -> ‘ 을 이용하여 state_features 와 transitions 의 key 를 split() 합니다.

class TrainedCRFTagger : def __init__ ( self , model_path = None , coefficients = None , feature_transformer = None , verbose = False ): self . feature_transformer = feature_transformer self . verbose = verbose if model_path : self . _load_from_json ( model_path ) def _load_from_json ( self , json_path , marker = ‘ -> ‘ ): with open ( json_path , encoding = ‘utf-8’ ) as f : model = json . load ( f ) # parse transition self . _transitions = { tuple ( trans . split ( marker )): coef for trans , coef in model [ ‘transitions’ ]. items () } # parse state features self . _state_features = { tuple ( feature . split ( marker )): coef for feature , coef in model [ ‘state_features’ ]. items () }

score 함수는 (단어, 품사) 열로 구성된 문장에 대한 score 를 계산하는 함수입니다. 여러 후보 중 이 score 가 가장 높은 (단어, 품사) 열이 정답 문장으로 선정됩니다.

이 함수는 potential function 에 의하여 만들어진 (activated 된) features 의 coefficient 를 누적합니다. Activated 되지 않은 features 라면 그 값이 0 이기 때문에 coefficient 와의 곱도 0 입니다. 즉, activated 된 features 에 대해서만 regression coefficient 를 더해주면 됩니다.

먼저 학습에 이용하였던 FeatureTransformer 를 이용하여 (단어, 품사) 열을 list of features 로 만들어줍니다.

State transitions 의 score 를 더하기 위해서 zip(tags, tags[1:]) 을 이용하여 연속된 두 개의 state, s0 와 s1 을 yield 합니다. self.transitions 에서 (s0, s1) 에 해당하는 coefficient 를 가지고와 누적하여 더해줍니다.

State features 는 아래와 같은 형식의 features 입니다. x[0]=’뭐’ 이고, 문장의 맨 첫 단어일 경우, ‘Noun’ 일 점수 2.345766 이 ‘Exclamation’ 일 점수 2.300112 보다 높으므로, 이 정보만을 이용하면 ‘뭐’ 라는 문장의 첫 단어 ‘뭐’의 품사는 ‘Noun’ 입니다.

(‘x[0]=뭐, y[-1]=BOS’, ‘Noun’): 2.345766 (‘x[0]=뭐, y[-1]=BOS’, ‘Exclamation’): 2.300112

이처럼 주어진 (단어, 품사) 열의 점수를 계산하여 return 합니다.

class TrainedCRFTagger : … def score ( self , sentence ): # feature transform sentence_ , tags = self . feature_transformer ( sentence ) score = 0 # transition weight for s0 , s1 in zip ( tags , tags [ 1 :]): score += self . transitions . get (( s0 , s1 ), 0 ) # state feature weight for features , tag in zip ( sentence_ , tags ): for feature in features : coef = self . state_features . get (( feature , tag ), 0 ) score += coef return score

아직 str 형식의 문장이 주어졌을 때, (단어, 품사) 열로 만드는 부분은 구현하지 않았습니다. 이는 이후에 다른 포스트에서 다룹니다. 우리는 후보에 대한 evaluation (scoring) 과정만 구현하였습니다.

Evaluator (scoring) testing

구현한 CRF tagger 를 이용하여 세종 말뭉치를 학습합니다. 그리고 이를 이용하여 ‘뭐 타고가’ 라는 예문의 네 가지 (단어, 품사)열 후보에 대한 확률값을 계산합니다.

candidates = [ [( ‘뭐’ , ‘Noun’ ), ( ‘타’ , ‘Verb’ ), ( ‘고’ , ‘Eomi’ ), ( ‘가’ , ‘Noun’ )], [( ‘뭐’ , ‘Noun’ ), ( ‘타’ , ‘Verb’ ), ( ‘고’ , ‘Noun’ ), ( ‘가’ , ‘Noun’ )], [( ‘뭐’ , ‘Noun’ ), ( ‘타’ , ‘Verb’ ), ( ‘고’ , ‘Eomi’ ), ( ‘가’ , ‘Verb’ ), ( ‘ㅏ’ , ‘Eomi’ )], [( ‘뭐’ , ‘Noun’ ), ( ‘타’ , ‘Verb’ ), ( ‘고’ , ‘Noun’ ), ( ‘가’ , ‘Verb’ ), ( ‘ㅏ’ , ‘Eomi’ )] ] for sent in candidates : print ( ‘

{}’ . format ( sent )) print ( trained_crf . score ( sent ))

그 결과 정답인 [(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Eomi’), (‘가’, ‘Verb’), (‘ㅏ’, ‘Eomi’)] 가 가장 큰 log prob. 값을 지님을 확인할 수 있습니다. Length normalization 을 하지 않으면 [(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Eomi’), (‘가’, ‘Noun’)] 가 가장 큰 log score 를 지닙니다.

[(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Eomi’), (‘가’, ‘Noun’)] 66.006717 [(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Noun’), (‘가’, ‘Noun’)] 27.143626000000005 [(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Eomi’), (‘가’, ‘Verb’), (‘ㅏ’, ‘Eomi’)] 100.06197299999997 [(‘뭐’, ‘Noun’), (‘타’, ‘Verb’), (‘고’, ‘Noun’), (‘가’, ‘Verb’), (‘ㅏ’, ‘Eomi’)] 58.769561

위의 예시에서는 HMM 도 CRF 도 정답을 구하였습니다만, 앞서 언급한 것처럼 CRF 는 HMM 보다 문맥을 볼 수 있기 때문에 훨씬 정확한 성능을 보여주며, potential function 을 설계하기에 따라 어느 정도 미등록 단어의 품사도 추정할 수 있습니다.

위 구현체들은 링크의 github 에 올려두었습니다. 이 곳에는 str 형식의 문장에서 단어 후보를 만드는 과정까지 구현된 코드가 올라갈 예정입니다. Decode 에 대한 구현 과정은 다음 포스트에서 다룹니다.

Reference

Conditional Random Fields · ratsgo’s blog

이번 글에서는 Conditional Random Fields에 대해 살펴보도록 하겠습니다. 이 글은 고려대 정순영 교수님 강의를 정리했음을 먼저 밝힙니다. 이밖에 다양한 자료를 참고하였는데요, 인용한 부분에 표시를 해 두었습니다. 비터비 알고리즘 관련 설명 그림은 제가 직접 그렸습니다. 제가 잘못 이해하고 있거나 미진한 점 있으시면 언제든 댓글로 알려주시면 바로 반영하겠습니다. 그럼 시작하겠습니다.

overview

CRF를 설명하는 데 있어 가장 유명한 그림 아닐까 싶습니다. 다음과 같습니다.

CRF, MEMM, HMM과의 차이점은 다음과 같습니다. 간결하고 직관적인 설명이어서 직접 인용을 해봤습니다. (출처 : Quora)

CRFs and MEMMS are discriminative sequence models whereas HMMs are generative sequence models. HMM essentially uses Bayes Rule as a local model over the transition and emission probabilities, whereas CRF and MEMM’s local models are MaxEnt models over transition and observable features. The chief difference between MEMM and CRF is that MEMM is locally renormalized and suffers from the label bias problem, while CRFs are globally renormalized.

CRF가 강점을 지니는 이유는 구성하기에 따라서 얼마든지 HMM 같은 구조로 바꿀 수 있다는 점입니다. 아래 그림과 같습니다. (출처 : C Sutton, “An Introduction to CRF”)

For example, in an HMM, a transition from state $i$ to state $j$ receives the same score, log $p(y_t = j$|$y_{t−1} = i)$, regardless of the input. In a CRF, we can allow the score of the transition $(i, j)$ to depend on the current observation vector, simply by adding a feature $1{y_t=j}$, $1{y_{t−1}=1}$, $1_{x_t=o}$.

CRF는 본질적으로 시퀀스 분류기이기 때문에 최근 주목받고 있는 Recurrent Neural Network와도 직, 간접적으로 연관을 맺고 있는 것 같습니다. 이와 관련한 설명 또한 인용해봤습니다. (출처 : Quora)

RNNs have a latent state that is never observed (e.g. the memory in a LSTM). In contrast, the CRF has a latent state that is observed for training data (the model has to learn how to recreate those latent states for test data). Both are similar in that there is a set of parameters that tell you how to evolve the latent state from one time step to the next.

수식과 파이썬 구현

CRF의 수식을 살펴보겠습니다. 수식만 살펴봐서는 되레 복잡하므로, 파이썬 코드와 함께 살펴보겠습니다. 파이썬 코드는 이곳을 참고해 대폭 손질하였습니다. (수식 이해를 돕기 위한 코드로 대단히 느립니다, 혹시 학습 용도로 필요하시다면 라이브러리 활용을 추천해 드립니다)

기본 구조

CRF를 그래피컬하게 나타낸 그림은 다음과 같습니다. 입력벡터 $x$의 위치에 상관없이 모두 활용하기 때문에 매우 유연한 구조입니다.

입력 시퀀스(예컨대 단어들) 벡터 $x$가 주어졌을 때 레이블 시퀀스(예컨대 품사) 벡터 $y$가 나타날 확률은 다음과 같이 정의됩니다. 최대엔트로피모델(로지스틱 회귀)와 완전히 같습니다만, 최대엔트로피가 single observation을 분류하는 모델이라면, CRF는 sequential classifer라는 점이 다릅니다.

위 식을 파이썬 코드로 구현하면 다음과 같습니다.

import math def calc_prob_y_given_x ( y_prime , x , all_labels , FeatureFunction , weights ): n = len ( y_prime ) m = len ( weights ) nominator = 0 for j in range ( 1 , n ): for i in range ( 1 , m ): nominator += weights [ i ] * FeatureFunction ( y_prime , x , i , j ) denominator = calc_Z ( x , n , m , all_labels , FeatureFunction , weights ) return math . exp ( nominator ) / denominator

Feature Functions

CRF는 최대엔트로피모델이나 최대엔트로피마코프모델처럼 Feature를 연구자가 유연하게 설정할 수 있습니다. 이를 파이썬 코드로 구현한 결과는 다음과 같습니다.

# x : words (observation sequence) # y : lables (e.g: POS TAGS, label sequence) def FeatureFunction ( x , y , i , j ): # f_1 if i == 1 and y [ j – 1 ] == ‘NN’ : return 1 # f_2 elif i == 2 and y [ j – 1 ] == ‘VBZ’ : return 1 # f_3 elif i == 3 and x [ 0 ] == ‘DT’ : return 1 else : return 0

Label Bias 문제와 극복 방안

CRF는 Label Bias 문제를 극복하기 위해 제안된 기법입니다. Label Bias란 다음과 같은 문제를 가리킵니다.

Preference of states with lower number transitions over others

이를 해결하기 위해 확률값을 구할 때 global normalize를 합니다. 이를 구현한 파이썬 코드는 다음과 같습니다.

def calc_Z ( x , n , m , all_labels , FeatureFunction , weights ): Z = 0 all_possible_Y = itertools . product ( all_labels , repeat = n ) for y_prime in all_possible_Y : tmpZ = 0 for j in range ( 1 , n ): for i in range ( 1 , m ): tmpZ += weights [ i ] * FeatureFunction ( y_prime , x , i , j ) Z += math . exp ( tmpZ ) return Z

그런데 보시다시피 가능한 모든 조합의 레이블 시퀀스에 대한 확률을 구해야 합니다. 가령 품사 종류가 명사(NN) , 동사(VB) 등 다섯 가지이고, 시퀀스 길이가 5(개 단어)라면 다음 표처럼 $5^5$=3125가지의 경우의 수를 고려해야 합니다.

$y_1$ $y_2$ $y_3$ $y_4$ $y_5$ NN NN NN NN NN NN NN NN NN VBN NN NN NN NN VBZ NN NN NN NN IN NN NN NN NN DT NN NN NN VBN NN NN NN NN VBN VBN NN NN NN VBN VBZ NN NN NN VBN IN NN NN NN VBN DT … … … … …

CRF에서 가장 계산량이 많은 부분이 바로 $Z$를 구하는 부분입니다. 위 파이썬 코드는 수식 이해 용도로 수식을 그대로 옮겨놓은 형태이지만, 실제로는 다이내믹 프로그래밍(dynamic programming) 등 최적화 기법을 쓴다고 합니다.

파라메터 학습 : 최대우도추정

CRF의 파라메터는 로지스틱 회귀의 파라메터를 추정하는 방식과 같이 최대우도추정법(Maximum Likelihood Estimation)으로 구합니다. 식이 매우 복잡한데, 저 또한 정리 용도로 남겨둡니다. CRF의 로그 우도함수는 다음과 같습니다. 식의 첫 줄 두번째 항은 과적합(overfitting) 방지를 위한 정규화(regularization) 항입니다.

위 로그 우도함수는 파라메터 $λ$로 편미분한 값이 0인 지점에서 최대값을 가집니다. 이를 3등분해서 각각 $λ$에 대해 편미분한 결과는 다음과 같습니다. 우선 $A$를 편미분한 결과입니다.

다음은 $B$를 파라메터 $λ$에 대해 편미분한 결과입니다.

마지막으로 $C$입니다.

$A$는 데이터의 empirical distribution으로 해석할 수 있습니다. 식과 파이썬 코드는 다음과 같습니다.

def calc_empirical_expectation_feature_i ( train_data , FeatureFunction , i ): empirical_expectation_feature_i = 0 for x , y in train_data : n = len ( y ) for j in range ( 1 , n ): empirical_expectation_feature_i += FeatureFunction ( y , x , i , j ) return empirical_expectation_feature_i

$B$는 모델이 내놓는 distribution으로 해석할 수 있습니다. 식과 파이썬 코드는 다음과 같습니다.

import itertools def calc_predicted_expectation_feature_i ( train_data , FeatureFunction , all_labels , weights , i ): predicted_expectation = 0 for x , y in train_data : n = len ( y ) all_possible_Y = itertools . product ( all_labels , repeat = n ) for y_prime in all_possible_Y : predicted_expectation += \ ( calc_prob_y_given_x ( y_prime , x , all_labels , FeatureFunction , weights ) * sum ([ FeatureFunction ( x , y , i , j ) for j in range ( 1 , n )])) print ( predicted_expectation ) return predicted_expectation

로그우도 함수에 대한 편미분 식을 다시 적으면 다음과 같은데요. $A$와 $B$가 비슷할 수록 로그우도 함수의 도함수가 작아집니다. 데이터의 분포와 모델의 분포가 비슷할 수록, 즉 모델이 데이터의 분포를 잘 모사할 수록 학습이 잘 되었다는 이야기입니다.

이제 거의 다 왔습니다. 파라메터 $λ$를 랜덤 초기화한 뒤 이제까지 구한 로그우도 함수가 커지는 방향(그래디언트)로 파라메터를 조금씩 업데이트해 주면 됩니다(gradient ascent). 이를 파이썬 코드로 구현한 결과는 다음과 같습니다.

#train data set = {(x, y)} def get_all_labels ( train_data ): available_labels = set () for x , y in train_data : available_labels . update ( y ) return list ( available_labels ) # m = feature vector size import random def initial_weights ( m ): return [ random . random () for _ in range ( m )] def train ( train_data , FeatureFunctions , m , iterations = 100 , learning_rate = 0.1 ): all_labels = get_all_labels ( train_data ) weights = initial_weights ( m ) for _ in range ( iterations ): for i in range ( 1 , m ): empirical_expectation = \ calc_empirical_expectation_feature_i ( train_data , FeatureFunction , i ) predicted_expectation = \ calc_predicted_expectation_feature_i ( train_data , FeatureFunction , all_labels , weights ) weights [ i ] = weights [ i ] + \ learning_rate * ( empirical_expectation – predicted_expectation )

비터비 알고리즘

시퀀스 분류를 하기 위해 이 먼길을 돌아왔습니다. CRF가 최적 상태열을 inference하는 기법인 비터비 알고리즘은 다음과 같이 동작합니다.

다음 과정입니다.

다음 과정입니다.

마지막으로 backtrace 과정입니다.

5. Conditional Random Field(CRF) 이해 및 구현

– 계속 봐도, potential function에 대해서 일일히 룰기반으로 작성해야하는건지 템플릿이라는 것으로 어느정도 자동화 할 수 있는 건지 이해가 안가는 부분이 있으나, 뒤에 예시를 살펴보면서 보완 가능할 듯..

– MEMM 은 시퀀스 데이터 x에 대해서 앞부분 부터 적절한 라벨을 찾아간다.

즉, n번의 순차적인 분류를 수행하지만

– CRF 는 가능성이 있는 시퀀스 후보를 몇 개 선택하고, 가장 적합한 하나의 라벨을 고른다.

[활용 예시]

위키백과, 우리 모두의 백과사전

조건부 무작위장(영어: conditional random field 조건부 랜덤 필드[*] )이란 통계적 모델링 방법중에 하나로, 패턴 인식과 기계 학습과 같은 구조적 예측에 사용된다. 일반적인 분류자(영어: classifier)가 이웃하는 표본을 고려하지 않고 단일 표본의 라벨을 예측하는 반면, 조건부 무작위장은 고려하여 예측한다. 자연 언어 처리 분야에서 자주 사용되는 선형 사슬 조건부 무작위장(영어: linear chain CRF)은 일련의 입력된 표본들에 대해 일련의 라벨들을 예측한다.

조건부 무작위장은 판별적 비방향성 그래프 모형의 한 형태이며, 관찰되는 것들의 알려진 관계를 암호화, 일관된 해석을 구성하는데 사용된다. 또, 자연언어로 된 글 또는 생물학적 서열 정보, 그리고 컴퓨터 비전 분야에서의 일련의 데이터에 대한 라벨 예측, 분석하는 데 사용되기도 한다. 구체적으로, 조건부 무작위장은 부분구문분석, 개체명 인식, 유전자 검색 등의 응용 분야에 사용될 수 있으며, 이러한 분야에서 은닉 마르코프 모델의 대안이 될 수 있다. 컴퓨터 비전 분야에서는 객체 인식, 이미지 분할에 종종 사용된다.

소개 [ 편집 ]

다양한 과학적 분야에서 시퀀스의 분할과 라벨링은 주요한 문제이다. 이러한 문제들의 해결 방법으로 은닉 마르코프 모델과 통계적 문법들(영어: stochastic grammars)이 적용되어왔으며 이들은 생물학이나 자연어 처리 등의 분야에서 매우 성공적인 결과를 도출하기도 하였다. 하지만 이들은 상호작용하는 여러 자질이 존재하는 경우, 혹은 관측값에서 긴범위의 의존성이 발견되는 경우, 이들 모델에 대한 추론이 다루기 힘든(영어: intractable) 문제가 되어버린다는 단점이 있었다. 이에 반해 조건부 무작위장에서는 관측 값을 모델링 하는데에 걸리는 시간을 고정시킬 뿐 아니라 독립성에 대해서 매우 엄격한 가정을 요구하는 생성모델(영어: generative model)과 달리 레이블 시퀀스의 조건부 확률은 관측 시퀀스의 임의의 독립적이지 않은 기질들에 의존하는 것이 가능하다. 이런점들은 조건부 무작위장이 분할과 라벨링 문제에 새로이 제안되게 하는 동기로 작용하였다.[1]

조건부 무작위장을 간단하게 설명하면 입력 시퀀스에 대한 출력 시퀀스의 조건부 확률이라고 할 수 있다. 수학적인 표현을 사용하여 매우 간단하게 표시하면 다음과 같이 할 수 있다.

p ( y | x ) , {\displaystyle p(y|x),} 여기서, x , y {\displaystyle x,y} 는 시퀀스이다.

예를 들어, x = ( a , b , c ) , y = ( x , y , z ) , {\displaystyle x=(a,b,c),y=(x,y,z),}

x , y {\displaystyle x,y} 시퀀스에 대하여서는 제약이 없다.

즉 예를 들면, 조건부 무작위장은 문자 a, b, c 가 연속적으로 나타났을 때, 문자 x, y, z를 연속적으로 부여할(나타날) 확률을 의미한다고 할 수 있다. 여기서 y는 마르코프 성질을 만족하여야 한다. 그런데 만약 x의 집합과 y의 집합이 한정되어 있다면, 이 구조는 그래프 구조를 형성하게 된다. 일반적으로는 체인(영어: chain) 그래프 구조를 형성한다고 한다. [2]

수학적 정의 [ 편집 ]

조건부 무작위장 ( Y , X ) {\displaystyle (Y,X)} 는 방향이 없는(영어: undirected) 그래프 G = ( V , E ) {\displaystyle G=(V,E)} 혹은 마르코프 무작위장으로 간주할 수 있다. 만약, 입력 시퀀스에서 조건부 독립을 가정할 수 있다면, 이론적으로 그래프의 구조는 여러 가지 형태를 나타낼 수 있다. 하지만 응용에서는 일반적으로 Y {\displaystyle Y} 에 해당되는 노드는 간단한 체인(영어: chain)의 형태를 나타내는 경우가 많다[1]. 조건부 무작위장은 은닉 마르코프 모델(HMM, Hidden Markov Model)에 비하여 변수 독립성 조건이 필요 없는 장점이 있다고 한다. 또한 조건부 무작위장은 최대 엔트로피 마르코프 모델(MEMM, Maximum Entropy Markov Model)에 비하여 변수 치우침(bias)이 없는 장점이 있다고 한다[1]. 다음은 조건부 무작위장의 정의이다[1].[2]

G = ( V , E ) {\displaystyle G=(V,E)} 는 그래프 구조 이고, Y = ( Y v ) v ∈ V {\displaystyle Y=(Y_{v})_{v{\in V}}} 로서, Y {\displaystyle Y} 는 그래프 G {\displaystyle G} 의 정점(영어: vertex)을 나타낸다고 하고 E {\displaystyle E} 는 간선(영어: edge)이라고 하자. 만약 랜덤 변수 X {\displaystyle X} 에 대하여 랜덤 변수 Y v {\displaystyle Y_{v}} 가 그래프에서 마코프 성질을 나타낸다면, 즉, P ( Y v | X , { Y w : w ≠ v } ) = P ( Y v | X , { Y w : w ∼ v } ) {\displaystyle P({\boldsymbol {Y}}_{v}|{\boldsymbol {X}},\{{\boldsymbol {Y}}_{w}:w

eq v\})=P({\boldsymbol {Y}}_{v}|{\boldsymbol {X}},\{{\boldsymbol {Y}}_{w}:w\sim v\})} 라면 ( X , Y ) {\displaystyle (X,Y)} 는 조건부 랜덤 필드가 된다. (여기서 w ∼ v {\displaystyle w\sim v} 는 w {\displaystyle w} 와 v {\displaystyle v} 는 서로 이웃이라는 의미)

Y {\displaystyle Y} G = ( V , E ) {\displaystyle G=(V,E)} 트리( 영어: tree )를 형성한다면, Y {\displaystyle Y} 클릭( 영어: clique )는 간선( 영어: edge )과 정점( 영어: vertex )이 된다. 따라서 시퀀스 X {\displaystyle X} Y {\displaystyle Y}

p θ ( y | x ) ∝ e x p ( ∑ e ∈ E , k λ k f k ( e , y | e , x ) + ∑ v ∈ V , k μ k g k ( v , y | v , x ) ) {\displaystyle p_{\theta }(y|x)\propto exp(\sum _{e\in E,k}\lambda _{k}f_{k}(e,y|_{e},x)+\sum _{v\in V,k}\mu _{k}g_{k}(v,y|_{v},x))}

여기서 x {\displaystyle x} y {\displaystyle y} y | s {\displaystyle y|_{s}} y {\displaystyle y} G {\displaystyle G} S {\displaystyle S} 영어: vertex )과 관계된다. f k {\displaystyle f_{k}} g k {\displaystyle g_{k}} 위 수식을 다르게 해석할 수 있다. 수식에서 앞에 위치한 항목은 그래프에서 입력 시퀀스에 의하여 현재의 정점( 영어: vertex )에서 다음 정점( 영어: vertex )으로 이동하는 천이 특징 함수( 영어: transition feature function )로 간주할 수 있고, 뒤 항목은 현재의 정점( 영어: vertex )의 상태 특징 함수( 영어: state feature function )로 간주할 수 있다. 즉, 위 식은 입력되는 시퀀스의 요소들에 의하여 현재의 정점( 영어: vertex )에 그대로 존재하는 경우를 나타내기도 하고, 또는 다음 정점( 영어: vertex )으로 이동하는 것을 나타내기도 한다. 전체적으로는 입력되는 시퀀스에 의하여 그래프의 정점( 영어: vertex ) 상에서 움직이는 상태와 이와 관련된 확률을 나타낸다.

Y {\displaystyle Y} 영어: chain )을 구성하고 있다고 가정하면, 조건부 무작위장 확률을 다음과 같이 표현할 수도 있다.

p θ ( y | x ) = ∏ i = 1 n + 1 M i ( y i − 1 , y i | x i ) ∏ i = 1 n + 1 M i ( x ) ) b e g i n , s t o p {\displaystyle p_{\theta }(y|x)={\prod _{i=1}^{n+1}M_{i}(y_{i-1},y_{i}|x_{i}) \over \prod _{i=1}^{n+1}M_{i}(x))_{begin,stop}}}

여기서, y 0 = b e g i n {\displaystyle y_{0}=begin} y n + 1 = s t o p {\displaystyle y_{n+1}=stop}

추론 방법 [ 편집 ]

효율적인 추론은 조건부 무작위장의 훈련 시 혹은 새로운 입력에 대한 레이블을 예측할 때 매우 중요하다. 추론에 있어 크게 2가지 문제를 생각할 수 있다.

첫 번째로, 모델을 훈련한 후, 새로운 입력 x {\displaystyle x} 에 대한 레이블 y {\displaystyle y} 를 예측하려 할 때, 가장 가능도(영어: likelihood)를 크게 하는 y {\displaystyle y} 를 선택하는 것이다. 즉 다음과 같이 나타낼 수 있다:

y ^ = a r g m a x y ⁡ p ( y | x ) {\displaystyle {\hat {y}}=\operatorname {argmax_{y}} \ p(y|x)}

두 번째로, 파라미터를 추정할 때 각각의 간선(영어: edge) p ( y t , y t − 1 | x ) {\displaystyle p(y_{t},y_{t-1}|x)} 와 정규화 함수 Z ( x ) {\displaystyle Z(x)} 에 대한 주변분포(영어: marginal distribution)을 계산하는 것이다. 이 두 추론 문제는 근본적으로 같다고 볼 수 있다.[3]

정확한 추론 방법 [ 편집 ]

불행히도 앞에서 언급된 두 추론 문제는 일반 그래프에 대해서는 다루기 힘든(영어: intractable) 문제이다. 추론을 정확하고 빠르게 할 수 있는 경우는 다음과 같은 경우만 가능하다:

근사적 추론 방법 [ 편집 ]

위 두 경우 외에 보다 복잡한 모델, 즉 일반 그래프에서도 일부 상황에서는 정확한 추론이 효율적으로 될 수 있다. 이는 접합 트리 알고리즘(영어: junction tree algorithm)을 이용해 그래프 상에서 변수들을 군집화 하여 트리 형태로 만든 후, 트리 구조에서 작동하는 정확한 추론 알고리즘을 작동시킴으로써 가능하다. 하지만, 일부 복잡한 그래프에서는 접합 트리 알고리즘이 거대한 변수 클러스터를 생성하여 효율적인 추론을 불가능하게 한다. 즉 일반 그래프에서는 최악의 경우 정확한 추론 알고리즘을 이용하면 지수적 시간(영어: exponential time)이 소요된다.[3]

이런 이유 때문에, 효율적 추론을 위해 일반적 그래프에서는 정확한 추론 알고리즘 보다는 근사적 추론 알고리즘이 필요하다. 주로 다음과 같이 두 종류의 근사 추론 알고리즘이 사용된다[3]:

몬테 카를로 방법은 치우침이 없는(영어: unbiased) 대신 계산 시간이 언제 끝날지 알 수 없다는 단점이 있다. 변분 방법은 이에 비해 상당히 빠르지만 치우침이 있어(영어: biased) 에러를 포함하며, 계산 시간을 늘리더라도 에러가 줄지 않는 단점이 있다. 파라미터 추정 과정에서 추론이 많은 회수 반복되기 때문에, 조건부 무작위장의 효율적인 학습을 위해서는 변분 방법이 더욱 선호된다.[3]

파라미터 학습 방법 [ 편집 ]

트리 구조에서의 학습 [ 편집 ]

만약 트리 기반 조건부 무작위장이라면, 파라미터 θ {\displaystyle \theta } 는 보통 p ( Y i | X i ; θ ) {\displaystyle p(Y_{i}|X_{i};\theta )} 에 대한 최대 가능도 학습(영어: maximum likelihood estimation)을 통해 얻어진다. 이를 통해, 학습 데이터의 확률값을 최대로 하는 θ {\displaystyle \theta } 를 구해낸다. 만약 모든 정점이 지수족 분포를 가지면서, 트레이닝 과정에서 관측(영어: observed)되었다면 가능도 함수는 볼록(영어: convex) 모양이다. 즉 이 최적화 문제는 경사 하강법(영어: gradient descent algorithm) 혹은 L-BFGS 알고리즘 같은 쿼시-뉴턴 방법(영어: Quasi-Newton method)를 이용하여 풀 수 있다. 이와 반대로 어떤 변수가 관측되지 않았을 경우, 이 변수들에 대한 추론 문제를 먼저 해결해야 한다.[3].

만약 동등하게 독립적으로 분포된(영어: identically independently distributed) 학습 데이터 D = { x ( i ) , y ( i ) } i = 1 N {\displaystyle {\mathcal {D}}=\{\mathbf {x} ^{(i)},\mathbf {y} ^{(i)}\}_{i=1}^{N}} (여기서 x ( i ) = { x 1 ( i ) , x 2 ( i ) , . . . x T ( i ) } {\displaystyle \mathbf {x} ^{(i)}=\{\mathbf {x} _{1}^{(i)},\mathbf {x} _{2}^{(i)},…\mathbf {x} _{T}^{(i)}\}} 는 입력 시퀀스를, y ( i ) = { y 1 ( i ) , y 2 ( i ) , . . . y T ( i ) } {\displaystyle \mathbf {y} ^{(i)}=\{y_{1}^{(i)},y_{2}^{(i)},…y_{T}^{(i)}\}} 는 입력에 대한 바람직한 예측 시퀀스를 나타낸다)가 주어졌을 때, 경사 하강법(영어: gradient descent)으로 구할 경우 다음과 같은 가능도 함수를 이용할 수 있다[3]:

ℓ ( θ ) = ∑ i = 1 N ∑ t = 1 T ∑ k = 1 K θ k f k ( y t ( i ) , y t − 1 ( i ) , x t ( i ) ) − ∑ i = 1 N log ⁡ Z ( x ( i ) ) {\displaystyle \ell (\theta )=\sum _{i=1}^{N}\sum _{t=1}^{T}\sum _{k=1}^{K}{\theta }_{k}f_{k}(y_{t}^{(i)},y_{t-1}^{(i)},\mathbf {x} _{t}^{(i)})-\sum _{i=1}^{N}\log Z(\mathbf {x} ^{(i)})}

여기서 Z ( x ) {\displaystyle Z(\mathbf {x} )} 는 정규화 상수(영어: normalization constant)이다.

과적합(영어: overfitting)을 피하기 위해 정칙화(영어: regularization)를 실시해 줄 수 있으며, 이 때 θ {\displaystyle \theta } 에 대한 유클리드 노름(영어: Euclidean norm)값을 페널티로 갖는 정칙화된 가능도 함수는 다음과 같다[3]:

ℓ ( θ ) = ∑ i = 1 N ∑ t = 1 T ∑ k = 1 K θ k f k ( y t ( i ) , y t − 1 ( i ) , x t ( i ) ) − ∑ i = 1 N log ⁡ Z ( x ( i ) ) − ∑ k = 1 K θ k 2 2 σ 2 {\displaystyle \ell (\theta )=\sum _{i=1}^{N}\sum _{t=1}^{T}\sum _{k=1}^{K}{\theta }_{k}f_{k}(y_{t}^{(i)},y_{t-1}^{(i)},\mathbf {x} _{t}^{(i)})-\sum _{i=1}^{N}\log Z(\mathbf {x} ^{(i)})-\sum _{k=1}^{K}{\theta _{k}^{2} \over 2\sigma ^{2}}}

여기서 σ 2 {\displaystyle \sigma ^{2}} 는 자유매개변수(영어: free parameter)로 가중치가 클수록 얼마나 페널티를 줄 것인지 결정한다.

유클리드 노름 대신에 L 1 {\displaystyle L_{1}} 노름을 페널티로 갖도록 정칙화를 실시해 줄 수 있으며, 그에 대한 가능도 함수는 다음과 같다[3]:

ℓ ( θ ) = ∑ i = 1 N ∑ t = 1 T ∑ k = 1 K θ k f k ( y t ( i ) , y t − 1 ( i ) , x t ( i ) ) − ∑ i = 1 N log ⁡ Z ( x ( i ) ) − α ∑ i = 1 N | θ k | {\displaystyle \ell (\theta )=\sum _{i=1}^{N}\sum _{t=1}^{T}\sum _{k=1}^{K}{\theta }_{k}f_{k}(y_{t}^{(i)},y_{t-1}^{(i)},\mathbf {x} _{t}^{(i)})-\sum _{i=1}^{N}\log Z(\mathbf {x} ^{(i)})-\alpha \sum _{i=1}^{N}|\theta _{k}|}

유클리드 노름을 이용한 가능도 함수에 편미분을 하여 기울기를 구하면 다음과 같다[3]:

∂ ℓ ∂ θ k = ∑ i = 1 N ∑ t = 1 T f k ( y t ( i ) , y t − 1 ( t ) , x t ( t ) ) − ∑ i = 1 N ∑ t = 1 T ∑ y , y ′ f k ( y , y ′ , x t ( i ) ) p ( y , y ′ | x ( i ) ) − θ k σ 2 {\displaystyle {{\partial \ell } \over {\partial \theta _{k}}}=\sum _{i=1}^{N}\sum _{t=1}^{T}f_{k}(y_{t}^{(i)},y_{t-1}^{(t)},\mathbf {x} _{t}^{(t)})-\sum _{i=1}^{N}\sum _{t=1}^{T}\sum _{y,y’}f_{k}(y,y’,\mathbf {x} _{t}^{(i)})p(y,y’|\mathbf {x} ^{(i)})-{{\theta _{k}} \over {\sigma ^{2}}}}

앞에서 세운 가능도 함수와 기울기 식을 이용해 가능도 함수를 극대화 시키는 θ {\displaystyle \theta } 를 찾아내면 된다. 가능도 함수를 최적화 시키는 간단한 방법으로는 기울기에 대한 최대 경사법(영어: steepest ascent)를 사용하는 방법이 있다. 하지만 이 방법은 많은 반복(영어: iteration)을 요구하기 때문에 실용적이지 못하다. 뉴턴의 방법(영어: Newton’s method)은 속도가 더 빠르지만 파라미터에 대한 헤세 행렬(영어: Hessian: 모든 이차 미분값에 대한 행렬)을 계산해야하기 때문에 많은 저장 공간을 요구함으로써 실용적이지 못하다. 주로 BFGS와 같은 쿼시-뉴턴 방법 혹은 켤레기울기법(영어: conjugate gradient method)을 이용해 근사치를 계산하는 방법이 주로 사용된다.[3]

일반 그래프에서의 학습 [ 편집 ]

만약 조건부 무작위장이 일반적 그래프일 경우, 최대 가능도 학습으로는 θ {\displaystyle \theta } 를 구하기 쉽지 않다(영어: intractable). 이 문제를 다루기 위해서는 근사적 추론 방법을 이용하거나, 혹은 최대 가능도 방법 외에 다른 학습 기준을 선택해야 한다.

예제 [ 편집 ]

시퀀스 모델링(영어: sequence modelling) 은 보통 연쇄 그래프(영어: chain graph: 방향성이 있거나 없는 간선(영어: edge)을 모두 가질 수 있으며 방향성 순환이 없는 그래프)를 이용해 모델링된다. 관측된 변수들의 벡터 X {\displaystyle X} 의 입력 시퀀스는 일련의 관측을 표현하며, Y {\displaystyle Y} 는 관측된 값이 주어졌을 때 추론되어야 할 숨겨진 변수(영어: hidden state variable or 영어: unknown state variable)들을 나타낸다. Y i {\displaystyle Y_{i}} 는 Y i − 1 {\displaystyle Y_{i-1}} 과 Y i {\displaystyle Y_{i}} 사이에 간선(영어: edge)이 연결되는 연쇄적인 구조로 조직된다. 이러한 구조는 Y i {\displaystyle Y_{i}} 를 입력 시퀀스의 각 입력에 대한 레이블(영어: label)로써 해석할 수 있는 간편함이 있으며,이 외에도 이러한 구조를 사용함으로써 다음과 같은 작업들을 효율적으로 처리할 수 있는 장점이 있다:

모델 훈련( 영어: model training ): 트레이닝 데이터 뭉치( 영어: corpus )에서부터 추출한 자질 함수( 영어: feature function )들과 Y i {\displaystyle Y_{i}}

): 트레이닝 데이터 뭉치( )에서부터 추출한 자질 함수( )들과 디코딩( 영어: decoding ): X {\displaystyle X} Y {\displaystyle Y}

): 추론( 영어: inference ): X {\displaystyle X} Y {\displaystyle Y}

X {\displaystyle X} 에 대한 각 Y i {\displaystyle Y_{i}} 의 조건부 의존성(영어: conditional dependency)은 f ( i , Y i − 1 , Y i , X ) {\displaystyle f(i,Y_{i-1},Y_{i},X)} 의 형태를 갖는 자질 함수들의 고정된 집합을 통해 정의된다. 이 함수는 입력 시퀀스에 대해 각 Y i {\displaystyle Y_{i}} 값에 대한 가능도(영어: likelihood)를 어느 정도 결정할 수 있는 측정치로 간주될 수 있다. 이 모델은 각 자질에 대해 수치적 가중치를 부여하고 이를 조합함으로써 Y i {\displaystyle Y_{i}} 의 값에 대한 확률을 결정한다.

선형 체인 조건부 무작위장(영어: linear-chain CRFs)은 개념적으로 보다 단순한 은닉 마르코프 모델과 응용되는 문제가 비슷하다. 단, 입력, 출력 시퀀스의 분포에 대한 가정을 어느 정도 완화하였다. 은닉 마르코프 모델은 상태 전이(영어: state transition)와 방출(영어: emission)을 모델링하기 위해 고정된 확률(영어: constant probability)을 사용하는 자질 함수만을 갖는 조건부 무작위장으로 생각될 수 있다. 반면, 조건부 무작위장은 은닉 마르코프 모델의 일반화된 모델로 생각될 수 있으며, 고정된 전이 확률(영어: transition probability) 대신에 일련의 숨겨진 상태(영어: hidden state)들의 조직에 따라 달라지는 임의의 함수를 입력 시퀀스에 맞추어 사용한다.

은닉 마르코프 모델과는 대조적으로 주목할 점은, 조건부 무작위장은 임의의 개수의 자질 함수를 포함할 수 있으며, 이 자질 함수는 추론 중 어느 시점에서라도 전체 입력 시퀀스 X {\displaystyle X} 를 조사할 수 있고, 자질 함수의 범위(영어: range)는 확률적으로 해석될 필요가 없다.

데이터 시퀀스 라벨링 모델 비교 [ 편집 ]

데이터 시퀀스 라벨링을 위한 대표적 그래프 모델 3가지 [ 편집 ]

다른 방법에 비한 장점 [ 편집 ]

특정 위치에서 입력에 대한 측정값 확신 [ 편집 ]

은닉 마르코프 모델과는 달리, 조건부 무작위장은 특정 위치에서의 측정값을 확신할 수 있다. 이는 은닉 마르코프 모델은 생성 모델, 조건부 무작위장은 판별 모델에서 기인한 것에서 생겨난 차이다.[4]

라벨 편향 문제 해결 [ 편집 ]

최대 엔트로피 마르코프 모델이나 다른 마르코프 무작위장 모델, 즉, 방향성 그래프 모델로부터 발견될 수 있는 약점인 라벨 편향 문제를 피할 수 있다. 이는 조건부 무작위장이 비방향성 그래프 모델로 정의되기 때문이다.

일련 데이터 라벨링 [ 편집 ]

생물정보학, 전산언어학, 음성 인식 분야에서 일련된 데이터의 라벨링시, 은닉 마르코프 모델, 최대 엔트로피 마르코프 모델보다 좋은 성능을 기대할 수 있다.

다른 방법에 비한 한계점 [ 편집 ]

라벨링된 트레이닝 데이터의 필요성 [ 편집 ]

다른 방법들과 달리, 조건부 무작위장은 라벨링된 트레이닝 데이터가 필요하다.

느린 트레이닝 알고리즘 [ 편집 ]

마르코프 네트워크( 영어: Markov Random Field, MRF )보다 트레이닝 알고리즘의 시간 복잡도가 더 크다.

보편적 사용의 어려움 [ 편집 ]

일반적으로 규모에 제대로 적응하지 못한다. 특히, 내부 상태가 매우 많이 필요한 응용이거나 간선( 영어: edge ) 연결이 매우 많은 그래프 구조일 때 더욱 그렇다[5] [6] 활용 연구 사례 [ 편집 ]

자연언어 처리 [ 편집 ]

화자 의도 예측: 대화에서 화자의 의도를 통계적으로 예측하기 위한 모델로서 활용되기도 하는 한편, 문서의 범주화, 절인식 등의 구문분석에 이용되는 등 다양한 활용의 예를 찾아볼 수 있다. [7] [8] [9] [10] [11]

정보 추출: 제목, 저자, 참고 문헌과 같은 데이터를 추출한다. [12]

단어 분리: 중국어 말뭉치를 분할하여 단어 리스트를 얻는다. [13]

단어 정렬: 언어 간의 단어 정렬 순서 모델의 오차율을 줄인다. [14]

명사구 청킹(덩이짓기): CoNLL-2000 shared tast[15]에서 제시한 명사구 청킹을 얼마나 정확하게 수행하는지 알아본다.[16]

HCI [ 편집 ]

동작 모델 제작: 특징 변환을 이용하여 제스체 인식 시스템을 제작하였다. [17]

동작 인식: 인간의 팔, 머리의 움직임을 보다 정확히 분석하는 방법을 제시한다.[18][19]

컴퓨터 비전 [ 편집 ]

3D 동영상 변환: 객체 분할로 2D 동영상을 3D 동영상으로 변환한다. [20]

필기 인식: 웹 상에서 표기되는 일본어 문장 인식을 하는 방법을 제시한다. [21]

스테레오 비전: 파라미터 최적화에 필요한 추론을 극도로 가속화하여 효율적으로 희소 메시지를 전달한다. [22]

영상 분할: 영상의 분할, 라벨링 문제에서 조건부 무작위장을 이용하는 것이 효율적이라 알려져 있다. 특히 이들을 PET 영상에서 뇌의 각 영역들을 분할하거나, 암 세포 등의 병변을 분할해내는데에 활용한 연구들이 있다.[23][24]

생물정보학 [ 편집 ]

단백질 곁사슬 예측: 학습을 통해 트리 가중치 조정하는 분할 알고리즘이 전역적으로 최적화할 수 있도록 돕는다.[25]

소프트웨어 [ 편집 ]

아래는 일반적인 조건부 무작위장 도구로 알려진 목록이다.

아래는 조건부 무작위장과 관련된 도구로 알려진 목록이다.

Conrad CRF based gene predictor (자바)

Stanford NER Named Entity Recognizer (자바)

BANNER Named Entity Recognizer (자바)

같이 보기 [ 편집 ]

참고 문헌 [ 편집 ]

가 나 다 라 Lafferty, John, Andrew McCallum, and Fernando CN Pereira. “Conditional random fields: Probabilistic models for segmenting and labeling sequence data.” (2001). 가 나 이호석. “조건부 랜덤 필드와 응용에 대한 고찰.” 한국정보과학회 학술발표논문집 36.2C (2009): 184-187. 가 나 다 라 마 바 사 아 자 차 카 타 파 Sutton, C., & McCallum, A. (2011). An introduction to conditional random fields. Machine Learning, 4(4), 267-373. ↑ “What Are Conditional Random Fields?”, Perpetual Enigma, http://prateekvjoshi.com/2013/02/23/what-are-conditional-random-fields ↑ Cohn, Trevor. “Efficient inference in large conditional random fields.” Machine Learning: ECML 2006. Springer Berlin Heidelberg, 2006. 606-613. ↑ Murphy, Kevin P. Machine learning: a probabilistic perspective. MIT press, 2012. ↑ 김동현, 김학수, and 서정연. “목적지향 대화에서 화자 의도의 통계적 예측 모델.” 정보과학회논문지: 소프트웨어 및 응용 35.9 (2008): 554-561. ↑ 김학수. “능동학습법을 이용한 한국어 대화체 문장의 효율적 의미 구조 분석.” 정보과학회논문지: 소프트웨어 및 응용 35.5 (2008): 306-312. ↑ 임석향, et al. “언어 모델을 이용한 유해 문서 분류.” 한국정보과학회 학술발표논문집 36.1C (2009): 301-304. ↑ 배원식, and 차정원. “TextRank 알고리즘을 이용한 문서 범주화.” 정보과학회논문지: 컴퓨팅의 실제 및 레터 16.1 (2010): 110-114. ↑ 정헌영, et al. “의견의 주체를 찾기 위한 후보어휘의 의견주체점수 부여 방법과 Self-training.” 한국정보과학회 학술발표논문집 36.1C (2009): 341-345. ↑ Peng, Fuchun, and Andrew McCallum. “Information extraction from research papers using conditional random fields.” Information processing & management 42.4 (2006): 963-979. ↑ Peng, Fuchun, Fangfang Feng, and Andrew McCallum. “Chinese segmentation and new word detection using conditional random fields.” Proceedings of the 20th international conference on Computational Linguistics. Association for Computational Linguistics, 2004. ↑ Blunsom, Phil, and Trevor Cohn. “Discriminative word alignment with conditional random fields.” Proceedings of the 21st International Conference on Computational Linguistics and the 44th annual meeting of the Association for Computational Linguistics. Association for Computational Linguistics, 2006. ↑ E. F. Tjong Kim Sang and S. Buchholz. “Introduction to the CoNLL-2000 shared task: Chunking”. In Proc. CoNLL-2000, pages 127–132, 2000. ↑ Sha, Fei, and Fernando Pereira. “Shallow parsing with conditional random fields.” Proceedings of the 2003 Conference of the North American Chapter of the Association for Computational Linguistics on Human Language Technology-Volume 1. Association for Computational Linguistics, 2003. ↑ 허세경, et al. “특징 변환과 은닉 마코프 모델을 이용한 팔 제스처 인식 시스템의 설계.” 정보처리학회논문지. 소프트웨어 및 데이터 공학 2.10 (2013): 723-730. ↑ Wang, Sy Bor, et al. “Hidden conditional random fields for gesture recognition.” Computer Vision and Pattern Recognition, 2006 IEEE Computer Society Conference on. Vol. 2. IEEE, 2006. ↑ 김혜숙, and 김인철. “시점 불변인 특징과 확률 그래프 모델을 이용한 인간 행위 인식.” 정보과학회논문지 41.11 (2014): 927-934. ↑ 이상학. “학습기반의 객체분할과 Optical Flow를 활용한 2D 동영상의 3D 변환.” 한국인터넷방송통신학회 논문지 11.3 (2011): 129-135. ↑ Zhou, Xiang-Dong, Cheng-Lin Liu, and Masaki Nakagawa. “Online handwritten Japanese character string recognition using conditional random fields.” Document Analysis and Recognition, 2009. ICDAR’09. 10th International Conference on. IEEE, 2009. ↑ Weinman, Jerod J., Lam Tran, and Christopher J. Pal. “Efficiently learning random fields for stereo vision with sparse message passing.” Computer Vision–ECCV 2008. Springer Berlin Heidelberg, 2008. 617-630. ↑ 김선월, and 조완현. “의료영상분할을 위한 조건부 랜덤 필드 모델링.” 한국멀티미디어학회 학술발표논문집 (2009): 641-642. ↑ Lee, Chi-Hoon, et al. “Segmenting brain tumors with conditional random fields and support vector machines.” Computer vision for biomedical image applications. Springer Berlin Heidelberg, 2005. 469-478. ↑ Yanover, Chen, Ora Schueler-Furman, and Yair Weiss. “Minimizing and learning energy functions for side-chain prediction.” Journal of Computational Biology 15.7 (2008): 899-911. ↑ T. Lavergne, O. Cappé and F. Yvon (2010). Practical very large scale CRFs Archived 2013년 7월 18일 – 웨이백 머신 . Proc. 48th Annual Meeting of the ACL , pp. 504-513.

pyy0715.github.io/2019-12-15-CRF.md at master · pyy0715/pyy0715.github.io

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

CRF(Conditional Random Fields : 조건적 임의 필드)

자료 #1

CRF는 HMM과 근본적으로 다르지는 않습니다. HMM은 아주 단순히 말하자면 현재 상태에서 다음 상태로 전이 확률과 특징 확률을 곱하는 방식이지요. 아주 거칠게 말해서, CRF는 상태 함수가 여럿으로 구성된 HMM으로 말할 수 있습니다.(물론 이 말을 그대로 믿으면 안됩니다. 단순한 묘사일 뿐입니다.)

HMM은 워낙 단순한 모델이기 때문에 전이함수 * 상태함수만 생각합니다. 여러 함수들을 섞으려면 곱하기만 하면 0에 가까운 작은 값을 나타내는 함수의 영향이 너무 크고, 더하기만 하면 1에 가까운 큰 값을 나타내는 함수의 영향이 너무 큽니다. 이 문제는 아무리 가중치를 주어도 해결하기 힘듭니다. 그래서 참 많이 고민이 됩니다.

CRF는 여러 특징 함수를 섞는 문제를 해결하는 모델입니다. 전이함수와 특징함수를 가중치를 곱한 채로 몽땅 더해서 지수값을 취한 다음에 정규화를 합니다. 나중에는 특징함수와 전이함수의 구분조차 없애버리더군요. -_-;;; 해당 수식은 http://www.inference.phy.cam.ac.uk/hmw26/papers/crf_intro.pdf 의 4페이지에 모두 나와있습니다. 이게 워낙에 튼튼한 방법이라서, 각 함수가 1~0 사이에서 어떠한 자유로운 결과를 내도 됩니다. 나중에 보정을 하면 되니까요. 이게 잘 이해가 안되면 극단적으로, 대충 함수를 열거하면 알아서 조정해주는 프로그램으로 생각하면 됩니다. 저도 그렇게 생각하고 있습니다 ^^;

특징 함수의 종류에는 ‘이 단어의 첫 글자가 대문자이면 명사일 확률이 1이다’ ‘앞 단어가 the 이면 명사일 확률이 1이다’ 등의 단순한 함수조차도 들어갈 수 있습니다. 물론 더 복잡한 함수들도 얼마든지 들어갈 수 있습니다. 각 특징 함수들은 가중치를 가집니다. 학습 데이터를 통해서 그 최적값을 찾아내야 좋은 결과를 얻을 수 있습니다. 이 학습 과정에 관한 연구도 꽤 있습니다. 물론 이를 자동으로 하는 오픈소스 패키지도 있습니다.

HMM은 매우 단순한 모델링 방법이며, forward-backward와 Viterbi 같은 단순한 해석 알고리즘이 주 해석 방법으로 쓰입니다. CRF도 Viterbi와 같은 해석 알고리즘을 활용할 수 있습니다. 이러한 알고리즘들은 통신에서 잡음 제거를 하는 분야에도 널리 쓰이니, 서로 참고하면 좋습니다.

CRF를 연쇄로 적용할 수도 있습니다. Higher-order CRF는 임의로 정한 길이만큼 연쇄하는 겁니다. bigram HMM을 한 번 더 묶어서 trigram HMM을 만드는 식이랄까요? 당연히 연쇄를 길게 할 수록 품질은 좋아집니다. 하지만 한 단계를 넘어갈 때마다 지수급수적으로 계산량과 필요한 학습 자료량이 늘어나므로, 5단계 이상은 힘듭니다. 그래서 나온게 semi-CRF입니다. 이건 품질이 좋은 긴 연쇄만 남기고, 나머지는 짧은 연쇄로 인식하는 가변 연쇄 방식입니다. 속도도, 품질도 좋다고 합니다.

자료 #2 (자료 #1에 대한 댓글)

CRFs에 대해 얘기할 때 보통 HMM과 MEMM을 함께 설명합니다. 본문에서 잘 설명해주셨듯 HMM은 Markov assumption이라는 강한 독립 가정 아래 모델링을 합니다. 이는 real problem에 대한 모델링을 쉽게 할 수 있다는 장점이 있는 대신 현재 hidden state가 현재의 observation state의 영향을 받는다는 단점이 있습니다. 이를 해결하기 위한 model이 maximum entropy model입니다. 하지만, MEMM 역시 label bias problem이 있습니다. lable bias problem은 MEMM에서 최적의 path를 찾을 때 전체 path에 대한 확률을 고려하지 않아 생기는 문제로 이를 해결하고자 path를 정규화한 것이 CRFs라고 할 수 있습니다.

자료 #3

http://fabj.tistory.com/31

[Probabilistic Graphical Models] Conditional Random Fields

https://www.coursera.org/learn/probabilistic-graphical-models/lecture/UJ1Ke/conditional-random-fields

Conditional random field(CRF)는 마르코프 네트워크에서 파생된 주요 기법 중 하나입니다. 많은 분야에서 사용되며, 형태는 마르코프 네트워크와 비슷하지만 사용 목적은 약간 다릅니다. 지금부터 우리는 입력 변수 X로 부터 출력변수 Y를 구하는 Task-예측을 하려고 합니다. 가령, 이미지 세분화에서는 입력값으로 픽셀의 값(RGB, 히스토그램)을 사용하고, 출력으로는 각 픽셀의 클래스(잔디, 하늘, 소, 물) 등이 될 수 있습니다. 텍스트 처리에서는 입력으로 각 문자의 단어를 사용하고, 이를 통해 그 단어의 클래스(사람, 장소, 조직, 등)를 예측 합니다. 이러한 것을 기존의 방법을 사용해서 수행 할 수는 없을까요? 왜 새로운 Conditional random field라는 것을 도입해야하는지 아래 예를 통해 살펴 보겠습니다.

기존 방법의 문제를 먼저 보겠습니다. 특정 슈퍼픽셀의 레이블 $C_i$를 예측하려 합니다. 이를 위해 슈퍼픽셀의 피쳐(RGB, 텍스쳐 히스토그램 등)를 처리하여, 슈퍼픽셀의 특성의 정의 할 수 있습니다. 여기서 레이블 $C_i$는 Y에 해당하며 슈퍼픽셀의 피쳐는 X에 해당합니다. 여기서 문제는 이러한 피쳐들이 서로 매우 높은 관련성(Correlation)을 가지고 있는 점입니다. 가령 텍스쳐 히스토그램은 슈펴픽셀 내 선의 방향을 표현합니다. 이는 슈퍼픽셀의 내부 구조나 텍스쳐와 매우 깊은 관련성을 가집니다. 이러한 경우 나이브 베이즈(Naive Bayes)을 사용하면, 피쳐들은 서로 독립적으로 표현되므로, 그들 간의 관련성은 무시됩니다. 따라서 실제 이러한 피쳐들은 독립이 아닌데, 이를 무시하고 독립적으로 간주했기 때문에 유사한 피쳐가 여러번 계산 됩니다. 당연히 좋치 않은 결과가 나올 것입니다. 그렇다면 이를 해결하기 위해 서로의 관련성을 표현하는 간선들로 피쳐들을 연결해야 할까요? 하지만 이것은 굉장히 어려운 일입니다. 피쳐들간의 관련성을 모델링해야하며, 간선들이 추가되어 전체 네트워크는 굉장히 복잡해질 것입니다.

이제 다른 방법으로 접근해보겠습니다. 이제 이미지의 피쳐에 대해서는 생각하지 않겠습니다. 이제 각 픽셀내 피쳐의 확률 분포에 대해서는 신경 쓰지 않습니다. 즉 갈색 픽셀 옆에 녹색 픽셀이 있을 확률 같은 것은 신경 쓰지 않습니다. 그저 주어진 X라는 특성을 통해 Y의 확률 분포를 모델링합니다. 앞의 모델에서는 주어진 전체 네트워크에 대한 확률 분포 $P(X, Y)$를 구하려 했다면, 위 방법은 주어진 X로 부터 Y의 분포 $P(Y|X)$를 구합니다. 이를 Conditional random field(CRF)라 합니다. X가 조건으로 들어갔으므로 이제 더 이상 그들 사이의 관련성에 대해 신경 쓰지 않아도 됩니다.

Conditional random field를 어떻게 구하는지 식으로 알아보겠습니다. 우선 Conditional random field 역시 네트워크의 특성을 나타내는 factor를 가지고 있습니다. Gibbs distribution때와 동일하게 그들을 곱해 전체 네트워크에 대한 unnormalized 확률 분포를 구합니다. X를 조건으로 두기위해, 위 식처럼 Y변수에 대한 합을 구합니다. 이제 X의 partition function $Z_{\Phi}(X)$는 X에 대한 확률 분포를 나타냅니다. 이를 앞에서 구한 전체 네트워크의 확률 분포에 나눠주면 Conditional random field를 구할 수 있습니다. 위 표는 이진 변수 x, y으로 이루어진 네트워크의 확률 분포를 나타냅니다. x0y0, x0y1를 더해 Z(x0)구한 다음 이를 x0y0, x0y1에 나눠 주면 x0에 대한 조건부 확률이 됩니다. x1에 대해서도 동일하게 적용 할 수 있습니다.

이제, x, y가 이진 값을 가지고 factor가 위와 같이 지수함수로 표현 되는 logistic model의 경우를 보겠습니다. $\phi_i(X_i, Y=1)$인 경우 위 식에서 $1{X_i=1, Y=1}$은 X가 0이면 0, 1이면 1의 값을 가집니다. 따라서 X값을 그대로 가진다고 볼 수 있습니다. 즉 $\phi_i(X_i, Y=1)$=$exp{(w_i X_i)}$ 입니다. $\phi_i(X_i, Y=0)$인 경우 X값에 상관없이 0이 곱해지므로 $\phi_i(X_i, Y=1)=1$입니다. $P(Y=1, X_1, …, X-n)$는 $\phi_i(X_i, Y=1)$의 곱과 같고 이는 지수 승에서 합으로 표현됩니다. $P(Y=0, X_1, …, X-n)$는 1을 곱하는 것이므로 그 값은 1이 됩니다. partition function Z(X)는 Y에 대한 합으로 표현 할 수 있으므로 $1+exp(\Sigma w_i X_i)$와 같습니다. 이제 이를 $P(Y=1, X_1, …, X-n)$에 나누면 주어진 X피쳐로 부터 Y가 1일 확률을 구할 수 있습니다. 이를 식으로 나타나면 위와 같습니다. 이 식은 오른쪽 그림처럼 시그모이드(sigmoid)함수와 형태인 것을 볼 수 있습니다. 따라서 logistic model은 CRF를 사용하여 매우 간단한 시그모이드 함수로 모델링 할 수 있습니다. 그리고 새로운 $X_i$가 추가 된다고 하더라도 위 식이 시그모이드 함수인 것은 변함 없습니다. 따라서 CRF에서는 입력 변수 사이의 관련성에 신경을 쓰지 않아도 된다는 것을 알 수 있습니다. 즉 피쳐를 늘려 모델의 변수가 증가한다고해도 각 입력 변수사이의 관련성에 대해 걱정하지 않아도 됩니다.

앞선 이미지 세그멘테이션 예제를 통해 CRF의 개념을 보겠습니다. 각 Factor는 입력변수(히스토그램, 텍스쳐피쳐)는 레이블과 관련성을 가지고 있고 이는 factor로 표현됩니다. 그리고 이는 “소의 눈”과 같이 서로 다른 패치들로 나눠집니다. 그리고 이러한 패치들 역시 서로 관련성이 있습니다. 하지만 여기서는 신경쓰지 않을 것입니다. 우리는 여기서 각 패치의 입력 변수와 레이블 간의 factor를 통해 CRF를 구한 다음, 이것을 사용 할 것입니다. 그런 다음 성능을 높이기 위해 support vector machine, boosting과 같은 분류기를 통해 학습시킵니다.

단어 레이블링의 경우도 비슷한 방법으로 수행됩니다. 각 단어와 레이블 사이의 관련성에 대한 factor가 있을 것입니다. 가령 대문자로 시작하면 사람이름일 가능성이 높다거나, 어미의 형태등에 따른 품사를 구분 할 수도 있습니다. 이때 역시 이러한 factor를 통해 CRF를 구한 다음, 각 단어가 어떤 품사를 가질지에 대한 확률 분포를 계산 할 수 있습니다.

CRF역시 Gibbs distribution과 같이 노말라이즈 과정이 있지만, 차이점은 한 변수에 대한 partition function으로 나누는 것입니다. 따라서 주어진 X에 대한 Y의 조건부 확률 분포를 표현 할 수 있었습니다. 우리가 구하고자하는 변수 외에 다른 변수들은 모두 조건으로 들어 갔기 때문에 이제 더 이상 그들 사이의 관련성에 대해 신경 쓸 필요가 없습니다. 따라서 CRF의 유용성은 서로 다른 변수 사이의 독립성에 대한 걱정없이 보다 실질적인 목표에 대한 예측 모델을 디자인 할 수 있다는 것입니다. .

키워드에 대한 정보 conditional random field 설명

다음은 Bing에서 conditional random field 설명 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 Conditional Random Fields : Data Science Concepts

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

Conditional #Random #Fields #: #Data #Science #Concepts


YouTube에서 conditional random field 설명 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 Conditional Random Fields : Data Science Concepts | conditional random field 설명, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  겨드랑이 착색 레이저 | 겨드랑이색소 레이저토닝하지 마세요! ❌겨드랑이색소치료 이거 하나면 끝~! 1889 명이 이 답변을 좋아했습니다

Leave a Comment