TQA(Table Question Answering) 모델이 필요해서 찾다가 hugging face에서 글을 참고하였습니다.(원문)
TAPAS
Overview
TAPAS 모델은 Jonathan Herzig, Pawew Krzyszof Nowak, Thomas Müller, Francesco Piccinno, Julian Martin Eisenschlos에 의해 사전 훈련을 통한 약하게 지도된 테이블 파싱에서 제안되었다. 표 형식 데이터에 대한 질문에 답하기 위해 특별히 설계된(사전 훈련된) BERT 기반 모델이다. BERT와 비교하여 TAPAS는 상대적인 위치 임베딩을 사용하며 테이블 구조를 인코딩하는 7개의 토큰 유형을 가지고 있다. TAPAS는 영어 위키백과의 수백만 개의 테이블과 해당 텍스트로 구성된 대규모 데이터 세트에서 마스크 언어 모델링(MLM) 목표에 대해 사전 교육을 받는다.
질문 답변의 경우, TAPAS는 선택된 셀 간의 집계(카운트 또는 합계 등)를 수행하기 위해 (선택적으로) 셀 선택 헤드와 집계 헤드의 두 개의 헤드를 맨 위에 가지고 있다. TAPAS는 여러 데이터셋에서 미세 조정되었습니다:
테이블을 통해 자연어 질문에 답하는 것은 일반적으로 의미 구문 분석 작업으로 간주된다. 전체 논리 형식의 수집 비용을 완화하기 위해, 한 가지 일반적인 접근 방식은 논리 형식 대신 주석으로 구성된 약한 감독에 초점을 맞춘다. 그러나 약한 감독에서 의미 파서를 훈련하는 것은 어려움을 초래하며, 생성된 논리 형식은 주석을 검색하기 전에 중간 단계로만 사용된다. 본 논문에서는 논리적 양식을 생성하지 않고 테이블에 대한 질문 답변에 대한 접근 방식인 TAPAS를 제시한다. TAPAS는 약한 감독에서 훈련하며, 테이블 셀을 선택하고 선택적으로 해당 집계 연산자를 이러한 선택에 적용하여 표시를 예측한다. TAPAS는 테이블을 입력으로 인코딩하도록 BERT의 아키텍처를 확장하고, 위키백과에서 크롤링한 텍스트 세그먼트와 테이블의 효과적인 공동 사전 훈련에서 초기화하며, 엔드 투 엔드로 훈련된다. 우리는 세 가지 다른 의미 구문 분석 데이터 세트를 실험하고 TAPAS가 SQA의 최첨단 정확도를 55.1에서 67.2로 향상시키고 WIKISQL 및 WIKITQ의 최첨단 성능과 동등하게 수행하지만 더 간단한 모델 아키텍처로 의미 구문 분석 모델을 능가하거나 경쟁한다는 것을 발견했다. 우리는 또한 WIKISQL에서 WIKITQ까지 우리의 환경에서 사소한 전이 학습이 최첨단보다 4.2점 높은 48.7 정확도를 산출한다는 것을 발견했다.
또한 저자들은 미세 조정에 앞서 중간 단계에서 학습된 수백만 개의 자동으로 생성된 훈련 예제의 균형 잡힌 데이터 세트를 만들어 테이블 수반을 인식하도록 TAPAS를 추가로 사전 훈련시켰다. TAPAS의 저자는 이것을 추가 사전 훈련 중간 사전 훈련이라고 부른다(TAPAS는 MLM에서 먼저 사전 훈련된 다음 다른 데이터 세트에서 사전 훈련되기 때문이다). 그들은 중간 사전 훈련이 SQA의 성능을 더욱 향상시켜 테이블 수반(이진 분류 작업)을 위해 16k개의 위키피디아 테이블이 있는 대규모 데이터 세트인 TabFact에서 최신뿐만 아니라 새로운 최첨단 데이터 세트를 달성한다는 것을 발견했다. 자세한 내용은 다음 문서를 참조하십시오: Julian Martin Eisenschlos, Syrine Kricene 및 Thomas Müller의 Understanding tables with intermediate pre-training
이 모델은 nielsr에 의해 제출되었다. 이 모델의 텐서플로 버전은 kamalkraj의해 기여되었다. 원본 코드는 여기에서 찾을 수 있습니다.
TAPAS는 기본적으로 상대 위치 임베딩(테이블의 모든 셀에서 위치 임베딩을 다시 시작)을 사용하는 모델입니다. 이것은 원래의 TAPAS 논문이 출판된 후에 추가된 것입니다. 저자에 따르면, 이것은 일반적으로 약간 더 나은 성능을 제공하며, 임베딩이 부족하지 않고 더 긴 시퀀스를 인코딩할 수 있다. 이는 TapasConfig의 reset_position_index_per_cell 매개 변수에 반영되며, 기본적으로 True로 설정됩니다. 허브에서 사용할 수 있는 모델의 기본 버전은 모두 상대 위치 임베딩을 사용합니다. from_pretrained" 메서드를 호출할 때 추가 인수 revision="no_protrained"를 전달하여 절대 위치 임베딩이 있는 것을 계속 사용할 수 있습니다. 일반적으로 입력은 왼쪽이 아닌 오른쪽에 입력하는 것이 좋습니다.
TAPAS는 BERT를 기반으로 하기 때문에 TAPAS-base는 BERT-base 아키텍처에 해당한다. 물론 TAPAS-large는 최고의 성능을 얻을 것이다(논문에 보고된 결과는 TAPAS-large에서 나온 것이다). 다양한 크기의 모델의 결과는 원래 Github 저장소에 표시됩니다.
TAPAS에는 SQA에서 미세 조정된 체크포인트가 있으며, 대화 설정에서 테이블과 관련된 질문에 답변할 수 있습니다. 이전 질문과 관련된 '나이가 어떻게 되나' 등 후속 질문을 할 수 있다는 의미다. 대화형 설정의 경우 TAPAS의 순방향 패스는 약간 다릅니다. 이 경우 prev_labels 토큰 유형 ID를 이전 질문에 대한 모델의 예측 레이블에 의해 덮어쓸 수 있도록 모든 테이블-질문 쌍을 하나씩 모델에 공급해야 합니다. 자세한 내용은 "사용" 섹션을 참조하십시오.
TAPAS는 BERT와 유사하기 때문에 마스크 언어 모델링(MLM) 목표에 의존한다. 따라서 마스크된 토큰을 예측하는 데는 효율적이고 일반적으로 NLU에서 효율적이지만 텍스트 생성에는 적합하지 않다. 인과 언어 모델링(CLM) 목표로 훈련된 모델이 그런 점에서 더 낫다. TAPAS는 인코더 디코더 모델 프레임워크에서 인코더로 사용되어 GPT-2와 같은 자동 회귀 텍스트 디코더와 결합할 수 있다.
STEP 1: TAPAS - 또는 실험을 사용할 수 있는 3가지 방법 중 하나를 선택합니다
기본적으로 TapasForQuestionAnswering을 미세 조정할 수 있는 세 가지 방법은 Tapas가 미세 조정된 여러 데이터 세트에 해당합니다:
1. SQA: 테이블과 관련된 후속 질문에 관심이 있는 경우 대화 설정으로 질문합니다. 예를 들어 먼저 '첫 번째 배우 이름이 뭐냐'고 물으면 '몇 살이냐'와 같은 후속 질문을 할 수 있다. 여기서 질문은 집계를 포함하지 않습니다(모든 질문은 셀 선택 질문입니다).
2. WTQ: 대화 설정에서 질문을 하는 것이 아니라 테이블과 관련된 질문을 하는 것에 관심이 있다면, 여러 행을 세거나 셀 값을 합산하거나 셀 값을 평균화하는 것과 같은 집계가 포함될 수 있습니다. 예를 들어, 당신은 "크리스티아누 호날두가 그의 경력에서 기록한 총 골 수는 얼마인가?"라고 물어볼 수 있다. 이 경우는 모델 자체가 적절한 집계 연산자(SUM/COUNT/AERAGE/NONE)를 학습해야 하므로 약한 감독이라고도 한다.
3. WikiSQL-supervised: 이 데이터 세트는 WikiSQL을 기반으로 하며, 모델에 훈련 중 실측 정보 집계 연산자가 제공된다. 이를 강력한 감독이라고도 한다. 여기서 적절한 집계 연산자를 배우는 것이 훨씬 쉽다.
PyTorch
허브에서 사전 훈련된 기반과 무작위로 초기화된 분류 헤드를 사용하여 모델을 초기화하는 것은 아래와 같이 수행할 수 있다.
from transformers import TapasConfig, TapasForQuestionAnswering
# for example, the base sized model with default SQA configuration
model = TapasForQuestionAnswering.from_pretrained("google/tapas-base")
model = TapasForQuestionAnswering.from_pretrained("google/tapas-base", config=config)
물론 TAPAS가 미세 조정된 세 가지 방법 중 하나를 반드시 따를 필요는 없습니다. 또한 TapasConfig를 초기화할 때 원하는 하이퍼 파라미터를 정의하여 실험한 다음 해당 구성을 기반으로 TapasForQuestionAnswering을 만들 수 있습니다. 예를 들어 대화형 질문과 집계를 포함할 수 있는 질문이 모두 포함된 데이터 세트가 있는 경우 이러한 방식으로 작업을 수행할 수 있습니다. 다음은 예입니다:
from transformers import TapasConfig, TapasForQuestionAnswering
# you can initialize the classification heads any way you want (see docs of TapasConfig)
model = TFTapasForQuestionAnswering.from_pretrained("google/tapas-base", config=config)
물론 TAPAS가 미세 조정된 세 가지 방법 중 하나를 반드시 따를 필요는 없습니다. 또한 TapasConfig를 초기화할 때 원하는 하이퍼 매개 변수를 정의하여 실험한 다음 해당 구성을 기반으로 TftapasForQuestionAnswering을 생성할 수 있습니다. 예를 들어 대화형 질문과 집계를 포함할 수 있는 질문이 모두 포함된 데이터 세트가 있는 경우 이러한 방식으로 작업을 수행할 수 있습니다. 다음은 예입니다:
from transformers import TapasConfig, TFTapasForQuestionAnswering
# you can initialize the classification heads any way you want (see docs of TapasConfig)
# initializing the pre-trained base sized model with our custom classification heads
model = TFTapasForQuestionAnswering.from_pretrained("google/tapas-base", config=config)
또한 이미 미세 조정된 체크포인트에서 시작할 수 있습니다. 여기서 주의할 점은 WTQ에서 이미 미세 조정된 체크포인트는 다소 취약한 L2-손실로 인해 몇 가지 문제가 있다는 것이다. 자세한 내용은 여기를 참조하십시오.
HuggingFace의 허브에서 사용할 수 있는 모든 사전 훈련되고 미세 조정된 TAPAS 체크포인트 목록은 여기를 참조하십시오.
STEP 2: 데이터를 SQA 형식으로 준비합니다
둘째, 위에서 무엇을 선택했든 간에 데이터 세트를 SQA 형식으로 준비해야 합니다. 이 형식은 다음 열이 있는 TSV/CSV 파일입니다:
테이블 자체는 폴더에 있어야 하며 각 테이블은 별도의 csv 파일이어야 합니다. TAPAS 알고리즘의 작성자들은 일부 자동화된 논리와 함께 변환 스크립트를 사용하여 다른 데이터 세트(WTQ, WikiSQL)를 SQA 형식으로 변환하였다. 저자는 여기서 이것을 설명한다. HuggingFace의 구현과 함께 작동하는 이 스크립트의 변환은 여기에서 찾을 수 있다. 흥미롭게도, 이러한 변환 스크립트는 완벽하지 않으며(answer_cordinates 및 float_answer 필드는 answer_text를 기반으로 채워짐), WTQ 및 WikiSQL 결과가 실제로 개선될 수 있음을 의미한다.
STEP 3: TapasTokenizer를 사용하여 데이터를 텐서로 변환
PyTorch
셋째, 데이터를 이 TSV/CSV 형식(및 표 형식 데이터가 포함된 해당 CSV 파일)으로 준비한 경우 Tapas를 사용할 수 있습니다테이블-질문 쌍을 input_ids, attention_mask, token_type_ids 등으로 변환하는 토큰화 도구입니다. 위의 세 가지 사례 중 어느 것을 선택했는지에 따라 TapasForQuestionAnswering은 서로 다른 입력을 미세 조정해야 합니다:
TapasTokenizer는 TSV 파일의 answer_coordines 및 answer_text 열을 기준으로 레이블, 숫자_값 및 숫자_values_scale을 생성합니다. float_answer 및 aggregation_label은 이미 2단계의 TSV 파일에 있습니다. 다음은 예입니다:
data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
TapasTokenzier에서는 테이블의 데이터가 텍스트 전용일 것으로 예상합니다. 데이터 프레임에서 .asa 유형(str)을 사용하여 텍스트 전용 데이터로 변환할 수 있습니다. 물론, 이것은 단일 교육 예제를 인코딩하는 방법만 보여줍니다. 배치에 대해 반복할 데이터 로더를 만드는 것이 좋습니다:
셋째, 데이터를 이 TSV/CSV 형식(및 표 형식 데이터가 포함된 해당 CSV 파일)으로 준비한 경우 Tapas를 사용할 수 있습니다테이블-질문 쌍을 input_ids, attention_mask, token_type_ids 등으로 변환하는 토큰화 도구입니다. 위에서 선택한 세 가지 경우 중 어느 것을 기준으로 질문 응답용 TFTapasForQuestionAnswering은 서로 다른 입력을 미세 조정해야 합니다:
TapasTokenizer는 TSV 파일의 answer_coordines 및 answer_text 열을 기준으로 레이블, 숫자_값 및 숫자_values_scale을 생성합니다. float_answer 및 aggregation_label은 이미 2단계의 TSV 파일에 있습니다. 다음은 예입니다:
TapasTokenzier에서는 테이블의 데이터가 텍스트 전용일 것으로 예상합니다. 데이터 프레임에서 .asa 유형(str)을 사용하여 텍스트 전용 데이터로 변환할 수 있습니다. 물론, 이것은 단일 교육 예제를 인코딩하는 방법만 보여줍니다. 배치에 대해 반복할 데이터 로더를 만드는 것이 좋습니다:
여기서 우리는 각 테이블-질문 쌍을 독립적으로 인코딩한다. 데이터 집합이 대화형이 아닌 경우에는 이 옵션을 사용자의 데이터 집합은 대화형이 아닙니다. 데이터셋에 대화형 질문(예: SQA)이 포함된 경우 먼저 테이블당 쿼리, answer_cordinates 및 answer_text를 그룹화하고(위치 인덱스 순서대로) 각 테이블을 일괄 인코딩해야 합니다. 이렇게 하면 prev_labels 토큰 유형이 확인됩니다(Tapas의 문서 참조)토큰화기)가 올바르게 설정되었습니다. 자세한 내용은 this notebook을 참조하십시오. TensorFlow 모델 사용에 대한 자세한 내용은 this notebook을 참조하십시오.
**STEP 4: 모델 학습(fine-tune)
PyTorch
TapasForQuestionAnswering을 다음과 같이 fine-tune할 수 있다(weak supervision for aggregation case)
from transformers import TapasConfig, TapasForQuestionAnswering, AdamW
# this is the default WTQ configuration
config = TapasConfig(
num_aggregation_labels=4,
use_answer_as_supervision=True,
answer_loss_cutoff=0.664694,
cell_selection_preference=0.207951,
huber_loss_delta=0.121194,
init_cell_selection_weights_to_zero=True,
select_one_column=True,
allow_empty_column_selection=False,
temperature=0.0352513,
)
model = TapasForQuestionAnswering.from_pretrained("google/tapas-base", config=config)
optimizer = AdamW(model.parameters(), lr=5e-5)
model.train()
forepochinrange(2): # loop over the dataset multiple times
여기서는 추론을 위해 TapasForQuestionAnswering 또는 TFTapasForQuestionAnswering을 사용하는 방법(즉, 새 데이터에 대한 예측을 만드는 방법)을 설명한다. 추론의 경우 input_ids, attention_mask 및 token_type_ids만 사용할 수 있습니다(Tapas를 사용하여 얻을 수 있음)로짓을 얻으려면 모델에 토큰라이저)를 제공해야 합니다. 그런 다음 편리한 ~models.tapas를 사용할 수 있습니다.tokenization_tapas.tapas_logits_to_consections 메서드를 사용하여 예측 좌표 및 선택적 집계 인덱스로 변환합니다.
그러나 설정이 대화형인지 여부에 따라 추론이 다르다는 점에 유의하십시오. 비대화 설정에서 추론은 배치의 모든 테이블-질문 쌍에서 병렬로 수행될 수 있다. 다음은 그 예입니다:
from transformers import TapasTokenizer, TapasForQuestionAnswering
importpandasaspd
model_name = "google/tapas-base-finetuned-wtq"
model = TapasForQuestionAnswering.from_pretrained(model_name)
여기서는 추론(즉, 새 데이터에 대한 예측)을 위해 TFTapasForQuestionAnswering을 사용하는 방법을 설명한다. 추론의 경우 input_ids, attention_mask 및 token_type_ids만 사용할 수 있습니다(Tapas를 사용하여 얻을 수 있음)로짓을 얻으려면 모델에 토큰라이저)를 제공해야 합니다. 그런 다음 편리한 ~models.tapas를 사용할 수 있습니다.tokenization_tapas.tapas_logits_to_consections 메서드를 사용하여 예측 좌표 및 선택적 집계 인덱스로 변환합니다.
그러나 설정이 대화형인지 여부에 따라 추론이 다르다는 점에 유의하십시오. 비대화 설정에서 추론은 배치의 모든 테이블-질문 쌍에서 병렬로 수행될 수 있다. 다음은 그 예입니다:
from transformers import TapasTokenizer, TFTapasForQuestionAnswering
importpandasaspd
model_name = "google/tapas-base-finetuned-wtq"
model = TFTapasForQuestionAnswering.from_pretrained(model_name)
대화형 설정의 경우 prev_labels 토큰 유형이 이전 테이블-질문 쌍의 예측 레이블에 의해 덮어쓸 수 있도록 각 테이블-질문 쌍을 모델에 순차적으로 제공해야 한다. this notebook(PyTorch용)과 this notebook(TensorFlow용)에서 더 많은 정보를 찾을 수 있습니다.