<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sy_kim.log</title>
        <link>https://velog.io/</link>
        <description>MedicalAI Researcher</description>
        <lastBuildDate>Fri, 02 Jan 2026 09:32:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sy_kim.log</title>
            <url>https://velog.velcdn.com/images/sy_kim/profile/ac66701f-5f7e-4d5f-9f7a-3061a007276a/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sy_kim.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sy_kim" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[논문 리뷰] Selective Learning]]></title>
            <link>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Selective-Learning</link>
            <guid>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Selective-Learning</guid>
            <pubDate>Fri, 02 Jan 2026 09:32:44 GMT</pubDate>
            <description><![CDATA[<h1 id="selective-learning-for-deep-time-series-forecasting">Selective Learning for Deep Time Series Forecasting</h1>
<ul>
<li>Paper : <a href="https://arxiv.org/pdf/2510.25207">https://arxiv.org/pdf/2510.25207</a></li>
<li>Github : <a href="https://github.com/GestaltCogTeam/selective-learning">https://github.com/GestaltCogTeam/selective-learning</a></li>
<li>NeurIPS 2025 (citation: 2)</li>
<li>요약<ul>
<li>MSE 손실(loss)을 통해 모든 타임스텝(timestep)을 일률적으로 최적화하며, 불확실하거나 이상한 타임스텝들까지 차별 없이 학습하여 <strong>노이즈와 이상치에 취약</strong>한 시계열의 본질적인 특성으로 인해 과적합(overfitting)이 발생한다.</li>
<li>최적화 과정에서 MSE 손실을 계산할 전체 타임스텝 중 일부를 선별하며, 모델이 일반화가 불가능한 타임스텝은 무시하고 일반화 가능한 타임스텝에 집중하도록 유도하는 <strong>&#39;선택적 학습(selective learning)&#39;</strong> 전략을 제안한다.</li>
<li>불확실한 타임스텝을 필터링하는 <strong>불확실성 마스크(uncertainty mask)</strong>와 이상 타임스텝을 제외하는 <strong>이상치 마스크(anomaly mask)</strong> <strong>이중 마스크(dual-mask) 메커니즘</strong>을 도입하였다.</li>
</ul>
</li>
</ul>
<h1 id="introduction">Introduction</h1>
<h2 id="problem">Problem</h2>
<p>산업용 센서는 기계적 진동이나 전자기 방해에 쉽게 영향을 받으며, 주식 가격은 정책 개입에 따라 비정상적인 변동을 보인다. 이러한 간섭 요인들은 <strong>노이즈와 이상치(anomalies)로 인한 과적합(overfitting)</strong> 문제를 야기한다.</p>
<p>기존 손실 함수(MSE, MAE)는 각 타임스텝을 동일하게 취급하여 계산한다. 이는 모델이 일반화될 수 없는 <strong>불확실하고 이상한 타임스텝</strong>까지 학습하게 하여 과적합 문제를 야기하고 모델의 성능을 저하시킨다.</p>
<p>Figure 1. (Right)과 같이  iTransformer 모델은 ETTh1 데이터셋으로 학습될 때 MSE loss가 세 번째 에포크 이후 다시 증가하며 과적합 되는 것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/e19c3725-f0d8-4cf4-8c3b-b8f86c38a1bd/image.png" alt="Figure 1. Right"></p>
<p>Figure 1. Right</p>
<h2 id="solution">Solution</h2>
<p>이러한 문제를 해결하기 위해, 본 논문에서는 <strong>일반화 가능한 타임스텝</strong>만 최적화에 사용하고, 식별된 불확실하거나 이상한 타임스텝은 폐기하는 <strong>선택적 학습(selective learning)</strong>을 제안하며, 비일반화(non-generalizable) 타임스텝을 동적으로 필터링하기 위한 <strong>이중 마스크(dual-mask) 메커니즘</strong>을 도입하였다.</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/04b664ef-f9d0-44aa-a7d4-768eff96dd17/image.png" alt="Figure 1. Left"></p>
<p>Figure 1. Left</p>
<p>모델의 일반화 성능을 저하시키는 두 가지 주요 타임스텝:</p>
<ol>
<li><strong>불확실한(Uncertain) 타임스텝:</strong> 주로 노이즈(예: 신호 방해)로 인해 발생하며, 높은 예측 불확실성을 가진다. 결과적으로 gradients 업데이트가 무작위 방향으로 이루어져 노이즈에 원치 않게 적합되는 결과를 초래한다.</li>
<li><strong>이상(Anomalous) 타임스텝:</strong> 주로 예외적인 사건(예: 센서 오작동)에 의해 발생합니다. 모델의 예측은 확신이 있을 수 있으나 상당한 오차가 발생하며, 이는 모델이 인스턴스 특화된 특징을 학습하도록 강제하여 일반화를 저해한다.</li>
</ol>
<h2 id="related-works">Related Works</h2>
<h3 id="deep-models">Deep Models</h3>
<ul>
<li><strong>Transformer 기반 모델:</strong> 장기적인 시간적 의존성<ul>
<li>Informer : 2차 복잡도를 줄이기 위해 ProbSparse 어텐션을 도입하였다.</li>
<li>PatchTST : 시계열을 patch 단위로 나누고 channel-independent 전략을 사용한다.</li>
<li>iTransformer : 각 시계열을 독립적으로 변수 토큰(variate token)에 임베딩하고 셀프 어텐션을 적용하여 다변량 상관관계를 포착한다.</li>
</ul>
</li>
<li><strong>CNN 기반 모델:</strong> 지역적 패턴 추출<ul>
<li>TimesNet : 시계열을 2D 텐서로 변환하고 CNN을 사용하여 주기 내 및 주기 간 의존성을 포착한다.</li>
</ul>
</li>
<li><strong>MLP 기반 모델:</strong> 가벼운 구조<ul>
<li>DLinear : 분해(decomposition) 기법이 적용된 단순한 선형 레이어를 활용한다.</li>
<li>TimeMixer : MLP 레이어를 통해 다중 스케일(multi-scale) 정보를 포착한다.</li>
</ul>
</li>
</ul>
<h3 id="training-strategies">Training Strategies</h3>
<p>현재의 딥러닝 패러다임은 모든 타임스텝에 대해 일관되게 회귀 손실(예: MSE/MAE)을 계산하며, 다양한 대안 방법들이 존재하지만 특정 데이터셋과 시나리오에 최적화 되어 일반화되지 못했다.</p>
<ul>
<li>iTransformer : 대규모 다변량 시계열을 위해 변수의 서브셋을 무작위로 선택하는 학습 전략을 제안했다.</li>
<li>Merlin : 데이터 누락에 대한 모델의 견고성을 높이기 위해 지식 증류(knowledge distillation) 전략을 채택 했다.</li>
<li>MTGNN : 학습 중에 예측 길이를 점진적으로 늘려가는 커리큘럼 학습(curriculum learning)의 아이디어를 시계열 예측에 적용했다.</li>
</ul>
<h1 id="method">Method</h1>
<h2 id="preliminaries">Preliminaries</h2>
<h3 id="notations">Notations</h3>
<ul>
<li>$\mathbf{X}_{0:T} \in \mathbb{R}^{T \times N}$ : 전체 시계열 데이터</li>
<li>$X_t \in \mathbb{R}^N$ : $N$개의 변수를 가진 다변량 시계열에 대한, $t$번째 타임스텝</li>
<li>$\mathbf{X}<em>{t-L:t} = {X</em>{t-L}, X_{t-L+1}, \dots, X_{t-1}} \in \mathbb{R}^{L \times N}$ : 과거(look-back) 윈도우 크기가 $L$인 과거 시계열</li>
<li>$\hat{\mathbf{X}}<em>{t:t+F} = {X_t, X</em>{t+1}, \dots, X_{t+F-1}} \in \mathbb{R}^{F \times N}$ : 예측 윈도우 크기가 $F$인 미래 값</li>
<li>$\mathcal{D}<em>{train} = {(\mathbf{X}</em>{t-L:t}, \mathbf{X}<em>{t:t+F})}</em>{t=L}^{T-F}$ : 학습 데이터셋은 스트라이드가 1인 슬라이딩 윈도우</li>
<li>$f(\cdot; \theta) : \mathbb{R}^{L \times N} \rightarrow \mathbb{R}^{F \times N}$ : 파라미터 $\theta$로 정의된 심층 신경망 모델</li>
<li>$\eta$ : 학습률(learning rate)</li>
<li>$\tau$ : 학습 중의 반복 횟수(iterations)</li>
</ul>
<h3 id="problem-statement">Problem Statement</h3>
<p>최적의 예측값 $\hat{\mathbf{X}}<em>{t:t+F} = f(\mathbf{X}</em>{t-L:t}; \theta)$ 를 구하는 것이 목표이며, 평균 제곱 오차(MSE)는 예측값($\hat{\mathbf{X}}<em>{t:t+F}$)과 GT($\mathbf{X}</em>{t:t+F}$) 사이의 차이를 계산하며, $\theta$를 최적화하기 위해 사용되는 대표적인 손실 함수이다.</p>
<p>$$
\mathcal{L}<em>{MSE}(\theta) = \frac{1}{N \cdot F} \sum</em>{i=0}^{F-1} |X_{t+i} - f(\mathbf{X}_{t-L:t}; \theta)_i|^2 \tag{1}
$$</p>
<p>$$
\theta_{\tau+1} = \theta_{\tau} - \eta \nabla_{\theta} \mathcal{L}_{MSE} \tag{2}
$$</p>
<h2 id="selective-learning">Selective Learning</h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/32c7b483-bd75-4bd7-8719-8e50d27c8b0f/image.png" alt="Figure 2"></p>
<p>Figure 2. (a) Overall framework of selective learning. (b) Uncertainty mask. (c) Anomaly mask.</p>
<p>핵심 아이디어는 <strong>일반화 가능한 타임스텝의 서브셋에 대해서만 MSE 손실을 계산</strong>한다는 것이며, 두 가지 범주의 타임스텝을 마스킹하여 동적으로 필터링하는 <strong>이중 마스크(dual-mask) 메커니즘</strong>을 제안한다.</p>
<ol>
<li><p><strong>불확실한(Uncertain) 타임스텝 :</strong> 모델이 예측한 값과 GT의 잔차(residual)를 이용해 잔차 분포의 엔트로피를 불확실성 척도로 사용한다. 슬라이딩 윈도우 샘플링을 통해 서로 다른 윈도우에서 예측된 타임스텝샘플들을 얻을 수 있으며, 이를 통해 잔차의 엔트로피를 정량화하여 높은 엔트로피를 가진 타임스텝을 걸러내는 지표로 활용한다.</p>
</li>
<li><p><strong>이상(Anomalous) 타임스텝 :</strong> 간단한 모듈을 추가하여 각 타임스텝의 잔차 하한(lower bound)을 구하도록 학습한다. 현재 잔차가 하한에 가장 가까운 타임스텝을 마스킹함으로써, 학습해야 할 타임스텝은 유지하면서 비일반화 이상치를 동적으로 제거한다.</p>
<p>$\tau$번째 반복(iteration)에서의 시계열 예측 모델 $f(\cdot, \theta)$가 주어졌을 때, 비일반화 타임스텝의 서브셋에서만 최적화를 제한하는 마스크 $\mathcal{M}^{(\tau)} \in {0, 1}^F$를 만들어 손실 함수를 계산한다.</p>
</li>
</ol>
<p>$$
\mathcal{L}<em>{SL}(\theta) = \frac{1}{N \cdot |\mathcal{M}^{(\tau)}|} \sum</em>{i=0}^{F-1} |\mathcal{M}^{(\tau)}(X_{t+i} - f(\mathbf{X}_{t-L:t}; \theta)_i)|^2
$$</p>
<p>여기서 $\mathcal{M}^{(\tau)} = \mathcal{M}_u^{(\tau)} \lor \mathcal{M}_a^{(\tau)}$이며, $\mathcal{M}_u^{(\tau)}$와 $\mathcal{M}_a^{(\tau)}$는 각각 <strong>불확실성 마스크</strong>와 <strong>이상치 마스크</strong>를 $\lor$는 요소별(element-wise) OR 연산자를 의미한다. 또한 채널 독립(channel-independent) 전략을 채택하여 각 변수에 대해 독립적으로 마스크를 생성한다.</p>
<h3 id="uncertainty-mask">Uncertainty Mask</h3>
<p>높은 예측 불확실성을 보이는 타임스텝을 위한 엔트로피 기반의 마스킹 접근법</p>
<p>$\epsilon_t = X_t - \hat{X}_t$를 $t$번째 타임스텝의 잔차라고 할 때, 각 타임스텝은 한 에포크 내에서 $n_t = \min{t - L + 1, F}$번 예측된다. 잔차는 가우시안 분포 $\epsilon_t \sim \mathcal{N}(\mu_t, \sigma_t^2)$를 따른다고 가정하며, 이에 따라 잔차 엔트로피와 분산은 다음과 같이 계산한다:</p>
<p>$$
\hat{H}(\epsilon_t) = \frac{1}{2} \ln(2\pi e \hat{\sigma}_t^2)
$$</p>
<p>$$
\hat{\sigma}<em>t^2 = \frac{1}{n_t} \sum</em>{i=1}^{n_t} (\epsilon_t^{(i)} - \bar{\epsilon}_t)^2
$$</p>
<p>잔차 엔트로피가 상위 $r_u%$인 타임스텝에 하드 임계값(hard thresholding) $\gamma_u$를 적용하여 불확실성 마스크 $\mathcal{M}_u^{(\tau)}$를 얻는다:</p>
<p>$$
(\mathcal{M}_u^{(\tau)})_t = \begin{cases} 0, &amp; \hat{H}(\epsilon_t) &gt; \gamma_u \ 1, &amp; \text{otherwise} \end{cases}
$$</p>
<h3 id="anomaly-mask">Anomaly Mask</h3>
<p>이상 타임스텝은 일반적으로 실제값과의 편차로 인해 큰 잔차를 발생 시키기 때문에 단순히 잔차 $| \epsilon_t |$가 큰 타임스텝을 마스킹하는 방식은, <strong>실제 이상치</strong>와 <strong>학습이 덜 되었지만 일반화 가능한 패턴</strong>을 구분하지 못한다는 한계가 있다.</p>
<p>이러한 한계를 극복하기 위해, 잔차와 이론적 하한(lower bound) $\epsilon_t^{LB}$ 사이의 편차인 $S(X_t)$를 정의한다:</p>
<p>$$
S(X_t) = |X_t - f(\mathbf{X}; \theta)_t| - \epsilon_t^{LB} \tag{12}
$$</p>
<p>따라서, <strong>이상 타임스텝</strong>은 높은 잔차 하한을 가져 상대적으로 <strong>작은 $S(X)$</strong> 값을 보이고, <strong>학습되지 않은 타임스텝</strong>은 현재 잔차와 이론적 최소값 사이의 큰 격차로 인해 <strong>큰 $S(X)$</strong> 값을 보인다. </p>
<p>잔차 하한(residual lower bound)을 추정하기 위해 학습 데이터셋 $\mathcal{D}_{train}$ 상에서 가단한 모델 $g(\cdot; \phi)$를 학습 시키고, 이를 통해 $\hat{S}(X_t)$를 다음과 같이 추정한다: </p>
<p>$$
\hat{S}(X_t) = \underbrace{|X_t - f(\mathbf{X}; \theta)<em>t|}</em>{\text{residual } \epsilon_t} - \underbrace{|X_t - g(\mathbf{X}; \phi)<em>t|}</em>{\text{estimated LB } \hat{\epsilon}_t^{LB}} \tag{13}
$$</p>
<p>하드 임계값(hard thresholding) $\gamma_a$를 사용하여 $\hat{S}(X_t)$ 값이 가장 작은 상위 $r_u%$의 타임스텝을 필터링해 이상치 마스크 $\mathcal{M}_a^{(\tau)} \in {0, 1}^F$를 얻는다:</p>
<p>$$
(\mathcal{M}_a^{(\tau)})_t = \begin{cases} 0, &amp; \hat{S}(X_t) &lt; \gamma_a \ 1, &amp; \text{otherwise} \end{cases} \tag{14}
$$</p>
<p>특히, 추정된 잔차 하한을 정적(static)인 마스킹 기준으로 사용하지 않고, $S(X_t)$는 현재의 예측값에 따라 마스킹을 <strong>동적으로 조정</strong>할 수 있다. 이러한 방식은 두 가지 장점이 있다.</p>
<ol>
<li><strong>편향 완화:</strong> 정적 마스킹은 학습 데이터셋 $\mathcal{D}_{train}$의 분포를 크게 변화시켜 편향(bias)을 유발하는 반면, 동적 마스킹은 학습 중에 마스크를 적응시켜 기대치(expectation) 측면에서 이러한 편향을 완화한다.</li>
<li><strong>점진적 학습:</strong> 일반화가 덜 되는 드물지만 중요한 극한 이벤트(예: 극단적 날씨)에 대해, 동적 마스킹은 먼저 일반화 가능한 타임스텝을 학습한 후, 이전에 이상치로 간주되었던 타임스텝들을 점진적으로 학습하도록 시도한다.</li>
</ol>
<h1 id="experiments">Experiments</h1>
<p><strong>실험 설정</strong></p>
<ul>
<li>ILI 데이터셋의 경우 예측 길이 $F \in {24, 36, 48, 60}$, 
그 외 데이터셋은 $F \in {96, 192, 336, 720}$</li>
<li>하이퍼파라미터: 기존의 하이퍼파라미터 설정을 따르면서 마스킹 비율 $r_a$와 $r_n$만 조정</li>
<li>옵티마이저 : Adam</li>
</ul>
<h2 id="main-results">Main Results</h2>
<p>SOTA 베이스라인 모델(iTransformer, TimeMixer)를 포함한 <strong>192개의 모든 케이스에서 성능이 향상</strong>됨</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/e46203bf-8f44-455c-bd7e-aedf93de3d0c/image.png" alt="Table 1"></p>
<p>Table 1. main results</p>
<h2 id="zero-shot-forecasting">Zero-shot Forecasting</h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/77453019-a666-441a-a301-ae5a3113ab24/image.png" alt="Table 2"></p>
<p>Table 2. zero-shot forcasting results</p>
<ul>
<li>모델을 데이터셋 $\mathcal{D}_A$에서 학습시킨 후 추가 학습 없이 데이터셋 $\mathcal{D}_B$에서 평가했다.</li>
<li>어려운 시나리오(ETTh2 → ETTh1, ETTm2 → ETTm1)에서 선택적 학습은 평균적으로 <strong>MSE를 22.6%, MAE를 14.5% 감소</strong>시키며 상당한 개선을 이루었다.</li>
<li>일부 케이스에서는 타겟 데이터셋에서 처음부터 학습한(train-from-scratch) 결과보다 더 뛰어난 성능을 보이기도 하였다.</li>
</ul>
<h2 id="comparison-with-other-training-objectives">Comparison with Other Training Objectives</h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/c97eea7a-308b-43a4-975a-3bc0336398cf/image.png" alt="Table 3"></p>
<p>Table 3. Comparison between selective learning (SL) and other training objectives with iTransformer as backbone</p>
<ul>
<li>선택적 학습은 높은 호환성을 가지기 때문에 모델에 완전히 무관(model-agnostic)하며, 다양한 정규화 방법이 적용된 어떠한 딥러닝 아키텍처에도 적용할 수 있다.</li>
<li>선택적 학습은 point-wise의 학습을 기반으로 하며, 형태 기반(TILDE-Q), 주파수 기반(FreDF), 분포 기반(PS loss) 목표를 포함한 point-wise가 아닌 대안적 학습 목표들과 비교했다.</li>
<li>타겟 시퀀스의 특정 타임스텝들이 본질적으로 일반화가 불가능하기 때문에 시간 또는 주파수 도메인에서 형태나 분포를 맞추는 <strong>전체 시퀀스에 대한 전역적 정렬(global alignment) 방식이 최선이 아님</strong>을 입증한다.</li>
</ul>
<h2 id="ablation-study">Ablation Study</h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/4e09b86e-fe4e-411a-b73a-93e89e9b716a/image.png" alt="Table 4"></p>
<p>Table 4. Ablation results for selective learning with iTransformer as backbone</p>
<ul>
<li>어느 한쪽 마스크라도 제거하면 4개 데이터셋 모두에서 상당한 성능 저하가 발생하며, 이는 두 마스크가 일반화 불가능한 패턴을 필터링하는 데 있어 필수적이고 서로 구별되는 기능을 수행함을 시사한다.</li>
<li>무작위 마스킹으로 대체하면 모델 성능이 마스킹을 하지 않은 경우와 비슷하거나 오히려 더 나빠지는데, 이는 단순히 타임스텝의 일부에 무작위로 주의를 기울이는 것만으로는 모델의 성능과 일반화 능력을 향상시킬 수 없음을 의미한다.</li>
</ul>
<h2 id="hyperparameter-analysis">Hyperparameter Analysis</h2>
<h3 id="effects-of-masking-ratio">Effects of Masking Ratio</h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/c520edf6-5a25-4642-9964-0d3140572ed9/image.png" alt="Figure 3"></p>
<p>Figure 3. Forecasting results under different masking ratios. The prediction length is 336.</p>
<ul>
<li>비정상성(non-stationary)이 강한 데이터셋(ETTh1, Exchange)에서는 <strong>더 큰 마스킹 비율</strong>이 우수한 성능을 보였다.</li>
<li>반면, 주기적인 패턴을 보이는 데이터셋(Weather)은 <strong>더 작은 마스킹 비율</strong>에서 향상된 성능을 보였다.</li>
<li>특히, Exchange 데이터셋의 경우 90%의 이상치 마스킹 비율에서 최고 성능을 보였는데, 이는 이 데이터셋에서 시장에 의한 일반화 불가능한 이상치가 노이즈보다 훨씬 더 큰 영향을 미치기 때문이다.</li>
</ul>
<h3 id="effects-of-estimation-model">Effects of Estimation Model</h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/b2e58954-dccf-457f-9fa6-3210008f7218/image.png" alt="Figure 4"></p>
<p>Figure 4. Forecasting performance with iTransformer as backbone and various estimation models. The results are averaged from all prediction lengths.</p>
<ul>
<li>비정상성이 매우 높은 데이터셋(ETTh1, Exchange)에서는 <strong>단순한 모델</strong>이 우수한 성능을 보인 반면, 주기적 패턴을 보이는 데이터셋(Weather)은 <strong>더 복잡한 추정 모델</strong>이 유리했다.</li>
<li>그럼에도 불구하고, 추정 모델의 선택이 전체 성능에 미치는 영향은 제한적이었으며, 이는 선택적 학습의 견고성(robustness)을 강조한다.</li>
</ul>
<h2 id="learning-curve-analysis">Learning Curve Analysis</h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/a23cddae-22f1-4186-bd03-bd9340efe25e/image.png" alt="Figure 5"></p>
<p>Figure 5. Test MSE curve on the ETTh1 dataset. The prediction length is 336.</p>
<ul>
<li>비교된 세 모델 모두 다양한 정도의 과적합을 보이는 반면, 선택적 학습의 모델들은 <strong>안정적인 수렴과 우수한 성능</strong>을 달성하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] TSLANet]]></title>
            <link>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-TSLANet</link>
            <guid>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-TSLANet</guid>
            <pubDate>Mon, 18 Aug 2025 04:59:13 GMT</pubDate>
            <description><![CDATA[<h3 id="tslanet-rethinking-transformers-for-time-series-representation-learning">TSLANet: Rethinking Transformers for Time Series Representation Learning</h3>
<ul>
<li>Paper : <a href="https://arxiv.org/pdf/2404.08472">https://arxiv.org/pdf/2404.08472</a></li>
<li>Github : <a href="https://github.com/emadeldeen24/TSLANet">https://github.com/emadeldeen24/TSLANet</a></li>
<li>ICML 2024</li>
</ul>
<h1 id="요약">요약</h1>
<ol>
<li><strong>주제</strong> : 시계열 데이터를 분석하기 위한 컨볼루션 기반의 경량 + 노이즈 적응형 네트워크 제안함</li>
<li><strong>배경</strong> : 트랜스포머 기반 모델은 장기 의존성 포착에는 뛰어나지만, 소규모 데이터셋에서는 노이즈 민감도, 계산 효율성, 과적합 문제 등의 한계가 존재함</li>
<li><strong>Adaptive Spectral Block (ASB)</strong> : 푸리에 분석을 활용하여 특성 표현을 향상시키고, 적응형 임계값 처리 (adaptive thresholding)을 통한 고주파 노이즈를 완화함</li>
<li><strong>Interactive Convolution Block (ICB)</strong> : 서로 다른 커널 크기를 가진 병렬 컨볼루션으로, 지역적 특징과 장기 의존성을 모두 포착할 수 있도록 구성함</li>
<li><strong>Self-Supervised Learning</strong> : 복잡한 시간 패턴의 해독 능력 및 다양한 데이터셋에서의 견고성을 향상함</li>
</ol>
<h1 id="배경">배경</h1>
<h3 id="transformer-계열-모델">Transformer 계열 모델</h3>
<ul>
<li>Attention 메커니즘은 시계열 데이터 내의 노이즈와 중복성에 취약함</li>
<li>Self-Attention 메커니즘이 본질적으로 순서에 무관(permutation-invariant)하므로 시간 정보의 보존에 한계가 있음</li>
<li>Position Encoding 으로 보완 가능하지만, 인코딩 방식에 따라 상대적/절대적 위치 정보가 다르게 반영될 수 있음</li>
</ul>
<h3 id="cnn-계열-모델">CNN 계열 모델</h3>
<ul>
<li>CNN은 다양한 크기와 종류의 커널들로 인해 다양한 특징과 패턴을 효과적으로 감지하고, 분류 문제에서 우수한 성능을 보임</li>
<li>간단한 3-layer CNN 네트워크가 최신 Transformer 기반 아키텍처와 비교해 분류에서 더 뛰어난 성능을 보임 (Dataset : UEA)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/51b41be1-18f8-4278-9186-ddd9923e34c5/image.png" alt=""></p>
<ul>
<li>하지만 CNN의 예측 성능은 주기가 긴 데이터의 경우<ul>
<li>10분 단위의 짧은 주기를 갖는 Weather 데이터셋에서 Transformer 계열과 비슷한 성능을 보임</li>
<li>시간 단위의 긴 주기를 갖는 ETTh1 데이터셋에서는 낮은 성능을 보임</li>
</ul>
</li>
</ul>
<p><strong>⇒ &quot;어떻게 하면 CNN의 강인한 성능을 더 다양한 시계열 작업으로 확장할 수 있을까?&quot;</strong> </p>
<h1 id="모델-아키텍처">모델 아키텍처</h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/5bbd27dc-e8a4-431e-8132-909cea8f8422/image.png" alt="overall"></p>
<h2 id="adaptive-spectral-block-asb"><strong>Adaptive Spectral Block (ASB)</strong></h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/59df43bd-889b-4e16-9e25-3216fb7e5311/image.png" alt="ASB"></p>
<ol>
<li><strong>FFT (푸리에 변환)</strong><ul>
<li>1D FFT를 적용하여 주파수 도메인으로 변환함</li>
<li>각 채널은 독립적으로 변환되어, 원래 시계열의 스펙트럼 특성을 담는 데이터 $F$ 를 생성함</li>
</ul>
</li>
<li><strong>고주파 노이즈의 학습 가능한  Threshold</strong><ul>
<li>고주파 성분은 근본적인 변동 추세나 관심 신호에서 벗어난 빠른 변화로, 성능에 악영향을 미침</li>
<li>데이터셋 특성에 따라 필터링 강도를 동적으로 조절할 수 있는 적응형 로컬 필터를 제안함</li>
<li>파워 스펙트럼 $P$는 각 주파수 성분의 크기의 제곱($P=∣F∣^2$)으로 계산함</li>
<li>학습 가능한 임계값 $θ$를 이용해 파워 스펙트럼 $P$의 고주파 성분을 적응형으로 필터링함</li>
<li>파워($P$)가 임계값 $θ$ 이상인 주파수에서 1(유지), 아니면 0(제거)인 바이너리 마스크를 적용함</li>
</ul>
</li>
<li><strong>학습 가능한 필터</strong><ul>
<li>적응적으로 필터링된 주파수 도메인 데이터에 대해, 두 종류의 학습 가능한 필터를 적용함</li>
<li>원본 주파수 데이터 $F$에서 학습하는 전역 필터 $W_G$
필터링된 데이터 $F_{\mathrm{filtered}}$에서 학습하는 로컬 필터 $W_L$
<img src="https://velog.velcdn.com/images/sy_kim/post/a65abe1c-240b-4ff3-8a0a-b49b88099a86/image.png" alt=""></li>
<li>필터링된 특징을 결합하여, 종합적인 스펙트럼 정보를 얻음
$F_{\mathrm{integrated}}=F_G+F_L$   </li>
</ul>
</li>
<li><strong>IFFT (역 푸리에 변환)</strong><ul>
<li>최종적으로 필터링 및 결합된 주파수 도메인 데이터를 다시 시간 도메인으로 변환하기 위해, IFFT를 적용함</li>
<li>IFFT는 특성 추출 후의 특성이 원래 시계열 입력의 데이터 구조와 일치하도록 보장함
  <img src="https://velog.velcdn.com/images/sy_kim/post/a37f235b-d955-46b5-9829-a8eb7b2b7d28/image.png" alt=""></li>
</ul>
</li>
</ol>
<h2 id="interactive-convolution-block-icb"><strong>Interactive Convolution Block (ICB)</strong></h2>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/a6b8eafe-934e-49b3-ba5e-6d3281a41eea/image.png" alt="ICB"></p>
<ul>
<li>서로 다른 커널 크기를 가진 병렬 컨볼루션으로, 지역적(local) 특징과 장기 의존성(long-range dependency)를 모두 포착할 수 있도록 구성함</li>
<li>첫 번째 컨볼루션 레이어는 작은 커널을 사용해 미세하고 국소적인 패턴을 포착하고, 
두 번째 레이어는 더 큰 커널을 활용해 넓은 영역의 장기적 의존성을 식별함</li>
</ul>
<h2 id="self-supervised-pretraining"><strong>Self-Supervised Pretraining</strong></h2>
<ul>
<li>Masked Auto Encoder 방식으로 pretrain 함</li>
<li>단일 시간 스텝 단위의 마스킹 방법을 적용하지 않고, 패치 단위로 마스킹 함</li>
<li>입력 시퀀스 패치의 일부를 마스킹한 뒤, TSLANet을 학습시켜 마스킹된 패치를 복원하도록 함</li>
</ul>
<h1 id="실험-결과"><strong>실험 결과</strong></h1>
<h3 id="classification">Classification</h3>
<p><img src="image%206.png" alt="image.png"></p>
<ul>
<li>Transformer 모델은 장기 시계열 데이터 CNN 모델보다 낮은 성능을 보임</li>
</ul>
<h3 id="forecasting"><strong>Forecasting</strong></h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/e8a9c218-529c-4b2e-8abb-dea8c6b1638c/image.png" alt=""></p>
<ul>
<li><strong>비교 모델</strong> :<ul>
<li>Transformer 기반 모델 : iTransformer, PatchTST, Crossformer, FEDformer, Autoformer</li>
<li>MLP 기반 모델 : RLinear, DLinear</li>
<li>범용 시계열 모델 : TimesNet과 GPT4TS</li>
<li>합성곱 기반 예측 모델 : SCINet</li>
<li>LLM 기반 모델 : Time-LLM (Llama-7B)</li>
</ul>
</li>
<li>Time-LLM이 더 높은 성능을 보이지만, 계산 비용은 TSLANet에 비해 훨씬 높음</li>
</ul>
<h3 id="anomaly-detection"><strong>Anomaly Detection</strong></h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/3077812f-15e5-403b-be64-258733298060/image.png" alt=""></p>
<ul>
<li>Transformer 기반 모델들이 이상 탐지에서는 상대적으로 효율성이 떨어짐</li>
<li>TimesNet이나 FEDformer처럼 주기성을 고려하는 모델은 비정상 패턴 탐지에서 뛰어난 성능을 보임</li>
</ul>
<h1 id="5-모델-분석"><strong>5. 모델 분석</strong></h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/a0e8cce5-ff7c-49a3-bd8d-6f3078bb4247/image.png" alt=""></p>
<ul>
<li>Adaptive Spectral Block(ASB)을 제거하면 성능이 크게 저하됨</li>
<li>특히 ASB-L(적응형 로컬 부분)을 제외하면, 잡음이 많은 데이터셋에서 성능 저하가 더욱 두드러짐</li>
<li>pretraining은 하는게 더 좋음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[GitLab] pytest 코드 테스트 적용]]></title>
            <link>https://velog.io/@sy_kim/GitLab-pytest-%EC%BD%94%EB%93%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%81%EC%9A%A9</link>
            <guid>https://velog.io/@sy_kim/GitLab-pytest-%EC%BD%94%EB%93%9C-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%81%EC%9A%A9</guid>
            <pubDate>Thu, 26 Jun 2025 07:07:59 GMT</pubDate>
            <description><![CDATA[<h1 id="ci란"><strong>CI란?</strong></h1>
<ul>
<li><strong>CI(Continuous Integration, 지속적 통합)</strong>는 소프트웨어 개발 과정에서 여러 개발자가 작업한 코드를 자주, 자동으로 통합(merge)하고, 그 과정에서 빌드와 테스트를 자동화해 코드 품질을 높이는 개발 방법론</li>
</ul>
<h3 id="gitlab-ci의-주요-특징과-동작-방식"><strong>GitLab CI의 주요 특징과 동작 방식</strong></h3>
<ul>
<li><p><strong>자동화된 빌드, 테스트, 배포</strong></p>
<p>  새로운 코드를 푸시하거나 머지 리퀘스트를 생성하면, GitLab CI가 자동으로 파이프라인을 실행하여 코드의 빌드, 테스트, 배포 과정을 자동화</p>
</li>
<li><p><strong>구성 파일: .gitlab-ci.yml</strong></p>
<p>  프로젝트의 루트 디렉터리에 <strong><code>.gitlab-ci.yml</code></strong> 파일을 생성해 CI/CD 파이프라인을 정의합니다. 이 파일에는 어떤 작업(Job)을 어떤 순서(Stage)로 실행할지, 어떤 조건에서 실행할지 등을 YAML 형식으로 기술</p>
</li>
<li><p><strong>구성 요소</strong></p>
<ul>
<li><strong>Pipeline</strong>: 전체 자동화 프로세스의 흐름 정의</li>
<li><strong>Stage</strong>: 빌드, 테스트, 배포 등 논리적으로 묶인 작업 단계로, 각 stage를 순차적으로 실행</li>
<li><strong>Job</strong>: 실제로 실행되는 개별 작업(예: 테스트 실행, 빌드 명령 등)으로, 같은 Stage 내의 Job은 병렬 실행 가능</li>
<li><strong>Runner</strong>: ****실제로 Job을 실행하는 에이전트로, GitLab 서버와 별도로 동작하므로 개별 설치 필요</li>
</ul>
</li>
</ul>
<h3 id="ci-도입의-장점"><strong>CI 도입의 장점</strong></h3>
<ul>
<li>코드 변경이 있을 때마다 자동으로 빌드와 테스트가 실행되어, 다양한 문제의 조기 식별 가능</li>
<li>여러 개발자가 동시에 작업해도 통합 과정에서 발생할 수 있는 충돌이나 오류를 신속하게 파악 가능</li>
<li>반복적인 작업(빌드, 테스트, 배포 등)이 자동화되어 개발 효율성 향상</li>
</ul>
<h1 id="코드-테스트란">코드 테스트란?</h1>
<p>코드 테스트는 소프트웨어가 의도한 대로 동작하는지, 오류나 결함이 없는지 확인하기 위해 다양한 방법으로 코드를 검증하는 과정. 테스트는 소프트웨어의 품질을 높이고, 유지보수성을 확보하며, 개발 과정에서 발생할 수 있는 문제를 조기에 발견하는 데 중요한 역할</p>
<h2 id="종류"><strong>종류</strong></h2>
<ol>
<li><strong>단위 테스트(Unit Test)</strong><ul>
<li>가장 작은 코드 단위(함수, 메서드, 클래스 등)를 독립적으로 검증</li>
<li>각 기능이 올바르게 동작하는지 확인하며, 빠르고 반복적으로 실행</li>
<li>예시: add(1, 2)가 3을 반환하는지 확인하는 테스트.</li>
</ul>
</li>
<li><strong>통합 테스트(Integration Test)</strong><ul>
<li>여러 단위(모듈, 클래스 등)를 결합해 상호작용이 정상적으로 이루어지는지 검증</li>
<li>단위별로는 문제없던 코드가, 결합 후 예상치 못한 오류를 내는지 확인</li>
</ul>
</li>
<li><strong>시스템 테스트(System Test)</strong><ul>
<li>전체 시스템이 요구사항대로 동작하는지, 실제 사용 환경에서 검증</li>
<li>사용자의 관점에서 소프트웨어를 테스트하며, 기능 간 상호작용과 전체 흐름 점검</li>
</ul>
</li>
</ol>
<h1 id="unit-test-gitlab-ci-자동화">Unit Test GitLab CI 자동화</h1>
<p>오프라인 환경 기준</p>
<h3 id="1-gitlab-ciyml-생성">1. <strong><code>.gitlab-ci.yml</code> 생성</strong></h3>
<p>프로젝트 루트 디렉토리에 생성</p>
<pre><code class="language-yaml">stages:
  - test

pytest:
  stage: test
  image: pytest:8.1.1
  script:
    - pytest --junitxml=pytest-results.xml
  tags:
      - docker
      - pytest
  artifacts:
    reports:
      junit: pytest-results.xml</code></pre>
<h3 id="2-코드-테스트를-위한-docker-image-생성">2. 코드 테스트를 위한 Docker image 생성</h3>
<pre><code class="language-docker"># Dockerfile
FROM python:3.10.16-slim

# 시스템 패키지 설치
RUN apt-get update &amp;&amp; apt-get install -y \
    gcc \
    g++ \
    build-essential \
    &amp;&amp; rm -rf /var/lib/apt/lists/*

# requirements.txt 설치
COPY requirements.txt .
RUN pip install --upgrade pip &amp;&amp; pip install -r requirements.txt &amp;&amp; \
    pip cache purge</code></pre>
<pre><code># requirements.txt
pandas==2.3.0
numpy==2.2.6
scikit-learn==1.7.0
torch==2.6.0
torchaudio==2.6.0
torchvision==0.21.0
tensorboard==2.19.0
tensorboardX==2.6.4
ray[default]==2.43.0
mlflow==2.20.4
click==8.1.7
pydantic==2.10.6
h5py==3.13.0
pytest==8.1.1</code></pre><pre><code class="language-bash"># Docker image 옮기기
docker save -o pytest.tar pytest:8.1.1
scp -P &lt;PORT&gt; pytest.tar sungyunkim@&lt;IP&gt;:&lt;DIR&gt;
docker load -i pytest.tar</code></pre>
<h3 id="3-gitlab-runner-등록">3. gitlab-runner 등록</h3>
<pre><code class="language-bash">sudo vi mlops/gitlab-runner/config.toml</code></pre>
<pre><code class="language-toml">[[runners]]
  name = &quot;automl_runner&quot;
  url = &quot;http://&lt;IP:PORT&gt;&quot;
  id = ID
  token = &quot;TOKEN&quot;
  token_obtained_at = 2025-06-26T05:57:34Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = &quot;docker&quot;
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = &quot;pytest:8.1.1&quot;
    pull_policy = &quot;never&quot;
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = [&quot;/cache&quot;]
    shm_size = 0
    network_mtu = 0
</code></pre>
<pre><code class="language-bash"># 실행이 잘 안되면
docker exec -it gitlab-runner /bin/bash
gitlab-runner run</code></pre>
<h3 id="mr-성공-예시">MR 성공 예시</h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/6cf7cffa-d011-4922-b1e8-5c0199c43652/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Git] Code Formatter ]]></title>
            <link>https://velog.io/@sy_kim/Git-Code-Formatter</link>
            <guid>https://velog.io/@sy_kim/Git-Code-Formatter</guid>
            <pubDate>Thu, 26 Jun 2025 01:45:57 GMT</pubDate>
            <description><![CDATA[<h1 id="code-formatter-란">Code Formatter 란?</h1>
<ul>
<li><strong>코드 포매터(Code Formatter)</strong>는 개발자가 작성한 소스 코드를 미리 정해진 코딩 스타일(코딩 컨벤션)에 따라 자동으로 정렬하고, 들여쓰기, 공백, 괄호 위치, 줄바꿈 등 형식을 일관되게 맞춰주는 도구</li>
</ul>
<h3 id="코드-포매터의-주요-목적"><strong>코드 포매터의 주요 목적</strong></h3>
<ul>
<li>가독성 향상</li>
<li>코드 스타일 통일</li>
<li>비생산적인 반복작업 감소</li>
<li>코드 리뷰 효율화</li>
</ul>
<h2 id="gitlab-ci에-적용하기">GitLab CI에 적용하기</h2>
<ul>
<li>제한사항 : GitLab CI에서는 직접 Formatter를 적용할 수 없고, Formatter가 적용 되었는지 확인만 가능</li>
<li>따라서 pre-commit hook 을 사용하여 local 환경에서 commit 전에 Formatter를 구축하고자 함</li>
</ul>
<h2 id="pre-commit-을-사용한-코드-포맷터-적용하기">pre-commit 을 사용한 코드 포맷터 적용하기</h2>
<ul>
<li><code>git commit</code> 명령을 입력하면 실제 커밋이 생성하기 전 hook이 먼저 실행하여, 코드에 대한 검사나 자동화 작업을 수행 할 수 있음</li>
<li>주요 특징<ul>
<li>커밋 전에 코드 스타일 검사(lint), 포매팅, 테스트, 파일 검사 등 다양한 작업 자동화</li>
<li>pre-commit hook이 실패(비정상 종료)하면 커밋이 중단되어, 코드 품질이나 규칙 위반 방지</li>
<li><strong><code>git commit --no-verify</code></strong> 옵션을 사용하면 일시적으로 hook 실행을 건너뛸 수 있음</li>
</ul>
</li>
</ul>
<h3 id="pre-commit-hook-사용-방법">pre-commit hook 사용 방법</h3>
<ol>
<li><p><strong><code>pip install pre-commit</code></strong></p>
</li>
<li><p><strong><code>pip install black</code></strong></p>
</li>
<li><p>프로젝트 루트에 <strong><code>.pre-commit-config.yaml</code></strong> 파일을 만들어 어떤 검사/포매터를 적용할지 정의</p>
<pre><code class="language-yaml"> # .pre-commit-config.yaml 예시
 repos:
   - repo: local
     hooks:
       - id: black
         name: black
         entry: black
         language: system
         types: [python]</code></pre>
</li>
<li><p><strong><code>pre-commit install</code></strong> 명령으로 hook을 활성화하면, 이후 커밋 때마다 자동으로 설정된 작업이 실행됨</p>
</li>
<li><p>최초 적용시 수동으로 파일 검사 실시</p>
<pre><code class="language-bash"> pre-commit run --all-files</code></pre>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Docker] Volume & Network]]></title>
            <link>https://velog.io/@sy_kim/Docker-Volume-Network</link>
            <guid>https://velog.io/@sy_kim/Docker-Volume-Network</guid>
            <pubDate>Fri, 11 Apr 2025 01:25:23 GMT</pubDate>
            <description><![CDATA[<h1 id="volume">Volume</h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/15cba7cc-aa01-4aa4-a6e9-75a3b83481b5/image.webp" alt=""></p>
<figcaption style="text-align:center; font-size:15px; color:#808080; margin-top:40px">
    "출처 https://semaphore.io/blog/docker-volumes"
  </figcaption>


<p>도커에서는 호스트 PC의 데이터에 접근하기 위해 Volume과 Bind mount 두 가지 방식을 사용함.</p>
<p>그 외 컨테이너 내부에서 생성한 데이터는 컨테이너 삭제 시 함께 삭제됨</p>
<h2 id="docker-volume">Docker Volume</h2>
<p><strong>볼륨</strong>은 도커가 직접 관리하는 스토리지입니다. 도커 엔진이 <strong><code>/var/lib/docker/volumes/</code></strong> 디렉토리에 데이터를 저장하며, 컨테이너와 독립적으로 데이터를 유지할 수 있습니다.</p>
<ul>
<li><strong>도커 관리</strong>: 볼륨은 도커 CLI 및 API를 통해 생성, 삭제, 관리할 수 있습니다.</li>
<li><strong>운영체제 독립성</strong>: 호스트 OS에 의존하지 않아 백업과 마이그레이션이 용이합니다.</li>
<li><strong>안전한 공유</strong>: 여러 컨테이너 간에 데이터를 안전하게 공유할 수 있습니다.</li>
<li><strong>유연성</strong>: 볼륨 드라이버를 통해 원격 스토리지나 클라우드에 데이터를 저장하거나 암호화 기능을 추가할 수 있습니다.</li>
</ul>
<pre><code class="language-bash"># 볼륨 생성
docker volume create my_volume

# 볼륨 마운트
docker run -d -v my_volume:/app/data nginx</code></pre>
<h2 id="bind-mount">Bind mount</h2>
<p><strong>바인드 마운트</strong>는 호스트 시스템의 특정 디렉토리나 파일을 컨테이너 내부에 연결(mount)하는 방식입니다. 호스트 파일 시스템의 절대 경로를 사용해야 하며, 도커가 아닌 사용자가 직접 관리합니다.</p>
<ul>
<li><strong>호스트 의존성</strong>: 호스트 OS 파일 시스템 구조에 의존적입니다.</li>
<li><strong>직접 접근 가능</strong>: 호스트와 컨테이너 간에 실시간으로 데이터를 동기화할 수 있습니다.</li>
<li><strong>보안 위험</strong>: 컨테이너 내 프로세스가 호스트 파일 시스템을 수정할 수 있어 보안 문제가 발생할 수 있습니다.</li>
<li><strong>개발 환경 적합</strong>: 로컬 개발 환경에서 소스 코드 변경 내용을 즉시 반영하기에 유리합니다.</li>
</ul>
<pre><code class="language-bash"># 바인드 마운트
docker run -d -v /path/on/host:/app/data nginx</code></pre>
<h2 id="비교">비교</h2>
<table>
<thead>
<tr>
<th><strong>특징</strong></th>
<th><strong>볼륨 (Volume)</strong></th>
<th><strong>바인드 마운트 (Bind Mount)</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>관리 주체</strong></td>
<td>도커가 관리</td>
<td>사용자가 직접 관리</td>
</tr>
<tr>
<td><strong>저장 위치</strong></td>
<td><strong><code>/var/lib/docker/volumes/</code></strong></td>
<td>호스트 파일 시스템의 지정된 경로</td>
</tr>
<tr>
<td><strong>운영체제 의존성</strong></td>
<td>운영체제 독립적</td>
<td>운영체제 및 파일 시스템 구조에 의존적</td>
</tr>
<tr>
<td><strong>보안성</strong></td>
<td>상대적으로 안전</td>
<td>보안 위험 존재 (호스트 파일 시스템 수정 가능)</td>
</tr>
<tr>
<td><strong>사용 용도</strong></td>
<td>데이터 영속성 및 여러 컨테이너 간 데이터 공유</td>
<td>로컬 개발 환경에서 코드 동기화 및 테스트</td>
</tr>
<tr>
<td><strong>CLI 지원 여부</strong></td>
<td>도커 CLI로 생성, 삭제, 관리 가능</td>
<td>도커 CLI로 직접적인 관리 불가</td>
</tr>
</tbody></table>
<h1 id="network">Network</h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/65cdf388-17cd-4110-82fc-aca7073cfc11/image.jpg" alt=""></p>
<figcaption style="text-align:center; font-size:15px; color:#808080; margin-top:40px">
    "출처 https://blog.octo.com/how-does-it-work-docker-part-2-swarm-networking"
  </figcaption>

<h2 id="local-network"><strong>Local Network</strong></h2>
<p><strong>로컬 네트워크</strong>는 같은 도커 호스트 내에서 실행 중인 컨테이너 간 통신을 가능하게 하는 기본적인 네트워크 유형입니다. 이는 주로 브리지(Bridge) 네트워크 드라이버를 사용합니다.</p>
<ul>
<li><strong>격리된 통신</strong>: 기본적으로 외부에서는 접근할 수 없으며, 같은 네트워크에 연결된 컨테이너들만 통신 가능합니다.</li>
<li><strong>컨테이너 이름 기반 통신</strong>: IP 주소 대신 컨테이너 이름으로 통신할 수 있습니다.</li>
<li><strong>사용 사례</strong>: 단일 호스트 내에서 실행되는 애플리케이션의 여러 컴포넌트 간 통신.</li>
</ul>
<pre><code class="language-bash"># 사용자 정의 브리지 네트워크 생성
docker network create my_bridge

# 컨테이너 실행 시 네트워크 연결
docker run -d --name app1 --network my_bridge nginx
docker run -d --name app2 --network my_bridge redis</code></pre>
<p>위의 경우, <strong><code>app1</code></strong>과 <strong><code>app2</code></strong>는 <strong><code>my_bridge</code></strong> 네트워크를 통해 서로 통신할 수 있습니다.</p>
<h2 id="bind-network"><strong>Bind Network</strong></h2>
<p><strong>바인드 네트워크</strong>는 도커 컨테이너가 호스트의 네트워크 스택을 직접 사용하는 방식입니다. 이는 <strong><code>host</code></strong> 드라이버를 사용하여 설정됩니다.</p>
<ul>
<li><strong>호스트와 동일한 네트워크 환경</strong>: 컨테이너가 호스트 머신의 IP 주소와 포트를 공유합니다.</li>
<li><strong>성능 최적화</strong>: 추가적인 가상화 계층이 없으므로 성능이 뛰어납니다.</li>
<li><strong>보안 제한</strong>: 컨테이너와 호스트 간 격리가 없기 때문에 보안성이 낮습니다.</li>
<li><strong>사용 사례</strong>: 고성능이 중요한 애플리케이션이나 테스트 환경.</li>
</ul>
<pre><code class="language-bash"># 호스트 네트워크를 사용하는 컨테이너 실행
docker run --net=&quot;host&quot; nginx</code></pre>
<p>위 명령어로 실행된 컨테이너는 호스트의 IP 주소와 포트를 그대로 사용합니다.</p>
<h2 id="overlay-network"><strong>Overlay Network</strong></h2>
<p>오버레이 네트워크는 여러 도커 호스트에 걸쳐 있는 컨테이너들 간의 통신을 가능하게 하는 가상 네트워크입니다. 이는 Docker Swarm 또는 Kubernetes와 같은 오케스트레이션 툴과 함께 사용됩니다.</p>
<ul>
<li><strong>멀티 호스트 지원</strong>: 여러 호스트에 분산된 컨테이너를 하나의 논리적 네트워크로 연결합니다.</li>
<li><strong>VXLAN 기반 통신</strong>: VXLAN 기술을 사용해 캡슐화된 패킷을 전송합니다.</li>
<li><strong>확장성</strong>: 대규모 분산 시스템에서 유용합니다.</li>
<li><strong>사용 사례</strong>: 마이크로서비스 아키텍처, 클러스터링 환경.</li>
</ul>
<pre><code class="language-bash"># Docker Swarm 초기화
docker swarm init

# 오버레이 네트워크 생성
docker network create -d overlay my_overlay

# 오버레이 네트워크를 사용하는 서비스 생성
docker service create --name web --network my_overlay nginx</code></pre>
<p>여러 노드에 걸쳐 있는 컨테이너들이 <strong><code>my_overlay</code></strong>를 통해 서로 통신할 수 있습니다.</p>
<h2 id="비교-1"><strong>비교</strong></h2>
<table>
<thead>
<tr>
<th><strong>특징</strong></th>
<th><strong>로컬 네트워크</strong></th>
<th><strong>바인드 네트워크</strong></th>
<th><strong>오버레이 네트워크</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>적용 범위</strong></td>
<td>단일 도커 호스트</td>
<td>단일 도커 호스트</td>
<td>여러 도커 호스트</td>
</tr>
<tr>
<td><strong>격리 수준</strong></td>
<td>높은 격리</td>
<td>격리 없음</td>
<td>높은 격리</td>
</tr>
<tr>
<td><strong>성능</strong></td>
<td>일반적</td>
<td>매우 우수</td>
<td>분산 환경에서 우수</td>
</tr>
<tr>
<td><strong>사용 사례</strong></td>
<td>단일 서버 애플리케이션</td>
<td>고성능 애플리케이션</td>
<td>마이크로서비스 및 클러스터링</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] PatchTST]]></title>
            <link>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PatchTST</link>
            <guid>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-PatchTST</guid>
            <pubDate>Tue, 08 Apr 2025 11:44:38 GMT</pubDate>
            <description><![CDATA[<h1 id="a-time-series-is-worth-64-words-long-term-forecasting-with-transformers">A TIME SERIES IS WORTH 64 WORDS: LONG-TERM FORECASTING WITH TRANSFORMERS</h1>
<p><a href="https://arxiv.org/pdf/2211.14730">https://arxiv.org/pdf/2211.14730</a>
<a href="https://github.com/yuqinie98/PatchTST">https://github.com/yuqinie98/PatchTST</a></p>
<h1 id="introduction">Introduction</h1>
<h2 id="목표"><strong>목표</strong></h2>
<p>다변량 시계열 예측 및 자기 지도 표현 학습을 위한 Transformer 기반 모델 설계</p>
<h2 id="논문의-제안--patchtst"><strong>논문의 제안 : PatchTST</strong></h2>
<ul>
<li><p><strong>Patching</strong>
시계열 데이터를 패치로 분할하여 Transformer에 입력 토큰으로 제공함
단일 시간 포인트 데이터는 문맥적 의미 정보를 유지하지 못하기 때문에 패치를 통해 지역적 의미 정보를 강화하고 전역적인 의미 정보를 포착함</p>
</li>
<li><p><strong>Channel-independence</strong>
각 채널이 동일한 임베딩과 Transformer 가중치를 공유함
다중 채널을 가지는 다변량 시계열 데이터의 채널 독립성은 각 입력 토큰이 단일 채널의 정보만 가지도록 하는 방식임</p>
</li>
</ul>
<h2 id="pathtst의-장점"><strong>PathTST의 장점</strong></h2>
<ul>
<li><p><strong>시간 및 공간 복잡성 감소:</strong> 기존 Transformer는 입력 토큰 수 N에 대해 복잡도가 $O(N^2)$ 이지만,  패칭을 적용하면 $N≈L/S$ 로 크게 줄일 수 있음.</p>
</li>
<li><p><strong>longer look-back window 학습 능력:</strong> <strong>look-back window 길이</strong> ($L$)을 늘리면 MSE를 0.518에서 0.397로 감소시킬 수 있는데, 패칭을 통해 입력 토큰 길이를 줄이는 방식을 통해 효과적으로 $L$ 길이를 늘릴 수 있음</p>
  <aside>
  💡

<p>  look-back window</p>
<p>  시계열 예측 모델에 입력으로 제공되는 과거 데이터의 길이 </p>
<p>  모델이 미래 값을 예측하기 위해 참고하는 과거 데이터의 범위를 나타냄</p>
  </aside>
</li>
<li><p><strong>표현 학습 능력:</strong> Self-Supervised Learing 활용하여 선형 모델보다 더 높은 표현력을 학습함</p>
</li>
</ul>
<h1 id="related-work">Related Work</h1>
<h2 id="patch-in-transformer"><strong>Patch in Transformer</strong></h2>
<ul>
<li><p>BERT (NLP) : character(문자) 기반 토크나이제이션 대신 subword 기반 토크나이제이션을 적용함</p>
</li>
<li><p>ViT (CV) : 이미지를 16×16 패치로 분할하여 Transformer에 입력함</p>
</li>
<li><p>BEiT, MAE와 같은 최신 작업은 모두 패치를 입력으로 사용함</p>
</li>
</ul>
<h2 id="transformer-based-long-term-time-series-forecasting"><strong>Transformer-based Long-term Time Series Forecasting</strong></h2>
<p>기존 어텐션 메커니즘의 복잡성을 줄여 롱 시퀀스에서 더 좋은 성능을 보였으나, 대부분의 모델에서 point-wise 어텐션을 사용함.</p>
<ul>
<li><p><strong>LogTrans</strong> : 컨볼루션 셀프 어텐션 레이어와 LogSparse 설계를 사용하여 키와 쿼리 간 point-wise 곱셈을 피했지만, 여전히 단일 타임 포인트에 기반한 설계임</p>
</li>
<li><p><strong>Autoformer</strong> : decomposition &amp; auto-correlation 아이디어를 차용하여 전통적인 시계열 분석 방법론을 통합하였음. 패치 수준의 관계 정보를 위해 auto-correlation을 사용하지만, 완전 자동화된 설계를 달성하지 못함</p>
</li>
<li><p><strong>Triformer</strong> : 패치 어텐션을 제안했지만, 이는 패치 내 의미적 중요성을 드러내거나 입력 단위로 취급하지 않고 단순히 pseudo timestamp를 쿼리로 사용하는 방식임</p>
</li>
</ul>
<h1 id="method">Method</h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/7588bce9-b4d9-4a01-8993-347fe92fd33c/image.png" alt=""></p>
<ul>
<li><p><strong>문제 정의:</strong> 다변량 시계열 샘플 집합의 각 샘플 look-back window $L$ $(x_1, ..., x_L)$이 주어졌을 때, 미래 $T$개의 값 $(x_{L+1}, ..., x_{L+T})$을 예측함
($x_t$ : $t$ 시간에서의 $M$ 차원 벡터)</p>
</li>
<li><p>인코더 구조는 vanilla Transformer를 사용함</p>
</li>
</ul>
<h2 id="model-structure">Model Structure</h2>
<h3 id="forward-process"><strong>Forward Process</strong></h3>
<ol>
<li><p>$i$-번째 채널의 길이가 $L$인 단일 변수 시계열을 $x^{(i)}_{1:L} = (x^{(i)}_1, ..., x^{(i)}_L)$ 로 정의함
$(i = 1, ..., M)$</p>
</li>
<li><p>$M$개의 단일 변수 시계열로 분할된 입력 $(x_1, ..., x_L)$은 Transformer 백본에 독립적으로 입력하고, 예측 결과( $\hat{x}^{(i)} = (\hat{x}^{(i)}<em>{L+1}, ..., \hat{x}^{(i)}</em>{L+T}) \in \mathbb{R}^{1\times T}$) 를 얻음.</p>
</li>
</ol>
<h3 id="patching"><strong>Patching</strong></h3>
<p>패치를 사용하면 입력 토큰 수가 $L/S$ 로 줄어들며, 이는 메모리 사용량과 attention 연산의 복잡도를 크게 줄입니다($S$ 비율만큼 감소). 따라서 더 긴 데이터를 처리할 수 있어 예측 성능이 향상됨</p>
<p>각 단일 변수 시계열 $x^{(i)}$는 overlapped 패치 또는 non-overlapped 패치로  나뉨.</p>
<ul>
<li><p>패치 길이를 $P$, 스트라이드를 $S$라고 할때, 패치 개수 $N = \lfloor (L - P)/S + 1\rfloor$인,
패치 시퀀스 생성 : $x_p^{(i)} \in \mathbb{R}^{P\times N}$</p>
</li>
<li><p>패치화 하기 전에 원래 시퀀스의 끝에 마지막 값 $x_L^{(i)} \in \mathbb{R}$ 을 $S$번 반복하여 패딩</p>
</li>
</ul>
<h3 id="transformer-encoder"><strong>Transformer Encoder</strong></h3>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/e8341a72-5eb1-408b-b967-788e52d57eb2/image.png" alt=""></p>
<ul>
<li><p>패치화된 데이터는 learnable linear projection ($W_p \in \mathbb{R}^{D\times P}$) 과 포지션 인코딩($W_{pos} \in \mathbb{R}^{D\times N}$)을 통해  $D$ 차원의 Transformer 잠재 공간으로 매핑됨. 
$x^{(i)}<em>d = W_p x^{(i)}_p + W</em>{pos}$,   $x^{(i)}_d \in \mathbb{R}^{D\times N}$</p>
</li>
<li><p>멀티 헤드 어텐션의 각 헤드($h = 1, ..., H$)는  Query, Key, Value 행렬로 변환됨</p>
<ul>
<li><p>Query : $Q_h^{(i)} = (x^{(i)}_d)^T W^Q_h$,  ($W^Q_h \in \mathbb{R}^{D\times d_k}$)</p>
</li>
<li><p>Key : $K_h^{(i)} = (x^{(i)}_d)^T W^K_h$,  ($W^K_h \in \mathbb{R}^{D\times d_k}$)</p>
</li>
<li><p>Value : $V_h^{(i)} = (x^{(i)}_d)^T W^V_h$,  ($W^V_h \in \mathbb{R}^{D\times D}$)</p>
</li>
</ul>
</li>
<li><p>scaled dot-product 어텐션을 사용하여 최종 출력 $O_h^{(i)} \in \mathbb{R}^{D \times N}$ 계산</p>
</li>
</ul>
<p>$$
(O_h^{(i)})^T = \text{Attention}(Q_h^{(i)}, K_h^{(i)}, V_h^{(i)}) = \text{Softmax}(\frac{Q_h^{(i)}(K_h^{(i)}) ^T}{\sqrt{d_k}}) V_h^{(i)}
$$</p>
<h3 id="loss-function"><strong>Loss Function</strong></h3>
<p>예측과 실제 값 간 차이를 측정하기 위해 평균 제곱 오차(MSE)를 사용함</p>
<p>$$
L = \mathbb{E}<em>x\frac{1}{M}\sum</em>{i=1}^M ||\hat{x}<em>{L+1:L+T}^{(i)} - x</em>{L+1:L+T}^{(i)}||_2^2
$$</p>
<h3 id="instance-normalization">Instance Normalization</h3>
<ul>
<li><p>훈련 데이터와 테스트 데이터 간 분포 이동 문제를 완화하기 위해 인스턴스 정규화를 적용함</p>
</li>
<li><p>각 시계열 인스턴스를 Z-score(평균 0, 표준편차 1) 정규화함</p>
</li>
<li><p>패치화 하기 전에 정규화를 하고, 예측 출력에 다시 평균과 표준편차를 더함</p>
</li>
</ul>
<h2 id="representation-learning">Representation Learning</h2>
<h3 id="단일-시간-포인트-masked-encoder-문제점"><strong>단일 시간 포인트 Masked Encoder 문제점</strong></h3>
<ol>
<li><strong>단일 시간 단계 수준에서의 마스킹</strong><ul>
<li>마스킹된 단일 데이터 포인트 값은 전후 값들의 상관 관계를 통해 쉽게 추론할 수 있음.</li>
<li>전체 시퀀스에 대한 높은 수준의 이해를 학습하지 못함</li>
</ul>
</li>
<li><strong>출력 레이어 설계 문제</strong><ul>
<li>모든 $L$ 시간에 해당하는 표현 벡터 $z_t ∈ \R^D$를 출력 레이어에 매핑하려면,  $M$개의 변수 각각이 예측 길이 $T$를 가지는 linear map은 $(L⋅D)×(M⋅T)$ 크기의 매개변수 행렬 $W$가 필요함</li>
<li>이런 행렬에서는 하나의 요소라도 값이 너무 커지면 과대 설계될 가능성이 있으며, 다운스트림 학습 샘플이 부족할 경우 오버피팅을 초래할 수 있음</li>
</ul>
</li>
</ol>
<h3 id="patchtst"><strong>PatchTST</strong></h3>
<ul>
<li>prediction head는 제거하고, $D×P$ 사이즈의 선형 레이어로 대체 함.</li>
<li>겹치는 부분 없이 패치화 하여 마스킹된 패치 정보가 혼합 되지 않도록 보장함</li>
<li>패치 인덱스를 무작위로 선택하여 0으로 마스킹하고, 모델은 MSE 손실을 사용하여 마스킹된 패치를 복원하도록 훈련함</li>
<li>각 시계열이 공유된 가중치 메커니즘을 통해 상호 학습되는 고유한 잠재 표현(latent representation)을 가지게 됨</li>
</ul>
<h1 id="experiments">Experiments</h1>
<h3 id="hyper-parameters">Hyper-parameters</h3>
<ul>
<li>Patch : 입력 시퀀스 길이는 512, 패치 크기는 12로 세팅해서 총 42개의 non-overlapped 패치 생성</li>
<li>Masking : 패치의 40%를 0값으로 마스킹</li>
<li>100 에포크 동안 SSL 학습</li>
</ul>
<h3 id="fine-tuning">Fine-tuning</h3>
<p>사전 학습된 모델이 준비되면, 학습된 표현을 평가하기 위해 두 가지 방식으로 지도 학습을 진행하였음</p>
<ul>
<li><strong>Linear probing</strong> : 모델에서 헤드를 제외한 나머지 부분은 고정(freeze)하고, 20 에포크 동안 학습</li>
<li><strong>End-to-end fine-tuning</strong>: 모델 헤드를 업데이트하기 위해 먼저 선형 프로빙을 10 에포크 동안 수행한 후, 전체 모델을 20 에포크 동안 학습</li>
</ul>
<h3 id="comparison-with-supervised-methods">Comparison with Supervised Methods</h3>
<ul>
<li><p>아래 표는 PatchTST(fine-tunning, linear probing, 처음부터 지도 학습)와 다른 지도 학습 방법의 성능을 비교함</p>
<p>  <img src="https://velog.velcdn.com/images/sy_kim/post/6b75d14a-315d-4b1a-a79f-e0e3f4aece15/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>대규모 데이터셋에서 사전 학습 절차는 처음부터 지도 학습하는 것보다 더 좋은 성능을 보임</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Bimodal Masked Autoencoders]]></title>
            <link>https://velog.io/@sy_kim/Bimodal-Masked-Autoencoders</link>
            <guid>https://velog.io/@sy_kim/Bimodal-Masked-Autoencoders</guid>
            <pubDate>Tue, 08 Apr 2025 06:05:49 GMT</pubDate>
            <description><![CDATA[<h1 id="abstract">Abstract</h1>
<p>ECG 분류를 위한 Bimodal Masked autoencoders with Internal Representation Connection (BMIRC)</p>
<ol>
<li>주파수 스펙트럼을 MAE 사전 학습에 통합하여 ECG에 대한 포괄적인 이해 강화</li>
<li>Internal Representation Connections (IRC)을 설정하여 인코더와 디코더의 표현을 연결하여, 디코더의 수행 능력 향상</li>
</ol>
<h1 id="introduction">Introduction</h1>
<ol>
<li>목표</li>
</ol>
<ul>
<li>ECG 심장 부정맥 감지를 위한 Self-supervised Learning</li>
</ul>
<ol>
<li>Maked Autoencoders<ul>
<li>MAE는 원본 데이터의 잠재적 특성을 탐색하여 모델이 이러한 판별 가능한 세부 사항을 학습하도록 돕습니다.</li>
<li>인코딩 과정에서 점점 더 높은 수준의 정보로 표현하고, 디코딩을 통해 다시 저 수준 정보로 변환함. 그러나 인코더가 재구성에 지나치게 집중하게 되어 고수준 판별 표현을 학습하는 능력을 제한하게 되는 문제점이 있음</li>
</ul>
</li>
<li>BMIRC<ul>
<li>이산 푸리에 변환(DFT)을 사용하여 ECG를 주파수 스펙트럼으로 변환하고, 이를 독립적인 모달리티로 간주하여 타임 도메인 데이터를 보완함</li>
<li>Gated Representation Mixer (GRM)을 도입하여 인코더의 중간 레이어에서 추출한 표현을 디코더의 다양한 레이어에서 융합시킴. 이 과정을 IRC라고 명명함. 이 과정을 통해 디코더에게 다양한 수준의 정보를 제공하여 재구성을 지원하고, 인코더는 고수준의 판별 표현을 획득하도록 장려함</li>
</ul>
</li>
</ol>
<h1 id="related-works">Related Works</h1>
<h2 id="1-contrastive-learning-based-paradigm">1. Contrastive Learning based paradigm</h2>
<p>CL은 불변성 제약 조건(imposition of invariance constraints)을 부여하여 표현 학습에 집중</p>
<ol>
<li>Time-Frequency Consistency(TF-C)<ul>
<li>시간-주파수 도메인 간 일관성을 가정하며, 동일 샘플의 시간-주파수 도메인 표현 간 격차를 줄임으로써 사전 학습을 수행</li>
<li><a href="https://proceedings.neurips.cc/paper_files/paper/2022/file/194b8dac525581c346e30a2cebe9a369-Paper-Conference.pdf">https://proceedings.neurips.cc/paper_files/paper/2022/file/194b8dac525581c346e30a2cebe9a369-Paper-Conference.pdf</a></li>
</ul>
</li>
<li>Contrastive Predictive Coding(CPC)<ul>
<li>시간적 불변성을 강조하며, 후속 시간 단계에서 표현을 예측</li>
<li><a href="https://arxiv.org/pdf/1807.03748">https://arxiv.org/pdf/1807.03748</a></li>
</ul>
</li>
<li>Time-Series Representation Learning Framework via Temporal and Contextual Contrasting(TS-TCC) <ul>
<li>시간적 불변성을 강조하며, 서로 다른 뷰에서 동일 시간 범위의 표현 간 유사성을 극대화하려고 합니다.</li>
<li><a href="https://arxiv.org/pdf/2106.14112">https://arxiv.org/pdf/2106.14112</a></li>
</ul>
</li>
<li>Universal Time Series Representation Learning(TimesURL)<ul>
<li>은 시간-주파수 기반 증강 기법을 도입하여 시간적 속성을 보존하며, 대조 학습과 결합된 최적화 목표를 통해 세그먼트 수준 및 인스턴스 수준 정보를 캡처</li>
<li><a href="https://arxiv.org/pdf/2312.15709">https://arxiv.org/pdf/2312.15709</a></li>
</ul>
</li>
</ol>
<h2 id="2-masked-data-modeling-based-paradigm">2. Masked data modeling based paradigm</h2>
<p>오토인코더를 사용하여 마스킹 되지 않은 데이터를 기반으로 마스킹된 데이터를 재구성하는 학습</p>
<ol>
<li>Patch Time Series Transformer(PatchTST)<ul>
<li>시계열 데이터를 겹치지 않는 패치로 분할하여 학습</li>
<li><a href="https://arxiv.org/pdf/2211.14730">https://arxiv.org/pdf/2211.14730</a></li>
</ul>
</li>
<li>Time Series Masked Autoencoders(TimeMAE)<ul>
<li>시계열 데이터를 겹치지 않는 패치로 분할하여 학습</li>
<li><a href="https://arxiv.org/pdf/2303.00320">https://arxiv.org/pdf/2303.00320</a></li>
</ul>
</li>
</ol>
<h1 id="method">Method</h1>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/11941a49-650a-4693-b419-b433f9ba5c8a/image.png" alt=""></p>
<ol>
<li>데이터셋이 원본 ECG만 제공한다고 가정할 때</li>
<li>ECG와 주파수 스펙트럼의 패치 임베딩(시간-주파수 패치 임베딩) 생성</li>
<li>사전 학습 단계에서는 마스킹 후 시간-주파수 패치 임베딩이 이중 모달 공동 인코더(bimodal joint encoder)에 입력</li>
<li>모달리티별 디코더를 사용하여 내부 표현 연결(IRC)을 통해 마스킹된 데이터를 재구성합니다.</li>
<li>미세 조정 단계에서는 디코더가 global average pooling layer와 linear layer로 구성된 분류기로 대체</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/faaa7a0b-1be2-4d1d-ae07-d4d183071d29/image.png" alt=""></p>
<h2 id="1-time-frequency-patch-embedding">1. Time-Frequency Patch Embedding</h2>
<h3 id="discrete-fourier-transform-dft">Discrete Fourier Transform (DFT)</h3>
<p>$$
f_i(k) = \text{DFT}[t_i] = \sum_{n=0}^{N-1} t_i(n) \cdot e^{-j\frac{2\pi}{N}kn}, \quad k = 0, 1, \dots, N-1
$$</p>
<ul>
<li><p><em>n</em>은 시간 지점의 인덱스를 나타내고, <em>k</em>는 ECG 내 다양한 주파수</p>
</li>
<li><p>안티 앨리어싱(aliasing)을 방지하기 위해 DFT 변환 간격 <em>N</em> 의 길이는 ECG 길이 <em>L</em> 보다 크거나 같음 (<em>N</em>=<em>L</em>)</p>
</li>
<li><p>주파수 스펙트럼의 대칭성을 고려하여 $f_i$의 첫 번째 절반을 선택하여 중복성을 줄임 ($f_i^∗∈R^{L/2}$)</p>
</li>
</ul>
<h3 id="patch-embedding">Patch Embedding</h3>
<ul>
<li><p>대부분의 방법이 시계열 데이터를 점 단위(point-by-point) 방식으로 처리하는 상황에서, 패치를 기반으로 한 모델링의 효과가 입증되었음. 마스킹된 포인트를 추론하는 것보다 마스킹된 영역을 학습하는 것이 더 어려운 태스크이며, 패치 기반 재구성 태스크는은 사전 학습된 모델이 더 많은 잠재적인 정보를 학습하도록 유도함</p>
</li>
<li><p>ECG(심전도)와 주파수 스펙트럼을 중첩되지 않는(non-overlapping) 패치로 나누어 인코딩함
$T=[t_1,t_2,…,t_C]∈\R^{L×C}$ , $F=[f_1^∗,f_2^∗,…,f_C^∗]∈\R^{L/2×C}$<br>(<em>C</em>는 ECG 리드(lead)의 개수)</p>
</li>
<li><p>두 가지 1D 컨볼루션 레이어를 사용하여 두 가지 모달리티에서 패치를 인코딩</p>
</li>
<li><p>컨볼루션 커널 크기는 <em>S</em>×<em>C</em> 이고 stride는 <em>S</em> 로 설정되어, 개별 패치의 독립성 보장
(각 패치의 길이는 <em>S</em> )</p>
</li>
<li><p>MAE(Masked Autoencoder)를 따르며, 패치 임베딩은 토큰으로 표시되며 각 토큰은 특정 패치에 대한 임베딩에 해당합니다. T와 F의 토큰은 각각 다음과 같이 표현됩니다:
$Z_t=[z^t_1,z^t_2,...,z^t_{L/S}]∈\R^{L/S×D},Z_f=[z^f_1,z^f_2,...,z^f_{L/2S}]∈\R^{L/2S×D}$
(<em>D</em>는 컨볼루션 커널의 수. 즉, 각 모달리티의 임베딩 차원)</p>
</li>
<li><p>명확성을 위해 ECG와 주파수 스펙트럼은 이후 섹션에서 각각 $t$ 와 $f$로 표시함
시간 및 주파수 모달리티에서 얻어진 토큰 수는 $N_t=L/S,N_f=L/2S$</p>
</li>
</ul>
<h2 id="2-bimodal-joint-encoder">2. Bimodal joint encoder</h2>
<ul>
<li><p>모든 인코더는 동일한 구조의 Transformer 임.</p>
</li>
<li><p>learnable position embeddings ($PE_m \in \R^{N_m \times D}$)과 패치 임베딩 합연산
$\tilde{I}_m = Z_m + PE_m$</p>
</li>
<li><p>학습 가능한 전역 토큰 ($z^m_g \in \R^D$)이 각 모달리티에 도입되며, 여기서 &quot;g&quot;는 &quot;global&quot;을 나타내며 전역 정보 추출을 용이하게 함. 마지막으로 모달리티 $m∈{t,f}$에 대해 입력 토큰 $I_m∈\R^{N_m×D}$는 다음과 같이 표현됨
$I_m = \text{Concat}(z_g^m, \tilde{I}_m)$t</p>
</li>
</ul>
<h3 id="masking-strategy">Masking strategy</h3>
<ul>
<li><p>각 토큰이 동일한 확률로 랜덤하게 마스킹 되는 랜덤 마스킹 전략 채택하여, 다양한 배치와 에포크에서 수행되는 재구성 작업에 변동성이 생기게 만들었음</p>
</li>
<li><p>시간 및 주파수 모달리티의 데이터 특성이 다르기 때문에, 실험을 통해 ECG에는 50%, 주파수 스펙트럼에는 75%의 마스킹 비율 채택.</p>
</li>
<li><p>ECG가 주파수 스펙트럼보다 더 복잡하다는 점을 고려할 때, 상대적으로 낮은 마스킹 비율을 사용하면 모델 성능이 향상됨</p>
</li>
</ul>
<h3 id="overall-structure">Overall structure</h3>
<ul>
<li><p>모달리티 별 인코더에서는 각 모달리티 내 표현을 모델링하고, 공유 인코더에서 두 모달리키 간 상호작용을 캡처</p>
</li>
<li><p>시간 및 주파수 모달리티의 입력 토큰은 모달리티별 인코더 $E_m$에 입력되어 출력 표현 $O_m$을 생성함
$O_m = E_m(I_m)$, $m∈{t,f}$</p>
</li>
<li><p>공유 인코더에 전달되기 전에, 각 모달리티의 토큰은 레이어 정규화(LN)를 거쳐 초기 융합 수행</p>
</li>
<li><p>시간 및 주파수 모달리티의 전역 토큰(global tokens)이 추가되어 시퀀스의 첫 번째 위치에 삽입되며, 나머지 토큰은 순차적으로 연결(Concat)함</p>
</li>
<li><p>마지막으로 공유 인코더에서 self-attention을 이용해 bimodal 표현 간 심층 융합 수행
$O_m$ : 모달리티별 인코더 최종 레이어의 출력 표현 
$O_S$ : 공유 인코더의 출력 표현
$$
O_0^S = [o_g^t + o_g^f, \tilde{o}<em>1^t, \tilde{o}_2^t, \dots, \tilde{o}</em>{N_t}^t, \tilde{o}<em>1^f, \tilde{o}_2^f, \dots, \tilde{o}</em>{N_f}^f]
$$
$$
O_S = \Theta(O_0^S)
$$</p>
</li>
</ul>
<h2 id="3-internal-representation-connections-irc">3. Internal Representation Connections (IRC)</h2>
<ul>
<li><p>디코더들은 모두 트랜스포머 블록으로 구성되며, 인코더보다 작은 차원과 적은 레이어를 가지는 얕은(shallow) 구조</p>
</li>
<li><p>MAE 에서는 인코더 최종 레이어의 표현만 디코더로 전달되지만, 우리는 디코더가 점진적으로 재구성을 완료할 수 있도록 인코더 중간 레이어에서 더 많은 표현을 제공함 (IRC)</p>
</li>
<li><p>IRC는 디코더의 재구성 부담을 완화하여 인코더가 재구성보다는 판별 표현 학습에 집중할 수 있도록 하며, 결과적으로 이는 고수준 판별 표현 획득 능력을 향상시킴</p>
</li>
<li><p>공유 인코더의 출력 표현 $O_S$는 시간 및 주파수 모달리티에 대해 각각 $O_t$와 $O_f$로 분할됨</p>
</li>
<li><p>$O_t$와 $O_f$는 차원을 줄이기 위해 layer normalization-linear module을 거친 뒤 학습 가능한 위치 임베딩과 함께 마스킹된 토큰과 연결되어 모달리티별 디코더에 입력됨
(첫 번째 디코더 레이어에는 IRC 적용 안함)</p>
</li>
</ul>
<h3 id="gated-representation-mixer-grm">Gated Representation Mixer (GRM)</h3>
<p>디코더의 깊이가 $H$라고 가정할 때, 우리는 인코더에서 $H-1$개의 표현  $[V_1^m, V_2^m, \dots, V_{H-1}^m]$ 을 균일하게 선택하여 GRM으로 융합함</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/31e56927-f577-423b-8615-8a6ee5829e6d/image.png" alt=""></p>
<ul>
<li><p>모달리티 $m$에 대해 디코더의 $h$-번째 레이어에서 나온 표현 $U_h^m$는 게이트 메커니즘을 통해 인코더의 $h$-번째 표현 $V_h$ 와 융합</p>
</li>
<li><p>레이어 정규화-선형 모듈(layernorm-linear module, $P_h$)은 $V_h$ 를 $\tilde{V}_h$ 로 변환하여 융합이 필요한 표현 간 정렬을 용이하게함</p>
</li>
</ul>
<p>$$
\tilde{V}_h = P_h(V_h)
$$</p>
<ul>
<li><p>디코더 출력 $U_h^m$는 학습 가능한 마스킹 토큰을 포함하므로, 일관된 차원을 유지하기 위해 $\tilde{V}_h$의 해당 위치를 0 토큰으로 채움</p>
</li>
<li><p>게이트 유닛 $G_h$ 는 연결(concatenation)과 선형 변환(linear transformation)으로 구성되며, 입력 표현이 출력에 기여하는 비율을 제어함</p>
</li>
<li><p>시그모이드 활성화 함수(σ)는 기여도를 대응하는 가중치 벡터 $w_h \in \mathbb{R}^{N_m}$로 변환하고, 이는 각 토큰이 융합을 위한 가중치를 갖는다는 것을 의미함</p>
</li>
</ul>
<p>$$
w_h = σ(G_h(\tilde{V}_h, U_h^m))
$$</p>
<ul>
<li>토큰 수준에서, $\tilde{V}_h$와 $U_h^m$ 는 각각 가중치 추가(weighted addition)를 통해 $w_h$에 따라 맞춤형 융합 전략을 적용받게됨</li>
</ul>
<p>$$
C_h^m = w_h * \tilde{V}_h + (1 - w_h) * U_h^m
$$</p>
<ul>
<li>마지막으로 융합된 표현 $C_h^m$는 $(h+1)$-번째 트랜스포머 블록 $\Lambda_{h+1}$에 전달되어 $U_{h+1}^m$ 을 생성합니다.</li>
</ul>
<p>$$
U_{h+1}^m = Λ_{h+1}(C_h^m)
$$</p>
<h3 id="bimodal-reconstruction-loss"><strong>Bimodal Reconstruction Loss</strong></h3>
<p>최종 디코더 레이어 출력 $U_H^m$ 를 얻은 후, 이는 레이어 정규화-선형 모듈 $P_m$ 과 리셰이프(reshape) 작업을 통해 시간 또는 주파수 모달리티의 차원($\mathbb{R}^{C\times L}$  또는 $\mathbb{R}^{C\times L/2}$)에 맞게 변환. 
(재구성 손실은 마스킹된 토큰에서만 계산함)</p>
<p>$\tilde{U}_H^m = Reshape(P_m(U_H^m)), m \in {t, f}$</p>
<p>$L_{time} = MSE(U_H^{t}, T_{masked})$</p>
<p>$L_{freq} = MSE(U_H^{f}, F_{masked})$</p>
<p>$L_{recon} = αL_{time} + βL_{freq}$</p>
<p>( $T_{masked}$와 $F_{masked}$는 시간 및 주파수 모달리티에서 마스킹된 토큰의 ground truth, $α$와  $β$는 두 모달리티의 재구성 손실 가중치 )</p>
<h1 id="experimental-design">Experimental design</h1>
<h2 id="datasets-and-metrics">Datasets and metrics</h2>
<ol>
<li><strong>Ningbo</strong><ul>
<li>Ningbo First Hospital</li>
<li>12lead, 500Hz, 10초</li>
<li>34,905개</li>
</ul>
</li>
<li><strong>PTB-XL</strong><ul>
<li>Physikalisch-Technische Bundesanstalt</li>
<li>12lead, 500Hz, 10초</li>
<li>21,837개</li>
</ul>
</li>
<li><strong>Chapman</strong><ul>
<li>Chapman University 및 Shaoxing People&#39;s Hospital</li>
<li>12lead, 500Hz, 10초</li>
<li>10,247개</li>
</ul>
</li>
<li>Extravalidation<ul>
<li>ECG 다중 라벨 데이터셋(Georgia 및 Hefei)</li>
<li>두 데이터셋은 각각 10,344개와 20,335개의 샘플을 포함하며</li>
<li>샘플링 속도는 동일하게 500Hz이고 각 샘플의 길이는 10초</li>
</ul>
</li>
</ol>
<h3 id="data-preprocessing">Data preprocessing</h3>
<ol>
<li><p><strong>노이즈 제거(Denoising)</strong></p>
<p> 원본 ECG에서 흔히 발생하는 노이즈, 기준선 드리프트(baseline drift), 움직임 아티팩트(motion artifacts)는 모델의 분류 성능에 부정적인 영향을 끼침. 이를 완화하기 위해, 컷오프 주파수가 0.05Hz와 75Hz인 Butterworth 대역 통과 필터를 사용함</p>
</li>
<li><p><strong>다운샘플링(Downsampling)</strong></p>
<p> 계산 비용을 줄이기 위해 모든 ECG를 100Hz로 다운샘플링</p>
</li>
<li><p><strong>정규화(Normalization)</strong></p>
<p> 각 ECG 의 모든 리드에 인스턴스 정규화를 적용하여 분포 변화(distribution shift) 효과를 완화</p>
</li>
<li><p><strong>라벨 재구성(Label Reconstruction)</strong></p>
<p> 각 샘플에 할당된 SNOMED-CT 코드는 이산 카테고리 코드로 변환하였음</p>
<ul>
<li><p>Ningbo 데이터셋: 25개</p>
</li>
<li><p>PTB-XL 데이터셋: 22개</p>
</li>
<li><p>Chapman 데이터셋: 19개</p>
</li>
<li><p>Georgia 및 Hefei 데이터셋: 각각 23개와 34개</p>
<p>위 데이터셋은 클래스 불균형(class imbalance) 문제가 있으며, 이를 해결하기 위해 Fine-tuning 단계에서 클래스 가중치 전략을 채택했으며, 샘플 수가 적은 클래스에는 손실 계산 중 더 큰 가중치를 할당함</p>
</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰] Self-Supervised Learning for ECG]]></title>
            <link>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-MAE-MoCo</link>
            <guid>https://velog.io/@sy_kim/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-MAE-MoCo</guid>
            <pubDate>Thu, 27 Feb 2025 02:16:34 GMT</pubDate>
            <description><![CDATA[<h1 id="mae-moco">MAE-MoCo</h1>
<p><a href="https://openreview.net/pdf?id=iTjqAWYw2K">https://openreview.net/pdf?id=iTjqAWYw2K</a></p>
<h1 id="요약">요약</h1>
<ul>
<li><strong>Goal</strong> : ECG 해석 (심혈관 질환)</li>
<li><strong>Dataset</strong> : ECG 데이터</li>
<li><strong>Architecture</strong> : Hybrid Self-Supervised Learning(SSL) 학습 프레임워크<ol>
<li><strong>MAE-MoCo</strong> : masked autoencoder와 momentum encoder를 결합하여 생성+대조 동시 학습</li>
<li><strong>MAE-Nextclip</strong> : Nextclip + [CLS] 토큰으로 마스킹된 패치뿐만 아니라 전체 구조까지 재구성</li>
</ol>
</li>
</ul>
<h1 id="introduction">Introduction</h1>
<ul>
<li>12 Lead ECG 신호는 시계열(time series) 및 2차원 의료 이미지로 간주될 수 있음</li>
<li>ECG 분야에서는 SSL의  contrastive learning(CL) 및 generative learning(GL) 프레임워크가 뛰어난 성능을 보여준다.</li>
<li>CL 사전 연구
ISL(Inter-Subject Learning)는 ECG에 특화된 대조적 학습 방법 중 하나는, 이는 다변량 심장 신호(multivariate cardiac signals)에 맞춰 설계되었다. 이 대조적 학습 방법은 피험자 내 학습(intra-subject learning)과 피험자 간 학습(inter-subject learning) 기법을 결합한다. 피험자 내 학습은 동일한 환자의 ECG 신호에서 시간적 종속성(temporal dependency)을 분석하는 반면, 피험자 간 학습은 같은 환자의 증강된 신호를 양성 쌍(positive pairs) 으로, 다른 환자의 신호를 음성 쌍(negative pairs) 으로 취급하여 대조 손실(contrastive loss)을 계산한다.</li>
<li>GL 사전 연구
ECG 분야에서 제안된 모델들이 주로 마스킹된 오토인코딩(masked autoencoding, MAE) 기법을 기반으로 하고 있다. 마스킹된 시간축 오토인코더(MTAE)는 시간 축에서 마스킹된 ECG 패치를 찾도록 사전 학습되며, 마스킹된 리드 축 오토인코더(MLAE)는 리드 축을 따라 마스킹된 패치를 재구성한다. 이러한 모델들은 현재 ECG 분류(classification) 분야에서 최첨단(state-of-the-art) 성능을 기록하고 있다. 추가적으로, MassMIB는 마스킹 기법을 활용한 또 다른 방법으로, 인코더-디코더 쌍을 포함하여 시간축에서 마스킹된 신호를 인코딩하고 해당 마스킹된 패치를 복원하는 방법이다. 또한, Nextclip은 ECG 데이터를 다음 반심장 주기(semi-cardiac cycle)까지 예측하는 방식으로 재구성하는 사전 학습 과제를 수행한다.</li>
<li>최신 연구 경향
Transformer 기반 아키텍처 가 MAE와 결합되면서 GL에서 최첨단 성능을 달성하게 되었다. ViT 가 ECG 관련 사전 학습 작업에서 ResNet을 능가하는 성능을 보이고 있음. ViT의 주요 특징 중 하나는 [CLS] 토큰 을 포함한다는 점이며, ECG 사전 학습 단계에서의 최적화 가능성이 존재한다.</li>
<li>연구 목표
[CLS] 토큰을 포함한 강력한 사전 학습 작업을 설계하여 ECG 신호 표현을 위한 하이브리드 학습 프레임워크 를 구축하는 것. 이를 위해 두 가지 접근법을 탐구하였다.<ol>
<li>MAE-MoCo
1D-ViT 기반 MAE 프레임워크의 [CLS] 토큰 출력에 대조적 투영 헤드를 추가하는 방식.
ECG 신호 재구성과 positive-negative pairs 분류를 동시에 수행하는 인코더 개발.</li>
<li>MAE-Nextclip
Nextclip 디코더를 통합하여 생성적 자기지도 학습 프레임워크를 구성하는 방식.
마스킹된 패치 및 ECG의 다음 반심장 주기(semi-cardiac cycle)를 재구성</li>
</ol>
</li>
</ul>
<h1 id="method">Method</h1>
<p>MAE-MoCo 모델은 생성적(generative) 및 대조적(contrastive) 학습 관점을 통합하며, MAE-Nextclip은 두 가지 독립적인 생성적 학습 과제를 결합한다.</p>
<h2 id="a-model-architecture">A. Model Architecture</h2>
<h3 id="1-mae-moco"><strong>1) MAE-MoCo</strong></h3>
<p>MAE-MoCo 모델은 인코더(encoder), 디코더(decoder), 모멘텀 인코더(momentum encoder) 의 세 가지 주요 블록으로 구성된다. 인코더는 1D-ViT(1D Vision Transformer) 구조를 기반으로 하며, MAE와 MoCo의 두 부분으로 구성된다.</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/5bb1e164-5970-4e67-917a-416e7e69d927/image.png" alt="">
Fig 1. 파란색 : unmasked patches, 회색 : masked patches</p>
<ol>
<li><strong>MAE Encoder</strong><ol>
<li>원본 ECG 데이터 입력 (증강 없이 입력)</li>
<li>Patch Embedding 통과<ul>
<li>이 블록은 1D CNN 커널 및 스트라이드 크기가 패치 크기와 동일하며, ECG 데이터를 지정된 크기의 패치로 나누고 이를 숨겨진(hidden) 크기에 매핑한다.</li>
</ul>
</li>
<li>positional embedding 추가<ul>
<li>기존 연구에서 고정된 사인(sine) 임베딩을 사용하지만 [18], 본 연구에서는 학습 가능한 위치 임베딩(learnable positional embedding) 을 사용하여 MAE 및 MoCo 모두에 적용하였다.</li>
</ul>
</li>
<li>이후, 일부 패치는 랜덤 마스킹(random masking) 되어 숨겨진 상태로 유지되며, 마스킹되지 않은 패치만 디코더에서 사용된다.</li>
<li>최종적으로, 마스킹된 ECG 신호는 여섯 개의 연속적인 transformer 블록과 layer normalization 블록을 통과한다.</li>
</ol>
</li>
<li><strong>MoCo Encoder</strong><ol>
<li>랜덤하게 증강된 데이터 입력</li>
<li>이 신호는 패치 임베딩 및 위치 임베딩 레이어를 거치며, MAE 부분과 달리 마스킹을 적용하지 않는다. 대신, 학습 가능한 [CLS] 토큰 을 추가하여 ECG 신호의 전체 구조를 표현한다.</li>
<li>이후, 신호는 트랜스포머 블록(transformer block) 과 레이어 정규화(layer normalization) 블록을 거친다.</li>
<li>마지막으로, [CLS] 토큰만 추출하여 Linear-Batch Normalization-ReLU 블록을 통과해 최종 MoCo 출력을 얻는다.</li>
</ol>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/76479212-14e1-40d3-862f-ff037005e85b/image.png" alt="">
Fig 2. Encoder Block. X_org : 원본 ECG, X_generative : MAE에 사용된 masked latent representation, X_contrastive : MoCo에 사용된 latent representation.</p>
<ol>
<li><strong>Decoder</strong><ul>
<li>마스킹된 패치 재구성 단계. 마스킹된 패치는 생성적 학습 출력을 기반으로 하여 최소한의 오류로 복원되며, 이 과정에서 새로운 학습 가능한 파라미터가 적용된다.</li>
</ul>
<ol>
<li>디코더는 x_generative 입력을 받아 패치 임베딩 블록을 통과한다.<ul>
<li>이는 인코더의 패치 임베딩 블록과 구조적으로 다르며, 패치를 개별적으로 처리하지 않고 선형 레이어를 사용하여 직접 매핑한다.</li>
</ul>
</li>
<li>이후, 학습 가능한 [mask] 토큰 을 통해 마스킹된 패치를 디코딩한다.</li>
<li>디코더는 트랜스포머 블록과 레이어 정규화 블록을 거쳐 최종적으로 마스킹된 패치를 원래 ECG 신호에 가깝게 복원한다.</li>
</ol>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/f4f8382f-5ded-460b-8aae-02b70a91a4ae/image.png" alt="">
Fig 3. Decoder Block. masked patches를 재구성하기 위한 학습 가능한 [mask] 토큰</p>
<ol>
<li><strong>Momentum Encoder</strong><ul>
<li>MAE-MoCo의 모멘텀 인코더는 X_generative 출력을 무시하면서 동일한 인코더 아키텍처를 사용한다.</li>
<li>데이터 증강 기법은 MoCo와 다르게 설정되며, MoCo에서 사용되는 파라미터와 동일하지만 모멘텀 업데이트가 적용된다.</li>
<li>각 배치마다 새로운 데이터가 추가되고, 가장 오래된 배치는 제거되며, 새로운 배치가 추가되는 방식으로 MoCo 학습 원칙을 따른다.</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/309e7719-d978-4bf6-9dde-143bc7a27232/image.png" alt="">
Fig 4. MAE-MoCo 프레임워크의 전체적인 흐름</p>
<h3 id="2-mae-nextclip"><strong>2) MAE-Nextclip</strong></h3>
<p>MAE-Nextclip 프레임워크는 공유된 인코더(shared encoder) 와 MAE 및 Nextclip 복원을 위한 두 개의 개별 디코더(separate decoders) 로 구성된다. 아키텍처적으로나 기능적으로 이 모델은 MAE-MoCo 모델과 상당한 유사성을 갖는다.</p>
<ol>
<li><strong>MAE 인코더 구성 요소</strong> :  앞서 섹션 II-A1에서 설명한 내용과 동일하다.</li>
<li><strong>Nextclip Endoer</strong> : 원본 ECG 데이터를 Nextclip 데이터로 변환하는 과정이 포함된다.<ol>
<li>ECG 데이터의 일부 패치 내에서 랜덤한 시작 지점(random starting point) 을 선택한다.</li>
<li>선택된 랜덤 지점을 기준으로 반심장 주기(semi-cardiac cycle) 를 추출하여 정답 데이터(ground truth data) 로 사용한다.</li>
<li>이 랜덤 지점 이후의 ECG 데이터는 인코더에서 모두 0으로 설정된다.</li>
<li>변환된 ECG 데이터는 패치 임베딩(patch embedding) 및 위치 임베딩(positional encoding) 을 적용한 후 Nextclip 디코더로 전달된다.</li>
<li>또한, [CLS] 토큰 도 Nextclip 디코더에서 활용할 수 있도록 추가된다.</li>
<li>최종 신호는 transformer 블록과 layer normalization 블록을 연속적으로 통과하여 변환된다.</li>
</ol>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/60b55183-b480-4cb1-b73a-21456bef4f7d/image.png" alt="">
Fig 5. MAE-Nextclip Encoder.
<strong>Y_Nextclip</strong> : Nextclip 디코더를 거쳐 복원될 ECG 신호의 정답 데이터(ground truth ECG cycle)
<strong>X_generative,Nextclip &amp; X_generative,MAE</strong> : 각각 Nextclip 및 MAE에 대한 인코딩된 신호</p>
<ol>
<li><strong>Nextclip 디코더 구성:</strong><ul>
<li>MAE 디코더는 앞서 제시된 Fig 3과 동일한 구조를 갖는다.</li>
</ul>
<ol>
<li>Nextclip 디코더는 [CLS] 토큰을 먼저 추출한 후, 패치 임베딩 단계를 거친다.</li>
<li>이후, [mask] 토큰을 사용하지 않고, transformer block, layer normalization, linear layer을 순차적으로 통과하면서 Nextclip 신호를 재구성한다.</li>
</ol>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/d57f0053-ff64-4573-b6d1-2b6b902a291b/image.png" alt="">
Fig 6. MAE-Nextclip Decoders</p>
<p><img src="https://velog.velcdn.com/images/sy_kim/post/1fd4ccb2-ad78-4cfa-8c08-34dd3c4f914a/image.png" alt="">
Fig 7. MAE-Nextclip 프레임워크의 전체적인 흐름</p>
<h2 id="b-training-strategies"><strong>B. Training Strategies</strong></h2>
<h3 id="1-pretraining">1) Pretraining</h3>
<ul>
<li><strong>데이터셋</strong><ul>
<li>China Physiological Signal Challenge 2018 (CPSC2018)</li>
<li>Physikalisch-Technische Bundesanstalt XL (PTB-XL)</li>
<li>Chapman dataset</li>
</ul>
</li>
<li><strong>전처리</strong> : Z-score normalization</li>
<li><strong>손실 함수</strong> : 두 가지 손실 함수를 결합하여 사용<ul>
<li><strong>Generative Loss</strong><ul>
<li>원본 데이터와 마스킹된 패치의 복원된 데이터를 비교</li>
<li><strong>MSE Loss</strong> : $\mathcal{L}<em>{MAE} = \frac{1}{n} \sum</em>{i=1}^{n} (x_{\text{org},i} - x_{\text{reconstructed},i})^2$</li>
</ul>
</li>
<li><strong>Contrastive Loss</strong><ul>
<li>동일한 ECG에서 인코딩된 키와 쿼리는 positive pairs 으로 간주되며, 그렇지 않으면 negative pairs 로 처리</li>
<li>positive sample : $\ell_{\text{pos}} = x_{\text{cont},q} * x_{\text{cont},k}$</li>
<li>negative sample : $\ell_{\text{neg}} = x_{\text{cont},q} * \text{queue}$</li>
<li><strong>Cross-Entropy Loss</strong> : $\mathcal{L}<em>{MoCo} = CE([\ell</em>{\text{pos}}, \ell_{\text{neg}}], \text{labels})$</li>
</ul>
</li>
<li><strong>MAE-MoCo</strong><ul>
<li>$\mathcal{L}<em>{MAE-MoCo} = \mathcal{L}</em>{MoCo} + \alpha \mathcal{L}_{MAE}$</li>
</ul>
</li>
<li><strong>MAE-Nextclip</strong><ul>
<li>$\mathcal{L}<em>{Nextclip} = \frac{1}{n} \sum</em>{i=1}^{n} (y_{\text{Nextclip},i} - x_{\text{reconstructed},\text{Nextclip},i})^2$</li>
<li>$\mathcal{L}<em>{MAE-Nextclip} = \mathcal{L}</em>{Nextclip} + \alpha \mathcal{L}_{MAE}$</li>
</ul>
</li>
<li><strong>α 조정</strong><ul>
<li>MAE-MoCo: α = 40(default) , 20, 10</li>
<li>MAE-Nextclip: α = 2(default), 1, 0.5</li>
</ul>
</li>
</ul>
</li>
<li>학습 과정 및 하이퍼파라미터 설정<ul>
<li>모델은 학습 중 배치별 손실을 최소화하도록 가중치를 업데이트함.</li>
<li><strong>warm-up training</strong> : 초반 특정 횟수의 epoch 동안 학습률을 선형적으로 증가시켜 학습 안정성을 높이고 수렴 속도를 가속화함.</li>
<li><strong>학습률 스케줄링</strong> : 학습이 진행될수록 학습률을 점진적으로 감소시킴. validation loss 가  일정 에폭 이후 개선되지 않으면 학습률을 특정 비율로 감소시킴.</li>
</ul>
</li>
</ul>
<h3 id="2-fine-tuning"><strong>2) Fine-tuning</strong></h3>
<ul>
<li><strong>데이터셋</strong> : ****Chapman dataset</li>
<li><strong>모델 구조 변경</strong> : 인코더만 유지, 나머지 구성 요소(모멘텀 인코더 및 디코더)는 제거</li>
<li>MAE-MoCo 모델의 인코더에서 사용된 projection head는 파인튜닝에서 사용되지 않음.</li>
<li><strong>학습 방법론</strong> : 두 가지 방법 사용<ul>
<li>[CLS] 토큰과 연결된 선형 분류기(linear network)를 추가하여 최적의 분류를 수행하도록 설계됨.</li>
</ul>
<ol>
<li><strong>Linear Probe 방식</strong><ul>
<li>사전 학습된 인코더의 모든 학습 가능한 파라미터를 고정(동결) 한다.</li>
<li>[CLS] 토큰과 연결된 새로운 선형 네트워크의 파라미터만 업데이트됨.</li>
<li>이 방법은 인코더를 feature extractor 로 사용하여,<ul>
<li>선형 분류기가 성능을 얼마나 잘 발휘하는지 평가할 수 있도록 함.</li>
<li>즉, 사전 학습의 성공 여부를 더 정확하게 평가할 수 있음.</li>
</ul>
</li>
</ul>
</li>
<li><strong>End-to-End Fine-tuning 방식</strong><ul>
<li>사전 학습된 인코더 파라미터를 초기화한 상태에서 학습을 시작함.</li>
<li>선형 계층과 인코더의 모든 파라미터를 end-to-end 방식으로 함께 학습</li>
</ul>
</li>
</ol>
</li>
<li><strong>목표</strong><ul>
<li>크로스 엔트로피 손실(Cross-Entropy Loss) 최소화</li>
<li>모델이 예측한 클래스 확률과 원-핫 인코딩된 정답 레이블 간의 차이를 줄이는 것.</li>
</ul>
</li>
<li><strong>전략</strong><ul>
<li>사전 학습과 동일하게 웜업 학습 및 학습률 스케줄링을 적용.</li>
<li>조기 종료(Early Stopping) 적용:<ul>
<li>검증 손실(validation loss)이 특정 epoch 동안 개선되지 않으면 학습을 중단.</li>
</ul>
</li>
<li>최적의 성능을 보인 모델을 테스트 단계에서 사용.</li>
<li>미세 조정에 대한 상세한 구성 정보는 표 VII(Table VII)에 제공됨.</li>
</ul>
</li>
</ul>
<h2 id="c-definition-of-the-metrics"><strong>C. Definition of the Metrics</strong></h2>
<ul>
<li>본 연구에서는 다중 레이블(multi-label) 분류기를 사용하기 때문에 &quot;One-vs-One AUC&quot; 방법을 적용함.</li>
<li><strong>One-vs-One AUC</strong>: 모든 가능한 클래스 쌍(class pairs) 간의 AUC 값을 평균 내어 최종 AUC 값을 계산.</li>
</ul>
<h1 id="discussion"><strong>DISCUSSION</strong></h1>
<h2 id="a-limitations"><strong>A. Limitations</strong></h2>
<ul>
<li>주요 한계점:<ol>
<li>높은 계산 비용</li>
<li>최적의 하이퍼파라미터를 찾기 어려움</li>
</ol>
</li>
<li>MAE-MoCo 및 MAE-Nextclip 프레임워크는 두 가지 서로 다른 사전 학습(pretext) 작업을 결합한 구조이므로,<ul>
<li>개별 작업보다 더 높은 계산 비용이 요구됨.</li>
<li>특히, 대조적 학습(contrastive learning) 모델은 생성적 학습(generative learning) 모델보다 계산 비용이 더 많이 소모됨. 이는 이중 순전파(double forward pass) 가 필요하기 때문임.</li>
<li>결과적으로, MAE-MoCo 및 MAE-Nextclip은 다른 모델보다 더 높은 계산 비용을 요구하는 모델로 간주될 수 있음.</li>
</ul>
</li>
<li>또 다른 한계점:<ul>
<li>학습 불가능한(non-trainable) 파라미터 증가</li>
<li>두 가지 다른 모델을 결합하면서 학습되지 않는(non-trainable) 파라미터의 개수가 증가함.</li>
<li>이러한 증가로 인해, 개별 모델보다 최적의 파라미터 세트를 찾는 작업이 더욱 복잡해짐.</li>
</ul>
</li>
</ul>
<h2 id="b-future-work"><strong>B. Future Work</strong></h2>
<ol>
<li>백본 네트워크 개선<ul>
<li>Convolutional Vision Transformer(CvT) 를 도입한 ViT 구조가 ImageNet등 에서 강력한 성능을 보임.</li>
</ul>
</li>
<li>다양한 태스크 조합 실험<ul>
<li>예를 들어, Centerclip 태스크 는 현재 구간이 아닌 랜덤하게 선택된 ECG 세그먼트를 재구성하는 방식으로 작동함.</li>
<li>또한, SimCLR, BYOL, DINO [29]와 같은 대체 태스크를 활용하여 조합 가능함.</li>
<li>또 다른 전략: 자기지도 학습(self-supervised learning) 태스크의 수를 증가시키는 방법.</li>
</ul>
</li>
<li>다양한 생리학적 신호(Physiological Signals) 활용<ul>
<li>ECG와 같은 특성을 가진 다른 생리 신호(Physiological Signals) 모델 실험</li>
<li>예: 시간 시계열(time series) + 2D 이미지 를 결합하여 조합 전략의 효과를 더욱 잘 입증 가능</li>
</ul>
</li>
<li>하이퍼파라미터 튜닝 강화<ul>
<li>MAE-MoCo 및 MAE-Nextclip에는 많은 고정 파라미터(fixed parameters) 가 포함됨.</li>
<li>기존 프레임워크에서 최적의 값으로 설정된 파라미터가 반드시 MAE-MoCo 및 MAE-Nextclip에 최적이라고 보장할 수 없음.</li>
<li>따라서, 제안된 모델들은 더욱 최적화된 파라미터를 가질 가능성이 있음.</li>
</ul>
</li>
</ol>
<h1 id="hyperparameters">Hyperparameters</h1>
<ul>
<li><strong>Encoder</strong><ul>
<li>Data augmentation techniques: Erase, time out, partial noise, drop, and RRC</li>
<li>Type of patch embedding: 1D Convolution</li>
<li>Output channels of patch embedding: 512</li>
<li>Kernel size of patch embedding: 25</li>
<li>Stride of patch embedding: 25</li>
<li>Size of positional embedding: (145, 512)</li>
<li>Size of [CLS] token: (1, 512)</li>
<li>Type of transformer block: Attention and linear</li>
<li>Dimension of transformer: 512</li>
<li>Number of transformer blocks: 6</li>
<li>Number of attention heads: 16</li>
<li>MLP ratio of transformer: 2</li>
<li>Activation of transformer: GELU</li>
<li>Output features of layer normalization: 512</li>
<li>Type of projection head: Linear and 1D BatchNorm</li>
<li>Number of blocks in projection head: 3</li>
<li>Output features of MLP in projection head: 128</li>
<li>Output features of projection head: 128</li>
</ul>
</li>
<li><strong>Decoder</strong><ul>
<li>Type of patch embedding: Linear</li>
<li>Output channels of patch embedding: 256</li>
<li>Size of [mask] token: (1,256)</li>
<li>Size of positional embedding: (144, 256)</li>
<li>Type of transformer block: Attention and linear</li>
<li>Dimension of transformer: 256</li>
<li>Number of transformer blocks: 1</li>
<li>Number of attention heads: 8</li>
<li>MLP ratio of transformer: 2</li>
<li>Activation of transformer: GELU</li>
<li>Output features of layer normalization: 256</li>
<li>Type of size matcher network: Linear</li>
<li>Output channels of size matcher network: 25×1225×12</li>
</ul>
</li>
<li><strong>Momentum Encoder</strong><ul>
<li>Momentum constant: 0.99</li>
<li>Temperature of logits: 0.2</li>
<li>Queue size: 65536</li>
</ul>
</li>
<li>Pre-Training<ul>
<li>Epochs of MAE-MoCo: 710</li>
<li>Batch size: 64</li>
<li>Optimizer: Adam</li>
<li>Learning rate: 2×10−42×10−4</li>
<li>Warm-up epochs: 20</li>
<li>Learning rate scheduler (reduce rate): 0.9</li>
<li>Learning rate scheduler (number of bad epochs): 15</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>