<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>s_gyu.log</title>
        <link>https://velog.io/</link>
        <description>Self supervised Learning, Time Series, Multimodal Learning</description>
        <lastBuildDate>Thu, 29 May 2025 03:24:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>s_gyu.log</title>
            <url>https://velog.velcdn.com/images/s_gyu/profile/d4ffc175-e1ba-4c1b-afa8-bb061cab3244/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. s_gyu.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/s_gyu" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Paper Review] - Unlocking the Power of Patch: Patch-Based MLP for Long-Term Time Series Forecasting(AAAI, 2025)]]></title>
            <link>https://velog.io/@s_gyu/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Unlocking-the-Power-of-Patch-Patch-Based-MLP-for-Long-Term-Time-Series-ForecastingAAAI-2025</link>
            <guid>https://velog.io/@s_gyu/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Unlocking-the-Power-of-Patch-Patch-Based-MLP-for-Long-Term-Time-Series-ForecastingAAAI-2025</guid>
            <pubDate>Thu, 29 May 2025 03:24:20 GMT</pubDate>
            <description><![CDATA[<h3 id="main-contribution">[Main contribution]</h3>
<ul>
<li>장기 시계열 예측 문제에서 MLP에 Patching을 적용한 PatchMLP라는 새로운 모델을 제안</li>
<li>Transformer가 장기 시계열 예측(Long-Term Time Series Forecasting, LTSF) 과제의 해법이 될 수 있는지 회의적.</li>
<li><strong>패치 메커니즘</strong>을 적용한 간단한 선형 계층(linear layer)이 복잡한 Transformer 기반 LTSF 모델을 능가할 수도 있음을 시사.</li>
<li><strong>다중 스케일 패치 임베딩(Multi-Scale Patch Embedding, MPE)</strong> 방식 제안: 단일 스케일이 아닌 다양한 크기의 패치를 활용<ul>
<li>짧은 길이의 패치를 통해 국소적 패턴 포착</li>
<li>긴 길이의 패치는 계절성, 추세 같은 장기 패턴을 포착</li>
<li>서로 다른 스케일의 패치를 함께 사용하면, 다양한 기간 길이에 걸친 대표 특징을 유연하게 학습할 수 있어 예측 정확도와 일반화 능력이 향상</li>
</ul>
</li>
<li>저자는 원본 시계열에 내재된 지나치게 복잡한 시간적 관계가 단순한 분해 기술로는 효과적인 결과를 얻을 수 없으며, <strong>Latent Vector Decomposition</strong>으로 이러한 문제를 우회할 수 있다고 주장</li>
</ul>
<br>

<p><strong>[Patch]</strong></p>
<ul>
<li>패치는 데이터를 압축하고 입력 차원을 줄이며 중복 특징을 감소시킴.</li>
<li>또한 패치는 일종의 스무딩 효과를 제공하여 이상치(outlier)의 영향을 어느 정도 줄이고, 시계열의 불규칙한 변동과 랜덤 노이즈를 걸러내면서 더 안정적이고 대표적인 정보를 유지할 수 있음.</li>
</ul>
<aside>
💡

<p>cf) 채널 믹싱(같은 시점에 측정된 각 변수의 값을 하나의 벡터) x , 채널 독립(각 변수별로 처리)이 더 효과적. </p>
</aside>


<br>

<h3 id="patchmlp">[PatchMLP]</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/bc8408f8-7001-418d-8468-3bc1299d8d6d/image.png" alt=""></p>
<p><strong>[Multi-Scale Patch Embedding]</strong></p>
<ol>
<li>Patching<ul>
<li>각 변수별로 원시 시계열을 서로 다른 길이의(스케일)의 패치를 만듬</li>
</ul>
</li>
<li>embedding <ul>
<li>각 패치를 embedding 레이어를 통과시켜 고정 차원 D의 벡터로 변환</li>
<li>이 과정에서 패치 내 시간축 정보가 압축되어, 패치 하나당 하나의 임베딩 벡터가 생성</li>
</ul>
</li>
<li>flatten &amp; concat<ul>
<li>임베딩된 D차원의 벡터를 1차원으로 flatten시켜 Token으로 만듬</li>
<li>한 변수 내 각 스케일의 토큰을 concat하여 하나의 긴 토큰 시퀀스를 만듬.</li>
</ul>
</li>
<li>Concat (변수 간)<ul>
<li>변수 A의 긴 토큰 시퀀스, 변수 B의 긴 토큰 시퀀스, … 를 차례대로 concat하여</li>
<li>전체 변수에 걸친 하나의 긴 토큰 시퀀스 구성</li>
</ul>
</li>
</ol>
<br>


<p><strong>[Feature Decomposition]</strong></p>
<p>$X_s = \mathrm{AvgPool}(X)$</p>
<p>$X_r = X - X_s$</p>
<ol>
<li><p>생성된 토큰 시퀀스에 대해 Average Pooling 연산을 수행하여 “스무딩된 추세(Smooth Component)”를 추출 </p>
<ul>
<li>→ 데이터의 변동과 노이즈를 줄임</li>
<li>스무딩 과정에서 시계열의 길이가 변하지 않도록 패딩(padding) 연산을 적용</li>
</ul>
</li>
<li><p>잔차 성분 계산 (Residual Component)</p>
<ul>
<li><p>원본 토큰 시퀀스에서 스무딩된 추세를 빼서 잔차 성분 계산</p>
<aside>
💡

<p>이렇게 하면</p>
</li>
<li><p>Xs에는 “장기적 추세나 완만한 변화” 정보가 담기게 됨.</p>
</li>
<li><p>Xr에는 “단기적 변동·노이즈” 정보가 담기게 됨.</p>
</aside>


</li>
</ul>
</li>
</ol>
<ul>
<li><strong>두 경로 분기</strong><ul>
<li>이렇게 분해된 두 종류의 토큰(추세, 잔차)이 병렬로 준비되어,</li>
<li>스무딩된 추세 Xs는 “위쪽” MLP Layer 블록으로만 가고,</li>
<li>잔차 성분 Xr는 “아래쪽” MLP Layer 블록으로만 감.</li>
</ul>
</li>
</ul>
 <br>

<h3 id="mlp-layer">[MLP Layer]</h3>
<p> <img src="https://velog.velcdn.com/images/s_gyu/post/b12d305d-e8b3-42a9-8e3c-c52c4d692099/image.png" alt=""></p>
<p><strong>[Inter-Variable MLP]:</strong></p>
<ul>
<li>fully connected layer - GELU -  dropout  구조</li>
<li>“한 시점에 걸친” 다변량 시계열(MTS) 변수들 간의 상호 영향을 모델링하는 것을 목표</li>
<li>한 시점에 걸친 모든 변수 값을 하나의 입력 벡터로 보고, 변수들 간의 상호작용을 학습하는 MLP 블록</li>
</ul>
<p><strong>[Intra-Variable MLP]:</strong></p>
<ul>
<li><p>fully connected layer - GELU -  dropout  구조</p>
</li>
<li><p>단일 변수의 시간축 상관 패턴(추세·주기·의존성 등) 학습</p>
<br>

</li>
</ul>
<h3 id="실험">실험</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/f7331b2c-c44f-4e47-bd23-211d5ee065fd/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/40d3327e-a3e5-466d-80a4-9169359728ff/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] - Not All Data are Good Labels:
 Onthe Self-supervised Labeling for Time Series Forecasting(2025.02)]]></title>
            <link>https://velog.io/@s_gyu/Not-All-Data-are-Good-Labels-Onthe-Self-supervised-Labeling-for-Time-Series-Forecasting2025.02</link>
            <guid>https://velog.io/@s_gyu/Not-All-Data-are-Good-Labels-Onthe-Self-supervised-Labeling-for-Time-Series-Forecasting2025.02</guid>
            <pubDate>Mon, 31 Mar 2025 07:59:51 GMT</pubDate>
            <description><![CDATA[<h2 id="main-contribution">[Main Contribution]</h2>
<ul>
<li><p><strong>Self-supervised leaerning을 활용한 라벨 보정 :</strong></p>
<ul>
<li>기존의 원시 라벨(raw labels)이 가진 노이즈와 과적합 문제를 완화하기 위해, 재구성(reconstruction) 네트워크를 이용하여 후보 데이터셋(candidate datasets)을 생성하고, 이로부터 얻은 pseudo-label로 예측 모델을 보정하는 새로운 패러다임 제시</li>
</ul>
</li>
<li><p><strong>SCAM (Self-Correction with Adaptive Mask):</strong></p>
<ul>
<li>재구성 과정 중 과적합된 구성요소를 식별하여 해당 부분의 라벨을 선택적으로 대체함으로써, 모델이 더 일반화된 정보를 학습하도록 유도.</li>
<li>기존의 강제적인 라벨 대체 대신, 데이터 내에서 ‘어디서’ 수정이 필요한지를 적응적으로 판단하는 마스크(Mask) 기법 도입.</li>
</ul>
</li>
<li><p><strong>Spectral Norm Regularization (SNR) 적용:</strong></p>
<ul>
<li>모델의 파라미터(특히, 선형 계층)에 SNR을 적용하여 과적합 문제를 추가적으로 억제하고, 안정적인 학습을 도모.</li>
</ul>
</li>
<li><p><strong>Detailed Analysis</strong> :</p>
<ul>
<li><p>예측기로 다양한 백본 모델(MLP기반, transformer기반) 사용과 여러 데이터셋에 대해 성능 향상을 확인.</p>
<br>

</li>
</ul>
</li>
</ul>
<h2 id="문제점"><strong>[문제점]</strong></h2>
<ul>
<li><p>딥러닝기반 시계열 예측 방법들은 여전히 과적합, 고품질 데이터셋에 대한 의존, 데이터가 작거나 노이즈가 많을때 제대로 학습하기 어렵</p>
<p>  → 이로 인해 모델이 잘못된(과적합된) 라벨에 너무 의존하게 될 수 있음.</p>
</li>
<li><p>실제 시계열 데이터는 노이즈, 이상치, 불규칙 이벤트 등이 있어 모든 라벨이 정확하지 않을 수 있다.</p>
</li>
</ul>
<br>

<h2 id="해결-아이디어"><strong>[해결 아이디어]</strong></h2>
<ul>
<li>일반적으로 TSF(Time Series Forecasting) 모델들은 데이터셋이 작거나 노이즈가 많은 경우에 어려움을 겪음</li>
</ul>
<aside>
💡원래 관측된(raw) 데이터셋 외에, 추가로 “**후보 데이터셋**(candidate datasets)”을 만들어내서, 이 중 더 좋은 데이터셋을 선택하면 모델의 일반화 성능을 향상시킬 수 있다고 가정

</aside>


<br>


<h3 id="1-initial-case---gridsearch">1. Initial Case - gridsearch</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/03d5801d-875e-4874-96be-2e1d542eba93/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/f95d9b98-61d6-492f-aa70-833c29d21a45/image.png" alt=""></p>
<p>| 재구성 네트워크 $g(\cdot; \phi)$ :  원시 타깃 시계열 $Y$를 점진적으로 재구성</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/7338c467-34d6-4f47-b081-437536459e0a/image.png" alt=""></p>
<br>

<ul>
<li><p>재구성 네트워크 $g$는 풀배치(Full-Batch) 경사하강법으로 학습. 이때 손실은
<img src="https://velog.velcdn.com/images/s_gyu/post/47601b1c-ba91-4cb0-a322-fe6b9fab3dad/image.png" alt=""></p>
</li>
<li><p>예측 모델 $f(\cdot; \theta)$ (여기서는 MLP 같은 간단한 모델)은 미니배치 SGD로 학습.
각 에폭(학습 단계)마다, $g(\cdot; \phi_i)$를 “현재 상태”로 고정하고, 그 상태로 만든 데이터셋 $D_i$를 사용해 예측 모델 $f(\cdot; \theta)$를 학습.</p>
<p> → 2단계</p>
</li>
</ul>
 <br>

<p><img src="https://velog.velcdn.com/images/s_gyu/post/0d4f31c0-27fe-4044-9343-8150d3a815a3/image.png" alt=""></p>
<ul>
<li>Grid Search 방식으로도 후보 데이터셋을 생성해 볼 수 있으나, 학습 안정성과 비용 측면에서 비효율적.</li>
<li>훈련 곡선이 불안정하여, 잠재적으로 우수한 후보 데이터셋($g(⋅;ϕ)$ 관점에서) 놓칠 수 있다.</li>
</ul>
<br>

<h3 id="2-co-objective-training공동-최적화">2. Co-objective Training(공동 최적화)</h3>
<ul>
<li><p>그리드 탐색은 최적 후보 데이터셋을 찾기 위해 두 개의 별도 목표(재구성 최적화, 예측 최적화)가 얽힌 2단계 최적화 과정으로 구성</p>
<p>  후보 데이터셋을 하나씩 따로 만들어서 각각 예측기를 학습하는 방식(grid sesarch)은 매우 비효율적</p>
</li>
<li><p>그래서 논문에서는 재구성 네트워크$g(⋅;ϕ)$와 예측기( $f(\cdot; \theta)$)를 동시에 업데이트.</p>
  <aside>
  💡

<p>  이렇게 하면 g가 만드는 후보 데이터셋과 그 데이터셋으로 학습된 예측기의 성능이 서로 영향을 주면서, 둘다 점진적으로 개선. </p>
  </aside>

</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/67a4bde7-4314-4885-8faf-4ad67a7e85fa/image.png" alt=""></p>
<p><strong>[하나의 통합 loss function 사용]</strong></p>
<ul>
<li>재구성 네트워크 g가 원래 데이터 y와 가깝도록 학습 &amp; 동시에 예측 모델 f가 g가 만들어낸 $\tilde{y}$에 잘 맞추도록 최적화<ul>
<li>그 결과 재구성된 라벨($\tilde{y}$)과 실제 라벨(y)의 차이가 줄어들 뿐만 아니라, 예측 모델이 재구성된 라벨을 잘 학습하게 되어 전체적으로 예측 성능이 좋아지는 효과</li>
</ul>
</li>
</ul>
<br>


<p><strong>[gradient 제약과 정규화 효과]</strong></p>
<ul>
<li>재구성된 라벨 $\tilde{y}$가 $\theta$와 $\phi$의 업데이트에 대해 너무 민감하게 반응하지 않도록, 그라디언트의 크기가 $\delta$ 이하로 유지되도록 제약을 걸어둠.</li>
<li>이렇게 하면 학습 과정에서 $\tilde{y}$가 지나치게 급격하게 변하지 않도록 안정성을 확보할 수 있음.</li>
<li>co-objective training이 진행됨에 따라 과적합 위험이 커지지만<ul>
<li>이 과적합 문제 해결을 위해 SCAM과 SNR를 제안</li>
</ul>
</li>
</ul>
<h3 id="3-self-correction-with-adaptive-mask-scam">3. Self-Correction with Adaptive Mask (SCAM)</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/0ec29132-b3e2-4009-82da-460e337735f7/image.png" alt=""></p>
<h3 id="loss-function"><strong>[Loss function]</strong></h3>
<ul>
<li>지도 손실(supervised loss) + 보조손실(Auxiliary loss)</li>
</ul>
<p><strong>보조 손실의 역할</strong> :  예측기 $\hat{y}$가 보정된 라벨 $\tilde{y}$에 가까워지도록 학습시키면서, 동시에 $\tilde{y}$와 원래 라벨 $y$ 사이의 관계를 반영하도록 유도.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/c83c707e-eac3-4905-ad84-ac007287a3ab/image.png" alt=""></p>
<ul>
<li>(4)의 수식은 L2 norm(MSE) 버전</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fecb7004-244a-42e4-94b4-dff69b79be2b/image.png" alt=""></p>
<ul>
<li>(5)의 수식은 L1 norm(MAE) 버전<ul>
<li>논문에서는 MAE를 쓰면 에러에 더 견고해지는 장점이 있다고 말함.</li>
</ul>
</li>
</ul>
<br>


<p><strong>[마스크 기반의 최종 Loss function]</strong>
<img src="https://velog.velcdn.com/images/s_gyu/post/564615ec-1a8d-490e-96c7-c62e111a11ac/image.png" alt=""></p>
<br>

<p><strong>[notation]</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6624e7d0-97a5-4195-ad03-4fbd3f508c40/image.png" alt=""></p>
<blockquote>
<p>마스크한다 = 과적합 된 부분</p>
</blockquote>
<ul>
<li>$m: (\tilde{y} - \hat{y})(\tilde{y} - y)$로 정의되어, $\tilde{y}$가 $\hat{y}$와 $y$를 같은 쪽에서 바라보는지(양수) 혹은 교차하는지(음수/0)를 나타냄.</li>
<li>$M: { m &gt; 0 }$ 여부로 정의된 이진 마스크.  $M$=1 적용</li>
<li>$\bar{M} = { m \le 0 }$ 이 아닌 부분.  $M$=0 적용</li>
<li>$M_&lt;$:  ${, |\tilde{y} - \hat{y}| &lt; |\tilde{y} - y| ,}$를 만족하는 이진 마스크. 조건이 만족되면 $M_&lt;$=1<ul>
<li>$M_&lt;$는 보정이 과도하지 않도록, 즉 $\tilde{y}$가 예측값 $\hat{y}$ 쪽에 적절히 가깝게 위치하는지를 판단하는 역할</li>
</ul>
</li>
<li>$\overline{M_&lt;}$: $M_&lt;$가 아닌 지점(조건을 만족하지 않는 지점), $M_&lt;$=0</li>
</ul>
<aside>
💡

<p><strong>첫 번째 항</strong>
$|y - \hat{y}| \odot M$는 원래 라벨 $y$와 예측값 $\hat{y}$간의 지도 손실 (supervised loss)을, 마스크 $M$가 1인 구간에서만 반영</p>
<p><strong>두 번째 항</strong></p>
<p> 보조 손실 (auxiliary loss)로, 보정된 라벨 $\tilde{y}$와 예측값 $\hat{y}$ 및 원래 라벨 $y$사이의 관계를 반영하여 추가적인 보정 효과를 유도.</p>
</aside>


<br>

<p><strong>[SCAM의 최종 목표]</strong></p>
<ul>
<li>예측 모델의 출력 $\hat{y}$가 보정된 라벨 $\tilde{y}$에 가까워지도록 만드는 것.</li>
<li>즉, 모델이 정제된 라벨 정보를 효과적으로 학습하여 노이즈나 이상치에 의한 오류를 줄이고, 안정적이고 정확한 예측을 할 수 있도록 하는 것이 핵심.</li>
<li>다만, 동시에 $\tilde{y}$는 원래 라벨 $y$의 핵심 정보를 보존해야 하므로, 두 요소가 균형을 이루는 것이 중요</li>
</ul>
<br>

<h3 id="4-spectral-norm-regularizationsnr">4. Spectral Norm Regularization(SNR)</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/c4a996ef-18a0-4037-885c-52877d127efa/image.png" alt=""></p>
<p>MLP 모델 같은 단순 모델은 그라디언트 값이 작아 쉽게 수렴하지만, Transformer 기반 모델에서는 예측 오차가 주로 $\ell_{\text{pred}}$(예측 손실)에서 발생하는 경향. </p>
<p>Transformer처럼 복잡한 모델의 경우, 2차 도함수를 계산하는 그라디언트 페널티 방식은 계산 비용이 많이 들기 때문에, 더 간단하고 직접적인 방법이 필요</p>
<blockquote>
<p>SNR은 모델의 가중치 $W$를 정규화하여, 파라미터의 크기가 너무 커지지 않도록 조절. 
여기서 $|W|_2$는 가중치 행렬의 spectral norm (가장 큰 고윳값)이며, $\gamma$는 학습 가능한 스케일 인자. 이렇게 하면, 가중치가 너무 커져서 손실 함수가 지나치게 뾰족해지는것을 방지, 이로 인해 과적합을 줄일 수 있음.</p>
</blockquote>
<br>

<h2 id="5-실험">5. 실험</h2>
<p>논문에서는 실험에서 세 가지 주요 질문을 다룸.</p>
<ul>
<li><strong>Q1:</strong> SCAM이 다양한 백본 모델과 특징이 다른 데이터셋에서 효과적인가?</li>
<li><strong>Q2:</strong> SCAM과 SNR이 모델 성능 개선에 어떻게 기여하는가?</li>
<li><strong>Q3:</strong> 자기지도 재구성 과업이 예측 모델에 어떤 이점을 제공하는가?</li>
</ul>
<p><strong>데이터셋</strong>  </p>
<ul>
<li>Electricity, Weather, Traffic</li>
<li>네 개의 ETT 데이터셋(ETTh1, ETTh2, ETTm1, ETTm2) : 전력 변압기 온도 데이터</li>
</ul>
<br>

<p><strong>[예측기 모델들(f)]</strong>
    - <strong>MLP:</strong> (Li et al., 2023)에서 제시한 vanilla 2-레이어 모델로, RevIN(Kim et al., 2021)이 적용됨.
    - <strong>CYCLENET:</strong> (Lin et al., 2024b)에서는 주기적 추세(cyclic trend)를 명시적으로 포착하는 SOTA MLP 기반 모델
    - <strong>PATCHTST</strong>(Nie et al., 2022)와 <strong>ITRANSFORMER</strong>(Liu et al., 2024b)는 각각 채널 독립적(channel-independent) 방법과 채널 종속적(channel-dependent) 방법을 대표하는 Transformer 기반 모델</p>
<br>

<h3 id="51-주요-실험q1">5.1. <strong>주요 실험(Q1)</strong></h3>
<p><strong>Q1</strong>: SCAM이 다양한 백본 모델과 특징이 다른 데이터셋에서 효과적인가?</p>
<p><strong>[SCAM+SNR]</strong> → 모든 주요 예측 모델에서 일관된 성능 향상이 있었다?</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/e1f5be9b-60a6-4536-99d2-06ae04b8c2e9/image.png" alt=""></p>
<p>Transformer 기반 모델(예: PATCHTST와 ITRANS)은 일반적으로 이러한 데이터셋에서 경량 모델(MLP, CYCLENET)에 비해 성능이 낮았으나, SCAM을 적용함으로써 일반화 성능이 크게 향상</p>
<h3 id="52-ablation-study-q2">5.2 Ablation Study (Q2)</h3>
<ul>
<li><strong>Q2:</strong> SCAM과 SNR이 모델 성능 개선에 어떻게 기여하는가?</li>
<li>ITRANS(Transformer 기반)와 CYCLENET(MLP 기반)을 대표 모델로 하여 ablation study를 수행</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fb1d683b-668a-4ce1-9f8e-10c4531f3a4d/image.png" alt=""></p>
<ul>
<li>논문에서는 SCAM은 성능 향상의 주된 원동력으로 작용하며, SNR은 독립적인 방법으로도 성능을 향상시키지만 주로 SCAM을 보완하는 역할이라고 함.</li>
</ul>
<br>

<p><strong>[IN-DEPTH EXAMINATION ON SNR]</strong></p>
<ul>
<li><p>손실 지형(loss landscape)을 분석하여 SNR의 효과를 추가로 검증</p>
</li>
<li><p>ITRANS 모델의 다양한 구성 요소(Embedding, Encoder, Projector에 대해 <strong>SNR을 적용했을 때와 적용하지 않았을 때</strong>의 샤프니스를 비교</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/635ba830-ddcd-4e10-885c-4dee512c3edb/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6a61e9c9-0b05-48f9-9702-c346e69e49b3/image.png" alt=""></p>
<ul>
<li>SNR 없이 사용하면 Embedding(입력 선형 계층)이 가장 높은 샤프니스를 보여 과적합되었음을,</li>
<li>pre-SNR, post-SNR, 그리고 두 영역 모두에 SNR을 적용했을 때 샤프니스가 낮아져서 손실 지형이 부드러워진 것을 확인할 수 있음.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/bb05d832-5039-497d-81a6-63c7ad317cac/image.png" alt=""></p>
<ul>
<li><p>SNR의 다양한 변형에 따른 성능(MSE) 비교 결과</p>
</li>
<li><p>post-SNR 또는 두 영역 모두에 SNR을 적용하는 방법이 가장 효과적이라는 결론</p>
</li>
</ul>
<h3 id="53-scam-a-multiple-instance-learning-view-q3">5.3. <strong>SCAM: A Multiple Instance Learning View (Q3)</strong></h3>
<ul>
<li><strong>Q3:</strong> 자기지도 재구성 과업이 예측 모델에 어떤 이점을 제공하는가?</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6920246c-8c73-4632-b740-05c967aec818/image.png" alt=""></p>
<ul>
<li>SCAM은 구간별로 노이즈 수준이나 과적합 여부를 판단해, 재구성($\tilde{y}$)과 예측($\hat{y}$) 중 어느 쪽에 더 중점을 둘지 결정.</li>
</ul>
<br>


<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li>self supervised 접근 방식인 SCAM을 제안</li>
<li>중간 재구성 결과에서 얻은 의사 라벨(pseudo labels)을 통해 과적합된 구성 요소들을 선택적으로 대체함으로써 TSF(Time Series Forecasting) 모델을 개선</li>
<li>SNR과 결합함으로써, SCAM은 다양한 TSF 모델 전반에서 일반화 성능 향상</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] - W-MSE(Whitening Mean Squared Error, 2021, ICML)]]></title>
            <link>https://velog.io/@s_gyu/W-MSEWhitening-Mean-Squared-Error-2021-ICML</link>
            <guid>https://velog.io/@s_gyu/W-MSEWhitening-Mean-Squared-Error-2021-ICML</guid>
            <pubDate>Mon, 17 Mar 2025 12:21:13 GMT</pubDate>
            <description><![CDATA[<h2 id="main-contribution"><strong>[Main Contribution]</strong></h2>
<ul>
<li>Whitening MSE(W-MSE)라는 새로운 Self supervised learning loss function을 제안.<ul>
<li>배치 샘플을 구형 분포(spherical distribution)에 놓이도록 제약하며, 기존 positive-negative instance contrastive learning기반 방법론 대체 가능</li>
</ul>
</li>
<li>negatives 샘플들을 필요로 하지 않기 때문에, 배치 내에서 더 많은 positive 샘플을 포함할 수 있다.<ul>
<li>(실험적으로 하나의 이미지에서 다수의 양성 샘플을 추출하는 것이 성능을 향상시킴을 입증)</li>
</ul>
</li>
<li>기존 contrastive loss 방법론보다 뛰어난 성능을 보이며, 최신 self supervised learning 방법들과 비교했을때 경쟁력이 있다. (vs BYOL(2020), SimSiam(2020))</li>
</ul>
<br>

<p><strong>cf) collapse(개념 숙지!!)</strong></p>
<ul>
<li><p>argumentation에서 뽑은 두 embedding vector 사이의 MSE가 줄어들도록 학습을하면</p>
<p>  ex) [1,1,1], [1,1,1] 이런식으로 되면 encoder 가 의미있는 정보를 못뽑음.  </p>
<ul>
<li>Encoder(인코더)가 의미 있는 특징 벡터를 추출해야 하는데, Collapse가 발생하면 제대로 추출하지 못함.</li>
<li>우리는 그 Encoder를 학습시켜서 각각의 입력 데이터에 대해 의미 있는 표현(embedding)을 생성하도록 만듦.</li>
<li>하지만 Collapse가 발생하면 → Encoder가 모든 입력 데이터에 대해 거의 동일한 벡터를 반환하게 됨 → 모델이 구별할 수 있는 정보가 사라짐.</li>
</ul>
</li>
</ul>
<br>


<h2 id="the-whitening-mse-loss">[The Whitening MSE Loss]</h2>
<h3 id="문제점">문제점</h3>
<p>contrasive learning 문제점 </p>
<ul>
<li>negative sample을 확보하는것이 어려움.</li>
</ul>
<p>non contrastive learning(distiliation method)</p>
<ul>
<li>positive pair만을 가지고 학습할 경우 생기는 <strong>collapse</strong>를 방지하기 위해 asymmetric architecture, stop gradient(distiliation 방법론)등의 구조적 제약이 존재    </li>
</ul>
<br>

<h3 id="overview">[overview]</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/1d6fa90f-4f64-4f59-9c83-6914319d71fb/image.png" alt=""></p>
<p><strong>notation</strong> </p>
<ul>
<li>x : image</li>
<li>d : 데이터 증강 횟수</li>
<li>E(⋅) : ResNet</li>
<li>h : average pooling</li>
<li>g(⋅) :  BN(Batch Normalization) 레이어가 포함된 1개의 은닉층을 가진 MLP</li>
<li>z : whitening transform 적용한 임베딩 벡터</li>
</ul>
<br>


<p><strong>[objective function &amp; constraints]</strong>
<img src="https://velog.velcdn.com/images/s_gyu/post/5bd219e0-aed1-4af4-b50a-8a9bff8bc69b/image.png" alt=""></p>
<ul>
<li>positive pairs 사이의 거리 를 최소화</li>
<li>임베딩 벡터 z의 공분산 행렬이 단위 행렬이 되도록</li>
</ul>
<p>→ 이를 통해 collapse 방지.</p>
<br>


<p><strong>1. [Whitening  transformation]</strong></p>
<p>$\mu_V = \frac{1}{K} \sum_k v_k$ </p>
<p>$\Sigma_V = \frac{1}{K - 1} \sum_k (v_k - \mu_V)(v_k - \mu_V)^T$</p>
<p>$W_V^T W_V = \Sigma_V^{-1}$</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/012924dd-8815-4c6b-9688-932f1542b888/image.png" alt=""></p>
<ul>
<li>모든 embedding vector를 평균이 0이고, 공분산 행렬이 단위 행렬인 분포로 변환하는 선형변환</li>
<li>Whitening  transformation을 통해 임베딩 벡터 V를 Z벡터로 <strong>선형변환</strong></li>
</ul>
<br>

<aside>
💡
Whitening 변환을 통해 **Spherical distribution**을 따르도록 조정

<ul>
<li>표현 붕괴(Collapse)를 방지하고,</li>
<li>모델이 균일한 표현을 학습할 수 있도록 도움.</aside>


</li>
</ul>
<br>

<p><strong>[Loss function]</strong>
<img src="https://velog.velcdn.com/images/s_gyu/post/b83bedff-bf6f-4714-a4ad-0a809d0c0ad5/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fced1b23-9328-47d8-9d7b-2859e9111e58/image.png" alt=""></p>
<ol start="2">
<li><strong>[Batch slicing]</strong></li>
</ol>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/7d67d871-1e78-46e7-ac55-3acdc1f3b222/image.png" alt=""></p>
<ul>
<li>모든 데이터에 한번에 whitening transform을 적용하는것이 아님</li>
<li>배치에 따라 구해지는 $\mu_V$, $W_V$가 다르기 때문에 안정성을 위해 <strong>batch slicing</strong> 기법을 제안</li>
<li>d : 한 이미지에서 생성된 양성 샘플수(데이터 증강 횟수)</li>
</ul>
<br>

<aside>
💡Batch Slicing 과정

<ol>
<li>V를 d개의 부분으로 나눈다. (이 예에서는 d=2)</li>
<li>첫 번째 부분을 무작위로 랜덤하게 섞고(random permutation),동일한 섞기 순서를 다른 d−1개의 부분에도 적용한다.</li>
<li>그런 다음, 각 부분을 다시 서브 배치(V)별로 나누고 $μ_V$, $W_V$ 를 계산하여 whitening을 적용</li>
</ol>
</aside>


<br>

<p><strong>[학습의 불안정성?]</strong></p>
<ul>
<li>배치 크키가 작을경우  공분산 행렬이 불안정해져서 학습이 불안정 할 수 있지만</li>
</ul>
<p>→ 이 과정을 같은 배치내에서 여러 번 반복하여 평균을 냄</p>
<p>→  Whitening 행렬이 특정 샘플에 과하게 의존하지 않도록 학습 가능.</p>
<aside>
💡
최종 손실(loss) 계산 시, 모든 Whitening 결과를 결합하여 사용

</aside>


<br>


<p><img src="https://velog.velcdn.com/images/s_gyu/post/a0a22fad-3a2e-45a3-af2f-6b6f68f9a292/image.png" alt=""></p>
<h3 id="실험">실험</h3>
<ul>
<li>데이 증강 횟수(d)가 2일때, 4일때에 대해 실험진행.</li>
<li>SimCLR(constrastive learning), BYOL(distiliation)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/5852f809-6977-4f51-a1ac-76bed93e9173/image.png" alt=""></p>
<br>

<p><img src="https://velog.velcdn.com/images/s_gyu/post/dff9376a-83b4-4ee1-aaca-f7d35051ce75/image.png" alt=""></p>
<h3 id="conclusion">Conclusion</h3>
<ul>
<li>Self-Supervised Learning(SSL)에서 사용되는 손실함수들과 다른 차별화된 새로운 손실함수인 W-MSE 제안.</li>
<li>BYOL, SimSiam(오직 양성 샘플 사용) : 비대칭 학습(asymmetry in learning) 특정 학습 프로토콜 적용</li>
<li>본인들의 W-MSE가 훨씬 단순한 방식 사용하면서도 기존의 SOTA 방법들과 동등하거나 더 나은 분류 정확도를 낸다.</li>
<li>비대칭 학습(asymmetry in learning)과 Whitening 변환(whitening transformation)은서로 대체 가능한 해결책이지만, 이를 결합하는 것도 가능하며, 이는 향후 연구의 방향이 될 수 있다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Paper Review] - Soft Contrastive Learning for Time Series (SoftCLT), ICLR 2024]]></title>
            <link>https://velog.io/@s_gyu/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Soft-Contrastive-Learning-for-Time-Series-SoftCLT-ICLR-2024</link>
            <guid>https://velog.io/@s_gyu/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Soft-Contrastive-Learning-for-Time-Series-SoftCLT-ICLR-2024</guid>
            <pubDate>Sun, 09 Mar 2025 07:10:58 GMT</pubDate>
            <description><![CDATA[<h2 id="main-contribution"><strong>[Main Contribution]</strong></h2>
<ul>
<li>시계열 데이터에 특화된 Soft Contrasive Learning 전략을 제안</li>
<li>다양한 다운스트림 작업에서 기존 contrasive learning 방법론 모델들보다 좋은 성능을 보임</li>
<li>plug - and - play 방식이기 때문에 다른 모델 프레임워크에 쉽게 적용시킬 수 있음. (모듈화)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/705da74a-697e-4a44-9bc4-daabd6cd623a/image.png" alt=""></p>
<p>기존 Contrasive Learning을 활용한 방법론들은 시계열 특성을 반영하기 위해 다양한 시도를 함.</p>
<ul>
<li>instance - wise</li>
<li>Temporal</li>
<li>Hierarchical</li>
</ul>
<br>
그러나 시계열 특성을 고려하면서 hard assignment에서 soft assignment로 바꾼 시도는 없었음

<p>이 논문에서 제안한 SoftCLT는 instance-wise, Temporal, Hierarchical, Soft assignment를 모두 고려함 </p>
<p>또한,  SoftCLT는 대부분의 Contrasive learning 들이 Embedding space 상에서 유사도를 측정하는 반면에  </p>
<blockquote>
<p>시계열 데이터는 Data space 상에서 유사도를 비교하는것이 효과적이라고 주장</p>
</blockquote>
<br>

<h2 id="softclt-overview">[SoftCLT overview]</h2>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/1641a85b-be70-4493-b707-c1fc35f7d7ac/image.png" alt=""></p>
<p>기존 Hard assignment경우, positive는 1, negative는 0으로 판별</p>
<ul>
<li>문제점 : 임의로 threshold에 대해서 데이터가 강제적으로 분리되면서 모호함에 대한 문제</li>
</ul>
<p>Soft assignment의 경우, 시계열 특성을 반영하여 유사도를 측정하고, 보다 더 풍부한 정보를 학습할 수 있도록 유도(모호한 부분이 없도록 유도할수 있다. )</p>
<p>(시계열 특성을 반영하기 위한 두가지 방법론 제시)</p>
<ol>
<li>instance-wise CL : 시계열 데이터 간의 거리를 기반으로 인스턴스 간의 관계를 학습</li>
<li>Temporal CL : timestamp간의 차이를 기반으로 동일 시계열 내의 시간적 관계를 학습</li>
</ol>
<br>

<h3 id="논문-definition"><strong>[논문 Definition]</strong></h3>
<p>$\text{Non-linear embedding function} \Rightarrow f_{\theta}: x \to r$ </p>
<ul>
<li>비선형 임베딩 함수 $fθ$  <strong>*<em>를 학습하여 *</em>임베딩 벡터</strong> $r_i$ 를 생성하는 것이 목표</li>
</ul>
<p>$\text{Time series data} \Rightarrow X = {x_1, ..., x_N}; \quad N: batch_num, \quad x_i \in \mathbb{R}^{T \times D}$ </p>
<p>$\text{Embedding vector} \Rightarrow r_i = [r_{i,1}, ..., r_{i,T}]^\top \in \mathbb{R}^{T \times M}$ </p>
<p>$T: \text{sequence length}$ </p>
<p>$D: \text{input feature dimension}$ </p>
<p>$M: \text{embedded feature dimension}$</p>
<br>

<p>1.**  [Soft Instance-wise Contrasive Learning]**</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/689adbef-dc22-4cfc-8f96-9bf6a2258f19/image.png" alt=""></p>
<p>$w_I(i, i&#39;) = 2\alpha \cdot \sigma(-\tau_I \cdot D(x_i, x_{i&#39;}))$  → Soft assignment Definition</p>
<p>$\sigma(a) \text{는 시그모이드 함수}$ </p>
<p>$\tau_l \text{는 assignment의 sharpness를 조절하는 하이퍼파라미터}$</p>
<ul>
<li>$\alpha \text{는 } [0,1] \text{ 범위의 soft assignment의 상한값}$<ul>
<li>Soft Assignment의 최대값을 제한하는 역할</li>
</ul>
</li>
<li>$D(x_i, x_{i&#39;}) \text{는 시계열 데이터 } x_i \text{와 } x_{i&#39;} \text{ 간의 거리}$<ul>
<li>두 샘플이 얼마나 유사한지 측정하는 거리 함수 (<strong>DTW</strong>, Euclidean distance, cosine distance, TAM(time allignment measurement)).</li>
</ul>
</li>
</ul>
<br>

<p>(positive든 negative든 sampling을 하기위해서는)</p>
<ul>
<li>Argumentation을 통해 시계열 데이터를 증가하고, 아래를 정의를 가정
<img src="https://velog.velcdn.com/images/s_gyu/post/06aace01-8ed8-4fc0-8a89-99cfc57f1b53/image.png" alt=""></li>
</ul>
<p>Contrasive learning은 cross entropy loss로 학습가능</p>
<p>따라서 유사도 학습을 위해 softmax 수식을 정의
<img src="https://velog.velcdn.com/images/s_gyu/post/361cb14a-956f-483c-bd93-b91ab726fde9/image.png" alt="">
<br></p>
<p>cf) InfoNCE loss
Contrasive learning에서 주로 쓰이는 loss function</p>
<aside>
💡
Soft CLT 같은 경우는 데이터 Space 상에서 유사도를 비교하기 떄문에 따로 임베딩을 시키지 않는점이 InfoNCE loss와의 차이

</aside>

<br>
<br>

<p>loss function </p>
<p>$\ell_{I}^{(i,t)} = -\log p_I((i, i+N), t) - \sum_{j=1, j \neq {i,i+N}}^{2N} w_I(i, j \mod N) \cdot \log p_I((i, j), t)$</p>
<ul>
<li><p>첫번째 Term은 instance i와 positive pair i+N의 유사성을 나타내는 소프트맥스 확률</p>
<ul>
<li><p>첫번째 텀은 positive pair의 loss를 나타내고, 두번째 텀은 positive pair 제외하고 나머지 pair들의 loss를 soft assignment값으로 가중하여 계산하는 텀</p>
</li>
<li><p>이것을 통해 positive pair는 가까워지게 나머지 pair멀어지게 학습</p>
</li>
</ul>
</li>
</ul>
<br>

<ol start="2">
<li><strong>[Soft Temporal Contrastive Learning]</strong></li>
</ol>
<p>$w_T(t, t&#39;) = 2 \cdot \sigma(-\tau_T \cdot |t - t&#39;|)$ → Soft Assignment Definition</p>
<p>$\sigma(a) \text{는 시그모이드 함수}$</p>
<p>$\tau_l \text{는 assignment의 sharpness를 조절하는 하이퍼파라미터}$</p>
<p>$|t - t&#39;| \text{는 두 타임스탬프 간의 차이}$</p>
<br>

<p>Argumentation을 통해 시계열 데이터를 증가하고, 아래를 정의를 가정
<img src="https://velog.velcdn.com/images/s_gyu/post/a561147a-d30a-4cdf-80b3-678db47537eb/image.png" alt=""></p>
<p>Contrasive learning은 cross entropy loss로 학습가능</p>
<p>따라서 유사도 학습을 위해 softmax 수식을 정의
<img src="https://velog.velcdn.com/images/s_gyu/post/d3d358f0-7f88-4b8e-9567-c45ae767cc0a/image.png" alt=""></p>
<br>

<p>[Soft Temporal Contrastive Learning]
<img src="https://velog.velcdn.com/images/s_gyu/post/0ff485e7-113d-4be2-8e8c-a478a2b58de1/image.png" alt=""></p>
<ul>
<li>TS2Vec 논문의 hierarchical contrastive loss 차용<ul>
<li>hierarchical contrastive loss ,  hierarchical representation 은 시계열 데이터의 복잡한 패턴, 구조를 효과적으로 학습할 수 있도록 함.</li>
</ul>
</li>
<li>Max pooling을 통해 각 타임스탬프를 통합</li>
<li>Depth가 깊어질수록 그 의미가 점점 모호해지기 때문에 dissimiliarity가 증가함.</li>
<li>이러한 특성을 토대로 soft assignment를 조절하는 $\tau_T$를 조정<ul>
<li>sharpness가 낮을수록 완만하게 assignment</li>
</ul>
</li>
<li>이런식으로 계측정 표현 특징들을 잘 학습할 수 있도록 loss function을 구성</li>
</ul>
<p>loss function</p>
<ul>
<li>$\ell_{T}^{(i,t)} = -\log p_T(i, (t, t+T)) - \sum_{s=1, s \neq {t,t+T}}^{2T} w_T(t, s \mod T) \cdot \log p_T(i, (t, s))$</li>
</ul>
<br>

<p><strong>최종 손실 함수 정의</strong></p>
<ul>
<li><p>$L = \frac{1}{4NT} \sum_{i=1}^{2N} \sum_{t=1}^{2T} 
(\lambda \ell_{I}^{(i,t)} + (1 - \lambda) \ell_{T}^{(i,t)})$</p>
<p>  람다 1-람다는 각각의 가중치를 나타냄</p>
</li>
</ul>
<br>

<h2 id="실험결과"><strong>실험결과</strong></h2>
<ul>
<li>SCL자체가 plug and play 방식이기 때문에 기존의 CL 모델에 이걸 모듈처럼 넣어서 성능이 얼마나 높아졌는지를 확인 가능 </li>
</ul>
<ol>
<li>classification 
<img src="https://velog.velcdn.com/images/s_gyu/post/db621f07-765b-42c0-970f-8e0c15dcf36b/image.png" alt="">
UCR : 단변량 시계열 벤치마크 데이터셋</li>
</ol>
<p>UEA : 다변량 시계열 분류를 위한 벤치마크 데이터</p>
<p>TS2Vec(2022)은  hierarchical contrastive loss를 도입한 논문</p>
<ol start="2">
<li>Semi &amp; Self-supervised classification
<img src="https://velog.velcdn.com/images/s_gyu/post/b02c4ca9-7139-4911-8edc-9eeaf3755184/image.png" alt=""></li>
</ol>
<ul>
<li>1% label 데이터를 사용한 경우 실험</li>
<li>5% label 데이터를 사용한 경우 실험</li>
</ul>
<ol start="3">
<li>in &amp; Cross domain transfer learning </li>
</ol>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fffcf743-932e-42c6-82ef-108a31f06d4c/image.png" alt=""></p>
<ol start="4">
<li>Anomaly Detection
<img src="https://velog.velcdn.com/images/s_gyu/post/8722d13d-ddef-4130-861e-924bfae8bdf0/image.png" alt=""></li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<ul>
<li>이 연구는 시계열 데이터 특성을 고려하여 Soft Contrasive Learning을 적용</li>
<li>plug and play 방식으로 구현해서 다른 프레임워크에 자유롭게 적용가능<ul>
<li>확실히 기존 contrastive learning 방법론들보다 시계열 task에서 뛰어난 성능을 보이는것은 맞으나, 지금 현 시점에서는 SOTA인지는 확인이 필요함.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Batch Normalization(배치 정규화)]]></title>
            <link>https://velog.io/@s_gyu/Batch-Normalization%EB%B0%B0%EC%B9%98-%EC%A0%95%EA%B7%9C%ED%99%94</link>
            <guid>https://velog.io/@s_gyu/Batch-Normalization%EB%B0%B0%EC%B9%98-%EC%A0%95%EA%B7%9C%ED%99%94</guid>
            <pubDate>Wed, 31 Jul 2024 12:43:12 GMT</pubDate>
            <description><![CDATA[<h2 id="1-batch-normalization란">1. <strong>Batch Normalization</strong>란?</h2>
<ul>
<li>Batch Normalization은 <strong>학습 과정</strong>에서 각 배치 단위 별 다양한 분포를 가진 데이터를 각 배치별로 <strong>평균</strong>과 <strong>분산</strong>을 이용해 <strong>정규화</strong>하는 것이다.</li>
<li>Batch Normalization는 별도의 과정으로 있는 것이 아닌, 신경망 안에 포함되어 학습시 평균과 분산으로 조정하는 과정이다.</li>
<li>평균은 0, 표준 편차는 1로 데이터의 분포를 조정할 수 있다.</li>
</ul>
<blockquote>
<p><strong>즉, 배치 정규화란 말 그대로 배치 단위로 normalization(표준정규화)을  해주는 layer를 말한다.</strong></p>
</blockquote>
</aside>

<h2 id="2--batch-normalization-필요성">2.  <strong>Batch Normalization 필요성</strong></h2>
<ol>
<li><strong>기울기 소실 문제</strong><ul>
<li>배치 normalization이 없었을때, 뉴럴 네트워크의 학습이 잘 안 되는 이유는 <strong>기울기 소실 문제 때문</strong>이다.</li>
<li>뉴럴 네트워크는 손실 함수(Loss Function)에 대한 기울기(Gradient)를 이용해 역전파(Backpropagation) 과정을 통해 학습을 한다.</li>
<li>하지만 밑의 그림과 같이 활성화 함수로 들어오는 값이 <strong>매우 크거나 매우 작아질 경우</strong>, Tanh 함수의 기울기는 0에 가깝기 때문에  역전파 과정에서 뉴럴 네트워크의 파라미터가 거의 업데이트되지 않게 된다.<br>


</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/a572d9d2-262f-46fa-aa58-4759aad2b62a/image.png" alt=""></p>
<br>

<p>💡 뉴럴 네트워크에 들어오는 값들을 정규분포를 그리도록 보정해주면 활성화 함수를 통한 gradient가 매우 잘되어 역전파 과정도 원활하게 되고, 결과적으로 뉴럴 네트워크가 잘 학습된다. 이것이 Batch Normalization이 필요한 이유이다.</p>
<blockquote>
<p>** 참고**
pytorch를 사용하면 간단하게 forward pass 안에서 print를 함으로서 활성화 함수로 들어오는 값이 매우 크거나 매우 작아질 경우를 알 수 있다. 
하지만 대부분 간단한 네트워크에서 학습이 잘 안된다면, vanishing gradient 문제인 경우가 많다고 한다 :)</p>
</blockquote>
<br>

<blockquote>
<p><strong>Batch Normalization에서 가장 중요한 것은 training 단계와 test 단계에서 다르게 적용되어야 한다.</strong>
<br></p>
</blockquote>
<h2 id="3-training-단계의-배치-정규화">3. training 단계의 배치 정규화</h2>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Resize Example</title>
</head>
<body>
    <img src="https://velog.velcdn.com/images/s_gyu/post/3c922144-567a-479d-9a11-030dc2100352/image.png" width="400" alt="Resized Image">
</body>
</html>



<p>다음과 같은 뉴럴 네트워크가 있다고 하자.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/ec83c7a8-a995-4c04-a51c-4faa2c6faf2a/image.png" alt=""></p>
<p>여기서 동그라미 친 뉴럴 네트워크의 중간 layer를 한번 살펴보자. 문제는 활성화 함수로 들어오는 값이 너무 크거나 작아서 gradient가 0이 된다는 것이다. 이때 활성화 함수로 들어가기 전에 배치 방향으로 배치 정규화를 시켜준다면 활성화 함수로 들어가는 값들은 0을 중심으로 표준화되어 들어가게 된다.</p>
<p>그렇다면 우리는 배치 정규화를 통해 input을 모두 정규화하면, 활성화 함수에는 정규화된 input이 들어가게 된다. 하지만 여기까지만 수행하면 뉴럴 네트워크가 학습되지 않는다. 왜냐하면 모든 레이어에 똑같이 0의 평균을 가지고 1의 분산을 가진 정규화된 input만 들어오면, 늘 어디서든 똑같은 분포만 들어오게 되기 때문이다.</p>
<p>이러면 뉴럴 네트워크가 구분하거나 학습해야 할 의미 있는 input이 들어오지 않게 된다. 활성화 함수(non-linear 함수)가 의미가 있기 위해서는 어떤 input은 좁은 정규분포를 가진 input, 어떤 input은 넓은 분포를 가진 input, 오른쪽이나 왼쪽으로 치우친 분포를 가진 input들이 들어와야 한다.</p>
<p><strong>즉, layer 마다 다른 형태의 정규분포의 input 들이 들어와야 한다는 말이다</strong></p>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Resize Example</title>
</head>
<body>
    <img src="https://velog.velcdn.com/images/s_gyu/post/57e41410-4166-4d2b-bdfe-c222cb4be6bb/image.png" width="400" alt="Resized Image">
</body>
</html>



<br>

<p>이제 수식을 통해 살펴보자</p>
<br>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Resize Example</title>
</head>
<body>
    <img src="https://velog.velcdn.com/images/s_gyu/post/4eedaf54-82ea-4b5a-8a53-85b953972a19/image.png" width="800" alt="Resized Image">
</body>
</html>






<p>여기에 추가적으로 <strong>parameter</strong>인 <strong>γ(scale), β(shift)</strong>가 나온다.</p>
<ul>
<li>γ는 정규화된 input에 곱해지면서 정규화된 input이 더 좁거나 넓어지게 만들고 (scale을 의미)</li>
<li>β는 그 정규분포를 오른쪽 왼쪽으로 움직이는 값을 의미한다</li>
</ul>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image Resize Example</title>
</head>
<body>
    <img src="https://velog.velcdn.com/images/s_gyu/post/ec83c7a8-a995-4c04-a51c-4faa2c6faf2a/image.png" width="400" alt="Resized Image">
</body>
</html>



<p>그림을 보면 현재 feature는 4개이고 각각의 feature에 대한 γ(scale), β(shift)가 추가된다. 이런 학습 가능한 parameter들이 추가되면 뉴런에는 다양한 형태의 인풋들이 들어오게 되어, training 속도를 빠르고 안정적으로 만든다.</p>
<p>이렇게 배치 normalization을 적용하면 bias는 의미가 없어지게 되므로, 배치 normalization 이전에는 bias를 더해주지 않아도 된다.</p>
<h3 id="training-단계-정리">Training 단계 정리</h3>
<ul>
<li><p>깊은 뉴럴 네트워크의 vanishing gradient 문제를 완화하기 위해 배치 normalization을 적용한다.</p>
</li>
<li><p>배치 normalization은 배치 방향으로 표준화하고, activation 함수의 의미 있는 값을 전달하기 위해 각 feature별로 γ(scale), β(shift)를 역전파 과정을 통해 학습한다.</p>
</li>
<li><p>배치 normalization을 적용하면 bias term이 의미가 없어지므로, 삭제하는 것이 좋다.</p>
</li>
</ul>
<br>

<h2 id="4-test-단계의-배치-정규화">4. test 단계의 배치 정규화</h2>
<ul>
<li><p>test 단계에서는 test 데이터에 대해 답을 내야 하므로 평균과 분산을 계산할 수 없다.</p>
</li>
<li><p>그렇기 때문에 , test 단계에서 BN을 적용할때는 training data를 모두 가져와서 이때의 평균과 분산을 사용해야한다.</p>
</li>
<li><p>하지만 실제 뉴럴 네트워크를 training 시킬때에는 데이터가 무수히 많아서 전체 데이터에 대한 통계를 내는것은 불가능하다.</p>
</li>
</ul>
<aside>
💡 이때 test 단계에서는 moving average라는 개념을 통해 전체 데이터에 대한 평균과 분산을 구하게 된다.



<p>💡 그리고 이 값을 뉴럴 네트워크를 실행할때 정규화를 위해 쓰게된다</p>
</aside>

<blockquote>
<p>이동 평균(Moving average)</p>
</blockquote>
<p>$$
\hat{\mu} \leftarrow \alpha \hat{\mu} + (1-\alpha)\mu_\beta^{(i)}
$$</p>
<p>$$
\hat{\sigma} \leftarrow \alpha \hat{\sigma} + (1-\alpha)\sigma_\beta^{(i)}
$$</p>
<p><strong>최종적으로 하나의 배치 놈에서 하나의 feature에 대한 parameter는 총 4개가 된다.</strong></p>
<ul>
<li><p>γ, β → 역전파 과정을 통해 학습</p>
</li>
<li><p>μ^, σ^ → moving average를 통해 학습</p>
</li>
</ul>
<p><strong>그렇기 때문에 Batch norm layer는 training 과정과 test 과정에서 특성이 달라진다.</strong></p>
</aside>



<h2 id="5-왜-learning-rate를-키워도-될까">5. 왜 Learning rate를 키워도 될까?**</h2>
<p>평균 0, 표준 편차 1인 가운데로 값들을 뿌려주기 때문에, 입력 값들에 대한 update 해야하는 편차들이 크지 않는다. 즉, Learning rate를 크게 해도 상관없다.</p>
<h2 id="6--최종-정리">6.  최종 정리</h2>
<ul>
<li><p>배치 정규화는 평균과 분산을 구하는 것이 아닌 <em>γ</em>(Scale), <em>β</em>(Shift)을 학습 파라미터로 사용하여 비선형성을 유지하며 학습한다.</p>
</li>
<li><p>배치 정규화는 별도의 과정으로 있는 것이 아닌, 신경망 안에 포함되어 학습시 평균과 분산으로 조정하는 과정이다.</p>
</li>
<li><p>기존 방법에서는 Learning rate를 높게 잡을 경우 gradient vanishing/explode 하는 경향이 있었었다.</p>
</li>
<li><p>gradient의 scale, 초기값에 대한 dependency 감소 -&gt; 배치 정규화를 사용할 경우 파라미터의 scale에 영향을 받지 않게 되기 때문에 Learning rate를 높게 설정할 수 있다. -&gt; 빠르고 안정적인 학습이 가능해짐.</p>
</li>
<li><p>Regularization 효과가 있기 때문에 dropout을 안해도 되는 장점이 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[가중치 초기화(Weight initialization)]]></title>
            <link>https://velog.io/@s_gyu/%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94Weight-initialization</link>
            <guid>https://velog.io/@s_gyu/%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94Weight-initialization</guid>
            <pubDate>Thu, 25 Jul 2024 10:39:49 GMT</pubDate>
            <description><![CDATA[<h3 id="목차">목차</h3>
<ol>
<li><p><a href="#%EA%B0%80%EC%A4%91%EC%B9%98-%EC%B4%88%EA%B8%B0%ED%99%94%EB%9E%80">가중치 초기화란?</a></p>
</li>
<li><p><a href="#zero-initialization-%EC%A0%9C%EB%A1%9C-%EC%B4%88%EA%B8%B0%ED%99%94">Zero Initialization (제로 초기화)</a></p>
<ul>
<li><a href="#%EA%B0%80%EC%A4%91%EC%B9%98%EC%9D%98-%EC%B4%88%EA%B9%83%EA%B0%92%EC%9D%84-%EB%AA%A8%EB%91%90-0%EC%9C%BC%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EB%A9%B4-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%90%A0%EA%B9%8C">가중치의 초깃값을 모두 0으로 설정하면 어떻게 될까?</a></li>
<li><a href="#%EC%9D%B4%EC%9C%A0">이유</a></li>
</ul>
</li>
<li><p><a href="#xavier-initialization-%EC%9E%90%EB%B9%84%EC%97%90-%EC%B4%88%EA%B8%B0%ED%99%94">Xavier Initialization (자비에 초기화)</a></p>
<ul>
<li><a href="#%EA%B8%B0%EB%B3%B8-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4">기본 아이디어</a></li>
<li><a href="#%EC%88%98%EC%8B%9D">수식</a><ul>
<li><a href="#%EC%A0%95%EA%B7%9C%EB%B6%84%ED%8F%AC-gaussian-distribution">정규분포 (Gaussian distribution)</a></li>
<li><a href="#%EA%B7%A0%EB%93%B1-%EB%B6%84%ED%8F%AC-uniform-distribution">균등 분포 (Uniform distribution)</a></li>
</ul>
</li>
<li><a href="#%EC%A0%95%EB%A6%AC">정리</a></li>
</ul>
</li>
<li><p><a href="#he-%EC%B4%88%EA%B8%B0%ED%99%94he-initialization">He 초기화(He initialization)</a></p>
<ul>
<li><a href="#%EA%B8%B0%EB%B3%B8-%EC%95%84%EC%9D%B4%EB%94%94%EC%96%B4-1">기본 아이디어</a></li>
<li><a href="#%EC%88%98%EC%8B%9D-1">수식</a></li>
</ul>
</li>
<li><p><a href="#%EC%A0%95%EB%A6%AC-1">정리</a></p>
</li>
</ol>
<hr>
<h3 id="1-가중치-초기화란">1. 가중치 초기화란?</h3>
<ul>
<li>같은 모델을 훈련하더라도 <strong>가중치가 초기에 어떤 값을 가졌느냐에 따라</strong>서 모델의 훈련 결과가 달라지기도 한다.</li>
<li>다시 말해 가중치 초기화만 적절히 해줘도 기울기 소실 문제와 같은 문제를 완화시킬 수 있다.<br>

</li>
</ul>
<h3 id="2--zero-initialization-제로-초기화">2.  Zero Initialization (제로 초기화)</h3>
<ul>
<li>모든 가중치를 0으로 초기화 하는 방법이다.</li>
</ul>
<p>여기서 의문.. 
<br></p>
<p><strong>Q) 가중치의 초깃값을 모두 0으로 설정하면 어떻게 될까?</strong></p>
<ul>
<li>결론적으로 말하면 가중치 초깃값을 0으로로 하면 학습이 올바로 이루어지지 않게 된다. (정확히는 가중치를 균일한 값으로 설정해서는 안된다)
<br><br></li>
</ul>
<p><strong>그 이유는</strong> :</p>
<ul>
<li><strong>오차역전파 계산시 모든 가중치의 값이 똑같이 갱신되기 때문이다. (</strong>해당그림에서는 0으로 같음)</li>
<li>그래서 가중치들은 같은 초깃값에서 시작하고 갱신을 거쳐도 여전히 같은 값을 유지하게된다.</li>
<li>이는 가중치를 여러개를 갖는 의미를 사라지게한다.</li>
</ul>
<p>그림의 계산 과정을 보면 이해하는데 도움이 된다. 
<br></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/24ab5d72-ada7-4811-acac-73f72ca241a1/image.png" alt=""></p>
<p>→  <strong>따라서 우리는 가중치 초깃값을 무작위로 설정해야한다.!!</strong></p>
<h3 id="3-xavier-initialization-자비에-초기화"><strong>3. Xavier Initialization (자비에 초기화)</strong></h3>
<p><strong>기본 아이디어</strong> </p>
<ul>
<li>Xavier Initialization의 기본 아이디어는 각 층의 입력과 출력의 분산을 균형 있게 유지하여, 신경망의 각 층에서 신호가 너무 커지거나 작아지지 않도록 하는 것이다.</li>
<li>이를 위해서 <strong>이전 layer의 뉴런 개수와 다음 layer의 뉴런 개수를 이용하여 가중치를 초기화한다.</strong></li>
</ul>
<br>

<p><strong>수식</strong></p>
<ul>
<li>Xavier Initialization에는 두 가지 방법이 있다.</li>
<li>정규 분포 (Gaussian distribution)와 균등 분포 (Uniform distribution)를 사용하는 방법이 있다.<br>

</li>
</ul>
<p><strong>1) 정규분포(Gaussian distribution)</strong>:</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/b04c7db3-dcf2-4fdc-9c0a-0d0e78efb877/image.png" alt=""></p>
<p><strong>2) 균등 분포(Uniform distribution)</strong>:</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6b41f816-f43d-4cb0-a218-17b40e05ff11/image.png" alt=""></p>
<p><strong>정리</strong></p>
<ul>
<li><strong>Xavier Initialization</strong>는 여러 층의 기울기 분산 사이에 균형을 맞춰서 특정 층이 너무 주목을 받거나 다른 층이 뒤쳐지는 것을 막는다.</li>
<li><strong>Xavier Initialization는</strong> 시그모이드 함수나 하이퍼볼릭 탄젠트 함수와 같은 S자 형태인 활성화 함수와 함께 사용할 경우에는 좋은 성능을 보이지만,</li>
<li>RELU 함수와 함께 사용할 경우에는 성능이 좋지 않다.</li>
</ul>
<br>

<h3 id="4-he-초기화he-initialization">4. <strong>He 초기화(He initialization)</strong></h3>
<p><strong>기본 아이디어</strong> </p>
<ul>
<li><p>ReLU 에 특화된 초기값이다. (<strong>Xavier Initialization에서는 ReLU 함수를 사용할때 비효율적)</strong></p>
</li>
<li><p>He 초기화는 Xavier Initialization과 다르게 <strong>다음층의 뉴런의 수를 반영하지 않고, 이전 layer의 뉴런수를 이용한다.</strong></p>
<p>  ex) 앞 계층의 노드가 n개일때, 표준편차가 \sqrt{\frac{2}{n_{\text{in}}}} 정규분포를 사용한다. </p>
</li>
</ul>
<br>

<p><strong>수식</strong></p>
<p>He 초기화는 가중치를 다음과 같은 방식으로 초기화한다. </p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/7d7ebb5d-ddd1-4249-8abc-45e2ccafc366/image.png" alt=""></p>
<hr>
<h3 id="정리">정리</h3>
<ul>
<li><strong>시그모이드 함수나 하이퍼볼릭탄젠트 함수</strong>를 사용할 경우에는 <strong>Xavier Initialization</strong>이 효율적이다.</li>
<li>ReLU 계열 함수를 사용할 경우에는 He 초기화 방법이 효율적이다.</li>
<li>ReLU + He 초기화 방법이 좀 더 보편적임.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[최적화 알고리즘 - RMSProp,Adam]]></title>
            <link>https://velog.io/@s_gyu/%EC%B5%9C%EC%A0%81%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-RMSPropAdam</link>
            <guid>https://velog.io/@s_gyu/%EC%B5%9C%EC%A0%81%ED%99%94-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-RMSPropAdam</guid>
            <pubDate>Sat, 13 Jul 2024 11:10:11 GMT</pubDate>
            <description><![CDATA[<h2 id="1-rmsprop">1. RMSProp</h2>
<h3 id="rmsprop-개요">RMSProp 개요</h3>
<p><strong>RMSProp</strong>(Root Mean Square Propagation)은 <strong>Adagrad</strong>의 단점을 보완하기 위해 등장했다. <strong>Adagrad</strong>는 학습이 진행될수록 학습률이 점점 작아져 학습이 멈추는 문제가 있는데, <strong>RMSProp</strong>은 이를 해결하려고 고안된 알고리즘이다.</p>
<h3 id="rmsprop-동작-방식">RMSProp 동작 방식</h3>
<p>RMSProp의 핵심 아이디어는 최근 기울기를 <strong>지수 이동 평균(Exponential Moving Average, EMA)</strong>으로 계산하여 <strong>학습률을 조정</strong>하는 것이다. 이는 학습률이 너무 작아지는 문제를 방지해준다. </p>
<br>
구체적인 수식은 이러하다.
<br>

<p>$$
\mathbf{h}<em>{t} = \rho \mathbf{h}</em>{t-1} + (1 - \rho) \nabla J(\mathbf{W}, b)^2
$$</p>
<p>$$
\mathbf{W} = \mathbf{W} - \frac{\eta}{\sqrt{\mathbf{h}_{t}} + \epsilon} \nabla J(\mathbf{W}, b)
$$</p>
<ul>
<li>여기서 &quot;$\rho$&quot;는 decay rate로 보통 0.9로 설정한다.</li>
<li>Adagrad식의 &quot;$h$&quot;와 squared gradient에 각각 &quot;$\rho$&quot;, &quot;$(1−\rho)$&quot;의 decay rate가 붙는다. 보통 &quot;$\rho = 0.9$&quot; 정도로 설정되는데, 이렇게 되면 이전 스텝의 기울기를 더 크게 반영하여 &quot;$h$&quot; 값이 단순 누적되는 것을 방지할 수 있다.</li>
</ul>
<h3 id="rmsprop의-장점">RMSProp의 장점</h3>
<ol>
<li><strong>적응형 학습률</strong>: Adagrad처럼 매개변수마다 다른 학습률을 적용하지만, 학습률이 지나치게 작아지는 문제를 방지한다.</li>
<li><strong>효율적 계산</strong>: 지수 이동 평균을 사용해 최근 기울기의 평균을 계산하여 안정적인 학습이 가능하다.</li>
</ol>
<hr>
<h2 id="2-adam">2. Adam</h2>
<h3 id="adam-개요">Adam 개요</h3>
<p><strong>Adam</strong>(Adaptive Moment Estimation)은 RMSProp과 <strong>모멘텀</strong>의 장점을 결합한 알고리즘으로 딥러닝에서 가장 많이 사용되는 옵티마이저이다. </p>
<p><strong>Adam은 1차 모멘트(gradient를 중심으로 하는 모멘텀 계열)</strong>와 <strong>2차 모멘트(gradient 제곱에 반비례하는 ada, rmsprop 계열)</strong>를 동시에 고려하여 학습을 진행한다. </p>
<h3 id="adam-동작-방식">Adam 동작 방식</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/b94402bf-a2f3-4589-ae8e-265565866b71/image.png" alt=""></p>
<p><strong>Adam</strong>은 <strong>Momentum 방식</strong>과 유사하게 지금까지 계산해온 기울기의 지수 평균을 저장하며, <strong>RMSProp</strong>과 유사하게 기울기의 제곱값에 지수평균을 저장한다. 이를 통해 기울기 값과 기울기의 제곱값의 지수이동평균을 활용하여 step 변화량을 조절한다. 또한, 초기 몇 번의 업데이트에서 0으로 편향되어 출발 지점에서 멀리 떨어진 곳으로 이동하는, 초기 경로의 편향 문제가 있는 RMSProp의 단점을 보정하는 매커니즘이 반영된다.
<br></p>
<p>Adam의 구체적인 수식은 다음과 같다.
<br></p>
<ol>
<li><strong>1차 모멘트 추정값 (기울기의 평균)</strong></li>
</ol>
<p>$$
\mathbf{m}<em>{t} = \beta_1 \mathbf{m}</em>{t-1} + (1 - \beta_1) \nabla J(\mathbf{W}, b)
$$</p>
<ol start="2">
<li><strong>2차 모멘트 추정값 (기울기의 분산)</strong></li>
</ol>
<p>$$
\mathbf{v}<em>{t} = \beta_2 \mathbf{v}</em>{t-1} + (1 - \beta_2) \nabla J(\mathbf{W}, b)^2
$$</p>
<ol start="3">
<li><strong>편향 보정</strong></li>
</ol>
<p>$$
\hat{\mathbf{m}}<em>{t} = \frac{\mathbf{m}</em>{t}}{1 - \beta_1^t}
$$</p>
<p>$$
\hat{\mathbf{v}}<em>{t} = \frac{\mathbf{v}</em>{t}}{1 - \beta_2^t}
$$</p>
<ol start="4">
<li><strong>매개변수 업데이트</strong></li>
</ol>
<p>$$
\mathbf{W}<em>{t+1} = \mathbf{W}</em>{t} - \frac{\eta}{\sqrt{\hat{\mathbf{v}}<em>{t}} + \epsilon} \hat{\mathbf{m}}</em>{t}
$$</p>
<p>여기서, &quot;$\beta_1$&quot;과 &quot;$\beta_2$&quot;는 각각 1차 모멘트와 2차 모멘트의 decay rate로, 보통 0.9와 0.999로 설정합니다. &quot;$\epsilon$&quot;은 수치적 안정성을 위한 아주 작은 값입니다.</p>
<h3 id="1차-모멘트와-2차-모멘트">1차 모멘트와 2차 모멘트</h3>
<p>Adam은 1차 모멘트와 2차 모멘트를 사용하는데, 여기서 모멘트는 수리통계학에서 사용되는 적률(moments) 개념을 말한다</p>
<ul>
<li><strong>1차 모멘트</strong>는 데이터의 평균을 나타냅니다. 수식으로는 기울기 &quot;$\nabla J(\mathbf{W}, b)$&quot;의 평균을 의미한다.</li>
<li><strong>2차 모멘트</strong>는 데이터의 분산을 나타내며, 기울기 제곱 &quot;$\nabla J(\mathbf{W}, b)^2$&quot;의 평균을 의미한다.</li>
</ul>
<p>Adam에서의 1차 모멘트 추정치는 기울기의 지수 이동 평균으로, 2차 모멘트 추정치는 기울기 제곱의 지수 이동 평균으로 계산됩니다. 이 추정치들은 각각 기울기의 방향과 크기를 조절하는 데 사용된다.</p>
<h3 id="불편-추정치">불편 추정치</h3>
<p>초기 몇 번의 업데이트에서 모멘트 값이 0에 가까워지는 편향 문제가 발생할 수 있다. 이를 해결하기 위해 Adam은 편향 보정을 사용한다. 이는 불편 추정치를 계산하여 초기 편향 문제를 해결한다.</p>
<ol>
<li><strong>1차 모멘트 불편 추정치</strong></li>
</ol>
<p>$$
\hat{\mathbf{m}}<em>{t} = \frac{\mathbf{m}</em>{t}}{1 - \beta_1^t}
$$</p>
<ol start="2">
<li><strong>2차 모멘트 불편 추정치</strong></li>
</ol>
<p>$$
\hat{\mathbf{v}}<em>{t} = \frac{\mathbf{v}</em>{t}}{1 - \beta_2^t}
$$</p>
<h3 id="adam의-강점">Adam의 강점</h3>
<ol>
<li><strong>빠른 수렴</strong>: RMSProp과 모멘텀의 장점을 결합하여 빠른 수렴 속도를 자랑한다.</li>
<li><strong>적응형 학습률</strong>: 매개변수마다 다른 학습률을 적용하므로, 학습이 안정적이다.</li>
<li><strong>편향 보정</strong>: 초기 단계에서의 편향 문제를 보정하여 학습이 더욱 안정적으로 진행된다.</li>
<li><strong>넓은 범위에서 효과적</strong>: Adam은 매우 다양한 신경망 구조에서 잘 작동하며, 현재 가장 많이 사용되는 알고리즘 중 하나이다.</li>
</ol>
<h3 id="adam의-하이퍼파라미터-설정">Adam의 하이퍼파라미터 설정</h3>
<p>Adam의 하이퍼파라미터로는 &quot;$\beta_1$&quot;, &quot;$\beta_2$&quot;, &quot;$\epsilon$&quot;, 그리고 학습률 &quot;$\eta$&quot;가 있다. 일반적으로 &quot;$\beta_1 = 0.9$&quot;, &quot;$\beta_2 = 0.999$&quot;, &quot;$\epsilon = 10^{-8}$&quot;로 설정하고, 학습률 &quot;$\eta$&quot;는 여러 값을 시도하여 최적의 값을 찾는 것이 좋다.</p>
<hr>
<h2 id="옵티마이저-정리">옵티마이저 정리</h2>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/ac64e41c-606d-476e-9a5d-35781706c416/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[최적화 알고리즘 - SGD, Momentum, Nesterov momentum, Adagrad
]]></title>
            <link>https://velog.io/@s_gyu/Temp-Title</link>
            <guid>https://velog.io/@s_gyu/Temp-Title</guid>
            <pubDate>Sat, 13 Jul 2024 09:38:29 GMT</pubDate>
            <description><![CDATA[<h3 id="참고자료">참고자료</h3>
<blockquote>
<p>밑바닥부터 시작하는 딥러닝</p>
</blockquote>
<h2 id="들어가기에-앞서">들어가기에 앞서</h2>
<p>신경망 학습의 목적은 손실 함수의 값을 가능한 낮추는 매개변수를 찾는것이다.</p>
<p>이는 곧 매개변수의 최적값을 찾는 문제라고 할 수 있으며 이러한 문제를 푸는것이 “최적화”라고 한다.</p>
<p>이 부분에서는  SGD, Momentum,  Nesterov momentum, Adagrad, RMSProp, Adam 등 다양한 최적화 최적화 알고리즘(=옵티마이저)에 대해서 정리하고자 한다.</p>
<h2 id="1-옵티마이저">1. 옵티마이저</h2>
<p><strong>옵티마이저</strong>란 딥러닝과 머신러닝에서 모델의 매개변수를 최적화하는 알고리즘을 의미한다.</p>
<p>구체적으로, 옵티마이저는 <strong>손실 함수(loss function)</strong>를 최소화하는 방향으로 모델의 <strong>가중치(weight)</strong>와 <strong>편향(bias)</strong>을 업데이트한다. </p>
<hr>
<h2 id="2-확률적-경사-하강법stochastic-gradient-descent"><strong>2. 확률적 경사 하강법(Stochastic Gradient Descent)</strong></h2>
<h3 id="다시-한번-개념-정리">다시 한번 개념 정리</h3>
<p><strong>배치 경사 하강법(Batch Gradient Descent, BGD)</strong>은 전체 데이터셋(=배치)에 대한 손실함수의 기울기(gradient)를 <strong>한 번</strong>만 계산하여 모델의 parameter를 업데이트하는 방식이다</p>
<p>즉, 전체 훈련 데이터셋에 대해 가중치를 편미분, 업데이트 하는 방식이다.</p>
<blockquote>
<p>W<em>=</em>W<em>−</em>α<em>∇</em>J<em>(</em>W<em>,</em>b)</p>
</blockquote>
<p>배치 경사 하강법은 한 스텝에 모든 훈련 데이터셋을 사용하기 떄문에 학습 시간이 오래 걸린다</p>
<p>이러한 단점을 개선한 방법이 SGD 이다.</p>
<p><strong>확률적 경사 하강법(Stochastic Gradient Descent, SGD)</strong>은 임의로 선택한 데이터에 대해 손실함수의 기울기(gradient)를 계산하여 모델의 parameter를 업데이트 하는 방법이다</p>
<p>적은 데이터를 사용하므로 BGD보다 계산이 빠르다.</p>
<p>아래의 그림을 보면 비교가 가능하다.</p>
<p><strong>확률적 경사 하강법 장점</strong></p>
<ul>
<li>parameter의 변경 폭이 불안정하고, 정확도가 낮을 수 있지만 속도가 빠르다는 장점</li>
</ul>
<p><strong>미니 배치 경사 하강법(mini-batch gradient descent)</strong>은 전체 데이터셋을 미니 배치(mini-batch) 여러 개로 나눈 뒤,</p>
<p>미니 배치 한 개마다 기울기를 구합니다. 그 평균 기울기를 이용하여 모델을 업데이트해서 학습하는 방법이다.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/8973551c-9224-4740-b2c5-5402c5283b16/image.png" alt=""></p>
<p><strong>미니 배치 경사 하강법 장점</strong></p>
<ul>
<li>미니 배치 경사 하강법은 전체 데이터를 계산하는 것보다 빠름</li>
<li>확률적 경사 하강법보다 안정적이어서 가장 많이 사용됨</li>
<li>변경 폭이 확률적 경사 하강법에 비해 안정적이면서 속도도 빠름</li>
</ul>
<p><strong>&lt;확률적 경사 하강법 VS 미니 배치 경사 하강법</strong>&gt;</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/549e78e9-c4f2-4057-b692-85dbb0693da3/image.png" alt=""></p>
<p>SGD의 parameter 변경 폭은 불안정합니다. 이 문제를 해결하기 위해 학습 속도와 운동량을 조절하는 <strong>optimizer</strong>를 적용할 수 있다</p>
<p>SGD의 단점을 개선해주는 <em>Momentum</em>, <em>Adagrad</em>, <em>Adam</em>의 세 가지 방법이 있다.</p>
<h3 id="learning-rateη">learning rate(η)</h3>
<p>학습률이란 최적화 할 때의 속도를 조절하는 하이퍼파라미터이며, <code>step size</code>라고도 합니다.
모델의 parameter를 업데이트할 때 적용되는 스텝의 크기를 결정합니다.</p>
<p><strong>학습률이 너무 크면</strong>:</p>
<ul>
<li>매개변수가 최적점 근처에서 진동하거나 발산할 수 있다</li>
<li>손실 함수의 최솟값에 도달하지 못하고 계속해서 이동한다.</li>
<li>학습이 불안정하고 수렴하지 않는다.</li>
</ul>
<p><strong>학습률이 너무 작으면</strong>:</p>
<ul>
<li>매개변수 업데이트가 매우 작아져 학습 속도가 느려진다.</li>
</ul>
<hr>
<h2 id="3-sgd의-단점">3. SGD의 단점.</h2>
<p>SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효율적일 때가 있다.</p>
<p>SGD의 단점을 알아보고자 다음 함수의 최솟값을 구하는 문제를 생각해보자.</p>
<p><strong>&lt;그래프와 등고선&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/f4c4438d-02e3-4b04-bca2-352d2097f34b/image.png" alt=""></p>
<p><strong>&lt;기울기를 시각화한 모습&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/c2898ef8-8fea-4e27-ba5e-ee5f0eef27b7/image.png" alt=""></p>
<p>이 기울기는 y축 방향은 크고 x축 방향은 작습니다. 여기에서 주의할 점은 최솟값이 되는 장소는 (x, y) = (0, 0)이지만, 그림이 보여주는 기울기 대부분은 (0, 0) 방향을 가리키지 않는다.</p>
<p>SGD에 의한 최솟값 갱신경로를 확인해 보자.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/f5b7de7b-8ceb-40f0-ba3b-400183646509/image.png" alt=""></p>
<p>SGD는 위 그림과 같이 상당히 비효율적인 움직임을 보인다</p>
<p>즉, <strong>SGD의 단점은 비등방성함수(방향에 따라 성질, 기울기가 달라지는 함수)에서는 탐색 경로가 비효율적</strong>이라는 것이다.</p>
<p>SGD가 지그재그로 탐색하는 근본 원인은 기울어진 방향이 본래의 최솟값과 다른 방향을 가리키는 점이다.</p>
<h2 id="4-momentum">4. <strong>Momentum</strong></h2>
<p>모멘텀은 최적해를 향해 진행하던 속도에 관성을 주어 <strong>SGD가 갖고 있던 문제</strong></p>
<ul>
<li>느린 학습 속도</li>
<li>saddle point에서 학습 종료</li>
<li>진동이 심한 점</li>
</ul>
<p>등을 해결한 알고리즘이다.</p>
<p><strong><em>Momentum</em></strong>은 &#39;운동량&#39;을 뜻하는 단어이다.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6a9661ce-4cb7-49a0-88ba-bd1540205d1c/image.png" alt=""></p>
<p>물리적 법칙을 이용해서 이렇게 설명할 수 있다.</p>
<p>위 <strong><em>α</em></strong>는 실제로 공기 저항이나 마찰 등에 해당하는 역할이며, <strong>마찰 계수</strong>라 불린다</p>
<p><strong>보통 <em>*α</em></strong>는 <em>0.9나 0.99로 설정</em></p>
<p><strong>*αV항</strong>은 물체가 아무런 힘을 받지 않을때 서서히 하강시키는 역할을 한다.*</p>
<p><strong>V</strong>는 물체의 속도(velocity)이다. </p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/e7cd95bb-034a-42b4-9dcc-185a473877c5/image.png" alt=""></p>
<p>모멘텀의 이동은 이렇다.</p>
<p>관성은 변수가 가던 방향으로 계속 가도록 하는 속도항을 추가하는 것인데, 기울기가 0이더라도 속도가 있어 더 잘 탈출하게 된다.</p>
<p>즉 , 진행하던 속도에 관성이 적용되니까 saddle point를 만나거나 local minima에 빠지더라도 그 지점을 벗어날 수 있다.</p>
<p>SGD는 기울기가 계속해서 바뀔 때, 다른쪽으로 튕겨나갈 수 있는데 관성이 작용하면 진행하던 속도를 유지하며 부드럽게 이동하게 된다.</p>
<p>위 그림에서도 실제로 곡선의 형태로 부드럽게 이동하는 것을 볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/031f9ba5-0c2c-4040-8e7a-3a4284636087/image.png" alt=""></p>
<p>△ 부드럽게 이동, SGD, Momentum 속도 차이</p>
<h3 id="overshooting-문제"><strong>overshooting 문제</strong></h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/6eff5261-c8e5-4895-9b62-7115117d28c9/image.png" alt=""></p>
<p><em>Momentum*의 단점으로 *overshooting</em> 문제가 있다.</p>
<p><strong>경사가 가파른 곳을 빠른 속도로 내려오다 관성을 이기지 못하고 최소 지점을 지나쳐 버리는 현상</strong>이다.</p>
<p>그레디언트가 완만하다면 최적해를 잘 찾겠지만, 가파를수록 overshooting될 가능성이 크다.</p>
<p>위의 오른쪽 그림을 보면, gradient보다 속도가 더 크기 때문에 실제 step이 커지고 지나치게 된다.</p>
<p>다음은 <em>Momentum의 식입니다.</em> </p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/2a33cac2-ac02-43f7-82ee-55bb9e3ccb85/image.png" alt=""></p>
<h2 id="5-nesterov-momentum"><strong>5. Nesterov momentum</strong></h2>
<p><strong>네스테로프 모멘텀은</strong> 위에서 오버슈팅의 문제를 해결하기 위한 방법으로, </p>
<p><em>현재의 속도 벡터</em>와 현재 속도로 한 걸음 미리 가 본 위치의 <em>그레디언트 벡터</em>를 더해 다음 위치를 정합니다.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fba1326c-f96a-4837-bb3a-9dab20a09f11/image.png" alt=""></p>
<p>다음 속도vt+1v_{t+1}</p>
<p>vt+1는 현재 속도에 마찰 계수</p>
<p>ρ\rho</p>
<p>ρ를 곱한 뒤 한 걸음 앞서서 예상 위치의 기울기를 빼서 계산된다.</p>
<p>네스테로프 모멘텀은 진행하던 속도에 관성을 주는 점은 SGD 모멘텀과 같다.</p>
<p>하지만 <strong>오버슈팅을 막기 위해</strong> 현재 속도로 한 걸음 미리 가 보고 오버 슈팅이 된 만큼 다시 내리막길로 내려가는 방식이다.</p>
<p>네스테로프 모멘텀은 관성이 커지더라도 오버슈팅이 될지 살펴본 다음에 교정하기 때문에 오버슈팅이 억제된다.</p>
<h3 id="정리">정리</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/63be4b98-acca-491e-8567-881e92390324/image.png" alt=""></p>
<p>모멘텀은 모멘텀 값과 기울기 값이 더해져서 실제 스텝을 결정하는데 반면,</p>
<p>네스테로프 모멘텀은 모멘텀 값이 적용된 지점에서 기울기 값을 계산한다.</p>
<p>모멘텀은 속도는 빠르지만 멈추어야 할 시점에서도 관성에 의해 훨씬 멀리 간다는 단점이 있지만,</p>
<p>네스테로프 방법은 모멘텀으로 절반 정도 이동한 후 어떤 방식으로 이동할지 다시 계산해서 스텝을 결정하기 때문에 단점을 극복합니다.</p>
<hr>
<h3 id="learning-rate-decay-학습률-감소">learning rate decay (학습률 감소)</h3>
<p>초반에는 큰 폭으로 이동하여 최대한 빠르게 내려가고, 점차 학습률을 줄여 조심스럽게 내려가는 방법입니다.</p>
<blockquote>
<p>초반엔 높은 학습률로 시작해 학습률을 조금씩 낮춰 작게 학습하는 방법</p>
</blockquote>
<hr>
<h2 id="6-adagrad"><strong>6. AdaGrad</strong></h2>
<p><strong>아다그라드(Adagrad)</strong>라고 읽으며, <strong>Adaptive gradient</strong>의 줄임말이다. </p>
<p>Adagrad는 이름에서도 살짝 알 수 있듯이, <em>손실 함수 곡면의 변화에 따라 적응적으로 학습률을 정하는 알고리즘이다.</em></p>
<p>학습률이 너무 작으면 학습 시간이 너무 길고, 너무 크면 발산해서 학습이 제대로 이루어지지 않기 때문에 <strong>Adagrad</strong>는 이런 문제를 학습률 감소를 통해 해결한다. </p>
<blockquote>
<p>즉, 많이 변화한 매개변수는 최적해에 근접했을 거란 가정하에 작은 크기로 이동하면서 세밀하게 값을 조정하고 반대로 적게 변화한 변수들은 많이 변화하도록 학습률을 크게 하여 빠르게 오차 값을 줄이고자 하는 방법이다.</p>
</blockquote>
<blockquote>
<p> 지금까지 많이 변화한 매개변수는 적게 변화하도록하고, 적게 변화한 매개변수는 많이 변화하도록 learning rate의 값을 조절하는 개념이다.</p>
</blockquote>
<p>아래 식은 <strong>AdaGrad의 갱신 방법에 대한 수식</strong>이다. 
<img src="https://velog.velcdn.com/images/s_gyu/post/720a3163-df85-4a58-9e15-81c673692b90/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/4de6ab0f-9fb8-4b5f-aa78-0d16156b79ae/image.png" alt=""></p>
<p><strong>연산 기호⊙</strong> 는 element wise multiplication으로 행렬의 원소별 곱셈을 의미한다.</p>
<p><strong>h는 이전 기울기의 제곱들이 누적되어 더해지게 되고,</strong> </p>
<p><strong>w(parameter)</strong>를 업데이트 할때 1/ √h 를 곱해 학습률을 조정하게 된다.</p>
<p>매개변수의 원소 중에서 많이 움직인(크게 갱신된) 원소는 학습률이 낮아진다는 뜻인데</p>
<blockquote>
<p>즉, Adagrad는 학습률 감소가 적응적으로 매개변수의 원소마다 다르게 적용되어 학습을 진행하게 된다. </p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/8b0822b5-765f-4375-ad94-94b093df8e0c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기울기 소실 문제(Problem Vanishing Gradient)]]></title>
            <link>https://velog.io/@s_gyu/%EA%B8%B0%EC%9A%B8%EA%B8%B0-%EC%86%8C%EC%8B%A4-%EB%AC%B8%EC%A0%9CProblem-Vanishing-Gradient</link>
            <guid>https://velog.io/@s_gyu/%EA%B8%B0%EC%9A%B8%EA%B8%B0-%EC%86%8C%EC%8B%A4-%EB%AC%B8%EC%A0%9CProblem-Vanishing-Gradient</guid>
            <pubDate>Fri, 28 Jun 2024 11:30:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>참고자료 <a href="https://ydseo.tistory.com/41">https://ydseo.tistory.com/41</a></p>
</blockquote>
<h2 id="1-기울기-소실-문제problem-vanishing-gradient">1. 기울기 소실 문제(Problem Vanishing Gradient)</h2>
<h3 id="문제">[문제]</h3>
<p>gradient 기반의 method는 parameter value의 작은변화가 network output에 얼마나 영향을 미칠지를 이해하는 것을 기반으로 parameter value를 학습시킨다.</p>
<p>만약 parameter value의 변화가 network output에 매우 작은 변화를 야기한다면, 네트워크는 parameter를 효과적으로 학습시킬 수 없게 되는데 이것이 문제다.</p>
<aside>
💡 gradient라는 것이 결국 미분값 즉 변화량을 의미하는데, 이 변화량이 매우 작다면, network 를 효과적으로 학습시키지 못하고, error rate이 미쳐 다 낮아지지 못한채 수렴해버리는 문제가 발생한다는 것 같다.

</aside>

<p>이 문제로 초기 레이어에서 각각의 parameter들에 대한 network ouput의 gradient가 극도로 작아지게 되는데 이 상황이 바로 기울기 소실의 문제이다. </p>
<h3 id="간단-정리">&lt;간단 정리&gt;</h3>
<ul>
<li>기울기 소실 문제는 역전파 알고리즘을 통해 가중치를 업데이트할 때, 처음 입력층(input layer)으로 진행할수록 기울기가 점차적으로 작아지다가 나중에는 거의 기울기의 변화가 없어지는 문제를 말한다.</li>
<li>특히 이 문제는 네트워크에서 앞쪽 레이어의 파라미터들을 학습시키고, 튜닝하기 정말 어렵게 만든다. 또한 신경망 구조에서 레이어가 늘어날수록 악화된다.</li>
</ul>
<aside>
💡 **→ 이로 인해 네트워크의 초깊은 층은 학습이 거의 되지 않게 된다**

</aside>

<h2 id="2-기울기-소실의-원인">2. 기울기 소실의 원인</h2>
<p>기울기 소실의 문제는 활성화 함수를 선택하는 문제에 의존적으로 일어난다. </p>
<p>기울기 소실의 예로 시그모이드 함수를 사용한 예시를 통해 알아보도록 하자. 시그모이드 함수를 사용하는데 시그모이드 함수의 특성으로 인해 기울기 소실 문제가 발생한다. </p>
<ul>
<li>다음은 시그모이드(로지스틱 함수) 함수와 시그모이드 함수의 미분그래프이다.</li>
</ul>
<p><strong>&lt;시그모이드 함수&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/16e36e72-7335-41ae-9aab-50a1f0005515/image.png" alt=""></p>
<p><strong>&lt;시그모이드 미분 그래프 &gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/d80edf89-921d-4455-9420-ae2ebe8c3b98/image.png" alt=""></p>
<p>sigmoid 함수를 미분한 함수의 그래프를 보니 기울기가 최대가 0.25이고 최소가 0에 수렴한다. 즉 0 ~ 0.25사이의 값을 가진다. </p>
<p>역전파에서 입력층에 가까운 앞쪽의 layer로 갈수록 sigmoid 함수의 미분을 연쇄적으로 곱하는데 기울기가 1보다 작으므로 곱할수록 값은 점점 작아진다. layer가 아주 많으면 입력층에 가까운 앞쪽의 layer로 갈수록 기울기의 값은 거의 0에 가깝게 작아져서 가중치의 변화가 거의 없게 되고 error값도 더 이상 줄어들지 않게 된다.</p>
<p><strong>구체적인 예시를 통해 확인해보자.</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/88edc0ee-1323-469a-abf3-b2c429864fee/image.png" alt=""></p>
<ul>
<li><p>z1,z2,z3: 각 레이어의 노드 출력과 가중치의 합성곱.</p>
</li>
<li><p>h1,h2,h3h_1, h_2, h_3h1,h2,h3: 각각 z1,z2,z3 값의 활성화 함수, 즉 시그모이드 함수의 결과 (각 노드의 출력).</p>
<p>  z1,z2,z3z_1, z_2, z_3</p>
</li>
<li><p>J: 시스템의 에러를 집계하여 반환하는 손실 함수 (loss function).</p>
</li>
</ul>
<p>손실 함수 J의 출력을 최소화하기 위해 경사 하강법(gradient descent)을 사용하여 가중치를 업데이트하기 위해 역전파(Backpropagation)를 수행한다.</p>
<p><strong>&lt;가중치 w1에 대해 미분수행 (chain rule) &gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/4621375f-2cd0-48e3-9f14-bcdeb5abd170/image.png" alt=""></p>
<p>layer가 진행될 수록 sigmoid 함수가 연속으로 곱해지는 것을 알 수 있다. sigmoid 함수의 미분은 0 ~ 0.25로 1보다 작으므로 곱해지는 횟수가 많을 수록 값은 점점 더 작아진다. 즉 layer가 많을 수록 기울기의 값은 더 작아진다.</p>
<p>이를 해결하기 위하 나온 활성함수가 바로 ReLU(Rectified Linear Unit)이다.</p>
<h2 id="2-relu-함수"><strong>2. ReLU 함수</strong></h2>
<p>Neural Network를 처음 배울 때 activation function으로 sigmoid function을 사용한다. sigmoid function이 연속이여서 미분가능한 점과 0과 1사이의 값을 가진다는 점 그리고 0에서 1로 변하는 점이 가파르기 때문에 사용해왔다. 그러나 기존에 사용하던 Simgoid fucntion을 ReLu가 대체하게 된 이유 중 가장 큰 것이 Gradient Vanishing 문제이다. Simgoid function은 0에서 1사이의 값을 가지는데 gradient descent를 사용해 Backpropagation 수행시 layer를 지나면서 gradient(sigmoid함수의 gradient)를 계속 곱하므로 gradient는 점점 0으로 수렴하게 된다. 따라서 layer가 많아지면 잘 작동하지 않게 된다.</p>
<p>따라서 이러한 문제를 해결하기위해 ReLu를 새로운 activation function을 사용한다. ReLu는 입력값이 0보다 작으면 0이고 0보다 크면 입력값 그대로를 내보낸다.</p>
<p>$$
f(x) = \begin{cases}
0 &amp; \text{if } x &lt; 0 \
x &amp; \text{if } x \geq 0
\end{cases}
$$</p>
<p>다음과 같이 간단히 표시할 수 있다.</p>
<p>$$
f(x) = \max(0, x)
$$</p>
<p>그래프는 다음과 같다.</p>
<p><strong>&lt;ReLU 함수 그래프 &gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/c06533db-d1c1-4145-bc2f-58300699c0bc/image.png" alt=""></p>
<p><strong>&lt;ReLU 함수의 기울기에 대한 그래프&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/fb2fd346-d5bf-432a-bb5e-fcdab23bd6d2/image.png" alt=""></p>
<h3 id="relu-함수의-장점과-단점">ReLU 함수의 장점과 단점</h3>
<h3 id="장점">장점</h3>
<ol>
<li><strong>빠른 학습 속도</strong>: 다른 활성화 함수보다 학습이 빠르다. (tanh 함수 대비 6배 빠른 학습 속도)</li>
<li><strong>기울기 소실 문제 없음</strong>: 기울기 소실(Gradient Vanishing) 문제가 발생하지 않는다. (은닉층에 많이 사용되는 이유)</li>
<li><strong>기울기 0 문제 방지</strong>: 학습을 느리게 하는 원인인 기울기(gradient)가 0이 되는 것을 막아준다.</li>
<li><strong>빠른 가중치 업데이트</strong>: 가중치 업데이트 속도가 매우 빠르다.</li>
<li><strong>높은 활용도</strong>: 가장 많이 사용되는 활성화 함수(activation function)이다.</li>
</ol>
<h3 id="단점">단점</h3>
<ol>
<li><strong>음수 값 처리 문제</strong>: 음수 값을 입력 받으면 항상 0으로 반환한다.</li>
<li><strong>기울기 0 문제</strong>: 입력값이 음수인 경우 기울기가 0이 되어 가중치 업데이트가 안될 수 있다. (가중치가 업데이트 되는 과정에서 가중치 합이 음수가 되면 0만 반환되어 아무것도 변하지 않는 현상 발생)<ul>
<li>이 현상을 죽은 뉴런(Dead Neuron) 또는 죽어가는 렐루(Dying ReLU)라고 한다.</li>
</ul>
</li>
<li><strong>지그재그 현상</strong>: 출력값은 0 또는 양수이고, 기울기도 0 또는 1인 양수이다. (최적의 가중치를 찾는 지그재그 현상 발생)</li>
<li><strong>미분 불가</strong>: 0에서 미분이 안된다.</li>
</ol>
<h2 id="3-다양한-relu-함수의-정리">3. 다양한 ReLU 함수의 정리</h2>
<p>ReLU 함수의 기본 형태 외에도, ReLU 함수의 단점을 보완하고 다양한 문제에 더 효과적으로 대처하기 위해 여러 변형된 ReLU 함수들이 개발되었다.</p>
<h3 id="31-leaky-relu-lrelu">3.1 Leaky ReLU (LReLU)</h3>
<p>Leaky ReLU는 ReLU의 단점 중 하나인 &quot;죽은 뉴런(Dead Neuron)&quot; 문제를 해결하기 위해 고안된 함수다. Leaky ReLU는 음수 영역에서 작은 기울기를 가지도록 함으로써 음수 값을 허용한다.</p>
<p>$$
f(x) = \begin{cases} 
0.01x &amp; \text{if } x &lt; 0 \
x &amp; \text{if } x \geq 0 
\end{cases}
$$</p>
<ul>
<li><strong>장점</strong>: 음수 입력에서도 뉴런이 죽지 않도록 한다.</li>
<li><strong>단점</strong>: 추가적인 하이퍼파라미터인 음수 기울기 계수를 선택해야 한다.</li>
</ul>
<h3 id="32-parametric-relu-prelu">3.2 Parametric ReLU (PReLU)</h3>
<p>Parametric ReLU는 Leaky ReLU와 유사하지만, 음수 영역의 기울기를 학습 가능한 파라미터로 둔다.</p>
<p>$$
f(x) = \begin{cases} 
\alpha x &amp; \text{if } x &lt; 0 \
x &amp; \text{if } x \geq 0 
\end{cases}
$$</p>
<ul>
<li><strong>장점</strong>: 데이터에 맞춰 음수 영역의 기울기를 학습할 수 있어 더 유연하다.</li>
<li><strong>단점</strong>: 학습할 파라미터가 추가되어 계산 비용이 증가할 수 있다.</li>
</ul>
<h3 id="33-exponential-linear-unit-elu">3.3 Exponential Linear Unit (ELU)</h3>
<p>ELU는 ReLU의 장점을 가지면서도 음수 영역에서의 값을 부드럽게 만들어준다. 음수 영역에서는 지수 함수를 사용한다.</p>
<p>$$
f(x) = \begin{cases} 
\alpha (e^x - 1) &amp; \text{if } x &lt; 0 \
x &amp; \text{if } x \geq 0 
\end{cases}
$$</p>
<ul>
<li><strong>장점</strong>: 음수 값에서도 기울기가 존재하며, ReLU보다 더 높은 정확도를 보이는 경우가 많다.</li>
<li><strong>단점</strong>: 지수 연산이 들어가므로 계산 비용이 증가할 수 있다.</li>
</ul>
<h3 id="34-scaled-exponential-linear-unit-selu">3.4 Scaled Exponential Linear Unit (SELU)</h3>
<p>SELU는 ELU의 변형으로, 네트워크의 자동 정규화를 유도하는 기능이 있다. SELU 함수는 고정된 스케일링과 이동을 사용하여 평균과 분산을 조절한다.</p>
<p>$$
f(x) = \lambda \begin{cases} 
\alpha (e^x - 1) &amp; \text{if } x &lt; 0 \
x &amp; \text{if } x \geq 0 
\end{cases}
$$</p>
<ul>
<li><strong>장점</strong>: 네트워크의 자동 정규화를 통해 더 깊은 신경망에서도 안정적으로 학습할 수 있다.</li>
<li><strong>단점</strong>: 특정 초기화와 정규화 조건을 필요로 한다.</li>
</ul>
<h3 id="35-relu6">3.5 ReLU6</h3>
<p>ReLU6는 ReLU의 변형으로, 값의 범위를 0과 6 사이로 제한한다. 이는 임베디드 시스템과 같은 환경에서 사용하기 위해 설계되었다.</p>
<p>$$
f(x) = \min(\max(0, x), 6)
$$</p>
<ul>
<li><strong>장점</strong>: 값의 범위를 제한하여 계산의 안정성을 높일 수 있다.</li>
<li><strong>단점</strong>: 특정 응용 분야에만 유용하다.</li>
</ul>
<h3 id="36-maxout">3.6 Maxout</h3>
<p>Maxout은 선형 함수 중 최댓값을 취하는 방식으로 동작한다. 이는 뉴런의 활성화 함수로 사용되며, 주어진 입력에 대해 여러 가중치와 바이어스를 통해 계산된 값 중 최댓값을 반환한다.</p>
<p>$$
f(x) = \max(w_1^T x + b_1, w_2^T x + b_2)
$$</p>
<ul>
<li><strong>장점</strong>: 더 복잡한 함수를 모델링할 수 있어 표현력이 높다.</li>
<li><strong>단점</strong>: 계산 비용이 증가하며, 가중치의 수가 늘어난다.</li>
</ul>
<h3 id="학습-회고">학습 회고</h3>
<ul>
<li></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[손으로 공부하는 역전파(BackPropagation)]]></title>
            <link>https://velog.io/@s_gyu/%EC%86%90%EC%9C%BC%EB%A1%9C-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%97%AD%EC%A0%84%ED%8C%8CBackPropagation</link>
            <guid>https://velog.io/@s_gyu/%EC%86%90%EC%9C%BC%EB%A1%9C-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%97%AD%EC%A0%84%ED%8C%8CBackPropagation</guid>
            <pubDate>Fri, 28 Jun 2024 08:56:50 GMT</pubDate>
            <description><![CDATA[<h2 id="역전파backpropagation">역전파(BackPropagation)</h2>
<ul>
<li>예시</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/cd82f851-50ef-4292-9fb9-b8dcd75b2170/image.png" alt=""></p>
<ul>
<li><p>z1,z2,z3: 각 레이어의 노드 출력과 가중치의 합성곱.</p>
</li>
<li><p>h1,h2,h3h_1, h_2, h_3h1,h2,h3: 각각 z1,z2,z3 값의 활성화 함수, 즉 시그모이드 함수의 결과 (각 노드의 출력).</p>
<p>  z1,z2,z3z_1, z_2, z_3</p>
</li>
<li><p>J: 시스템의 에러를 집계하여 반환하는 손실 함수 (loss function).</p>
</li>
</ul>
<p>손실 함수 J의 출력을 최소화하기 위해 경사 하강법(gradient descent)을 사용하여 가중치를 업데이트하기 위해 역전파(Backpropagation)를 수행한다.</p>
<h3 id="가중치-w1에-대해-미분하려면-chain-rule에-따라-다음과-같이-미분이-된다">가중치 w1에 대해 미분하려면 chain rule에 따라 다음과 같이 미분이 된다.</h3>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/443d6fae-387c-4d7b-bb69-d4147cd68416/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/a263f9ad-8efe-4f9f-afb2-a77ee7e523b7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/dd7104d0-1559-413f-9ae9-7a430348c1d4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/d9b1f21a-1fd7-4b71-b2ce-ef8c93ff1ecf/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/cac8f450-3306-4c9e-8199-1ce4be846ddc/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/e271c370-46e5-49fe-88a9-a471fea6c46a/image.png" alt=""></p>
<h3 id="학습-회고">학습 회고</h3>
<p>기울기 소실에 대해서 공부하다가 <strong>역전파 과정</strong>에 대해서 손으로 직접 풀어보았다.
손으로 풀 생각은 없었다. 다음부턴 코드로 띡 쓸란다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[과적합 방지 기법(딥러닝)]]></title>
            <link>https://velog.io/@s_gyu/%EA%B3%BC%EC%A0%81%ED%95%A9-%EB%B0%A9%EC%A7%80-%EA%B8%B0%EB%B2%95%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@s_gyu/%EA%B3%BC%EC%A0%81%ED%95%A9-%EB%B0%A9%EC%A7%80-%EA%B8%B0%EB%B2%95%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Wed, 26 Jun 2024 06:35:57 GMT</pubDate>
            <description><![CDATA[<h3 id="과적합overfitting이-발생하는-이유">과적합(overfitting)이 발생하는 이유</h3>
<ul>
<li><strong>데이터 수가 적은 경우</strong></li>
<li><strong>모델의 파라미터가 많은 경우</strong><ul>
<li>딥러닝 모델은 고전 머신러닝 모델에 비해 압도적으로 파라미터가 많기 때문에 과적합이 되기 쉽다</li>
</ul>
</li>
</ul>
<h2 id="과적합-방지-기법">과적합 방지 기법</h2>
<h3 id="1-데이터-관련-기법">1. 데이터 관련 기법</h3>
<ul>
<li><p><strong>데이터 양 증가</strong>: 충분한 데이터가 있으면 모델이 일반적인 패턴을 학습하여 과적합을 방지할 수 있습니다. 데이터가 부족한 경우에는 데이터 증강(Data Augmentation) 기법을 사용하게 된다.</p>
<ul>
<li><strong>데이터 증강(Data Augmentation)</strong>: 모델의 학습 과정에서 데이터의 양과 다양성을 인위적으로 늘리는 기법입니다. 이는 모델의 일반화 성능을 향상시키고 과적합을 방지하는 데 매우 효과적입니다. 데이터 증강은 특히 이미지 처리와 같은 비정형 데이터에서 자주 사용됩니다.</li>
<li>예를 들어, 이미지 데이터의 경우 이미지를 회전, 확대, 축소하거나 노이즈를 추가하는 등의 방법이 있습니다.</li>
</ul>
<h4 id="이미지-데이터-증강-기법">이미지 데이터 증강 기법</h4>
<p>다양한 이미지 변형 기법을 사용하여 데이터 증강을 수행할 수 있습니다.</p>
<ul>
<li><strong>회전(Rotation)</strong>: 이미지를 일정 각도로 회전시킵니다.</li>
<li><strong>이동(Translation)</strong>: 이미지를 수평 또는 수직 방향으로 이동시킵니다.</li>
<li><strong>확대 및 축소(Scaling)</strong>: 이미지를 확대하거나 축소합니다.</li>
<li><strong>뒤집기(Flipping)</strong>: 이미지를 좌우 또는 상하로 뒤집습니다.</li>
<li><strong>잘라내기(Cropping)</strong>: 이미지의 일부분을 잘라내어 사용합니다.</li>
<li><strong>노이즈 추가(Add Noise)</strong>: 이미지에 무작위 노이즈를 추가합니다.</li>
<li><strong>밝기 변화(Change Brightness)</strong>: 이미지의 밝기를 조절합니다.</li>
<li><strong>왜곡(Distortion)</strong>: 이미지를 비틀거나 왜곡시킵니다.</li>
</ul>
</li>
</ul>
<h3 id="2-모델-관련-기법">2. 모델 관련 기법</h3>
<ul>
<li><strong>드롭아웃(Dropout)</strong>: 학습 과정에서 임의의 뉴런을 비활성화(즉, &quot;드롭&quot;)하여 모델의 복잡도를 줄이고, 특정 뉴런에 대한 의존도를 낮추어 일반화 성능을 향상시킵니다.</li>
</ul>
<aside>
💡 **즉, 드롭아웃은 학습 과정에서 신경망의 일부를 사용하지 않는 방법입니다.**
</aside>

<h4 id="작동-원리">작동 원리</h4>
<ol>
<li><strong>뉴런 비활성화</strong>: 학습 중에 각 학습 단계에서 뉴런을 무작위로 비활성화합니다. 비활성화된 뉴런은 해당 학습 단계 동안 입력 및 출력을 무시합니다.</li>
<li><strong>확률적 드롭</strong>: 각 뉴런이 드롭아웃될 확률을 설정합니다. 일반적으로 0.5 (50%)의 비율이 많이 사용되며, 이는 뉴런의 절반을 비활성화한다는 의미입니다.</li>
<li><strong>앙상블 효과</strong>: 드롭아웃은 학습 과정에서 다양한 서브 네트워크를 훈련시키는 것과 유사합니다. 이는 마치 여러 모델을 앙상블하여 사용하는 효과를 냅니다.</li>
<li><strong>예측 시 활성화</strong>: 예측 단계에서는 모든 뉴런을 사용합니다. 학습 시 드롭아웃으로 비활성화된 뉴런의 효과를 보상하기 위해 뉴런의 출력을 드롭아웃 확률로 나눕니다.</li>
</ol>
<h4 id="예시">예시</h4>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/2d526294-c106-4c06-bec1-00a5b523fecb/image.png" alt=""></p>
<ul>
<li>예를 들어 드롭아웃의 비율을 0.5로 한다면 학습 과정마다 랜덤으로 절반의 뉴런을 사용하지 않고, 절반의 뉴런만을 사용합니다.</li>
<li>드롭아웃은 신경망 학습 시에만 사용하고, 예측 시에는 사용하지 않는 것이 일반적입니다. 학습 시에 인공 신경망이 특정 뉴런 또는 특정 조합에 너무 의존적이게 되는 것을 방지해주고, 매번 랜덤 선택으로 뉴런들을 사용하지 않으므로 서로 다른 신경망들을 앙상블하여 사용하는 것 같은 효과를 내어 과적합을 방지합니다.</li>
</ul>
<ul>
<li><strong>Early Stopping</strong>: 학습 과정에서 검증 데이터(validation set)의 성능을 지속적으로 모니터링하여, 성능이 더 이상 향상되지 않으면 학습을 중단</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/696ceb28-9942-499c-94ee-e0d045d0759d/image.png" alt=""></p>
<h3 id="작동-원리-1">작동 원리</h3>
<ol>
<li><strong>훈련 데이터와 검증 데이터</strong>: 모델을 학습할 때 데이터를 훈련 데이터(training set)와 검증 데이터(validation set)로 나눕니다. 훈련 데이터는 모델의 가중치를 학습하는 데 사용되고, 검증 데이터는 모델의 일반화 성능을 평가하는 데 사용됩니다.</li>
<li><strong>모니터링</strong>: 학습 과정에서 각 에포크(epoch)마다 검증 데이터에 대한 성능(예: 손실(loss) 또는 정확도(accuracy))을 평가합니다.</li>
<li><strong>중단 조건</strong>: 검증 데이터의 성능이 일정 횟수(patience) 동안 향상되지 않으면 학습을 중단합니다. 여기서 patience는 성능이 향상되지 않는 에포크 수를 의미합니다. 이 값을 설정하여 모델이 너무 빨리 멈추지 않도록 조절할 수 있습니다.</li>
</ol>
<h3 id="주요-매개변수">주요 매개변수</h3>
<ul>
<li><strong>monitor</strong>: 모니터링할 성능 지표를 지정합니다. 일반적으로 &#39;val_loss&#39; 또는 &#39;val_accuracy&#39;를 사용합니다.</li>
<li><strong>patience</strong>: 성능이 향상되지 않는 에포크 수를 지정합니다. 이 값 동안 성능이 향상되지 않으면 학습을 중단합니다.</li>
<li><strong>restore_best_weights</strong>: 학습 종료 시점에 검증 성능이 가장 좋았을 때의 가중치를 복원합니다. 이를 통해 최적의 모델을 얻을 수 있습니다.</li>
</ul>
<h3 id="3-규제화regularization">3. 규제화(Regularization)</h3>
<ul>
<li><p><strong>L1 및 L2 정규화</strong>: 손실 함수에 가중치 패널티를 추가하여 모델의 복잡도를 제한.</p>
<ul>
<li><strong>L1 규제</strong>: 모든 가중치의 절대값 합을 비용 함수에 추가합니다. 이로 인해 일부 가중치가 0이 되어 특정 특성이 모델에 사용되지 않게 됩니다.<ul>
<li>비용 함수에 λ∑|w|를 추가.</li>
</ul>
</li>
<li><strong>L2 규제</strong>: 모든 가중치의 제곱합을 비용 함수에 추가합니다. 이로 인해 가중치 값이 0에 가깝게 되지만 완전히 0이 되지는 않습니다.<ul>
<li>비용 함수에 λ∑w²를 추가.</li>
<li>인공 신경망에서는 가중치 감쇠(weight decay)라고도 불립니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>배치 정규화(Batch Normalization)</strong>: 각 배치마다 입력을 정규화하여 학습을 안정화하고 과적합을 방지합니다.</p>
</li>
</ul>
<hr>
<h3 id="요약">요약</h3>
<p>딥러닝 모델의 과적합을 방지하기 위해서는 데이터 양을 늘리거나 모델의 복잡도를 줄이는 등 여러 가지 기법을 사용가능.</p>
<p>데이터 증강, 드롭아웃, 가중치 규제 등 다양한 방법들을 적절히 조합하여 사용하면 과적합 문제를 효과적으로 완화할 수 있습니다. 각 기법을 잘 이해하고 상황에 맞게 적용하는 것이 중요</p>
<h3 id="학습-회고">학습 회고</h3>
<ul>
<li>기존 ML을 배우면서 overfitting 방지 방법에 대해서 배워 L1,L2 regularization에 대해서는 알고있었다.</li>
<li>이외의 내용에 대해서는 이번의 정리를 통해서 알게되었고 아직 이미지 데이터를 다뤄보진 않아 데이터 증강 방법에 대해서는 후에 더 공부를 해야 좀 더 이해 할 수 있을거같다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[다중 클래스 분류와 소프트맥스 함수]]></title>
            <link>https://velog.io/@s_gyu/%EB%8B%A4%EC%A4%91-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B6%84%EB%A5%98%EC%99%80-%EC%86%8C%ED%94%84%ED%8A%B8%EB%A7%A5%EC%8A%A4-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@s_gyu/%EB%8B%A4%EC%A4%91-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B6%84%EB%A5%98%EC%99%80-%EC%86%8C%ED%94%84%ED%8A%B8%EB%A7%A5%EC%8A%A4-%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 25 Jun 2024 10:57:27 GMT</pubDate>
            <description><![CDATA[<p>다중 클래스 분류는 여러 개의 클래스 중 하나를 예측하는 문제이다. 
이를 위해 신경망을 사용하여 각 클래스에 대한 확률을 계산하고, 가장 높은 확률을 가진 클래스를 선택하게 된다. </p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/5aab55d8-efc5-4512-8c61-ce9e30ee93ac/image.png" alt=""></p>
<h4 id="신경망-구조">신경망 구조</h4>
<ol>
<li><p><strong>입력층 (Input Layer)</strong>:</p>
<ul>
<li>입력 데이터 ( x_1 ), ( x_2 )를 포함</li>
<li>보통 bias 항도 포함됨.</li>
</ul>
</li>
<li><p><strong>은닉층 (Hidden Layer)</strong>:</p>
<ul>
<li>입력층의 데이터를 처리하여 중간 표현을 만듭니다. 이 예시에서는 ( u_1, u_2, u_3 ) 세 개의 은닉층 뉴런이 있습니다.</li>
<li>각 입력 특성은 은닉층의 모든 뉴런과 연결됩니다.</li>
</ul>
</li>
<li><p><strong>출력층 (Output Layer)</strong>:</p>
<ul>
<li>최종적으로 각 클래스에 대한 예측 값을 출력합니다. 여기서는 ( y_1, y_2, y_3 ) 세 개의 뉴런이 있습니다.</li>
<li>이 예측 값들은 소프트맥스 함수를 통해 확률로 변환됩니다.</li>
</ul>
</li>
</ol>
<h3 id="소프트맥스-함수-적용">소프트맥스 함수 적용</h3>
<p>소프트맥스 함수는 신경망의 출력값을 확률 값으로 변환합니다. 다음과 같이 정의됩니다:</p>
<div style="text-align: center;">
    P(y = k|x) = <span style="font-size: 1.2em;">&#x0213C;</span> <span style="vertical-align: super;">k</span>
    <span style="font-size: 1.2em;">&#x02215;</span> <span style="vertical-align: sub;">1</span>
    exp(z_k) / &Sigma;<sub>c=1</sub><sup>C</sup> exp(z_c)
</div>

<p>여기서:</p>
<ul>
    <li>P(y = k|x): 입력 x가 주어졌을 때 클래스 k에 속할 확률.</li>
    <li>z_k: 클래스 k에 대한 신경망의 출력값.</li>
    <li>&Sigma;<sub>c=1</sub><sup>C</sup> exp(z_c): 모든 클래스에 대한 출력값의 지수 함수 값의 합.</li>
</ul>

<br>
❓ FAQ

<p><strong>Q) 소프트맥스함수와 시그모이드 함수의 차이점은 무엇인가?</strong></p>
<ul>
<li>시그모이드 함수는 이진 분류 문제에서 사용되며, 개별 출력 값이 0과 1 사이에 있음</li>
<li>소프트맥스 함수는 다중 클래스 분류 문제에서 사용되며, 출력 값들이 확률 분포를 형성하여 전체 합이 1이 됨. </li>
</ul>
<h4 id="차이점-요약">차이점 요약</h4>
<table>
<thead>
<tr>
<th>특징</th>
<th>시그모이드 함수</th>
<th>소프트맥스 함수</th>
</tr>
</thead>
<tbody><tr>
<td>정의</td>
<td>(\sigma(z) = \frac{1}{1 + \exp(-z)})</td>
<td>(P(y = k</td>
</tr>
<tr>
<td>출력 범위</td>
<td>0 ~ 1</td>
<td>0 ~ 1 (출력 값 합이 1)</td>
</tr>
<tr>
<td>주요 용도</td>
<td>이진 분류</td>
<td>다중 클래스 분류</td>
</tr>
<tr>
<td>출력 특징</td>
<td>개별 출력 값</td>
<td>확률 분포 (출력 값 합이 1)</td>
</tr>
<tr>
<td>적용 사례</td>
<td>스팸 이메일 분류</td>
<td>이미지 분류</td>
</tr>
</tbody></table>
<br>

<h3 id="느낀점">느낀점</h3>
<ul>
<li>기존에 애매하게 알고있던 <strong>소프트맥스 함수</strong>가 <strong>시그모이드 함수</strong>랑 어떤 차이점을 가지는지에 대해서 알게됨.</li>
<li>아직 갈길이 멀다... </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Gradient descent]]></title>
            <link>https://velog.io/@s_gyu/Gradient-descent</link>
            <guid>https://velog.io/@s_gyu/Gradient-descent</guid>
            <pubDate>Wed, 19 Jun 2024 12:52:42 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/s_gyu/post/362c575b-2e07-4a0c-add0-98b1f9b71e86/image.png" alt=""></p>
<p>✔ <strong>Gradient Descent란?</strong></p>
<ul>
<li>Gradient Descent는 함수의 parameter 값을 반복적으로 조정하여 주어진 함수를 최소화하는 최적화 알고리즘입니다. 
이 알고리즘의 목적은 함수의 최소값을 제공하는 parameter를 찾는 것입니다. 머신 러닝에서는 주로 비용 함수나 손실 함수의 최소값을 찾는 데 사용됩니다.
<br><br></li>
</ul>
<p><strong>✔ Gradient Descent Algorithm</strong></p>
<p>Gradient Descent 알고리즘은 다음과 같은 단계로 작동합니다:</p>
<ol>
<li><p><strong>초기 매개변수 설정</strong>:</p>
<ul>
<li>함수의 매개변수 (\theta)의 초기 값을 설정합니다.</li>
<li>이 값은 랜덤으로 선택되거나 특정 값으로 설정될 수 있습니다.</li>
</ul>
</li>
<li><p><strong>기울기 계산</strong>:</p>
<ul>
<li>현재 매개변수 값에서 비용 함수의 기울기(Gradient)를 계산합니다.</li>
<li>이 기울기는 비용 함수가 가장 급격히 증가하는 방향을 나타냅니다.</li>
</ul>
</li>
<li><p><strong>매개변수 업데이트</strong>:</p>
<ul>
<li>매개변수 값을 기울기의 음의 방향으로 업데이트합니다.</li>
<li>기울기의 일부를 매개변수 값에서 빼는 방식입니다.</li>
<li>이 비율을 학습률(Learning Rate)이라고 하며, 학습률은 매개변수 업데이트의 스텝 크기를 결정합니다.
$$
\theta := \theta - \alpha \nabla J(\theta)
$$
여기서:</li>
</ul>
</li>
</ol>
<ul>
<li><span style="font-style:italic;">θ</span>는 매개변수입니다.</li>
<li><span style="font-style:italic;">α</span>는 학습률입니다.</li>
<li><span style="font-style:italic;">∇J(θ)</span>는 손실 함수 <span style="font-style:italic;">J(θ)</span>의 기울기입니다.</li>
</ul>
<ol start="4">
<li><strong>반복</strong>:<ul>
<li>비용 함수가 최소값에 수렴할 때까지 위 과정을 반복합니다.</li>
</ul>
</li>
</ol>
<p><br><br>
<strong>✔ Learning Rate(학습률)</strong> </p>
<p>학습률은 Gradient Descent 알고리즘에서 중요한 하이퍼파라미터입니다. 학습률은 매개변수 값을 얼마나 크게 업데이트할지를 결정합니다.</p>
<ul>
<li><strong>학습률이 너무 작은 경우</strong>: 매개변수 업데이트가 매우 작아져서 알고리즘이 최소값에 도달하는 데 오랜 시간이 걸릴 수 있습니다.</li>
<li><strong>학습률이 너무 큰 경우</strong>: 매개변수 업데이트가 너무 커서 최소값을 지나치게 되어 알고리즘이 수렴하지 않거나 발산할 수 있습니다.</li>
</ul>
<p>따라서 적절한 학습률을 선택하는 것이 중요합니다. 적절한 학습률을 선택하면 알고리즘이 적절한 반복 횟수 내에 최소값에 수렴할 수 있습니다.
<br><br>
<strong>✔ Gradient Descent의 변형</strong></p>
<p>경사 하강 알고리즘에는 매개 변수 값을 업데이트하는 방식이 다른 여러 가지 변형이 있습니다.</p>
<p>1️⃣ <strong>Stochastic Gradient Descent(SGD)</strong></p>
<ul>
<li><strong>설명</strong>: 데이터 샘플 1개씩 loss를 계산하고 모델을 업데이트</li>
<li><strong>장점</strong>: 더 빠른 반복, 큰 데이터셋에서도 효과적.</li>
<li><strong>단점</strong>: local minima에 빠질 위험이 있음<br>

</li>
</ul>
<p>2️⃣ <strong>Mini-Batch Gradient Descent</strong></p>
<ul>
<li><strong>설명</strong>:<ul>
<li>데이터 샘플 (K)개씩 loss를 계산하고 모델을 업데이트</li>
<li>Full batch gradient descent와 Stochastic gradient descent의 절충안</li>
</ul>
</li>
<li><strong>장점</strong>:<ul>
<li>SGD의 속도와 Batch Gradient Descent의 안정성을 결합.</li>
<li>local minima에 빠질 위험 적어짐</li>
<li>global minima를 찾아가기에 적절한 stochastic이 있어서 local minima를 탈출하기에 좋음</li>
</ul>
</li>
<li><strong>단점</strong>: 적절한 배치 크기 선택이 필요함<br>

</li>
</ul>
<p>3️⃣ <strong>Momentum-based Gradient Descent</strong></p>
<ul>
<li><strong>설명</strong>: 이전 기울기 값을 사용해 현재 기울기에 가속도를 부여.</li>
<li><strong>장점</strong>: 학습 속도 증가, 지역 최적값에서 벗어나는 데 도움.</li>
<li><strong>단점</strong>: 적절한 모멘텀 값 설정이 필요함.<br>

</li>
</ul>
<p>4️⃣ <strong>Adam Optimization</strong></p>
<p><strong>설명</strong>: </p>
<ul>
<li>아담 최적화는 각 파라미터에 대한 적응형 학습률을 사용하는 Gradient Descent의 인기 있는 변형.</li>
<li>Momentum과 RMSprop을 결합하여, 각 파라미터에 대한 학습률을 계산</li>
<li></li>
<li><strong>장점</strong>: 대부분의 문제에서 잘 작동, 자동으로 학습률 조정.</li>
<li><strong>단점</strong>: 추가 하이퍼파라미터 설정 필요.<br>

</li>
</ul>
<p><strong>✔ 결론</strong></p>
<p>경사 하강은 머신러닝과 딥러닝에서 비용 함수 또는 손실 함수를 최소화하기 위해 널리 사용되는 최적화 알고리즘입니다. 이 알고리즘은 함수의 매개변수 값을 음의 기울기 방향으로 반복적으로 조정하는 방식으로 작동합니다. </p>
<p>학습 속도는 신중하게 선택해야 하는 중요한 하이퍼파라미터입니다. 경사 하강에는 확률적 경사 하강, 미니 배치 경사 하강, 운동량 기반 경사 하강, 아담 최적화 등 여러 가지 변형이 있습니다. 각 변형에는 장단점이 있으므로 당면한 문제의 요구 사항에 따라 선택해야 합니다.</p>
<p><br><br></p>
<p>❓ FAQ</p>
<p>1️⃣ <strong>Gradient decent의 목적은 무엇인가요?</strong></p>
<p>경사 하강은 주어진 함수의 최소값을 찾는 것을 목표로 하는 최적화 알고리즘입니다. 머신 러닝의 맥락에서 비용 함수 또는 손실 함수를 최소화하는 데 사용됩니다.</p>
<p>2️⃣ <strong>Batch Gradient Descent and Stochastic Gradient Descent의 차이점은 무엇인가요?</strong></p>
<p>일괄 경사 하강은 전체 훈련 데이터 세트를 처리한 후 매개변수 값을 업데이트하는 반면, 확률적 경사 하강은 각 훈련 예제를 처리한 후 매개변수 값을 업데이트합니다.</p>
<p>3️⃣ <strong>경사 하강에서 학습률이란?</strong></p>
<p>학습률은 음의 경사 방향으로의 스텝 크기를 결정하는 하이퍼파라미터입니다. 학습률이 작으면 수렴이 느려지고 학습률이 크면 최소값을 초과할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Loss function, cost function 차이점]]></title>
            <link>https://velog.io/@s_gyu/Loss-function-cost-function-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@s_gyu/Loss-function-cost-function-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Wed, 19 Jun 2024 12:38:22 GMT</pubDate>
            <description><![CDATA[<h3 id="loss-function">Loss Function</h3>
<ul>
<li><strong>정의</strong>: 개별 훈련 예측의 오차를 측정한다.</li>
<li><strong>용도</strong>: 각 데이터 포인트에 대해 모델의 예측이 실제 값과 얼마나 다른지를 계산한다.</li>
<li><strong>예시</strong>: MSE (Mean Squared Error), MAE (Mean Absolute Error), Cross-Entropy Loss 등.</li>
</ul>
<h3 id="cost-function">Cost Function</h3>
<ul>
<li><strong>정의</strong>: 전체 훈련 세트의 오차를 측정한다</li>
<li><strong>용도</strong>: 모델의 전체 성능을 평가하기 위해 모든 훈련 샘플에 대한 손실 함수의 평균 또는 합계를 계산한다.</li>
<li><strong>예시</strong>: 전체 훈련 세트에 대한 평균 손실(MSE, Cross-Entropy 등).</li>
</ul>
<h3 id="요약">요약</h3>
<ul>
<li><strong>Loss Function</strong>: 개별 데이터 포인트에 대한 오차를 계산.</li>
<li><strong>Cost Function</strong>: 전체 데이터 세트의 평균 오차를 계산.</li>
</ul>
<h3 id="α">+α</h3>
<ul>
<li><strong>Cost Function</strong>은 <strong>Loss Function</strong>의 평균 또는 합계이다</li>
<li><strong>Loss Function</strong>이 개별 샘플의 성능을 측정하는 반면, <strong>Cost Function</strong>은 모델 전체의 성능을 평가한다</li>
<li><strong>Cost Function</strong>은 여러 <strong>Loss Function</strong> 값을 합산하거나 평균하여 계산된다</li>
</ul>
<h3 id="학습회고">학습회고</h3>
<ul>
<li>기존에 데이터마이닝 수업을 통해 Loss function과 Cost function에 대해서 알고있다고 생각했다. </li>
<li>but 딥러닝 공부를 시작하게 되면서 다시 개념을 되집어 보니 잘못 알고있음을 알게되었고 
앞으로 딥러닝 공부를 하면서 헷갈리는과 새롭게 알게된 개념에 대해서 정리하고자 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data_mining] 재난문자 유형별 분류 프로젝트]]></title>
            <link>https://velog.io/@s_gyu/Datamining-%EC%9E%AC%EB%82%9C%EB%AC%B8%EC%9E%90-%EC%9C%A0%ED%98%95%EB%B3%84-%EB%B6%84%EB%A5%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-mo14smr5</link>
            <guid>https://velog.io/@s_gyu/Datamining-%EC%9E%AC%EB%82%9C%EB%AC%B8%EC%9E%90-%EC%9C%A0%ED%98%95%EB%B3%84-%EB%B6%84%EB%A5%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-mo14smr5</guid>
            <pubDate>Wed, 12 Jun 2024 06:09:56 GMT</pubDate>
            <description><![CDATA[<h1 id="데이터마이닝-재난문자-유형별-분류-프로젝트">[데이터마이닝] 재난문자 유형별 분류 프로젝트</h1>
<p>2024년 1학기 서울과학기술대학교 산업정보시스템전공 데이터마이닝 팀 프로젝트</p>
<h3 id="사용-언어">사용 언어</h3>
<p>python</p>
<h2 id="목차">목차</h2>
<h2 id="목차-1">목차</h2>
<ol>
<li><a href="#1-%EB%B0%B0%EA%B2%BD-%EB%B0%8F-%ED%95%84%EC%9A%94%EC%84%B1">배경 및 필요성</a></li>
<li><a href="#2-%EB%B6%84%EC%84%9D-%EB%AA%A9%EC%A0%81">분석 목적</a></li>
<li><a href="#3-%EC%82%AC%EC%9A%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%8F-%ED%9A%8D%EB%93%9D-%EB%B0%A9%EB%B2%95">사용 데이터 및 획득 방법</a></li>
<li><a href="#4-%EB%B6%84%EC%84%9D-%EA%B3%BC%EC%A0%95">분석 과정</a><ul>
<li><a href="#41-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%B2%98%EB%A6%AC">데이터 전처리</a><ul>
<li><a href="#411-%ED%86%A0%ED%81%B0%ED%99%94-%EB%B0%8F-%EB%B6%88%EC%9A%A9%EC%96%B4-%EC%A0%9C%EA%B1%B0">토큰화 및 불용어 제거</a></li>
<li><a href="#412-tf-idf-%EB%B2%A1%ED%84%B0%ED%99%94">TF-IDF 벡터화</a></li>
<li><a href="#413-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%9D%BC%EB%B2%A8%EB%A7%81">데이터 라벨링</a></li>
</ul>
</li>
<li><a href="#42-clustering">Clustering</a><ul>
<li><a href="#421-dbscan%EC%9D%84-%ED%86%B5%ED%95%9C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%EC%A7%84%ED%96%89">DBSCAN을 통한 클러스터링 진행</a></li>
<li><a href="#422-k-means%EB%A5%BC-%ED%86%B5%ED%95%9C-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81-%EC%A7%84%ED%96%89">k-means를 통한 클러스터링 진행</a></li>
<li><a href="#423-%EA%B3%84%EC%B8%B5%EC%A0%81-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%EB%A7%81%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%9D%BC%EB%B2%A8%EB%A7%81">계층적 클러스터링을 활용한 데이터 라벨링</a></li>
</ul>
</li>
<li><a href="#43-%EC%9E%AC%EB%82%9C%EB%AC%B8%EC%9E%90-%EC%9C%A0%ED%98%95%EB%B3%84-%EB%B6%84%EB%A5%98">재난문자 유형별 분류</a><ul>
<li><a href="#431-%EC%82%AC%EC%9A%A9-%EB%AA%A8%EB%8D%B8">사용 모델</a></li>
<li><a href="#432-svm">SVM</a></li>
<li><a href="#433-random-forest">Random Forest</a></li>
<li><a href="#434-xgboost">XGBoost</a></li>
<li><a href="#435-catboost">Catboost</a></li>
<li><a href="#436-%EC%B5%9C%EC%A0%81-%EB%AA%A8%EB%8D%B8-%EC%84%A0%EC%A0%95">최적 모델 선정</a></li>
<li><a href="#437-%EB%B6%84%EC%84%9D-%EA%B2%B0%EA%B3%BC">분석 결과</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#5-%ED%95%9C%EA%B3%84%EC%A0%90-%EB%B0%8F-%EA%B0%9C%EC%84%A0-%EB%B0%A9%EC%95%88">한계점 및 개선 방안</a></li>
</ol>
<h2 id="1-배경-및-필요성">1. 배경 및 필요성</h2>
<p>과도한 양의 재난문자로 인해 시민들의 피로도가 증가하고, 재난문자에 대한 신뢰도가 하락했다. 일부 시민들은 아예 재난문자 수신 기능을 해제해 놓기도 한다.</p>
<h2 id="2-분석-목적">2. 분석 목적</h2>
<p>수신자가 원하는 유형의 재난문자만 받아볼 수 있게 하기 위해, 재난문자를 각 유형별로 분류하는 것을 목적으로 한다.</p>
<h2 id="3-사용-데이터-및-획득-방법">3. 사용 데이터 및 획득 방법</h2>
<p>행정안전부에서 제공하는 서울시 구청 재난문자 발송 현황 데이터를 활용했다. 공공데이터포털에서 획득했으며, 2020년 1월 ~ 2021년 1월 데이터, 2021년 2월 ~ 2021년 12월 데이터, 2022년 1월 ~ 2023년 8월 데이터 3개의 파일을 합쳐서 하나의 데이터프레임으로 만들었다.</p>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/9f75d59e-5923-48b2-9b46-f8de2b2d6488/image.png" alt=""></p>
<h2 id="4-분석-과정">4. 분석 과정</h2>
<h3 id="41-데이터-전처리">4.1 데이터 전처리</h3>
<h4 id="411-토큰화-및-불용어-제거">4.1.1 토큰화 및 불용어 제거</h4>
<ul>
<li>Okt 형태소 분석기를 사용하여 문장을 토큰화하고 각 토큰에 품사를 붙여 추출.</li>
<li>한글 불용어 사전을 이용하여 불용어를 제거.</li>
</ul>
<pre><code class="language-python"># 한글 불용어 사전 파일 경로
stopwords_path = &#39;/content/drive/MyDrive/데이터마이닝/stopwords-ko.txt&#39;

# 파일 읽기
with open(stopwords_path, &quot;r&quot;, encoding=&quot;utf-8&quot;) as file:
    stopwords = file.readlines()

# 각 불용어의 좌우 공백과 개행문자 제거
stopwords = [word.strip() for word in stopwords]
# 추가 불용어
stopwords.extend([&#39;[&#39;, &#39;]&#39;])
print(stopwords)

```python
# Okt 형태소 분석기 생성
okt = Okt()

# 특수 단어 리스트 정의
special_words = [&#39;확진자&#39;, &#39;서울의료원&#39;]

# 텍스트 전처리 함수 정의
def preprocess_text_korean(text):
    # 특수 문자 제거
    text = re.sub(r&#39;[^ㄱ-ㅎㅏ-ㅣ가-힣\s]&#39;, &#39;&#39;, text)

    # 형태소 분석 및 불용어 제거
    tokens = okt.pos(text, stem=True)

    # 명사와 동사/형용사만 남기기 및 불용어 제거
    tokens = [word for word, pos in tokens if pos in [&#39;Noun&#39;, &#39;Verb&#39;, &#39;Adjective&#39;] and word not in stopwords]

    # 특정 단어들을 하나의 토큰으로 결합
    for special_word in special_words:
        while special_word in tokens:
            index = tokens.index(special_word)
            tokens[index:index + len(special_word)] = [special_word]

    # 토큰을 다시 문자열로 합침
    preprocessed_text = &#39; &#39;.join(tokens)
    return preprocessed_text

# &#39;송출내용&#39; 열에 전처리 적용
df[&#39;preprocessed_송출내용&#39;] = df[&#39;송출내용&#39;].apply(preprocess_text_korean)

# 변경된 내용을 확인하기 위해 데이터프레임의 처음 몇 행 출력
df[[&#39;송출내용&#39;, &#39;preprocessed_송출내용&#39;]].head(10)

# 전처리된 송출내용만 남긴 데이터프레임: new_df
new_df = df.drop(columns=[&#39;송출내용&#39;])
new_df.head()</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/7d5f8f0f-f812-4fd2-acef-5d2013365109/image.png" alt=""></p>
<h4 id="412-tf-idf-벡터화">4.1.2 TF-IDF 벡터화</h4>
<ul>
<li>TF-IDF (Term Frequency-Inverse Document Frequency) 기법을 사용하여 텍스트 데이터를 벡터화.</li>
<li>특정 단어가 문서에서 자주 사용될수록 높은 값을 가지며, 자주 등장하지 않는 단어는 낮은 값을 가짐.</li>
<li>최대 특징 수를 100으로 설정하여 (9348 * 100) 행렬을 생성하고, 희소 행렬을 밀집 행렬로 변환.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/cc748671-2edb-4c0f-b6c8-8fe8b04bf225/image.png" alt=""></p>
<pre><code class="language-python"># TF-IDF 벡터라이저 생성

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(max_features=100)  # max_features는 필요에 따라 조정 가능

# 텍스트 데이터를 학습 및 변환
tfidf_matrix = vectorizer.fit_transform(new_df[&#39;preprocessed_송출내용&#39;])

# 결과 매트릭스의 형태 출력
print(tfidf_matrix.shape)
tfidf_matrix</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/311c500a-5bf1-47ca-8e2c-5a4cd2afadc8/image.png" alt=""></p>
<h4 id="413-데이터-라벨링">4.1.3 데이터 라벨링</h4>
<ul>
<li>클러스터링 알고리즘을 사용하여 데이터를 라벨링.</li>
</ul>
<h3 id="42-clustering">4.2 Clustering</h3>
<h4 id="421-dbscan을-통한-클러스터링-진행">4.2.1 DBSCAN을 통한 클러스터링 진행</h4>
<ul>
<li>hyperparameter: eps는 0.01 ~ 10, min_samples는 5 ~ 60까지 바꾸면서 클러스터링을 진행했다.</li>
</ul>
<pre><code class="language-python">import pandas as pd
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.decomposition import PCA

# 2. DBSCAN 클러스터링 수행
# DBSCAN 파라미터 설정 (eps와 min_samples는 데이터에 따라 조정 필요)
dbscan = DBSCAN(eps=0.1, min_samples=55)
cluster_labels = dbscan.fit_predict(scaled_tfidf)

# 클러스터링 결과를 데이터프레임에 추가
df[&#39;cluster&#39;] = cluster_labels

# 클러스터 수 및 각 클러스터에 속하는 포인트 수 확인
num_clusters = len(set(cluster_labels)) - (1 if -1 in cluster_labels else 0)
print(f&#39;Number of clusters: {num_clusters}&#39;)
cluster_counts = pd.Series(cluster_labels).value_counts()
print(cluster_counts)</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/01598dea-10f0-4991-a35f-cf1e1f4059a8/image.png" alt=""></p>
<p><code>클러스터별 주요 키워드 추출 및 출력</code></p>
<pre><code class="language-python">def get_top_keywords(data, clusters, vectorizer, top_n=10):
    cluster_keywords = {}
    for cluster in np.unique(clusters):
        if cluster == -1:  # 노이즈 클러스터는 무시
            continue
        # 클러스터에 속한 문서들 추출
        cluster_data = data[clusters == cluster]
        # 클러스터 중심 벡터 계산 (평균)
        centroid = cluster_data.mean(axis=0)
        # 상위 top_n 키워드 추출
        keywords = [vectorizer.get_feature_names_out()[i] for i in centroid.argsort()[-top_n:]]
        cluster_keywords[cluster] = keywords
    return cluster_keywords

# 주요 키워드 추출
top_keywords = get_top_keywords(scaled_tfidf, cluster_labels, vectorizer, top_n=10)

# 주요 키워드 출력
for cluster, keywords in top_keywords.items():
    print(f&quot;Cluster {cluster}: {&#39;, &#39;.join(keywords)}&quot;)</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/0d12ecb1-9e31-42d4-812d-c8585ec87a20/image.png" alt=""></p>
<p><code>T-SNE로 시각화</code></p>
<pre><code class="language-python">from sklearn.manifold import TSNE

# TSNE를 사용하여 2차원으로 축소
tsne = TSNE(n_components=2, random_state=42)
tsne_results = tsne.fit_transform(scaled_tfidf)

# TSNE 결과를 시각화
plt.figure(figsize=(10, 6))
plt.scatter(tsne_results[:, 0], tsne_results[:, 1], c=cluster_labels, cmap=&#39;viridis&#39;, marker=&#39;o&#39;)
plt.title(&#39;Hierarchical Clustering on TSNE-reduced TF-IDF&#39;)
plt.xlabel(&#39;TSNE Component 1&#39;)
plt.ylabel(&#39;TSNE Component 2&#39;)
plt.grid(True)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/db576de9-4ace-4753-91e7-1e1396eb7416/image.png" alt=""></p>
<p><code>비슷한 클러스터끼리 병합</code></p>
<p>Cluster 0, 1, 2, 3:
공통적으로 &#39;홈페이지&#39;, &#39;블로그&#39;, &#39;발생&#39;, &#39;내용&#39;, &#39;확인&#39;, &#39;구청&#39;, &#39;상세&#39; 등으로 일반적인 정보를 나타냄.<br>라벨: 0 할당.</p>
<p>Cluster 5, 6, 7, 11, 12, 13:
공통적으로 &#39;홈페이지&#39;, &#39;블로그&#39;, &#39;역학&#39;, &#39;조사&#39;, &#39;방역&#39;, &#39;참조&#39;, &#39;완료&#39;, &#39;세부&#39; 등으로 역학 조사 클러스터.<br>라벨: 1 할당.</p>
<p>Cluster 18, 19:
공통적으로 &#39;발생&#39;, &#39;바라다&#39;, &#39;블로그&#39;, &#39;코로나&#39;, &#39;내용&#39;, &#39;상세&#39;, &#39;참조&#39;, &#39;안내&#39;, &#39;강서&#39;, &#39;강서구&#39; 등으로 코로나 관련 공지 클러스터.<br>라벨: 2 할당.</p>
<p>Cluster 4, 8, 10, 14, 15:
공통적으로 &#39;공개&#39;, &#39;동선&#39;, &#39;예정&#39;, &#39;사항&#39; 등의 키워드로 공개된 이동 경로와 일정.<br>이동 경로 및 일정 공지 클러스터.<br>라벨: 3 할당.</p>
<p>Cluster 9, 16:
공통적으로 &#39;역학&#39;, &#39;코로나&#39;, &#39;조사&#39;, &#39;방역&#39;, &#39;준수&#39;, &#39;마스크&#39; 등의 키워드로 역학 조사 및 방역 조치.<br>방역 조치 및 마스크 클러스터.<br>라벨: 4 할당.</p>
<p>Cluster 17:
&#39;사고&#39;, &#39;중구청&#39;, &#39;접종&#39;, &#39;모임&#39;, &#39;사적&#39; 등의 키워드로 사고 및 예방 조치.<br>사적 모임 자제 클러스터.<br>라벨: 5 할당.</p>
<p><code>병합</code></p>
<pre><code class="language-python"># 클러스터 재할당을 위한 매핑 딕셔너리

cluster_mapping = {
    0: 0, 1: 0, 2: 0, 3: 0,  # 일반적인 정보 클러스터
    5: 1, 6: 1, 7: 1, 11: 1, 12: 1, 13: 1,  # 역학 조사 클러스터
    18: 2, 19: 2,  # 코로나 관련 공지 클러스터
    4: 3, 8: 3, 10: 3, 14: 3, 15: 3,  # 이동 경로 및 일정 공지 클러스터
    9: 4, 16: 4,  # 방역 조치 및 마스크 클러스터
    17: 5,  # 사고 및 예방 조치 클러스터
    -1: -1  # 노이즈 클러스터 (제외)
}

# 클러스터 재할당
df[&#39;merged_cluster&#39;] = df[&#39;cluster&#39;].map(cluster_mapping)

# -1(noise) 제외한 새로운 데이터프레임 생성
new_df = df[df[&#39;merged_cluster&#39;] != -1][[&#39;preprocessed_송출내용&#39;, &#39;cluster&#39;, &#39;merged_cluster&#39;]]

# 결과 확인
new_df</code></pre>
<pre><code class="language-python"># 클러스터 수 및 각 클러스터에 속하는 포인트 수 확인
num_clusters = len(set(df[&#39;merged_cluster&#39;])) - (1 if -1 in df[&#39;merged_cluster&#39;].values else 0)
print(f&#39;Number of clusters: {num_clusters}&#39;)
cluster_counts = df[&#39;merged_cluster&#39;].value_counts()
print(cluster_counts)</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/59635bd6-647d-45d9-a224-18d22bccfc79/image.png" alt=""></p>
<p><code>최종</code></p>
<table>
<thead>
<tr>
<th>클러스터명</th>
<th>내용</th>
<th>데이터 수</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>일반적인 정보 나타냄 (&#39;홈페이지&#39;, &#39;블로그&#39;, &#39;발생&#39;, &#39;내용&#39;, &#39;확인&#39;, &#39;구청&#39;, &#39;상세&#39;)</td>
<td>447</td>
</tr>
<tr>
<td>1</td>
<td>역학 조사 클러스터 (&#39;홈페이지&#39;, &#39;블로그&#39;, &#39;역학&#39;, &#39;조사&#39;, &#39;방역&#39;, &#39;참조&#39;, &#39;완료&#39;, &#39;세부&#39;)</td>
<td>572</td>
</tr>
<tr>
<td>2</td>
<td>코로나 관련 공지 클러스터 (&#39;발생&#39;, &#39;바라다&#39;, &#39;블로그&#39;, &#39;코로나&#39;, &#39;내용&#39;, &#39;상세&#39;, &#39;참조&#39;, &#39;안내&#39;, &#39;강서&#39;, &#39;강서구&#39;)</td>
<td>147</td>
</tr>
<tr>
<td>3</td>
<td>이동 경로 및 일정 공지 클러스터 (&#39;공개&#39;, &#39;동선&#39;, &#39;예정&#39;, &#39;사항&#39;)</td>
<td>509</td>
</tr>
<tr>
<td>4</td>
<td>방역 조치 및 마스크 클러스터 (&#39;역학&#39;, &#39;코로나&#39;, &#39;조사&#39;, &#39;방역&#39;, &#39;준수&#39;, &#39;마스크&#39;)</td>
<td>187</td>
</tr>
<tr>
<td>5</td>
<td>사적 모임 자제 클러스터 (&#39;사고&#39;, &#39;중구청&#39;, &#39;접종&#39;, &#39;모임&#39;, &#39;사적&#39;)</td>
<td>81</td>
</tr>
</tbody></table>
<p>DBSCAN은 많은 데이터들을 -1, 즉 noise로 처리함을 확인했으며, 적절치 않은 clustering 결과를 확인했다.</p>
<h4 id="422-k-means를-통한-클러스터링-진행">4.2.2 k-means를 통한 클러스터링 진행</h4>
<p>hyperparameter는 cluster 개수 -&gt; [5,10,15,30], 중심 클러스터 선정방법(init_methods) -&gt; [&#39;k-means++&#39;, &#39;random&#39;]를 조정하여 탐색하였고, silhouette score를 참고하여 최적의 하이퍼파라미터를 선정하였다.</p>
<p>그 결과 20개의 cluster를 만들고 k-means++방법으로 중심 클러스터를 찾아 보았다.</p>
<pre><code class="language-python"># KMeans 모델 생성 및 학습
kmeans = KMeans(n_clusters=20, random_state=42)  # 클러스터 개수를 적절히 설정
kmeans.fit(scaled_tfidf)

#레이블 추출
kmeans_labels = kmeans.labels_

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 하이퍼파라미터 범위 설정
n_clusters_range = [5,10,15,20]
init_methods = [&#39;k-means++&#39;, &#39;random&#39;]

# 최적의 파라미터를 저장할 변수 초기화
best_score = -1
best_params = {}

# 모든 하이퍼파라미터 조합을 탐색
for n_clusters in n_clusters_range:
    for init in init_methods:
                kmeans = KMeans(n_clusters=n_clusters, init=init, random_state=42)
                cluster_labels = kmeans.fit(scaled_tfidf)
                labels = kmeans.labels_
                centroids = kmeans.cluster_centers_
                score = silhouette_score(scaled_tfidf, labels)

                if score &gt; best_score:
                    best_score = score
                    best_params = {
                        &#39;n_clusters&#39;: n_clusters,
                        &#39;init&#39;: init,
                    }

print(&quot;Best parameters found: &quot;, best_params)
print(&quot;Best silhouette score: &quot;, best_score)</code></pre>
<p><code>Best parameters found</code>:  {&#39;n_clusters&#39;: 20,&#39;init&#39;: &#39;k-means++&#39;}
<code>Best silhouette score</code>:  0.16555712518201277</p>
<p><code>T-SNE로 2차원 시각화</code></p>
<pre><code class="language-python">from sklearn.manifold import TSNE

# TSNE를 사용하여 2차원으로 축소
tsne = TSNE(n_components=2, perplexity=2, random_state=42)
tsne_results = tsne.fit_transform(scaled_tfidf)

# TSNE 결과를 시각화
plt.figure(figsize=(10, 6))
plt.scatter(tsne_results[:, 0], tsne_results[:, 1], c=kmeans_labels, cmap=&#39;Spectral&#39;, marker=&#39;o&#39;)
plt.title(&#39;K-Means Clustering on t-SNE-reduced Data&#39;)
plt.xlabel(&#39;t-SNE Component 1&#39;)
plt.ylabel(&#39;t-SNE Component 2&#39;)
plt.grid(True)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/ef5d999a-91b2-4f28-a35f-3c9726bf9bd3/image.png" alt=""></p>
<pre><code class="language-python">from sklearn.feature_extraction.text import TfidfVectorizer

texts = new_df[&#39;preprocessed_송출내용&#39;].fillna(&#39;&#39;)
vectorizer = TfidfVectorizer(max_features=100)
vectored_df = vectorizer.fit_transform(texts)
dense_df = vectored_df.todense() #vectored_df는 희소행렬이기 때문에 dense 형태로 전환.
feature_names = vectorizer.get_feature_names_out()

keyword_df = pd.DataFrame(dense_df, columns=feature_names)

kmeans = KMeans(n_clusters=20, init=&#39;k-means++&#39;, random_state=42)
kmeans.fit(tfidf_dense)

centroids = kmeans.cluster_centers_

# 클러스터 중심을 데이터프레임으로 변환
centroids_df = pd.DataFrame(centroids, columns=keyword_df.columns)

# 각 클러스터의 주요 피처 확인
top_features = {}
for i, centroid in centroids_df.iterrows():
    top_features[i] = centroid.sort_values(ascending=False).head(10).index.tolist()

# 각 클러스터의 주요 피처가 문자열인지 확인하고, 그렇지 않은 경우 문자열로 변환
top_features_str = {cluster: [str(feature) for feature in features] for cluster, features in top_features.items()}

# 결과 출력
for cluster, features in top_features_str.items():
    print(f&quot;Cluster {cluster}: {&#39;, &#39;.join(features)}&quot;)</code></pre>
<table>
<thead>
<tr>
<th>클러스터</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>Cluster 0</td>
<td>진자, 코로나, 발생, 신청, 검사, 하다, 관련, 격리, 입국, 자가</td>
</tr>
<tr>
<td>Cluster 1</td>
<td>공개, 조사, 역학, 사항, 예정, 이다, 결과, 조치, 홈페이지, 진자</td>
</tr>
<tr>
<td>Cluster 2</td>
<td>마스크, 착용, 거리, 준수, 두기, 방역, 진자, 바라다, 발생, 공개</td>
</tr>
<tr>
<td>Cluster 3</td>
<td>시기, 확인, 완치, 하다, 블로그, 상세, 홈페이지, 내용, 바라다, 진자</td>
</tr>
<tr>
<td>Cluster 4</td>
<td>이용자, 알림, 검사, 시간대, 동선, 확인, 관내, 진자, 바람, 보건소</td>
</tr>
<tr>
<td>Cluster 5</td>
<td>참고, 내용, 진자, 자세하다, 홈페이지, 바라다, 발생, 조사, 역학, 결과</td>
</tr>
<tr>
<td>Cluster 6</td>
<td>하다, 안전, 유의, 되다, 바라다, 예상, 사고, 지역, 자제, 이용</td>
</tr>
<tr>
<td>Cluster 7</td>
<td>운영, 시선, 검사, 진료, 보건소, 되다, 하다, 주말, 구청, 드리다</td>
</tr>
<tr>
<td>Cluster 8</td>
<td>격리, 이송, 방역, 소독, 완료, 진자, 발생, 동선, 은평, 채널</td>
</tr>
<tr>
<td>Cluster 9</td>
<td>사후, 구청, 공개, 동선, 참고, 역학, 홈페이지, 블로그, 발생, 진자</td>
</tr>
<tr>
<td>Cluster 10</td>
<td>모임, 사적, 자제, 금지, 준수, 발생, 진자, 방역, 내용, 바라다</td>
</tr>
<tr>
<td>Cluster 11</td>
<td>거주지, 완료, 사항, 방역, 참고, 자세하다, 블로그, 홈페이지, 바라다, 발생</td>
</tr>
<tr>
<td>Cluster 12</td>
<td>안내, 참조, 블로그, 강서구, 상세, 진자, 발생, 내용, 양천구, 바라다</td>
</tr>
<tr>
<td>Cluster 13</td>
<td>참조, 완료, 세부, 조사, 역학, 진자, 홈페이지, 내용, 바라다, 블로그</td>
</tr>
<tr>
<td>Cluster 14</td>
<td>받다, 검사, 진료, 가깝다, 방문자, 바라다, 방문, 증상, 코로나, 보건소</td>
</tr>
<tr>
<td>Cluster 15</td>
<td>진행중, 현재, 참고, 추가, 조사, 역학, 내용, 홈페이지, 관련, 코로나</td>
</tr>
<tr>
<td>Cluster 16</td>
<td>확인, 상세, 구청, 코로나, 내용, 진자, 발생, 홈페이지, 바라다, 알림</td>
</tr>
<tr>
<td>Cluster 17</td>
<td>접종, 예약, 코로나, 센터, 신청, 주민, 오늘, 방문, 되다, 하다</td>
</tr>
<tr>
<td>Cluster 18</td>
<td>진행, 이다, 예정, 조사, 역학, 공개, 추후, 홈페이지, 완료, 발생</td>
</tr>
<tr>
<td>Cluster 19</td>
<td>방문자, 검사, 보건소, 바라다, 받다, 코로나, 소독, 주말, 증상, 완료</td>
</tr>
</tbody></table>
<p>silhouette score = 0.16으로 높지 않았고, 직접 확인 하였을 때도 모든 cluster가 코로나 관련 내용으로 뭉쳐있으므로 주제에 적합한 cluster 모델은 아니라고 판단했다.</p>
<h4 id="423-계층적-클러스터링을-활용한-데이터-라벨링">4.2.3 계층적 클러스터링을 활용한 데이터 라벨링</h4>
<p>앞의 두 클러스터링 알고리즘이 적절한 결과를 내지 못해서, Agglomerative Clustering 알고리즘을 사용했다.</p>
<p>덴드로그램을 그린 후 높이 150에서 군집화하여 총 19개의 클러스터로 만들었다. 그 후 유사한 클러스터끼리 병합하여 총 8개의 클러스터로 만들었다.</p>
<ul>
<li>계층적 클러스터링을 통해 데이터를 다음 8종류의 라벨로 라벨링했다.</li>
</ul>
<pre><code class="language-python">import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage, fcluster

# 덴드로그램 시각화 (계층적 클러스터링)
linked = linkage(scaled_tfidf, method=&#39;ward&#39;)

plt.figure(figsize=(15, 10))
dendrogram(linked, orientation=&#39;top&#39;, distance_sort=&#39;ascending&#39;, show_leaf_counts=True, color_threshold=150)
plt.title(&#39;Dendrogram&#39;)
plt.xlabel(&#39;Samples&#39;)
plt.ylabel(&#39;Distance&#39;)
plt.grid(True)
plt.show()</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/44b64595-dc11-4431-ab84-e79e0c1210f5/image.png" alt=""></p>
<pre><code class="language-python">from sklearn.cluster import AgglomerativeClustering
# 덴드로그램에서 클러스터를 잘라내기 위해 특정 높이 설정
color_threshold = 150  # 이 값을 적절히 설정하여 클러스터 수를 조절
clusters = fcluster(linked, color_threshold, criterion=&#39;distance&#39;)

# 결정한 클러스터 수 출력
num_clusters = len(set(clusters))
print(f&#39;Number of clusters determined from dendrogram: {num_clusters}&#39;)

# Agglomerative Clustering 수행
hierarchical = AgglomerativeClustering(n_clusters=num_clusters, affinity=&#39;euclidean&#39;, linkage=&#39;ward&#39;)
cluster_labels = hierarchical.fit_predict(scaled_tfidf)
new_df[&#39;cluster&#39;] = cluster_labels

# 클러스터링 결과 확인
print(new_df[[&#39;preprocessed_송출내용&#39;, &#39;cluster&#39;]].head(10))

# 클러스터 수 및 각 클러스터에 속하는 포인트 수 확인
print(f&#39;Number of clusters: {num_clusters}&#39;)
cluster_counts = pd.Series(cluster_labels).value_counts()
print(cluster_counts)</code></pre>
<p><img src="https://velog.velcdn.com/images/s_gyu/post/3aad5b2b-91b8-4577-8726-6b2c4111c56c/image.png" alt=""></p>
<p><code>TSNE 시각화</code>
<img src="https://velog.velcdn.com/images/s_gyu/post/86cdf35d-6acc-4fa8-ac46-f46ade50b941/image.png" alt=""></p>
<p><code>비슷한 클러스터끼리 병합</code></p>
<p>2, 3번 병합(추후 다시 클러스터링 필요) -&gt; 23번으로 병합
1, 8, 12, 17번 병합 -&gt; 117번으로 병합
5, 16번 병합 -&gt; 516번으로 병합
7, 9번 병합 -&gt; 79번으로 병합</p>
<p>2, 3번 병합: 확진자 발생 안내+일반 기상상황 혼합
new_df[&#39;merged_cluster&#39;] = new_df[&#39;cluster&#39;]
클러스터 2와 3을 병합하여 새로운 클러스터 20으로 지정
new_df.loc[new_df[&#39;cluster&#39;].isin([2, 3]), &#39;merged_cluster&#39;] = 20</p>
<p>1, 5, 8, 12, 16, 17, 18번 병합: 역학조사
클러스터 1, 8, 12, 17번을 병합하여 새로운 클러스터 21번으로 지정
new_df.loc[new_df[&#39;cluster&#39;].isin([1, 5, 8, 12, 16, 17, 18]), &#39;merged_cluster&#39;] = 21</p>
<p>7, 9번 병합: 코로나검사 권장
클러스터 7, 9번을 병합하여 새로운 클러스터 23번으로 지정
new_df.loc[new_df[&#39;cluster&#39;].isin([7, 9]), &#39;merged_cluster&#39;] = 23</p>
<p>10, 11, 13, 14번 병합: 방역
클러스터 10, 13번을 병합하여 새로운 클러스터 24번으로 지정
new_df.loc[new_df[&#39;cluster&#39;].isin([10, 11, 13, 14]), &#39;merged_cluster&#39;] = 24</p>
<p>결과 확인
new_df</p>
<p><code>1차 병합된 데이터프레임: new_df에서 병합 전 클러스터 컬럼 제거, 클러스터명 순으로 정렬 -&gt; new_df2
클러스터명 순으로 정렬 후 클러스터명 0부터 다시 지정</code></p>
<p>new_df2 = new_df.drop(columns=[&#39;cluster&#39;]).sort_values(by=&#39;merged_cluster&#39;)
print(new_df2[&#39;merged_cluster&#39;].value_counts())</p>
<p><code>클러스터명 재할당</code>
new_df2[&#39;merged_cluster&#39;] = pd.factorize(new_df2[&#39;merged_cluster&#39;])[0]
print(new_df2[&#39;merged_cluster&#39;].value_counts())
new_df2</p>
<p>merged_cluster
20    3022
21    2320
23    1045
4      784
24     777
0      753
6      385
15     262
Name: count, dtype: int64
merged_cluster
4    3022
5    2320
6    1045
1     784
7     777
0     753
2     385
3     262
Name: count, dtype: int64</p>
<p><code>유사한 것끼리 병합 후</code></p>
<p>클러스터명 | 데이터 수 | 내용</p>
<p>0      753     확진자 발생안내
1      784     기상
2      385     백신, 교통, 확진자발생
3      262     임시선별소
4      3022    확진자 발생, 기상
5      2320    역학조사
6      1045    검사 권장
7      777     방역</p>
<pre><code class="language-python">new_df2 = new_df2.sort_index().rename(columns={&#39;merged_cluster&#39;: &#39;label&#39;})
new_df2 # 라벨링한 데이터프레임</code></pre>
<p><code>최종</code></p>
<table>
<thead>
<tr>
<th>클러스터명</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>확진자 발생안내</td>
</tr>
<tr>
<td>1</td>
<td>기상 관련</td>
</tr>
<tr>
<td>2</td>
<td>백신, 교통, 확진자발생</td>
</tr>
<tr>
<td>3</td>
<td>전염병 임시선별소 관련</td>
</tr>
<tr>
<td>4</td>
<td>확진자 발생, 기상 관련</td>
</tr>
<tr>
<td>5</td>
<td>역학조사</td>
</tr>
<tr>
<td>6</td>
<td>전염병 검사 권장</td>
</tr>
<tr>
<td>7</td>
<td>방역 관련</td>
</tr>
</tbody></table>
<p><strong>2번, 4번 클러스터의 경우 유형이 완벽하게 나누어지지 않는 문제가 있었다.</strong></p>
<h3 id="43-재난문자-유형별-분류">4.3 재난문자 유형별 분류</h3>
<h4 id="431-사용-모델">4.3.1 사용 모델</h4>
<ul>
<li>분류 모델은 SVM, XGBoost, Random Forest, Catboost를 사용했다.</li>
</ul>
<h4 id="432-svm">4.3.2 SVM</h4>
<ul>
<li>최적 hyperparameter</li>
</ul>
<table>
<thead>
<tr>
<th>C</th>
<th>gamma</th>
</tr>
</thead>
<tbody><tr>
<td>50</td>
<td>0.1</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>SVM 모델 성능</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>train accuracy</td>
<td>0.927</td>
</tr>
<tr>
<td>valid accuracy</td>
<td>0.839</td>
</tr>
</tbody></table>
<h4 id="433-random-forest">4.3.3 Random Forest</h4>
<ul>
<li>최적 hyperparameter</li>
</ul>
<table>
<thead>
<tr>
<th>max_depth</th>
<th>max_features</th>
<th>min_samples_leaf</th>
<th>min_samples_split</th>
<th>n_estimators</th>
</tr>
</thead>
<tbody><tr>
<td>20</td>
<td>auto</td>
<td>1</td>
<td>5</td>
<td>300</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>Random Forest 모델 성능</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>train accuracy</td>
<td>0.923</td>
</tr>
<tr>
<td>valid accuracy</td>
<td>0.834</td>
</tr>
</tbody></table>
<h4 id="434-xgboost">4.3.4 XGBoost</h4>
<ul>
<li>최적 hyperparameter</li>
</ul>
<table>
<thead>
<tr>
<th>max_depth</th>
<th>learning_rate</th>
<th>colsample_bytree</th>
<th>subsample</th>
<th>n_estimators</th>
</tr>
</thead>
<tbody><tr>
<td>7</td>
<td>0.05</td>
<td>1</td>
<td>0.6</td>
<td>300</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>XGBoost 모델 성능</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>train accuracy</td>
<td>0.923</td>
</tr>
<tr>
<td>valid accuracy</td>
<td>0.828</td>
</tr>
</tbody></table>
<h4 id="435-catboost">4.3.5 Catboost</h4>
<ul>
<li>최적 hyperparameter</li>
</ul>
<table>
<thead>
<tr>
<th>depth</th>
<th>learning_rate</th>
<th>l2_leaf_reg</th>
<th>iterations</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>0.05</td>
<td>1</td>
<td>500</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>CatBoost 모델 성능</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>train accuracy</td>
<td>0.919</td>
</tr>
<tr>
<td>valid accuracy</td>
<td>0.833</td>
</tr>
</tbody></table>
<h4 id="436-최적-모델-선정">4.3.6 최적 모델 선정</h4>
<ul>
<li><p>선정된 최적 모델의 학습을 위해 train 데이터와 valid 데이터를 병합: X_train_final, y_train_final</p>
</li>
<li><p>X_train_final, y_train_final으로 교차검증 진행</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>model</th>
<th>cross-validation score(cv=5)</th>
</tr>
</thead>
<tbody><tr>
<td>SVM</td>
<td>0.848</td>
</tr>
<tr>
<td>Random Forest</td>
<td>0.843</td>
</tr>
<tr>
<td>XGBoost</td>
<td>0.840</td>
</tr>
<tr>
<td>CatBoost</td>
<td>0.846</td>
</tr>
</tbody></table>
<p><strong>각각의 최적 하이퍼파라미터 모델에서의 정확도와 X_train_final, y_train_final로 진행한 교차검증 모두 SVM이 가장 좋은 성능을 보였다. &rarr; SVM을 최적 모델로 선정</strong></p>
<h3 id="44-재난문자-유형별-분류---분석-결과">4.4 재난문자 유형별 분류 - 분석 결과</h3>
<ul>
<li>최적 모델을 test data로 평가했다. 결과는 다음과 같다.</li>
</ul>
<table>
<thead>
<tr>
<th>cluster</th>
<th>precision</th>
<th>recall</th>
<th>f1-score</th>
<th>support</th>
</tr>
</thead>
<tbody><tr>
<td>0(확진자 발생)</td>
<td>0.91</td>
<td>0.95</td>
<td>0.93</td>
<td>143</td>
</tr>
<tr>
<td>1(기상 관련)</td>
<td>0.68</td>
<td>0.79</td>
<td>0.73</td>
<td>157</td>
</tr>
<tr>
<td>2(백신, 교통, 확진자발생)</td>
<td>0.6</td>
<td>0.65</td>
<td>0.62</td>
<td>77</td>
</tr>
<tr>
<td>3(임시선별소)</td>
<td>0.68</td>
<td>0.67</td>
<td>0.67</td>
<td>57</td>
</tr>
<tr>
<td>4(확진자 발생, 기상 관련)</td>
<td>0.82</td>
<td>0.81</td>
<td>0.82</td>
<td>596</td>
</tr>
<tr>
<td>5(역학조사)</td>
<td>0.97</td>
<td>0.95</td>
<td>0.96</td>
<td>470</td>
</tr>
<tr>
<td>6(전염병 검사 권장)</td>
<td>0.91</td>
<td>0.85</td>
<td>0.88</td>
<td>198</td>
</tr>
<tr>
<td>7(방역)</td>
<td>0.86</td>
<td>0.8</td>
<td>0.83</td>
<td>172</td>
</tr>
<tr>
<td>accuracy</td>
<td>0.849</td>
<td></td>
<td></td>
<td>1870</td>
</tr>
</tbody></table>
<ul>
<li>2번, 4번 클러스터는 라벨링 과정에서 깔끔하게 분리되지 않은 혼합된 클러스터이다.</li>
<li>2번과 3번 클러스터는 precision과 recall이 모두 낮아 성능 개선이 필요하다.</li>
<li>전체 클래스 중 성능이 좋지 않은 2, 3번 클래스의 데이터는 각각 384개, 262개로 다른 클래스에 비해 적은 수이다. 따라서 불균형 데이터셋이 모델의 분류 성능에 부정적인 영향을 주었을 가능성이 높다.</li>
<li>전체적인 정확도의 경우, 최적 모델로 선정된 SVM 외의 다른 모델에서도 약 0.84의 비슷한 성능을 보였다.</li>
</ul>
<h2 id="5-한계점-및-개선-방안">5. 한계점 및 개선 방안</h2>
<h4 id="한계점">한계점</h4>
<ul>
<li>라벨링을 위한 클러스터링 과정에서 데이터가 완벽하게 분류되지 못함.</li>
<li>전염병 관련 문자의 양이 매우 많아 일반 기상 경보 관련 문자들을 잘 분류하지 못함(TF-IDF로 벡터화 시킬 때 전염병 문자 관련 단어들만 feature로 선정되는 문제 존재)</li>
</ul>
<h4 id="개선-방안">개선 방안</h4>
<ul>
<li>서로 다른 유형의 문자에 자주 등장하는 단어가 한 문자에 동시에 존재할 수 있으므로, 문장의 맥락 파악이 필요 &rarr; <strong>딥러닝 기반 모델의 사용</strong></li>
<li>데이터의 특성 상(2020년~2023년 데이터, 펜데믹) 전염병 유형 문자의 수가 다른 유형의 문자보다 매우 많음 &rarr; <strong>데이터 수집 확대 및 텍스트 데이터 증강(SR, RI, RS, RD, Back Translation)</strong></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>