머신러닝: 인공지능의 한 분야로 data의 Pattern을 학습. (이때, 비교적 적은 양의 구조화된 data로도 작동가능)
딥러닝: 머신러닝의 한 분야로 복잡한 구조, 많은 계산리소스 및 데이터를 필요로 함.
Transformer(Attention is All You Need-2017)
Transformer 모델의 핵심:
∙input sequence 병렬처리
∙Only Use Attention Mechanism (Self Attention) ∙순차적처리, 반복연결, 재귀 모두 사용❌
Transformer 모델구조:
∙Embedding:token2dense-vector (이때, 단어간의 의미적 유사성을 보존하는 방향으로 모델이 학습된다.) ∙Positional Encoding:input sequence의 token위치정보를 추가로 제공 ∙Encoder&Decoder: Embedding+PE라는 학습된 vector를 Input으로 받음(벡터 값은 Pretrained weight or 학습과정중 최적화됨.) - MHA & FFN:token간 관계를 학습, FFN으로 각 단어의 특징벡터 추출 (이때, 각 Head값은 서로 다른 가중치를 가져 input sequence의 다양한 측면 포착가능.) - QKV:Query(현재위치에서 관심있는부분의 벡터), Key(각 위치에 대한 정보의 벡터), Value(각 위치에 대한 값 벡터)
ex) The student studies at the home query:student --> Q:student정보를 얻기 위한 벡터값 --> K: The, studies, at, the, home 벡터값 --> V: 문맥, 의미등의 관련정보에 대한 벡터값 --> 3-Head라면: 각 헤드별 역할이 Syntax, Semantics, Pragmatics 등에 집중할 수 있다는 것.
Huggingface Transformers
Library 소개
Tokenizer
보통 subword로 token화(token으로 분할)하는 과정을 진행.부수적으로 "텍스트 정규화, 불용어제거, Padding, Truncation 등" 다양한 전처리 기능도 제공한다.
Diffusers Library
txt-img생성관련 작업을 위한 라이브러리로 Stable Diffusion, DALL-E, LDM 등 다양한 생성모델을 지원. - DDPM, DDIM, LDM등 다양한 Diffusion기반 알고리즘 제공 - Batch Inference, 병렬, 혼합정밀도학습 등 지원
Accelerate
분산전략을 간단히 추상화해 API로 제공, FP16 및 BF16등의 낮은 혼합정밀도학습을 "자동지원" - 분산학습 지원: Data Parallel, Model Parallel 등 지원. - Automatic Mixed Precision지원: FP16, FP32 등 data형식을 자동으로 혼합, 메모리사용량↓, 속도↑
- Gradient Accumulation: 여러 미니배치의 그래디언트를 누적하여 큰 배치 효과를 내는 기법 - Gradient Checkpointing: 중간 activation계산을 저장하는 대신, 필요할 때 재계산하는 방법
Model 설정
모델 설정 클래스는 모델구조와 hyperparameter값을 "딕셔너리"형태로 JSON파일에 저장한다. 따라서 모델을 불러오면 모델가중치와 함께 이 값이 불러와진다. (아래 사진처럼)
PretrainedConfig & ModelConfig
마찬가지로 모델구조, hyperparameter를 저장하는 딕셔너리를 포함 [예시인자 설명]: -vocab_size: 모델이 인식가능한 고유토큰 수 -output_hidden_states: 모델의모든hidden_state를 출력할지 여부 -output_attentions: 모델의모든 attention값을 출력할지 여부 -return_dict: 모델이 일반 튜플대신, ModelOutput객체를 반환할지 결정. 각 모델 구조별 PretrainedConfig를 상속받은 전용 모델 설정 클래스가 제공된다. (ex. BertConfig, GPT2Config 혹은 아래 사진처럼...)
InternVisionConfig를 직접 인스턴스화해 설정하는 예시
이때, 설정값이 잘못되면 모델성능이 크게 떨어질 수 있기에보통 "from_pretrained"를 이용해 검증된 pretrained학습설정값을 불러온다.
[예시인자 설명]: -max_model_input_sizes: 모델의 최대입력길이 -model_max_length: tokenizer가 사용하는 모델의 최대입력길이 (즉, 토크나이저의 model_max_length는 모델의 max_model_input_sizes보다 크지 않도록 설정해야 모델이 정상적으로 입력을 처리할 수 있다.) -padding_side/truncation_side: padding/truncation위치(left/right) 결정 -model_input_names: 순전파시 입력되는 tensor목록(ex. input_ids, attention_mask, token_type_ids)
cf) decode메서드를 사용하면 token_id 문장을 원래 문장으로 복원한다. cf) PretrainedTokenizerFast는 Rust로 구현된 버전으로 Python Wrapper를 통해 호출되는, 더 빠른 tokenizer다.
이때, B는 Begin(개체명의 시작)을, I는 Inside(개체명의 연속)를, O는 Outside(개체명이 아닌것)를 의미한다. 이런 NER에서 자주사용되는 모델이 바로 BERT이다.
BERT - MLM, NSP
문장간 관계(요약 등)를 이해하기 위해 활용되는 [CLS]토큰이 사용된다. BERT에서는 총 3가지 Embedding이 Embedding Layer에서 활용된다: 1. Token Embedding: - 입력문장 embedding 2. Segment Embedding: - 모델이 인식하도록 각 문장에 고정된 숫자 할당. 3. Position Embedding: - input을 한번에 모두 밀어넣기에(= 순차적으로 넣지 않음) - Transformer Encoder는 각 token의 시간적 순서를 알지 못함 - 이를 위해 위치정보를 삽입하기위해 sine, cosine을 사용한다. 추천강의) https://www.youtube.com/watch?app=desktop&v=CiOL2h1l-EE
BART - Summarization
Abstractive & ExtractiveSummarization
추상요약:원문을 완전히 이해 --> 새로운 문장을 생성해 요약하는 방식. 추출요약:원문에서 가장 중요하고 관련성 높은 문장들만 선택해 그대로 추출. (요약문이 부자연스러울 수는 있으며, 중복제거능력이 필요함.)
BART (Bidirectional & Auto Regressive Transformers)
Encoder-Decoder 모두 존재하며, 특히나 Embedding층을 공유하는 Shared Embedding을 사용해 둘간의 연결을 강화한다. Encoder는Bidirectional Encoder로각 단어가 문장 전체의 좌우 context를 모두 참조가능하며, Decoder에서Auto-Regressive방식으로이전에 생성한 단어를 참조해 다음 단어를 예측한다. 또한,Pre-Train시 Denoising Auto Encoder로 학습하는데, 임의로 noising후, 복원하게 한다.
RoBERTa, T5- TextQA
Abstractive & ExtractiveQA
추상질의응답:주어진 지문 내에서 답변이 되는 문자열 추출 (질문-지문-지문내답변추출) 추출질의응답:질문과 지문을 입력받아 새로운 답변 생성 (질문-지문-답변)
통계적 기계번역:원문-번역쌍 기반, 단어순서 및 언어패턴을 인식 --> 대규모 data필요 신경망 기계번역:번역문과 단어시퀀스간 관계를 학습
T5 (Text-To-Text Transfer Transformer)
tast별 특정 Prompt형식을 사용해 적절한 출력을 생성하게 유도가능하다. 즉, 단일 모델로 다양한 NLP Task를 처리가능한 seq2seq구조를 기반으로 한다.
T5의 독특한점은 모델구조차제가 아닌, "입출력 모두 Txt형태로 취급하는 seq2seq로 접근해 Pretrain과정에서"Unsupervised Learning"을 통해대규모 corpus(약 75GB)를 사용한다는 점이다." 이를 통해언어의 일반적 패턴과 지식을 효과적으로 습득한다.
LLaMA - Text Generation
Seq2Seq & CausalLM
Seq2Seq:Transformer, BART, T5 등 Encoder-Decoder구조 CausalLM:단일 Decoder로 구성
LLaMA-3 Family
2024년 4월, LLaMA-3가 출시되었는데,LLaMA-3에서는 GQA(Grouped Query Attention)이 사용되어 Inference속도를 높였다. LLaMA-3는 Incontext-Learning, Few-Shot Learning 모두 뛰어난 성능을 보인다. Incontext-Learning:모델이 입력텍스트를 기반으로 새로운 작업을 즉석에서 수행하는 능력
추가적으로 2024년 7월,LLaMA-3.1이 공개되었다.LLaMA-3.1은 AI안정성 및 보안관련 도구가 추가되었는데, Prompt Injection을 방지하는 Prompt Guard를 도입해 유해하거나 부적절한 콘텐츠를 식별하게 하였다. 추가적으로LLaMA-3 시리즈는 다음과 같은 주요 특징이 존재한다: - RoPE(Rotary Position Embedding):Q, K에 적용 - GQA(Grouped Query Attention):K, V를 여러 그룹으로 묶어 attention연산수행 --> 효율적 추론 - RMS Norm:안정적 학습 및 계산의 효율성 - KV cache:추론시 K,V를 cache에 저장 --> 연산의 효율성
LLaMA-3 최적화기법: SFT . RLHF . DPO
SFT(Supervised Fine-Tuning):사람이 작성한 고품질QA쌍으로 모델을 직접 학습시키는 방법 RLHF:PPO알고리즘기반, 모델이 생성한 여러 응답에 대해 사람이 순위를 매기고 이를 바탕으로 재학습. DPO(Direct Preference Optimization):RLHF의 복잡성을 줄이면서 효과적 학습을 가능케함.(사람이 매긴 응답순위를 직접학습; 다만 더욱 고품질 선호도 data를 필요로함.)
Computer Vision
주로 CV(Computer Vision)분야에선 CNN기법이 많이 활용되었다.(VGG, Inception, ResNet, ...) 다만, CNN based model은 주로 국소적(local) pattern을 학습하기에 전역적인 관계(global relation)모델링에 한계가 존재한다. 추가적으로 이미지 크기가 커질수록 계산복잡도 또한 증가한다.
이를 해결하기 위해 ViT(Vision Transformer)가 제안되었으며, 대규모 dataset으로 효율적으로 학습한다. ViT의 가장 대표적인 격인 CLIP, OWL-ViT, SAM에 대해 알아보자.
Zero shot classification
Zero Shot Classification: CLIP, ALIGN, SigLIP
사실 CLIP은 다양한 Task에서 많이 활용되나 본 글은 Train dataset에 없는 Label에 대해 Image Classification을 수행하는 기술에 활용되는 방법으로 알아보고자 한다. 새로운 Label이 추가될 때마다 재학습이 필요한데, 이를 피하려면 Zero shot기법은 반필수적이기 때문이다.
CLIP (Contrastive Language-Image Pre-training)
Model
Architecture
Input_Size
Patch_Size
#params
openai/clip-vit-base-patch32
ViT-B/32
224×224
32×32
1.5B
openai/clip-vit-base-patch16
ViT-B/16
224×224
16×16
1.5B
openai/clip-vit-large-patch14
ViT-L/14
224×224
14×14
4.3B
openai/clip-vit-large-patch14-336
ViT-L/14
336×336
14×14
4.3B
작은 patch_size: 더 세밀한 특징추출, 메모리 사용량 및 계산시간 증가
큰 patch_size: 비교적 낮은 성능, 빠른 처리속도파란블록: Positive Sample , 흰블록: Negative Sample 기존 Supervised Learning과 달리 2가지 특징이 존재한다: 1.별도의 Label없이input으로 image-txt쌍만 학습. -img, txt를 동일한 embedding공간에 사영(Projection) - 이를 통해 두 Modality간 의미적 유사성을 직접적으로 측정 및 학습가능 - 이 때문에 CLIP은 img-encoder, txt-encoder 모두 갖고있음 2. Contrastive Learning: - "Positive Sample": 실제img-txt쌍 --> img-txt간 의미적유사성 최대화 - "Negative Sample": random하게 pair된 불일치img-txt쌍 --> 유사성 최소화 - 이를 위해 Cosine Similarity기반의Contrastive Learning Loss를 사용.
CLIPProcessor에는 CLIPImageProcessor와 CLIPTokenizer가 내부적으로 포함되어 있다. input_ids에서 49406과 49407은 각각 startoftext와 endoftext를 나타내는 특별한 값이다. attention_mask는 변환된 token_types로 값이 1이면 해당위치토큰이 실제데이터값을 나타내고, 0은 [PAD]를 의미한다.
자연어적 설명에는 이미지 내 객체와 개략적 위치정보를 암시적으로 포함한다. CLIP에서 img-txt쌍으로 시각적특징과 텍스트간 연관성을 학습가능함을 보였기에, 추론 시, 주어진 txt prompt만 잘 설계한다면 객체의 위치를 예측할 수 있게된다. 따라서 zero-shot object detection에서는 전통적인 annotation정보 없이도 시각과 언어간의 상관관계를 학습하여 새로운 객체클래스를 검출할 수 있게 해준다. OWL-ViT의 경우, Multi-Modal Backbone모델로 CLIP모델을 사용한다.
OWLv2 (OWL-ViT)
OWL-ViT구조, OWLv2는 객체검출헤드에 Objectness Classifier추가함.OWL-ViT는 img-txt쌍으로 pretrain하여 Open-Vocabulary객체탐지가 가능하다. OWLv2는 Self-Training기법으로 성능을 크게 향상시켰다. 즉, 기존 Detector로 Weak Supervision방식으로 가상의 Bbox-Annotation을 자동생성한다. ex) input: img-txt pair[강아지가 공을 가지고 노는] 기존 detector: [강아지 bbox] [공 bbox] 자동예측, annotation생성 --> 모델 학습에 이용 (즉, 정확한 위치정보는 없지만 부분적 supervision signal로 weak signal기반, 모델이 객체의 위치 및 클래스를 추론, 학습하게 함)
Image Segmentation은 보다 정밀한, 픽셀별 분류를 수행하기에 높은 계산비용이 들며, 광범위한 train data와 정교한 알고리즘을 필요로 한다. 전통적 방법으로는 threshold기반 binary classification, Edge Detection등이 있으며 최신 방법으로는 딥러닝모델을 이용해 Image Segmentation을 진행한다. 전통적 방법은 단순하고 빠르지만 복잡하거나 다양한 조명조건 등에서 성능이 크게 저하되는 단점이 존재한다.
SAM (Segment Anything Model)
Model
Architecture
Input_Size
Patch_Size
#params
facebook/sam-vit-base
ViT-B/16
1024×1024
16×16
0.9B
facebook/sam-vit-large
ViT-L/16
1024×1024
16×16
3.1B
facebook/sam-vit-huge
ViT-H/16
1024×1024
16×16
6.4B
SAM구조: img-encoder, prompt-encoder, mask-decoder
SAM은 Meta에서 개발한 다양한 도메인에서 수집한 1100만개 이미지를 이용해 학습한 모델이다.
그렇기에 다양한 환경에서 image segmentation작업을 고수준으로 수행가능하다. SAM을 이용하면 많은경우, 추가적인 Fine-Tuning없이, 다양한 Domain image에 대한 segmentation이 가능하다.
SAM은 prompt를 받을수도 있고, 받지 않아도 되는데, prompt는 좌표, bbox, txt 등 다양하게 줄 수 있다. 추가적으로 prompt를 주지 않으면 img 전체에 대한 포괄적인 Segmentation을 진행한다. 다만, Inference결과로 Binary Mask는 제공하지만 pixel에 대한 구체적 class정보는 포함하지 않는다.
image matching은 디지털 이미지간 유사성을 정량화, 비교하는 방법이다. 이를 image의 feature vector를 추출하여 각 image vector간 유사도(거리)를 측정하여 계산한다. 그렇기에 이미지 매칭의 핵심은"이미지 특징을 효과적으로 포착하는 feature vector의 생성"이다. (보통 특징벡터가 고차원일수록 더 많은 정보를 포함하며, 이 특징벡터는 classification layer와 같은 층을 통과하기 직전(= Feature Extractor의 결과값 = Classifier 직전값) 벡터를 보통 의미한다.)
ex) ViT를 이용한 특징벡터 추출 예제
import torch
from datasets import load_dataset
from transformers import ViTImageProcessor, ViTModel
dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]
model_name = "google/vit-base-patch16-224"
processor = ViTImageProcessor.from_pretrained(model_name)
model = ViTModel.from_pretrained(model_name)
inputs = processor(image, return_tensors="pt")
with torch.no_grad():
outputs = model(inputs["pixel_values"])
print("마지막 특징 맵의 형태 :", outputs["last_hidden_state"].shape)
print("특징 벡터의 차원 수 :", outputs["last_hidden_state"][:, 0, :].shape)
print("특징 벡터 :", outputs["last_hidden_state"][:, 0, :])
# 마지막 특징 맵의 형태 : torch.Size([1, 197, 768])# 특징 벡터의 차원 수 : torch.Size([1, 768])# 특징 벡터 : tensor([[ 2.9420e-01, 8.3502e-01, ..., -8.4114e-01, 1.7990e-01]])
ImageNet-21K라는 방대한 사전Dataset으로 학습되어 미세한 차이 및 복잡한 패턴을 인식할 수 있게 된다. ViT에서 feature vector추출 시, 주목할점은last_hidden_state 키 값이다: 출력이 [1, 197, 768]의[B, 출력토큰수, feature차원]을 의미하는데, 197개의 출력토큰은 다음을 의미한다. 224×224 --> 16×16(patch_size) --> 196개 patches, 197 = [CLS] + 196 patches로 이루어진 출력토큰에서[CLS]를 특징벡터로 사용한다.
FAISS (Facebook AI Similarity Search)
FAISS는 메타에서 개발한 고성능 벡터유사도검색 라이브러리이다. 이는"대규모 고차원 벡터 데이터베이스에서 유사한 벡터를 검색"가능하게 설계되었다.
cf) [벡터 저장 및 관리방식]
로컬 저장 장치: SSD나 NVMe같은 고속저장장치를 사용해 빠른 데이터 접근이 가능.
데이터베이스 시스템: PstgreSQL, pgvector확장이나 MongoDB의 Atlas Vector Search같은 벡터검색기능을 지원하는 데이터베이스를 활용
클라우드 벡터 데이터베이스: Amazon OpenSearch, Ggogle Vetex AI등 클라우드 서비스는 대규모 벡터데이터의 저장 및 검색을 위한 특화된 솔루션을 제공
벡터검색엔진: Milvus, Qdrant, Weaviate, FAISS 등의 벡터 데이터 베이스는 대규모 벡터 dataset의 효율적 저장 및 고성능 검색을 위해 최적화되어 ANN(Approximate Nearest Neighbor)알고리즘으로 빠른 유사도검색을 지원, 실시간 검색이 필요한 경우 특히나 적합하다.
ex) CLIP을 이용한 이미지 특징벡터 추출 예제
import torch
import numpy as np
from datasets import load_dataset
from transformers import CLIPProcessor, CLIPModel
dataset = load_dataset("sasha/dog-food")
images = dataset["test"]["image"][:100]
model_name = "openai/clip-vit-base-patch32"
processor = CLIPProcessor.from_pretrained(model_name)
model = CLIPModel.from_pretrained(model_name)
vectors = []
with torch.no_grad():
for image in images:
inputs = processor(images=image, padding=True, return_tensors="pt")
outputs = model.get_image_features(**inputs)
vectors.append(outputs.cpu().numpy())
vectors = np.vstack(vectors)
print("이미지 벡터의 shape :", vectors.shape)
# 이미지 벡터의 shape : (100, 512)
dog-food dataset에서 100개 이미지를 선택→각 이미지 벡터를 추출 →vectors리스트에 저장→ ndarray형식으로 변환
이런 특징벡터를 유사도 검색을 위한 인덱스 생성에 활용가능하다: 생성된 인덱스에 이미지 벡터를 등록하기 위해 add를 사용하는데, 이때 입력되는 이미지 벡터는 반드시 numpy의 ndarray형식의 [벡터개수, 벡터차원수] 형태로 구성되어야 한다!!
import faiss
dimension = vectors.shape[-1]
index = faiss.IndexFlatL2(dimension)
if torch.cuda.is_available():
res = faiss.StandardGpuResources()
index = faiss.index_cpu_to_gpu(res, 0, index)
index.add(vectors)
import matplotlib.pyplot as plt
search_vector = vectors[0].reshape(1, -1)
num_neighbors = 5distances, indices = index.search(x=search_vector, k=num_neighbors)
fig, axes = plt.subplots(1, num_neighbors + 1, figsize=(15, 5))
axes[0].imshow(images[0])
axes[0].set_title("Input Image")
axes[0].axis("off")
for i, idx in enumerate(indices[0]):
axes[i + 1].imshow(images[idx])
axes[i + 1].set_title(f"Match {i + 1}\nIndex: {idx}\nDist: {distances[0][i]:.2f}")
axes[i + 1].axis("off")
print("유사한 벡터의 인덱스 번호:", indices)
print("유사도 계산 결과:", distances)
# 유사한 벡터의 인덱스 번호: [[ 0 6 75 1 73]]# 유사도 계산 결과: [[ 0. 43.922516 44.92473 46.544144 47.058586]]
위 과정을 통해 100개의 벡터를 저장한 FAISS 인덱스가 생성되며, 검색하고자하는 이미지의 특징벡터를 입력으로 인덱스 내에서 가장 유사한 벡터를 효율적으로 추출가능하다. 다만, 인덱스에 저장된 벡터에 대해서만 검색이 가능하기에 검색범위를 확장하고자 한다면 더 많은 벡터를 인덱스에 추가해야한다.
위 코드를 보면아래와 같은 코드가 있는데, FAISS 라이브러리에서는 다양한 인덱스유형들을 제공한다:
index = faiss.IndexFlatL2(dimension)
이름
정확도
속도
특징
IndexFlatL2
가장 높음
가장 느림
모든 벡터에 대한 완전탐색을 수행
IndexHNSW
높음
보통
그래프 구조를 사용해 효율적 검색
IndexIVFlat
보통
가장 빠름
벡터간 clustering으로 탐색범위를 줄여 검색
Multi-Modal
Image Captioning (img2txt)
BLIP
BLIP의 핵심아이디어는 "img와 Txt의 상호작용을 모델링하는 것"이다. 이를 위해 img-encoder, txt-encoder로 각각의 feature vector를 연결해 통합 표현을 생성한다.
BLIP-2 구조
BLIP2는 Q-Former를 도입해 img-txt간 상호작용과 정보교환을 향상시켰다: [img-txt대조학습, ITM, img기반 txt생성] --> 동시에 하나의 Encode-Decoder구조로 수행 Q-Former는 입력으로 고정된 이미지 feature embedding을 받은 후 img-txt관계가 잘 표현된 Soft visual prompt Embedding을 출력한다.
DocumentQA
DQA(DocumentQA)는 자연어처리 + 정보검색기술을 융합해 QA를 진행하는 것이다. DQA는 시각적 구조와 Layout을 고려해야하는데, 이 중 가장 주목받는 모델 중 하나가 바로 LayoutLM이다.
LayoutLM (Layout-aware Language Model)
LayoutLM은 Microsoft에서 문서 이미지의 txt뿐만아니라 Layout정보까지 함께 Pre-Train된 모델이다. [LayoutLMv1]
LayoutLM-v1
BERT를 기반으로txt와 함께 txt의 위치정보를 입력으로 사용한다. Faster R-CNN같은 OCR모델로 txt와 bbox경계를 추출, position embedding으로 추가하며 단어의 image patch(feature)도 model에 입력한다. 다만, LayoutLMv1은 image feature가 맨 마지막에 추가되어 Pretrain시 실제로 활용할 수 없다는 단점이 존재한다.
LayoutLMv2는 image embedding을 추가로 도입해 문서의 시각적 정보를 효과적으로 반영한다. LayoutLMv2에서visual embedding이 ResNeXT-FPN으로 추출된다. 즉, txt, img-patch, layout정보를 동시에 입력으로 받아 Self-Attention을 수행한다. - 학습 주요 목표: i) Masked Visual-Language Modeling: 문장의 빈칸 예측 ii) ITM: 특정 텍스트와 해당 이미지간의 연관성 학습 iii)Text-Image Alignment: 이미지에서 특정 단어가 가려졌을 때, 그 위치를 식별하는 능력
LayoutLMv3는 Faster R-CNN, CNN등의Pre-Trained Backbone에 의존하지 않는 최초의 통합 MLLMs이다. 이를 위해 전과 달리 새로운 사전학습전략 및 과제를 도입하였다: i) Masked Language Modeling(MLM): 일부 단어 token 마스킹 ii)Masked Image Modeling(MIM): 마스킹된 token에 해당하는 이미지 부분을 마스킹 iii) Word PatchAlignment(WPA): img token과 대응되는 Txt token의 마스킹여부를 이진분류, 두 모달리티간 정렬을 학습
2)patch_embedding모듈은 이미지를 처리: -patch로 분할하고 각 patch를 embedding으로 변환하는 ViT역할
3)encoder -여러 Transformer층으로 구성.
VQA
VQA process: 시각적 특징 추출 → Q의미파악→시각적특징과 Q의 txt정보를 통합해 의미있는 표현(A)생성 이를 위해 등장한 것이 바로 ViLT이다.
ViLT (Vision-and-Language Transformer)
시각적 입력을 txt입력과 동일한 방식으로 처리하는 단일모델구조로 구성되어 있다. 이때, 두 모달리티 구분을 위해 모달타입 embedding이 추가되며, 학습과정에서 3가지 손실함수를 통해 이뤄진다: -ITM: 주어진 Image와 Text가 서로 연관되어있는지 판단. -MLM: 단어단위의 Masking으로 전체 단어맥락 파악 -WPA: img-txt간 벡터 유사도 최대화
결과적으로 img+txt를 효과적으로 결합해, 단일 embedding공간에 표현한다.
cf)collate_fn은 pytorch의 dataloader로batch를 구성할 때, 각 sample을 어떻게 결합할 것인지 정의하는 함수다.
Image Generation
이미지 생성은 prompt를 기반으로 이해하여 GAN이나 Diffusion Model을 이용해 prompt의 세부적 특징을 잘 잡아내 새로운 img를 생성하는 기술을 의미한다.
[Stable-Diffusion 1] - 512×512 img 생성 - txt2img, img2img, inpainting 등의 기능
[Stable-Diffusion 2] - 768×768 img 생성 - OpenCLIP으로 더 나은 WPA 제공, 세부적 묘사 개선
[Stable-Diffusion 3] - 더욱 고해상도 이미지 생성 - Rectified flow기반의 새로운 모델구조 - txt와 img token간 양방향 정보흐름을 가능하게하는 새로운 모델구조
etc
Hyperparameter Tuning - ray tune
raytune은 분산 hypereparameter 최적화 framework이다. 대규모 분산컴퓨팅 환경에서 다양한 hyperparameter 탐색 알고리즘(random, greedy 등)을 지원하며, Early Stopping 또한 제공한다. 추가적으로 실험결과 추적 및 시각화 도구 또한 제공하며, 최적의 hyperparameter 조합 또한 효과적으로 식별할 수 있게 도와준다.
GPTQ는 모델 최적화방식으로 LLM의 효율성을 크게 향상가능하다. 모델의 가중치를 낮은 bit정밀도로 양자화해 모델크기를 줄이고 추론속도를 높인다. 아래 예제의 출력결과를 보면 알 수 있듯, 모델 크기를 상당히 큰 폭으로 줄일 수 있는데, GPTQ방법은 GPT계열뿐만 아니라 다른 Transformer 기반 모델들 모두 적용 가능하다.
from transformers import pipeline
origin_generator = pipeline("text-generation", model="facebook/opt-125m")
quantized_generator = pipeline("text-generation", model=quantized_model, tokenizer=tokenizer)
input_text_list = [
"In the future, technology wil",
"What are we having for dinner?",
"What day comes after Monday?"
]
print("원본 모델의 출력 결과:")
for input_text in input_text_list:
print(origin_generator(input_text))
print("양자화 모델의 출력 결과:")
for input_text in input_text_list:
print(quantized_generator(input_text))
# 원본 모델의 출력 결과:# [{'generated_text': 'In the future, technology wil be used to make the world a better place.\nI think'}]# [{'generated_text': 'What are we having for dinner?\n\nWe have a great dinner tonight. We have a'}]# [{'generated_text': "What day comes after Monday?\nI'm guessing Monday."}]# 양자화 모델의 출력 결과:# [{'generated_text': 'In the future, technology wil be able to make it possible to make a phone that can be'}]# [{'generated_text': "What are we having for dinner?\n\nI'm not sure what to do with all this"}]# [{'generated_text': "What day comes after Monday?\nI'm not sure, but I'll be sure to check"}]
출력결과, 정확도가 다소 떨어지긴 하나 원본모델과 큰 차이가 없음을 확인할 수 있다.
import time
import numpy as np
defmeasure_inference_time(generator, input_text, iterations=10):
times = []
for _ inrange(iterations):
start_time = time.time()
generator(input_text)
end_time = time.time()
times.append(end_time - start_time)
avg_time = np.mean(times)
return avg_time
defcalculate_model_size(model):
total_params = sum(p.numel() for p in model.parameters())
total_memory = sum(p.numel() * p.element_size() for p in model.parameters())
total_memory_mb = total_memory / (1024 ** 2)
return total_memory_mb, total_params
test_input = "Once upon a time in a land far, far away, there was a small village."
size_original, total_params_original = calculate_model_size(origin_generator.model)
avg_inference_time_original = measure_inference_time(origin_generator, test_input)
size_quantized, total_params_quantized = calculate_model_size(quantized_generator.model)
avg_inference_time_quantized = measure_inference_time(quantized_generator, test_input)
print("원본 모델:")
print(f"- 매개변수 개수: {total_params_original:,}")
print(f"- 모델 크기: {size_original:.2f} MB")
print(f"- 평균 추론 시간: {avg_inference_time_original:.4f} sec")
print("양자화 모델:")
print(f"- 매개변수 개수: {total_params_quantized:,}")
print(f"- 모델 크기: {size_quantized:.2f} MB")
print(f"- 평균 추론 시간: {avg_inference_time_quantized:.4f} sec")
# 원본 모델:# - 매개변수 개수: 125,239,296# - 모델 크기: 477.75 MB# - 평균 추론 시간: 0.1399 sec# 양자화 모델:# - 매개변수 개수: 40,221,696# - 모델 크기: 76.72 MB# - 평균 추론 시간: 0.0289 sec
추론 과정에 대한 출력결과를 보면, 원본에 비해 모델에 비해 크기가 크게 줄며 더 빠른 처리를 통해 실시간 응답에 대해 매우 효율적일 수 있음을 확인가능하다.