# MatCha

## 개요

MatCha는 Fangyu Liu, Francesco Piccinno, Syrine Krichene, Chenxi Pang, Kenton Lee, Mandar Joshi, Yasemin Altun, Nigel Collier, Julian Martin Eisenschlos의 논문 [MatCha: Enhancing Visual Language Pretraining with Math Reasoning and Chart Derendering](https://huggingface.co/papers/2212.09662)에서 제안되었습니다.

해당 논문의 초록은 다음과 같이 서술합니다:

*플롯, 차트, 인포그래픽과 같은 시각 언어 데이터는 인간 세계에서 매우 흔합니다. 그러나 최첨단 비전-언어 모델은 이러한 데이터에서 성능이 좋지 않습니다. 우리는 차트/플롯과 언어 데이터를 함께 모델링하는 시각 언어 모델의 능력을 향상시키기 위해 MatCha(Math reasoning and Chart derendering pretraining)를 제안합니다. 구체적으로, 시각 언어 모델링의 핵심 능력인 플롯 분해와 수치 추론을 포괄하는 여러 사전 학습 작업을 제안합니다. MatCha 사전 학습은 최근 제안된 이미지-텍스트 시각 언어 모델인 Pix2Struct를 기반으로 수행합니다. PlotQA와 ChartQA와 같은 표준 벤치마크에서 MatCha 모델은 최첨단 방법보다 최대 약 20%까지 우수한 성능을 보입니다. 또한 MatCha 사전 학습이 스크린샷, 교과서 다이어그램, 문서 도형과 같은 도메인으로 얼마나 잘 이전되는지 조사하여 전반적인 성능 향상을 관찰함으로써, MatCha 사전 학습이 더 넓은 시각 언어 작업에서 유용함을 검증합니다.*

## 모델 설명

MatCha는 `Pix2Struct` 아키텍처를 사용하여 학습된 모델입니다. `Pix2Struct`에 대한 자세한 내용은 [Pix2Struct 문서](./pix2struct)에서 확인할 수 있습니다. MatCha는 `Pix2Struct` 아키텍처의 Visual Question Answering 하위 집합입니다. 입력 질문을 이미지에 렌더링하고 답변을 예측합니다.

## 사용

현재 MatCha에는 6개의 체크포인트가 있습니다:

- `google/matcha`: MatCha를 하위 작업에 대해 fine-tune하는 데 사용되는 기본 MatCha 모델
- `google/matcha-chartqa`: ChartQA 데이터셋으로 fine-tuning된 MatCha 모델입니다. 차트에 대한 질문에 답하는 데 사용할 수 있습니다.
- `google/matcha-plotqa-v1`: PlotQA 데이터셋으로 fine-tuning된 MatCha 모델입니다. 플롯에 대한 질문에 답하는 데 사용할 수 있습니다.
- `google/matcha-plotqa-v2`: PlotQA 데이터셋으로 fine-tuning된 MatCha 모델입니다. 플롯에 대한 질문에 답하는 데 사용할 수 있습니다.
- `google/matcha-chart2text-statista`: Statista 데이터셋으로 fine-tuning된 MatCha 모델.
- `google/matcha-chart2text-pew`: Pew 데이터셋으로 fine-tuning된 MatCha 모델.

`chart2text-pew` 및 `chart2text-statista`에서 fine-tuning된 모델은 요약에 더 적합하고, `plotqa` 및 `chartqa`에서 fine-tuning된 모델은 질의응답에 더 적합합니다.

다음과 같이 이 모델들을 사용할 수 있습니다(ChartQA 데이터셋에 대한 예시):

```python
import requests
from PIL import Image

from transformers import AutoProcessor, Pix2StructForConditionalGeneration

model = Pix2StructForConditionalGeneration.from_pretrained("google/matcha-chartqa").to(0, device_map="auto")
processor = AutoProcessor.from_pretrained("google/matcha-chartqa")
url = "https://raw.githubusercontent.com/vis-nlp/ChartQA/main/ChartQA%20Dataset/val/png/20294671002019.png"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(images=image, text="Is the sum of all 4 places greater than Laos?", return_tensors="pt").to(0)
predictions = model.generate(**inputs, max_new_tokens=512)
print(processor.decode(predictions[0], skip_special_tokens=True))
```

## 파인튜닝

MatCha를 fine-tune하려면 pix2struct [fine-tuning notebook](https://github.com/huggingface/notebooks/blob/main/examples/image_captioning_pix2struct.ipynb)을 참조하세요. `Pix2Struct` 모델의 경우, Adafactor와 cosine learning rate scheduler를 사용하여 모델을 fine-tune하면 수렴이 더 빠르게 이루어진다는 것을 확인했습니다:

```python
from transformers.optimization import Adafactor, get_cosine_schedule_with_warmup

optimizer = Adafactor(self.parameters(), scale_parameter=False, relative_step=False, lr=0.01, weight_decay=1e-05)
scheduler = get_cosine_schedule_with_warmup(optimizer, num_warmup_steps=1000, num_training_steps=40000)
```

MatCha는 `Pix2Struct` 아키텍처를 사용하여 학습된 모델입니다. `Pix2Struct`에 대한 자세한 내용은 [Pix2Struct 문서](./pix2struct)에서 확인하실 수 있습니다.

