DATA SHAPLEY IN ONE TRAINING RUN
Summary
Data Shapley는 각 데이터가 모델 성능에 기여하는 정도를 정량화할 수 있는 지표지만, (1) 성능 평가를 위해 반복적인 재학습이 필요하고, (2) 지표의 초점이 모델의 최종 성능에 맞추어져 있어 훈련 과정과는 괴리가 있다는 한계가 있다.
본 논문은 이를 보완하기 위해 In-Run Data Shapley를 제안한다. 이 방법은 모델 재학습 없이 훈련 과정에서 데이터의 기여도를 추적할 수 있도록 설계되었으며, 계산 효율성을 높이기 위한 기법도 함께 제시한다. 또한 실험적으로, 제안된 방법이 노이즈 데이터를 조기에 식별·억제하여 모델 성능 저하를 방지함을 보여준다.
Preliminary
Data Shapley
훈련 데이터셋 $D$가 $N$개의 데이터 포인트로 구성되어 있고, $U(\cdot)$을 효용 함수라 하면, 데이터 포인트 $z \in D$의 샤플리 값은 다음과 같이 정의된다:

즉 샤플리 값은 한 데이터 포인트를 추가했을 때의 효용 변화를 여러 부분집합 $S$에 대하여 측정한 후, 이를 가중평균한 값이다. 추가적으로, 샤플리 값은 선형성이 성립된다.

Ghost Dot-Product
Mini-batch input $a = (a^{(1)}, ..., a^{(B)})^T$에 대해서 weight matrix $W$를 거치면 $s = aW$, $s = (s^{(1)}, ..., s^{(B)})^T$가 나온다. Backpropagation을 거치는 과정에서 $\frac{\partial l^{(i)}}{\partial W}$는 다음과 같이 표시될 수 있다:

이를 이용하여 $\frac{\partial \ell^{(1)}}{\partial W}$과 $\frac{\partial \ell^{(2)}}{\partial W}$의 내적을 구하고자 하면 다음과 같이 계산하면 되는데,

Input 값 $a$는 이미 주어져 있고, 한 번의 역전파로 $\frac{\partial \ell^{(i)}}{\partial s^{(i)}}, \text{for all } i$를 계산할 수 있기 때문에 역전파를 두 번 하지 않고도 두 gradient를 계산할 수 있다.
Gradient-Hessian-Gradient Product를 구하는 것 역시 역전파를 두 번 하는 것으로 구할 수 있다. Hessian-vector-Product(HvP)방법을 쓰면 된다고 하며, https://arxiv.org/pdf/2406.11011 직접 논문을 읽는 것을 추천드린다.. ㅠㅠ
Method
Data Shapley 지수가 특정 데이터가 모델 성능에 얼마나 기여하는지를 나타내주지만, 훈련 과정에서의 데이터의 기여도를 판단할 수 없으며 로직 자체가 반복적인 재학습을 통한 성능 확인이라 애초에 LLM의 훈련에서 데이터의 기여도를 판단하는 것에 Shapley 지수는 이에 어울리지 않는다.
따라서 본 연구는 대안으로 재훈련이 불가한 대규모 모델 환경에서 데이터 기여도를 산정하기 위해, 단일 학습 run의 각 업데이트 단계에 대한 지역 효용을 정의하고 이를 누적하는 In-Run Data Shapley를 제안한다. 제안 방법은 (i) 1차/2차 테일러 근사에 기반한 폐형식 점수, (ii) per-example gradient를 명시적으로 구성하지 않는 ghost dot-product/ghost GHG를 통해 고효율 구현을 제공한다. 그 결과, 1차 변형은 표준 학습과 동등한 런타임, 2차 변형도 반복당 1회의 추가 역전파만으로 실용적 속도를 달성한다.
In-Run Data Shapley
학습 데이터셋 $D_{tr} = \{z_i \}_1^N$, 검증 데이터셋 $D_{val} = \{z_m^{(val)} \}, 패러미터 $w_t$라 하자. $t$번째 반복에서의 weight update는 다음과 같은 형태가 된다:

효용 함수는 다음과 같다:

다만 샤플리 계산은 모든 데이터가 각기 다른 시점에서 잠재적으로 기여했을 수도 있다는 효율성 공리를 가지고 있기 때문에, 전역 효용 $U(S) = \Sigma_{t=0}^{T-1} U^{(t)}(S)$로 계산되며, 선형성으로 인해 아래와 같은 수식이 성립한다.

위의 식은 곧 전체 run에서의 검증 손실 감소량과 일치한다.
그러나 이 식을 완전하게 구하기에는 비용이 너무 많이 들기 때문에, taylor expansion을 통해서 효용을 계산해야 한다.
Using Taylor Expansion for In-Run Data Shapley

First-order, second-order 근사는 오차가 각각 $O(\eta_t^2)$, $O(\eta_t^3)$ 으로 무시할 수 있는 수준으로 작으며 또란 본 논문에서는 first-order approximation으로도 이미 기존 값과의 상관관계를 >0.94로 달성하며 근사의 정당성을 경험적으로 보였다.
1차 테일러 근사로 지역 효용을 선형화하면

이다. train-gradient와 val-gradient의 정렬도가 양수(같은 방향)이면 데이터가 학습에 긍정적 방향으로 기여했다고 보며, 반대면 부정적 방향으로 기여하였다고 해석할 수 있다.

여기서 $g$는 gradient이다. 두 번째 항을 추가함으로써 배치 내 상호작용과 검증 손실 곡률을 반영하여 데이터 샘플이 얼마나 학습에 기여하는지까지 더욱 미세하게 분해할 수 있다.
여기서 계산 과정에 있어서 앞서 설명한 ghost trick을 사용하는데, pseudo code는 다음과 같다:
[First Order In-Run Data Shapley]
INPUT:
train_loader # 학습 배치 이터레이터
val_sampler # 검증 포인트(또는 소배치) 제공자
T # 반복 횟수
η_t # step별 learning rate 스케줄
model, optimizer
OUTPUT:
phi # dict: 데이터 z → 누적 기여도 φ_z
# 핵심 primitive (ghost trick)
# returns vector v where v[i] = <grad_val, grad_train_i> for all z_i ∈ B_t
function GHOST_DOT_PRODUCTS(model, B_t, V_t):
# 한 번의 forward/backward로, per-sample grad 내적을 직접 만들지 않고 계산
# 내부적으로는 (각 layer의 activation 내적) × (출력쪽 미분 내적)을 layer별 합으로 조립
return dot_products # shape = [|B_t|]
initialize phi[z] = 0 for all z in training data
for t in 0..T-1:
B_t = next(train_loader) # 학습 배치 (indices + tensors)
V_t = sample_from(val_sampler) # 검증 포인트(1개 또는 소배치)
# === ① 1차 기여 계산 (ghost dot-product, 1 backprop) ===
dp = GHOST_DOT_PRODUCTS(model, B_t, V_t) # dp[i] = <grad_val, grad_z_i>
# φ^{(t)}_z = -η_t * dp
for i, z_i in enumerate(B_t):
phi[z_i] += - η_t[t] * dp[i]
# === ② 실제 학습 업데이트(원래 스텝) ===
# 표준 학습용 손실로 optimizer step
loss_train = mean(ℓ(model(w_t), B_t))
optimizer.zero_grad()
loss_train.backward() # 표준 backprop
optimizer.step()
return phi
[Second Order In-Run Data Shapley]
INPUT/OUTPUT: same as Algorithm 1
# 추가 primitive (ghost Hessian-vector product)
# returns h[i] = g_z_i^T * H_val(w_t) * G_sum
# 내부적으로 Pearlmutter trick으로 HVP 계산을 1회 추가 backprop으로 처리
function GHOST_GHG(model, B_t, V_t, G_sum):
# G_sum ≈ sum_j grad_train_j (배치 gradient; 별도 backprop 없이 얻거나 재사용)
# 내부: (val-loss의 HVP) ∘ ghost 조립 → per-sample 스칼라 벡터로 반환
return ghg # shape = [|B_t|]
initialize phi[z] = 0 for all z in training data
for t in 0..T-1:
B_t = next(train_loader)
V_t = sample_from(val_sampler)
# === ① 1차항 (ghost dot-product, backprop #1) ===
dp = GHOST_DOT_PRODUCTS(model, B_t, V_t) # <g_val, g_z_i>
# 배치 gradient 합 G_sum 구하기 (옵션 A: 같은 backprop에서 추출 / 옵션 B: 가벼운 추가 계산)
G_sum = BATCH_GRAD_SUM(model, B_t) # 배치 전체의 grad 합(표준 프레임워크에서 쉽게 얻음)
# === ② 2차항 (ghost GHG, backprop #2: HVP) ===
ghg = GHOST_GHG(model, B_t, V_t, G_sum) # ghg[i] = g_z_i^T H_val G_sum
# === ③ 스코어 집계 ===
for i, z_i in enumerate(B_t):
phi[z_i] += - η_t[t] * dp[i] + 0.5 * (η_t[t]^2) * ghg[i]
# === ④ 실제 학습 업데이트 ===
loss_train = mean(ℓ(model(w_t), B_t))
optimizer.zero_grad()
loss_train.backward()
optimizer.step()
return phi
Experiments
Experiments를 통해서 알아봐야 하는 것은, 1. First, Second order data shapley를 계산하는 과정에서 ghost dot product을 사용하는 것이 얼마나 유리한지, 2. 데이터셋을 기여도에 따라 정제하여 훈련하는 것이 기존 훈련보다 더 좋은지이다.

Ghost dot product을 사용하는 것이 direct하게 구하는 것보다 상당히 빠르며, 특히 first-order만 계산했을 때 기존의 훈련 방법과 큰 차이가 없는 것을 확인할 수 있다. 또한, 아래의 그림에서는 실제로도 기존 훈련에 비해서 25% 적은 iteration으로도 동일한 loss에 도달할 수 있음을 보인다.

특징적인 것은 second order data shapley를 계산하더라도 차이가 거의 없는 것을 확인할 수 있다. 만약 Second-order을 계산해야 하는 것이 중요하다면 첫 번째 표에서 보이는 비용 증가와의 tradeoff를 고려해야 할텐데, 큰 차이가 없는 것은 first order만으로도 충분하다는 것을 알 수 있다.

실제 데이터가 모델 훈련에 얼마나 기여했는지를 확인할 수 있다. 물론 이것만으로 모든 것을 확인할 수 없지만, low-quality 데이터를 구분할 수 있는 단서를 제공한다.
Conclusion
훈련 과정 속에서 데이터의 기여도를 추적할 수 있으며, 특히 이것이 LLM의 모델 학습 추적 및 학습 최적화에 적합하다는 것이 이 논문의 장점이라고 생각한다. 이렇게 black-box 모델인 LLM을 하나씩 파헤쳐가는 것이 매우 흥미로운 것 같다!
'논문 리뷰 > NLP' 카테고리의 다른 글
| APL 논문 리뷰 (1) | 2025.08.18 |
|---|---|
| Safety Alignment Should Be Made More Than Just a Few Tokens Deep 논문 리뷰 (0) | 2025.08.18 |
| Lifelong Knowledge Editing requires Better Regularization 논문 리뷰 (6) | 2025.08.12 |
| DPO 논문 리뷰 (3) | 2025.08.12 |
| AlphaEdit 논문 리뷰 (3) | 2025.08.09 |