배터리 Foundation Model
배터리 데이터는 여러 연구실과 기업에 흩어져 있다. 데이터셋마다 셀 화학, 형태, 충방전 프로토콜, 측정 장비, 기록 형식이 다르고, 한 데이터셋은 셀 수십에서 수백 개 규모가 흔하다. 하나의 데이터셋으로 학습한 수명 예측 모델은 다른 데이터셋에서 잘 맞지 않는다. 그래서 여러 데이터셋을 모아 사전학습하고, 새 화학이나 새 프로토콜에 적은 레이블로 적응하는 배터리 foundation model이라는 생각이 자연스럽게 나온다.
이 장은 그런 모델을 만드는 방법보다 그런 모델에 대한 주장을 검증하는 방법에 무게를 둔다. foundation model의 일반론(정의, 전이 방법, 부정적 전이, 평가)은 19.9장에서 다뤘다. 배터리에서 특히 문제가 되는 것은 세 가지다. 이질적인 데이터를 하나로 묶는 일, 한 셀의 수많은 사이클이 학습과 평가에 나뉘어 들어가는 누수, 그리고 "사전학습이 도움이 되었다"는 주장을 통제된 비교로 보이는 일이다. 이 장의 계산은 가상의 데이터로 이 함정들을 재현하고, 특정 모델이나 데이터셋의 성능을 다루지 않는다.
학습 목표
- 여러 배터리 데이터셋을 통합하고 셀·데이터셋 단위로 분할하는 사전학습 데이터 설계를 세운다
- 전이 효과와 실패 조건을 처음부터 학습한 baseline과의 통제된 비교로 평가한다
- 배터리 foundation model에 대한 주장을 검증 체크리스트로 판단한다
데이터 통합
왜 어려운가. 30.3장에서 본 것처럼 공개 배터리 데이터셋은 같은 양을 다르게 기록한다. 사전학습은 이 차이를 모두 하나의 입력 표현으로 바꾸는 일에서 시작한다. 통합에서 놓친 차이는 모델이 배울 "신호"가 되어 버린다.
스키마. 셀 단위 메타데이터(화학, 형태, 정격 용량, 제조사, 시험 온도, 데이터셋 출처)와 사이클 단위 기록(사이클 번호, 충방전 용량, 평균 온도), 시점 단위 시계열(시간, 전류, 전압, 온도)을 분리한 표준 스키마를 정한다. 원래 데이터셋의 열 이름과 변환 규칙을 함께 기록해, 통합 후의 값이 원본 어디서 왔는지 추적할 수 있게 한다(15.1장).
단위와 부호. 가장 흔한 사고는 단위와 부호다.
- 용량이 Ah인 데이터셋과 mAh인 데이터셋, 시간이 초인 것과 시간(h)인 것이 섞인다. 값의 범위를 데이터셋별로 그려 보면 대부분 잡힌다.
- 전류의 부호 규약이 다르다. 충전을 양수로 쓰는 데이터셋과 방전을 양수로 쓰는 데이터셋을 그대로 합치면, 모델은 "충전"과 "방전"을 데이터셋 출처로 구분하는 법을 배운다. 전류 적분이 용량 변화와 같은 부호인지로 확인한다.
- 용량을 정격 용량으로 나눈 SOH, 전류를 정격 용량으로 나눈 C-rate로 정규화하면 형태가 다른 셀을 비교할 수 있다. 그러나 정격 용량 자체가 데이터셋마다 다르게 정의(공칭값, 첫 사이클 측정값)되어 있을 수 있다.
프로토콜. 같은 "1C 방전"이라도 휴지 시간, 차단 전압, 주기적인 기준 성능 시험(reference performance test)의 유무가 다르다. 프로토콜을 범주형 변수 하나로 두기보다, C-rate·전압 창·온도·휴지 시간처럼 물리적인 의미가 있는 값의 벡터로 기록해 두어야 처음 보는 프로토콜에 일반화할 여지가 생긴다.
불규칙 시계열과 결측 modality. 기록 간격이 1초인 데이터셋과 1분인 데이터셋이 섞이고, 같은 데이터셋 안에서도 전류가 바뀔 때만 기록하는 경우가 있다. 시간 축 대신 용량이나 전압 축 위의 고정 격자로 다시 표본화하는 방법(예: 사이클마다 방전 용량–전압 곡선 를 같은 전압 격자에서 읽는다)이 흔히 쓰인다. 온도나 임피던스(EIS)처럼 일부 데이터셋에만 있는 modality는 0으로 채우지 말고 결측 마스크와 함께 입력한다. 0으로 채우면 "온도 0 °C"와 "온도 미측정"이 같은 입력이 된다.
정규화 통계. 특징의 평균·표준편차 같은 정규화 통계는 사전학습 데이터에서만 계산한다. 평가 데이터셋까지 포함해 계산하면 평가 분포의 정보가 사전학습에 들어간다(15.4장).
사전학습 과제
레이블(수명, SOH)이 있는 셀은 적고 레이블 없는 사이클 기록은 많으므로, 사전학습은 대개 자기지도학습(19.8장)이다. 배터리 시계열에 쓰는 pretext 과제는 세 계열로 나뉜다.
- masking. 전압·전류 시계열이나 사이클별 곡선의 일부 구간을 가리고 복원한다. 가린 구간이 짧으면 이웃 값의 보간으로 풀리므로, 충전의 한 단계 전체처럼 의미 있는 덩어리를 가린다.
- contrastive. 같은 셀의 서로 다른 사이클이나 같은 사이클의 다른 구간을 positive로 둔다. 여기에 배터리 특유의 함정이 있다. 같은 셀이라는 것을 알아보는 가장 쉬운 단서는 셀 고유의 지문(초기 용량의 미세한 차이, 측정 채널의 오프셋)이다. 이런 shortcut을 배운 표현은 pretext 손실이 낮아도 하위 과제에 쓸모가 없다(19.8장). 그리고 이 지문이 바로 다음 절의 누수 경로다.
- 물리 관련 pretext. 물리 법칙이 정하는 관계를 맞히게 한다. 전류 적분으로 용량 변화를 예측하는 쿨롱 계수, 휴지 구간의 전압 이완 예측, 한 사이클의 기록으로 다음 사이클의 용량 예측 같은 과제다. 물리적으로 의미 있는 양을 예측하게 하므로 표현이 데이터셋 출처 같은 단서에 덜 기대게 만들 수 있다. 다만 그 효과는 하위 과제로 확인해야 한다.
어느 과제든 pretext 손실은 표현의 품질을 재지 않는다. 사전학습 중에 하위 과제의 검증 성능을 함께 기록한다.
분할과 중복
셀 단위 분할. 배터리 데이터의 한 행은 대개 한 사이클이다. 셀 하나에서 수백에서 수천 개의 행이 나오고, 같은 셀의 행들은 서로 거의 같다. 행 단위로 무작위 분할하면 같은 셀의 사이클이 학습과 시험에 나뉘어 들어가, 모델은 셀을 알아보는 것만으로 시험을 푼다. 셀 단위 레이블(사이클 수명)을 초기 사이클 특징으로 예측하는 가상의 문제로 확인한다. Severson 외(2019)가 공개 데이터와 함께 제시한 조기 수명 예측과 같은 꼴의 문제다. 데이터셋 A, B, C(각 셀 40, 30, 30개)의 셀마다 초기 10개 사이클에서 특징 두 개를 계산한다. 하나는 수명과 상관이 있지만 셀 고유의 잡음이 섞인 특징이고, 다른 하나는 수명과 무관한 셀 고유의 값이다. 데이터셋 C는 다른 프로토콜이라 수명이 짧다. 같은 -NN 회귀(이웃 5개)를 세 가지 분할로 평가한다.
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
rng = np.random.default_rng(0)
X, y, cell, dset = [], [], [], []
for d, (n_cell, log_life) in enumerate([(40, 3.0), (30, 3.0), (30, 2.8)]): # 가상 데이터셋 A, B, C (C는 다른 프로토콜)
for _ in range(n_cell):
z, u, v = rng.normal(size=3) # z: 수명 편차, u: 특징의 셀 고유 잡음, v: 수명과 무관한 셀 고유 값
for n in range(10, 101, 10): # 초기 사이클 10, 20, ..., 100에서 계산한 특징 (행 10개)
X.append([z + 0.7 * u + 0.05 * rng.normal(), v + 0.05 * rng.normal()])
cell.append(len(y) // 10); dset.append(d) # 셀 번호, 데이터셋 번호
y.append(log_life + 0.15 * z) # 셀 단위 레이블: log10(사이클 수명)
X, y, cell, dset = np.array(X), np.array(y), np.array(cell), np.array(dset) # (1000, 2) 셀 100개 × 행 10개
def err(train, test): # 사이클 수명의 평균 절대 백분율 오차 (%)
pred = KNeighborsRegressor(n_neighbors=5).fit(X[train], y[train]).predict(X[test])
return 100 * np.mean(np.abs(10 ** (pred - y[test]) - 1))
ab = dset < 2
row_test = ab & (rng.random(len(y)) < 0.2) # (1) A·B의 행(사이클)을 무작위로 20%
cell_test = np.isin(cell, rng.choice(70, 14, replace=False)) # (2) A·B의 셀 20%를 통째로
print(f"행 단위 무작위 분할 (A·B) 수명 오차 {err(ab & ~row_test, row_test):5.1f} %")
print(f"셀 단위 분할 (A·B) 수명 오차 {err(ab & ~cell_test, cell_test):5.1f} %")
print(f"데이터셋 단위 (A·B → C) 수명 오차 {err(ab, dset == 2):5.1f} %")행 단위 무작위 분할 (A·B) 수명 오차 3.3 % 셀 단위 분할 (A·B) 수명 오차 27.9 % 데이터셋 단위 (A·B → C) 수명 오차 56.6 %
행 단위 분할의 오차 3.3%는 셀 단위 분할(27.9%)의 8분의 1이다. 모델이 수명을 예측한 것이 아니라, 시험 행과 같은 셀의 다른 사이클을 이웃으로 찾아 그 셀의 레이블을 읽었기 때문이다. 수명과 무관한 셀 고유의 값이 이 지름길을 만든다. 처음 보는 데이터셋 C에서는 오차가 56.6%로 다시 두 배가 된다. 특징과 수명의 관계가 데이터셋마다 다르기 때문이다(수명이 짧은 프로토콜인데 특징은 같다).
세 단계의 평가. 그래서 배터리 모델의 시험 성능은 적어도 세 단계로 나누어 보고한다.
- 같은 데이터셋, 처음 보는 셀. 셀 단위 분할. 가장 기본적인 일반화다.
- 같은 데이터셋 묶음, 처음 보는 조건. 학습에 없던 온도·프로토콜의 셀. 21.4장의 분포 이동이고, 30.4장의 프로토콜 단위 검증이 여기에 해당한다.
- 처음 보는 데이터셋. 사전학습에 전혀 쓰지 않은 데이터셋(leave-one-dataset-out). foundation model의 주장은 이 단계에서 검증된다.
데이터셋 간 중복. 공개 데이터는 여러 경로로 재배포된다. 한 연구의 데이터가 나중에 다른 데이터셋의 일부로 다시 묶여 공개되거나, 같은 셀의 기록이 전처리 방식만 달리해 두 곳에 실리는 일이 생길 수 있다. 그러면 "사전학습에 쓰지 않은 데이터셋"에서 평가했다고 생각했는데 같은 셀이 사전학습에 들어가 있을 수 있다. 확인하는 방법은 두 가지다.
- 메타데이터 대조. 셀 화학·형태·제조사·시험 날짜·프로토콜·사이클 수가 모두 같은 셀 쌍을 찾는다.
- 신호 대조. 정확히 같은 파일만 찾는 해시 비교로는 부족하다. 재표본화나 단위 변환을 거치면 값이 조금씩 달라지기 때문이다. 사이클별 용량 곡선이나 요약처럼 전처리에 덜 민감한 지문을 만들고, 그 거리가 비정상적으로 가까운 셀 쌍을 찾는다(19.9장의 근사 중복 검출과 같은 생각이다).
중복을 찾았으면 평가 쪽에서 빼는 것이 원칙이고, 사전학습 데이터에서 무엇을 뺐는지 기록으로 남긴다.
전이 평가
무엇과 비교하는가. "사전학습 모델을 미세조정했더니 오차가 X였다"는 문장은 그 자체로는 아무것도 말하지 않는다. 같은 레이블 셀만으로 처음부터 학습한 baseline이 X보다 나쁜지가 전이 효과다. 19.9장의 비교를 배터리 상황으로 다시 한다. 데이터셋 A·B의 셀 300개로 사전학습한 선형 모델(특징 8개)을, 두 목표 데이터셋에 레이블 셀 6개로 적응시킨다. C는 같은 화학이라 관계가 사전학습 데이터와 비슷하고, D는 다른 화학이라 관계가 다르다. 처음부터 학습(0을 향한 ridge), 미세조정(사전학습 가중치를 향한 ridge, 같은 정규화 강도), zero-shot(사전학습 모델 그대로)을 비교한다. 어느 6개 셀에 레이블이 있느냐에 따라 결과가 달라지므로 레이블 셀을 100번 다시 뽑는다.
D = 8 # 초기 사이클 특징 수
w_src = rng.normal(size=D) / np.sqrt(D) # 사전학습 데이터(A·B)가 담은 관계
X_src = rng.normal(size=(300, D)) # (300, D) 사전학습 셀 300개
w_pre = np.linalg.solve(X_src.T @ X_src + np.eye(D), X_src.T @ (X_src @ w_src + 0.1 * rng.normal(size=300)))
def ridge(Xt, yt, w0, lam=3.0): # w0를 향해 줄이는 ridge: w0 = 0이면 처음부터, w_pre면 미세조정
return w0 + np.linalg.solve(Xt.T @ Xt + lam * np.eye(D), Xt.T @ (yt - Xt @ w0))
targets = {"C (같은 화학, 다른 프로토콜)": w_src + 0.3 * rng.normal(size=D) / np.sqrt(D),
"D (다른 화학)": rng.normal(size=D) / np.sqrt(D)}
for name, w_t in targets.items():
Xt = rng.normal(size=(40, D)); yt = Xt @ w_t + 0.1 * rng.normal(size=40) # 목표 데이터셋 셀 40개
res = []
for split in range(100): # 레이블 셀 6개 / 시험 셀 34개로 100번 나눈다
idx = np.random.default_rng(split).permutation(40); tr, te = idx[:6], idx[6:]
rmse = lambda w: np.sqrt(np.mean((Xt[te] @ w - yt[te]) ** 2))
res.append([rmse(ridge(Xt[tr], yt[tr], np.zeros(D))), rmse(ridge(Xt[tr], yt[tr], w_pre)), rmse(w_pre)])
R = np.array(res) # (100, 3) 처음부터, 미세조정, zero-shot
gain = R[:, 0] - R[:, 1] # 양수면 사전학습이 도움
print(f"{name}: RMSE 중앙값 처음부터 {np.median(R[:, 0]):.3f}, 미세조정 {np.median(R[:, 1]):.3f}, "
f"zero-shot {np.median(R[:, 2]):.3f}")
print(f" 미세조정이 나은 분할 {np.mean(gain > 0):.0%}, 이득 5–95% 범위 "
f"[{np.percentile(gain, 5):+.3f}, {np.percentile(gain, 95):+.3f}]")C (같은 화학, 다른 프로토콜): RMSE 중앙값 처음부터 0.528, 미세조정 0.199, zero-shot 0.281
미세조정이 나은 분할 100%, 이득 5–95% 범위 [+0.116, +0.498]
D (다른 화학): RMSE 중앙값 처음부터 0.468, 미세조정 0.574, zero-shot 0.870
미세조정이 나은 분할 16%, 이득 5–95% 범위 [-0.334, +0.134]- C에서는 전이가 크게 돕는다. 미세조정의 RMSE 중앙값이 처음부터 학습한 것의 절반 아래이고, 100개 분할 모두에서 이겼다. 레이블 6개로는 특징 8개의 관계를 처음부터 정할 수 없지만, 비슷한 관계에서 출발하면 남은 차이만 배우면 된다.
- D에서는 전이가 해롭다(부정적 전이). 미세조정의 RMSE 중앙값이 처음부터 학습한 것보다 크고, 미세조정이 나은 분할은 16%다. zero-shot은 가장 나쁘다. 사전학습한 관계가 틀린 출발점이 된 것이다.
- 분할 하나로는 어떤 결론도 낼 수 있다. D에서도 이득의 5–95% 범위가 +0.134까지 올라간다. 운 좋은 분할 하나만 보고하면 "다른 화학에도 전이된다"는 주장이 나온다. 반대로 C에서도 이득의 크기는 분할에 따라 4배 넘게 다르다. 결과는 여러 분할의 분포로 보고한다.
하위 과제의 범위. foundation model은 여러 하위 과제에 대한 주장이므로 평가도 과제 묶음으로 한다. 배터리에서는 SOC·SOH 추정(현재 상태), 수명·잔여 수명 예측(미래), 초기 사이클로 수명 분류(조기 예측), 이상 탐지(안전), 파라미터 추정(30.5장)처럼 시간 척도와 레이블 형태가 다른 과제가 있다. 과제마다 다음을 함께 표로 보고한다.
- few-shot 학습 곡선. 레이블 셀 수(예: 2, 5, 10, 50)를 바꿔 가며 처음부터 학습한 baseline과의 차이를 그린다. 전이의 가치는 대개 레이블이 적은 쪽에서 크고, 레이블이 많아지면 사라진다.
- OOD 조건. 학습에 없던 온도·C-rate·화학에서의 성능. 같은 분포 안의 성능과 따로 보고한다.
- 미사용 데이터셋. 사전학습에 쓰지 않은 데이터셋에서의 성능. 중복 검사 결과를 함께 쓴다.
분석
모델 크기보다 데이터 다양성. 언어·이미지 모델에서는 모델 크기와 데이터 양을 함께 키우는 스케일링이 성능을 이끌었다(14.5장, 19.9장). 배터리 데이터는 사정이 다르다. 행(사이클)의 수는 수백만이 될 수 있지만, 서로 독립적인 정보의 단위인 셀과 조건(화학, 프로토콜, 온도)의 수는 훨씬 적다. 같은 셀의 사이클 1000개는 다른 셀 1000개만큼의 정보를 주지 않는다. 그래서 "사이클 몇 백만 개로 학습했다"는 숫자보다 "셀 몇 개, 화학 몇 종, 프로토콜 몇 종, 데이터셋 몇 개"가 사전학습 데이터의 실제 크기다. 전이의 범위는 사전학습 데이터가 덮는 조건의 범위를 넘기 어렵다.
ablation으로 무엇이 효과를 냈는지 확인한다. 사전학습이 도왔다면 무엇 때문인지 나누어 본다.
- 사전학습 데이터셋을 하나씩 빼고 다시 학습해, 목표 성능이 어느 데이터셋에 의존하는지 본다. 목표와 가장 비슷한 데이터셋 하나가 효과의 대부분을 낸다면, 그것은 "넓은 사전학습"이 아니라 비슷한 데이터를 더한 효과다.
- 같은 계산 예산에서 모델 크기를 바꿔, 크기가 실제로 차이를 만드는지 본다.
- 사전학습 과제를 바꾸거나 빼서(무작위 초기화와 비교), pretext 과제의 기여를 본다.
주장 검증 체크리스트. 배터리 foundation model에 대한 주장(자신의 것이든 논문의 것이든)을 읽을 때 다음을 확인한다.
- 분할이 셀 단위인가? 시험 셀의 어떤 사이클도 사전학습·미세조정에 들어가지 않았는가?
- 평가 데이터셋과 사전학습 데이터 사이의 중복을 메타데이터와 신호로 검사했는가?
- 같은 레이블 셀 수로 처음부터 학습한 baseline(같은 구조와 단순한 모델 둘 다)이 있는가?
- 결과가 여러 분할·시드의 분포(구간)로 보고되었는가?
- 사전학습에 쓰지 않은 데이터셋과 처음 보는 조건(화학, 온도, 프로토콜)에서의 결과가 따로 있는가?
- 하위 과제마다 결과가 따로 있고, 평균 하나로 요약하지 않았는가? 전이가 실패한 과제·조건도 보고되었는가?
- 정규화 통계, 하이퍼파라미터, 조기 종료 기준이 평가 데이터를 보지 않고 정해졌는가?
- 사전학습 데이터의 구성(셀·화학·프로토콜·데이터셋의 수와 출처)이 공개되었는가?
이 중 하나라도 확인되지 않으면 "foundation model"이라는 주장은 아직 검증되지 않은 것이다. 이 체크리스트는 이 장만의 것이 아니라 15.4장(누수)과 19.9장(foundation model 평가)의 원칙을 배터리 데이터에 맞춰 쓴 것이다.
실습
여러 공개 데이터셋으로 사전학습하고, 처음 보는 셀과 처음 보는 데이터셋에서 전이 효과와 실패 조건을 평가한다. 공개 데이터셋의 목록과 각각의 특성은 30.3장을 따른다. 데이터의 내려받기 경로와 라이선스는 데이터셋마다 다르므로, 각 데이터셋의 공식 배포처에서 확인하고 저장소에는 데이터를 넣지 않는다.
- 통합. 데이터셋을 셋 이상 골라 이 장의 스키마로 통합한다. 데이터셋마다 단위·전류 부호·정격 용량의 정의를 표로 기록하고, 통합 후 데이터셋별로 전압·용량·전류 적분의 범위를 그려 변환이 맞는지 확인한다.
- 분할. 데이터셋 하나를 처음부터 끝까지 사전학습에서 뺀다(미사용 데이터셋). 나머지는 셀 단위로 사전학습·검증·시험으로 나눈다. 미사용 데이터셋과 사전학습 데이터 사이의 중복을 메타데이터와 신호 지문으로 검사하고 결과를 기록한다.
- 사전학습. 사이클별 곡선 같은 고정 격자 입력에 masking 과제로 작은 encoder를 사전학습한다(PyTorch가 필요하면 로컬 실습 환경에서 한다).
- 전이 평가. 하위 과제 둘 이상(예: SOH 추정, 초기 사이클로 수명 예측)에서 레이블 셀 수를 바꿔 가며, 처음부터 학습한 같은 구조의 모델과 단순한 baseline(선형 회귀)을 미세조정과 비교한다. 레이블 셀은 여러 번 다시 뽑아 분포로 보고한다.
- 실패 조건. 전이가 해로웠던 과제·데이터셋·레이블 수를 표로 정리하고, 사전학습 데이터셋을 하나씩 빼는 ablation으로 원인을 추정한다.
- 누수 대조군. 같은 파이프라인을 행 단위 분할로 한 번 더 돌려, 셀 단위 분할과의 차이를 보고한다. 차이가 크면 모델이 셀 지문을 쓰고 있다는 신호다.
실패 사례
- 사전학습 데이터에 평가 셀이 포함되는 것. 행 단위 분할, 데이터셋 간 중복, 미세조정 데이터와 사전학습 데이터의 겹침이 모두 같은 결과를 낳는다. 시험 성능은 일반화가 아니라 기억을 잰다. 셀 단위 분할과 중복 검사를 평가 설계의 첫 단계로 둔다.
- baseline 없이 미세조정 성능만 보고하는 것. 같은 레이블로 처음부터 학습한 모델이 같은 성능을 내면 사전학습의 효과는 0이다.
- 운 좋은 분할 하나로 전이를 주장하는 것. 레이블 셀이 적을수록 결과는 어느 셀에 레이블이 있느냐에 크게 좌우된다.
- 결측을 0으로 채우는 것. 온도가 없는 데이터셋의 온도를 0으로 채우면 모델은 "0 °C"를 데이터셋 출처의 표지로 쓴다.
- 사이클 수를 데이터 크기로 내세우는 것. 정보의 단위는 셀과 조건이다. 셀 수와 조건의 범위를 함께 보고한다.
통과 기준
- 사용한 데이터셋마다 단위·부호·정격 용량 정의·결측 modality를 기록한 통합 표를 만들고, 셀 단위·데이터셋 단위 분할과 데이터셋 간 중복 검사 결과를 보고한다.
- 처음 보는 셀과 처음 보는 데이터셋에서, 같은 레이블 수로 처음부터 학습한 baseline 대비 사전학습의 효과를 여러 분할의 분포로 보이고, 전이가 실패한 조건을 하나 이상 보고한다.
- 배터리 foundation model을 주장하는 논문 하나(또는 자신의 결과)를 이 장의 체크리스트 여덟 항목으로 점검하고, 확인되지 않은 항목과 그 영향을 쓴다.
참고 문헌
- Bommasani 외 (2021). On the opportunities and risks of foundation models. arXiv:2108.07258. — foundation model의 정의와 동질화의 위험
- Kapoor, Narayanan (2023). Leakage and the reproducibility crisis in machine-learning-based science. Patterns, 4(9), 100804. — 과학 분야 ML 연구의 누수 사례와 유형
- Severson, Attia, Jin, Perkins, Jiang, Yang, Chen, Aykol, Herring, Fraggedakis, Bazant, Harris, Chueh, Braatz (2019). Data-driven prediction of battery cycle life before capacity degradation. Nature Energy, 4, 383–391. — 초기 사이클 특징으로 셀 단위 사이클 수명을 예측한 공개 데이터셋 연구