Closed KimDaeUng closed 2 years ago
[x] Fix preprocessing.py
For Extractive model
ext_prepare_train_features
ext_prepare_validation_features
For Generative model
gen_prepare_train_features
Differentiate (extraction vs generation / train vs valid)
EXT_PREPARE_FEATURES
= {'train' : ext_prepare_train_features
,
'valid' : ext_prepare_validation_features
}
EXT_PREPARE_FEATURES
becomes a factor of ext_prepare_features
ext_prepare_features
becomes a factor of ExtractiveReader
GEN_PREPARE_FEATURES
= {'train' : gen_prepare_train_features
,
'valid' : gen_prepare_train_features
}
EXT_PREPARE_FEATURES
becomes a factor of gen_prepare_features
gen_prepare_features
becomes a factor of GenerativeReader
ReaderModelBase
폐기 #9 와 같이 처리함
9e3a88b6dcddec7ac2c4ce10faa9c078018e196a Retrieval 코드와 통합 후 dependency 문제 해결을 위해 constant.py
경로 변경(solution.reader
-> utils
)
3 과 동일한 이유(코드 확장성)로 Reader Module에 대해서도 동일하게 추상화 작업을 진행합니다. 다음과 같이 추상화 클래스를 설계하였으며, Reader 모델의 학습 및 추론을 관리하는 객체(
-Reader
)와 Reader 모델(-ReaderModel
) 객체를 두는 방식입니다.BaseReader
: Reader 모델 학습 및 추론 전반에 필요한 객체와 데이터 메서드를 통합관리하는 객체의 추상 클래스. 이를 상속받아 Extractive, Generative 별로 다른 기능을 구현. 대표적으로 다음 attribute, method 들을 포함.args
model_config
backbone_model
tokenizer
metric
trainer
dataset
eval_dataset
post_process_function
set_retrieved_doc(dataset:datasets.DatasetDict)
: retrieved dataset을 입력받아validation
set을eval_dataset
attribute에 저장set_dataset(dataset:datasets.DatasetDict)
: train, valid set 입력받아dataset
attribute에 저장get_trainer()
->soultion.trainers.Trainer
: 모델 학습을 위한 Trainer 리턴predict()
:post_process_function
이 지정되어 있는 경우 post processing을 거친 출력값, 그 외의 경우 모델의 outputReaderModel
: MRC 모델의 추상클래스. huggingface의 구현체를 기반으로 커스텀하는 것을 가정함. Head를 변경하거나 RETRO, SG-NET, HAN을 추가ExtractiveReaderModel
: Extraction-based MRC 모델의 추상 클래스. Encoder 기반AutoModelForQuestionAnswering
으로 불러온 모델의 입출력을 따름GenerativeReaderModel
: Extraction-based MRC 모델의 추상 클래스.AutoModelForSeq2SeqLM
또는 Decoder 또는 Seq2Seq 기반AutoModelForQuestionAnswering
으로 불러온 모델의 입출력을 따름모델 확장성 관련
덧붙여 위 그림의
ManualTrainer
는 huggingface trainsformers의Trainer
를 사용하지 않는 방식으로 학습할 경우(e.g. HAN)에 사용자가 해당 클래스를 상속받아 pytorch로 직접 작성하되 huggingface의 방식과 동일한 메서드를 갖도록 할 때 사용합니다. Reader 모듈의 확장성에 대해 고민하다보니 필요할 것 같아 제안드립니다.SGNET, RETRO의 레포도 살펴보았는데 huggingface transformes의 구버전으로 작성되어있어 hugginface
QuationAnsweringTrainer
를 이용한 방식으로 통합 가능해보입니다. 그러나 HAN의 경우는ExtractiveReader
에서ManualTrainer
를 사용해 직접 학습 코드를 짜야할 것 같습니다.GenerativeReaderModel
의 경우는 대강의 가이드라인을 잡았지만 해당 모델을 설계하시는 분의 의견에 따라 향후 수정될 수 있습니다.