paper : https://arxiv.org/pdf/2305.16556
github : https://github.com/google-research/lanistr
Google Cloud AI
기존의 멀티모달 학습 연구는 주로 이미지, 텍스트, 오디오와 같은 비구조화(unstructured) 데이터에 집중되어 왔으며, 이 분야에서 상당한 성과를 이루어냈다.
그러나 구조화(structured) 데이터, 예를 들어 테이블 형태의 수치 정보나 시계열 데이터와 같은 형식의 데이터는 상대적으로 연구의 관심을 덜 받아온 영역이다.
이는 다소 아이러니한데, 실제 현실 세계에서는 구조화된 데이터가 가장 흔하게 존재하는 데이터 유형이기 때문이다.
예를 들어, 의료 분야의 진단 예측에서는 환자의 수치 기반 임상 정보(구조화 데이터)가 의료 영상, 임상 노트 등 비구조화된 정보와 함께 사용되며,
소매 분야의 수요 예측에서도 과거 판매 수치(구조화)와 제품 설명(비구조화)이 함께 고려된다.
그러나 지금까지의 많은 멀티모달 모델들은 이러한 이질적인(heterogeneous) 데이터 형식을 효과적으로 통합하는 데 있어 기술적 한계를 보여왔다.
이러한 배경에서, 구조화된 데이터와 비구조화된 데이터를 동시에 활용할 수 있는 새로운 멀티모달 학습 기법의 필요성이 점점 더 강조되고 있다.
LANISTR
LANISTR는 LANguage, Image, and STRuctured data의 약자로, 텍스트(자연어), 이미지, 그리고 표/시계열 등 구조화된 데이터를 통합적으로 학습하기 위해 설계된 Transformer 기반의 멀티모달 모델이다.
이 모델은 각 모달리티별로 전용 인코더를 두고 입력 데이터를 독립적으로 처리한다.
예를 들어, 텍스트는 텍스트 인코더, 이미지는 이미지 인코더, 구조화된 수치 정보(표, 시계열 등)는 테이블/시계열 인코더를 통해 임베딩된다.
- 텍스트 → BERT
- 이미지 → ViT-B/16
- 구조화 데이터:
- 표(tabular): TabNet
- 시계열(timeseries): Transformer
각 모달리티 임베딩은 concat 전에 projection layer를 거쳐 공통 표현 공간에 투영되며, 이후 Transformer 기반 cross-attention 융합 인코더로 전달된다.
이 융합 인코더는 Transformer 기반의 교차 어텐션(cross-attention) 구조를 사용하여,
서로 다른 모달 간의 정보를 효과적으로 상호작용시켜 하나의 통합 표현을 학습한다.
LANISTR의 가장 큰 특징 중 하나는, 모든 모달리티가 존재하는 병렬 데이터뿐만 아니라, 일부 모달리티가 결측된(비병렬) 데이터까지도 처리할 수 있다는 점이다.
이를 가능하게 하기 위해, LANISTR는 학습 과정에서 유사도 기반 멀티모달 마스킹 손실(similarity-based multimodal masking loss)이라는 새로운 학습 목표(loss function)를 도입했다.
이 손실은 특정 모달리티가 누락되었을 때, 남은 모달리티들로부터 의미 있는 표현을 예측하고 보완할 수 있도록 유도한다.
이러한 설계는, 실제 멀티모달 환경에서 자주 발생하는 모달리티 결측(missing modality) 문제*를 해결하기 위한 핵심적인 접근으로 평가된다.
*모달리티 결측(missing modality) : 멀티모달 학습에서 예상된 여러 종류의 입력 데이터(=모달리티) 중 일부가 누락된 상황
LANISTR의 사전학습(Pretraining) 기법
LANISTR는 비지도 자기지도학습(self-supervised learning)으로 사전학습
특히, 두 가지 마스킹 기반 학습 전략을 결합하여 모델의 표현력을 향상시켰다.
① 단일 모달 마스킹 학습
② 멀티모달 마스킹 학습(유사도 기반)
class LANISTRMultiModalForPreTraining(nn.Module):
def __init__(
self,
args: omegaconf.DictConfig,
image_encoder: nn.Module,
mim_head: nn.Module,
text_encoder: nn.Module,
mlm_head: nn.Module,
tabular_encoder: nn.Module,
timeseries_encoder: nn.Module,
mm_fusion: nn.Module,
image_proj: nn.Module,
text_proj: nn.Module,
tabular_proj: nn.Module,
time_proj: nn.Module,
mm_proj: nn.Module,
mm_predictor: nn.Module,
):
super().__init__()
# 학습 설정 파라미터
self.args = args
self.mlm_probability = args.mlm_probability
# 각 모달리티 인코더
self.text_encoder = text_encoder
self.image_encoder = image_encoder
self.tabular_encoder = tabular_encoder
self.timeseries_encoder = timeseries_encoder
# 멀티모달 통합 및 프로젝션
self.mm_fusion = mm_fusion
self.image_proj = image_proj
self.text_proj = text_proj
self.tabular_proj = tabular_proj
self.time_proj = time_proj
self.mm_proj = mm_proj
self.mm_predictor = mm_predictor
# SimMMM용 유사도 손실
self.mmm_loss = NegativeCosineSimilarityLoss
self.target_token_idx = 0
# 단일 모달 마스킹 학습용 헤드 및 손실
self.mlm_head = mlm_head(text_encoder.config)
self.mlm_loss_fcn = nn.CrossEntropyLoss() # 텍스트 예측용
self.image_encoder.embeddings.mask_token = nn.Parameter(
torch.zeros(1, 1, image_encoder.config.hidden_size)
)
self.mim_head = mim_head(image_encoder.config) # 이미지 복원용
self.mtm_loss_fcn = MaskedMSELoss(reduction='none') # 시계열 회귀용
1. 단일 모달 마스킹 학습
이 단계는 각 모달리티 전용 인코더가 자기 모달리티의 특성을 잘 학습하도록 하기 위한 pretraining 과정이다.
병렬(multimodal) 데이터가 없어도, 단일 모달의 대규모 비레이블 데이터만으로 학습이 가능하다.
- 텍스트: BERT에서 사용하는 마스크드 언어 모델링(MLM) 기법을 적용 → 일부 단어를 [MASK]로 가리고, 원래 단어를 예측
# BERT와 유사한 방식으로 [MASK]된 단어를 예측.
# 마스킹된/비마스킹된 임베딩을 각각 프로젝션하여 masked_embeds, embeds에 # MLM 마스크 생성
input_ids = batch["input_ids"].clone()
mlm_labels = input_ids.clone()
...
input_ids[i, selection[i]] = 103 # [MASK] 토큰
# 마스킹 입력 → BERT encoder
mlm_outputs = self.text_encoder(input_ids=..., attention_mask=...)
mlm_prediction_scores = self.mlm_head(mlm_outputs[0])
# 손실 계산
loss_mlm = self.mlm_loss_fcn(mlm_prediction_scores.view(-1, vocab_size), mlm_labels.view(-1))
- 이미지: Vision Transformer(ViT) 기반 인코더 + 패치 마스킹 → 가려진 이미지 조각을 복원 (SimMIM 방식 유사)
# SimMIM 방식 유사하게 ViT 인코더 + 복원 네트워크로 학습.
# 마스킹된/비마스킹된 출력에 대해 임베딩 후 저장.
# 마스킹된 입력 → ViT encoder
mim_output = self.image_encoder(pixel_values, bool_masked_pos)
# 복원 이미지 생성
reconstructed = self.mim_head(mim_output[0])
# 복원 손실 (L1)
loss_mim = (reconstruction_loss * mask).sum() / mask.sum()
- 표 형태(tabular) 데이터: TabNet 기반 인코더 사용, 마스킹된 feature 복원을 위해 decoder를 활용 ( fine-tuning 단계에서는 제거)
# TabNet 기반 인코더에서 마스킹된 feature 값을 복원하도록 학습
# TabNet 기반 인코더 출력
tabular_output = self.tabular_encoder(batch["features"])
# 손실 계산 (내부적으로 masked column 복원 loss 포함)
loss_mfm = tabular_output.masked_loss
- 시계열 데이터: Transformer 기반 인코더에 시계열 시점 일부를 0으로 마스킹 → 마스킹된 값을 회귀 예측
# 시계열 마스크 적용 후 transformer 인코더 입력
predicted_values = self.timeseries_encoder(masked_timeseries)
# 마스킹된 시점의 값을 회귀로 예측
loss_mtm = self.mtm_loss_fcn(predicted_values, ground_truth)
→ 이러한 방식은 각 모달리티 인코더가 구조적 특성과 분포를 깊이 이해하도록 유도한다.
2. 멀티모달 마스킹 학습 (유사도 기반)
단일 모달 마스킹만으로는 서로 다른 모달리티 간의 교차 관계를 충분히 학습하기 어렵다.
이를 보완하기 위해 LANISTR는 유사도 기반의 멀티모달 마스킹 손실(SimMMM)을 도입하였다.
# 각 모달리티에서 비마스킹 임베딩 추출
# 텍스트 (비마스크)
text_outputs = self.text_encoder(input_ids=batch['input_ids'], attention_mask=batch['attention_mask'])
text_embeddings = self.text_proj(text_outputs.last_hidden_state[:, self.target_token_idx, :])
text_embeddings = F.normalize(text_embeddings, dim=1)
# 이미지 (비마스크)
image_features = self.image_encoder(pixel_values=batch['pixel_values'], bool_masked_pos=None)
image_embeddings = self.image_proj(image_features.last_hidden_state)
image_embeddings = F.normalize(image_embeddings, dim=1)
# 테이블 (비마스크)
tabular_output = self.tabular_encoder(batch['features'])
unmasked_tabular_embeddings = self.tabular_proj(tabular_output.unmasked_last_hidden_state)
unmasked_tabular_embeddings = F.normalize(unmasked_tabular_embeddings, dim=1)
# 시계열 (비마스크)
# 예시: timeseries_encoder의 출력으로 embedding 직접 추출
timeseries_output = self.timeseries_encoder(batch['timeseries'])
timeseries_embeddings = self.time_proj(timeseries_output['unmasked_last_hidden_state'])
timeseries_embeddings = F.normalize(timeseries_embeddings, dim=
# 마스킹된 입력에서 임베딩 추출
# 텍스트 (마스크)
masked_text_outputs = self.text_encoder(input_ids=masked_input_ids, attention_mask=batch['attention_mask'])
masked_text_embeddings = self.text_proj(masked_text_outputs.last_hidden_state[:, self.target_token_idx, :])
masked_text_embeddings = F.normalize(masked_text_embeddings, dim=1)
# 이미지 (마스크)
mim_output = self.image_encoder(pixel_values=batch['pixel_values'], bool_masked_pos=batch['bool_masked_pos'])
masked_image_embeddings = self.image_proj(mim_output.last_hidden_state)
masked_image_embeddings = F.normalize(masked_image_embeddings, dim=1)
# 테이블 (마스크)
masked_tabular_embeddings = self.tabular_proj(tabular_output.masked_last_hidden_state)
masked_tabular_embeddings = F.normalize(masked_tabular_embeddings, dim=1)
# 시계열 (마스크)
masked_timeseries_output = self.timeseries_encoder(batch['masked_timeseries'])
masked_timeseries_embeddings = self.time_proj(masked_timeseries_output['masked_last_hidden_state'])
masked_timeseries_embeddings = F.normalize(masked_timeseries_embeddings, dim=1)
# concat & mm_fusion 적용
# embeds: 원본 임베딩
# masked_embeds: 마스킹된 각 모달리티 임베딩
# 비마스크 멀티모달 표현
embeds = [
text_embeddings.unsqueeze(1),
image_embeddings.unsqueeze(1),
unmasked_tabular_embeddings.unsqueeze(1),
timeseries_embeddings.unsqueeze(1),
]
concat_embedding = torch.cat(embeds, dim=1) # shape: [B, num_modalities, D]
mm_out = self.mm_fusion(concat_embedding) # 멀티모달 통합 표현
# 마스크된 멀티모달 표현
masked_embeds = [
masked_text_embeddings.unsqueeze(1),
masked_image_embeddings.unsqueeze(1),
masked_tabular_embeddings.unsqueeze(1),
masked_timeseries_embeddings.unsqueeze(1),
]
concat_masked_embedding = torch.cat(masked_embeds, dim=1) # shape: [B, num_modalities, D]
mm_out_masked = self.mm_fusion(concat_masked_embedding)
# Siamese 구조로 유사도 학습
z1, z2 = self.mm_proj(mm_out), self.mm_proj(mm_out_masked) # 멀티모달 통합 표현을 공통 임베딩 공간으로
p1, p2 = self.mm_predictor(z1), self.mm_predictor(z2) # Siamese 유사도 비교에 적절한 형태로
loss_mmm = self.mmm_loss(p1, z2) / 2 + self.mmm_loss(p2, z1) / 2
# self.mmm_loss = NegativeCosineSimilarityLoss임.
# 즉, loss를 최소화하는 방향으로 학습하기 위해서 NegativeCosineSimilarityLoss를 사용함
loss += loss_mmm
학습 과정은 다음과 같다.
- 하나의 입력 샘플 $X = (\text{텍스트},\ \text{이미지},\ \text{구조화 데이터})$ 에서 각 모달리티 일부를 무작위로 마스킹한 변형 $\hat{X}$ 를 생성
- 원본 $X$와 마스킹된 $\hat{X}$ 를 LANISTR 전체 모델 $f$에 각각 통과시켜 두 개의 멀티모달 표현 $z_1 = f(X), \quad z_2 = f(\hat{X})$ 을 얻음
- 각 표현에 프로젝터 레이어 $p$를 적용하여 임베딩 $e_1 = p(z_1), \quad e_2 = p(z_2)$ 을 생성
- 이 두 임베딩 간의 코사인 유사도가 최대화되도록 학습
- 손실 함수: 음의 코사인 유사도 (symmetric 형태로 $e_1 \leftrightarrow z_2, \quad e_2 \leftrightarrow z_1$ 양방향 모두 적용)
- 최종 손실: $\mathcal{L}_{\text{SimMMM}}$
→ 이 학습 방식은 Siamese 네트워크의 유사도 학습 방식을 멀티모달 환경으로 확장한 형태다.
*Siamese 네트워크 : 두 입력 간의 “관계(유사성)“를 학습하기 위해 동일한 신경망을 병렬로 사용하는 모델 구조.
이를 통해, 단순 복원 기반 목적보다 → 모달리티 간 공통 표현 학습에 더 효과적 → missing modality(모달 결측) 상황에서도 표현의 일관성을 유지
다양한 모달리티 간 관계를 통합된 표현 공간에 효과적으로 매핑할 수 있어, 실제 입력이 불완전한 상황에서도 강건한 성능을 보여줄 수 있음
실험 및 평가
LANISTR의 성능을 입증하기 위해, 논문에서는 두 가지 서로 다른 도메인에서의 실험을 수행하였다.
- 의료 도메인: MIMIC-IV
- 전자상거래 도메인: Amazon Product Review
각 도메인에서 구조화 데이터와 비구조화 데이터를 모두 포함하는 멀티모달 예측 과제를 설정하고,
LANISTR를 자기지도 사전학습(pretraining) 한 뒤, 소량의 레이블 데이터로 파인튜닝(fine-tuning)하여 모델의 성능을 평가하는 방식으로 실험을 진행했다.
1. 의료 도메인: MIMIC-IV
MIMIC-IV는 중환자실(ICU) 환자들의 다양한 의료 정보를 담은 공개 데이터베이스로,
이번 실험에서는 입원 중 사망 예측이라는 이진 분류 과제가 설정되었다.
- 입력 모달리티: 임상 시계열 데이터 (48시간 동안의 바이탈 및 검사 수치), 임상 노트 (의료진이 작성한 텍스트 기록), 흉부 X-ray 이미지 (입원 후 48시간 내 촬영본)
LANISTR는 이 세 모달리티에 대해 사전학습을 거친 후, 전체의 단 0.1%에 해당하는 소량의 병렬 라벨 데이터(약 5천 개)로 파인튜닝되었다.
기존 모델 대비 AUROC 성능이 약 6.6%p 향상되었으며, 데이터의 35.7%에서 한 가지 이상 모달리티가 누락된 상태였음에도, LANISTR는 결측 상황에 강건한 예측 성능을 보여주었다.
→ missing modality 문제를 효과적으로 다룰 수 있는 구조임을 실험적으로 입증
2. 전자상거래 도메인: Amazon Product Review
이 실험에서는 1996년부터 2018년까지의 Amazon 리뷰 데이터를 활용하여, 제품 평점 예측(regression or classification) 과제를 수행하였다.
- 입력 모달리티: 제품 이미지, 리뷰 텍스트, 구조화된 제품 메타데이터 (예: 제품/사용자 ID, 리뷰 인증 여부, 연도, 평점 수, 타임스탬프 등)
LANISTR는 먼저 Office Products 카테고리의 558만 건의 리뷰 데이터를 이용해 멀티모달 사전학습을 수행하였다. 이후, Fashion 및 Beauty와 같은 완전히 다른 카테고리에서, 카테고리당 단 512개(0.01%)의 극소량 레이블 데이터로 파인튜닝하여 일반화 성능을 평가하였다.
Accuracy 기준으로 기존 모델 대비 약 14%p 성능 향상되었으며, 도메인이 다른 타 카테고리에서도 높은 예측 정확도 유지하였다.
전체 리뷰 중 99.8%가 일부 모달리티가 누락된 비병렬 데이터였음에도, LANISTR는 우수한 예측 성능과 범용성을 입증하였다.
LANISTR는 서로 다른 도메인(의료 vs 전자상거래), 다양한 모달리티 구성, 훈련-테스트 간 도메인 차이(domain shift), 높은 비율의 모달리티 결측 상황이라는 현실적인 어려움을 모두 포함한 실험 환경에서 강력한 예측 성능을 보여주었으며, 특히 소량의 레이블 데이터만으로도 효과적으로 학습이 가능함을 입증했다.
LANISTR의 한계점 및 향후 연구 방향
LANISTR는 구조화된 데이터와 비구조화된 데이터를 통합적으로 학습하는 새로운 가능성을 제시한 모델이다. 그러나 논문에서는 다음과 같은 한계점과 발전 방향도 함께 제안하고 있다.
1. 데이터 및 모달리티 확장의 필요
LANISTR는 의료(MIMIC-IV)와 전자상거래(Amazon 리뷰) 두 도메인에서 성능을 검증하였지만, 실제 응용 가능성을 넓히기 위해서는 교육, 금융, 제조 등 더 다양한 도메인에서의 평가가 필요하다.
또한, 현재 모델은 이미지-텍스트-표 또는 시계열 조합까지만 다루었기 때문에, 오디오, 비디오 등 새로운 형태의 모달리티를 포함하도록 확장하는 것도 중요한 과제다.
2. 모델 구조의 복잡성 및 연산 비용
LANISTR는 멀티 인코더 구조와 대규모 파라미터(약 270M/2억7천만개)를 기반으로 하며, 학습과 추론에 상당한 연산 자원을 요구한다. 이는 실제 산업 현장에서의 적용을 어렵게 만드는 요소다.
3. 일반화 성능 및 모달리티 활용 최적화
LANISTR는 소량의 라벨로도 높은 예측 성능을 보였지만, 도메인이 바뀌거나 새로운 모달리티가 추가되었을 때의 일관된 일반화 성능 확보는 여전히 도전 과제다.
이를 위해 도메인 불변 멀티모달 학습(multimodal domain-invariant learning), 추가 모달리티 적응(modality adaptation), 과제별 중요 모달리티 자동 선택 기능 등이 필요하다.
(추가) 기존 멀티모달 모델들의 한계와 LANISTR의 해결 전략
LANISTR가 주목받는 이유는 기존 멀티모달 모델들이 구조화된 데이터와 비구조화된 데이터를 통합하는 과정에서 겪는 한계를 명확하게 인식하고, 이를 극복할 수 있는 구체적인 방법을 제시했기 때문이다.
기존 멀티모달 모델들의 한계
1. Representation Gap (모달리티 간 표현 차이)
- 비구조화 데이터(텍스트, 이미지 등)는 CNN, Transformer 등으로 학습
- 구조화 데이터(표, 시계열 등)는 XGBoost, MLP 등으로 처리됨
→ 서로 다른 방식으로 인코딩된 표현을 하나의 임베딩 공간에서 융합하는 데 어려움
2. 구조화 데이터 연구 부족
- 기존 멀티모달 연구는 텍스트-이미지 중심
- 표/시계열 데이터를 포함한 모델 설계는 상대적으로 소홀
3. 정보 손실
- 멀티모달 융합 시 단순한 concatenation 방식이 많았으며, 구조화 데이터는 정보량이 적어 융합 과정에서 상대적으로 무시되거나 손실될 위험이 큼
4. 결측 모달리티 문제
- 실제 데이터셋에서는 모든 모달리티가 존재하지 않는 경우가 많음
→ 기존 모델은 결측된 모달리티를 무시하거나 처리하지 못해 성능 저하
5. 차원 불균형 및 학습 편향
- 구조화 데이터는 저차원, 비구조화 데이터는 고차원
→ 학습 시 비구조화 모달리티에 과적합(overfitting) 발생, 구조화 정보는 활용되지 않음
LANISTR의 문제 해결 전략
LANISTR는 구조화 데이터의 정보 손실 문제를 해결하기 위해 세 가지 전략을 제안한다.
1. 문제 상황
전자상거래 예시(Amazon 제품 리뷰)를 통해 보면 다음과 같다.
- 비구조화 데이터
- 제품 이미지: CNN 또는 ViT로 처리 → 768차원 임베딩
- 리뷰 텍스트: BERT로 처리 → 768차원 임베딩
- 구조화 데이터
- 제품 가격, 판매량, 리뷰 개수 등 (표 데이터): MLP/TabNet → 약 10~50차원
- 판매 추이 등 (시계열): LSTM/Transformer → 약 256차원
일반적으로 기존 모델의 방식은 이들 벡터를 단순히 이어붙이기(concatenation) 하여 하나의 통합 벡터로 사용한다.
하지만 이 방식에는 다음과 같은 두 가지 문제가 발생한다.
1. 차원 차이로 인한 정보 왜곡
구조화 데이터는 텍스트/이미지에 비해 차원이 작아 상대적으로 중요도가 낮게 반영되며, 모델이 이를 무시할 수 있음
2.주의 집중의 편향
모델이 실제 중요한 수치 정보보다 “디자인이 예뻐요” 같은 문구에 더 많은 주의를 기울일 가능성이 있음
2. LANISTR의 해결책
(1) 모달리티별 전용 인코더 적용
각 데이터 타입에 맞는 최적화된 인코더를 사용했다. 즉. 각 모달리티의 특성을 손실 없이 인코딩할 수 있도록 설계했다.
- 이미지 → ViT
- 텍스트 → BERT
- 표 형태 → TabNet
- 시계열 → Transformer
(2) 멀티모달 마스킹 기반 학습
일부 모달리티를 의도적으로 누락시켜 학습을 진행했다.
(예: 이미지 없이 가격과 텍스트만으로도 예측하게 학습)
이렇게 하면, 모델이 구조화 데이터에 대한 의존도를 높이게 되어 균형 잡힌 학습이 가능해진다.
(3) 유사도 기반 멀티모달 손실 함수 적용
원본 입력과 마스킹된 입력 간의 임베딩 유사도를 최대화하도록 학습.
(예: X-ray 없이도 텍스트와 표만으로 사망 가능성을 예측)
이 과정은 정보 보완과 누락된 모달리티 복원 능력을 동시에 강화시킨다.
구분 | 기존 멀티모달 모델 | LANISTR |
인코딩 방식 | 모든 모달을 하나의 MLP나 Concat으로 처리 | 모달리티별 전용 인코더 적용 |
모달 결측 대응 | 어려움 많음, 보통 학습 불가 | 마스킹 기반 자기지도 학습으로 견고함 |
정보 손실 위험 | 구조화 데이터의 영향력 감소 | 유사도 기반 손실 함수로 보완 |
범용성 | 도메인/모달리티 변화에 약함 | 소량 데이터로도 높은 일반화 성능 |
'🤖 ai logbook' 카테고리의 다른 글
[article] Multimodal Deep Learning for Time Series Forecasting Classification and Analysis (0) | 2025.05.07 |
---|---|
[paper, ICML 2020] REALM(Retrieval-Augmented Language Model Pre-Training) (1) | 2025.04.30 |
[paper] MedFuse: 임상 시계열 데이터와 흉부 X-ray 영상을 활용한 다중모달 모델 (0) | 2025.04.27 |
[paper, NeurIPS 2023] PreDiff: 시공간 Diffusion Model 기반 기상·기후 예측모델 (1) | 2025.04.24 |
[paper, NeurIPS 2022] Earthformer : 시공간 Transformer 기반 기상·기후 예측 모델 (0) | 2025.04.16 |
[paper, NeurIPS 2023] CrossViViT : 시공간 정보를 활용한 태양복사량 시계열 예측 모델 (0) | 2025.04.12 |
Simpson’s Paradox - 통계의 거짓말 (0) | 2025.02.19 |
[paper] DeepSeek-R1 정리 및 Ollama를 이용해서 DeepSeek-R1 모델 간단하게 사용해보기 (0) | 2025.02.10 |