데이터 없이 NER 모델 학습하기

Yongsun Yoon
5 min readFeb 11, 2023

--

1. Introduction

개체명 인식(Named Entity Recognition)은 텍스트에서 이름, 단체, 지역과 같은 개체명을 인식하는 문제입니다. 챗봇, 검색, 번역 등 다양한 자연어 어플리케이션의 기반 기술로 사용되고 있습니다.

사람, 지역처럼 보편적인 엔티티를 다룬 NER 데이터는 공개되어 있지만, 특수한 도메인에 대한 데이터는 제한적입니다. NER 라벨링은 단순한 텍스트 분류 문제보다 까다롭기 때문에 도메인마다 대규모 데이터를 구축하기 어렵습니다.

이 포스트는 데이터 없이도 NER 모델을 학습할 수 있는 방법에 대해 다룹니다. 다양한 도메인에서 훌륭한 Few-shot 능력을 보이는 대규모 언어모델(Large Language Model, LLM)을 활용해 몇 개의 개체명 리스트만으로 NER 데이터셋을 생성할 수 있습니다. 생성된 데이터를 BERT에 학습시킴으로써 원하는 도메인의 NER 모델을 큰 비용 없이 얻을 수 있습니다.

2. Method

제안 방법은 다음과 같습니다.

  1. Few-shot 개체명 리스트 작성
  2. GPT-3를 사용한 개체명 리스트 확장
  3. GPT-3를 사용한 개체명인식 데이터셋 생성
  4. NER 모델 학습

먼저 원하는 도메인의 엔티티 클래스를 정의한 후 예시 개체명을 작성합니다. 이 포스트에서는 한 클래스 당 5개의 예시만 사용했습니다. 예시 개체명을 GPT-3에 입력해 같은 클래스에 속하는 새로운 개체명을 생성합니다.

다음으로 문장들을 생성하여 데이터셋을 구축합니다. 생성한 개체명 리스트에서 1~3개의 개체명을 샘플링 한 다음으로 문장들을 생성하여 데이터셋을 구축합니다. 생성한 개체명 리스트에서 1~3개의 개체명을 샘플링 후 해당 개체명이 포함된 문장을 GPT-3가 생성합니다.

마지막으로 만들어진 데이터로 BERT 모델을 학습시킵니다.

2.1. Few-shot 개체명 리스트 작성

이 포스트에서는 예시를 위해 호텔 도메인을 선택했습니다. 엔티티 클래스는 <hotel name>, <room type>, <person name>, <date>, <hotel supplies>로 총 5개 입니다. 클래스별 개체명 예시는 아래에서 확인할 수 있습니다.

2.2. GPT-3를 사용한 개체명 리스트 확장

클래스별 5개의 개체명으로만 학습하면 오버피팅되어 새로운 개체명을 인식하지 못할 수 있습니다. 따라서 일반화된 패턴을 학습할 수 있을 정도의 다양한 개체명이 필요합니다.

GPT-3는 few-shot 예시만으로 다양한 도메인의 데이터를 생성할 수 있습니다. 엔티티 클래스 이름과 개체명 리스트를 보여주고 같은 클래스에 속하는 개체명을 생성하도록 프롬프트를 구성했습니다. 클래스 마다 100개의 개체명을 생성했습니다.

프롬프트와 생성 결과

사람이 작성한 개체명 리스트와 LLM이 생성한 개체명 리스트 모두 다음 단계에서 사용됩니다.

실제 개체명과 생성된 개체명 결합

2.3. GPT-3를 사용한 개체명인식 데이터셋 생성

이제 학습에 사용할 개체명인식 데이터셋을 만들어보겠습니다. 개체명 리스트에서 1~3개의 개체명을 샘플링 후 해당 개체명이 들어가도록 문장을 생성합니다. 문장에서 개체명의 위치를 파악하여 해당 클래스의 라벨을 부여합니다. 라벨은 BIO(Begin-Inside-Outside) 형식을 사용했습니다.

데이터 생성 코드
생성 문장과 라벨 예시

2.4. NER 모델 학습

데이터를 생성했으니 모델을 학습시킬 차례입니다. Huggingface에 공개된 roberta-base 모델을 Token classification 방법으로 학습시켰습니다.

1000개 데이터 중 900개를 학습하고, 100개는 검증 데이터로 사용했습니다. 2.3에서 만든 라벨은 글자(character) 단위이기 때문에 이를 토큰(token) 단위로 바꾸는 과정이 필요합니다. token_to_chars 메소드를 사용하면 원본 텍스트에서의 토큰 범위(span)을 확인할 수 있습니다.

데이터셋 코드

학습은 기본적인 Token classification과 다르지 않습니다. 한 가지 추가한 내용는 outside_weight 입니다. 생성 문장 속에는 주어진 개체명 외에 다른 개체명이 포함될 수 있지만, 무조건 O-tag로 라벨링되는 문제가 발생합니다. 이를 보정하기 위해 O-tag loss의 가중치를 낮췄습니다.

모델의 평가지표는 KLUE 벤치마크를 참고하여 entity F1과 character F1을 사용했습니다. 5 epoch 학습 결과, 검증 데이터에서 94.83 entity F1, 96.58 character F1의 성능을 보였습니다.

학습 코드

몇 가지 텍스트로 간단한 테스트를 진행 했습니다. 학습 데이터에 포함되지 않은 개체명도 정확하게 인식하는 것을 확인했습니다.

테스트 결과

3. Conclusion

이번 포스트에서는 데이터 없이 NER 모델을 학습하는 방법에 대해 소개했습니다. 5개의 개체명 예시만 작성하면 GPT-3를 통해 개체명 리스트를 확장하고, 데이터를 생성하여 NER 모델을 학습시킬 수 있습니다.

제안 방법은 아래의 한계점이 있습니다.

  • 생성된 개체명, 데이터를 그대로 사용했습니다. 생성 결과의 타당성을 기준으로 필터링하면 모델의 성능을 향상시킬 수 있습니다.
  • 사람이 생성한 데이터가 아닌 생성된 데이터로 성능을 확인했습니다. 서비스 적용시 실제 문장에 대한 검증이 필수적입니다.
  • 의료, 금융같은 더 까다로운 도메인에서의 검증이 필요합니다.

추후 기회가 되면 언급한 한계점을 해결한 연구를 진행할 예정입니다.

감사합니다.

--

--