본문 바로가기

AI

Multimodal Transformer Toolkit - 텍스트 데이터에 멀티모달 데이터를 통합하기 위한 툴킷

  Multimodal Transformer?

  • 트랜스포머 기반 모델은 비정형 데이터인 텍스트 데이터를 다루는 데 큰 변화를 가져옴
  • 실제 환경에서 텍스트 데이터는 풍부한 정형 데이터 또는 오디오나 시각 정보와 같은 비정형 데이터와 함께 지원되는 경우가 많음
    • 예를 들어 이커머스 리뷰의 경우, 리뷰 텍스트 외에도 판매자, 구매자, 제품에 대한 정보가 종합적으로 학습될 경우 더 좋은 성능을 기대할 수 있음
  • 인간도 하나의 개념을 이해하기 위해 시각, 미각, 촉각, 텍스트까지 여러가지 감각을 통합하여 인식
  • 이처럼 AI가 인간이 학습하는 방식과 유사하게 학습하기 위해 여러 채널의 모달리티(양식)를 받아들여 학습하는 방법을 '멀티모달' 이라고 함

 

  Multimodal Toolkit

  • 위와 같은 이유로 개발된 멀티 모달 트랜스포머 툴킷
  • 텍스트 데이터 뿐만 아니라 표 형식의 피처 데이터를 결합하여 모델학습시 사용할 수 있도록 도움
  • 해당 툴킷이 지원하는 건 Text, Categorical, Numerical 피처 정도
  • 가장 간단하게는 구조화된 데이터를 일반 텍스트와 같이 추가할 수 있음
    • 👿 문제점: 트랜스포머가 처리할 수 있는 최대 토큰 길이에 의해 일부 특성이 누락될 수 있음
  • 따라서 해당 툴킷 개발을 위해 텍스트를 중심으로 트랜스포머 아키텍처를 활용하는 모델들을 검토하고, 정형/비정형 피처를 합쳐 모델링할 수 있는 주요 아이디어를 차용했다고함

  • github: https://github.com/georgian-io/Multimodal-Toolkit




  Reference Models

멀티모달 BiTransformers

 

ViLBERT & VLBert

  • 이미지와 텍스트에 대한 사전 학습 작업을 정의한 모델
  • ViLBERT는 VLBert와 거의 같지만 Cross-modal Attention을 썼다는 점이 주요한 차이

 

🔑  핵심사항

  • 멀티모달 데이터에 트랜스포머를 적용하기 위해 위의 모델들이 공통적으로 취한 점은 서로 다른 모달리티들간에 어텐션 또는 가중치 메커니즘을 보장하는 것
  • 이러한 어텐션 메커니즘은 아키텍처의 여러 지점에서 발생할 수 있음

 

  그래서 해당 툴킷은 어떻게 구현했는데?

  • 텍스트 데이터의 트랜스포머의 출력 후 피처와 범주형 및 숫자형 피처를 결합
  • Combining Module에서 두 피처를 결합하는 방식은 attention , gating , weighted sum 방식을 사용한 다양한 메서드로 지원

 

 

  🔎 사용 예제 - 리뷰 긍부정 분류

#Features

  • Text: Title, Review Text
  • Category: Clothing ID, Division Name, Department Name and Class Name
  • Numeric: Rating, _Positive Feedback Count

1. 데이터셋 로드

  1. 원본 데이터셋 로드
  2. text, categorical, numerical, label 컬럼에 대해 정의
  3. 툴킷의 load_data 모듈을 이용해서 데이터를 TorchTabularTextDataset 으로 변환

2. 모델 로드

  1. huggingface의 config 객체 생성
  2. 정형/비정형 데이터를 결합하는 방식 등을 지정하여 TabularConfig 객체 생성
  3. hf config의 멤버 변수로 tabular config를 설정
  4. huggingface API와 동일하게 TabularModel 을 로드할 수 있음

3. 학습

  1. huggingface의 TrainingArguments와 Trainer를 그대로 사용하면 됨

 

✔ 결과는?

  • baseline(unimodal)이 가장 성능이 높은데?
    • 여기서 말하는 unimodal은 모든 범주형/숫자형 컬럼도 텍스트 칼럼이라고 넣어주고 space로 연결하여 하나의 텍스트로 토큰화하고 처리한 것
    • combine_feat_methodtext_only 로 설정하여ForSequenceClassification 모델의 과정과 동일하게 처리
    • 위의 표에서 text_only와 unimodal 모두 동일한 text_only 컴바인 메서드를 사용하지만 주입하는 피처를 어떻게 정의했느냐가 아래와 같이 다름
# text_only
{
  "text_cols": [
    "Title",
    "Review Text"
  ],
  "cat_cols": [
    "Division Name",
    "Department Name",
    "Class Name"
  ],
  "num_cols": [
    "Rating",
    "Age",
    "Positive Feedback Count"
  ],
  "label_col": "Recommended IND",
  "label_list": ["Not Recommended", "Recommended"]
}

# unimodal
{
  "text_cols": [
    "Title",
    "Review Text",
    "Division Name",
    "Department Name",
    "Class Name",
    "Rating",
    "Age",
    "Positive Feedback Count"
  ],
  "text_col_sep_token": " ",
  "label_col": "Recommended IND",
  "label_list": ["Not Recommended", "Recommended"]
}

 

그런데 각 모달리티를 다른 방식으로 처리해서 합산해줘야 더 좋다며..?

 

⭐️ 성능 향상에 영향을 미치는 건 tabular 피처의 중요도!

  • 리뷰 긍부정 분류의 경우, 리뷰의 내용이 분류에 있어 가장 중요한 요소임
    • text / categoical / numerical 피처의 수 : 2 / 3 / 3
    • 그 외의 상품의 이름이라던가, 리뷰 작성자의 나이와 같은 요소는 크게 영향을 주지 않음
  • 다른 예제인 반려동물 입양 속도 예측 (다중 클래스 분류) 의 경우 tabular 피처의 중요도가 높기 때문에 이를 반영하여 학습한 결과가 text_only일 때보다 성능이 높음
    • text / categoical / numerical 피처의 수 : 3 / 74 / 15

 

  🔩 소스코드 구조 뜯어보기

/Multimodal-Toolkit/multimodal_transformers
├── data
│   ├── data_utils.py
│   ├── __init__.py
│   ├── load_data.py
│   └── tabular_torch_dataset.py
├── __init__.py
└── model
    ├── __init__.py
    ├── layer_utils.py
    ├── tabular_combiner.py
    ├── tabular_config.py
    ├── tabular_modeling_auto.py
    └── tabular_transformers.py
  • 소스 폴더의 구조는 크게 datamodel 로 이루어져 있음
  • 주요 모듈에 대한 정보는 아래와 같다.
  • data
    • tabular_torch_dataset.py: Tabular+Text 데이터셋을 정의하기 위한 커스텀 데이터셋 클래스 구현
  • model
    • tabular_combiner.py: BERT 출력과 범주형/수치형 특성을 결합하기 위한 모듈 제공
    • tabular_transformers.py: BERT 모델에 기반하여 텍스트 데이터와 테이블 데이터를 함께 처리할 수 있는 모델을 제공
    • 지원되는 모델:

 

TorchTabularTextDataset

  • 이 클래스는 PyTorch의 torch.utils.data.Dataset을 확장하여 텍스트 데이터와 함께 범주형과 수치형 특성을 포함한 데이터셋을 다루기 위한 Wrapper를 제공한다.
  • __init__ 메서드
    • 토크나이저를 거친 텍스트 encoding 결과와 data_utils.py 를 사용하여 전처리된 범주형 및 수치형 특성 및 레이블 정보를 담는다.
  • __getitem__ 메서드
    • 주어진 인덱스에 대해 데이터셋에서 하나의 항목을 반환한다.
    • text 인코딩 및 레이블을 torch tensor 형태로 변환하고 추가된 범주형과 수치형 특성에 대해서도 각각 torch tensor로 변환하여 반환한다.
    • 만약 값이 없으면 비어있는 텐서로 대체한다.
  • 필수로 구현해야하는 init, get_item, len 에 추가로 모델 평가시 결과 확인을 위해 라벨의 텍스트 정보를 반환하는 get_labels 메서드가 붙었다.

 

 

BertWithTabular

  • tabular_transformers.py 의 여러 모델 클래스 중 대표적으로 BertForSequenceClassification 을 확장한 모델 클래스를 살펴본다.
  • 다른 커스텀 클래스도 본래의 모델 출력에 대한 처리만 다를 뿐 기본적인 구현 방식은 유사하다.
  • 모델 초기화
    • hf_model_config를 받아들이고, 이를 사용하여 BERT 모델과 함께 TabularFeatCombiner 모듈을 초기화함
    • use_simple_classifier
      • tabular_config의 설정에 따라 모델이 사용할 분류기를 선택
      • True인 경우:
        • 단순한 선형 분류기(nn.Linear)를 생성
        • combined_feat_dim 크기의 피쳐를 입력으로 받고, tabular_config.num_labels 크기의 출력을 가진 선형 레이어를 만듦
      • False 인 경우:
        • 복잡한 비선형 관계를 학습할 수 있는 다층 퍼셉트론(MLP)을 사용
        • calc_mlp_dims 를 통해 은닉 레이어의 차원을 계산하여 생성하게 됨
        • 계산된 차원에 따라 MLP 클래스를 사용하여 MLP 분류기를 초기화함
  • forward 메서드
    • 모델을 통해 데이터를 전달하고, BERT의 출력과 특성을 결합하여 분류 작업에 대한 손실, 로짓, 그리고 최종 분류기 레이어의 출력을 반환
    • 주목할만한 인자들로는 labels (레이블), cat_feats (범주형 특성), numerical_feats (수치형 특성) 등이 있으며, 이러한 특성들은 TabularFeatCombiner로 전달되어 BERT의 출력과 함께 결합됨

 

  결론

  • 다양한 데이터 유형 통합: 이 툴킷은 텍스트 데이터와 함께 표 형식의 피처 데이터를 결합하여 모델 학습에 활용할 수 있어, 다양한 데이터 유형을 효과적으로 다룰 수 있다.
  • 구조화된 데이터 처리: 구조화된 데이터를 텍스트와 함께 처리할 수 있는 방법을 제공하여, 트랜스포머가 처리하는 최대 토큰 길이의 제한을 극복한다.
  • 다양한 결합 방식 제공: 텍스트와 구조화된 데이터를 결합하는 방식으로 'attention', 'gating', 'weighted sum' 등 다양한 메서드를 지원한다.
  • 편리한 구현 및 활용: TorchTabularTextDataset과 TabularModel 등의 클래스를 통해 툴킷의 활용이 간편하며, huggingface API와 호환되어 효율적인 모델 학습을 지원한다.