Multimodal Transformer?
- 트랜스포머 기반 모델은 비정형 데이터인 텍스트 데이터를 다루는 데 큰 변화를 가져옴
- 실제 환경에서 텍스트 데이터는 풍부한 정형 데이터 또는 오디오나 시각 정보와 같은 비정형 데이터와 함께 지원되는 경우가 많음
- 예를 들어 이커머스 리뷰의 경우, 리뷰 텍스트 외에도 판매자, 구매자, 제품에 대한 정보가 종합적으로 학습될 경우 더 좋은 성능을 기대할 수 있음
- 인간도 하나의 개념을 이해하기 위해 시각, 미각, 촉각, 텍스트까지 여러가지 감각을 통합하여 인식
- 이처럼 AI가 인간이 학습하는 방식과 유사하게 학습하기 위해 여러 채널의 모달리티(양식)를 받아들여 학습하는 방법을 '멀티모달' 이라고 함
Multimodal Toolkit
- 위와 같은 이유로 개발된 멀티 모달 트랜스포머 툴킷
- 텍스트 데이터 뿐만 아니라 표 형식의 피처 데이터를 결합하여 모델학습시 사용할 수 있도록 도움
- 해당 툴킷이 지원하는 건 Text, Categorical, Numerical 피처 정도
- 가장 간단하게는 구조화된 데이터를 일반 텍스트와 같이 추가할 수 있음
- 👿 문제점: 트랜스포머가 처리할 수 있는 최대 토큰 길이에 의해 일부 특성이 누락될 수 있음
- 따라서 해당 툴킷 개발을 위해 텍스트를 중심으로 트랜스포머 아키텍처를 활용하는 모델들을 검토하고, 정형/비정형 피처를 합쳐 모델링할 수 있는 주요 아이디어를 차용했다고함
- github: https://github.com/georgian-io/Multimodal-Toolkit
Reference Models
멀티모달 BiTransformers
- 논문: Supervised Multimodal Bitransformers for Classifying Images and Text
- 단어토큰 뒤에 ResNet의 결과로 나온 이미지 특징을 추가 토큰으로 붙임
ViLBERT & VLBert
- 이미지와 텍스트에 대한 사전 학습 작업을 정의한 모델
- ViLBERT는 VLBert와 거의 같지만 Cross-modal Attention을 썼다는 점이 주요한 차이
🔑 핵심사항
- 멀티모달 데이터에 트랜스포머를 적용하기 위해 위의 모델들이 공통적으로 취한 점은 서로 다른 모달리티들간에 어텐션 또는 가중치 메커니즘을 보장하는 것
- 이러한 어텐션 메커니즘은 아키텍처의 여러 지점에서 발생할 수 있음
그래서 해당 툴킷은 어떻게 구현했는데?
- 텍스트 데이터의 트랜스포머의 출력 후 피처와 범주형 및 숫자형 피처를 결합
Combining Module
에서 두 피처를 결합하는 방식은attention
,gating
,weighted sum
방식을 사용한 다양한 메서드로 지원
🔎 사용 예제 - 리뷰 긍부정 분류
- 사용 데이터: 캐글의 Women’s E-Commerce Clothing Reviews
#Features
- Text: Title, Review Text
- Category: Clothing ID, Division Name, Department Name and Class Name
- Numeric: Rating, _Positive Feedback Count
1. 데이터셋 로드
- 원본 데이터셋 로드
- text, categorical, numerical, label 컬럼에 대해 정의
- 툴킷의 load_data 모듈을 이용해서 데이터를
TorchTabularTextDataset
으로 변환
2. 모델 로드
- huggingface의 config 객체 생성
- 정형/비정형 데이터를 결합하는 방식 등을 지정하여
TabularConfig
객체 생성 - hf config의 멤버 변수로 tabular config를 설정
- huggingface API와 동일하게
TabularModel
을 로드할 수 있음
3. 학습
- huggingface의 TrainingArguments와 Trainer를 그대로 사용하면 됨
✔ 결과는?
- baseline(unimodal)이 가장 성능이 높은데?
- 여기서 말하는 unimodal은 모든 범주형/숫자형 컬럼도 텍스트 칼럼이라고 넣어주고 space로 연결하여 하나의 텍스트로 토큰화하고 처리한 것
combine_feat_method
를text_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
- 소스 폴더의 구조는 크게
data
와model
로 이루어져 있음 - 주요 모듈에 대한 정보는 아래와 같다.
- data
- tabular_torch_dataset.py:
Tabular+Text
데이터셋을 정의하기 위한 커스텀 데이터셋 클래스 구현
- tabular_torch_dataset.py:
- model
- tabular_combiner.py: BERT 출력과 범주형/수치형 특성을 결합하기 위한 모듈 제공
- tabular_transformers.py: BERT 모델에 기반하여 텍스트 데이터와 테이블 데이터를 함께 처리할 수 있는 모델을 제공
- 지원되는 모델:
- BERT, ALBERT, DistilBERT, RoBERTa, XLM, XLNET, XLM-RoBERTa
TorchTabularTextDataset
- 이 클래스는 PyTorch의
torch.utils.data.Dataset
을 확장하여 텍스트 데이터와 함께 범주형과 수치형 특성을 포함한 데이터셋을 다루기 위한 Wrapper를 제공한다. __init__
메서드- 토크나이저를 거친 텍스트 encoding 결과와
data_utils.py
를 사용하여 전처리된 범주형 및 수치형 특성 및 레이블 정보를 담는다.
- 토크나이저를 거친 텍스트 encoding 결과와
__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와 호환되어 효율적인 모델 학습을 지원한다.
'AI' 카테고리의 다른 글
[Mamba 이해하기] Part1 - 구조화된 상태공간 모델 (S4)을 이용한 긴 시퀀스의 효율적 모델링 (1) | 2024.02.18 |
---|---|
[DBSCAN] k-dist 함수 기반 엡실론 지정 방식에 대한 문제 및 한계 (0) | 2024.01.21 |
[NLP] hdbscan으로 키워드 클러스터링하기 (0) | 2023.03.13 |
[NLP] 텍스트 내의 명사구를 추출하는 방법 (0) | 2023.02.26 |
[NLP] OpenAI GPT-3 에서 토큰을 선택하는 방식 (feat. 샘플링) (0) | 2022.11.13 |