특허분야 특화된 한국어 AI언어모델 KorPatBERT 개발

OkAuto·2022년 8월 30일
0

Language Models

목록 보기
1/2

특허분야 특화된 한국어 AI언어모델 KorPatBERT 개발

한국특허정보원에서 인공지능 연구를 하였고, 그 유명한 Google BERT-base 기반으로 첫 사전학습 언어모델을 만들고 공개하였습니다. (메인개발 BJW님께 감사~!)
KorPatBERT(Korean Patent BERT)는 특허분야 한국어 자연어처리 문제 해결 및 특허산업분야의 지능정보화 인프라 마련을 위해 기존 Google BERT base 모델의 아키텍쳐를 기반으로 대용량 국내 특허문헌(약 406만건, 4억6천만 문장, 266억 토큰, 120GB)을 사전학습(pre-training)하였고, 무료로 제공하고 있습니다.

 

1. KorPatBERT

특허분야 특화된 고성능 사전학습(pre-trained) 언어모델로 다양한 자연어처리 태스크에서 활용 할 수 있습니다.

 

2. KorPatBERT 개요

2-1. 사전학습 환경

개발환경

  • Anaconda >=4.6.8
  • Python >= 3.6
  • MSP Tokenizer(Mecab-ko Sentencepiece Patent Tokenizer)
  • Tensorflow-gpu >= 1.15.0
  • Sentencepiece >= 0.1.96
  • Horovod >= 0.19.2

학습환경

  • 특허문헌 120GB 코퍼스의 4억 6천만 문장 학습
  • NVIDIA V100 32GB GPU 16개로 분산학습 라이브러리 Horovod를 이용하여 학습
  • NVIDIA AMP(Automated Mixed Precision) 방식을 활용하여, 메모리 최적화
  • 128 Sequence 2,300,000 Step 학습 + 512 Sequence 750,000 Step 학습

2-2. 코퍼스

  • 특허문헌수 : 4,065,519건
  • 문장 수 : 460,448,189건
  • 토큰 수 : 약 266억건
  • 코퍼스 크기 : 약 120GB

2-3. 사전 및 토크나이저

언어모델 학습에 사용된 특허문헌을 대상으로 약 666만개의 주요 명사 및 복합명사를 추출하였으며, 이를 한국어 형태소분석기 Mecab-ko의 사용자 사전에 추가 후 Google SentencePiece를 통하여 Subword로 분할하는 방식의 특허 텍스트에 특화된 MSP 토크나이저(Mecab-ko Sentencepiece Patent Tokenizer)입니다.

  • Mecab-ko 특허 사용자 사전파일명 : pat_all_mecab_dic.csv (6,663,693개 용어)
  • SentencePiece 사전파일명 : korpat_vocab.txt (21,400개 토큰)
  • SentencePiece 스페셜 토큰 : [PAD], [UNK], [CLS], [SEP], [MASK]
  • KorPat Tokenizer 파일명 : korpat_tokenizer.py

2-4. 평가

  • 특허데이터 기반 CPC 분류 태스크
    - 144 labels, train data 351,487, dev data 39,053, test data 16,316
모델평가점수(ACC)
Google BERT72.33
KorBERT73.29
KoBERT33.75
KrBERT72.39
KorPatBERT76.32

 

3. KorPatBERT 사용 안내

3-1. 요구사항

프로그램명버전설치안내 경로필수여부
python3.6 이상https://www.python.org/Y
anaconda4.6.8 이상https://www.anaconda.com/N
tensorflow2.2.0 이상https://www.tensorflow.org/install/pip?hl=koY
sentencepiece0.1.96 이상https://github.com/google/sentencepieceN
mecab-ko0.996-ko-0.0.2https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/Y
mecab-ko-dic2.1.1https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/Y
mecab-python0.996-ko-0.9.2https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/Y
python-mecab-ko1.0.11 이상https://pypi.org/project/python-mecab-ko/Y
keras2.4.3 이상https://github.com/keras-team/kerasN
bert_for_tf20.14.4 이상https://github.com/kpe/bert-for-tf2N
tqdm4.59.0 이상https://github.com/tqdm/tqdmN
soynlp0.0.493 이상https://github.com/lovit/soynlpN

3-2. 토크나이저

3-2-1. Mecab-ko 설치 및 사용자 사전

Installation URL: https://bitbucket.org/eunjeon/mecab-ko-dic/src/master/
mecab-ko > 0.996-ko-0.9.2
mecab-ko-dic > 2.1.1
mecab-python > 0.996-ko-0.9.2

3-2-2. MSP 토크나이저

from korpat_tokenizer import Tokenizer

# (vocab_path=Vocabulary 파일 경로, cased=한글->True, 영문-> False)
tokenizer = Tokenizer(vocab_path="./korpat_vocab.txt", cased=True)
	
# 테스트 샘플 문장
example = "본 고안은 주로 일회용 합성세제액을 집어넣어 밀봉하는 세제액포의 내부를 원호상으로 열중착하되 세제액이 배출되는 절단부 쪽으로 내벽을 협소하게 형성하여서 내부에 들어있는 세제액을 잘짜질 수 있도록 하는 합성세제 액포에 관한 것이다."

# 샘플 토크나이즈
tokens = tokenizer.tokenize(example)

# 샘플 인코딩 (max_len=토큰 최대 길이)
ids, _ = tokenizer.encode(example, max_len=256)
# 샘플 디코딩
decoded_tokens = tokenizer.decode(ids)
	
# 결과 출력
print("Length of Token dictionary ===>", len(tokenizer._token_dict.keys()))
print("Input example ===>", example)
print("Tokenized example ===>", tokens)
print("Converted example to IDs ===>", ids)
print("Converted IDs to example ===>", decoded_tokens)

Result

Length of Token dictionary  ===>  21400
Input example ===>  본 고안은 주로 일회용 합성세제액을 집어넣어 밀봉하는 세제액포의 내부를 원호상으로 열중착하되 세제액이 배출되는 절단부 쪽으로 내벽을 협소하게 형성하여서 내부에 들어있는 세제액을 잘짜질 수 있도록 하는 합성세제 액포에 관한 것이다.
Tokenized example ===> ['[CLS]', '본', '고안', '은', '주로', '일회용', '합성', '##세', '##제', '##액', '을', '집', '##어넣', '어', '밀봉', '하', '는', '세제', '##액', '##포', '의', '내부', '를', '원호', '상', '으로', '열', '##중', '착하', '되', '세제', '##액', '이', '배출', '되', '는', '절단부', '쪽', '으로', '내벽', '을', '협소', '하', '게', '형성', '하', '여서', '내부', '에', '들', '어', '있', '는', '세제', '##액', '을', '잘', '짜', '질', '수', '있', '도록', '하', '는', '합성', '##세', '##제', '액', '##포', '에', '관한', '것', '이', '다', '.', '[SEP]']
Converted example to IDs ===>  [5, 58, 554, 32, 2716, 6554, 817, 20418, 20308, 20514, 15, 732, 15572, 39, 1634, 12, 11, 5934, 20514, 20367, 9, 315, 16, 5922, 17, 33, 279, 20399, 16971, 26, 5934, 20514, 13, 674, 26, 11, 10132, 1686, 33, 3781, 15, 11950, 12, 64, 87, 12, 3958, 315, 10, 51, 39, 25, 11, 5934, 20514, 15, 1803, 12889, 399, 24, 25, 118, 12, 11, 817, 20418, 20308, 299, 20367, 10, 439, 56, 13, 18, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Converted IDs to example ===>  ['본', '고안', '은', '주로', '일회용', '합성', '##세', '##제', '##액', '을', '집', '##어넣', '어', '밀봉', '하', '는', '세제', '##액', '##포', '의', '내부', '를', '원호', '상', '으로', '열', '##중', '착하', '되', '세제', '##액', '이', '배출', '되', '는', '절단부', '쪽', '으로', '내벽', '을', '협소', '하', '게', '형성', '하', '여서', '내부', '에', '들', '어', '있', '는', '세제', '##액', '을', '잘', '짜', '질', '수', '있', '도록', '하', '는', '합성', '##세', '##제', '액', '##포', '에', '관한', '것', '이', '다', '.']

3-3. 파인튜닝

Google BERT base 학습 방식과 동일

profile
두드리라 그러면 열릴 것이니

0개의 댓글