진동 창을 벡터로 바꿔 sqlite 표에 넣고, 현재 창과 가장 닮은 과거 고장을 찾습니다(CWRU). 이어서 Chronos-2를 학습 없이 사용합니다. 예측 구간을 벗어난 정도로 이상을 감지하고, 무엇을 잡고 무엇을 놓치는지 확인합니다.
무엇을 · 왜#
| 방법 | 질문 | 필요한 것 |
|---|---|---|
| 고장 패턴 검색 | "지금 진동은 예전 어떤 고장과 닮았나?" | 고장 라벨이 붙은 과거 창 몇 개 |
| 제로샷(Chronos-2) | "지금 값이 예측 구간을 벗어났나?" | 라벨 없음. 임계값만 설정 |
현장 전문가가 제안한 방식은 "다변량 시계열 구간을 512~1,024차원 벡터로 바꿔 벡터 DB에 넣고, 실시간 구간과 유사도를 비교해 과거 고장 패턴을 찾는 것"입니다. 이 장에서는 진동 센서 하나로 같은 구조를 만들어 봅니다. 벡터 DB 대신 sqlite 표 하나와 numpy 코사인 유사도면 충분합니다.
따라 하기 1: 고장 패턴 검색#
- 스크립트를 실행합니다. CWRU 파일 16개(정상·내륜·볼·외륜 × 부하 0~3 hp)가 없으면 먼저 내려받습니다(약 40초, CPU).
- 스크립트가 하는 일을 살펴봅니다.
- 구동단 진동을 2,048점 창으로 자릅니다. 부하 0~1 hp 창 442개로 색인하고, 부하 2~3 hp 창 473개로 질의합니다(부하가 바뀐 상황).
- 창마다 벡터 두 가지를 만듭니다. (가) 손으로 만든 128차원 벡터는 FFT 대역 64개 + 포락선 스펙트럼 대역 64개의 로그 에너지입니다. (나) Chronos-2 임베딩 768차원 벡터는
Chronos2Pipeline.embed의 패치 토큰 평균입니다. - 벡터를 sqlite 표에 넣고, 질의 벡터와 코사인 유사도가 가장 큰 과거 창을 찾습니다.
- 결과를 봅니다.
- 둘 다 만점이라 차이가 보이지 않습니다. 질의에만 잡음을 섞어 다시 봅니다.
```bash
.venv/bin/python textbook/05_similarity_search.py
```

| 벡터 | 차원 | 1등 정확도 | 5등 안 정확도 | "가장 가까운 정상까지의 거리"로 본 이상 점수 ROC-AUC |
|---|---|---|---|---|
| 손으로 만든 벡터 | 128 | 1.000 | 1.000 | 1.000 |
| Chronos-2 임베딩 | 768 | 1.000 | 1.000 | 1.000 |
| 신호 대 잡음비 | 손으로 만든 벡터 1등 / AUC | Chronos-2 1등 / AUC |
|---|---|---|
| 10 dB | 0.751 / 1.000 | 1.000 / 1.000 |
| 0 dB | 0.660 / 1.000 | 0.499 / 0.997 |
| −5 dB | 0.510 / 1.000 | 0.250 / 0.687 |
쉬운 벤치마크는 차이를 못 보여 줍니다
잡음이 없는 CWRU에서는 두 벡터 모두 결함 종류를 구분합니다. 잡음이 커지면 Chronos-2 임베딩은 모든 질의를 한 종류("볼 결함")로 분류했습니다. 창마다 평균·표준편차로 정규화하는 과정에서 진동의 절대 크기가 사라지는 탓으로 추정하지만, 확인하지는 않았습니다.
따라 하기 2: 제로샷(Chronos-2)#
- 2장의 NASA IMS 특징으로 실행합니다(불러오기 포함 약 3초, Apple mps).
- 스냅숏마다 직전 128개의 RMS로 다음 값을 예측하고, 실제 값이 10~90% 예측 구간을 벗어난 정도(구간 폭 단위)를 점수로 씁니다. 문턱값은 앞 40% 구간 점수의 99%이고, 3번 연속 넘으면 알람입니다. 학습은 없고, 임계값만 정합니다.
- 결과를 2장과 비교합니다.
```bash
.venv/bin/python textbook/04_zero_shot_chronos.py
```

| 입력 | 첫 알람 | 끝나기 전 | 알람 전 단발 초과 | 첫 알람 뒤 문턱값을 넘은 비율 |
|---|---|---|---|---|
| RMS | 02-17 07:32 | 46.8시간 | 18 | 8.5% |
| 첨도 | 알람 없음 | — | 40 | — |
알아 둘 점#
- 제로샷은 계단식 변화는 잡고 점진적인 열화는 놓칩니다. RMS가 17일 아침 계단처럼 오를 때 알람이 울렸습니다. 하지만 직전 값으로 예측하므로 바뀐 수준을 금방 따라갑니다. 첫 알람 뒤 문턱값을 넘은 비율은 8.5%에 그칩니다(오토인코더는 100%). 5장의 운영 하네스에서는 이 약점 때문에 8시간 앞선 문맥으로 지금 값을 예측하게 바꿨습니다.
- 무엇이 이상인지는 말해 주지 않습니다. 고장 종류를 알고 싶으면 패턴 검색이나 물리 공식을 함께 둡니다.
- 패턴 검색은 라벨이 몇 건만 있어도 됩니다. 5장의 하네스는 고장 기록이 1건 쌓이면 고장 직전 3일의 벡터를 색인하는 「고장 패턴 검색」 후보를 만듭니다. 이 후보는 판단 근거도 제시합니다. 11주차 불균형 고장(F4) 직전 창을 넣으면 "가장 닮은 과거 패턴: F2 임펠러 안료 부착(불균형) 고장 2시간 전"이라고 답했습니다(대시보드에는 아직 표시하지 않습니다).
확인 문제#
- 깨끗한 CWRU에서 두 벡터가 모두 만점일 때, 어느 벡터를 쓸지 정하려면 무엇을 더 해 봐야 하나요?
정답
현장과 비슷하게 어렵게 만든 조건에서 비교해야 합니다. 이 장에서는 질의에 잡음을 섞었고(0 dB에서 0.660 대 0.499), 부하를 바꾸거나 다른 설비의 데이터로 질의해 보는 것도 방법입니다. 계산 비용(손으로 만든 벡터 0.03초, Chronos-2 15~18초)도 함께 봅니다.
- Chronos-2 제로샷이 "학습이 필요 없다"는 말은 어디까지 맞나요?
정답
모델의 가중치를 학습하지 않는다는 뜻까지만 맞습니다. 알람 문턱값은 정상 구간 점수로 정해야 하고, 문맥 길이나 예측 방식(직전 값 vs 몇 시간 앞선 문맥) 같은 설계는 여전히 사람이 데이터를 보고 정합니다.