ratsgo / embedding

한국어 임베딩 (Sentence Embeddings Using Korean Corpora)

Home Page:https://ratsgo.github.io/embedding

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BERT fine tune 문의

admin0319 opened this issue · comments

안녕하세요.
좋은 책 만들어주셔서 감사합니다~ ^^

가지고 있는 텍스트 데이터를 통해 BERT fine tune를 한 후 임베딩된 문장들의 벡터를 조회하고자 합니다.
헌데 코드를 보면 fine tune에 사용할 train/test 데이터는 labeling이 되어 있어야 합니다.

질문 1. fine tune 하지 않고 가지고 있는 텍스트 데이터를 통해 pretrain 할때는 labeling이 필요 없는데
fine tune 할때는 label 값이 필요한 이유가 무엇인지요?

질문 2. 제가 가지고 있는 텍스트 데이터는 label 이 없는 데이터 입니다.
현재 배포된 소스에서 bert pretrain model 또는 fine tune model을 load 하여
model.get_sentence_vector("문장") 으로 문장벡터를 조회하려면
가지고 있는 데이터로 프리트레인을 수행한 후 BERTEmbeddingEvaluator 를 사용하는것이 나은지
가지고 있는 데이터를 임의로 labeling 하고 train/test 셋으로 split 한 다음 fine tune을 수행한 후 BERTEmbeddingEvaluator 를 사용하는것이 나은지 궁금합니다.

@admin0319 님 안녕하세요, 답이 너무 늦었습니다.

pretrain 할때는 labeling이 필요 없는데 fine tune 할때는 label 값이 필요한 이유가 무엇인지요?
사실 pretrain이든, fine tune이든 Cross Entropy 계열 loss로 모델을 학습한다면 label이 반드시 필요합니다. 다만 pretrain할 때 레이블이 필요없는 것처럼 보이는 이유는 데이터로부터 다량의 레이블을 자동으로 확보할 수 있기 때문입니다. 예컨대 '언어모델(language model)'의 경우 input-label을 '마지막 토큰 직전까지의 토큰 시퀀스'-'마지막 토큰'으로 상정할 수 있습니다. 이는 이미 있는 데이터(문서)로도 수작업 레이블링 없이 레이블을 만들 수 있다는 뜻이고, pretrain도 레이블을 활용한다는 의미가 됩니다. 다만 레이블을 데이터로부터 바로 확보가능하기 때문에 비용도 싸고 다량의 (레이블된)데이터를 확보할 수 있다는 점에서 성능의 비약적인 향상을 가져왔습니다. 이같은 학습 방식을 기존의 supervised learning에 대비해, self-supervised learning이라고 부르기도 합니다.

문장 벡터를 조회하려면 프리트레인을 수행하는 게 나은지, 임의로 labeling하고 fine tune을 수행하는게 나은지요?
레이블이 없는 상태에서 '가지고 있는 데이터로 프리트레인을 수행'하는 것이 Masked Language Model(MLM, 빈칸 맞추기)을 학습하는 것으로 읽힙니다. 이미 BERT엔 다양한 소스의 데이터로 이같은 MLM이 수행된 결과이기 때문에 @admin0319 님께서 가지고 있는 데이터가 아주 많지 않는 한 성능 향상을 크게 기대하긴 어려울 것 같다는 생각이 듭니다.
'가지고 있는 데이터를 임의로 레이블링'한다고 함은 보유 데이터(문장)에 긍정, 부정, 중립 등과 같이 극성 따위를 붙이는 작업이라고 이해했습니다. 만일 이게 맞다면 이같이 수행하는 것은 해당 데이터 분류 성능을 높이는 데 도움이 될 수 있을거라 생각합니다. BERT 스타일의 Pretrained Language Model은 파인튜닝까지 수행했을 때 태스크(분류 등) 수행 성능이 비약적으로 높아지는 것으로 알려져 있습니다(반대로 얘기하면 파인튜닝 안하면 그리 성능이 좋지 않다는 이야기기도 합니다^^;)
한편 BERTEmbeddingEvaluator의 문장 벡터 조회(get_sentence_vector) 기능은 시각화 등 임베딩 역할을 좀 더 이해해볼 수 있게 하기 위해 제가 책을 쓰면서 개발한 기능인데요. 보통 BERT 스타일의 Pretrained Language Model에서는 임베딩을 시각화하기에 적절하지 않은 것으로 알려져 있습니다. 시각화 결과가 사람이 보기에 크게 직관적이지 않기도 하고요. 따라서 문장 벡터 조회로 시각화를 염두하고 레이블링을 준비하신다고 하면, 생각보다 그 품질이 나쁠 수 있을 것 같다는 염려 또한 전해드립니다.

부족한 책인데 관심 가져주셔서 감사드립니다.