RT-T4: LTR 피드백 학습

🎯 Learning-to-Rank (LTR) 개요분류 손실 + 순위 손실 결합

배차 담당자가 AI 추천을 수정할 때마다 "사람이 선택한 ShipTo i > 선택 안 한 j" 쌍(pair)을 생성하여 LightGBM Ranker(LambdaRank)로 학습한다. 기존의 단순 분류 손실 위에 순위 손실(pairwise loss)을 결합하면 후보 간 상대적 선호도를 직접 학습할 수 있어 Recall@K가 유의미하게 향상된다.

이는 단순히 score_hat 점수만 맞추는 것보다 "담당자가 i를 j보다 선호했다"라는 상대 비교 신호가 배차 문제의 본질에 더 가깝기 때문이다.

🔗 Pair 생성 파이프라인
STEP 1
담당자 수정

배차 담당자가 AI 추천 상위 K개 중 다른 ShipTo를 최종 선택하여 수정한다.

STEP 2
chosen / rejected 식별

담당자 선택 = chosen, 나머지 후보 = rejected로 라벨링한다.

STEP 3
pair 데이터 생성

chosen > rejected 쌍을 생성하여 (x_i, x_j, label=1) 형태로 누적한다.

STEP 4
LightGBM Ranker 학습

LambdaRank objective로 route_group 단위 순위 학습을 수행한다.

🐍 학습 파이프라인 (Python pseudocode)
# 페어 데이터 생성
for chosen, rejected in dispatcher_corrections:
    pairs.append( (chosen_features, rejected_features, label=1) )

model = lgb.LGBMRanker(
    objective="lambdarank",
    label_gain=[0, 1, 2],
    n_estimators=500, learning_rate=0.03
)
model.fit(X_train, y_rank, group=route_groups,
          eval_set=[(X_val, y_val)], eval_group=[val_groups])
📐 Preference Calibrator (보정 레이어)담당자별 선호 패턴 빠른 적응
scorefinal = sigmoid(w₀·score_base + w₁·gap + w₂·famil + b)
# dispatcher_id 임베딩 추가 시 개인화 가능
w₀ LTR에서 출력한 score_base의 가중치 — 기본 점수 반영 강도
w₁ 1위-2위 점수 차 gap — 확신이 클수록 보정 강화
w₂ 담당자-ShipTo 친숙도 famil — 과거 배차 이력 반영
b bias — 담당자별 기본 편향치

기존 score_base 위에 경량 Sigmoid 선형 보정기를 추가하여, 전체 모델을 재학습하지 않고도 담당자별 선호 패턴을 빠르게 적응시킬 수 있다. 추후 dispatcher_id 임베딩을 더하면 개인화까지 확장 가능하다.

참고문헌
[1] closeloop.com, "AI in Transportation and Logistics: 2025 Trends" (2025.11)
[2] Supply Chain Dive, "Logistics management is leveling up with generative AI" (2025.08)