현업에서 NLP 프로젝트 다룰 때 과정? 정리
문제 정의: 자연어 처리를 위해 필요한 문제를 정의하고, 이를 해결하기 위한 목표를 설정한다.
데이터 수집: 해당 문제를 해결하기 위해 필요한 데이터를 수집한다. 이때, 데이터의 양과 질이 충분한지 확인해야 한다.
데이터 전처리: 수집된 데이터를 정제하고 가공해야 할 경우 전처리를 진행한다.
모델 구축: 전처리된 데이터를 이용해 모델을 구축한다. 이때, 다양한 모델을 시도해보고 성능을 비교하여 최적의 모델을 선택한다.
평가 및 최적화: 구축된 모델을 평가하고 성능을 개선하기 위해 최적화를 진행한다.
배포 및 운영: 최종 모델을 배포하고 운영한다.
자연어 처리 프로젝트에 사용되는 데이터는 구축하고자 하는 모델에 따라 그 데이터의 유형이 다르다.
Pre-trained Language Mode(PLM)을 만드는 경우는 대량의 Unlabeled data 를 모으는 작업이기 때문에, 웹에서 크롤링하거나 사전학습(Pre-training)을 위해 공개된 말뭉치들을 수집한다. 이 경우 데이터 수가 너무 많기 때문에 인력을 이용하여 정제하는 것은 거의 불가능하다.
그렇기 때문에 데이터 수집을 위해서 특별히 라벨러들을 이용한 라벨링이나 정제는 수행하지는 않고 기계적으로 처리 할 수 있는 자동화된 정제 만을 수행한다.
반면, 지도 학습(Supervised learning)을 위해 데이터를 구축하는 경우 라벨링된 데이터들이 필요하고 이 경우 일반적으로 데이터 셋 구축 가이드 를 작성하고 라벨러들을 고용하여 데이터 구축을 진행한다.
라벨러에게 라벨링된 데이터를 제작하게 하는 방법은 다양한 방법이 있다. 하지만 공통적으로 필요한 것은 데이터 구축 가이드이다.
데이터 구축 가이드의 경우 정해진 포맷이 있지는 않다. 하지만 데이터 구축 가이드에는 데이터 구축에 필요한 필드에 관한 정보와 라벨링 기준이 포함되어야 한다.
예를 들어, 유저의 질의에 대한 의도를 분류하는 분류 모델을 학습하기 위한 데이터를 수집한다면, 우리는 “질의”, “의도”의 두가지 컬럼을 가지는 엑셀을 만들고 라벨러에게 구축 할 “질의”는 어떤 내용이어야 할지, 또한 “의도”의 종류는 무엇이 있는지 등에 대한 정보를 기술하여 데이터 구축 가이드를 작성하여야 한다.
모델의 성능을 개선하는 방법은 크게 두 가지가 있다.
일반적으로 데이터를 계속 추가하면 아래 그림과 같이 로그 함수의 모양으로 성능이 수렴하게 된다. 데이터를 일정 수준 이상 추가해서 학습한 이후에는 더 이상 데이터 추가를 통한 성능 향상의 효율이 나지 않게 된다. 이렇게 데이터 추가를 통해 성능이 수렴한 경우, 성능을 개선 하려면, 1) 새로운 모델을 사용하거나, 2) 새로운 피처들을 사용하는 모델들을 사용할 필요가 있다.
데이터 추가를 통한 모델 성능 향상이 수렴하게 된다면, 모델링 개선을 고려 할 필요가 있다.
1. 동일 구조의 모델, 모델의 파라미터 수 증가
- 파라미터 수 증가의 방법
- 딥러닝 모델의 경우 layer 수 증가, hidden layer 의 차원 수 증가
2. 입력 피처 추가
- 어떤 경우 기존 모델의 입력만으로는 문제를 풀기 어려운 경우가 있다.
- 예를 들어, 사용자 질의의 의도를 분석하는 Intent Classification 문제를 풀 경우, 사용자의 질의 만으로는 풀지 못하는 문제들이 있는 경우가 있다.
3. 기존의 모델과는 전혀 다른 모델들 또는 구조 시도
모델러의 주요 역할은 중 하나는 많은 실험을 통해 문제를 해결하기 위한 최선의 모델을 찾는 것이다.
이때, 실험이 잘 정리되어 있어야지만, 다양한 변인들에 대해서 성능과의 상관 관계를 확인 할 수 있고, 어떠한 변인을 수정 했을 때, 성능이 더 좋아지는지 판단 할 수 있게 되고, 추가적인 성능 개선을 위한 실험을 디자인 할 수 있게 된다.
우리가 만드는 자연어 처리 모델들은 확률적 모델들이다. 확률적 모델들이기 때문에 우리의 모델들은 100%의 성능을 갖지 못한다. 그렇기 때문에 많은 경우 자연어 처리 서비스에는 운영 상황을 대응 할 수 있는 운영툴을 필요로 한다.
만약 실시간으로 들어오는 질의들을 처리해야하는 서비스라면, 모니터링 시스템을 구축하여 실시간으로 발생하는 문제에 대해 빠르게 대응하거나, 불편 신고들에 대해 빠르게 대응 할 수 있도록 운영툴을 구축해야 한다. 이 경우, 빠르게 문제 질의들을 처리하기 위해 운영툴에 문제가 되는 질의들을 등록하고 해당 질의가 들어왔을 때, 실행 할 동작을 미리 설정 할 수 있도록 시스템을 구성하는 것이 좋다.
이때, 운영툴에 등록된 질의와 입력으로 들어오는 질의들을 비교하기 위한 방법에는 여러가지 방법이 있다.
Exact matching 기반
: 운영툴에 등록된 질의와 완벽하게 동일 할 때만 동작한다.
정규식 기반
: 운영툴에 문제의 질의를 정규식의 형태로 등록하여, Exact matching 기반 보다 좀 더 넓은 범위를 커버 할 수 있도록 한다.
모델 기반
자연어 처리 문제는 다양한 유형이 있다.
Text Classification 은 입력된 텍스트를 주어진 카테고리 중 하나에 속하는지 자동으로 판별하는 기술이다. 각각의 카테고리는 미리 정의되어 있고, 입력된 텍스트가 어떤 카테고리에 속하는지 예측하는 것이 주어진 문제이다.
예를 들어, 이메일이 스팸인지 정상 이메일인지를 구분하거나, 영화 리뷰가 긍정적인지 부정적인지를 구분하거나, 새로운 기사가 정치, 경제, 사회, 생활 등 어떤 주제인지 예측하는 것과 같은 작업을 수행할 수 있다.
Text Classification 에 사용되는 딥러닝 모델은 대표적으로 BERT, RoBERTa 등의 Transformer Encoder 류를 활용한 PLM(Pretrained Language Model)들을 활용하여 학습한다. 이때, PLM 의 최종 layer 에 추가적인 모델링을 추가하여 Multiclass classification 을 수행하도록 한다. PLM 의 최종 layer 에 추가적인 모델링을 하는 방법은 다양한 방법이 있다.
CLS token 이용
: 위치에서 출력되는 임베딩에 fully connected layer 를 추가하여 logit 의 출력 차원을 multiclass 의 개수와 맞추도록 한다.
Last layer average
: BERT 또는 RoBERTa 의 최종 layer 의 모든 출력 임베딩들에 평균을 취한 후 fully connected layer 를 추가하는 방법
Last 2 layer average
: Last layer average 와 유사하지만 다른 점은, 맨 마지막 2 개 layer 의 임베딩들에 평균을 취한 후 fully connected layer 를 추가한다.
검색은 유저의 질의에 대해 가장 연관성이 높은 문서를 찾는 문제를 푼다. 일반적으로 딥러닝을 사용하지 않는 경우에는 TF-IDF 의 변형된 알고리즘인 BM25 를 활용하여 문서를 검색한다.
딥러닝을 이용한 문서 검색 방법도 다양한 방법과 구조를 가진다. 보편적인 구조는 2 stage 구조이다.
2 stage 구조는 Candidate Retrieval 단계와 Reranking 단계의 두 단계를 가진다. Candidate Retrieval 과정은 일반적으로 Transformer Encoder 를 이용한 Bi-encoder 모델을 이용하여 관련 후보 문서를 검색해온다. Reranking 단계에서는 검색된 후보 문서들에 대해 질의를 기준으로 다시 한번 Bi-encoder 보다 강력한 Cross-encoder 라는 모델로 랭킹을 다시 매겨서 정렬을 한다.
Candidate Retrieval 단계에서는 Bi-encoder 라는 모델이 사용되는다. Bi-encoder 모델은 질의와 문서에 대해 각각 fixed length embedding 을 뽑고 그 두 임베딩의 연관성을 비교하도록 하는 모델이다. 이 연관성의 비교는 일반적으로 Dot product score, Cosine similarity, Euclidean distance 로 연관성을 계산한다. 학습 방법은 일반적으로 Contrastive loss 또는 InfoNCE loss 등 Metric learning 에 사용되는 Loss 함수들을 이용해 학습한다. 대표적인 Bi-encoder 모델로는 DPR(Dense Passage Retrieval) 모델이 있다.
Candidate Retrieval 단계의 동작은 먼저, Bi-encoder 중 Document Encoder 를 통해 문서들을 모두 임베딩으로 변환하고 FAISS 와 같은 ANN(Approximate Nearest Neighbor) 알고리즘들을 통하여 ANN Index 를 만들어 둔다. 그리고 사용자 질의가 들어오면 Query Encoder 를 이용하여 사용자의 질의 또한 인코딩하고 미리 빌드한 ANN Index 를 이용하여 관련된 문서들을 빠르게 찾아온다.
Reranking 단계에서는 Cross-encoder 라는 모델이 사용된다. Cross-encoder 는 질의와 문서가 하나의 모델에 동시에 입력으로 들어가고 질의와 문서의 연관성을 출력하도록 하는 모델이다. 그림 5 의 왼쪽이 Bi-encoder 이고 오른쪽이 Cross-encoder 인데, 에서 보다시피 Cross-encoder 의 경우 모델의 하위단에서부터 Cross attention 을 통해 많은 계산을 수행하여 질의와 문서의 연관성을 계산한다.
그렇기 때문에, Bi-encoder 보다 더 많은 연산을 통해 일반적으로 더 좋은 성능을 내게 된다. 하지만 더 많은 연산을 수행하기 때문에, 모든 문서들과 질의의 연관성을 비교하기에는 속도가 굉장히 느려 Cross-encoder 모델 단독으로는 검색을 수행 할 수가 없다. 그렇기 때문에, 앞서 말한 것과 같이 Bi-encoder 와 함께 2 stage 구조로 검색을 수행하게 된다.
Question Answering(QA)은 사용자의 질의에 대한 답변을 응답하는 기술이다. QA 모델의 종류는 지식에 대한 Retrieval 여부, 응답 생성 방법에 따라 구분 할 수가 있다.
QA 모델의 응답 생성 방법에 따라 추출 기반 QA 모델과 생성 기반 QA 모델이 있다.
추출 기반 모델은 그림 6 와 같이 질문과 문서가 주어졌을 때, 질문에 대한 정답 위치를 문서에서 찾아 추출해오는 방법이다.
생성 기반 QA 모델의 경우 Decoder 모델 또는 Encoder-Decoder 모델 등의 생성 모델을 활용하여 응답을 생성해내는 모델이다. 이런 생성 기반 모델은 대표적으로 Decoder 모델은 GPT 계열 모델 그리고 Encoder-Decoder 모델은 T5, BART 등의 모델이 있다.
질의와 관련된 문단에 대한 Retrieval 의 여부에 따라 Closed Domain Question Answering(CDQA)와 Open Domain Question Answering(ODQA)로 나뉜다. 원래의 CDQA, ODQA 의 구분은 특정 도메인에 대해서만 질문만을 처리하는지, 도메인에 관계 없이 모든 질문을 하는지에 대한 구분으로 이름이 정해졌지만, 이 정의 보단 Closed Book System QA 인지 Open Book System QA 인지로 해석하는 것이더 자연스럽다.
그림 7 과 같이, 추출 기반 QA 모델과 생성 기반 QA 모델 모두 Retrieval 과 함께 사용하여 ODQA 모델로서 사용 할 수 있다. 검색에서 배운 기술을 이용해 질문과 관련된 문서를 검색해오고, 질문과 함께 QA 모델에 입력하여 질문에 대한 정답을 찾는다.
REFERENCE : fastcampus