<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyooo__s.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 22 Jul 2026 13:43:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyooo__s.log</title>
            <url>https://velog.velcdn.com/images/hyooo__s/profile/d80a2060-00e5-4a7f-8438-62dfae4530fe/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyooo__s.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyooo__s" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[논문리뷰] DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DeepAR-Probabilistic-Forecasting-with-Autoregressive-Recurrent-Networks</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DeepAR-Probabilistic-Forecasting-with-Autoregressive-Recurrent-Networks</guid>
            <pubDate>Wed, 22 Jul 2026 13:43:45 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks
<strong>학회(출판연도)</strong>: International Journal of Forecasting (2020)
<strong>연구분야</strong>: 딥러닝 기반 시계열 예측 및 시계열 표현 학습</p>
</blockquote>
<hr>
<h2 id="background">Background</h2>
<ul>
<li><p>Deep AR</p>
<ul>
<li><p>수많은 time series를 동시에 학습하는 autoregressive RNN기반 global neural forecasting model</p>
<p>⇒ 이후 DeepState, DeepFactor, Transformer-based forecasting, Temporal Fusion Transformer, PatchTST 등장</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Time Series Forecasting</p>
<ul>
<li>과거 데이터를 이용해 미래 값을 예측하는 문제<ul>
<li>$sales_t → sales_{t+1}, salse_{t+2}, …$</li>
</ul>
</li>
<li>왜 중요한가?<ul>
<li>기업에서 거의 모든 의사결정에 사용<ul>
<li>재고 관리, 서버 load, 전력 소비, 교통량</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Probabilistic Forecasting</p>
<ul>
<li>미래 값을 <strong>하나의 숫자</strong>가 아닌 <strong>확률 분포</strong>로 예측하는 것</li>
<li>현실 세계에서는 불확실성이 존재하기 때문에 중요하다</li>
</ul>
</li>
<li><p>Autoregressive Model</p>
<ul>
<li>현재 값을 이전 값으로 예측<ul>
<li>AR</li>
</ul>
</li>
</ul>
</li>
<li><p>Recurrent Neural Network (RNN)</p>
<ul>
<li>시간 순서 데이터를 처리하는 neural network</li>
</ul>
</li>
<li><p>Likelihood Modeling</p>
<ul>
<li>DeepAR은 확률 분포를 직접 예측<ul>
<li>가우시안, Negative Binomial</li>
</ul>
</li>
</ul>
</li>
<li><p>연구 흐름</p>
</li>
</ul>
<pre><code>- 기존에는 single time series models로 각 모델 간 데이터 공유가 없고 학습 데이터가 부족하다는 문제가 있었음

    - ARIMA for series1
    - ARIMA for series2
    - ARIMA for series3


- 이 논문에서 Power-law scale distribution이 중요한데

몇몇 상품만 huge scales를 가지고 있어서 scale imbalance한 문제가 있음

→ 그래서 small series와 large series를 같은 모델에 넣으면 gradient imbalance 한 문제 발생</code></pre><h2 id="abstract">Abstract</h2>
<ul>
<li><p><strong>Probabilistic forecasting(확률적 예측)</strong></p>
<ul>
<li><p>과거 시계열 데이터를 기반으로 미래 값의 확률 분포를 추정하는 것</p>
</li>
<li><p>비즈니스 프로세스를 최적화하는 데 중요한 역할</p>
<p>  ex. 소매(retail) 산업에서 수요 예측이 적절한 재고를 적절한 장소에, 적절한 시점에 확보하기 위해 매우 중요</p>
</li>
</ul>
</li>
<li><p><strong>DeepAR</strong></p>
<ul>
<li><p>많은 관련 시계열 데이터를 이용해 <strong>자기회귀(auto-regressive)</strong> 구조의 <strong>순환 신경망(RNN)</strong>을 학습시켜 정확한 확률적 예측을 생성하는 방법</p>
<blockquote>
<p><strong>✓ 자기회귀(auto-regressive)</strong></p>
<ul>
<li>현재의 값을 과거의 값들의 함수로 표현하는 모델</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 순환신경망(RNN)</strong></p>
<ul>
<li><p>DeepAR의 경우 RNN의 구체적인 구현으로 LSTM 사용</p>
</li>
<li><p>Vanilla RNN은 gradient vanishing 문제로 인해 long term dependency로 학습이 어려움</p>
<p>  → LSTM은 memory cell을 가지고 있어서 long-term pattern을 잘 학습</p>
</li>
<li><p>time series의 dynamics를 잘 학습함</p>
</li>
</ul>
</blockquote>
<ul>
<li><p>DeepAR</p>
<ul>
<li><p>입력</p>
<ul>
<li>$z_{t-1}, z_{t-2}$: previous value - 바로 이전 값<ul>
<li>자기상관모델이기때문에 이전 값이 다음 값을 설명한다고 가정</li>
</ul>
</li>
<li>covariates<ul>
<li>시간 t에 알려진 외부 변수(feature)</li>
<li>예를 들어 주말이면 판매가 증가한다</li>
</ul>
</li>
<li>previous hidden state<ul>
<li>RNN의 지금까지 기억하고 있는 과거 정보 요약</li>
</ul>
</li>
</ul>
</li>
<li><p>계산</p>
<p>  !image.png</p>
<ul>
<li><p>$z_{t-1}, z_{t-2}$, seasonality, trend, covariates 같은 정보를 hidden state에 저장함</p>
<p>!image.png</p>
</li>
<li><p>hidden state에서 확률 분포 파라미터 계산 - fully connected layer로 계산</p>
</li>
</ul>
</li>
<li><p>확률분포 출력 → 예측(샘플을 뽑아서)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>이전 전통적인 방식은 시계열 하나 → 모델 하나에 대응시켰다면 DeepAR의 경우 수 천개의 시계열을 하나의 딥러닝 모델로 대응시켜서 <strong>패턴을 공유하고 학습</strong></p>
<ul>
<li><p>전통적: ARIMA, exponential smoothing, classical statistical models</p>
<p>  → ① 많은 시계열 처리, ② 비선형 패턴 처리의 어려움과  ③ feature engineering 필요</p>
<p>  ⇒ 딥러닝은 이런 문제를 자동으로 학습</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>여러 실제 예측 데이터셋에 대한 실험을 통해 최신 방법과 비교하여 약 15%의 정확도 향상을 보였음</p>
</li>
</ul>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p><strong>예측(forecasting)</strong>은 대부분의 기업에서  운영 프로세스를 ① 자동화하고 ② 최적화하는데 중요한 역할을 하며, ③ 데이터 기반의 의사결정을 가능하게 함</p>
<ul>
<li><p>소매산업 → 공급과 수요의 확률적 예측을 통해 재고관리, 직원 스케줄링, 물류 네트워크 설계 등에 사용</p>
<p>  ⇒ 공급망 최적화의 핵심 기술</p>
</li>
</ul>
</li>
<li><p>기존: 개별 시계열 또는 소수의 시계열을 예측하는 환경에서 개발</p>
<ul>
<li><p>각 시계열마다 모델 파라미터를 과거 데이터로부터 독립적으로 추정</p>
</li>
<li><p>이렇게 되면 상품이 1000개라고 했을 때 모델이 1000개 필요한 비효율 발생 + 신제품의 경우에는 데이터가 적어서 모델이 불안정</p>
</li>
<li><p>모델은 <strong>자기 상관 구조, 추세, 계절성, 기타 설명 변수</strong> 등을 고려해서 <strong>수동으로</strong> 선택(사람이 설계해야함)</p>
<ul>
<li><p>학습된 모델은 모델의 동적 구조에 따라 <strong>① 미래 값을 예측, ② 시뮬레이션</strong></p>
<p>  예측 분포의 닫힌 형태(closed-form expression)을 통해 <strong>확률적 예측 생성 가능</strong></p>
<blockquote>
<p><strong>✓ 모델의 동적 구조(dynamic structure)</strong></p>
<ul>
<li><p>동적구조: 시간이 흐르면서 값이 어떻게 변화하는지를 정의하는 규칙</p>
<ul>
<li><p>현재 값 → 다음 값이 어떻게 만들어지는지 정의하는 수식 구조</p>
</li>
<li><p>시간 의존성이 존재하기 때문에 동적 모델 state_t = f(state_{t-1})</p>
<p>  ↔ 정적 모델 y=f(x)</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 예측 분포의 닫힌 형태</strong></p>
<ul>
<li><p>적분이나 시뮬레이션없이 수식 하나로 바로 계산할 수 있는 형태</p>
<ul>
<li><p>가우시안, 이항분포, 포아송</p>
<p>  ↔ 시뮬레이션: 샘플을 많이 만들어서 근사</p>
<p>  ex. GAN, Diffusion, DeepAR sampling</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>Box-Jenkins 방법론, 지수 평활법 또는 상태 공간 모델(state space model) 기반</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Deep AR</p>
<ul>
<li><p>몇 개의 시계열이 아닌 가정별 전력 소비 예측, 데이터센터 서버 부하 예측 등 수천개~수백만개의 관련 시계열을 예측해야함</p>
<p>  ⇒ autoregressive recurrent network 기반의 예측 방법인 DeepAR 제안</p>
</li>
</ul>
</li>
</ul>
<h2 id="2-related-work">2. Related work</h2>
<ul>
<li><p>기존의 예측 방법</p>
<ul>
<li><p>ARIMA, Exponential smoothing</p>
<blockquote>
<p><strong>✓ Exponential smoothing</strong></p>
<ul>
<li>최근 데이터에 더 큰 가중치를 주는 방법</li>
</ul>
</blockquote>
</li>
<li><p>한계</p>
<ul>
<li><p>수요 예측 매우 불규칙적이고, 간헐적이며, 갑자기 급증하는 데이터 多</p>
<p>  → 전통적 모델의 핵심 가정을 깨뜨림</p>
</li>
<li><p>데이터 전처리 방법도 위 문제를 충분히 해결하기 어려움</p>
<p>  ⇒ 분포: zero-inflated Poisson, negative binomial</p>
</li>
<li><p>여러 시계열간 정보를 공유하면 예측 정확도를 향상시킬 수 있으나 구현의 어려움</p>
<p>  (각 시계열이 매우 이질적이기 때문)</p>
<p>  ⇒ matrix factorization, Bayesian Hierarchical models</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>RNN<ul>
<li>예측 분야는 아니지만 nlp, audio 등 다양한 분야에서 성</li>
</ul>
</li>
<li>DeepAR의 설계<ul>
<li>확률 예측에서는 단일값이 아닌 전체 확률 분포에 관심이 있음</li>
<li>count data의 정확한 분포를 얻기 위해서 Negative Binomial likelihood 사용</li>
</ul>
</li>
</ul>
<h2 id="3-model">3. Model</h2>
<ul>
<li><p>모델링 목표</p>
<ul>
<li><p>시계열 i의 시간 t에서의 값을 $z_{i,t}$라고 할 때, P(미래값 | 과거값, 외생변수)  조건부 확률 분포 모델링</p>
<p>  !image.png</p>
<ul>
<li><p>각 시계열의 미래 값: $z_{i,t_0:T}$ ⇒ prediction range(모델이 예측해야 하는 구간)</p>
</li>
<li><p>과거값: $z_{i,1:t_0-1}$ ⇒ conditioning range (모델이 조건으로 사용하는 구간)</p>
<p>  → $t_0$는 예측 시점에서 값이 알려지지 않은 시점의 시작점 의미</p>
<p>  → $X_{i,1:T}$: 모든 시점에서 알려져있다고 가정되는 외생 변수(conditioning, prediction 모두 주어짐)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>학습</p>
<ul>
<li><p>conditioning range와 prediction range 모두 과거에 위치해야 함 → $z_{i,t}$ 값 모두 관측</p>
<p>  but, 예측 단계에서는 conditioning range에서만 관측!</p>
</li>
<li><p>t는 상대적인 값 → t=1은 시계열 i마다 서로 다른 실제 시간을 가질 수 있음</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f34efa6f-f24e-4f12-a561-3341d956109d/image.png" alt=""></p>
<ul>
<li>Model distribution을 likelihood의 곱으로 분해 가능하다고 가정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1b0abd6f-fce6-4e47-80bc-619bbdab4904/image.png" alt=""></p>
<ul>
<li><p>Q의 분포에 대해 t_0부터 T시점까지 하나씩 보면 곱으로 보고 최종적으로 p라는 분포를 통해 계산 가</p>
<p>   ⇒ chain rule</p>
</li>
</ul>
<ul>
<li>Prediction process<ul>
<li>$h_{i,t}$에 conditioning range의 t를 순차적으로 대입하여 $h_{i,t_0-1}$을 구함</li>
<li>prediction range의 t에 대해 틸다 $z_{i,t}$를 sampling</li>
<li>smapling을 통해 예측을 진행하므로 quantile 정보 예측 가능</li>
</ul>
</li>
</ul>
<h2 id="31-likelihood-model">3.1 Likelihood model</h2>
<ul>
<li><p>데이터의 노이즈 모델 결정하고, 데이터의 통계적 특성에 맞게 선택되어야 함</p>
<ul>
<li>Deep AR은 예측값을 직접 출력하지 않음 → likelihood(확률분포) 출력</li>
</ul>
</li>
<li><p>신경망이 다음 시정의 확률 분포의 모든 파라미터(ex. 평균과 분산)를 직접 예측함</p>
</li>
<li><p>사용하는 likelihood 2가지</p>
<ul>
<li><p>실수 데이터 → 가우시안</p>
<ul>
<li><p>가우시안</p>
<p> <img src="https://velog.velcdn.com/images/hyooo__s/post/0654630d-35a0-433a-8382-943822999bb6/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    - Distribution Parameter

       ![](https://velog.velcdn.com/images/hyooo__s/post/e5313cd0-2872-470b-b199-90a2408d123e/image.png)


- 양의 정수 데이터 → negative binomial likelihood
    - negative binomial likelihood
        - 판매 데이터 특징상 variance &gt; mean
        - 포아송은 var = mean이므로 사용하기 부적합하고 
        negative binomial은 Var = μ + μ²α로 더 유연함
        - 분산이 mean보다 클 수 있다는 특징을 잘 표현 - **retail demand**
- beta distribution, bernoulli, mixture distributions 와 같은 다른 likelihood 모델도 쉽게 사용 가능

    단, 해당 분포에서 샘플링이 쉽고, log-likelihood 와 그 gradient를 계산할 수 있어야 함</code></pre><h2 id="32-training">3.2 Training</h2>
<ul>
<li><p>시계열 데이터셋 {$z_{i,1:T}$}$<em>{i=1,...,N}$ 과 covariates $x</em>{i,1:T}$가 주어졌다고 하면 모델 파라미터는 <strong>log-likelihood를 최대화하는 방식</strong>으로 학습</p>
<p> <img src="https://velog.velcdn.com/images/hyooo__s/post/a2c0ca4d-5388-4f77-9157-d21a951289c2/image.png" alt=""></p>
</li>
</ul>
<pre><code>- 어떤 확률분포 p에서 $h_{i,t}$라는 특정 파라미터가 주어졌을 때  $z_{i,t}$가 나올 확률이 가장 높도록 학습
- 세타에 대한 학습을 할 것 이기 때문에 세타에 대한 stochastic gradient descent를 통해 학습 진행

    ⇒ 모델이 예측한 분포에서 실제 값이 얼마나 가능성이 높은지</code></pre><ul>
<li><p>DeepAR은</p>
<ul>
<li><p>latent variable inference 필요없음 → direct likelihood optimiztion 이므로!</p>
</li>
<li><p>training window sampling → data augmentation 가능</p>
<ul>
<li>window1 → 2013 start</li>
<li>window2 → 2013+1 start</li>
<li>window3 → 2013+2 start</li>
</ul>
</li>
</ul>
</li>
<li><p>training 과 predition의 mismatch한 문제가 있긴 하지만 큰 문제는 안 됨</p>
</li>
</ul>
<h2 id="33-scale-handling">3.3 Scale handling</h2>
<ul>
<li><p>power-law 규모 분포를 가진 데이터에 모델을 적용하면 2가지 문제 발생</p>
</li>
<li><p>문제1</p>
<ul>
<li><p>autoregressive 구조 때문에 입력 $z_{i,t-1}$과 네트워크 출력 모두 관측값에 비례해 스케일이 커짐</p>
</li>
<li><p>신경망의 비선형 함수들의 작동 범위가 제한적이라 gradient 문제 발생</p>
<p> → 추가적 조치가 없다면 (P) 입력을 적절한 범위로 스케일링 하는 방법을 학습해야함</p>
</li>
</ul>
</li>
</ul>
<pre><code>**⇒ (S) 아이템별 scale factor vi로 나누어 해결**

(각 아이템별로 고유한 특성이 있을 것이기 때문)

µ = νi * softplus(oµ)

→ 네트워크 output을 scaled parameter로 하는 데에 중요

→ 평균값을 scale factor로 사용하는 방법 잘 작동</code></pre><ul>
<li><p>문제2</p>
<ul>
<li><p>데이터 불균형으로 인해 큰 scale 시계열이 학습에서 거의 선택되지 않을 수 있음</p>
<p>  → weigthed sampling을 통해 scale이 큰 아이템을 더 자주 학습함</p>
</li>
</ul>
</li>
</ul>
<h2 id="34-features">3.4 Features</h2>
<ul>
<li><p>covariate  $x_{i,t}$는 item feature(product categroy, brand, size), time feature(weekday, month, holiday) 모두 가능</p>
</li>
<li><p>모든 실험에서 age feature 사용</p>
<ul>
<li><p>age = 현재 시점 - 시계열 시작 시점</p>
<p>  → new item behaviour 학습 가능</p>
</li>
</ul>
</li>
<li><p>categorical item feature 사용, 모델은 embedding 학습</p>
</li>
<li><p>모든 covariates는 평균 0, 분산 1로 정규화</p>
</li>
</ul>
<h2 id="4-applications-and-experiments">4. Applications and Experiments</h2>
<ul>
<li><p>실험 환경</p>
<ul>
<li><p>Framework: MXNet</p>
</li>
<li><p>Machine: AWS p2.xlarge</p>
<ul>
<li>CPU 4개</li>
<li>GPU 1개</li>
</ul>
</li>
</ul>
</li>
<li><p>성과</p>
<ul>
<li>500,000개의 시계열을 학습하는데 10시간 이하 → 매우 큰 데이터에서도 학습 가능하다</li>
</ul>
</li>
<li><p>사용 데이터셋</p>
<ul>
<li><p>parts(자동차 부품 판매량/1046개의 시계열, 50 time steps)</p>
</li>
<li><p>electricity(전력 사용량/370 households, 시간 단위)</p>
</li>
<li><p>traffic(도로 점유율/963 freeway lanes, 시간 단위)</p>
<p>→ 전력과 도로 점유율은 rolling window forecast 방식 사용</p>
<blockquote>
<p><strong>✓ rolling window forecast</strong></p>
<ul>
<li>rolling window<ul>
<li>여러 시점에서 반복 평가</li>
<li>모델을 다시 학습하지 않음 - 한 번 학습된 모델로 여러 forecast 수행</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ ec(아마존 판매 데이터), ec-sub(아마존 판매 데이터 subset)</strong></p>
<ul>
<li><p>time series가 매우 다양 - slow moving item, fast moving item</p>
<p>  즉, 판매량 scale 차이가 매우 큼</p>
</li>
<li><p>새 상품의 경우 history가 거의 없다는 문제 → cold start problem</p>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>DeepAR의 경우 global model로 모든 시계열을 같이 학습하기 때문에 패턴 공유 가능</p>
<p>  → probabilistic forecasting(불확실성 모델링)</p>
<p>  → scale normalization(power-law 문제 해결) </p>
</li>
</ul>
<h2 id="41-accuracy-comparsion">4.1 Accuracy comparsion</h2>
<ul>
<li><p>parts와 ec/ec-sub 데이터셋에서 baseline 모델 비교</p>
</li>
<li><p>baseline 모델</p>
<ul>
<li>Croston - 간헐적 수요 예측을 위해 개발된 방법</li>
<li>ETS - Error Trend Seasonality 대표적인 Classical forecasting 모델</li>
<li>Snyder - Negative Binomial 기반 autoregressive 모델</li>
<li>ISSM - covariates를 사용하는 state space model</li>
</ul>
<hr>
<p>  [RNN기반] ← DeepAR의 구성요소가 실제로 중요한지 검증 목적</p>
<ul>
<li>RNN-Gaussian<ul>
<li>DeepAR과 동일한 구조 but 가우시안 분포 사용</li>
</ul>
</li>
<li>RNN-negbin ← DeepAR의 design 요소 검증 목적<ul>
<li>negative binomial 분포 사용</li>
<li>scale normalization, weighted smapling 사용 x</li>
</ul>
</li>
</ul>
</li>
<li><p>평가지표: p-risk metric (quantile loss) ← parts, ec, ec-sub</p>
<ul>
<li><p>prediction range의 특정 구간인 L,L+S)를 지정하고 평가</p>
<p> <img src="https://velog.velcdn.com/images/hyooo__s/post/6fa5cc73-70d9-4d68-8720-f93f903f1052/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- eletricity와 traffic은 ND와 RMSE로 평가</code></pre><h2 id="42-quantile-analysis">4.2 Quantile analysis</h2>
<ul>
<li><p>ISSM 모델은 uncertainty가 선형적으로 증가한다고 가정하지만 
DeepAR은 uncertainty 증가 패턴을 데이터로부터 학습 
→ 시간이 지날수록 uncertainty가 증가한다는 패턴 학습</p>
<ul>
<li>uncertainty는 4분기(Q4)에 증가하고 이후 다시 감소 - retail의 특징 (수요변동성 증가)</li>
</ul>
</li>
<li><p>ISSM모델과 비교했을 때 DeepAR이 calibration이 전반적으로 good</p>
</li>
<li><p>shuffled forecast calibration 곡선</p>
<ul>
<li><p>예측 샘플을 시간 순서 없이 섞음으로써 시간 간의 상관관계 제거</p>
</li>
<li><p>짧은 구간에서는 큰 차이가 없지만 긴 예측 구간에서는 상관관계를 제거하면 calibration이 더 나빠짐</p>
<p>  → 모델이 시간 간 중요한 상관관계를 잘 학습하고 있음을 알 수 있음</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-conclusion">5. Conclusion</h2>
<ul>
<li>DeepAR모델은<ul>
<li>여러 시계열로부터 global model을 학습하고</li>
<li>rescaling과 velocity 기반 smapling으로 다양한 규모를 처리한다</li>
<li>calibrated probabilistic forecast를 생성하고</li>
<li>데이터로부터 seasonality와 uncertainty 증가 패턴 학습</li>
</ul>
</li>
<li>또한 다양한 데이터셋에서 하이퍼파라미터 튜닝을 거의 하지않더라도 잘 작동함</li>
<li>몇 백개정도의 중간 규모의 데이터셋에서도 good</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Visual Instruction Tuning ]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Visual-Instruction-Tuning</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Visual-Instruction-Tuning</guid>
            <pubDate>Wed, 22 Jul 2026 13:20:32 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: Visual Instruction Tuning
<strong>학회(출판연도)</strong>: NeurIPS (2023)
<strong>연구분야</strong>: 딥러닝 기반 멀티모달 표현 학습 및 비전-언어 모델</p>
</blockquote>
<hr>
<h2 id="background">Background</h2>
<ul>
<li><p>GPT-4는 이미지를 이해할 수 있지만, 학습방법은 공개되지 않았었음</p>
<p>→ LLM이 instruction tuning으로 똑똑해졌듯, 이미지도 instruction tuning을 하면 GPT-4V처럼 만들 수 있지 않을까?</p>
<blockquote>
<p><strong>✓ instruction tuning</strong></p>
<p>instruction(사용자의 지시) + tuning(이미 학습된 모델을 특정 목적에 맞게 추가로 학습)</p>
<p>→ 즉, 사용자의 다양한 지시를 잘 따르도록 추가 학습시키는 것을 의미함</p>
</blockquote>
<blockquote>
<p><strong>✓ 이게 왜 필요하냐하면~</strong></p>
<p>일반적인 언어모델의 경우에는 인터넷 문서를 보고 학습을 하게 되는데, 학습데이터는 대부분</p>
<blockquote>
<p>대한민국의 수도는 서울이다.</p>
</blockquote>
<p>또는</p>
<blockquote>
<p>고양이는 포유류다.</p>
</blockquote>
<p>이런 데이터는 지식을 배우는데에는 좋은데 사람의 질문에 대답하는 방법은 배우지 못한다는 단점이 있다.</p>
<p>그래서 instuction tuning을 통해서 학습데이터를 아래와 같이 바꾼다.</p>
<blockquote>
<p>instruction: 대한민국의 수도가 어디야?<br>answer: 서울입니다.</p>
</blockquote>
<p>또는</p>
<blockquote>
<p>instruction: 다음 문장을 영어로 번역해줘<br>input: 안녕하세요<br>answer: hello.</p>
</blockquote>
<p>와 같이 <strong>질문-답변 형태</strong>를 수십만~수백만개를 학습시키는 것</p>
<ul>
<li>그러면 모델은 사람이 이런 지시를 하면 이렇게 대답해야한다는 것을 배우게 된다</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ visual instruction tuning</strong></p>
<p>기존의 instruction tuning은 “질문-답변”처럼 텍스트만 활용했었는데, visual instruction tuning은 “이미지 + 질문 → 답변”을 학습한다.</p>
<p>예를 들어,</p>
<blockquote>
<p>(강아지 사진)<br>질문: 강아지가 지금 뭐하고 있어?<br>답변: 공을 보고 있습니다.</p>
</blockquote>
<p>또는</p>
<blockquote>
<p>(도로 위 사진)<br>질문: 왜 차들이 지금 멈춰 있어?<br>답변: 빨간불이기 때문입니다.</p>
</blockquote>
<p>정리하자면,</p>
<ul>
<li>instruction tuning은 사용자의 지시를 이해하고 적절히 수행하도록 언어 모델을 추가 학습시키는 과정이고</li>
<li>visual instrucion tuning은 여기에 이미지 정보를 함께 입력받아서 이미지를 이해하고 사용자의 질문이나 지시에 맞게 학습시키는 방법을 의미한다</li>
</ul>
<p>⇒ <strong>텍스트만 이해하는 AI</strong>를 <strong>이미지를 보고 대화할 수 있는 AI</strong>로 확장</p>
</blockquote>
</li>
<li><p>기존의 VLM의 문제</p>
<ul>
<li><p>이전에는 이미지를 보고,</p>
<ul>
<li><p>저게 뭐야? - 강아지요. 까지는 대답을 잘했는데,</p>
</li>
<li><p>왜 강아지가 위를 쳐다보고 있어? 라고 하는 추론이 필요한 질문에는 대답을 하기 어려웠음</p>
<p>⇒ 그래서 필요한 것이 instruction 데이터</p>
</li>
</ul>
</li>
<li><p>instruction 데이터를 활용해서</p>
<ul>
<li>왜 강아지가 위를 쳐다보고 있어? - 저 위에는 공이 있기 때문이야와 같이 <strong>질문-답변 형태로 학습</strong>하도록 함</li>
</ul>
</li>
<li><p>그런데, 이러한 instruction 데이터를 사람이 만들게 되면, 비용이 너무 많이 들게 된다는 단점이 존재함</p>
<p><strong>⇒ GPT-4를 이용하자</strong></p>
<ul>
<li><p>GPT-4를 활용하게 되면,</p>
<p><strong>[이전]</strong></p>
<ul>
<li>이미지 하나 → 캡션 1개(강아지가 공원에서 놀고 있어요!)</li>
</ul>
<p><strong>[GPT-4]</strong></p>
<ul>
<li><p>캡션 1개(강아지가 공원에소 놀고 있어요!)</p>
<p>→</p>
<blockquote>
<ul>
<li>어떤 동물이야? - 강아지요</li>
<li>강아지가 뭐하고 있어? - 놀고 있어요</li>
<li>어디에서? → 공원에서요</li>
<li>강아지가 지금 실내야? - 아니요</li>
</ul>
</blockquote>
<p>와 같은 대화를 자동 생성을 하면서, 캡션 1개로 instruction dataset을 만들 수 있다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li><p>GPT가 생성한 instruction 데이터를 활용하여 LLM을 튜닝시키면 새로운 작업(Zero-shot)에 대한 성능이 향상된다는 사실이 알려져 있지만, 멀티모달 분야에서는 충분히 연구되지 않았음</p>
<blockquote>
<p><strong>✓ Zero-shot</strong></p>
<p>쉽게 말해, 학습 데이터가 0개인 상태로도 새로운 작업을 수행할 수 있는 능력을 의미함</p>
<p>예를 들어,</p>
<ul>
<li><p>instruction tuning을 하지 않은 모델</p>
<p>→ 번역 o, 요약 △, 설명 x</p>
</li>
<li><p>instruction tuning을 한 모델</p>
<p>→ 번역 o, 요약 o, 설명 o, 코드 작성 o 처럼 새로운 작업에도 적응을 잘함</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Zero-shot, One-shot, Few-shot</strong></p>
<table>
<thead>
<tr>
<th>방식</th>
<th>학습 예시 수</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Zero-shot</strong></td>
<td>0개</td>
<td>&quot;이 문장을 번역해.&quot;</td>
</tr>
<tr>
<td><strong>One-shot</strong></td>
<td>1개</td>
<td>예시 하나를 보여준 뒤 수행</td>
</tr>
<tr>
<td><strong>Few-shot</strong></td>
<td>몇 개(2~10개 정도)</td>
<td>예시 몇 개를 보여준 뒤 수행</td>
</tr>
</tbody></table>
<ul>
<li><p>Zero-shot</p>
<ul>
<li>오늘 정말 행복해 → 감정을 분류해!</li>
</ul>
</li>
<li><p>One-shot</p>
<ul>
<li><p>오늘 너무 좋다 - 긍정</p>
<p>→ 오늘 정말 행복해 - ??</p>
</li>
</ul>
</li>
<li><p>Few-shot</p>
<ul>
<li><p>좋다 - 긍정, 싫다 - 부정, 행복하다 - 긍정</p>
<p>→ 오늘 정말 행복해 - ??</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
<li><p>본 연구에서는 텍스트만 활용하는 GPT-4를 활용하여 이미지와 텍스트 기반의 멀티모달 instrction 데이터를 생성을 제안함 → <strong>LLaVA</strong></p>
<ul>
<li><p>LLaVA: 비전 인코더에 LLM을 결합하여 범용적인 이미지와 언어 이해를 수행하는 end-to-end 방식의 대규모 멀티모달 모델</p>
<blockquote>
<p><strong>✓ end-to-end</strong></p>
<p>입력(input)부터 출력(output)까지 하나의 모델이 전체 과정을 한 번에 학습하는 것</p>
</blockquote>
<blockquote>
<p><strong>✓ 참고</strong></p>
<p><strong>이전</strong></p>
<ul>
<li>이미지 → 사람이 특징 추출(귀 모양, 털 색 등) → 분류기 → 고양이</li>
<li>즉, 여기에서 귀 길이를 측정하자, 색깔을 활용하자. 같은 규칙을 사람이 정해야 했음</li>
<li>입력 → feature engineering(사람) → ML → 출력</li>
</ul>
<p><strong>딥러닝에서는</strong></p>
<ul>
<li>이미지 → 신경망 → 고양이</li>
<li>모델이 스스로 어떤 특징을 볼 지, 어떻게 판단할지를 학습함</li>
</ul>
<p><strong>LLaVA에서도</strong></p>
<p>입력: 이미지+질문 → 출력: 답변<br>과 같이 중간에 사람이 객체를 검출하거나 caption을 만들거나하는 과정이 없음</p>
<ul>
<li>이미지 → CLIP → Vicuna → 답변</li>
</ul>
</blockquote>
<ul>
<li><p>end-to-end의 핵심은 최종적인 loss가 어디에서 계산되느냐임</p>
<p><strong>end-to-end가 아닌 경우</strong></p>
<ul>
<li><p>이미지 → YOLO → BBox 저장 → 캡션 모델 → 텍스트 저장 → GPT → 답변<br>과 같이 각 모델이 독립적으로 동작하는 경우</p>
</li>
<li><p>YOLO는 객체 탐지만, Caption모델은 BBox만, GPT는 텍스트만 보기</p>
<p>→ 하나의 loss로 연결되어 있지 않음</p>
</li>
</ul>
<p><strong>end-to-end이려면</strong></p>
<ul>
<li>이미지 → CLIP → projection → Vicuna → Answer → <strong>Loss 하나</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>모델뿐만 아니라 평가용 데이터세트도 함께 만들었음</p>
</li>
</ul>
</li>
<li><p>실험결과, 멀티모달 대화 능력이 우수했고, 새로운 이미지나 질문에서도 GPT-4V와 비슷한 수준을 보이기도 했음</p>
<ul>
<li>GPT-4V의 성능을 100이라고 했을 때, LLaVA는 85.1%정도</li>
<li>ScienceQA 데이터세트로 파인튜닝한 결과, 92.53%로 SOTA 달성</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>사람이 시각과 언어 여러가지 채널을 통해 상호작용하는 것처럼 인공지능 또한 시각과 언어를 모두 포함하는 멀티모달 지시를 효과적으로 따르고, 인간의 의도와 일치하게 실제 환경에서 다양한 작업을 수행하는 것을 목표로하고 있음</p>
<ul>
<li><p>그래서 최근에, 언어가 결합된 비전 모델 개발에 대한 관심이 증가하고 있음</p>
<ul>
<li>분류(classification), 객체 탐지(detection), 분할(segmentation), 이미지 설명(captioning), 이미지 생성(generation), 편집(editing) 등 다양한 곳에서 뛰어난 성능을 내고 있음</li>
</ul>
</li>
<li><p>하지만 이러한 연구들은 <del>end-to-end 형식이 아니라</del> 각 작업들이 하나의 대형 모델에서 독립적으로 해결이 되고 있음</p>
<ul>
<li><p>분류 모델 → 분류만, 객체 탐지 모델이면 → 탐지만</p>
</li>
<li><p>언어도 이미지 내용을 설명하는 것에만 그쳤었음</p>
<p>즉, 왜 그런지, 다른 방법은 없는지, 비슷한 예시는 뭔지? 등에 대한 질문에서는 잘 대응하지 못했었음</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>이때, LLM은 언어가 다양한 작업 지시를 할 수 있고, end-to-end로 학습된 신경망이 원하는 작업으로 전환하여 문제를 해결할 수 있도록 함을 보여줌</p>
<ul>
<li>그래서 오픈소스 LLM에 대한 관심이 높아졌고, 그중 LLaMA는 GPT-3에 준하는 오픈소스 LLM<ul>
<li>instruction tuning 덕분에 오픈소스 모델도 GPT와 비슷한 성능을 낼 수 있게 되었음</li>
</ul>
</li>
</ul>
</li>
<li><p>하지만, 그동안은 텍스트만을 대상으로 연구가 진행되어 왔었고, 본 연구에서는 instruction tuning을 언어-이미지 멀티모달 공간으로 확장하는 visual instruction tuning을 제안함</p>
<ul>
<li>멀티모달 instruction 데이터가 부족하기 때문에 ChatGPT/GPT-4를 이용하여 이미지-텍스트 쌍을 적절한 instruction 형식으로 병형하는 데이터 재구성 방법과 파이프라인을 제안</li>
<li>CLIP의 개방형 시각 인코더와 Vicuna 언어 디코더를 연결하여 대규모 멀티모달 LLM을 개발하고, 시각-언어 instruction 데이터로 end-to-end 미세 조정 수행</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-related-work">2. Related Work</h2>
<h4 id="multimodal-instruction-following-agents">Multimodal Instruction-following Agents</h4>
<ul>
<li>컴퓨터 비전 분야에서 instruction-following agents를 구축하는 기존 연구들은 크게 두가지 범주로 나눌 수 있음<br>— ① end-to-end 모델, ② 여러 모델을 연결한 시스템</li>
</ul>
<p><strong>[end-to-end 모델]</strong></p>
<ul>
<li>각각의 특정 연구 주제마다 별도로 개발되는 편<ul>
<li>VLN(Vision Language Navigation) &amp; Habitat에서<br>Embodied AI Agent가 자연어 지시를 따르고, 시각 환경에서 목표를 달성하기 위한 일련의 행동을 수행해야함</li>
<li>예를 들어, 사람이 “주방에서 컵을 가져와”라고 했다면,<br>AI가 앞으로 이동 → 오른쪽으로 회전 → 컵 찾기 → 집기를 수행</li>
</ul>
</li>
<li>이미지 편집 분야에서<br>입력 이미지와 사람이 작성한 지시문을 입력 받아서 InstructPix2Pix는 이미지 편집 수행</li>
</ul>
<p><strong>[여러 모델을 연결한 시스템]</strong></p>
<ul>
<li>LangChain이나 LLM을 이용하여 여러 모델을 조정하는 시스템<ul>
<li>Visual ChatGPT, X-GPT, MM-REACT, VisProg, ViperGPT</li>
</ul>
</li>
</ul>
<p>⇒ 두 범주 모두 instruction-following agent를 구축한다는 목표를 가지고 있지만, 본 연구에서는 <strong>여러 작업을 수행할 수 있는 end-to-end 방식의 언어-비전 멀티모달 개발</strong>에 초점을 맞출 것</p>
<h4 id="instruction-tuning">Instruction Tuning</h4>
<ul>
<li><p>자연어 처리 분야에서는 GPT-3, T5, PaLM, OPT와 같은 LLM이 자연어 지시를 따르고 실제 작업을 수행할 수 있도록 하기 위해 instruction tuning 방법을 연구함</p>
<ul>
<li><p>InstructGPT/ChatGPT, FLAN-T5, FLAN-PaLM, OPT-IML</p>
</li>
<li><p>instruction tuning을 통해 LLM의 Zero-shot, Few-shot 일반화 능력이 향상</p>
<p>⇒ 때문에 해당 아이디어를 NLP뿐만 아니라 CV에도 적용해보자!</p>
</li>
</ul>
</li>
<li><p>넓게보면, foundation model을 이용한 Teacher-Student Distillation 아이디어는 이미지 분류와 같은 다른 분야에서도 연구되어 옴</p>
<ul>
<li><p>Flamingo</p>
<ul>
<li><p>Zero-shot 작업 전이와 In-context Learning에서 뛰어난 성능을 보였음 → 멀티모달 분야의 GPT-3</p>
<blockquote>
<p><strong>✓ In-context Learning(ICL) — Few-shot learning</strong></p>
<p>모델 파라미터를 업데이트하지 않고, 프롬프트에 예시를 넣어 새로운 작업을 수행하게 하는 방법</p>
<p>파인튜닝은 데이터를 넣음으로써 모델을 다시 학습시킴. 즉, 가중치가 바뀜</p>
<ul>
<li>데이터 → 모델학습 → 파라미터 변경 → 새로운 모델</li>
</ul>
<p>반면, ICL은 학습은 안하고, 프롬프트만 변경</p>
<blockquote>
<p>한국어 : 감사합니다.<br>영어 : Thank you.</p>
<p>한국어 : 좋은 아침입니다.<br>영어 : Good morning.</p>
<p>한국어 : 안녕하세요.<br>영어 : ??</p>
</blockquote>
<p>⇒ GPT는 Hello.로 답하는데 이건 학습한 것이 아니라 “지금 이 번역 패턴을 따라가면 되는구나”를 프롬프트에서 이해한 것</p>
</blockquote>
</li>
</ul>
</li>
<li><p>BLIP-2, FROMAGe, KOSMOS-1</p>
<ul>
<li>이미지-텍스트 쌍으로 학습된 대규모 멀티모달 모델</li>
</ul>
</li>
<li><p>PaLM-E</p>
<ul>
<li>Embodied AI를 위한 대규모 멀티모달 모델</li>
</ul>
</li>
</ul>
</li>
<li><p>오픈 소스 LLM인 LLaMA를 기반으로 OpenFlamingo와 LLaMA-adapter는 LLaMA가 이미지 입력을 사용할 수 있는 오픈소스 연구이며 오픈소스 LLM 개발의 기반을 마련</p>
<ul>
<li><p>기존의 모델은 이미지를 이해하긴 하지만, instruction tuning을 하지 않았고, 멀티모달 성능이 일반 텍스트 전용 작업보다 부족하다는 문제</p>
<p>⇒ 본 논문에서 이러한 공백을 메우고자 함</p>
</li>
</ul>
</li>
<li><p>주의해야할 점은</p>
<ul>
<li>Visual instruction tuning과 visual prompt tuning은 다르다.<ul>
<li>visual instruction tuning은 모델의 <strong>instruction 수행 능력 향상 목적</strong></li>
<li>visual prompt tuning은 모델을 새로운 작업에 적응시킬 때 <strong>적은 수의 파라미터만 학습하여 효율성을 높이는 것</strong>이 목적</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-gpt-assisted-visual-instruction-data-generation">3. GPT-assisted Visual Instruction Data Generation</h2>
<ul>
<li><p>CC와 LAION 등 이미지-텍스트 상으로 이루어진 공개 멀티모달 데이터세트는 풍부하지만, instruction-tuning에 필요한 멀티모달 instruction-following 데이터는 제한적</p>
<ul>
<li><p>부분적으로 사람들이 크라우드소싱을 통해 데이터를 만드는 것도 비용이 많이 듦</p>
<p>⇒ 본 논문에서는 이미지-텍스트 데이터를 기반으로 ChatGPT/GPT-4를 활용하여 멀티모달 instruction-following 데이터를 수집하는 방법을 제안함</p>
</li>
</ul>
</li>
<li><p>이미지 $X_v$와 여기에 대응하는 캡션 $X_c$가 주여졌을 때, 이미지 내용을 설명하도록 Assitant에 지시하는 질문 집합 $X_q$를 만듦</p>
<ul>
<li><p>본 논문에서는 GPT-4에게 이러한 질문 목록을 생성하도록 프롬프트를 제공함(부록 참조)</p>
</li>
<li><p>이미지-텍스트 쌍을 instruction-following 형태로 확장하는 가장 간단한 방법은</p>
<blockquote>
<p>human: $X_q$ $X_v$ <code>&lt;STOP&gt;</code><br>Assistant: $X_c$ <code>&lt;STOP&gt;</code></p>
</blockquote>
<p>⇒ 즉, 원래는 image → caption 구조였는데, 이제는 질문 + image → caption 구조로!</p>
</li>
<li><p>하지만, 이런 단순작업으로는 질문과 답변 모두에서 다양성과 깊이 있는 추론을 하기엔 부족해짐</p>
</li>
</ul>
</li>
<li><p>이러한 문제를 해결하기 위해, 텍스트만 입력받는 GPT-4 또는 ChatGPT를 강력한 Teacher 모델로 활용하여 시각정보를 포함하는 Instruction 데이터를 생성함</p>
<ul>
<li><p>이미지를 텍스트 전용 GPT가 이해할 수 있도록 2가지 기호적 표현 사용</p>
<blockquote>
<p><strong>✓ 기호적 표현이란</strong></p>
<p>캡션과 BBox는 이미지를 그대로 사용하는 것이 아니라, 이미지를 “기호”나 “텍스트” 형태로 표현하는 것이라서 기호적 표현이라고 부름</p>
<p><strong>이미지</strong></p>
<ul>
<li>픽셀들의 집합 (숫자 배열)</li>
</ul>
<pre><code class="language-text">[[123, 45, 200],
[132, 50, 190],
...
]</code></pre>
<p><strong>캡션</strong></p>
<ul>
<li>강아지가 공원에서 놀고 있어요! 와 같이 언어로 변환한 것</li>
<li><code>이미지 → 텍스트</code> 이므로 기호를 이용한 표현</li>
</ul>
<p><strong>BBox</strong></p>
<ul>
<li>BBox는 객체 이름(dog)와 위치좌표($x_1$,$y_1$,$x_2$,$y_2$)로 이미지 표현</li>
</ul>
<pre><code class="language-text">Dog : (120, 50, 280, 320)

Ball : (330, 210, 380, 260)

Person : (20, 10, 170, 400)</code></pre>
<ul>
<li>픽셀 자체가 아니라 추상화된 정보이므로 기호적 표현</li>
</ul>
</blockquote>
</li>
<li><p>캡션은 일반적으로 <strong>다양한 관점에서 시각 장면</strong>을 설명함</p>
</li>
<li><p>BBox는 장면 속 <strong>객체 위치</strong>를 나타내며, 각 박스는 <strong>객체의 종류와 공간적 위치</strong>를 함께 표현함</p>
<ul>
<li><p>예시(부록)</p>
<p>!image.png</p>
</li>
</ul>
</li>
</ul>
<p>⇒ 이러한 기호적 표현을 통해 LLM이 이해할 수 있는 시퀀스로 인코딩할 수 있게 됨</p>
</li>
<li><p>본 논문에서는 COCO 데이터를 활용하여 세 종류의 instruction 데이터를 생성함</p>
<ul>
<li>사람이 몇 개의 예시(ICL의 seed example)를 설계하면, 그 예시를 보고 GPT가 나머지를 보고 스스로 생성함</li>
</ul>
</li>
</ul>
<p><strong>[Conversation]</strong></p>
<ul>
<li>사진에 대해 질문하는 사람과 Assistant 사이의 대화 설계<ul>
<li>답변은 assistant가 실제 이미지를 보고 답하는 것처럼 작성</li>
<li>질문은 객체 종류, 객체 개수, 객체의 행동, 객체 위치, 객체간 상대적 위치 등 다양한 시각 정보를 담았음 + 명확한 답이 존재하는 질문만 활용</li>
</ul>
</li>
</ul>
<p><strong>[Detailed Description]</strong></p>
<ul>
<li>이미지에 대해 풍부하고 포괄적인 설명을 포함하기 위해 관련 질문 목록 설계<ul>
<li>각 이미지마다 질문 목록에서 하나를 무작위로 선택하여 GPT-4가 상세 설명을 생성하도록 함</li>
</ul>
</li>
</ul>
<p><strong>[Complex Reasoning]</strong></p>
<ul>
<li><p>Conversation 과 Detailed Description은 시각적 내용에 집중하고 이를 바탕으로 깊은 추론 질문 생성</p>
<ul>
<li><p>답변은 일반적으로 엄격한 논리를 따라 단계적으로 추론하는 과정</p>
<p>ex. 왜 그 사람은 우산을 쓰고 있을까? → 비가 오고 있고, 우산을 쓰는 게 자연스럽다 와 같은 추론 필요</p>
</li>
</ul>
</li>
</ul>
<p>⇒ 158,000개 고유한 언어-이미지 instruction 데이터 수집</p>
<ul>
<li><p>58,000개 → Conversation</p>
</li>
<li><p>23,000개 → Detailed Description</p>
</li>
<li><p>77,000개 → Complex Reasoning</p>
</li>
<li><p>ChatGPT와 GPT-4를 모두 활용하여 데이터를 생성해 본 후 성능 비교함</p>
<ul>
<li>객체 간의 위치 관계나 공간 추론이 필요한 질문에서는 GPT-4가 훨씬 정확하고 일관된 데이터를 만들어냄 → 최종 데이터 생성에는 GPT-4 사용!</li>
</ul>
<blockquote>
<p><strong>✓ GPT-4 vs ChatGPT</strong></p>
<p>GPT-4는 언어 <strong>모델</strong>이고, ChatGPT는 그 모델을 이용하여 대화할 수 있도록 만든 <strong>서비스</strong></p>
<ul>
<li>비유하자면, A18칩 = GPT-4, 아이폰 = ChatGPT</li>
</ul>
</blockquote>
</li>
</ul>
<hr>
<h2 id="4-visual-instruction-tuning">4. Visual Instruction Tuning</h2>
<h3 id="41-architecture">4.1 Architecture</h3>
<ul>
<li>주요 목표는 사전학습된 LLM과 비전 모델의 능력을 모두 효과적으로 활용하는 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/86619dee-0722-431f-954f-5192e03ae400/image.png" alt=""></p>
<ul>
<li><p>구조</p>
<p>image → CLIP 비전 인코더 - Visual Features → Projection layer - vision tokens → Vicuna → answer</p>
</li>
<li><p>파라미터 $ϕ$를 갖는 LLM $f_ϕ$(⋅)로 Vicuna 모델 선택 → 당시 가장 뛰어난 instruction following 능력을 가지고 있었음</p>
<blockquote>
<p><strong>✓ 왜 Vicuna</strong></p>
<p>Meta의 LLaMA를 기반으로 Instruction Tuning하여서 만든 오픈소스 대화형 언어모델</p>
<ul>
<li>CLIP이 이미지를 feature로 바꾸고, projection layer가 Vicuna가 이해할 수 있는 형태로 변환</li>
</ul>
<p><strong>[상세]</strong></p>
<table>
<thead>
<tr>
<th>모델</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><strong>CLIP</strong></td>
<td>이미지를 Feature로 변환</td>
</tr>
<tr>
<td><strong>Projection Layer</strong></td>
<td>이미지 Feature를 Vicuna가 이해할 수 있는 형태로 변환</td>
</tr>
<tr>
<td><strong>Vicuna</strong></td>
<td>질문을 이해하고 자연어 답변 생성</td>
</tr>
<tr>
<td><strong>GPT-4</strong></td>
<td>학습용 Instruction 데이터 생성</td>
</tr>
</tbody></table>
<ul>
<li>당시 GPT-4는 폐쇄형으로 가중치, 모델이 공개되어 있지 않아 공개된 Vicuna를 활용함<ul>
<li>GPT-4는 데이터생성기 역할만 수행</li>
</ul>
</li>
</ul>
</blockquote>
</li>
<li><p>입력 이미지 $X_v$에 대해 사전학습된 CLIP ViT-L/14 비전 인코더를 사용</p>
<p>→ 시각 특징 $Z_v$ = $g$($X_v$)를 생성함</p>
<ul>
<li>즉, 이미지를 CLIP에 통과시키면서 이미지를 숫자로 표현 → $Z_v$<ul>
<li>$X_v$ : 입력 이미지</li>
<li>$g(⋅)$ : CLIP</li>
<li>$Z_v$ : 이미지 특징(feature)</li>
</ul>
</li>
</ul>
</li>
<li><p>마지막 transformer 층 이전과 이후에 Grid feature를 모두 고려함</p>
<ul>
<li>CLIP내부에는 transformer가 여러 층이 있는데 논문에서는 마지막 층의 직전 feature과 직후 feature 둘 다 실험해봤다는 뜻</li>
</ul>
</li>
<li><p>CLIP에서 뽑은 이미지 특징을 <strong>단어 임베딩 공간</strong>으로 연결하기 위해 간단한 선형층 사용</p>
<ul>
<li><p>Vicuna는 단어 임베딩 공간, CLIP의 feature는 이미지 feature공간에 있으니까 둘의 좌표계가 다르다는 문제 → 선형층에 넣자!</p>
</li>
<li><p>CLIP → 선형층 → LLM 구조라고 이해하면 됨</p>
<p>⇒ 즉, 우리가 학습가능한 projection matrix $W$를 적용해서 이미지 특징인 $Z_v$를 언어 임베딩 토큰 $H_v$로 변환<br>→ 이 임베딩 토큰 $H_v$는 단어 임베딩과 동일한 차원을 가짐</p>
<ul>
<li><p>여기서 projection matrix $W$는 학습되는 가중치를 의미함</p>
<p>CLIP → W → LLM 토큰</p>
<p>✓ LLM이 사용하는 임베딩 크기와 완전히 동일한 차원으로 만든다는 것이 핵심!</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>$H_v = W ⋅ Z_v,$  $with$  $Z_v = g(X_v)$</p>
</blockquote>
<p>⇒ 이렇게 <strong>시각 토큰</strong>의 시퀀스 $H_v$를 얻게 됨 (이미지를 하나의 단어처럼!)</p>
<ul>
<li>이러한 projection 방식(선형층 1개)은 매우 가볍기 때문에 실험을 빠르게 진행 가능하다!!</li>
</ul>
</li>
<li><p>이미지와 언어 표현을 연결하는 방법에는 선형층 1개만 사용하는 것뿐만 아니라, Flamingo의 Gated Cross-Attention이나 BLIP-2의 Q-former와 같은 방법도 있긴하다~ 이런 더 효과적이고 정교한 LLaVA 구조를 탐구하는 것은 향후 연구 과제로 남겨두겠다.</p>
</li>
</ul>
<blockquote>
<p><strong>✓ 이 Architecture의 핵심 아이디어</strong></p>
<ul>
<li>새로운 거대한 모델을 만드는 것이 아니라 이미 강력한 두 모델(CLIP, Vicuna)을 간단한 projection layer 하나로 연결했다는 것<ul>
<li>CLIP은 이미지 숫자 특징 $Z_v$로 변환</li>
<li>projection Matrix $W$는 이 특징을 LLM이 사용하는 <strong>단어 임베딩 공간</strong>으로 옮김</li>
<li>이렇게 변환된 visual token $H_v$를 vicuna에 입력하면, vicun는 이미지를 단어처럼 처리해서 질문에 답할 수 있음</li>
</ul>
</li>
<li>즉, LLaVA의 가장 큰 특징은 복잡한 멀티모달 구조가 아니라 간단한 연결만으로 사전학습된 모델을 잘 결합했다 라는 것</li>
</ul>
</blockquote>
<h3 id="42-training">4.2 Training</h3>
<ul>
<li><p>각 이미지 $X_v$에 대해서 우리는 multi-turn 대화 데이터 $(X_q^1, X_a^1, … , X_q^T, X_a^T)$를 생성함</p>
<ul>
<li><p>T는 전체 대화(turn)의 수</p>
</li>
<li><p>$X_q^t$ : t번째 질문</p>
</li>
<li><p>$X_a^t$ : t번째 답변</p>
</li>
<li><p>이게 무슨 말이냐하면, 하나의 강아지 사진이 있을 때,</p>
<ul>
<li><p>Q1: 어떤 동물? - A1: 강아지</p>
</li>
<li><p>Q2: 뭐하고 있음? - A2: 공보고 있음</p>
</li>
<li><p>Q3: 공은 무슨 색? - A3: 노란색!</p>
<p>과 같이 여러번 이어지는 대화(Multi-turn 대화)를 하나의 학습 데이터로 활용함</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>이때, 모든 답변을 assistant의 응답으로 간주해서 <strong>하나의 시퀀스</strong>로 구성</p>
<p>→ 질문과 답을 모두 이어 붙여서 하나의 긴 문장으로 만든다는 의미</p>
<p>: LLM은 원래 토큰들의 긴 문장을 입력으로 받기 때문에 위와 같은 작업 수행</p>
</li>
<li><p>t번째 instruction (t번째 턴에서 human이 입력한 질문, 지시문)</p>
<ul>
<li><p>다시 한 번, 개념을 짚자면,</p>
<p>Q1, Q2, Q3 = instruction</p>
<p>A1, A2, A3 = assistant response</p>
</li>
<li><p>$X_{instuct}^t$ $=$ $\begin{cases}
\text{Randomly choose } [X_q^1, X_v] \text{ or } [X_v, X_q^1], &amp; t=1 \
X_q^t, &amp; t&gt;1
\end{cases}$</p>
<p>→ 첫 번째 턴(t=1)에서는 $[X_q^1, X_v] \text{ or } [X_v, X_q^1]$ 중 하나를 무작위로 선택한다.</p>
<p>즉, <code>Question → image</code> 도 사용하고, <code>image → Question</code> 도 사용한다는 것(순서에 너무 민감하지 않도록 하기 위함)</p>
<p>→ 두번째 질문부터는 이미지는 이미 앞에서 입력했기 때문에, <code>Q - A</code> 구조만 넣음</p>
<p>⇒ 멀티모달 instruction-following 시퀀스 형식 완성!</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/0817503f-6e75-4f80-9d4f-d81f2e0d0253/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>LLM은 <strong>원래의 자기 회귀(Auto-regressive) 학습 목표</strong>를 사용해서 prediction token에 대해 instruction tuning을 사용함</p>
<blockquote>
<p><strong>✓ Auto-regressive</strong></p>
<p>이전에 생성한 단어(토큰)을 이용하여 다음 단어를 하나씩 순차적으로 생성하는 방식</p>
<ul>
<li>즉, 앞에서 생성한 결과를 다시 입력으로 사용하면서 문장을 이어가는 방식을 의미함</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ GPT vs BERT</strong></p>
<table>
<thead>
<tr>
<th>GPT (Auto-regressive)</th>
<th>BERT (Auto-encoding)</th>
</tr>
</thead>
<tbody><tr>
<td>다음 토큰 예측</td>
<td>가려진 토큰 예측</td>
</tr>
<tr>
<td>왼쪽 → 오른쪽 생성</td>
<td>문장 전체를 동시에 봄</td>
</tr>
<tr>
<td>텍스트 생성에 강함</td>
<td>이해(분류, 검색 등)에 강함</td>
</tr>
</tbody></table>
</blockquote>
<ul>
<li><p>길이가 L인 시퀀스에 대해 목표 답변 $X_a$가 생성될 확률은<br>이미지 $X_v$, instruction, 이전까지 생성된 답변 토큰들을 조건으로 각 토큰의 확률을 모두 곱한 값으로 정의</p>
<p>$p(X_a \mid X_v, X_{\mathrm{instruct}})  = \prod_{i=1}^{L}
p_\theta!\left(
x_i
\mid
X_v,
X_{\mathrm{instruct, &lt;i }},
X_{a,&lt;i}
\right)$</p>
<ul>
<li>$\theta$ : 학습 가능한 파라미터</li>
<li>$X_{\mathrm{instruct}, &lt;i}$ : 현재 예측 토큰 $x_i$ 이전까지의 instruction 토큰</li>
<li>$X_{a,&lt;i}$ : 현재 예측 토큰 $x_i$ 이전까지의 answer 토큰</li>
</ul>
<p>⇒ 보면 GPT의 Next Token Prediction과 유사한데,<br><code>Question</code> → <code>&lt;Image&gt;</code> → <code>The</code> → <code>dog</code> → <code>is</code> → <code>running</code>이면, LLM은 The를 맞추고 그 다음 dog, 다음에 is를 맞추는 형식.<br>: 답 전체를 한 번에 맞추는 것이 아니라 토큰 하나씩 예측</p>
</li>
<li><p>구현에 있어서,</p>
<ul>
<li><p>Vicuna-v0를 따라 system message를 설정하고 <code>&lt;STOP&gt;</code> 토큰을 ###으로 설정</p>
</li>
<li><p>모델은 assistant의 답변과 어디에서 멈출지(<STOP>)을 예측하도록 학습되고, 자기회귀 모델에서는 <strong>초록색 토큰(assistant의 답변 부분)만 Loss 계산에 사용</strong>됨</p>
<p>(질문은 이미 입력으로 주어지니까)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>LLaVA 모델 학습은 2단계의 instruction tuning 절차를 사용한다</p>
</li>
</ul>
<h4 id="stage1-pre-training-for-feature-alignment">Stage1: pre-training for feature Alignment</h4>
<p>→ 이미지 특징(CLIP 출력)과 LLM의 단어 임베딩 공간을 서로 맞춰주는 것(Aligment)</p>
<ul>
<li><p>개념의 다양성 + 학습의 효율성을 고려하여 CC3M 데이터 세트를 필터링하여 59만 5천개의 이미지-텍스트 쌍 사용 (필터링과정은 부록에)</p>
</li>
<li><p>이미지-텍스트 쌍은 3절에서 이야기한 것과 같이 <strong>단순 확장 방법</strong>을 이용하여 instruction-following 데이터로 변환</p>
<ul>
<li><p>image → caption 을<br>Human: <code>Image</code> + 이미지를 묘사해!(질문)<br>→ Assistant: Caption 형태</p>
<p>⇒ 이 하나의 쌍을 single turn 대화로 간주</p>
</li>
</ul>
</li>
<li><p>$X_{instuct}^t$ $=$ $\begin{cases}
\text{Randomly choose } [X_q^1, X_v] \text{ or } [X_v, X_q^1], &amp; t=1 \
X_q^t, &amp; t&gt;1
\end{cases}$</p>
<p>의 입력 $X_{instuct}^t$을 구성하기 위해, 이미지 $X_v$에 대해 간단히 설명하라는 질문 $X_q$를 무작위로 하나 선택</p>
<p>→ 정답 답변인 $X_a$는 원래 caption으로!</p>
<p>즉, 질문은 새로 만들지만 정답은 원래 데이터세트에 있던 caption을 그대로 활용</p>
</li>
<li><p>학습에 있어서 비전 인코더와 LLM의 가중치는 모두 고정(frozen)하고, projection matrix $W$만 학습 가능한 파라미터로 둬서</p>
<p>$p(X_a \mid X_v, X_{\mathrm{instruct}})  = \prod_{i=1}^{L}
p_\theta!\left(
x_i
\mid
X_v,
X_{\mathrm{instruct, &lt;i }},
X_{a,&lt;i}
\right)$ 의 우도를 최대화 시킴!</p>
<p>→ CLIP의 특징을 Vicuna가 이해할 수 있는 형태로 변환하는 것만 배우면 되니까, $W$만 학습시킴</p>
<p>⇒ 이렇게되면 이미지 특징 $H_v$가 사전학습된 LLM의 단어 임베딩과 정렬될 수 있음</p>
<p>⇒ 즉, 고정된 LLM이 읽을 수 있도록 Visual tokenizer를 학습하는 과정</p>
<p>(이미지를 LLM이 읽을 수 있는 시각 토큰으로 변환하는 방법을 배우는 것)</p>
</li>
</ul>
<h4 id="stage2-fine-tuning-end-to-end">Stage2: Fine-tuning end-to-end</h4>
<p>→ 본격적으로 LLaVA를 학습하는 단계</p>
<ul>
<li>비전 인코더(CLIP)의 가중치는 계속해서 고정해 놓고, projection layer와 LLM의 가중치를 함께 업데이트! (이제는 vicuna도 이미지를 잘 이해하도록 fine-tuning)<ul>
<li>학습가능한 파라미터 $\theta = {W, \phi}$</li>
</ul>
</li>
</ul>
<p><strong>[Multimodal Chatbot]</strong></p>
<ul>
<li>3절에서 생성한 15만 8천개의 언어-이미지 instruction 데이터로 fine-tuning을 진행하여 챗봇 개발<ul>
<li>Conversation → multi-turn</li>
<li>Detailed description → single turn</li>
<li>Complex reasoning → single turn</li>
</ul>
</li>
</ul>
<p><strong>[ScienceQA]</strong></p>
<ul>
<li>정답뿐아니라 자세한 강의와 설명이 포함된 최초의 대규모 멀티모달 과학 문제 데이터세트<ul>
<li>각 문항에는 자연어 또는 이미지 형태의 문맥이 함께 제공됨</li>
</ul>
</li>
<li>Assistant는 자연어로 추론 과정을 설명하고, 여러 선택지 중에서 하나를 정답으로 선택함</li>
<li>이 데이터세트의 경우에는 single turn으로 구성되고, 문제와 문맥을 $X_{instruct}$로, 추론과정과 정답을 $X_a$로 사용</li>
</ul>
<hr>
<h2 id="5-experiments">5. Experiments</h2>
<ul>
<li>평가<ul>
<li>LLaVA의 instruction-following 능력과 시각적 추론 능력을 multimodal chatbot 데이터세트와 scienceQA 데이터세트를 통해 확인<ul>
<li>Multimodal chatbot: 사람처럼 이미지에 대해 대화할 수 있는지</li>
<li>ScienceQA: 이미지를 보고 과학 문제를 추론할 수 있는지</li>
</ul>
</li>
</ul>
</li>
<li>학습환경<ul>
<li>Vicuna의 하이퍼파라미터를 따라서, 모든 모델을 A100 GPU 8개를 사용해서 학습함</li>
<li>Stage1: 사전학습<ul>
<li>필터링된 CC-595K 데이터세트에서 1epoch, learning rate = 2x10^{-3}, 배치사이즈 = 128</li>
</ul>
</li>
<li>Stage2<ul>
<li>LLaVA-instruct-158K 데이터세트에서는 3epoch, learning rate = 2x10^{-5}, 배치사이즈 = 32로 fine-tuning 진행</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="51-multimodal-chatbot">5.1 Multimodal Chatbot</h3>
<ul>
<li>LLaVA의 이미지 이해 능력과 대화 능력을 보여주기 위해 챗봇 데모를 개발함<ul>
<li>시각적 입력을 얼마나 잘 이해하는지</li>
<li>instruction-following 능력을 잘 보여주는지를 연구</li>
</ul>
</li>
<li>이때, GPT-4논문에 제시된 이미지 문제를 가져와서 비교 진행<ul>
<li>멀티모달 GPT-4의 질문(prompt)와 응답(response)을 그대로 인용</li>
<li>또한, BLIP-2와 OpenFlamingo 모델과도 같은 질문을 입력하여 응답 얻음</li>
</ul>
</li>
</ul>
<p>⇒ 즉, GPT-4 논문의 이미지와 질문을 활용하여, GPT-5, BLIP-2, OpenFlamingo, LLaVA의 응답을 비교함</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/53c4f8b1-49a6-4e15-84b9-7106b82d3352/image.png" alt=""></p>
<table>
<thead>
<tr>
<th>모델</th>
<th>질문 의도 이해</th>
<th>장면 설명</th>
<th>추론</th>
<th>정확성</th>
</tr>
</thead>
<tbody><tr>
<td><strong>LLaVA</strong></td>
<td>✓ 사용자의 질문 의도에 맞게 답변</td>
<td>✓</td>
<td>✓ 왜 이상한지까지 설명</td>
<td>높음</td>
</tr>
<tr>
<td><strong>GPT-4</strong></td>
<td>✓</td>
<td>✓</td>
<td>✓</td>
<td>높음</td>
</tr>
<tr>
<td><strong>BLIP-2</strong></td>
<td>❌ 질문 의도를 반영하지 못함</td>
<td>✓</td>
<td>❌</td>
<td>보통</td>
</tr>
<tr>
<td><strong>OpenFlamingo</strong></td>
<td>❌</td>
<td>△</td>
<td>❌ (다림질을 말리기로 오인)</td>
<td>낮음</td>
</tr>
</tbody></table>
<ul>
<li>LLaVA는 비교적 작은 멀티모달 instruction-following 데이터세트(약 8만장의 고유 이미지)로 학습되었음에도, 이러한 예시들에서 멀티모달 GPT-4와 상당히 유사한 추론 결과를 보여줌<ul>
<li>도메인 밖의 이미지였음에도 굿굿!</li>
</ul>
</li>
<li>반면, BLIP-2와 OpenFlamingo는 단순 이미지 설명에 불과했음</li>
</ul>
<h4 id="quantitative-evaluation">Quantitative Evaluation</h4>
<ul>
<li>LLaVA의 성능을 체계적으로 이해하기 위해서 멀티모달 데이터에서의 instruction-following 능력을 측정하는 정량적 평가 지표 제안<ul>
<li>이때, GPT-4는 생성된 응답의 품질을 평가하는 역할</li>
<li>평가 데이터: 이미지, 정답 텍스트 설명, 질문으로 구성</li>
</ul>
</li>
<li>이론적인 상한선을 근사하기 위해서 텍스트 전용 GPT-4가 질문과 정답 텍스트 설명을 이용해서 생성한 답변을 레퍼런스로 사용<ul>
<li>그니까 이미지를 텍스트로 잘 설명한 정보를 GPT-4가 받아서 답을 내놓기 때문에 이를 레퍼런스로 삼는다는 뜻</li>
</ul>
</li>
<li>두 모델의 응답을 얻은 후,<br>질문, 시각 정보, 두 assistant의 응답을 텍스트 전용 GPT-4(judge)에 입력함<ul>
<li><code>Question</code>, <code>Caption</code>, <code>LLaVA의 답변</code>, <code>GPT-4의 래퍼 답변</code> → 이렇게 받음</li>
<li>그래서 도움이 되는 정도, 관련성, 정확성, 상세함 등을 평가하여 1-10점까지의 점수 부여 및 왜 이렇게 평가했는지에 대해서도 설명</li>
</ul>
</li>
</ul>
<p><strong>[LLaVA-Bench(COCO)]</strong></p>
<p>→ COCO 데이터세트를 활용하여 연구진이 새롭게 만든 평가용 벤치마크</p>
<ul>
<li><p>COCO-Val-2014에서 30장의 이미지를 무작위로 선택</p>
<p>→ 3절에서 제안한 이미지 생성 파이프 라인을 통해 3가지 유형의 질문(conversation, detailed description, complex reasoning) 생성</p>
<p>⇒ 총 90개의 질문</p>
</li>
<li><p>해당 벤치마크를 통해서 동일한 시각 입력(이미지)에 대해 모델의 정렬 특성과 능력을 평가함</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/2c1c15cf-31a2-4aa9-9fb7-c0457fbb34ff/image.png" alt=""></p>
<ul>
<li>서로 다른 유형의 instruction-following 데이터 효과를 분석하기 위해서 학습 데이터세트를 변경하며 실험했음<ul>
<li>instruction tuning을 적용하면 사용자 지시를 따르는 능력이 50점 이상 크게 향상됨</li>
<li>소량의 detailed description과 complex reasoning 질문을 추가하는 것만으로도 모델의 전체 성능이 약 7점정도 향상됨</li>
<li>conversation 질문에 대한 성능도 향상 → 추론 능력 향상이 대화 능력을 보완함을 알 수 있음</li>
<li>3가지 유형을 모두 사용했을 때, 85.1%로 가장 성능이 좋았음</li>
</ul>
</li>
</ul>
<p><strong>[LLaVA-Bench(In-the-wild)]</strong></p>
<p>→ COCO같은 일반적인 사진이 아니라 더 어려운 실제 이미지 사용</p>
<ul>
<li>실내, 실외 장면, 밈, 그림, 스케치 등 다양한 종류의 24개의 이미지와 60개의 질문을 수집하여 각 이미지마다 사람이 작성한 매우 상세한 설명과 적절한 질문을 연결함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/39c51365-d5e4-4d9e-b703-274b05869137/image.png" alt=""></p>
<ul>
<li>visual instruction tuning 덕분에 LLaVA는 BLIP-2보다 29%, OpenFlamingo보다 48% 더 높은 성능을 달성</li>
<li>정답 레이블을 입력으로 사용하는 텍스트 전용 GPT-4와 비교했을 때, LLaVA는 복잡한 추론 문제에서 81.7%의 상대 성능을 달성했고, 전체 점수는 67.3%정도</li>
</ul>
<p><strong>[Limitations]</strong></p>
<ul>
<li>LLaVA-Bench(In-the-wild)는 의도적으로 어렵게 설계되어 있고, 모델의 약점을 드러내기 위한 목적</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/a881fd20-53f2-4a8d-8d64-4e6851d172a4/image.png" alt=""></p>
<ul>
<li><p>왼쪽 예시에서 식당 이름을 맞추기 위해서는</p>
<ul>
<li>광범위한 지식과 다국어 이해 능력이 있어야함</li>
<li>반찬이 뭔지 설명하려면 모델이 인터넷에서 관련 멀티모달 정보를 검색할 필요가 있을 수도</li>
</ul>
</li>
<li><p>오른쪽 예시에서 요거트 브랜드를 정확히 인식하기 위해서는</p>
<ul>
<li><p>모델은 고해상도 이미지를 처리할 수 있어야하고 폭넓은 지식을 가지고 있어야함</p>
</li>
<li><p>또한, 주목할만한 사례는 냉장고에 딸기, 요거트가 있는데 딸기맛 요거트가 있다고 판단함</p>
<p>⇒ LLaVA는 이미지를 <strong>패치들의 집합</strong>으로 인식해서 이미지 안의 복잡한 의미적 관계를 제대로 이해하지 못함</p>
</li>
</ul>
</li>
<li><p>본 연구의 LLaVA가 baseline이 되길 바라며, 본 연구가 LLM 개발에 도움이 되길 바람~!</p>
</li>
</ul>
<h3 id="52-scienceqa">5.2 ScienceQA</h3>
<ul>
<li>ScienceQA는 21,000개의 멀티모달 객관식 문제를 포함하고 있음<ul>
<li>3개의 과목, 26개의 주제, 127개의 카테고리, 379개의 기술에 걸쳐 다양한 도메인 포함</li>
</ul>
</li>
<li>데이터세트<ul>
<li>학습용: 12,726개</li>
<li>검증용: 4,241개</li>
<li>테스트용: 4,241개</li>
</ul>
</li>
<li>평가: 아래 모델들과 비교<ul>
<li>GPT-3.5(chain-of-thought 사용/미사용)</li>
<li>LLaMA-Adapter</li>
<li>MM-CoT(Multimodal Chain-of-Thought) → 당시 SOTA</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f9aaeb7d-905e-491f-8148-297985c04e65/image.png" alt=""></p>
<ul>
<li><p>LLaVA</p>
<ul>
<li>마지막 레이어 이전 시각 특징 사용</li>
<li>모델이 먼저 이유를 예측하고, 정답을 예측하도록</li>
<li>12 epoch동안 학습</li>
</ul>
<p>⇒ 결과적으로 90.92%의 정확도, 당시 SOTA 91.68%와 유사한 수치</p>
</li>
<li><p>LLM의 한계를 확인하기 위해</p>
<ul>
<li><p>GPT-4에도 2-shot in-context learning을 적용하여 82.69%의 정확도를 달성함</p>
<p>⇒ GPT-3.5의 75.17%보다 절댓값 기준 7.52% 향상</p>
</li>
</ul>
</li>
<li><p>상당수의 문제에서 GPT-4는 이미지나 그래프 등의 문맥이 부족하다고 판단하여 답변하지 못했었음</p>
<ul>
<li>즉 GPT-4의 성능이 낮은 이유는 추론 능력이 부족한게 아니라 이미지를 볼 수 없기 때문</li>
</ul>
<p>⇒ 그래서 LLaVA와 GPT-4의 결과를 결합하는 2가지 방법!</p>
</li>
</ul>
<p><strong>1. GPT-4 보완방식</strong></p>
<ul>
<li>GPT-4가 답변하지 못하는 경우에는 LLaVA의 예측 결과 사용</li>
<li>90.97%의 정확도를 달성했고, 이는 LLaVA만 사용하는 것과 거의 동일</li>
</ul>
<p>⇒ 그닥 효과x</p>
<p><strong>2. GPT-4를 judge로 활용하는 방법</strong></p>
<ul>
<li><p>GPT-4와 LLaVA의 답이 다른 경우, GPT-4에 질문과 두 모델의 답변을 보여주고 최종 답을 선택하도록</p>
<p>→ chain-of-thought와 유사하지만 다른 모델의 외부 지식을 활용한다는 점에서 다름</p>
</li>
<li><p>해당 방법은 92.53%의 SOTA 달성!</p>
<p>⇒ 어떻게 텍스트 전용 GPT-4가 이미지를 포함한 문제에서 전체 성능을 올릴 수 있었을까?</p>
<ul>
<li><p>ex. 태양은 어느 방향에서 뜨는지와 같은 이미지없이 풀 수 있는 문제들도 있어서, GPT-4 judge가 이러한 경우를 식별해서 LLaVA의 일부 오류를 수정함</p>
<p>⇒ GPT-4를 앙상블에 활용한 최초의 사례</p>
</li>
</ul>
</li>
</ul>
<p><strong>[Ablations]</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ca8c9ee7-479c-493b-8479-a73ba77a7fc3/image.png" alt=""></p>
<ul>
<li><p>Visual features</p>
<ul>
<li><p>CLIP 비전 인코더의 마지막 레이어 특징을 사용하여 89.96%의 정확도를 얻었음</p>
</li>
<li><p>즉, 마지막 이전 레이어의 특징을 사용했을 때보다 0.96% 낮음</p>
<p>⇒ CLIP의 마지막 레이어는 전역적이고 추상적인 이미지 특성에 더 집중하지만, 그 이전 레이어는 구체적인 이미지 세부 정보를 이해하는데 유용한 지역적 특징에 집중하기 때문!</p>
</li>
</ul>
</li>
<li><p>Chain-of-thought</p>
<ul>
<li><p>모델이 정답을 먼저 생성할지 또는 추론과정을 먼저 생성할지를 결정하기 위한 실험</p>
<ul>
<li>정답먼저: 12epoch에서 89.77% 최고 정확도</li>
<li>추론먼저: 6epoch에서 89.77%도달, 이후 더 오래 학습해도 추가적인 향상은 x</li>
</ul>
<p>⇒ 수렴속도는 향상시키지만, 최종 성능 향상에는 크게 기여하진 않음</p>
</li>
</ul>
</li>
<li><p>pre-training</p>
<ul>
<li>pre-training을 제외하고 scienceQA에서 처음부터 학습시켜봤을때 정확도가 85.81%로 감소</li>
</ul>
</li>
<li><p>model-size</p>
<ul>
<li>13B와 7B 비교</li>
<li>89.84%로, 90.92%보다 1.08% 낮은 성능</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li>Visual instruction tuning 효과 입증</li>
<li>언어-이미지 기반의 instruction-following 데이터를 자동으로 생성하는 파이프라인 제안<ul>
<li>이를 바탕으로 사람 의도를 이해하고 시각적 작업을 수행하는 멀티모달 모델 LLaVA를 학습시킴</li>
</ul>
</li>
<li>LLaVA는<ul>
<li>ScienceQA에서 fine-tuning했을 때, SOTA 달성</li>
<li>multimodal chatbot로 fine-tuning 했을 땐 뛰어난 visual chat 능력을 보여줌</li>
</ul>
</li>
<li>또한, 멀티모달 instruction-following 능력을 평가하기 위한 최초의 벤치마크 제시</li>
<li>우리 연구가 visual instruction tuning의 첫 번째 단계이고, 앞으로 추가적인 연구하시길~</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] FinBERT: Financial Sentiment Analysis with Pre-trained
Language Models]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-FinBERT-Financial-Sentiment-Analysis-with-Pre-trainedLanguage-Models</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-FinBERT-Financial-Sentiment-Analysis-with-Pre-trainedLanguage-Models</guid>
            <pubDate>Wed, 22 Jul 2026 13:10:54 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: FinBERT: Financial Sentiment Analysis with Pre-trained Language Models
<strong>학회(출판연도)</strong>: arXiv (2020)
<strong>연구분야</strong>: 딥러닝 기반 금융 자연어 처리 및 도메인 특화 언어모델</p>
</blockquote>
<hr>
<h2 id="background-concepts">Background Concepts</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5933bc59-6239-488b-ac33-8bd0ae3a4944/image.png" alt=""></p>
<ul>
<li>기존의 NLP모델은 뉴스, 위키 등 일반 텍스트를 학습하는데 금융 텍스트는 완전히 다른 언어이며 전문 용어, 미묘한 표현 등으로 인해서 일반적인 BERT는 금융 sentiment 성능이 낮았음 ⇒ Domain Shift(도메인 불일치)</li>
</ul>
<h4 id="①-bertbidirectional-encoder-representations-from-transformers">① BERT(Bidirectional Encoder Representations from Transformers)</h4>
<ul>
<li>정의: 양방향 문맥을 이해하는 <strong>Transformer기반 언어 모델</strong></li>
<li>중요성: 거의 모든 NLP task의 baseline</li>
<li>비유: 문장을 왼쪽 → 오른쪽이 아니라 “전체 문맥을 동시에 읽는 독자”</li>
</ul>
<h4 id="②-domain-adaptation">② Domain Adaptation</h4>
<ul>
<li>정의: 특정 분야 데이터로 모델 다시 학습</li>
<li>bullish, liability 같은 단어는 금융에서 의미가 다르기 때문</li>
</ul>
<hr>
<h2 id="abstract">Abstract</h2>
<p><strong>[문제]</strong></p>
<ul>
<li>금융 텍스트 감정 분석 어려움<ul>
<li>금융 분야는 전문 용어가 많고 라벨된 데이터도 부족하기 때문</li>
</ul>
</li>
<li>일반적인 NLP는 금융분야에서 성능이 그다지 좋지 못함<ul>
<li>도메인 차이</li>
</ul>
</li>
</ul>
<p><strong>[해결]</strong></p>
<ul>
<li>pre-trained language model<ul>
<li>적은 데이터로도 학습이 가능하며</li>
<li>금융 데이터로 추가적으로 학습도 가능하기 때문</li>
</ul>
</li>
</ul>
<p>⇒ FinBERT</p>
<ul>
<li>SOTA 달성</li>
<li>적은 데이터 및 일부만 fine-tuning해도 기존 모델보다 좋음</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li>공개시장에 대한 가정: 가격은 모든 정보를 반영함<ul>
<li>새로운 정보가 나오면 바로바로 반응하면서 가격이 변동됨</li>
</ul>
</li>
<li>이때 “새로운 정보”는 기술의 발전에 따라 의미가 달라질 수 있고 이걸 빨리 쓰는 사람은 이득을 볼 수 있을 것</li>
</ul>
<hr>
<ul>
<li>뉴스, 리포트 같은 금융 텍스트 분석은 새로운 정보의 원천<ul>
<li>텍스트가 너무 많아서 사람이 직접 분석하는 것은 불가능</li>
<li>때문에 NLP 기반의 감정 분석이 많이 연구되고 있음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-related-literature">2. Related Literature</h2>
<h3 id="21-sentiment-analysis-in-finance">2.1 Sentiment analysis in finance</h3>
<ul>
<li><p>감정 분석: 글에서 사람의 감정이나 의견을 뽑아내는 작업</p>
</li>
<li><p>기존의 연구: ① 단어 개수 기반 머신러닝(bag of words) ② 임베딩 기반 딥러닝(embedding)</p>
<p>⇒ [한계]</p>
<ul>
<li>word counting: 의미를 잘 못 잡음</li>
<li>deep learning: 데이터가 너무 많이 필요함</li>
</ul>
</li>
<li><p>금융 감정 분석의 경우 도메인뿐만 아니라 목적도 일반적인 감정분석과 다름</p>
<ul>
<li>목적: 시장이 어떻게 반응할 지 예측하는 것</li>
</ul>
</li>
</ul>
<p><strong>[기존 - ① ML]</strong></p>
<ul>
<li><p>bag of words 나 사전 기반 방법(lexicon-based) 많이 활용</p>
<p>→ 금융 단어 사전을 만들어서 단어 개수로 감정 판단</p>
</li>
<li><p>N-gram 뽑아서 ML모델로 감정 분류</p>
</li>
</ul>
<blockquote>
<p><strong>✓ N-gram: 연속된 단어 묶음</strong></p>
<table>
<thead>
<tr>
<th>n</th>
<th>이름</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>unigram</td>
<td>I / love / financial / markets</td>
</tr>
<tr>
<td>2</td>
<td>bigram</td>
<td>I love / love financial / financial markets</td>
</tr>
<tr>
<td>3</td>
<td>trigram</td>
<td>I love financial / love financial markets</td>
</tr>
</tbody></table>
<p>→ 문맥을 일부 반영하기 위함</p>
</blockquote>
<p><strong>[기존 ② - DL]</strong></p>
<p><strong>[딥러닝 기반]</strong></p>
<ul>
<li><p>LSTM</p>
<ul>
<li><p>기업 공시 분석해서 주가 예측</p>
</li>
<li><p>여기서도 pre-training을 하긴 했지만 label 데이터로 했어서 한계 존재</p>
<p>↔ [Fin-BERT] unlabeled data로 진행</p>
</li>
</ul>
</li>
<li><p>다양한 딥러닝 모델 관련 연구</p>
<ul>
<li>다른 NN 모델들 중에서 <strong>CNN</strong>이 가장 성능 굿</li>
<li>StockTwits(금융 SNS 데이터) 이용</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ CNN?</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/83c56cf8-c625-4f33-beee-d05dc79553e8/image.png" alt=""></p>
<ul>
<li>문장 → embedding → Convolution → max pooling → classification</li>
<li>텍스트 CNN의 경우에는 단어 패턴 n-gram을 찾음</li>
<li>금융 SNS의 특징이 짧은 문장, slang, 강한 표현이 많음<br>→ CNN은 짧은 문맥에 최적화되어 있으며 핵심 키워드 중심, 노이즈에 강하기 때문에 굿굿이었음</li>
</ul>
</blockquote>
<p><strong>[임베딩 기반]</strong></p>
<ul>
<li>Doc2Vec<ul>
<li>문장 벡터 만들고 주가 예측</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ multi-instance learning - representation learning 중요</strong></p>
<ul>
<li>Doc2Vec은 문서 전체를 하나의 벡터로 표현하는 방법임</li>
<li>즉, 여러 개의 데이터가 모여 하나의 라벨을 가지게 되는 것임</li>
<li>문장이 여러개라서 단순히 평균내는 것이 아닌 중요한 문장을 더 많이 반영하도록 해야함 ⇒ 그래서 좋은 representation(벡터표현)이 필요한 것</li>
</ul>
</blockquote>
<ul>
<li>텍스트 단순화 + LSTM으로 좋은 성능을 내기도 함</li>
</ul>
<p>But, 금융 데이터는 라벨이 부족해서 딥러닝을 제대로 쓰기 어려움</p>
<blockquote>
<p><strong>✓ 왜 라벨이 부족?</strong></p>
<ul>
<li>라벨을 만들기에 전문가가 필요하기 때문에 비용이 큼</li>
<li>정답이 애매함<ul>
<li>sentiment는 주가에 영향을 주기 때문에 같은 문장이라도 실제로 annotator agreement도 낮음</li>
<li>금융 특성상 같은 뉴스라도 시장 상황에 따라 의미가 달라진다. - 금리 인상만하더라도 어떤 시기에는 긍정, 어떤 시기에는 부정을 의미하기 때문</li>
</ul>
</li>
</ul>
</blockquote>
<p>→ 첫번째 레이어(word embedding)를  pretrain을 하더라도 나머지 모델은 여전히 데이터 부족 문제</p>
<p>⇒ 때문에 모델 대부분을 pretrain을 하고 fine-tuning하는 것이 더 좋음</p>
<h3 id="22-text-classification-using-pre-trained">2.2 Text classification using pre-trained</h3>
<ul>
<li><p>언어 모델링은 “다음 단어 맞추기” 문제</p>
</li>
<li><p>최근 NLP에서의 중요한 발견은 <strong>언어 모델을 조금만 수정하면 다른 task에도 잘 쓸 수 있다는 것</strong></p>
<ul>
<li>downstream tasks: 감정분석, QA 등</li>
<li>큰 데이터(위키피디아, books)로 먼저 학습하고 작은 데이터로 task-specific하게 조정 → <del>데이터 부족 문제 해결 가능</del></li>
</ul>
</li>
<li><p>ELMo</p>
<ul>
<li><p>양방향 언어 모델을 큰 데이터로 학습 (BERT 이전 모델)</p>
</li>
<li><p>각 단어는 문맥을 반영한 벡터로 표현</p>
</li>
<li><p>문맥 기반 임베딩을 만들 수 있고 word2vec보다 성능 굿</p>
</li>
<li><p>But, partial transfer는 부족(모델 전체에 정보가 퍼지지X)</p>
<p>→ ULMFiT 등장</p>
</li>
</ul>
</li>
<li><p>ULMFiT: Transfer learning 처음으로 성공</p>
<ul>
<li><p>discriminative fine-tuning: layer마다 다른 LR</p>
</li>
<li><p>gradual unfreezing: layer마다 점진적으로 학습</p>
</li>
<li><p><strong>모델 전체를 fine-tuning, 도메인 데이터로 추가적으로 pretraining 진행</strong></p>
<p>⇒ General BERT + Financial data로 추가학습 (FinBERT의 핵심 아이디어)</p>
</li>
</ul>
</li>
<li><p>BERT</p>
<ul>
<li><p>다음 단어가 아니라 가려진 단어를 맞추고 문장 관계 학습(<strong>MLM</strong>)</p>
</li>
<li><p><strong>매우 큰 모델이고 매우 큰 데이터</strong></p>
<p>⇒ 때문에 NLP task에서 SOTA 달성</p>
</li>
</ul>
</li>
<li><p>하지만 BERT를 텍스트 분류에 어떻게 fine-tune할지는 아직 연구 부족한 상황</p>
</li>
</ul>
<hr>
<h2 id="3-method">3. Method</h2>
<h3 id="31-preliminaries">3.1 Preliminaries</h3>
<h4 id="311-lstm">3.1.1 LSTM</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/15aafa3e-0b66-4f2f-b969-c60e9999a69c/image.png" alt=""></p>
<ul>
<li><p>정의: 과거 정보를 오래 기억할 수 있도록 하는 RNN</p>
</li>
<li><p>활용 범위: 주가, 텍스트 같은 <strong>순차 데이터</strong>에 많이 사용</p>
</li>
<li><p>텍스트는 단어들의 <strong>순서</strong>이므로 어떻게 표현할 지가 중요함</p>
<p>→ <del>임베딩 문제로 자연스레 연결</del></p>
<ul>
<li>보통 단어 표현은 미리 학습된 것을 사용함</li>
</ul>
</li>
<li><p>GLoVe</p>
<ul>
<li>대표적인 단어 임베딩</li>
<li>단어들이 같이 등장하는 빈도를 이용해서 벡터 만듦</li>
<li>벗, 문맥 반영X</li>
</ul>
<p>⇒ GLoVe의 한계때문에 LSTM 성능 제한</p>
</li>
</ul>
<h4 id="312-elmo">3.1.2 ELMo</h4>
<p>(LSTM + contextual embedding)</p>
<ul>
<li><p>주변 단어를 고려하여 단어 의미 만듦 → 양방향 LSTM</p>
<ul>
<li><p>단어 시퀀스의 확률 학습</p>
</li>
<li><p>앞단어 + 뒤 단어를 이용해서 현재 단어 이해함</p>
</li>
<li><p>여러 layer 정보를 합쳐서 하나의 임베딩을 만듦</p>
<p>→ 이 임베딩을 다른 task에 사용 가능</p>
</li>
</ul>
</li>
</ul>
<h4 id="313-ulmfit">3.1.3 ULMFiT</h4>
<ul>
<li><p>pretraining 기반 NLP 모델</p>
<p>↔ ELMo와 달리 전체 모델을 fine-tuning 하는 방식</p>
</li>
<li><p>AWD-LSTM 사용 (기존의 LSTM보다 개선되어 있음) + 분류 목적으로 마지막에 layer 추가함</p>
</li>
<li><p>특별한 전략을 사용 → FinBERT에서도 이를 사용함</p>
<ul>
<li><p><strong>Discriminative Fine-tuning</strong></p>
<ul>
<li><p>레이어마다 다른 learning rate 사용</p>
<ul>
<li><p>아래 레이어 → 일반 언어 지식</p>
</li>
<li><p>위 레이어 → task - specific 정보</p>
<p>⇒ 똑같이 학습하게 되면 중요한 정보가 망가지기 때문에, low-level일 때는 작은 LR, high-level의 경우 큰 LR을 사용</p>
</li>
</ul>
</li>
<li><p>안정적인 학습, catastrophic forgetting 방지</p>
</li>
</ul>
</li>
<li><p><strong>Slanted Triangular Learning Rates</strong></p>
<ul>
<li><p>learning rate를 빠르게 올리고 천천히 줄임</p>
<p>!image.png</p>
<ul>
<li>초반에 빠르게 방향을 잡고 후반에 미세조정</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Gradual Unfreezing</strong></p>
<ul>
<li>레이어를 한 번에 다 학습하지 않음<ul>
<li>step1: 마지막 레이어만 학습<br>step2: 마지막 2개 레이어<br>step3: 전체 레이어 …</li>
<li>한 번에 다 학습하면 기존의 knowledge가 붕괴될 수 있고 점진적으로 하게 되면 안정적으로 적응할 수 있기 때문</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="314-transformer">3.1.4 Transformer</h4>
<ul>
<li><p>인코더-디코더 구조로 만들어짐</p>
</li>
<li><p>attention 기반의 모델</p>
<ul>
<li><p>각 layer는 어텐션 + feedforward 기반</p>
</li>
<li><p>✓ 단어들끼리 서로 얼마나 관련있는지 계산</p>
<p>→ 이 단어가 다른 단어를 얼마나 참고해야 할까? 를 고려함</p>
</li>
<li><p>여러 관점을 동시에 보는 모델</p>
</li>
</ul>
</li>
<li><p>RNN은 느리고 long-distance 관계를 잡기 어렵기 때문에 Transformer기반이 성능 굿</p>
</li>
</ul>
<h4 id="315-bert">3.1.5 BERT</h4>
<ul>
<li><p>BERT는 Transformer의 encoder을 여러 개 쌓은 모델</p>
<ul>
<li><p>mask로 15%의 토큰을 가리며 맞추는 방법을 사용</p>
</li>
<li><p>문장 연결 여부도 학습</p>
<p>→ 단어 + 위치 정보를 같이 사용함</p>
</li>
<li><p><code>CLS</code>, <code>SEP</code> 토큰 사용</p>
<ul>
<li><code>CLS</code> : 전체 문장의 대표 벡터</li>
</ul>
</li>
</ul>
</li>
<li><p>2가지 버전 - BERT-base, BERT-large</p>
</li>
<li><p>약 3.3 billion words로 학습(BookCorpus(800M words), Wikipedia(2500M words))</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/17224aad-3bbb-41a9-91e5-905cb2e14bd3/image.png" alt=""></p>
<ul>
<li><p>추가 부연설명</p>
<p><strong>① General Pretraining(BERT)</strong></p>
<ul>
<li>언어 자체를 이해하게 만들기<ul>
<li>MLM: 특정 단어 가리고 맞추기</li>
<li>NSP: 문장 A가 문장 B와 이어지는가?</li>
</ul>
</li>
<li>Input→Transformer layers→Dense →prediction</li>
</ul>
<blockquote>
<p><strong>✓ Dense는 어디에 붙는가?</strong></p>
<ul>
<li>Dense layer는 “예측이 필요한 위치에만” 붙는다.</li>
<li>때문에 MLM의 경우 mask된 위치마다 붙음<ul>
<li>[MASK] → Dense → softmax → 단어 예측</li>
</ul>
</li>
<li>CLS 토큰<ul>
<li>[CLS] → Dense → binary classification</li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>② Domain Pretraining(FinBERT)</strong></p>
<ul>
<li>금융 언어 이해하기</li>
<li>언어 → 금융언어로 specialization</li>
</ul>
<p><strong>③ Fine-tuning(Sentiment)</strong></p>
<ul>
<li>실제 task 수행 목적</li>
<li>[CLS] → Dense → 3-class classification</li>
</ul>
</li>
</ul>
<h3 id="32-bert-for-financial-domain-finbert">3.2 BERT for financial domain: FinBERT</h3>
<p><strong>[KEY]</strong></p>
<p>① further pre-training, ② classification, ③ regression, ④ catastrophic forgetting</p>
<h4 id="321-further-pre-training">3.2.1 Further pre-training</h4>
<ul>
<li><p>특정 도메인 데이터로 추가 학습하면 성능이 좋아지긴 하지만, BERT에서 이게 확실히 검증된 건 아님<br>→ 본 논문에서 2가지 방법으로 실험해보겠슨</p>
<ul>
<li><p>큰 금융 텍스트 데이터로 BERT 추가 학습</p>
</li>
<li><p>학습 데이터 자체로만 pretraining</p>
<p>→ 데이터는 적지만 task에 더 직접적이라 효과가 있을 수 있지 않을까?</p>
</li>
</ul>
</li>
</ul>
<h4 id="322-finbert-for-text-classification">3.2.2 FinBERT for text classification</h4>
<ul>
<li><code>CLS</code> 벡터 뒤에 FC layer 붙여서 분류 (BERT의 표준 방식)<ul>
<li>입력 → BERT → <code>CLS</code> →Dense → Softmax</li>
</ul>
</li>
<li>이후, 라벨 데이터로 학습</li>
</ul>
<h4 id="323-finbert-for-regression">3.2.3 FinBERT for regression</h4>
<ul>
<li>회귀 - 분류와의 차이는 loss함수 뿐</li>
</ul>
<h4 id="324-catastrophic-forgetting">3.2.4 Catastrophic Forgetting</h4>
<p><strong>[문제]</strong></p>
<ul>
<li>fine-tuning을 하게 되면 모델이 기존 지식을 잊어버릴 수 있음<ul>
<li>새로운 task에 맞추다 보니 기존의 언어 이해를 잊을 수 있음</li>
</ul>
</li>
</ul>
<p><strong>[해결]</strong></p>
<ul>
<li><p><strong>Slanted Triangular LR</strong></p>
<ul>
<li>LR을 올렸다가 내리는 방식으로 안정적인 학습 가능</li>
</ul>
</li>
<li><p><strong>Discriminative Fine-tuning</strong></p>
<ul>
<li><p>아래 layer는 조금만 바꾸고 위 layer는 많이 바꿈</p>
<p>(하위 layer는 언어 이해 부분이므로 건드리지 않고, 상위 layer의 경우에는 task이므로 많이 학습하자)</p>
</li>
<li><p>아래는 언어, 위는 task 정보 담당</p>
</li>
</ul>
</li>
<li><p><strong>Gradual Unfreezing</strong></p>
<ul>
<li><p>처음에는 classifier만 학습</p>
</li>
<li><p>위에서부터 조금씩 layer을 학습(freeze를 풀어줌)</p>
<p>⇒ 기존의 언어 지식을 유지할 수 있음</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-experimental-setup">4. Experimental Setup</h2>
<h3 id="41-research-questions">4.1 Research Questions</h3>
<p><strong>[RQ1]</strong> FinBERT는 ELMo와 ULMFiT보다 성능이 좋은가?</p>
<p><strong>[RQ2]</strong> FinBERT는 기존 최고 성능 모델보다 좋은가?</p>
<p><strong>[RQ3]</strong> 금융 데이터로 추가 학습하면 성능이 좋아질까?</p>
<p><strong>[RQ4]</strong> 학습 전략 성능과 forgetting에 어떤 영향을 줄까? (forgetting 방지 전략 효과)</p>
<p><strong>[RQ5]</strong> 어떤 layer가 가장 중요할까?</p>
<p><strong>[RQ6]</strong> 몇 개 layer만 fine-tuning해도 충분할까? (얼마나 파인튜닝해야할까?)</p>
<h3 id="42-datasets">4.2 Datasets</h3>
<h4 id="421-trc2-financial">4.2.1 TRC2-financial</h4>
<ul>
<li>BERT 추가 학습용 금융 데이터 사용</li>
<li>Reuters 뉴스 데이터 일부 사용<ul>
<li>약 180만개의 기사 중 금융 키워드를 필터링하여 금융 관련 기사만 추출</li>
</ul>
</li>
<li>최종적으론 46,143 documents와 29M+ words 사용</li>
</ul>
<h4 id="422-financial-phrasebank">4.2.2 Financial PhraseBank</h4>
<ul>
<li><p>4,845개의 문장, 16명의 annotator가 라벨링함</p>
<ul>
<li>documents가 아니라 문장 단위이며 금융 뉴스에서 추출</li>
</ul>
</li>
<li><p>일반 sentiment의 경우에는 happy, bad이지만, FinBERT에서의 sentiment는 up/down/neutral 이렇게 3가지로 나뉨</p>
<ul>
<li>예를 들면 Company profit fell less than expected 라고 하면<br>일반적으로는 negative(profit fell) 이지만, 금융감정에서는 positive(예상보다 덜 떨어짐→ 주가 상승 가능) 으로 해석</li>
</ul>
<p>⇒ 감정분석이라기보단 <strong>시장 반응 예측</strong>에 가까움</p>
</li>
<li><p>데이터는 60% train, 20% validation, 20% test에 사용</p>
<ul>
<li>때문에 실제 데이터는 약 3100개 뿐 → pretraining 필요!!</li>
</ul>
</li>
</ul>
<h4 id="423-fiqa-sentiment">4.2.3 FiQA Sentiment</h4>
<ul>
<li><p>단순 데이터가 아닌 금융 QA + sentiment 분석 대회에서 나온 데이터</p>
</li>
<li><p>✓ sentiment를 연속값으로!</p>
<ul>
<li>일반 sentiment는 positive/neutral/negative (classification)으로 하지만</li>
<li>FiQA의 경우 -1~1 사이의 regression으로</li>
</ul>
<p>⇒ 현실에서는 단순 positive와 negative가 중요한게 아니라 강도(strength)가 중요함</p>
</li>
<li><p>1,174 samples: 뉴스와 트윗 사용</p>
</li>
</ul>
<h3 id="43-baseline-methods">4.3 Baseline Methods</h3>
<ul>
<li>LSTM + GloVe, ELMo, ULMFit 3가지 baseline 사용</li>
<li>이 baseline은 BERT만큼 충분히 튜닝하지 않았기 때문에 결과를 절대적인 성능 비교로 해석하기엔 어려움</li>
</ul>
<h4 id="lstm-classifier">LSTM classifier</h4>
<ul>
<li><p>Embedding → BiLSTM → FC layer → 3-class output</p>
</li>
<li><p>양방향 LSTM을 사용하여 2개의 분류기로 구현</p>
<ul>
<li><p>hidden size = 128</p>
</li>
<li><p>양방향구조이므로 마지막 hidden state 크기는 256</p>
<p>(Forward LSTM + Backward LSTM의 두 결과를 합치니까 128 x 2 = 256)</p>
</li>
<li><p>완전 연결된 feed-forward layer는 마지막 hidden state를 3차원 벡터로 변환하며 3개의 라벨에 대한 확률(가능성)을 나타냄</p>
</li>
<li><p>GloVe 임베딩과 ELMo 임베딩에서만 차이</p>
</li>
<li><p>2개 모델 모두 dropout=0.3, LR = 3e-5 사용</p>
</li>
</ul>
<p>⇒ 즉, embedding만 바꿔서 성능 차이 확인</p>
</li>
</ul>
<h4 id="ulmfit">ULMFiT</h4>
<ul>
<li><p>Text → AWD-LSTM → hidden → FC → output</p>
</li>
<li><p>3단계로 구성</p>
</li>
<li><p>첫 번째 단계인 언어 모델의 사전 학습은 이미 완료</p>
<p>(학습 가중치는 Howard와 Ruder(2018)에 의해 공개)</p>
</li>
<li><p>AWD-LSTM 언어모델을 TRC2 금융 코퍼스에서 3 epoch동안 <em>추가로 학습</em></p>
</li>
<li><p>그 다음 Financial PhraseBank 데이터셋에서 분류 작업을 위해 <em>모델 fine-tuning</em></p>
</li>
<li><p>이때 사전 학습된 언어 모델 출력에 <em>FC layer 추가</em></p>
</li>
</ul>
<h3 id="45-implementation-details">4.5 Implementation Details</h3>
<ul>
<li>구현<ul>
<li>dropout = 0.1</li>
<li>warm-up = 0.2</li>
<li>최대 시퀀스 길이 64 토큰</li>
<li>LR = 2e-5</li>
<li>미니배치 = 64</li>
</ul>
</li>
<li>6개의 에포크동안 학습하고 validation set에서 가장 성능 좋은 모델 선택</li>
<li>처음 classification layer만 unfrozen 상태로 두고 학습을 시작하고 각 epoch 1/3 지날때마다 다음 레이어를 순차적으로 unfreeze 진행</li>
<li>NVIDIA K8 GPU 1개, 4 vCPU, 64GB 메모리를 가진 아마존 p2.xlarge EC2 인스턴스 사용</li>
</ul>
<hr>
<h2 id="5-experimental-results-rq1rq2">5. Experimental results (RQ1&amp;RQ2)</h2>
<ul>
<li>전체 데이터&amp;100% annotator 데이터 둘 다 평가 진행</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/0976da2d-176c-4b53-a3f6-813084e7ef31/image.png" alt=""></p>
<ul>
<li><p>LSTM</p>
<ul>
<li><p>pretraining을 하지 않은 LSTM은 최악,,</p>
</li>
<li><p>accuracy는 나쁘지 않은데, F1-score가 낮음</p>
<p>→ neutral class(60%)가 많아서(찍기를 잘하는 모델)</p>
</li>
</ul>
</li>
<li><p>ELMo</p>
<ul>
<li>성능이 좋아지기진 했는데 여전히 F1 낮음</li>
</ul>
</li>
<li><p>ULMFiT</p>
<ul>
<li><p>성능이 크게 향상되었고 특정 class에 치우치지 않음</p>
</li>
<li><p>기존 ML보다 훨씬 좋음 → pretraining이 효과적이다</p>
</li>
<li><p>모델이 커서 overfitting 위험이 존재함</p>
<p>벗뜨, pretraining 덕분에 적은 데이터셋에서도 잘 작동하는 편</p>
</li>
</ul>
</li>
<li><p>FinBERT</p>
<ul>
<li>데이터 크기별 실험을 진행했는데 250개부터 성능이 급 상승 (80%)</li>
</ul>
<p><strong>⇒ pretraining 매우 중요하다~</strong></p>
</li>
<li><p>FiQA(회귀결과)</p>
<ul>
<li>회귀에서도 SOTA</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/4da3c5ad-ece2-44ac-b48c-da88d25c0a87/image.png" alt=""></p>
</li>
</ul>
<hr>
<h2 id="6-experimental-analysis">6. Experimental analysis</h2>
<h3 id="61-effects-of-futher-pre-trainingrq3">6.1 Effects of futher pre-training(RQ3)</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/de47b21d-5204-4138-99a1-3935135c4d28/image.png" alt=""></p>
<ul>
<li><p>추가 domain pretraining이 성능에 어떤 영향을 주는지 보여주는 섹션</p>
</li>
<li><p>일반 BERT, task데이터로 pretrain, 금융데이터로 pretrain 3가지 모델로 진행</p>
</li>
<li><p>이때 금융 데이터로 pretrain한 것이 가장 좋더라~</p>
<ul>
<li>하지만 차이가 크진 않았음</li>
</ul>
<p>⇒  
① <strong>도메인 분포가 다를 수 있음</strong></p>
<p>→ 금융 데이터와 실제 task 데이터는 다를 수 있기 때문<br>(pretrain: 뉴스 task: PhraseBank(짧은 문장) - mismatch)</p>
<p>② <strong>BERT는 이미 충분히 강력함</strong></p>
<p>③ <strong>짧은 문장은 pretraining 효과가 적음</strong></p>
<p>→ 복잡한 language modeling이 필요없음, domain pretraining 효과 제한됨</p>
<p>④ <strong>이미 성능이 너무 높음</strong></p>
<p>→ 이미 97%정확도를 가지고 있기 때문에 +1% 올리기 어려움</p>
<p>⇒ 즉, 작은 데이터, 쉬운 task에는 효과가 작다.</p>
</li>
</ul>
<h3 id="62-catastrophic-forgettingrq4">6.2 Catastrophic Forgetting(RQ4)</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/afc52e27-31c1-46a4-824d-7998fabd17bf/image.png" alt=""></p>
<ul>
<li><p>NA, STL, STL + GU, STL+GU+DF 이렇게 4가지 방법으로 진행</p>
<p>⇒ 3개를 다 쓰는 게 좋더라</p>
<ul>
<li>STL, GU, DF는 위에서 설명했던 3가지 방법<ul>
<li>STL = Slanted Triangular Learning Rate</li>
<li>GU = Gradual Unfreezing</li>
<li>DF = Discriminative Fine-tuning</li>
</ul>
</li>
</ul>
</li>
<li><p>DF만 쓰면 오히려 안 좋고, 가장 중요한 건 GU</p>
</li>
<li><p>forgetting은 validation loss 증가로 나타남</p>
</li>
</ul>
<h3 id="63-choosing-the-best-layerrq5">6.3 Choosing the best layer(RQ5)</h3>
<ul>
<li><p>BERT는 12layer로 되어 있고 마지막 layer가 항상 최고 성능을 낸다고 단정지을 수 없음</p>
<ul>
<li>각 layer의 <code>CLS</code> 토큰 뒤에 classification layer을 붙여서 분류</li>
<li>모든 레이어 layer의 출력값을 평균 내는 방법</li>
</ul>
<p>⇒ 그 결과 마지막 layer가 가장 큰 기여를 하고 가장 좋은 성능</p>
<p>① 상위 layer는 더 큰 모델의 일부이기 때문에 더 강력하고</p>
<p>② 하위 layer는 보다 일반적인(기초적인) 의미 정보를 포착하기 때문</p>
</li>
</ul>
<h3 id="64-training-only-a-subset-of-layersrq6">6.4 Training only a subset of layers(RQ6)</h3>
<ul>
<li><p>BERT는 매우 큰 모델이라서 전체를 fine-tuning 하기엔 비용이 너무 크다.</p>
<p>→ 일부만 파인튜닝해서 약간 낮은 성능을 얻더라도 어떤 상황에선 그게 더 좋을 수도 있음</p>
<p>특히, 학습 데이터셋이 매우 큰 경우에는 이게 더 나을 수도</p>
<p>⇒ 마지막 k개의  layer만 학습 진행</p>
<p>그렇다고 해서 classifier만 학습하면 성능 안 좋음</p>
<ul>
<li>근데 마지막 layer만 파인튜닝하더라도 HSC같은 기존 SOTA 머신러닝 방법보다 훨씬 뛰어난 성능이긴 함</li>
</ul>
</li>
<li><p>layer 9 이후부터는 성능이 거의 동일하지만 전체 모델을 fine-tuning한 경우만 약간 더 높은 성능을 보임</p>
<p>→ 즉 전체 학습은 꼭 필요하진 않음,, 적은 비용으로도 비슷한 성능 가능!!</p>
</li>
</ul>
<h3 id="65-where-does-the-model-fail">6.5 Where does the model fail?</h3>
<ul>
<li>annotator간 100% 일치한 financial phrasebank subset에서 97% 정확도를 달성했기 때문에 정답을 맞추지 못한 사례를 한 번 분석해보겠다.</li>
</ul>
<p><strong>✓ annotator 간의 불일치는 대부분 positive와 neutral 사이에서 발생</strong></p>
<ul>
<li>기업에서 흔히 사용하는 긍정적인 표현(glitter)과 실제로 긍정적인 정보를 구분하기 어렵기 때문</li>
</ul>
<p>→ FinBERT에서도 동일한 현상이 일어나는 지 confusion matrix 제시</p>
<ul>
<li><p>세전 손실은 30만 유로, 이는 2005년 1분기의 220만 유로 손실보다 감소한 수치이다.</p>
<ul>
<li>정답은 P, 예측은 N으로</li>
</ul>
<p>→ loss 단어를 보고 N으로 판단(숫자 reasoning 부족)</p>
</li>
<li><p>이 구현은 운영자에게 매우 중요하며 브라질에서는 fixed-to-mobile 서비스를 출시할 예정</p>
<ul>
<li>정답 Neutral, 예측은 P</li>
</ul>
<p>→ important를 보고 P로 판단, 실제로는 정보 전달(Neutral)</p>
</li>
<li><p>코팅 잡지용 인쇄용 종이 시장 상황은 계속 약세일 것이다.</p>
<ul>
<li>정답 N, 예측은 Neutral</li>
</ul>
<p>→ 도메인 이해 부족으로 인함</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/8d31f341-2769-475e-883d-a53119e05e04/image.png" alt=""></p>
<ul>
<li>대부분의 오류(73%)는 positive와 negative 사이에서 발생함</li>
<li>어떤 문장은 긍정적인 전망을 의미하는지, 단순한 사실 서술인지 구분하는 것은 어려움</li>
</ul>
<hr>
<h2 id="7-conclusion-and-future-work">7. Conclusion and future work</h2>
<ul>
<li>BERT를 금융 데이터로 추가학습해서 FinBERT를 만듦</li>
<li>pretraining이 효과적이며 특히 데이터가 적을 때 굿굿<ul>
<li>데이터가 500개만 있어도 SOTA달성 가능</li>
</ul>
</li>
<li>domain pretraining 효과는 그다지 크진 않았음</li>
<li>upper layer을 많이 fine tune하는 게 좋았고 마지막 2개의 layer만 학습해도 충분하더라</li>
</ul>
<hr>
<ul>
<li>감정분석자체가 목적은 아니고 주가예측에 활용 가능</li>
<li>물론 아직 숨겨진 의미까지 이해하는 건 어려움</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] N-BEATS: Neural Basis Expansion Analysis for Interpretable Time Series Forecasting]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-N-BEATS-Neural-Basis-Expansion-Analysis-for-Interpretable-Time-Series-Forecasting</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-N-BEATS-Neural-Basis-Expansion-Analysis-for-Interpretable-Time-Series-Forecasting</guid>
            <pubDate>Wed, 22 Jul 2026 13:00:05 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: N-BEATS: Neural Basis Expansion Analysis for Interpretable Time Series Forecasting
<strong>학회(출판연도)</strong>: ICLR (2020)
<strong>연구분야</strong>: 딥러닝 기반 시계열 예측 및 시계열 표현 학습</p>
</blockquote>
<hr>
<h2 id="background-concept">Background Concept</h2>
<h3 id="basis-expansion"><strong>Basis Expansion</strong></h3>
<ul>
<li>복잡한 시계열을 여러 기본 함수(basis)의 조합으로 표현하는 것</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6ac93e84-2065-485a-96b0-a2d8c20fe3a0/image.png" alt=""></p>
<ul>
<li>하나의 복잡한 곡선을 “조각”으로 나눠서 설명<ul>
<li>직선, 사인파, 작은 변동을 다 더하면 원래 데이터가 됨</li>
<li>수식</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e733f08e-433e-4112-bc86-7224fb702d94/image.png" alt=""></p>
<pre><code>  | 기호 | 의미 |
  | --- | --- |
  | ( $\phi_i(t$) ) | basis function (기본 함수) |
  | ( $\theta_i$ ) | weight (얼마나 쓸지) |
  | ( K ) | basis 개수 |</code></pre><ul>
<li>기존에는 푸리에 방식으로 사람이 직접 basis를 정했는데 N-BEATS의 경우 네트워크가 직접 $\theta$ 학습하는 방식</li>
</ul>
<blockquote>
<p><strong>✓ N-BEATS에서는 어떻게 쓰는가?</strong></p>
<ul>
<li>총 2가지 모드 - Generic / Interpretable mode</li>
<li><strong>Generic (Black-box)</strong><ul>
<li>basis 없음 (learned)</li>
<li>그냥 Neural Net</li>
</ul>
</li>
<li>✓ <strong>Interpretable mode</strong> ← 여기에 basis 등장<ul>
<li>Trend basis: ϕ(t)=[1$,t,t^2,t^3$] → 다항식</li>
<li>Seasonality basis: ϕ(t)=[$\sin(2πt),\cos(2πt)$] → 주기패턴</li>
</ul>
</li>
</ul>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li><p>연구목표: <strong>단변수 시계열 예측</strong>(한 개의 값만 있는 시계열)를 딥러닝으로 해결하자!</p>
<ul>
<li><strong>Point forecasting</strong>: 미래의 값을 “하나의 숫자”로 예측 (확률 분포 X, 단일 값O)</li>
</ul>
<blockquote>
<p><strong>✓ 현실에서 단변수 시계열을 많이 쓰는가?</strong></p>
<ul>
<li><p>N-BEATS의 목표는 “복잡한 구조 없이도 SOTA 성능 + 해석 가능성”</p>
<ul>
<li>입력 : 하나의 시계열</li>
<li>구조: 매우 단순(MLP + residual)</li>
</ul>
</li>
<li><p>수요 예측(상품 하나의 판매량), 에너지(특정 지역 전력 소비), 금융(특정 주식 가격) 등 다양한 분야에서 사용</p>
<ul>
<li><p>하지만 실제로 단변수처럼 보이지많 다변수 문제인 경우도 있음</p>
<p>→ 매출 = 가격 + 날씨 + 이벤트 영향 받음</p>
</li>
</ul>
</li>
<li><p><strong>다변수 시계열</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f3b4b04a-45b5-41c6-ae50-94500bda4f5b/image.png" alt=""></p>
<ul>
<li>여러 변수가 동시에 존재 $x_t$=[$x_t^{(1)},x_t^{(2)},...,x_t^{(n)}$]</li>
</ul>
</li>
<li><p>N-BEATS는 다변수에 최적화된 모델은 아님</p>
</li>
<li><p>그래서 다변수 시계열 문제를 풀기 위해서는</p>
<ul>
<li>모델 자체가 multivaritate한 LSTM, RNN, Transformer기반의 DeepAR이나 Temporal Fusion Transformer 사용</li>
<li>피처엔지니어링을 할 수도</li>
<li>앙상블<ul>
<li>N-BEATS + XGBoost, RNN + Transformer</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
<li><p><strong>forward / backward residual 연결 구조</strong>를 가진 <strong>아주 깊은 fully-connected 네트워크</strong> 제안</p>
<ul>
<li>residual links(잔차연결) - 입력을 그대로 더해주는 skip connection</li>
<li>forward&amp;backward residual - 단순히 앞으로만 흐르는 게 아니라 예측 및 보정(backcast) 구조를 동시에!</li>
<li>fully-connected layers - CNN이나 RNN없이 MLP만 사용</li>
</ul>
<p>→ 즉 일반적으로 시계열에서는 RNN과 LSTM을 쓰는데 여기서는 그게 필요없다는 도전적인 주장 준비중!</p>
</li>
<li><p>기여</p>
<ul>
<li><p>① Interpretable (모델 내부가 왜 이렇게 예측했는지 설명 가능하고)</p>
</li>
<li><p>② Applicable without modification (도메인별 feature engineering 필요없음)</p>
</li>
<li><p>③ Fast to train (FC기반으로 구조가 단순해서 계산 효율이 좋음)</p>
<p>↔ 기존 시계열 모델들을 복잡하고 도메인 의존적이며, 느리다..</p>
</li>
</ul>
</li>
<li><p>실험</p>
<ul>
<li><p>M3, M4, TOURISM 같은 유명한 시계열 데이터셋에서 테스트</p>
</li>
<li><p>2가지의 N-BEATS 모델 설정으로 모든 데이터셋에서 SOTA 달성</p>
<ul>
<li>기존 통계 모델보다 11% 더 좋고</li>
<li>M4 대회 우승 모델보다 3% 더 좋다</li>
</ul>
</li>
<li><p>첫번째 모델은 시계열 전용 구조(RNN, seasonal component 등)없이도 다양한 데이터에서 잘 작동</p>
<p>→ <em>시계열은 특별한 구조가 필요하다는 기존 생각과 달리</em> 단순한 딥러닝 구조(residual block 같은 기본 building block)만으로도 충분하다는 것을 보여줌</p>
</li>
<li><p>해석가능한 결과를 만들면서도 성능도 거의 유지!</p>
<p>→ 성능과 해석가능성은 보통 trade-off관계인데 이 논문에서는 둘 다 가능하다!</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>시계열예측은 ① 비즈니스에서 매우 중요하고 ② <strong>머신러닝이 잘 활용</strong>되는 대표적인 분야</p>
<ul>
<li><p>재고관리, 고객관리, 생산 및 유통, 금융, 마케팅 등 거의 모든 비즈니스 핵심 영역에서 사용됨</p>
</li>
<li><p>예측정확도가 조금만 올라가도 수백만 달러의 규모의 경제적 효과 발생 가능!</p>
</li>
<li><p>CV나 NLP에서는 딥러닝 good, 시계열에서는 딥러닝보단 전통 통계 모델 多</p>
<p>→ 실제 M4대회에서 상위 모델은 대부분 통계 모델의 앙상블  </p>
<ul>
<li>우승모델은 <strong>딥러닝(LSTM+어텐션) + Holt-winters 통계모델의</strong> 하이브리드 모델</li>
</ul>
</li>
</ul>
</li>
<li><p>핵심 주장</p>
<ul>
<li>기존까지는 DL 단독으로는 어렵고 섞어야 한다는 것이 주된 흐름이었지만 통계 모델 없이 DL모델만으로도 충분하다</li>
<li>단순 성능뿐만 아니라 해석 가능성도 보여줄 것</li>
</ul>
</li>
</ul>
<h3 id="11-summary-of-contributions">1.1 Summary of contributions</h3>
<ul>
<li>Deep Neural Architecture<ul>
<li>시계열 전용 구조 없이 딥러닝만으로도 기존 통계 모델보다 더 좋은 성능</li>
<li>M4기준<ul>
<li>통계 베이스라인보다 11% 향상</li>
<li>최고 통계 모델보다 7% 향상</li>
<li>대회 우승 모델보다 3% 향상</li>
</ul>
</li>
</ul>
</li>
<li>Interpretable DL for Time Series<ul>
<li>성능뿐아니라 <strong>해석가능한 딥러닝 모델</strong> 가능<br>→ 전통적인 trend + seasonality 분해 방식처럼 사용 가능</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ Depcomposition(분해)</strong></p>
<ul>
<li>시계열을 trend (장기 증가/감소), seasonality (주기성), level (기본값)로 나누는 방식</li>
</ul>
</blockquote>
<hr>
<h2 id="2-problem-statement">2. Problem statement</h2>
<ul>
<li><p>문제 정의</p>
<ul>
<li><p>① 이산 시간(<strong>discrete time</strong>)에서 <strong>②단일 변수 시계열 예측</strong> 문제를 다룸</p>
<p>→ 즉, continuous time 문제, multivariate 문제는 고려하지 않겠다.</p>
</li>
<li><p>길이 T의 과거 데이터가 주어지면 앞으로 H개 미래 값 예측</p>
<ul>
<li>$y_1~y_T$ :  과거  / $y_{T+1} ~ y_{T+H}$ : 미래</li>
</ul>
</li>
<li><p>실제 모델 입력(Loockback window)은 전체 과거(T)가 아니라 최근 t개만 사용</p>
<p>→ 먼 과거는 중요하지 않을 수 있음, sliding window방식 사용</p>
</li>
</ul>
</li>
<li><p>평가지표</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/fb4251a8-7120-4235-9bf7-9aa244917fa3/image.png" alt=""></p>
<ul>
<li><p>sMAPE: 실제값과 예측값의 차이를 두 값의 평균으로 나눈 값</p>
<ul>
<li>데이터의 크기에 영향을 받지 않음</li>
</ul>
<p>⇒ (상대 오차 측정) 작은 값/큰 값 모두 공정하게 평가하려는 의도</p>
</li>
<li><p>MASE: 예측 오차를 naive 모델의 평균 오차로 나눈 값</p>
<ul>
<li>Naive predictor: y(t) = y(t-m)</li>
</ul>
<blockquote>
<p><strong>✓ Naive 모델?</strong></p>
<ul>
<li><p>“다음 값 = 바로 이전 값”이라고 예측하는 가장 단순한 모델</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/33104ff4-7937-47dc-84ae-3e8879fdd547/image.png" alt=""></p>
</li>
<li><p><strong>왜 이렇게 멍청한 모델을 쓰는가?</strong></p>
<ul>
<li>baseline: 이것보다 못하면 모델 쓸 이유 없음</li>
<li>많은 시계열에서 변화가 느리고 패턴이 단순한 경우가 많기 때문에 naive가 꽤 잘 맞음</li>
</ul>
</li>
</ul>
</blockquote>
<p>⇒ seasonality 고려한 baseline</p>
<blockquote>
<p><strong>✓ MAPE, sMAPE, MASE 비교</strong></p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>핵심 아이디어</th>
<th>장점</th>
<th>단점</th>
</tr>
</thead>
<tbody><tr>
<td>MAPE</td>
<td>실제값 기준 비율 오차</td>
<td>직관적</td>
<td>0에서 터짐</td>
</tr>
<tr>
<td>sMAPE</td>
<td>평균 기준 비율 오차</td>
<td>대칭적, 안정적</td>
<td>약간 해석 어려움</td>
</tr>
<tr>
<td>MASE</td>
<td>naive 모델 대비 성능</td>
<td>dataset-independent</td>
<td>직관성 낮음</td>
</tr>
</tbody></table>
<ul>
<li><p>MAPE: 실제값 대비 몇 % 틀렸나?</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/3b0dd5c8-5a21-431b-bc13-07b6f9e77760/image.png" alt=""></p>
</li>
<li><p>sMAPE(Symmetirc MAPE)</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f6efd768-32e2-468e-a9f3-2059c7e787c7/image.png" alt=""></p>
</li>
<li><p>MASE: 이 모델이 naive보다 얼마나 좋은가?</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f918b390-f30c-49d1-8f79-4c1b6c6b995b/image.png" alt=""></p>
</li>
</ul>
</blockquote>
</li>
<li><p>OWA: sMAPE와 MASE를 baseline 대비 정규화해서 합친 metric</p>
<ul>
<li>naive 모델 기준으로 정규화되고 naive 모델인 경우 OWA = 1</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-n-beats">3. N-BEATS</h2>
<ul>
<li><p>모델 설계의 원칙</p>
<ul>
<li><p>구조는 단순해야하지만(simple&amp;generic), 표현력은 충분히 커야 한다 (깊어야 한다)</p>
</li>
<li><p>시계열 전용 feature engineering이나 특별한 scaling없이 동작해야한다.</p>
<p>⇒ 순수한 딥러닝의 가능성 테스트</p>
</li>
<li><p>모델이 해석 가능하도록 확장 가능해야함</p>
</li>
</ul>
</li>
</ul>
<h3 id="31-basic-block">3.1 Basic block</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/d1c73aee-bda9-404a-923a-b691eaa5ccae/image.png" alt=""></p>
<ul>
<li><p>블록</p>
<ul>
<li><p>첫번째 블록 입력: 전체 모델 입력(최근 t개의 시계열)</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/765b5aa6-de6f-461e-9251-7b8fcf7983c8/image.png" alt=""></p>
<ul>
<li><p>입력 길이: H의 배수로 보통 2H~7H 사용</p>
<p>ex. 월요일~일요일(7일)까지의 일별 기온을 예측하고 싶다 →  2H:과거14일간의 기온 데이터 사용</p>
<p>→ 미래 길이(H) 대비 충분한 과거 필요(과거 데이터에서 시계열의 잠재적인 패턴, 추세, 계절성 등 미래를 예측하는 데 필요한 정보를 학습하기 위함)</p>
</li>
</ul>
</li>
<li><p>다음 블록 입력: 이전 블록의 residual</p>
<ul>
<li><p>residual: 아직 설명되지 않은 부분</p>
<p>→ 즉 각 블록은 “남은 정보만 처리”</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>블록 내부</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c3f726a9-f258-459f-a006-88b8cccf9716/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>첫 번째 부분: FC 네트워크로(-&gt; 복잡하고 비선형적인 특징을 추출하고 데이터를 고차원으로 표현하기 위함) θf (forecast 계수), θb (backcast 계수)를 만듦</li>
<li>두 번째 부분: basis function을 이용해서 실제 output을 만듦</li>
</ul>
<ul>
<li><p>출력은 그냥 값이 아니라 basis 벡터들을 $\theta$계수로 가중합해서 만듦</p>
<p>→ 모델을 “패턴들의 조합”으로 예측 ⇒ trend, seasonality 해석 가능한 구조!</p>
<ul>
<li>basis 함수는 학습할 수도 있고 미리 정할 수도 있으며 특정 구조(trend, seasonality)를 반영할 수 도 있음</li>
</ul>
</li>
</ul>
<h3 id="32-doubly-residual-stacking">3.2 Doubly residual stacking</h3>
<ul>
<li><p>기존</p>
<ul>
<li><p>ResNet:  입력을 출력에 더해서 다음 레이어로 넘기는 방법</p>
</li>
<li><p>DenseNet: 모든 레이어의 출력이 이후 모든 레이어의 입력으로 연결</p>
<p>⇒ 이러한 구조는 깊은 네트워크를 학습하기 쉽게 만듦<br>하지만, 해석하기는 어려운 구조,,(블랙박스)</p>
</li>
</ul>
</li>
<li><p>그래서 이중 residual 구조 제안</p>
<ul>
<li><p>backcast쪽의 residual</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f782e4b4-44e4-46b9-a22d-8f4c506653dd/image.png" alt=""></p>
<ul>
<li>입력을 계속 “빼면서” 정제</li>
<li>설명한 부분을 제거하고 남은 것만 다음 블록으로</li>
</ul>
</li>
<li><p>forecast쪽의 residual</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/313ffe96-dc59-44e8-8730-fdfd6cfdfedb/image.png" alt=""></p>
<ul>
<li>예측을 계속 “더하면서” 생성</li>
<li>각 블록이 일부를 예측하고 모두 합쳐서 최종 결과</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>✓ 모델의 핵심 아이디어 → 입력을 점점 분해한다</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e3d094f7-548f-4fe4-b755-378122bb2c8e/image.png" alt=""></p>
<ul>
<li>햇 $x_{l-1}$ (backcast) → 설명된 부분</li>
<li>residual → 아직 설명 안 된 부분</li>
<li>최종 예측은 모든 블록의 예측을 더한 값<ul>
<li>각 블록은 부분 예측만 담당</li>
</ul>
</li>
</ul>
<p>⇒ 이전 블록이 잘 설명할 수 있는 부분을 제거하면 다음 블록은 더 쉬운 문제만 남음</p>
<p>⇒ 즉 각 블록의 예측이 계층적으로 합쳐짐</p>
</li>
<li><p>basis 함수가 자유롭게 학습되면 gradient 흐름이 더 좋아지고, 반대로 basis를 특정 구조로 제한하면 의미 있는 해석이 가능해짐</p>
<ul>
<li>자유: FC network($\theta$ 생성 부분)</li>
<li>제한: basis function($g^b$, $g^f$)  ← 사람이 설계 (trend, seasonality … )</li>
</ul>
</li>
</ul>
<h3 id="33-interpretability">3.3 Interpretability</h3>
<ul>
<li><p>basis함수 ($g^b$, $g^f$)를 어떻게 선택하느냐에 따라 2가지 모델 구조 제안</p>
<p>→ 해석 가능성은 basis 선택에 달려있음</p>
<ul>
<li>$g^b$ → backcast 생성 함수</li>
<li>$g^f$ → forecast 생성 함수</li>
</ul>
</li>
<li><p>하나는 일반 딥러닝 모델, 다른 하나는 특정 구조를 넣어 해석 가능하게 만든 모델</p>
</li>
</ul>
<h4 id="generic-model-←-성능에는-짱">Generic Model ← 성능에는 짱!</h4>
<ul>
<li>시계열 지식을 전혀 사용하지 않는 모델</li>
<li>$g^b$, $g^f$ ← 그냥 linear layer로 설정</li>
<li>basis matrix: V와 $\theta$의 곱으로 생성</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ae6b7830-08a9-4b78-bb53-bcf339c0b699/image.png" alt=""></p>
<ul>
<li><p>FC 네트워크: basis $V^f$를 학습하고 그 basis의 조합으로 예측</p>
<ul>
<li><p>$V^f$</p>
<p>→ 시간길이 H x basis 개수 크기</p>
<p>→ 행은 시간 (t=1~H), 열은 basis 함수 index (하나의 파형)</p>
<p>이때, 아무 제약이 없기 때문에 학습된 wave는 의미없는 형태일수도,,</p>
</li>
</ul>
<blockquote>
<p><strong>✓ 왜 generic모델에서는 의미없는 wave가 나올까?</strong></p>
<ul>
<li>같은 데이터를 설명하는 방법이 너무 많아서 모델이 굳이 <strong>의미 있는 방식</strong>으로 표현할 필요가 없기 때문</li>
<li>각 부분이 표현할 수 있는 형태를 제한하면, 그 역할이 강제되기 때문에 나누면 의미가 생김</li>
</ul>
</blockquote>
<p>⇒ 즉 basis가 자유로워서 해석이 불가능</p>
</li>
</ul>
<h4 id="interpretable-model-←-해석-가능">Interpretable Model ← 해석 가능!</h4>
<ul>
<li>해석 가능한 모델은 basis에 구조를 넣어서 만듦<ul>
<li>시계열을 trend + seasonality로 나눠서 이걸 모델에 넣음</li>
<li>y = trend + seasonality</li>
</ul>
</li>
</ul>
<h3 id="trend-model---해석가능성">Trend Model - 해석가능성</h3>
<ul>
<li><p>trend는 천천히 변하는 함수 → basis를 저차 다항식으로 제한</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/8ed871e6-fafa-4952-8695-14555747f6b5/image.png" alt=""></p>
</li>
</ul>
<p>  <img src="https://velog.velcdn.com/images/hyooo__s/post/7bc7e447-6873-4eeb-ad6a-5d8b9089bfb6/image.png" alt=""></p>
<ul>
<li><p>t는 0~1로 normalize된 값</p>
<ul>
<li>basis matrix는 polynormal basis</li>
</ul>
<p>⇒ 즉 trend는 smooth + polynomial 로 충분하다</p>
</li>
</ul>
<blockquote>
<p><strong>✓ Polynomial</strong></p>
<ul>
<li>변수의 거듭제곱들의 합으로 이루어진 함수</li>
<li>trend는 보통 천천히 증가하거나 감소 = smooth + low-frequency<ul>
<li>$y = a + bt + ct^2 + dt^3$ - 부드럽게 변하고 갑자기 진동 불가능</li>
</ul>
</li>
<li>간단하고 과도한 복잡성이 없으며 느린 변화에 딱 맞음</li>
</ul>
</blockquote>
<h4 id="seasonality-model---해석가능성">Seasonality Model - 해석가능성</h4>
<ul>
<li><p>seasonality는 반복되는 패턴 → periodic 함수로 제한</p>
</li>
<li><p>푸리에 basis 사용</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/80a1d0c3-c524-4fd1-a59c-63ff23f58cd5/image.png" alt=""></p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/2c13df4c-21b7-4795-b635-ed63da081695/image.png" alt=""></p>
<p>  ⇒ Seasonality는 주기이므로 푸리에가 자연스러움</p>
<blockquote>
<p><strong>✓ N-BEATS 구조에서 일어나는 일</strong></p>
<ul>
<li>Stack1 (trend)<ul>
<li>polynomial만 학습 가능</li>
<li>trend만 설명</li>
</ul>
</li>
<li>Stack2 (seasonality)<ul>
<li>푸리에만 가능</li>
<li>남은 periodic만 설명</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>즉 모델은 trend stack + seasonality stack으로 구성됨</p>
<ul>
<li><p>먼저 trend를 먼저 제거하고 나머지로 seasonality 처리</p>
<p>→ trend와 seasonality를 각각 따로 볼 수 있음</p>
</li>
</ul>
</li>
<li><p>각 스택은 여러 블록으로 구성되어 있으며 같은 basis를 stack 내에서 공유함</p>
<ul>
<li>각 stack에는 3개의 블록이 있음</li>
<li>weight공유가 성능에 좋은 영향을 줌</li>
</ul>
</li>
</ul>
<h3 id="34-ensembling">3.4 Ensembling</h3>
<ul>
<li><p>M4대회 상위 모델들이 모두 앙상블 사용했음 → 우리도 공정한 비교를 위해 앙상블진행</p>
</li>
<li><p>앙상블은 dropout이나 L2 보다 훨씬 강력한 regularization(오버피팅 방지)임</p>
<ul>
<li><p>dropout과 L2는 개별 모델 성능은 올리지만 앙상블 성능은 오히려 떨어짐</p>
<p>→ dropout과 L2는 모델을 더 안정적이고 비슷하게 만듦<br>그래서 개별 모델이 좋아질수록 서로 비슷해지고 다양성이 줄어듦</p>
<p>→ 앙상블에서는 모델 간 다양성이 더 중요함</p>
<p>(앙상블에서 중요한 것은 모델이 얼마나 잘 맞추냐보다 모델들이 얼마나 다르게 틀리냐이다)</p>
<blockquote>
<p><strong>✓ 왜 다르게 틀리는 게 중요할까?</strong></p>
<ul>
<li>모델이 다 같이 똑같은 걸 틀려버리면 아무런 소용이 없음</li>
<li>서로 다른 걸 틀려서 오차가 서로 상쇄,,</li>
</ul>
<hr>
<p>이 논문에서 dropout보다 앙상블이 강한 이유는 dropout은 하나의 모델을 안정화(variance 줄임)인 반면, 앙상블은 여러 모델을 평균 즉, variance를 크게 줄여서 오차를 상쇄시킴</p>
</blockquote>
</li>
</ul>
</li>
<li><p>다양성을 만드는 방법</p>
<ul>
<li><p>서로 다른 loss function으로 학습 → sMAPE, MASE, MAPE</p>
<ul>
<li>loss가 다르면 모델이 다른 방향으로 학습됨</li>
</ul>
</li>
<li><p>입력 길이를 다르게 해서 학습 (다양한 시간 범위 고려)</p>
<ul>
<li><p>2H,3H, … , 7H</p>
<p>→ 짧은 window (최근패턴), 긴 window (장기패턴)</p>
</li>
</ul>
<p>⇒ 전체 모델은 multi-scale 특성을 가짐</p>
</li>
<li><p>random initialization을 다르게 해서 여러 모델 만듦 (id = “m4l3)</p>
<p>⇒ 총 180개의 모델을 앙상블</p>
<ul>
<li><strong>3가지 loss x 6가지 window x 여러 seed</strong></li>
<li>이때 결과는 평균이 아닌 median 사용<br>→ median은 이상치에 강하기 때문</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-related-work">4. Related work</h2>
<ul>
<li>시계열 예측 방법에는 몇 가지 주요 카테고리로 나눌 수 있음</li>
</ul>
<h4 id="statistical-methods">Statistical Methods</h4>
<ul>
<li><strong>exponential smoothing(최근 데이터에 더 큰 가중치를 주는 방식)</strong>기반 통계 모델은 산업에서 기본 선택</li>
<li>Theta method → 시계열을 여러 구성 요소로 나눠 예측</li>
<li>ARIMA계열 → state-space 모델(다양한 모델을 하나로 설명하는 framework)로 통합 가능</li>
</ul>
<h4 id="mlts-hybrid">ML+TS Hybrid</h4>
<ul>
<li>최근 통계 모델 출력과 ML을 결합한 방식이 등장<ul>
<li>2등 모델은 gradient boosting 방식으로 결합</li>
</ul>
</li>
</ul>
<h4 id="deep-learningrnn-계열">Deep Learning(RNN 계열)</h4>
<ul>
<li>딥러닝 기반 시계열 모델은 대부분 RNN기반</li>
<li>주로 전력 수요 예측과 같은 multivariate 문제에서 사용</li>
<li>일부에서는 dilation, residual, attention을 결합</li>
</ul>
<h4 id="m4-winner">M4 Winner</h4>
<ul>
<li>Holt-Winters + 딥러닝 결합 → 통계 모델에 크게 의존하는 hybrid 구조</li>
</ul>
<hr>
<h2 id="5-experimental-results">5. Experimental results</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/a9318a09-10a2-4725-9b85-c53fddf24618/image.png" alt=""></p>
<ul>
<li><p>각 데이터셋마다 기존 top-5 모델들과 비교</p>
<ul>
<li>M4 → OWA, sMAPE</li>
<li>M3 → sMAPE</li>
<li>TOURISM → MAPE</li>
</ul>
</li>
<li><p>3가지 모델로 비교:<br>① N-BEATS(generic), ② N-BEATS-I(interpretable) ③ N-BEATS-I+G(앙상블)</p>
<p>⇒ generic vs interpretable vs ensemble</p>
</li>
<li><p>모든 데이터셋에서 N-BEATS가 SOTA 달성</p>
</li>
</ul>
<h3 id="51-datasets">5.1 Datasets</h3>
<ul>
<li>M4데이터셋<ul>
<li>1982년부터 이어진 가장 영향력있는 시계열 대회 시리즈의 최신 버전</li>
<li>10만 개의 시계열, 매우 다양한 도메인을 가지고 있으며</li>
<li>시간 단위부터 연 단위까지 포함되어 있음</li>
</ul>
</li>
<li>M3 데이터셋<ul>
<li>M4와 비슷하지만 더 작음</li>
<li>통계 모델 발전에 많이 사용됨</li>
<li>최근 연구에서 ML이 통계보다 못하다고 나왔음,,
→ 본 연구에서 뒤집으려는 것</li>
</ul>
</li>
<li>TOURISM<ul>
<li>관광 관련 시계열 데이터</li>
<li>다양한 시간 단위 포함</li>
</ul>
</li>
</ul>
<h3 id="52-training-methodology">5.2 Training Methodology</h3>
<ul>
<li><p>데이터 → train/validation/test로 나눔</p>
<ul>
<li><p>test는 기존의 brench mark 그대로 사용</p>
</li>
<li><p>train 데이터는 다시 나눠서 validation생성하고 validation으로 튜닝</p>
</li>
<li><p>튜닝 후 전체 train으로 다시 학습</p>
<p>⇒ train → validation (튜닝) → full train → test (평가)</p>
</li>
</ul>
</li>
<li><p>TensorFlow로 구현하고, horizon마다 같은 구조를 사용함 → horizon별로 따로 학습</p>
<ul>
<li>각 시계열을 하나의 task로 본다면 multitask learning으로 볼 수도 있음</li>
</ul>
</li>
<li><p>학습 방식</p>
<ul>
<li><p>배치 사이즈 = 1024</p>
</li>
<li><p>랜덤하게 시계열 선택</p>
<ul>
<li>각 시계열에서 랜덤 시점 선택</li>
</ul>
</li>
<li><p>lookback 범위 튜닝</p>
</li>
<li><p>데이터가 많으면 짧은 window, 데이터가 적으면 긴 window</p>
<p>→ 데이터가 많으면 최근 정보만으로도 충분하고, 데이터가 적으면 더 많은 과거가 필요하기 때문</p>
</li>
<li><p>입력: 과거 window, 출력: 미래 H</p>
</li>
<li><p>Adam 사용</p>
</li>
<li><p>sMAPE는 unstable하기때문에 학습 시 분모 gradient를 차단</p>
</li>
</ul>
</li>
</ul>
<h3 id="53-interpretability-results">5.3 Interpretability results</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/a2fdb0a8-e62e-49fe-aa1d-f000b611c051/image.png" alt=""></p>
<ul>
<li><p>generic 모델의 출력은 의미 없이 섞여있음</p>
<ul>
<li>trend와 seasonality가 아무 stack에나 섞여 있음</li>
<li>두 번째 stack 출력은 더 작은 값</li>
<li>residual 구조 때문에 뒤로 갈수록 남는 정보가 적음</li>
</ul>
</li>
<li><p>Interpretable 모델은 명확한 패턴을 가짐</p>
<ul>
<li><p>trend는 천천히 변하고 부드러움</p>
</li>
<li><p>seasonality는 반복적이고 주기적임</p>
<p>⇒ seasonality가 강하면 변동폭이 크고, trend가 없으면 trend 출력도 작음</p>
<p>⇒ 따라서 trend와 seasonality로 분해 됨 - 즉 딥러닝도 해석 가능하도록 할 수 있음</p>
<ul>
<li>구조에 적절히 bias를 넣어서,,! + 해석가능하면서 성능도 유지!</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-discussion-connections-to-meta-learning">6. Discussion: Connections to meta-learning</h2>
<ul>
<li>메타러닝은 내부학습과 외부학습과정으로 나눌 수 있음</li>
</ul>
<blockquote>
<p><strong>✓ meta-learning</strong></p>
<ul>
<li>epoch학습과 메타러닝의 차이</li>
</ul>
<table>
<thead>
<tr>
<th>구분</th>
<th>Epoch 학습</th>
<th>Meta-learning</th>
</tr>
</thead>
<tbody><tr>
<td>데이터</td>
<td>하나</td>
<td>여러 task</td>
</tr>
<tr>
<td>목표</td>
<td>정확도 ↑</td>
<td>적응 속도 ↑</td>
</tr>
<tr>
<td>일반화</td>
<td>같은 task</td>
<td>새로운 task</td>
</tr>
</tbody></table>
<ul>
<li>한 번의 학습으로 끝내는 게 아니라 여러 task를 통해 학습 능력을 일반<ul>
<li>쉽게 말해 문제를 푸는 게 아니라 문제 푸는 방법을 배우는 것</li>
</ul>
</li>
<li>2단계 학습<ul>
<li>Inner loop (task 학습) : 각 task에서 모델 학습</li>
<li>Outer loop (meta 학습) : 어떻게 학습할지 업데이트</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>inner learning은 outer learning에 의해 파라미터화되거나 조건화되거나 혹은 다른 방식으로 영향 받을 수 있음</p>
</li>
<li><p>내부 파라미터(ex. 시냅스 가중치): 내부 학습 과정에서 변화</p>
</li>
<li><p>외부 파라미터 또는 메타 파라미터(ex. 유전자): 외부 학습 과정에서만 변화</p>
</li>
<li><p>N-BEATS도 메타러닝의 한 사례라고 볼 수 있다 → gradient descent를 통해 학습</p>
</li>
<li><p>내부 학습 과정</p>
<ul>
<li><p>기본적인 블록의 집합으로 구성</p>
</li>
<li><p>basis 함수 $g^f$의 입력으로 확장계수 $\theta^f$수정</p>
</li>
<li><p>여러 단계로 학습이 이루어지는데, 각 단계는 아키텍처 스택 안의 하나의 블록에 해당</p>
<p>① 각 블록은 하나의 업데이트 단계처럼 작동하고</p>
<p>② 확장계수 $\theta^f$를 점진적으로 수정하고</p>
<p>③ 이 계수들은 각 블록에서 $g^f$에 입력되어 최종적으로 합쳐져 예측 생성</p>
</li>
</ul>
</li>
<li><p>해석 가능한 모델의 경우 $g^f$가 고정되어 있어 메타 파라미터는 FC레이어에만 존재</p>
<p>↔ Generic 모델은 $g_f$를 정의하는 행렬V 역시 학습되므로 이 또한 메타 파라미터에 포함됨</p>
</li>
<li><p>스택 내 블록 수나 스택의 개수를 증가시키면 일반화 성능이 향상되는 이는 내부 학습 과정의 반복 횟수 증가로 해석 가능</p>
</li>
</ul>
<hr>
<h2 id="7-conclusions">7. Conclusions</h2>
<ul>
<li>핵심 가설<ul>
<li>시계열 도메인 지식 없이도 순수 딥러닝 접근이 다양한 단변량 시계열 예측 문제에서 매우 뛰어난 성능을 낼 수 있다.</li>
<li>딥러닝 모델에 추가적인 제약을 가함으로써, 예측을 사람이 이해 가능한 구성 요소로 분해하도록 만들 수 있다.</li>
</ul>
</li>
<li>또한 딥러닝 모델이 여러 시계열을 동시에 학습하는 멀티테스크 방식으로 학습할 수도 있고, 이 과정에서 개별 시계열 간의 학습 내용을 효과적으로 공유할 수 있음!</li>
<li>이 모델이 성능이 좋은 이유는 meta-learning과 유사한 과정을 수행하기 때문일 것이고 추후 더 깊은 분석을 하겠다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Attention Is All You Need]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Attention-Is-All-You-Need</guid>
            <pubDate>Wed, 22 Jul 2026 12:50:31 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: Attention Is All You Need
<strong>학회(출판연도)</strong>: NeurIPS (2017)
<strong>연구분야</strong>: 딥러닝 기반 시퀀스 모델링 및 자연어 처리</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<blockquote>
<p><strong>✓ 지난주 복습~</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e7e586b5-6a59-4079-88f2-429b2e71e250/image.png" alt=""></p>
</blockquote>
<p><strong>✓ 기존 시퀀스 변환 모델</strong></p>
<ul>
<li>인코더와 디코더를 포함하는 복잡한 순환신경망(RNN) 기반</li>
<li>합성곱 신경망 기반</li>
<li><strong>[SOTA]</strong>: 어텐션 매커니즘을 통해 인코더와 디코더를 연결하기도 함</li>
</ul>
<blockquote>
<p><strong>✓ 어텐션 매커니즘을 통해 인코더와 디코더를 연결한다.</strong></p>
<p>→ 디코더가 단순히 인코더의 마지막 hidden state 하나만 참고하는 게 아니라, <strong>인코더 전체 출력(hidden state sequence)</strong>을 보고 필요한 정보를 가중치로 뽑아온다.</p>
<hr>
<p><strong>✓ Attention이 없는 경우 vs 있는 경우 (RNN Seq2Seq)</strong></p>
<ul>
<li><p><strong>Attention이 <em>없는</em> 경우</strong></p>
<ul>
<li>인코더는 입력 시퀀스를 다 읽고, <strong>마지막 hidden state 하나</strong>를 context vector로 만들어 디코더로 전달</li>
<li>긴 문장일수록 정보가 압축되면서 <strong>정보 손실</strong> 발생</li>
</ul>
</li>
<li><p><strong>Attention이 <em>있는</em> 경우</strong></p>
<ul>
<li><p>인코더는 입력 시퀀스의 각 단어마다 hidden state를 출력(ex. h1, h2,,,hn)</p>
</li>
<li><p>디코더는 단어를 하나 생성할 때마다, <strong>어텐션 메커니즘</strong>이 인코더의 모든 hidden state를 확인하고, 현재 시점에 필요한 정보(h1~hn)를 <strong>가중 평균</strong>으로 뽑아와 context vector를 만듦</p>
<p>⇒ 이 과정이 “인코더와 디코더를 어텐션으로 연결한다”라는 의미</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<p>⇒ 순환 및 합성곱을 완전히 없애고 <strong>어텐션 메커니즘만을 기반</strong>으로 하는 새로운 단순 네트워크 아키텍쳐인 <strong>Transformer</strong> 제안</p>
<p><strong>✓ 어텐션 매커니즘 기반 Transformer의 등장</strong></p>
<ul>
<li>병렬화 더욱 용이</li>
<li>훈련시간 훨씬 적게 소요</li>
</ul>
<p><strong>✓ 성능</strong></p>
<ul>
<li>WMT 2014 영어-독일어 번역 작업<ul>
<li>28.4 BLEU 달성 (기존 + 2BLEU)</li>
<li>8개의 GPU에서 3.5일동안 훈련한 후 41.8의 새로운 단일 모델 최고 수준의 BLEU 점수 확립</li>
<li>다른 작업에도 잘 일반화 됨(constituency parsing)</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<p><strong>✓ 기존의 모델과 한계점</strong></p>
<ul>
<li>순환 신경망 RNN, LSTM, GRU<br>→ 언어 모델링 및 기계 번역과 같은 시퀀스 모델링 및 변환 문제에서 최첨단 접근 방식으로 확고히 자리 잡음</li>
</ul>
<hr>
<blockquote>
<p><strong>✓ 순환 모델의 특성</strong></p>
<ul>
<li><p>일반적으로 입력 및 출력 <strong>시퀀스의 심볼 위치</strong>를 따라 계산 분할</p>
<ul>
<li><p><strong>symbol position</strong>: 의미론적 위치X, <strong><em>순서상 위치O</em></strong></p>
<ul>
<li><p>입력 시퀀스가 “ I love bitamin”이라면,</p>
<p>→ Symbol = “I”, “love”, “bitamin” (토큰 단위)</p>
<p>→ Position = 1, 2, 3 (순서)</p>
</li>
<li><p>출력 시퀀스가 “나는 비타민을 사랑해” 라면,</p>
<p>→ Symbol = “나는”, “비타민을”, “사랑해”</p>
<p>→ Position = 1, 2, 3</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>RNN은 시퀀스를 순차적으로 처리하기 때문에, 각 시간 단계 t에서 <strong>“위치 t의 입력 심볼”</strong>을 받아 <strong>hidden state h_t</strong>를 갱신</p>
</li>
</ul>
<hr>
<p>즉, 심볼 위치는</p>
<p>→ <strong>몇 번째 토큰을 처리하는지 (시간 step t)</strong>를 가리키는 것</p>
</blockquote>
<ul>
<li><p>순차적인 특성으로 인해 훈련 예제 내 병렬화 불가능</p>
<p>→ <strong>[P]</strong> 시퀀스 길이가 길어질수록 메모리 제약 조건으로 인해 <strong>예제 간의 배칭(batch size) 제한</strong></p>
</li>
</ul>
<blockquote>
<p><strong>✓ 배칭(batch size)이 제한된다</strong></p>
<p>→ GPU 메모리 한계 때문에 동시에 처리할 수 있는 문장(시퀀스) 수가 줄어든다</p>
<hr>
<p><strong>✓ 왜 그런 일이 생길까?</strong></p>
<ol>
<li><strong>RNN의 순차적 특성</strong></li>
</ol>
<ul>
<li>RNN은 입력 시퀀스를 토큰 하나씩 순서대로 처리해야 해서<br><strong>각 단계의 hidden state가 메모리에 유지되어야</strong> 다음 단계 연산 가능</li>
</ul>
<ol start="2">
<li><strong>시퀀스 길이가 길어지면</strong></li>
</ol>
<ul>
<li>더 많은 hidden state를 저장해야 함 → 메모리 사용량 급증</li>
<li>따라서 GPU에서 동시에 여러 시퀀스를 처리하기 어려워짐</li>
</ul>
<ol start="3">
<li><strong>결과적으로</strong></li>
</ol>
<ul>
<li><strong>batch size(한 번에 학습하는 문장 수)</strong>를 줄일 수 밖에 없음</li>
<li>batch가 작아지면 학습이 느려지고, 통계적으로 안정적인 gradient 추정도 어려워짐</li>
</ul>
</blockquote>
<p>→ <strong>[S] factorization tricks</strong> + <strong>condition computation</strong>을 통해 계산 효율성 및 성능 향상</p>
<blockquote>
<p><strong>✓ factorization tricks</strong> → 큰 연산(ex. 가중치 행렬)을 수학적으로 쪼개서 효율화</p>
<ul>
<li><p>RNN의 계산 분해 (<strong>factorization of computation</strong>)</p>
<ul>
<li><p>RNN (순환신경망)은 입력 시퀀스를 시간축(순서)에 따라 하나씩 처리</p>
</li>
<li><p>즉 <strong>h_t = f(h_t-1, x_t)</strong> 처럼 현재 시점의 은닉 상태가 바로 이전 시점에 의존하는 구조</p>
<p><strong>⇒ 계산을 시퀀스 위치별로 분해(factorization)</strong></p>
<ul>
<li>병렬처리X, 반드시 순서대로 계산해야 해서 학습 속도가 느림</li>
</ul>
</li>
</ul>
</li>
<li><p>factorization tricks</p>
<ul>
<li>큰 가중치 행렬을 <strong>작은 행렬곱으로 쪼개서</strong> 연산 효율을 높이는 기법<ul>
<li>가중치 행렬 W 크기가 n x n 이라면<br>2개의 작은 행렬 A(n x k), B(k x n)로 분해 → W = AB로 근사하면 연산량⬇️</li>
<li>메모리 효율성 good + RNN의 근본적인 순차성도 그대로~</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>✓ condition computation</strong> → 입력에 따라 <strong>필요한 연산만 선택적으로</strong> 실행해서 효율화</p>
<ul>
<li><p>모델의 모든 파라미터를 항상 전부 사용하는 대신,<br>입력 데이터나 상황(condition)에 따라 <strong>일부 파라미터만 활성화하여 계산</strong>하는 방식</p>
<p>⇒ 조건에 따라 계산을 다르게 수행함으로써, <strong>불필요한 연산을 줄이고 효율을 높임</strong></p>
</li>
</ul>
</blockquote>
<p><strong>BUT, 순차적 계산의 근본적인 제약은 여전히 남아 있음</strong></p>
<p><strong>✓ Attention 매커니즘의 등장</strong></p>
<ul>
<li>입출력 시퀀스에서 거리에 무관하게 종속성 모델링 가능 → 다양한 시퀀스 작업에 필수적인 구성요소</li>
<li>대부분, RNN과 함께 사용 됨</li>
</ul>
<p><strong>✓ Transformer</strong></p>
<ul>
<li>순환을 완전히 제거하고 <strong>어텐션만으로 ‘입력 - 출력’ 간 전역 종속성을 학습</strong>하는 transformer</li>
</ul>
<blockquote>
<p><strong>✓ 전역종속성</strong></p>
<ul>
<li>시퀀스 안의 멀리 떨어진 단어들 사이 관계까지 직접적으로 학습할 수 있다</li>
</ul>
</blockquote>
<ul>
<li>병렬화에 유리 + 8개의 P100 GPU에서 12시간 학습만에 기계 번역에서의 SOTA 달성</li>
</ul>
<hr>
<h2 id="2-background">2. Background</h2>
<p><strong>✓ CNN기반의 시퀀스 모델</strong></p>
<blockquote>
<p><strong>✓ CNN기반 시퀀스 모델의 기본 구조</strong></p>
<p><strong>① 입력 임베딩</strong></p>
<ul>
<li>글자/단어를 one-hot 이나 embedding 벡터로 변환</li>
<li>이제 시퀀스는 [ <code>토큰1</code>, <code>토큰2</code>, … , <code>토큰n</code>] 형태의 벡터 행렬이 됨</li>
</ul>
<p><strong>② 합성곱 레이어 (Convolutional layers)</strong></p>
<ul>
<li><strong>1D convolution</strong>을 사용<ul>
<li><strong>시퀀스는 시간/순서축이 1차원</strong><br>→ 단어가 시간축을 따라 나열되어 있으므로, 1D conv 필터를 슬라이딩하면서 국소 패턴 잡음</li>
<li>커널 크기 k → k개의 연속된 토큰을 한 번에 보고 특징 추출</li>
</ul>
</li>
<li>윈도우 크기 k (ex. 3,5)를 정해 연속된 토큰 k개를 한 번에 보고 특징 추출</li>
<li>여러층을 쌓으면 receptive field (한 위치가 볼 수 있는 범위)가 넓어짐 → 긴 문맥도 처리 가능</li>
</ul>
<p><strong>③ 비선형 변환 (ReLU 등)</strong></p>
<ul>
<li>합성곱 결과에 활성화 함수를 적용해서 비선형성을 주입</li>
</ul>
<p><strong>④ Pooling/Residual/Attention (모델에 따라 다름)</strong></p>
<ul>
<li>ConvS2S 같은 모델은 convolution stack 위에 attention layer를 붙여 인코더-디코더 연결</li>
</ul>
<p>⑤ <strong>출력 (디코더)</strong></p>
<ul>
<li>인코더에서 추출한 hidden representation을 기반으로 디코더가 한 글자/단어씩 예측</li>
<li>softmax 함수를 거쳐 다음 글자/단어의 확률 분포를 출력</li>
</ul>
<hr>
<p><strong>✓ 어떻게 글자를 알아맞추는가?</strong></p>
<p><strong>① 인코더 CNN</strong></p>
<ul>
<li>입력 문장 (ex. 영어) convolution layers로 통과시켜 문맥 정보를 담은 hidden representation을 만듦</li>
<li>CNN은 <strong>이 단어 주변의 패턴을 통해 n-gram 특징</strong>을 잡고, <strong>여러 층을 쌓으며 장거리 의존성</strong>도 점점 반영</li>
</ul>
<p><strong>② 디코더 CNN</strong></p>
<ul>
<li><p>디코더는 이미 생성한 출력 단어들 (ex. 독일어 번역 앞부분)을 입력으로 받아 다음 단어 예측</p>
</li>
<li><p>각 단계에서 <strong>softmax</strong>를 사용해 다음에 올 단어의 확률 분포를 계산</p>
</li>
<li><p>확률이 가장 높은 단어를 선택하거나, <strong>beam search</strong>로 더 나은 문장 후보 탐색</p>
<ul>
<li><p><strong>beam search:</strong> 매번 확률이 높은 상위 k개(beam size) 후보를 유지하면서 문장 확장</p>
<p>→ k=2라면, “I am happy..”와 “I am sad…” 2가지 경로를 동시에 추적</p>
<p>→ 다음 단계에서도 각각 여러 후보를 붙여서 가장 유망한 k개만 남김</p>
</li>
<li><p>(↔) <strong>Greedy search</strong>: 매번 확률이 가장 높은 단어 하나만 고름</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p><code>Extended Neural GPU</code>, <code>ByteNet</code>, <code>ConvS2S</code> : RNN의 순차 연산을 줄이기 위해 <strong>CNN을 기본블록</strong>으로!</p>
</li>
<li><p>입력/출력 위치 전체에 대해 <strong>병렬</strong>로 hidden representation 계산 가능</p>
<p>BUT, <strong>두 위치 사이 거리가 멀수록 신호 연결에 필요한 연산 수 증가</strong></p>
<ul>
<li><strong>ConvS2S</strong>: 선형적 증가 (입력이 증가하는 비율과 결과가 증가하는 비율이 일정한 “직선적인” 성장)</li>
<li><strong>ByteNet</strong>: 로그 증가 (입력이 증가하더라도 결과의 증가 속도가 점점 느려지는 “증가율 둔화”)</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 왜 CNN이 RNN보다 순차 연산을 줄일까?</strong></p>
<ul>
<li><p>수식 구조 자체가 CNN은 동시 계산을 허용</p>
<ul>
<li><p><strong>RNN</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e5a9293d-5b9d-4cdd-86db-64d068bd79f9/image.png" alt=""></p>
<ul>
<li>h_t를 구하려면 반드시 h_t-1이 먼저 있어야 하므로,, 순차 계산</li>
</ul>
</li>
<li><p><strong>1D CNN</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b6f3d06d-879a-4ae7-b101-1cc99a42f246/image.png" alt=""></p>
<ul>
<li>각 위치 t의 출력은 같은 층의 이웃 입력에만 의존</li>
<li>모든 위치 t =1,,,n를 한 번에 계산 가능</li>
</ul>
</li>
</ul>
</li>
<li><p>CNN 기반이 RNN보다 훨씬 큰 배치와 병렬처리가 가능해서 학습속도 빠름</p>
</li>
<li><p>디코더가 자기회귀(다음 토큰을 이전 토큰에 의존)여도,</p>
<ul>
<li><strong>RNN</strong>: teacher forcing을 써도 hidden state 의존성 때문에 시간축 순차 연산 남음</li>
<li><strong>CNN(masked conv)</strong>: 같은 레이어 안에서 모든 위치를 병렬로 동시에 처리 가능</li>
</ul>
</li>
<li><p>인코더의 경우, CNN은 전체 입력 시퀀스를 한 번에 컨볼루션 스택으로 통과시킬 수 있음</p>
</li>
</ul>
<p><strong>✓ 두 위치의 거리가 멀다는 것</strong></p>
<ul>
<li><p>시퀀스(sequence): 토큰들의 나열(ex. 단어, 음소, 글자)</p>
</li>
<li><p>위치의 거리: 시퀀스 상에서 토큰 간의 인덱스 차이</p>
<p><code>I</code>  <strong><code>[1]</code></strong> <code>really</code> <strong><code>[2]</code></strong> <code>like</code> <strong><code>[3]</code></strong> <code>bitamin</code> <strong><code>[4]</code></strong></p>
<ul>
<li>I (1번 위치) ↔ bitamin (4번 위치)의 거리는 3</li>
<li>가까운 단어는 거리 1~2, 멀리 떨어진 단어는 거리 10, 100 이런식으로</li>
</ul>
</li>
</ul>
<p><strong>✓ 왜 연산 수가 증가할까?</strong></p>
<ul>
<li><p>CNN 기반 모델은 <strong>“합성곱 필터”</strong>로 시퀀스 처리</p>
<ul>
<li><p><strong>1-layer convolution</strong>: 윈도우 크기(k) 안에 있는 인접 토큰만 한 번에 연결 가능</p>
</li>
<li><p><strong>멀리 떨어진 단어는 여러 층을 거쳐야</strong> 연결 됨</p>
<p>⇒ 즉, 두 위치가 멀수록 그 정보를 서로 전달하려면 여러 convolution layer를 통과해야 한다 → 연산 수 증가</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ ConvS2S의 선형적 증가</strong></p>
<ul>
<li><p>ConvS2S는 <strong>contiguous convolution (연속된 커널)</strong> 사용</p>
</li>
<li><p><strong>윈도우 크기가 k</strong>라면, <strong>거리가 n인 두 단어를 연결</strong>하려면 대략 <strong>n/k개의 층</strong> 필요</p>
<p>→ 거리 n에 비례(선형)하게 연산 깊이 늘어남</p>
<p>ex. 커널 크기 k=3일 때,</p>
<ul>
<li>거리가 3 → 1층 convolution으로 연결 가능</li>
<li>거리가 9 → 최소 3층 필요</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/007b49f7-f51c-44ed-9dd3-d3490d38e8d6/image.png" alt=""></p>
</li>
</ul>
<p><strong>✓ ByteNet의 로그 증가</strong></p>
<ul>
<li><p>ByteNet은 <strong>dilated convolution (팽창 합성곱)</strong> 사용</p>
</li>
<li><p>dilation을 늘리면 한 층에서 더 넓은 범위의 토큰을 커버할 수 있음</p>
<p>→ 거리 n에 대해 로그(logarithmic) 스케일로 증가<br>→ 거리가 멀어져도 <strong>ConvS2S보다 훨씬 적은 층 수로 커버</strong> 가능</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/53405475-2d1d-4711-a11a-944645882b27/image.png" alt="">
<code>&lt;참고&gt;</code> <a href="https://zzsza.github.io/data/2018/02/23/introduction-convolution/">https://zzsza.github.io/data/2018/02/23/introduction-convolution/</a></p>
</li>
</ul>
</blockquote>
<p><strong>⇒ 장거리 의존성 학습이 여전히 어려움</strong></p>
<p><strong>✓ Transformer</strong></p>
<ul>
<li><p>일정한 수의 연산으로 줄어듦 but, 어텐션 가중치가 적용된 위치의 평균화로 <strong>(P)유효 해상도 감소</strong></p>
<p>→ 3.2절 Multi-Head Attention으로 상쇄</p>
</li>
</ul>
<p><strong>✓ Self-Attention</strong>
<img src="https://velog.velcdn.com/images/hyooo__s/post/cff9ee06-5765-4667-8c90-d5148347177f/image.png" alt=""></p>
<ul>
<li>한 시퀀스 내 서로 다른 위치를 연결해 표현을 계산하는 매커니즘</li>
<li>독해, 요약, 텍스트 함의, 문장 표현 학습 등 다양한 작업에서 성과 입증</li>
</ul>
<hr>
<ul>
<li><strong>End-to-End memory networks</strong><ul>
<li>시퀀스 정렬된 RNN 대신, self-attention 메커니즘 기반</li>
<li>간단한 언어 질의 응답 및 언어 모델링 작업에서 우수한 성능</li>
</ul>
</li>
</ul>
<p><strong>⇒ Transformer: RNN, CNN에 전혀 의존하지 않고 self-attention만으로 입출력 표현을 학습한 최초 모델</strong></p>
<hr>
<h2 id="3-model-architecture">3. Model Architecture</h2>
<p><strong>✓ 기존 신경 시퀀스 변환 모델</strong></p>
<ul>
<li>대부분 <strong>인코더-디코더(encoder-decoder)</strong>구조 채택<ul>
<li><strong>인코더</strong>: 입력 심볼 시퀀스 (x1, ,,, , xn) → 연속 표현 시퀀스 (z1, ,,, zn)로 변환</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 연속 표현 시퀀스</strong></p>
<ul>
<li><strong>기호(symbol) 시퀀스</strong><ul>
<li>우리가 다루는 원래 데이터: 단어, 글자 같은 이산적인 symbol<ul>
<li>i love bitamin → [”i”,”love”,”bitamin”]</li>
</ul>
</li>
</ul>
</li>
<li><strong>연속 표현?</strong><ul>
<li>이산적 토큰을 실수 벡터로 바꾼 것</li>
<li>보통 임베딩을 통해 변환<ul>
<li>love → [0.12, -0.845, 0.33,….]</li>
</ul>
</li>
</ul>
</li>
<li><strong>연속 표현 시퀀스</strong><ul>
<li>입력 전체 문장을 바꿔 놓은 결과, 즉 각 단어가 임베딩된 벡터들의 시퀀스</li>
</ul>
</li>
</ul>
<hr>
<p><strong>✓ 연속 표현 시퀀스로 바꿔야, 모델이 벡터 공간에서 연산(내적, 합성, 어텐션 등) 수행 가능</strong></p>
<p><strong>즉, 인코더의 역할은 입력을 풍부한 의미적 벡터 시퀀스로 바꿔주는 것!!</strong></p>
</blockquote>
<ul>
<li><strong>디코더</strong>: 인코더의 표현 z를 바탕으로 출력 심볼 시퀀스 (y1, ,,, ym) 하나씩 순차적으로 생성<ul>
<li>새로운 심볼 생성할 때, 이미 생성된 심볼들을 추가 입력으로 활용</li>
</ul>
</li>
</ul>
<p><strong>✓ Transformer</strong></p>
<ul>
<li><p><strong>인코더-디코더 전체 구조</strong>는 동일하게 유지</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/8991a17a-9795-4109-9e0a-bc15e15ceb95/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>단 인코더, 디코더 내부 구성 요소를 <strong>self-attention + position-wise feed-forward layer</strong>로 대체</p>
<p>⇒ 관계 학습(self-attention) + 개별 토큰 변환(FFN) 두 층을 교차로 쌓음</p>
</li>
</ul>
<blockquote>
<p><strong>✓ Position-wise feed forward layer</strong></p>
<ul>
<li>Feed-Forward Neural Network (FFN): 선형 변환 + 비선형 변환(ReLU 등)으로 구성된 작은 신경망</li>
<li>Position-wise: 시퀀스의 각 위치(토큰)에 대해 독립적으로 동일한 FFN 적용한다</li>
</ul>
<hr>
<p><strong>[수식]</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/2ce5f8c5-c09a-46a1-ad9e-d680c1e62ea7/image.png" alt=""></p>
<ul>
<li>x: 한 토큰의 벡터 표현 (차원 = d_model)</li>
<li>W1, W2: 학습 가능한 가중치 행렬</li>
<li>b1, b2: 편향<ul>
<li>w1,b1: 첫 번째 선형 변환으로 <strong>차원 늘림</strong></li>
<li>w2,b2: 두 번째 선형 변환으로 <strong>차원 줄임</strong></li>
</ul>
</li>
<li>ReLU 활성화(max) → 비선형성 부여</li>
</ul>
<hr>
<p><strong>✓ 왜 position-wise라고 할까?</strong></p>
<ul>
<li><p>Transformer는 시퀀스 전체를 동시에 처리하기 때문에, 각 토큰은 행렬 X = [x1, x2, ,,, , xn]로 들어옴</p>
<p>but, FFN은 각 xi에 동일한 가중치를 적용해 독립적으로 처리</p>
</li>
</ul>
<p>즉, <strong>시퀀스 길이와 상관없이 각 위치별로 같은 작은 신경망을 복사해 놓은 것처럼 동작</strong></p>
<hr>
<ul>
<li><p>Self-Attention은 각 토큰이 다른 토큰과 관계를 맺는 과정</p>
</li>
<li><p>그 뒤 FFN은 각 토큰 벡터를 비선형적으로 변환해 표현력 강화</p>
<p>⇒ 시퀀스의 각 단어 벡터를 독립적으로, 동일한 작은 신경망(2층 FFN)으로 변환</p>
</li>
</ul>
</blockquote>
<h3 id="31-encoder-and-decoder-stacks"><strong>3.1 Encoder and Decoder Stacks</strong></h3>
<p><strong>✓ 인코더</strong></p>
<blockquote>
<p><strong>✓ Sub-layer</strong></p>
<ul>
<li>하나의 큰 레이어(층) 안에 들어있는 구성 요소 블록<ul>
<li>하나의 레이어 안을 이루는 모듈을 의미</li>
</ul>
</li>
</ul>
<p><strong>✓ Embedding layer</strong></p>
<ul>
<li>이산적 심볼(단어/토큰)을 모델이 쓸 수 있는 실수 벡터로 바꿔주는 층</li>
</ul>
</blockquote>
<ul>
<li><p><strong>구성</strong>: 동일한 레이어 6개 (stack)</p>
</li>
<li><p><strong>각 레이어 (2개의 sub-layer)</strong></p>
<ul>
<li>Multi-Head Self-Attention</li>
<li>Position-wise Feed-Forward Network</li>
</ul>
</li>
<li><p><strong>Residual Connection + Layer Normalization</strong></p>
<ul>
<li>각 sub-layer 출력:  $LayerNorm(x + Sublayer(x))$</li>
<li>sub-layer 결과와 입력을 더한 뒤 정규화</li>
</ul>
</li>
<li><p><strong>출력 차원</strong>: 모든 sub-layer 및 embedding layer는 d_model = 512</p>
<p>→ residual connection을 용이하기 위함</p>
</li>
</ul>
<p><strong>✓ 디코더</strong></p>
<ul>
<li><strong>구성</strong>: 동일한 레이어 6개(stack)</li>
<li><strong>각 레이어</strong><ul>
<li>Masked Multi-Head Self-Attention - 미래 토큰 참조 금지</li>
<li>Encoder-Decoder Multi Head Attention - 인코더 출력 참조</li>
<li>Position-wise Feed Forward Network</li>
</ul>
</li>
<li><strong>Residual Connection + Layer Normalization</strong>: 인코더와 동일하게 적용</li>
<li><strong>Masking</strong><ul>
<li>시점 i에서 예측은 반드시 <strong>이전 위치 (&lt;i) 출력에만 의존</strong></li>
<li>auto-regressive 성질을 보장</li>
</ul>
</li>
</ul>
<h3 id="32-attention"><strong>3.2 Attention</strong></h3>
<p><strong>✓ Attention function</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1d3f4058-4ad0-4e2c-825a-a2984c12a494/image.png" alt=""></p>
<blockquote>
<p><strong>✓ Key와 Value의 차이</strong></p>
<ul>
<li><strong>Key (K) - <code>유사도 측정용</code></strong><ul>
<li>내가 어떤 정보를 가지고 있는지 설명하는 label (책의 제목, 주제어 같은,,)</li>
<li><strong>Query와 내적</strong>되어 <strong>“이 토큰을 얼마나 참고할지”</strong> 점수 계산에만 쓰임</li>
</ul>
</li>
<li><strong>Value (V) - <code>정보 전달용</code></strong><ul>
<li>내가 실제로 제공할 정보(content)</li>
<li>Attention 가중치가 곱해져 최종 출력에 반영되는 실질적인 정보</li>
</ul>
</li>
</ul>
<hr>
<p><strong>✓ 정리</strong></p>
<ul>
<li><p>K와 V는 인코더 hidden state에서 각각 다른 projection으로 나온 것</p>
<ul>
<li><p>K = 색인(검색용)</p>
<ul>
<li>$k = hW^K$</li>
</ul>
</li>
<li><p>V = 내용(전달용)</p>
<ul>
<li>$v=hW^V$</li>
</ul>
</li>
<li><p>$W^K, W^V$ : 학습되는 가중치 행렬</p>
</li>
<li><p>hidden state  $h$  (차원 d_model)</p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p><strong>projection</strong>: hidden state를 W행렬에 곱해서 Q/K/V로 바꾸는 과정 (선형변환)</p>
</li>
<li><p><strong>Dot product</strong>: Attention 단계에서 Q와 K 사이 <strong>유사도를 계산</strong>하는 연산</p>
</li>
<li><p>그래서 같은 소스에서 나오지만,<br>attention에서 <strong>“누굴 참고할지</strong>”와 <strong>“실제로 무슨 정보를 가져올지”</strong> 역할이 갈라짐</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Projection 개념</strong></p>
<ul>
<li><strong>수학/기하학에서의 projection</strong><ul>
<li>어떤 벡터를 다른 공간이나 축(axis)에 비춰 나타내는 것</li>
<li>ex. (3,4)라는 2D 벡터를 x 축에 projection 하면 → 3, y축에 투영하면 → 4</li>
<li>원래 벡터의 <strong>“한 방향 성분만 뽑아내는 것”</strong></li>
</ul>
</li>
<li><strong>선형대수학에서의 projection</strong><ul>
<li>보통 <strong>행렬 곱</strong>으로 표현: $y=xW$<ul>
<li>W: 특정한 선형 변환 행렬</li>
<li>결과 y는 원래 x를 새로운 공간/차원에서 사상(mapping)</li>
</ul>
</li>
</ul>
</li>
<li><strong>머신러닝/딥러닝에서의 projection</strong><ul>
<li>가중치 행렬을 곱해서 벡터를 <strong>다른 차원 공간으로</strong> 보내는 것<ul>
<li><strong>word embedding:</strong> 단어 ID(원-핫, 10만 차원) → 저차원(300차원)으로 projection</li>
<li><strong>attention</strong>: hidden state(512차원)를 Q/K/V 각각으로 projection</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>⇒ projection = 선형변환을 통해 차원과 의미를 바꿔주는 과정</strong></p>
<p><strong>✓ 선형변환</strong></p>
<ul>
<li><p>f(x+y) = f(x) + f(y)</p>
</li>
<li><p>f(cx) = cf(x)</p>
</li>
<li><p><strong>Attention에서 projection</strong></p>
<ul>
<li><p>인코더 출력(hidden state, 차원 d_model)을 그대로 쓰지 않고,</p>
<p>$Q = HW^Q$,  $K=HW^K$,  $V=HW^V$ 이렇게 다른 <strong>3가지 공간으로 투영(projection)</strong></p>
</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>Attention function: <strong>입력 쿼리</strong>와 <strong>키-값(key-value) 쌍</strong>을 받아 출력을 만들어 내는 함수</p>
<ul>
<li><p>Query, Key, Output 모두 벡터로 표현됨</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6479969e-ca51-46d5-99f0-fa36f059d560/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p>출력: value의 가중합으로 계산</p>
<ul>
<li>value에 할당된 가중치는 해당 key와 query의 호환성 함수에 의해 계산</li>
</ul>
</li>
</ul>
<p><strong>3.2.1 Scaled Dot-Product Attention</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/4156fc56-b58a-4813-aa62-276d8be6f1b4/image.png" alt=""></p>
<p><strong>✓ 입력</strong></p>
<ul>
<li>쿼리 Q: 차원 $d_k$<ul>
<li>내 목적이 뭔지? - 문장구조를 보고 싶어! 에 맞는 걸 하겟다고 하면</li>
</ul>
</li>
<li>키 K: 차원  $d_k$<ul>
<li>문장구조 특징이 담겨있는 벡터로 표현되어 있는거고</li>
<li>그걸 내적하면 문장 구조에 대한 목적을 가지고 있는 단어들 간의 유사도를 뽑아냄</li>
</ul>
</li>
<li>값 V: 차원 $d_v$<ul>
<li>value는 목적과 관계없이 단어가 임베딩상의 위치, 이 단어가 어떤 놈인지 단순 정보를 표현하는 것 아닐까?</li>
</ul>
</li>
</ul>
<p><strong>✓ 계산 과정</strong></p>
<p>① 쿼리와 모든 키의 <strong>내적(dot product)</strong> 계산 → 유사도 점수</p>
<blockquote>
<p><strong>✓ 왜 내적이 유사도 검사가 되는 것일까?</strong></p>
<ul>
<li><p>두 벡터 a,b</p>
<p>!image.png</p>
<ul>
<li><p>세타가 <strong>작아</strong> <strong>두 벡터가 비슷한 방향</strong> → <strong>내적 값이 큼</strong></p>
</li>
<li><p>세타가 커서 방향이 다르면 → 내적 값 작음 (심지어 음수)</p>
<p>⇒ 방향이 얼마나 비슷한지 (코사인 유사도)를 자연스럽게 반영 가능</p>
</li>
</ul>
</li>
</ul>
<p><strong>✓ 왜 쿼리(Q)와 키(K)로 하는 걸까?</strong></p>
</blockquote>
<blockquote>
<ul>
<li><strong>Query(Q)</strong>: 지금 위치에서 “내가 찾고 싶은 정보”</li>
<li><strong>Key(K)</strong>: 각 입력 토큰이 가진 색인(label)</li>
<li><strong>Q와 K의 내적</strong> → 현재 위치(query)가 특정 토큰(key)과 얼마나 잘 맞는지를 수치화<ul>
<li>이 유사도를 softmax에 넣어서 가중치로 사용</li>
</ul>
</li>
</ul>
<p>⇒ <strong>내적(Q,K)로 어떤 V를 참고해야 할 지 결정 → 그 가중합이 최종 결과</strong></p>
<p>+) V는 실제 “정보 내용”이라서 유사도를 잴 필요X</p>
<p>Q와 K의 유사도로 가중치를 얻어서 이 <strong>가중치로 V를 섞어주는 것이 핵심!</strong></p>
<hr>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/513f0403-9acb-4475-b1db-8d61bdd110a2/image.png" alt=""></p>
</blockquote>
<p>② 내적 값을  $sqrt(d_k)$로 나눔 (스케일링)</p>
<p>: <strong>$d_k$  가 커질수록 내적 값이 커져 softmax가 매우 작은 기울기</strong>를 갖게 되므로 학습이 어려워짐<br>→ 안정화 필요</p>
<p>③ softmax 적용 → 가중치(확률 분포) 획득</p>
<p>④ 그 가중치로 값 V들의 가중합 → 최종 출력</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c70c2ef6-e8b1-463d-86e9-b7cacaa4831c/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 왜 굳이 softmax → 가중치 획득 → V의 가중합 과정을 지나는가?</strong></p>
<ul>
<li><p><strong>단순 내적만 하면 생기는 문제</strong></p>
<ul>
<li>q와 k의 내적한 값 → 유사도 점수</li>
<li>점수자체는 음수/양수 크기만 있을 뿐, <em>그 자체로 확률적 의미는 없음</em></li>
</ul>
</li>
<li><p><strong>Softmax로 바꾸는 이유</strong></p>
<ul>
<li>점수들을 확률 분포로 변환 → 항상 0~1 사이의 값, 전체 합 = 1</li>
<li>각 key에 어느정도 집중(attend)할지를 확률처럼 해석 가능<ul>
<li>문장에서 “it”이라는 단어가 등장할 때, 모델이 “dog”라는 단어에 0.8, “ball”에 0.1,  tree에 0.1만큼 주목한다 → 직관적인 해석 가능</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Value V들의 가중합을 취하는 이유</strong></p>
<ul>
<li><p>Key: “어디를 볼지”를 정하는 역할</p>
</li>
<li><p>Value: “그 위치의 실제 정보”</p>
</li>
<li><p>softmax로 나온 가중치를 Value에 곱하면</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/55cb51f4-1f6b-4cfd-9318-261b9ea3aec4/image.png" alt=""></p>
<ul>
<li>알파i 는 해당 위치를 얼마나 참고할지(집중할지) 나타내는 확률</li>
</ul>
<p>⇒ 단순히 가장 큰 Key 하나만 뽑는 게 아니라, 여러 위치의 <strong>정보를 부드럽게 섞어서</strong> 사용 가능</p>
</li>
<li><p>자연어 문장은 여러 단어들이 <strong>맥락적으로 영향을 주기</strong> 때문에 중요함</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 정리</strong></p>
<ul>
<li><p><strong>입력: “나는 비타민을 사랑해”</strong></p>
<ul>
<li>토큰 단위로 나누면 [ x1 = 나는 , x2 = 비타민을, x3 = 사랑해]</li>
<li>각 토큰은 임베딩 벡터가 되고, 그걸 모아둔 게 행렬 H</li>
</ul>
</li>
<li><p><strong>H^(0)</strong></p>
<ul>
<li>0번째 레이어에서의 표현<ul>
<li><strong>토큰 임베딩 + 포지셔널 인코딩</strong>을 합친 초기 입력 표현</li>
</ul>
</li>
<li>H^(0) = [h1(0), h2(0), h3(0)]<ul>
<li>h1(0): “나는”의 초기 벡터</li>
<li>h2(0): “비타민을” 의 초기 벡터</li>
<li>h3(0): “사랑해”의 초기 벡터</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>H^(1)</strong></p>
<ul>
<li><p>첫 번째 레이어를 통과한 후의 표현</p>
</li>
<li><p>여기서 self-attention과 feed forward를 거치면서,<br>각 단어 벡터가 <strong>다른 단어들과의 관계 정보를 섞은 새로운 표현</strong>으로 바뀐 상태</p>
<p>⇒ “나는” 벡터도 여전히 h1(1)에 있지만, 이 안에 “비타민을”, “사랑해”와의 관련성 반영</p>
</li>
</ul>
</li>
</ul>
<hr>
<p><strong>✓ 층이 깊이질수록</strong></p>
<ul>
<li>H(2), H(3), ,,, H(N) 이렇게 갈수록 점점 더 풍부한 문맥 정보가 추가된 표현</li>
</ul>
</blockquote>
<p><strong>✓ Attention function</strong></p>
<ul>
<li><p><strong>additive attention</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/20cd097c-d516-46c0-a546-557c08cc3c75/image.png" alt=""></p>
<ul>
<li>단일 hidden layer를 가진 feed-forward network를 사용하여 호환성 함수 계산</li>
</ul>
</li>
<li><p><strong>dot-product (multiplicative) attention</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/a4e18495-0950-46fb-a4b0-cf7915f65e82/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>$1/sqrt(d_k)$의 스케일링 인자를 제외하고 알고리즘 동일</p>
<p>⇒ additive attention과 dot-product attention 이론적인 복잡성은 유사하지만,</p>
<p>dot-product attention은 최적화된 행렬 곱셈 코드를 사용하여 구현 가능 → 빠르고 공간 효율적</p>
</li>
</ul>
<p><strong>✓ 성능 차이</strong></p>
<ul>
<li><p>$d_k$ <strong>가 작을 때</strong>: additive와 dot-product 성능 비슷</p>
</li>
<li><p>$d_k$<strong>가 클 때</strong>: 스케일링 없는 dot-product는 성능 저하 → additive가 더 유리</p>
<p>⇒ Transformer는 스케일링 factor $1/sqrt(d_k)$를 넣어 안정적으로 학습</p>
</li>
</ul>
<hr>
<p><strong>3.2.2 Multi-Head Attention</strong></p>
<ul>
<li><p>단일 어텐션은 입력(Query, Key, Value)을 <strong>d_model 차원</strong>에서 직접 계산</p>
</li>
<li><p>이렇게 하면 표현력은 제한되고, dot-product(내적) 크기가 커지는 문제 발생</p>
<p>→ $d_k, d_k, d_v$ 차원으로 서로 다른 학습된 선형 투영을 통해 h번 선형적으로 투영하는 것이 유용하다는 것을 발견</p>
</li>
</ul>
<blockquote>
<p><strong>✓ Multi-head → 서로 다른 부분 공간/ 단일 head → 평균화</strong></p>
<ul>
<li><p><strong>Multi-head</strong></p>
<ul>
<li><p>각 head는 projection 행렬 Wq, Wk, Wv가 다름</p>
</li>
<li><p>즉, 같은 입력 hidden state라도 head마다 다른 “안경”을 끼고 해석</p>
</li>
<li><p>어떤 head는 구문에, 어떤 head는 의미에 민감 등 → 다양하게 볼 수 있음</p>
<p><strong>⇒ 다양한 관점에서 계산된 정보를 종합해서 더 풍부한 표현 얻음</strong></p>
</li>
</ul>
</li>
<li><p><strong>Single-head</strong></p>
<ul>
<li>한 번만 attention을 하면, 다양한 관계를 모두 한 분포에 “평균”시켜야 함<ul>
<li>문장의 문법적 요소, 구조적인 요소들을 나눠서 봐야하는데, 하나로 되어 있으면 구조적인 요소가 합쳐진 것을 분석해야하는데, 이걸 평균낸 것처럼 보인다고?</li>
</ul>
</li>
<li>결과적으로, 여러 패턴(문법, 의미, 참조 관계)를 동시에 학습하기 어려워</li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>✓ 차원축소와 병렬화</strong></p>
<ul>
<li><p>Q, K, V를 각각 서로 다르게 학습된 선형 변환 행렬($W_i^Q, W_i^K, W_i^V$)</p>
</li>
<li><p><strong>투영 차원</strong></p>
<p>d_k = d_v = d_model / h</p>
<ul>
<li><p>Base 모델: d_model = 512, h = 8 → d_k = d_v =64</p>
<p>⇒ 전체 벡터를 여러 <strong>“부분 공간(subspace)”</strong>로 쪼개 <strong>병렬로 attention 수행</strong></p>
</li>
</ul>
</li>
</ul>
<p><strong>✓ 병렬 Attention 후 결합</strong></p>
<ul>
<li>각 head에서 어텐션 결과(출력값, 차원 d_v)를 구한 뒤<br><strong>Concat(head1, ,,, ,headh)</strong> → <strong>W^O</strong> 선형 변환 → 최종 출력</li>
</ul>
<p><strong>⇒ Q, K, V를 여러 부분 공간으로 선형 변환해 병렬 어텐션을 수행하고, 이를 합쳐 최종 출력으로 만드는 방식</strong></p>
<blockquote>
<p><strong>✓ 정리</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/129b2723-3eb3-44e9-9928-2bd3c6eda1d6/image.png" alt=""></p>
<ul>
<li><p><strong>입력(Q, K, V)</strong> - 차원 d_model(512)</p>
</li>
<li><p><strong>선형변환</strong></p>
<ul>
<li>각 head마다 서로 다른 가중치 행렬을 사용해 Q,K,V 투영</li>
<li>같은 입력이더라도, head마다 다른 부분 공간(subspace)으로 변환됨</li>
</ul>
</li>
<li><p><strong>각 head의 attention 계산</strong></p>
<ul>
<li><p>head = attention(Q Wq, K Wk, V Wv)</p>
<p>변환된 Q,K,V를 가지고 Scaled Dot-product attention 수행</p>
</li>
<li><p>출력 차원: d_v</p>
</li>
</ul>
</li>
<li><p>모든 head 결합(Concat)</p>
<ul>
<li>h개의 head 출력을 이어붙여서 하나의 큰 벡터 만듦</li>
</ul>
</li>
<li><p>최종 선형변환</p>
<ul>
<li>결합된 벡터를 W^o로 다시 투영</li>
<li>최종 출력 차원을 모델 크기 d_model로 맞춤</li>
</ul>
</li>
</ul>
</blockquote>
<hr>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/9606a7e3-52ec-4692-9bf1-0a2832836d73/image.png" alt=""></p>
<hr>
<p><strong>3.2.3 Applications of Attention in our Model</strong></p>
<p><strong>✓ Transformer의 Attention 활용 방식 3종류</strong></p>
<p><strong>① Encoder-Decoder Attention</strong></p>
<ul>
<li>Query: 이전 디코더 레이어 출력</li>
<li>Key, Value: 인코더 출력(memory)</li>
<li>기능: 디코더가 출력 단어를 생성할 때 입력 시퀀스 전체를 참고할 수있도록 함</li>
<li>기존의 seq2seq 모델의 encoder-decoder attention 계승</li>
</ul>
<p><strong>② Encoder Self-Attention</strong></p>
<ul>
<li><p>Query, Key, Value: 모두 인코더 이전 레이어 출력</p>
</li>
<li><p>기능: 입력 시퀀스의 각 위치가 다른 모든 위치와 상호작용 할 수 있음</p>
<p>→ 입력 문장 내 단어 간 전역 문맥 학습</p>
</li>
</ul>
<p><strong>③ Decoder Self-Attention</strong></p>
<ul>
<li>Query, Key, Value: 모두 디코더의 이전 레이어 출력</li>
<li>기능: 디코더 각 위치가 자신 포함 모든 이전 위치를 참고할 수 있음</li>
<li>masking: 미래 단어로 정보가 흘러가면 안됨<ul>
<li>softmax 입력에서 불법 연결에 해당하는 값을 -무한대로 설정</li>
<li>auto-regressive 성질 유지</li>
</ul>
</li>
</ul>
<h3 id="33-position-wise-feed-forward-networks"><strong>3.3 Position-wise Feed-Forward Networks</strong></h3>
<p><strong>✓ 구조</strong></p>
<ul>
<li><p>Attention sub-layer 외에, 인코더와 디코더의 각 레이어는 FFN 포함</p>
</li>
<li><p><code>Feed-Forward sub-layer</code> //  <code>Encoder-Decoder Attention sub-layer</code></p>
</li>
<li><p>각 토큰 위치별로 <strong>독립적이지만 동일한 방식</strong>으로 적용</p>
<p>!image.png</p>
<ul>
<li>2개의 선형 변환 + ReLU 활성화</li>
<li>x는 어텐션 결과값, w1을 곱하고 b1 을 더해줌</li>
</ul>
</li>
</ul>
<p><strong>✓ 특징</strong></p>
<ul>
<li><p>위치마다 같은 가중치를 적용 → 병렬화 용이</p>
</li>
<li><p>단, 레이어마다 다른 파라미터 학습</p>
<p>→ 즉, 인코더 6개층에 들어간 FFN은 각각 고유의 W1, W2를 가짐</p>
<p>⇒ 커널크기 1인 2개의 convolution으로 설명</p>
<p>입력 및 출력 차원 d_model = 512, inner-layer 차원: d_ff = 2048</p>
<p><strong>→ 즉 512 차원을 2048차원으로 확장했다가 다시 512로 압축 (표현력 강화 목적)</strong></p>
</li>
</ul>
<h3 id="34-embedding-and-softmax"><strong>3.4 Embedding and Softmax</strong></h3>
<p><strong>① 입력/출력 임베딩</strong></p>
<ul>
<li>다른 시퀀스 변환 모델과 마찬가지로 입력/출력 토큰을 학습된 embedding layer로 변환</li>
</ul>
<p><strong>② 출력 예측</strong></p>
<ul>
<li>디코더의 출력을 학습된 선형 변환 + softmax를 통해 다음 토큰 확률 분포로 변환</li>
</ul>
<p><strong>③ 가중치 공유</strong></p>
<ul>
<li>입력 임베딩, 출력 임베딩, softmax 직전 선형 변환의 가중치 행렬 공유</li>
</ul>
<p><strong>④ 스케일링</strong></p>
<ul>
<li>Embedding 벡터에 sqrt(d_model)을 곱해 스케일 조정<ul>
<li>초기화시 임베딩 벡터 크기가 너무 작아지는 것을 방지하고 안정적 학습 유도하기 위함</li>
</ul>
</li>
</ul>
<h3 id="35-positional-encoding"><strong>3.5 Positional Encoding</strong></h3>
<p><strong>✓ P</strong></p>
<ul>
<li><p>Transformer는 RNN이나 CNN처럼 순차 구조가 없음</p>
<p>→ 토큰 순서 정보가 사라질 수 있어서 “위치정보” 주입해야함</p>
</li>
</ul>
<p><strong>✓ S</strong></p>
<ul>
<li><p>인코더와 디코더 스택 하단의 입력 임베딩에 “positional encodings” 추가</p>
<ul>
<li>임베딩과 동일한 차원인 d_model을 가져서 두 값 합산 가능</li>
</ul>
</li>
<li><p>구현 방법: ① 학습형 ② 고정형 2가지 有</p>
<ul>
<li><p>서로 다른 주파수의 사인 및 코사인 함수 사용</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/03e3f35b-6581-44da-87f4-eddbdc75da27/image.png" alt=""></p>
<ul>
<li>pos = 시퀀스 상 위치</li>
<li>i = 임베딩 차원 인덱스</li>
</ul>
</li>
<li><p>각 차원은 다른 파장의 정현파 가짐 (2pi ~ 10000x2pi까지 기하급수적 증가)</p>
<p>⇒ 특정 위치 오프셋 k에 대해 PE_pos+k 를 PE_pos의 선형함수로 표현 가능해서 상대적인 위치 관계를 모델이 쉽게 확인 가능하다고 가정했음</p>
</li>
<li><p>사인버전 채택 → 훈련보다 더 긴 시퀀스를 일반화 가능하기 때문</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-why-self-attention">4. Why Self-Attention</h2>
<p><strong>→ Self-Attention  vs RNN/CNN 비교 정리</strong></p>
<ul>
<li>계산 복잡도</li>
<li>필요한 최소 순차 연산 수로 측정되는 병렬화할 수 있는 계산량</li>
<li>네트워크에서 장거리 의존성 간의 경로 길이(주요과제)<ul>
<li>순방향 및 역방향 신호가 통과해야하는 경로 길이 - 길이가 짧을 수록 학습에 쉬움</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/00baef59-ced1-43f1-8b61-ffdaf62f8c21/image.png" alt=""></p>
<p>** n: 시퀀스 길이, d: 차원</p>
<p><strong>✓ Recurrent layer (RNN)</strong></p>
<ul>
<li>계산 복잡도: O(nd^2)</li>
<li>순차 연산: O(n) (모든 단계가 직전 hidden state에 의존 → 병렬화 불가)</li>
<li>경로 길이: O(n) (멀리 떨어진 단어 간 의존성 학습이 어려움)</li>
</ul>
<p><strong>✓ Convolutional layer (CNN)</strong></p>
<ul>
<li>계산 복잡도: O(knd^2) (커널 폭 k에 비례)</li>
<li>경로 길이<ul>
<li>일반 convolution: O (n/k) - 선형</li>
<li>dilated convolution: O (logk(n)) - 로그</li>
</ul>
</li>
<li>특징<ul>
<li>장거리 의존성은 여러 층을 쌓아야 겨우 연결 가능</li>
<li>RNN보다 병렬화는 유리하지만, 계산량은 더 클 수 있음</li>
<li>Separable convolution을 쓰면 복잡도를 줄일 수 있으나, 여전히 self-attention보다 비효율적</li>
</ul>
</li>
</ul>
<p><strong>✓ Self-Attention Layer</strong></p>
<ul>
<li>계산 복잡도: O(n^2d)<ul>
<li>보통 n &lt; d이라서 RNN보다 효율적 (ex. word-piece, Byte-pair 표현)</li>
</ul>
</li>
<li>순차 연산: O(1) (모든 위치를 병렬 연산으로 연결 가능)</li>
<li>경로 길이: O(1) (임의의 두 위치가 한 번의 attention으로 직접 연결)</li>
<li>장점<ul>
<li>장거리 의존성 학습에 유리</li>
<li>Attention head 별로 다른 역할을 학습해 해석가능서이 높음</li>
<li>필요 시 local attention (크기 r의 neighborhood)으로 제한 가능 → 계산량 절약, 경로 길이 O(n/r)로 증가</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-training">5. Training</h2>
<p>→ regime에 대해 설명</p>
<h3 id="51-training-data-and-batching"><strong>5.1 Training Data and Batching</strong></h3>
<ul>
<li><strong>영어-독일어</strong><ul>
<li>WMT 2014 데이터셋 (약 450만 문장 쌍)</li>
<li>Byte-Pair Encoding, 공유 어휘 37,000개 사용</li>
</ul>
</li>
<li><strong>영어-불어</strong><ul>
<li>WMT 2014 데이터셋 (약 3600만 문장 쌍)</li>
<li>WordPiece, 어휘 크기 32,000 사용</li>
</ul>
</li>
<li><strong>Batch 구성</strong><ul>
<li>문장 길이를 기준으로 대략 정렬 후 배치</li>
<li>각 배치: 약 25000 source 토큰 + 25000 target 토큰</li>
</ul>
</li>
</ul>
<h3 id="52-hardware-and-schedule"><strong>5.2 Hardware and Schedule</strong></h3>
<ul>
<li>하드웨어: NVIDA P100 GPU x 8</li>
<li>Base 모델<ul>
<li>Step당 약 0.4초</li>
<li>100,000 steps 약 12시간 학습</li>
</ul>
</li>
<li>Big 모델<ul>
<li>step당 약 1초</li>
<li>300,000 steps 약 3.5일 학습</li>
</ul>
</li>
</ul>
<h3 id="53-optimizer"><strong>5.3 Optimizer</strong></h3>
<ul>
<li>Adam optimizer<ul>
<li>베타1 = 0.9, 베타2 = 0.98, 에러 = 10^(-9)</li>
</ul>
</li>
<li>학습률</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/72c03f6f-d2a1-4eb3-bd06-a02674febe19/image.png" alt=""></p>
<ul>
<li>초반 warmup 단계(4000 steps): 선형 증가</li>
<li>이후: 단계수의 역제곱 비율로 감소</li>
</ul>
<h3 id="54-regularization"><strong>5.4 Regularization</strong></h3>
<ul>
<li><strong>Residual Dropout</strong><ul>
<li>각 sub-layer 출력에 dropout 적용 후, sub-layer에 입력 추가 및 정규화</li>
<li>인코더, 디코더의 임베딩 + positional encoding 합에도 dropout 적용</li>
<li>Base 모델 P_drop = 0.1</li>
</ul>
</li>
<li><strong>Label Smoothing</strong><ul>
<li>els = 0.1</li>
<li>모델이 과도하게 확신하지 않도록 → perplexity(복잡)는 다소 높아지지만 정확도 BLEU 향상</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-result">6. Result</h2>
<h3 id="61-machine-translation"><strong>6.1 Machine Translation</strong></h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/53a9349b-730a-4c78-b71c-85024ddd1d2a/image.png" alt=""></p>
<p><strong>✓ 영어-독일어(EN-DE : WMT 2014)</strong></p>
<ul>
<li>Transformer (big): BLEU 28.4<ul>
<li>당시 보고된 모든 모델(앙상블 포함) 대비 +2.0 BLEU 향상 → 새로운 SOTA 달성</li>
<li>학습 비용: P100 GPU 8개 x 3.5일</li>
</ul>
</li>
<li>Transformer (base model)도 기존의 단일 모델, 앙상블 능가</li>
</ul>
<p><strong>✓ 영어-프랑스어(EN-FR : WMT 2014)</strong></p>
<ul>
<li>Transformer (big): BLEU 41<ul>
<li>기존 최고 단일 모델 성능 초과</li>
<li>학습 비용: 경쟁 모델의 1/4 미만</li>
<li>dropout 비율 0.1 사용 (기존 0.3 대신)</li>
</ul>
</li>
</ul>
<p><strong>✓ 학습/추론 세부 설정</strong></p>
<ul>
<li>checkpoint averaging</li>
</ul>
<blockquote>
<p><strong>✓ checkpoint</strong></p>
<ul>
<li>모델을 학습할 때, 일정 step마다 가중치를 저장함<ul>
<li>이 저장본 하나하나를 체크포인트라고 부름</li>
</ul>
</li>
</ul>
<p><strong>✓ checkpoint averaging</strong></p>
<ul>
<li><p>마지막에 모델 하나만 쓰는 게 아니라, 여러 개의 최근 체크포인트를 불러와서 가중치 평균</p>
<p>⇒ 훈련 후반부에는 손실이 출렁출렁할 수있다.</p>
<p>이때, 체크포인트 평균을 하면 잡음을 줄이고, 일종의 앙상블 효과도 기대 가능</p>
</li>
</ul>
</blockquote>
<ul>
<li>base 모델: 마지막 5개 체크포인트(10분 간격) 평균</li>
<li>big 모델: 마지막 20개 체크포인트 평균<ul>
<li>Beam Search</li>
</ul>
</li>
<li>Beam size =4</li>
<li>Length penalty 알파 = 0.6</li>
<li>출력  최대 길이 = 입력 데이터 + 50 (조기 종료 허용)<ul>
<li>학습 비용 추정</li>
</ul>
</li>
<li>FLOPs = 학습 시간 x GPU 수 x GPU 성능(단정밀도 기준)</li>
</ul>
<h3 id="62-model-variations"><strong>6.2 Model Variations</strong></h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/390ce826-c9ec-4cd4-8ce6-4e52a03ff832/image.png" alt=""></p>
<p><strong>✓ 실험 설정</strong></p>
<ul>
<li>데이터셋: newtest 2013 (EN-DE 개발셋)</li>
<li>체크포인트 평균화는 사용하지 않고, beam search만 적용</li>
</ul>
<p><strong>✓ 결과</strong></p>
<p><strong>(A) Attention Heads &amp; 차원 분할</strong></p>
<ul>
<li><p>연산량 일정하게 유지하면서, 어텐션 헤드 수, 어텐션  키, 값 차원을 다양하게 변경</p>
</li>
<li><p>단일 헤드 어텐션 → 최적 설정보다 BLEU -0.9</p>
</li>
<li><p>Head 수가 지나치게 많아도 성능 저하</p>
<p>→ 적절한 head 수 (기본 설정 h=8)가 가장 효과적</p>
</li>
</ul>
<p><strong>(B) Attention Key 차원 d_k</strong></p>
<ul>
<li><p>d_k를 줄이면 품질 저하 발생</p>
<p>→ 단순 dot product만으로는 충분하지 않을 수 있고, 더 정교한 호환성 함수가 유용할 수도~</p>
</li>
</ul>
<p><strong>(C)&amp;(D) 모델 크기와 Dropout</strong></p>
<ul>
<li>더 큰 모델일수록 성능 향상<ul>
<li>dropout은 과적합방지에 매우 효과적</li>
</ul>
</li>
</ul>
<p><strong>(E) Positional Encoding</strong></p>
<ul>
<li><p>사인파 기반 positional encoding를 학습형 위치 임베딩로 대체</p>
<ul>
<li>성능 차이 거의 없음</li>
</ul>
<p>→ 논문에서는 사인파 채택 (긴 시퀀스로 일반화 가능해서)</p>
</li>
</ul>
<h3 id="63-english-constituency-parsing"><strong>6.3 English Constituency Parsing</strong></h3>
<p><strong>✓ 목적</strong></p>
<ul>
<li>Transformer가 번역 외 다른 작업에도 일반화 가능한지 평가하고자 함</li>
<li>구문 분석(Parsing)은 출력이 입력보다 훨씬 길고 구조적 제약이 강함<ul>
<li>특히, RNN, seq2seq 모델은 소규모 데이터 환경에서 좋은 결과를 내지 못했던 과제</li>
</ul>
</li>
</ul>
<p><strong>✓ 데이터 및 모델 세팅</strong></p>
<ul>
<li>데이터: Penn Treebank WSJ (약 40,000 문장) + high-confidence + Berkeleyparser 코퍼스 (약 1700만 개 문장, 준지도 학습)</li>
<li>모델: 4-layer Transformer, d_model = 1024</li>
<li>어휘크기: WSJ 전용(16,000 토큰 어휘), 준지도(32,000 토큰 어휘)</li>
<li>추론(decoding)<ul>
<li>최대 출력 길이 = 입력 + 300</li>
<li>Beam size = 21, length penalty 알파 = 0.3</li>
</ul>
</li>
<li>하이퍼파라미터: dropout, attention, residual, learning rate 등은 EN-DE 번역 기본 설정과 동일</li>
</ul>
<p><strong>✓ 결과</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/9761b07a-7a52-420c-ad88-031f937ad27e/image.png" alt=""></p>
<ul>
<li>RNN, seq2seq 모델보다 훨씬 우수</li>
<li>WSJ 40,000 문장만 학습해도 BaerkeleyParser보다 성능이 높음<ul>
<li>recurrent neural network grammar 보다는 ,, ⬇️</li>
</ul>
</li>
</ul>
<hr>
<h2 id="7-conclusion">7. Conclusion</h2>
<ul>
<li><p>Transformer는 인코더-디코더 아키텍쳐에서 RNN을 완전히 제거하고</p>
<p>multi-head self-attention만으로 구성된 최초의 sequence transduction 모델 제안</p>
<ul>
<li>성능 조아요~</li>
</ul>
</li>
<li><p>Transformer를 텍스트 말고 modality에 확장해고 싶고, 대규모 입출력을 효율적으로 할 수 있도록 하고 싶다<del>, 더 병렬적으로 하고 싶다</del></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Sequence to Sequence Learning
with Neural Networks]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Sequence-to-Sequence-Learningwith-Neural-Networks</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Sequence-to-Sequence-Learningwith-Neural-Networks</guid>
            <pubDate>Wed, 22 Jul 2026 12:38:56 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: Sequence to Sequence Learning with Neural Networks
<strong>학회(출판연도)</strong>: NeurIPS (2014)
<strong>연구분야</strong>: 딥러닝 기반 시퀀스 표현 학습 및 시퀀스-투-시퀀스 모델</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<blockquote>
<p><strong>✓ 토큰(Token)</strong></p>
<ul>
<li>더 이상 분해할 수 없는 <strong>텍스트의 기본 단위</strong><ul>
<li>단어, 문자, 문장의 일부<ul>
<li><em>단어단위</em> 토큰화: i love bitamin → [”i”, “love”,”bitamin”]</li>
<li><em>문자단위</em> 토큰화: i love bitamin →[”i”,”l”,”o”,….,”n”]</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 토큰화(Tokeniazation)</strong></p>
<ul>
<li>텍스트를 토큰들로 나누는 과정<ul>
<li>토큰화 이후, 단어 임베딩이나 벡터화 등의 작업을 통해 텍스트 분석</li>
<li>긴 문장을 <strong>의미있는(정보단위로 기능, 쓸모있는) 기본 단위</strong>인 토큰들로 분해하는 작업</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ NLP에서 “의미있다”</strong></p>
<p>→ 모델이 학습하거나 예측하는데 쓸모가 있다</p>
<ul>
<li>문자 단위의 토큰화의 경우(”b”,”i”,”t”,”a”,”m”,”i”,”n”)<ul>
<li>각 문자는 독립적으로 의미가 없지만, 모델이 이 문자들을 조합해서 bitamin이라는 단어를 이해하거나 예측할 수 있다면 의미가 있다 봄</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 시퀀스</strong></p>
<ul>
<li><strong>“순서”가 중요한</strong> 데이터 집합(순서가 바뀌면 의미가 달라질 수 있음)</li>
</ul>
</blockquote>
<p><strong>✓ 기존 DNN의 문제점</strong></p>
<ul>
<li>대규모의 라벨이 붙은 학습 데이터가 주어질 때 잘 동작하더라도, <strong>시퀀스를 시퀀스로 매핑하는 문제</strong>에는 적용할 수 없음</li>
</ul>
<blockquote>
<p><strong>✓ 시퀀스를 시퀀스로 매핑하는 문제 (</strong>ex. 영어문장 → 프랑스어로 번역)</p>
<ul>
<li>입력문장(영어)이 다른 시퀀스(프랑스어)로 변환되는 문제<ul>
<li>여기서 영어 문장: 하나의 시퀀스(단어들의 연속), 이를 변환해 프랑스어 시퀀스 생성</li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>✓ LSTM 기반 시퀀스-투-시퀀스 학습</strong></p>
<ul>
<li><p>시퀀스 구조에 <strong>최소한의 가정</strong>만 두는 <strong>end-to-end 시퀀스 학습</strong> 방법 제안</p>
</li>
<li><p>다층 LSTM(Long Short-Term Memory)</p>
<p>① 입력 시퀀스 → <strong>고정 차원의 벡터</strong>로 변환</p>
<p>② 또 다른 심층 LSTM이 이 벡터로부터 목표 시퀀스를 디코딩</p>
</li>
</ul>
<hr>
<blockquote>
<p><strong>✓ 시퀀스 구조에 최소한의 가정만?</strong></p>
<ul>
<li>일반적인 시퀀스 문제(ex. 문장 번역)에서는 <strong>입력과 출력 시퀀스 간의 길이나 구조가 복잡</strong><ul>
<li>기존 - <em>단어별 대응 규칙</em> or <em>정렬 정보</em> 같은 가정을 많이 두고 모델링</li>
<li>논문 - 최소한의 가정만 → 입력시퀀스와 출력시퀀스가 <strong>어떤 관계인지 미리 정하지 않겠다</strong></li>
</ul>
</li>
</ul>
<p><strong>✓ end-to-end</strong></p>
<ul>
<li><strong>입력 문장 → 출력 문장</strong> 전체 과정을 한 번에 학습</li>
<li>인코더 LSTM과 디코더 LSTM을 나누지만, 전체 모델이 하나의 목표 함수를 기준으로 <strong>동시에 학습</strong><ul>
<li>따로 전처리 단계에서 규칙을 넣거나, 중간 단계에서 사람이 개입할 필요X</li>
</ul>
</li>
</ul>
<p><strong>✓ 입력 시퀀스를 고정 차원의 벡터로 변환?</strong></p>
<ul>
<li><p>입력 시퀀스를 인코더 LSTM에 넣어서 <em>마지막 은닉상태</em>나 <em>출력벡터</em>로 고정 크기의 벡터 만듦</p>
<p>→ 이 벡터는 문장 전체 정보를 압축한 <strong>컨텍스트 벡터</strong></p>
</li>
</ul>
<p><strong>✓ 또 다른 심층 LSTM이 이 벡터로부터 목표 시퀀스를 디코딩?</strong></p>
<ul>
<li><p>디코더 LSTM은 이 고정 벡터를 받아서 순차적으로 출력 시퀀스를 생성</p>
<p>ex. 영어 → 프랑스: 디코더는 벡터 기반으로 프랑스어 문장을 한 단어씩 생성</p>
</li>
</ul>
</blockquote>
<p><strong>✓ 실험</strong></p>
<ul>
<li><p>WMT`14 데이터셋 영어 → 프랑스어 번역 (기계번역)</p>
<p><strong>① 성능 향상 - BLEU점수</strong></p>
<ul>
<li>BLEU 점수 34.8 (↔ 기존 SMT BLEU 33.3)<ul>
<li>논문의 LSTM을 통해 SMT 1000개의 가설 재순위화 → BLEU 36.5로 향상</li>
</ul>
</li>
<li>긴 문장도 ok~</li>
</ul>
<p><strong>② 단어 순서 뒤집기</strong></p>
<ul>
<li><p>LSTM은 단어 순서에 민감하지만, 능동태와 수동태에서는 비교적 강건</p>
<ul>
<li>능동,수동 → 문장 구조가 달라도 <strong>핵심 의미는 비슷하게 벡터로</strong> 표현</li>
</ul>
</li>
<li><p><strong>단기 의존성</strong>을 증가시켜 LSTM이 더 효과적으로 학습할 수 있게 도와줌</p>
<blockquote>
<p><strong>✓ 단기 의존성(short-term dependency)</strong></p>
<ul>
<li><p>번역에서 첫 번째 단어와 마지막 단어 사이의 거리를 생각해보면,</p>
<ul>
<li><p>원래: i love bitamin → 출력 첫 단어와 대응되는 입력 단어 멀리 떨어져 있음</p>
<p><strong>⇒ 장기 의존성 문제(기울기 소실 문제로 어려움)</strong></p>
</li>
</ul>
</li>
<li><p>단어를 뒤집으면</p>
<ul>
<li><p>출력 문장의 첫 단어와 대응되는 입력 단어가 가까워짐 → <strong>단기 의존성</strong></p>
<p>⇒ 단기 의존성이 많아지면, 역전파를 통한 학습이 쉬워짐</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="1-introduction-서론">1. Introduction (서론)</h2>
<p><strong>✓ DNN</strong></p>
<blockquote>
<p><strong>✓ N개의 N-비트 숫자</strong></p>
<ul>
<li><strong>N개의 숫자</strong>가 각각 <strong>N비트</strong>로 표현되는 숫자들 의미<ul>
<li>N=4 → 4비트로 표현되고 총 4개의 숫자들로 이루어진 집합</li>
</ul>
</li>
</ul>
<p><strong>✓ N개의 N-비트 숫자 “정렬”</strong></p>
<ul>
<li><p>N개의 N-비트 숫자들을 <strong>오름차순</strong>이나 <strong>내림차순</strong>으로 정렬해야하는 문제</p>
<p>→ 이 숫자들을 정렬하는 기능을 신경망이 수행할 수 있는데 2개의 은닉층만으로도 해결 가능</p>
</li>
</ul>
</blockquote>
<ul>
<li><p>음성인식, 시각적 객체 인식과 같은 어려운 문제에서 매우 뛰어난 성능</p>
</li>
<li><p><strong>비교적 적은 단계만으로도 임의의 병렬 연산 가능</strong></p>
<ul>
<li><p>2개의 은닉층만으로도 <strong>N개의 N-비트 숫자 정렬</strong> 가능 → 복잡한 문제를 단순한 구조로 해결가능</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/9e9cfd4d-5810-4271-83fc-56eca6767bfe/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 왜 신경망으로 정렬이 가능할까?</strong></p>
<ul>
<li>신경망은 입력 데이터를 처리하고 패턴을 학습할 수 있는 능력有<ul>
<li>DNN은 선형적이지 않은 연산을 반복적으로 적용하여 복잡한 문제를 풀 수 있음</li>
</ul>
</li>
<li><strong>정렬문제=</strong>순서를 파악하고 비교하는 작업: 2개의 은닉층으로 순서, 비교 패턴 학습 가능</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 2개의 은닉층만으로 가능한가?</strong></p>
<ul>
<li><p>기본적인 신경망 구조는 <strong>선형 연산</strong>만으로는 해결할 수 없는 문제들을 다룰 수 있게 해줌</p>
<p>→ <strong>은닉층을 추가함</strong>으로써 <strong>비선형적인 문제도 해결</strong>할 수 있음</p>
<ul>
<li><p><strong>단일층</strong>: <strong>선형변환</strong>만 가능 - 직선적일 수 밖에 없음</p>
</li>
<li><p><strong>3번이상의 은닉층</strong>: 상대적으로 더 복잡한 문제나 큰 데이터셋에서 필요, 과적합 위험</p>
<p>⇒ 2개의 은닉층이 <strong>학습 효율성</strong>과 <strong>성능</strong>면에서 최적의 균형을 제공하는 경우가 많음</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<p><strong>(P) DNN의 한계</strong></p>
<ul>
<li><p>입력과 출력이 <strong>고정된 차원의 벡터</strong>로 인코딩될 수 있는 문제에만 적용 가능</p>
<ul>
<li><p>시퀀스-투-시퀀스 문제(ex. 기계 번역, 질의응답 등)에서는 한계 존재</p>
<p>→ 길이가 고정된 데이터(ex. 이미지나 고정된 길이의 텍스트 등)에는 잘 작동하지만,</p>
<p>길이가 달라질  수 있는 시퀀스 데이터에는 적합X</p>
</li>
</ul>
</li>
</ul>
<p><strong>✓ (S) LSTM을 이용한 시퀀스-투-시퀀스 학습</strong></p>
<ul>
<li><p><strong>LSTM</strong>: 시퀀스를 처리하는데 강력한 신경망</p>
<ul>
<li><p>장기의존성을 학습하는데 능숙하여, <em>시간 지연이 있는</em> 입력과 출력 간의 관계를 잘 모델링 가능</p>
</li>
<li><p><em>시퀀스-투-시퀀스</em>를 해결하기 위해 <strong>2개의 LSTM</strong> 사용</p>
<ul>
<li><p><strong>인코더 LSTM</strong></p>
<p>→ 입력 시퀀스를 한 번에 한 단어씩 읽어서 고정된 크기의 벡터로 변환(입력시퀀스 요약정보)</p>
</li>
<li><p><strong>디코더 LSTM</strong></p>
<p>→ 인코더에서 생성한 고정된 벡터를 받아 출력 시퀀스 생성 후 차례대로 예측</p>
<p>→ <strong>입력 시퀀스를 조건으로 하는 순환 신경망 언어 모델</strong></p>
<p>⇒ 장기 의존성 문제 해결</p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/0a6217c3-75c8-434c-8930-ab5c990af037/image.png" alt=""></p>
</li>
</ul>
<p><strong>&lt;참고&gt; [세션 PPT]</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/717da373-fae4-42e0-bed3-d9240dee8451/image.png" alt=""></p>
<p><strong>✓ 관련 연구</strong></p>
<p><strong>✓ re-ranking 실험</strong></p>
<ul>
<li>abstract랑 똑같은 이야기<ul>
<li>LSTM 순서 뒤집는 트릭으로 단기의존성을 만들어서 최적화 쉬워짐</li>
<li>SGD로 학습해도 긴 문장 잘 처리 가능</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-the-model">2. The model</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/01943ec1-9afe-44f9-9a93-ec57e263e4d4/image.png" alt=""></p>
<p><strong>&lt;참고&gt;</strong></p>
<table>
<thead>
<tr>
<th><strong>FNN(feedforward neural network)</strong></th>
<th><strong>RNN</strong></th>
<th><strong>LSTM</strong></th>
</tr>
</thead>
<tbody><tr>
<td>- 입력 데이터 순차적으로 처리<br>- 각 입력은 독립적<br>- 시간적인 순서나 의존성 고려X</td>
<td>- 이전의 출력이 현재의 입력에 영향을 미치는 구조<br>- 시간적인 의존성 처리 가능</td>
<td>- RNN의 한 종류<br>- 긴 시간 의존성을 처리할 수 있도록 설계된 네트워크<br>- 더 효과적으로 긴 시간 간격의 정보 기억 및 처리 가능</td>
</tr>
</tbody></table>
<p><strong>✓ (P)</strong></p>
<ul>
<li><p>RNN은 <strong>①입력과 출력이 같고, ②정렬이 이미 알려져 있는 경우</strong>에는 시퀀스 투 시퀀스로 쉽게 매핑 가능</p>
<p>BUT, <strong>①입력과 출력 길이가 다르거나, ② 복잡하고 비단조적인 관계</strong>를 가지는 경우에는 적용 어려움</p>
<blockquote>
<p><strong>✓ 비단조적인 관계</strong></p>
<ul>
<li>변수 간의 관계가 <strong>일정한 방향으로만 변화하지 않고, 증가와 감소가 반복될 수 있는 경우</strong><ul>
<li>변수 간의 증가나 감소가 일관X(변동적)</li>
<li>다른 요인에 의해 영향을 받을 수 있음</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
<p><strong>✓ (S)</strong></p>
<ul>
<li><p>입력 시퀀스를 하나의 고정 길이 벡터 v로 매핑 (첫 번째 RNN)</p>
</li>
<li><p>그 벡터를 기반으로 출력 시퀀스 생성 (두 번째 RNN)</p>
<p>BUT, RNN은 <strong>장기 의존성 문제</strong>로 학습이 어려움 → LSTM으로!</p>
<ul>
<li><em>아마 v: 컨텍스트벡터, 첫 번째 RNN: 인코더 LSTM, 두번째 RNN: 디코더 LSTM</em></li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f9d507dc-179e-4eae-990a-44a5e40da3a8/image.png" alt=""></p>
<ul>
<li>방법<ul>
<li>입력 시퀀스를 LSTM으로 인코딩하여 “마지막 hidden state = v”로 고정 길이 벡터를 얻음</li>
<li>이후, 디코더 LSTM이 v를 초기 hidden state로 설정한 뒤, 출력 시퀀스를 생성</li>
<li>이때 각 단어의 확률 분포 p(y_t|v,y1,y2,,,yt-1)는 소프트맥스(softmax)로 표현</li>
</ul>
</li>
</ul>
<p><strong>✓ 개선점 3가지</strong></p>
<p><strong>① 입출력에 서로 다른 LSTM 사용</strong></p>
<ul>
<li>인코더 LSTM(입력용), 디코더 LSTM(출력용) 분리</li>
<li>파라미터 수를 늘리면서도 연산비용이 크게 늘지X</li>
<li>다국어 학습에도 자연스럽게 확장 가능</li>
</ul>
<p><strong>② 깊은 LSTM 사용 (deep LSTM)</strong></p>
<ul>
<li>얕은 LSTM보다 깊은 LSTM이 성능이 훨씬 우수</li>
<li>4층 LSTM 사용</li>
</ul>
<p><strong>③ 입력 문장 단어 순서 뒤집기 (reverse input sentence)</strong></p>
<ul>
<li><p>입력 (a,b,c) → 출력(알파,베타,감마) 대신<br>입력 (c,b,a) → 출력(알파,베타,감마)</p>
<p>→ 단기 의존성! (장기 의존성 문제 해결)</p>
<p><strong>알파가 난이도 결정 → 초기 출력이 잘 맞으면, 뒤 토큰들도 쉽게 맞아 떨어진다~(가장어려운 부분을)</strong></p>
</li>
</ul>
<hr>
<h2 id="3-experiments">3. Experiments</h2>
<blockquote>
<p><strong>✓ SMT(Statistical Machine Translation)</strong></p>
<ul>
<li><p><strong>확률적 모델 기반</strong>으로 한 기계 번역 방식</p>
</li>
<li><p>대규모의 평행 코퍼스(같은 의미를 가진 두 언어로 된 문서)에서 얻은 <strong>통계적 규칙</strong>을 사용하여 한 언어에서 다른 언어로 번역</p>
<ul>
<li>주어진 입력 문장을 <strong>단어와 구문</strong>으로 나누고, 이를 <strong>확률적 규칙에 따라</strong> 번역</li>
<li>번역할 때 <strong>가장 가능성이 높은 번역을 선택</strong>하는 방식으로 작동</li>
</ul>
</li>
<li><p><em>문법적 정확성</em>보다 <strong>빈번한 단어 및 구문 패턴을 기반</strong>으로 작동하여 번역 수행</p>
<p>→ 단어 순서가 중요한 언어적 맥락을 다루는 데에는 한계</p>
</li>
</ul>
<p><strong>✓ n-best 리스트</strong></p>
<ul>
<li>번역 시스템에서 생성한 <strong>상위 n개의 번역 후보 리스트</strong></li>
<li>시스템이 제공할 수 있는 여러 가지 번역 결과 중 가장 확률이 높은 번역 나열</li>
</ul>
</blockquote>
<p><strong>✓ WMT’14 영어 → 프랑스어 기계번역(MT) 방법</strong></p>
<ul>
<li>SMT 시스템없이 직접 번역 (Direct translation)</li>
<li>SMT baseline의 n-best 리스트를 재점수화(rescoring)</li>
</ul>
<table>
<thead>
<tr>
<th><strong>SMT 시스템 없이 직접 번역</strong></th>
<th><strong>SMT baseline n-best 리스트 재점수화</strong></th>
</tr>
</thead>
<tbody><tr>
<td>- 기계 번역 시스템을 단독으로 사용하여 직접 번역 수행<br><strong>- 생성된 번역 결과: 1가지</strong></td>
<td>- SMT 시스템이 생성된 <strong>여러 후보 번역 중 가장 적합한 번역 선택</strong><br>- n-best 리스트에서 상위 n개의 번역 후보가 제공된 후, 이 후보들에 대해 추가적인 점수 부여 or 재조정을 통해 가장 적합한 번역 선택<br>- 단순히 가장 높은 확률을 가진 번역외에도 문맥에 맞는 최적의 번역 선택 가능</td>
</tr>
</tbody></table>
<h3 id="31-dataset-details"><strong>3.1 Dataset details</strong></h3>
<p><strong>✓ 데이터셋</strong></p>
<ul>
<li>WMT`14 영어 → 프랑스어 데이터셋</li>
</ul>
<p><strong>✓ 학습 데이터</strong></p>
<ul>
<li>1200만 문장 쌍, 프랑스어 3.48억 단어, 영어 3.04억 단어<ul>
<li>[29]에서 제공하는 clean selected subset 사용<ul>
<li>baseline SMT 시스템이 토크나이즈된 train/test 셋과 1000-best 리스트가 공개되어 있어서</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>✓ 어휘집</strong></p>
<ul>
<li>소스 언어(영어): 160,000개 가장 빈도 높은 단어</li>
<li>타깃 언어(프랑스어): 80,000개 가장 빈도 높은 단어</li>
<li>어휘 외 단어(OOV)는 모두 특별한 UNK 토큰으로 대체</li>
</ul>
<h3 id="32-decoding-and-rescoring"><strong>3.2 Decoding and Rescoring</strong></h3>
<p><strong>✓ 학습 목표</strong></p>
<ul>
<li><p>대규모 deep LSTM을 문장 쌍으로 학습</p>
</li>
<li><p><strong>목적함수</strong>: 소스 문장 S가 주어졌을 때 올바른 번역 T의 로그 확률을 최적화</p>
</li>
<li><p><strong>번역생성과정</strong>: 소스 문장 S가 주어졌을 때 올바른 번역 T의 로그 확률 최대화</p>
<ul>
<li>모델의 예측이 훈련 데이터에서 실제 출력과 가까워지도록 학습</li>
<li>로그 확률의 합이 최대화하는 것을 목표</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/145610ba-6f59-4395-93b5-4e1a55a544db/image.png" alt=""></p>
</li>
</ul>
<ul>
<li><p>로그 확률을 사용하는 이유 예시</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/2e617e96-9327-4d4f-b11f-05467088d47a/image.png" alt=""></p>
</li>
</ul>
<p><strong>✓ 번역 생성 과정</strong></p>
<ul>
<li><p>학습 완료 후, 가장 가능성 높은 번역 선택</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5159bc24-01ed-452b-9173-d8b961f3083d/image.png" alt=""></p>
</li>
</ul>
<p><strong>✓ 디코딩 방법</strong></p>
<blockquote>
<p><strong>✓ Partial Hypothesis</strong></p>
<ul>
<li>출력 시퀀스를 완전히 생성하기 전에 <strong>현재까지 생성된 부분적인 번역 결과</strong> 의미</li>
<li>번역을 순차적으로 생성할 때, 시스템은 <strong>출력 시퀀스의 일부를 미리 생성</strong>하고, 그 결과를 바탕으로 다음 단어 예측<ul>
<li>이 부분적인 출력 → Partial hypothesis</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Beam Search Decode</strong></p>
<ul>
<li><p><strong>출력 시퀀스</strong>를 생성하는데 사용되는 탐색 알고리즘</p>
<ul>
<li><p>다양한 후보 번역을 생성하고 평가하는 방식</p>
<p>→ 현재까지의 번역 후보 중에서 가장 가능성 높은 후보들을 유지하면서 번역을 계속 생성</p>
</li>
</ul>
</li>
<li><p>작동예시</p>
<ul>
<li>모델이 i를 예측하고 beam width가 3이면 i 다음에 올 수 있는 3가지 단어 예측</li>
<li>이전 단계에서 예측된 i 뒤에 올 3개의 단어 후보를 <strong>각각 확장하여, 3개의 새로운 partial hypothesis 만듦</strong> + <strong>각 후보에 대한 확률 계산</strong></li>
<li>각 후보에서 또 다른 단어들을 예측하여, <strong>최고 확률을 가진 3개의 후보를 계속 유지</strong></li>
<li>전체 시퀀스가 완성되면, 가장 확률이 높은 시퀀스를 최종 출력으로 선택</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>좌 → 우 beam search decoder 사용</p>
</li>
<li><p>beam search는 B개의 partial hypothesis 유지</p>
</li>
<li><p>각 시점마다 가능한 모든 단어로 확장 → 후보 수 급증</p>
</li>
<li><p>상위 B개만 남기고 나머지는 제거 (로그 확률 기준)</p>
</li>
<li><p><code>&lt;EOS&gt;</code>가 나오면 beam에서 제거하고 complete hypothesis 집합에 추가</p>
</li>
<li><p>근사적이지만 구현이 단순하고, beam size = 1로도 좋은 성능, beam size = 2어도 대부분의 성능 향상</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/721889bf-98c6-49bd-98a4-985cdcb77cb7/image.png" alt=""></p>
</li>
</ul>
<p><strong>✓ 재점수화(rescoring)</strong></p>
<ul>
<li>baseline SMT가 만든 1000-best 리스트를 LSTM으로 재점수화<ul>
<li>각 후보 번역의 로그확률을 LSTM으로 계산하고, 원래 SMT 점수와 평가</li>
</ul>
</li>
</ul>
<h3 id="33-reversing-the-source-sentences"><strong>3.3 Reversing the Source Sentences</strong></h3>
<p><strong>✓ LSTM</strong></p>
<blockquote>
<p><strong>✓ 최소 시간 지연</strong></p>
<ul>
<li><p>입력 시퀀스의 단어가 출력 시퀀스의 대응되는 단어와 시간적으로 가까운 관계를 유지하도록 함</p>
<p>즉, 입력 단어와 출력 단어가 서로 가깝게 위치하도록!!</p>
</li>
</ul>
<hr>
<ul>
<li>왜 중요할까?<ul>
<li>[기계번역시스템] 입력 문장과 출력 문장 사이에 단어의 순서와 문맥적 관계를 잘 반영해야 함</li>
<li>최소 시간 지연을 고려하면 입력 문장에서의 각 단어가 출력 시퀀스의 대응되는 단어와 가까운 위치에 배치되어야 함</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p>장기 의존성 문제 해결 가능하긴 한데, 소스문장(입력)을 <strong>역순으로 뒤집으면</strong> 훨씬 더 잘 학습하더라~</p>
<p><strong>✓ 타깃 문장(출력)은 뒤집지 X</strong></p>
<ul>
<li>perplexity 5.8 → 4.7</li>
<li>BLEU 점수 25.9 → 30.6</li>
</ul>
<p>⇒ 많은 <strong>단기 의존성을 도입</strong>했기 때문이 아닐까~? (<strong>최소 시간 지연_minimal time lag</strong> 해결)</p>
<ul>
<li><p>평균 거리 자체는 변하지X</p>
<ul>
<li>소스 언어 앞쪽의 단어와 타깃 언어의 앞쪽의 단어가 가까워지면서<br>① <strong>최소 시간 지연</strong>이 줄어들고<br>② <strong>역전파</strong>가 소스 문장과 타깃 문장 사이에 <strong>“의사소통”을 수립하기</strong> 훨씬 쉬워짐<br>⇒ 전반적인 성능향상</li>
</ul>
</li>
<li><p><strong>&lt;초기&gt;</strong>에는 입력 문장을 뒤집는 게 타긴 문장의 앞부분에서 더 자신 있는 부분을 예측하고, 뒷부분에서는 덜 자신있는 부분을 예측하는 것이라고 생각했음</p>
<p>→ 문장을 뒤집으면, 앞부분의 단어들이 뒤쪽 단어들보다 더 간단하게 예측될 듯?<br>뒷부분이 덜 확실하니까 더 많은 예측 오류가 있을 것이라 생각했었음</p>
</li>
<li><p><strong>&lt;실험결과&gt;</strong> 뒤집은 문장이 더 좋은 성능</p>
</li>
<li><p><strong>&lt;결론&gt;</strong> LSTM의 메모리 활용의 개선 때문</p>
<ul>
<li>LSTM 모델은 기억을 잘해야하는데, 입력 문장의 순서를 뒤집으면 초기 단어들이 후속단어들과 더 가까운 위치에 배치되므로, 초기 상태의 의존성이 더 짧아지게 됨</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="34-training-details"><strong>3.4 Training details</strong></h3>
<p><strong>✓ 모델 설정</strong></p>
<ul>
<li><p>4층 deep LSTM, 각 층은 1000개의 셀, 단어 임베딩 차원 1000차원</p>
</li>
<li><p>입력 어휘집 160,000, 출력 어휘집 80,000</p>
</li>
<li><p>8,000개의 실수 → deep LSTM 문장을 표현하기 위함</p>
<p>⇒ 얕은 LSTM보다 훨씬 뛰어난 성능</p>
<ul>
<li>LSTM은 총 3억 8400만 개의 파라미터</li>
<li>이 중 6400만 개는 순수 recurrent 연결</li>
<li>encoder LSTM 3200만 개, decoder LSTM 3200만 개</li>
</ul>
</li>
</ul>
<p><strong>✓ 학습설정</strong></p>
<ul>
<li><p><strong>파라미터 초기화</strong></p>
<ul>
<li>모든 파라미터를 [-0.08,0.08] 구간의 균일분포로 초기화</li>
</ul>
</li>
<li><p><strong>최적화 방법</strong></p>
<ul>
<li>Momentum없이 SGD 사용</li>
<li>학습률 0.7로 고정</li>
<li>5 epoch 이후부터는 0.5 epoch마다 학습률 절반으로 감소</li>
<li>총 학습 epoch = 7.5</li>
</ul>
</li>
<li><p><strong>미니배치 설정</strong></p>
<ul>
<li>batch size = 128 시퀀스</li>
<li>gradient를 batch size(128)로 나누어 정규화</li>
</ul>
</li>
<li><p><strong>gradient clipping (폭발 방지)</strong></p>
<ul>
<li><p>LSTM은 기울기 소실 문제는 적지만, <strong>기울기 폭발 문제</strong>는 발생 가능</p>
<p>→ gradient norm을 제한(hard constraint)</p>
</li>
<li><p>각 배치에서 gradient g (128로 나눈 값)를 구해 s = ||g||^2 계산</p>
</li>
<li><p>만약 s&gt;5 이면 g ← 5/sqrt(s) x g</p>
</li>
</ul>
</li>
<li><p><strong>문장 길이 처리</strong></p>
<ul>
<li><p>문장 길이 다양함 (짧은 문장: 20-30 단어, 긴 문장: 100+ 단어)</p>
</li>
<li><p><em>무작위로 128개 문장을 선택하면 대부분 짧은 문장이라 긴 문장 학습 시 연산 낭비</em> 발생</p>
</li>
<li><p>minibatch 내 문장들이 비슷한 길이를 갖도록 구성</p>
<p>→ 약 2배 이상 속도 향상 얻음</p>
</li>
</ul>
</li>
</ul>
<h3 id="35-parallelization"><strong>3.5 Parallelization</strong></h3>
<p><strong>✓ 병렬화</strong></p>
<ul>
<li><p><strong>(P) 단일 GPU_C++로 구현된 deep LSTM</strong> 약 1,700단어/초 (느림)</p>
<p>→ <strong>(S) 8개의 GPU를 사용하여 모델 병렬화</strong></p>
<ul>
<li><p><strong>4개 LSTM: 각기 다른 GPU에서 실행</strong> - 계산된 활성화 값은 <strong>다음 GPU/층으로 즉시 전달</strong></p>
</li>
<li><p><strong>나머지 4개 LSTM: softmax 병렬</strong>화 - 각 GPU가 1000x20000행렬 곱 연산 담당</p>
<p>⇒ 6,300 단어/초 속도 기록, 미니배치 128, 학습 약 10일 걸림</p>
</li>
</ul>
</li>
</ul>
<h3 id="36-experimental-results"><strong>3.6 Experimental Results</strong></h3>
<ul>
<li>cased BLEU score 사용</li>
<li>WMT`14 시스템 37.0 BLEU 얻음</li>
</ul>
<hr>
<ul>
<li>순수 LSTM direct translation: BLEU 34.81, SMT baseline(33.30) 초월</li>
<li>앙상블 효과: 모델 5개 앙상블 시 성능 크게 향상</li>
<li>reverse input: 성능 개선</li>
</ul>
<h3 id="37-performance-on-long-sentences"><strong>3.7 Performance on long sentences</strong></h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/8644f025-e164-49f4-a555-02ef4ee2dd1f/image.png" alt=""></p>
<ul>
<li>입력 문장을 역순으로 넣어서 <strong>최소 시간 지연</strong>이 줄어들어서 장기 의존성 학습하는게 쉬워짐</li>
</ul>
<h3 id="38-model-analysis"><strong>3.8 Model Analysis</strong></h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/deb0e66d-ef74-4409-b6c2-e687648238e9/image.png" alt=""></p>
<hr>
<h2 id="4-related-work">4. Related Work</h2>
<ul>
<li><p><strong>RNNLM (RNN-Language Model) 이나 NNLM (Feedforward Neural Network Language Model)</strong></p>
<ul>
<li>MT baseline의 n-best 리스트를 재점수화(rescoring) → 성능 안정적으로 개선</li>
</ul>
</li>
<li><p><strong>소스 언어 정보 ⊂ NNLM</strong></p>
<ul>
<li>Auli et al [1]: 입력 문장의 토픽 모델(topic model)과 결합하여 rescoring 성능 향상</li>
<li>Devlin et al [8]: NNLM&amp;MT의 디코더에 통합, 디코더의 정렬 정보를 이용해 입력 문장의 유용한 단어들을 NNLM에 제공</li>
</ul>
</li>
<li><p><strong>Kalchbrenner and Blunsom[18]</strong> ← 밀접하게 관련</p>
<ul>
<li>최초 입력 문장을 벡터로 매핑 → 다시 문장으로 복원<ul>
<li>CNN 사용 (단어의 순서 잃음,,)</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Cho et al [5]</strong>: LSTM과 유사한 RNN 구조를 사용해 문장의 벡터로 매핑하고 다시 복원</p>
<p>** 신경망을 SMT시스템에 통합하는 것에 초점</p>
</li>
<li><p><strong>Bahdanau et al [2]</strong>: 어텐션 메커니즘 도입</p>
<ul>
<li>Cho et al [5]의 메모리 문제 해결 - 구문 기반 접근과 유사</li>
<li>역순 소스 문장으로 학습해도 유사한 개선을 얻었을 것이라 추측</li>
</ul>
</li>
<li><p><strong>End-to-end</strong></p>
<ul>
<li>Hermann et al [12]: 공간상의 유사한 지점으로 매핑, 사전에 계산된 데베에서 가장 가까운 벡터를 검색하거나 문장을 재점수화해야만 번역 얻을 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-conclusion">5. Conclusion</h2>
<ul>
<li><p>대규모 deep LSTM: 제한된 어휘, 문제 구조 거의 가정X<br>→무제한 어휘 SMT보다 대규모 MT 과제에서 우수</p>
<p>⇒ 충분한 학습 데이터가 있다면, 다른 시퀀스 학습 문제에도 효과적일 가능성⬆️</p>
</li>
</ul>
<hr>
<ul>
<li>소스 문장 역순 처리<ul>
<li>단기 의존성 증가로 학습 용이</li>
</ul>
</li>
<li>긴 문장 번역<ul>
<li>제한된 메모리에도 불구하고 정확히 번역 가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문 리뷰]  Deep Residual Learning for Image Recognition]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Deep-Residual-Learning-for-Image-Recognition</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Deep-Residual-Learning-for-Image-Recognition</guid>
            <pubDate>Wed, 22 Jul 2026 12:31:29 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: Deep Residual Learning for Image Recognition
<strong>학회(출판연도)</strong>: CVPR (2016)
<strong>연구분야</strong>: 딥러닝 기반 컴퓨터 비전 백본 네트워크</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<p><strong>✓ 기존 신경망의 문제점</strong></p>
<ul>
<li>신경망을 깊게 쌓으면 이론적으로 성능이 좋아야 하지만, 실제로는 성능 저하 발생<ul>
<li>단순히 층을 더 깊게 하면 학습이 잘 안되고, 오히려 오류율 증가</li>
</ul>
</li>
</ul>
<p><strong>✓ ResNet의 등장</strong></p>
<p>→ <strong>Residual Learning(잔차 학습) 프레임워크</strong> 제안</p>
<ul>
<li><p>레이어가 입력과 무관한 함수를 직접 학습하는 대신, 입력을 기준으로 한 <strong>잔차 함수</strong>를 학습하도록</p>
<p>→ <strong>① 네트워크 쉽게 최적화 + ② 정확도 향상</strong></p>
<p><strong>[실험 결과]</strong> VGG네트워크보다 8배 깊은데 연산 복잡도는 더 낮음</p>
<p>→ ImageNet</p>
<ul>
<li>VGG네트워크보다 8배 깊은데 연산 복잡도는 더 낮음</li>
<li>오류율 3.57% (잔차 네트워크 앙상블) - ILSVRC 2015 분류 과제 1위</li>
</ul>
<p>→ COCO 28% 성능 향상 (깊은 표현 가능)</p>
</li>
</ul>
<hr>
<h2 id="1-introduction서론">1. Introduction(서론)</h2>
<p><strong>✓ CNN</strong></p>
<p>→ 이미지 분류 분야에서 획기적인 성과</p>
<ul>
<li><p><strong>깊은 네트워크</strong></p>
<ul>
<li>저, 중, 고수준 특징 통합 후, 다층 방식으로 종단간(end-to-end) 학습</li>
<li>층⬆️ → 표현할 수 있는 특징 수준⬆️</li>
</ul>
<p><strong>[최근 연구]</strong> 16~30층에 이르는 “매우 깊은” 모델 활용</p>
</li>
</ul>
<p><strong>(P)</strong></p>
<p>✓ <strong>그렇다면, 단순히 층을 쌓는 것만으로 더 좋은 네트워크를 만들 수 있는가? - NO!</strong></p>
<p>→ ① 기울기 소실/폭발 문제 ② 성능 저하 문제(Degradation Problem)</p>
<p><strong>(P1) 기울기 소실/폭발 문제</strong></p>
<p>→ <strong>(S)</strong> 정규화된 초기화 기법 + 정규화 레이어로 <strong>역전파 기반 SGD</strong>에서 안정적으로 수렴 가능</p>
<blockquote>
<p><strong>✓ SGD (확률적 경사하강법)</strong></p>
<ul>
<li>손실함수를 최소화하는 방향으로 가중치를 업데이트하는 최적화 알고리즘</li>
<li>경사하강법의 변형으로,<br>전체 데이터가 아닌 <strong>“일부 데이터(미니배치 or 1개 샘플)”</strong>만 보고 업데이트 하는 방식<br>→ Stochastic(확률적)</li>
</ul>
</blockquote>
<p>BUT!</p>
<p><strong>(P2) Degradation Problem(성능 저하 문제)</strong></p>
<p>→ 깊이가 늘어날수록 정확도가 일정 수준에서 포화된 뒤, 성능이 빠르게 저하</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ccb225b0-1615-4e19-87c8-183fc36971ad/image.png" alt=""></p>
<p>→ <strong>(이론적 S)</strong>  추가된 층은 항등 매핑으로, 나머지는 이미 학습된 얕은 모델에서 복사</p>
<blockquote>
<p><strong>✓ 항등 매핑(identity mapping)</strong></p>
<ul>
<li><p>입력 = 출력</p>
<p>!image.png</p>
<p>⇒ <strong>ResNet에서 Skip Connection을 통해 구현</strong></p>
<ul>
<li>새로 추가된 층이 꼭 유용한 걸 못 배우더라도 F(x)=0만 학습하면 입력을 그대로 출력</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 추가된 층을 항등 매핑(identity mapping)으로 두는 것</strong></p>
<ul>
<li>얕은 모델에서 <strong>이미 잘 학습된 가중치가 있다</strong>고 가정</li>
<li>모델을 더 깊게 만들고 싶을 때, <strong>새로운 층들을 항등 매핑으로</strong> 두면, <strong>입력을 그대로 출력으로 흘려보내는 상태</strong>가 됨</li>
<li>깊은 모델 = 얕은 모델 + 항등 매핑 층(아무 일도 안하는 층)</li>
</ul>
</blockquote>
<p>⇒ 하지만,<br>[실험 결과] 현재 최적화 기법은 이론적 해법만큼 좋지도 않고, 현실적인 시간 안에 찾는 건 불가능</p>
<p><strong>즉, 깊은 네트워크가 얕은 네트워크만큼 성능을 내는 쉬운 방법은 존재하지만, 실제 알고리즘이 그걸 찾아주지 못해서 성능 저하가 발생함</strong></p>
<p><strong>✓ (S) Deep Residual Learning Framework</strong></p>
<p>→ 여러 층이 직접 목표 함수를 학습하게 하는 것이 아닌 <strong>“잔차함수(residual mapping)”</strong>를 학습하도록</p>
<blockquote>
<p><strong>✓ 기존 방식(Plain Network) vs. ResNet 방식(Residual Network)</strong></p>
<p>우리가 원하는 함수가 H(x)라고 했을 때,</p>
<ol>
<li><strong>기존 방식(Plain Network)</strong></li>
</ol>
<ul>
<li>여러 층을 합쳐서 곧장 H(x) 자체를 학습<ul>
<li>각 층이 독립적으로 목표 함수 학습하는 것이 아닌, 여러 층이 순차적으로 쌓여서 전체적으로 H(x)를 근사</li>
</ul>
</li>
</ul>
<ol start="2">
<li><strong>ResNet 방식</strong></li>
</ol>
<ul>
<li><p>여러 층이 합쳐져서 F(x) = H(x) - x (잔차: 입력 대비 변화량)만 학습</p>
<ul>
<li><p>최종 출력은 F(x)+x 로 표현</p>
<p>→ 즉, 기존의 입력을 조금 <strong>보정</strong>하는 역할</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/df1c83b6-fb15-4fdb-a3a5-91c71fbfd77e/image.png" alt=""></p>
<p><strong>[가정]</strong> 잔차 함수를 최적화하는 것이 원래 함수를 직접 학습하는 것보다 더 쉽다</p>
<p>→ 극단적인 경우) 항등 매핑이 최적이라면,<br>비선형층 여러 개로 항등 매핑을 학습하는 것보다 잔차를 0으로 만드는 것이 훨씬 쉬움</p>
<p><strong>✓ Shortcut connection</strong></p>
<p>→ 하나 이상의 층을 건너뛰어 연결하는 방식</p>
<ul>
<li>추가적인 파라미터나 연산복잡도 늘리지 X</li>
<li>SGD와 역전파를 통한 end-to-end 학습 가능</li>
<li>일반적인 딥러닝 라이브러리(caffe 등) 손쉽게 구현 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/847eb794-8d4e-4f00-9d49-5218ed71a3a2/image.png" alt=""></p>
<blockquote>
<p><strong>✓ SGD와 backprop으로 end-to-end 학습이 가능하다</strong></p>
<p><strong>1. 신경망 학습</strong></p>
<table>
<thead>
<tr>
<th><strong>일반적인 신경망 학습 과정</strong></th>
<th><strong>Residual block에서 추가된 shortcut</strong></th>
</tr>
</thead>
<tbody><tr>
<td>✓ 입력 x → 여러 층(Conv,ReLU 등) → 출력 y<br>✓ 순전파: 데이터를 위로 흘려보내고<br>✓ 역전파: 손실의 미분값(gradient)을 아래로 보내<br>면서 가중치 업데이트<br>→ 이때, <strong>SGD(확률적경사하강법)</strong>같은 최적화 알고리즘이 <strong>gradient를 사용해 파라미터 갱신</strong><br>⇒ 즉, 학습은 항상 “출력에서 입력까지 gradient가 잘 전파되는가?”에 달려 있음</td>
<td>✓ y = F(x) + x<br>✓ F(x)는 학습해야 하는 비선형 변환이고,<br>x는 단순히 바로 더해주는 identity connection<br>- 추가경로는 <strong>파라미터 X (그냥 입력을 더해줌)</strong><br>- 연산은 단순히 <strong>덧셈</strong>이고, <strong>미분도 매우 간단!</strong></td>
</tr>
</tbody></table>
<p><strong>2. 역전파에서 어떻게 작동?</strong></p>
<p>y=F(x) + x에 대해, 손실 L의 gradient를 계산한다고 해보자</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/a1e865df-7a90-4493-b5e4-03566be586cd/image.png" alt=""></p>
<p><strong>3. end-to-end 학습 가능?</strong></p>
<ul>
<li>shortcut connection은 추가 파라미터도, 특수 알고리즘도 필요없음</li>
<li>기존의 backprop과 SGD로 진행</li>
<li>Residual Network는 일반 신경망처럼 처음부터 끝까지 한 번에 학습 가능하다는 뜻</li>
</ul>
</blockquote>
<p><strong>✓ 실험</strong></p>
<ul>
<li><p>ImageNet 데이터셋</p>
<p>① <strong>매우 깊은 잔차 네트워크</strong>: 최적화가 쉬움</p>
<p>↔ <strong>단순히 층을 쌓은 일반 네트워크</strong>: 깊이가 증가할수록 훈련 오류가 커짐</p>
<p>② 잔차 네트워크는 깊이가 크게 늘어나도 쉽게 정확도 높일 수 있음 + 기존의 네트워크보다 뛰어난 성능</p>
<ul>
<li>152층 잔차 네트워크: VGG보다 깊지만 계산 복잡도는 낮음</li>
<li>앙상블 모델 결과 : 뭐 1등함</li>
</ul>
</li>
<li><p>CIFAR-10 데이터셋</p>
<ul>
<li>ImageNet과 비슷한 결과</li>
<li>100층 이상의 네트워크 성공적으로 학습 + 1000층이 넘는 모델도 실험</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-related-work">2. Related Work</h2>
<p><strong>✓ Residual Representations</strong></p>
<ul>
<li><p><strong>VLAD, Fisher Vector</strong></p>
<ul>
<li><p>기존 이미지 인식에서 원래 벡터 대신 <strong>잔차벡터(residual vector)를 활용</strong>해 특징을 인코딩</p>
<p>→ 원래 벡터를 직접 쓰는 것보다 잔차 벡터를 쓰는게 더 효과적</p>
</li>
</ul>
</li>
<li><p><strong>저수준 비전/그래픽스</strong></p>
<ul>
<li>PDE - Multigrid, Hierarchical basis : 스케일 간 잔차 활용 → 훨씬 빠르게 수렴!</li>
</ul>
</li>
</ul>
<p>⇒ 잔차 기반 표현은 최적화를 단순화하고 수렴 속도를 높임!</p>
<p>즉, 잔차를 다루는 방식은 <em>이전부터 효과적</em>임이 입증되어 왔다</p>
<p><strong>✓ Shortcut Connections</strong></p>
<p><strong>&lt;초기 연구&gt;</strong></p>
<ul>
<li><strong>[MLP]</strong> “입력 → 출력” 직접 연결되는 선형 레이어 추가</li>
<li>중간 레이어를 <strong>auxiliary classifier</strong>와 직접 연결하여 기울기 소실/폭발 문제 완화</li>
<li>레이어 출력, 기울기, 오류를 정규화(centering)하기 위한 shortcut 기법 연구</li>
<li>GoogLeNet의 inception에서도 얕은 branch(지름길)와 깊은 branch를 함께 사용</li>
</ul>
<p><strong><Highway Networks></strong></p>
<ul>
<li>게이트(gating function)로 제어되는 shortcut 제안<ul>
<li>게이트 닫히면(출력이 0에 가까워질 때) → 일반 함수를 나타냄 (잔차X)</li>
<li>극단적으로 깊은 네트워크 → 성능 향상을 보여주진 못함</li>
</ul>
</li>
</ul>
<p><strong>&lt;ResNet과 차별점&gt;</strong></p>
<p>① ResNet은 항등 shortcut 사용! → 항상 입력을 그대로 출력으로!, 파라미터 없음</p>
<p>② 언제나 잔차 함수 F(x)를 학습하고, 입력 정보가 항상 손실없이 전달됨</p>
<blockquote>
<p><strong>✓ Shortcut의 두 가지 방식</strong></p>
<p><strong>1. Highway Networks (ResNet 이전 연구)</strong></p>
<ul>
<li><p>shortcut에 gate(게이트)를 둠</p>
<ul>
<li><p>게이트 값 1 → 입력이 그대로 전달</p>
</li>
<li><p>게이트 값 0 → 입력 차단(shortcut 닫힘)</p>
<p>→ 데이터마다 “shortcut를 통과할지 말지”를 선택하는 구조</p>
</li>
</ul>
</li>
</ul>
<p><strong>2. ResNet (항등 Shortcut)</strong></p>
<ul>
<li><p>게이트 없음 → 무조건 입력 그대로 전달</p>
</li>
<li><p>파라미터 X, 학습할 것 X</p>
<p>→ 입력 x는 언제나 output으로 직접 더해짐</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 항상 열려 있다?</strong></p>
<ul>
<li><p>입력 x가 shortcut을 통해 항상 출력 쪽으로 전달된다는 뜻</p>
</li>
<li><p>네트워크가 “입력을 통과시킬지 말지” 선택하는 것이 아니라, 무조건 통과시킴</p>
<ul>
<li>그 위에 residual F(x)가 더해져 최종 출력이 됨</li>
</ul>
<p>⇒ 최소한 항등 함수( F(x) =0 )는 언제나 보장됨 → 학습 실패(수렴 실패)를 피할 수 있음</p>
</li>
</ul>
</blockquote>
<hr>
<h2 id="3-deep-residual-learning">3. Deep Residual Learning</h2>
<h3 id="31-residual-learning-잔차학습"><strong>3.1 Residual Learning (잔차학습)</strong></h3>
<p><strong>✓ 용어 정리</strong></p>
<ul>
<li>H(x) : 몇 개의 누적된 레이어(꼭 전체 네트워크일 필요X)가 근사해야하는 목표 함수</li>
<li>x : 레이어들의 입력</li>
</ul>
<p><strong>✓ 잔차 학습</strong></p>
<p><strong>(P)</strong></p>
<ul>
<li>목표 함수 H(x)를 여러 층이 직접 근사하려면 학습에 어려움 → <strong>Degradation problem</strong></li>
</ul>
<p><strong>[가정]</strong></p>
<ul>
<li><p>여러 개의 비선형 레이어가 복잡한 함수를 점근적으로 근사할 수 있다</p>
<p>= <strong>잔차함수( H(x)-x )</strong>를 근사할 수 있다</p>
</li>
</ul>
<blockquote>
<p><strong>✓ 딥러닝의 기본 전제</strong></p>
<ul>
<li>여러 비선형 레이어를 많이 쌓으면, 이론적으로 어떤 복잡한 함수 H(x)도 근사할 수 있다.</li>
</ul>
<p><strong>✓ ResNet의 관점</strong></p>
<ul>
<li><strong>복잡한 함수 H(x)를 직접 근사할 필요가 있을까?</strong></li>
<li>H(x)를 근사할 수 있다면, 똑같이 H(x)-x(즉, 잔차함수 F(x))도 근사 가능<ul>
<li><strong>H(x)와 H(x)-x는 단순히 항등항을 뺀 것이므로, 난이도 면에서 차이X</strong></li>
<li>단, 입력과 출력 차원이 같아야 H(x)-x 정의 가능</li>
</ul>
</li>
</ul>
<hr>
<p><strong>✓ Plain Net</strong></p>
<ul>
<li>층이 곧바로 H(x)를 배워야 함</li>
</ul>
<p><strong>✓ Residual Net</strong></p>
<ul>
<li>F(x) = H(x) - x 만 배우고, 최종 출력이 y = F(x) + x<ul>
<li>네트워크에 전체 함수를 배우라는 대신 항등에서 벗어난 나머지만 배우라고 하는 것</li>
</ul>
</li>
</ul>
<hr>
<p><strong>✓ 왜 이렇게 할까?</strong></p>
<ul>
<li><p>H(x)가 항등에 가까운 경우, F(x)는 아주 작은 값</p>
<p>→ 작은 보정만 배우면 되어 최적화가 훨씬 쉬움</p>
</li>
<li><p>Plain Net은 항등 매핑까지 포함해서 전부 학습해야해서 어려움</p>
</li>
<li><p>ResNet은 문제를 재정식화해서 풀기 쉽게 만들겠다는 것이 요지</p>
</li>
</ul>
</blockquote>
<p><strong>✓ Degradation problem</strong></p>
<ul>
<li><p>추가된  층들이 항등 매핑으로 구성될 수 있다면, 더 깊은 모델의 훈련 오류</p>
</li>
<li><p>항등 매핑이 최적이라면 H(x) =x</p>
<ul>
<li>F(x)=0이면됨</li>
<li>최적화 알고리즘(ex. SGD)은 “여러 층의 weight를 0 근처로 보내기만 해도” 쉽게 항등 매핑 가능</li>
</ul>
</li>
<li><p>실제로 항등이 최적일 가능성은 낮겠지,,</p>
<ul>
<li><p>근데, 항등매핑을 “출발점”으로 두면 문제를 풀기에 쉬워진다</p>
</li>
<li><p>우리가 찾고 싶은 H(x)가 0 mapping보다 항등에 더 가까운 함수라면 H(x)를 새로 배우는 것보다<br>”항등 + 작은 잔차”로 학습하는게 더 쉽다</p>
</li>
<li><p>실제로 실험해보니, 학습된 F(x)값들의 크기는 작았고,<br>대부분의 네트워크는 “항등에 가까운 함수 + 약간의 보정”꼴로 학습됨</p>
<p>⇒ 항등 매핑이 좋은 시작점(precondition)임이 실험적으로 확인</p>
</li>
</ul>
</li>
</ul>
<h3 id="32-identity-mapping-by-shortcuts"><strong>3.2 Identity Mapping by Shortcuts</strong></h3>
<p><strong>✓ Residual Block</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/696390bd-ee33-4476-88fc-95a6f9ad2751/image.png" alt=""></p>
<h3 id="33-network-architectures"><strong>3.3 Network Architectures</strong></h3>
<p><strong>✓ 설계규칙</strong></p>
<p>① 출력 특성 맵 크기가 같으면, 해당 층 필터 개수도 동일하게 유지한다</p>
<p>② 특징맵 크기가 절반으로 줄어들면, 연산 복잡도를 층마다 일정하게 유지하기 위해 필터 개수를 2배 늘림</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/7c9ffeec-ea47-4195-988a-226246d120e4/image.png" alt=""></p>
<p><strong>✓ Residual Network</strong></p>
<p>(A) shortcut이 여전히 항등 매핑을 수행하되, 차원을 늘리기 위해 0값을 채워 넣음</p>
<p>(B) projection shorcut을 사용하여 차원을 맞춤( 1x1 합성곱으로 수행)</p>
<ul>
<li>(A) (B) 모두 서로 다른 크기의 특성맵을 가로 지를 때 stride = 2</li>
</ul>
<h3 id="34-implementation-구현"><strong>3.4 Implementation (구현)</strong></h3>
<p><strong>✓ 데이터 전처리 &amp; 증강</strong></p>
<blockquote>
<p><strong>✓ 스케일 증강</strong></p>
<ul>
<li><p>학습용 이미지의 크기를 <strong>무작위로 다른 크기로 리사이즈</strong>해서 네트워크에 넣는 방법</p>
<p>→ 원래 이미지는 한 가지 고정된 크기(224x224)로만 학습시키지 않고, 입력 이미지를 여러 크기(스케일)에서 보여주어 네트워크가 크기 변화에 강건하도록!</p>
</li>
</ul>
</blockquote>
<ul>
<li><p><strong>scale augmentation</strong></p>
<ul>
<li>이미지의 짧은 변을 [256,480]범위 내에서 랜덤하게 선택</li>
</ul>
</li>
<li><p><strong>crop &amp; flip</strong></p>
<ul>
<li><p>224x224 크기의 영역을 <strong>원본 이미지</strong>나 <strong>좌우 반전된 이미지</strong>에 무작위로 잘라냄</p>
<ul>
<li><p>한 번은 짧은 변이 256으로 맞춰진 이미지에서 crop, 다른 한 번은 480으로 크게 맞춘 뒤 crop</p>
<p>→ 이미지의 불변성을 가지게 됨</p>
<p>ex. 항상 같은 크기의 고양이 사진만 보여주면 “고양이는 딱 이 크기”라고 잘못 배움.</p>
<p>크기를 줄였다 키웠다 하면서 보여주면 “고양이는 크기가 달라도 같은 고양이~”</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>정규화 (→학습 안정화 목표)</strong></p>
<ul>
<li><p>픽셀별 평균값 빼주기</p>
<ul>
<li><p>각 픽셀의 RGB값에서 <strong>전체 학습 데이터셋의 평균값</strong>을 빼주는 작업</p>
<p>→ 입력 데이터 분포가 0 근처로 맞춰져서 학습이 더 안정적이고 빠르게 진행</p>
<blockquote>
<p><strong>✓ 왜 입력 분포를 0 근처로 맞추면 학습이 안정적일까?</strong></p>
<ul>
<li>뉴런의 활성화함수(특히 ReLU, sigmoid,,)는 입력분포가 너무 크거나 치우치면, gradient가 죽거나 폭발</li>
<li><strong>평균이 0에 가깝게 맞춰지면 양수/음수가 균형있게 섞여서 가중치 업데이트에 원활</strong></li>
</ul>
</blockquote>
</li>
</ul>
<p>⇒ 정규화(평균 0 분산 1)는 기울기 소실/폭발을 막고 최적화를 쉽게 함</p>
</li>
</ul>
</li>
<li><p><strong>color augmentation (색상 증강)</strong></p>
<ul>
<li>[21]에서 사용된 표준 방식 따름</li>
</ul>
</li>
</ul>
<p><strong>✓ 네트워크 구성 &amp; 초기화</strong></p>
<ul>
<li>모든 합성곱 뒤, 활성화 함수 전에 Batch Normalization(BN) 적용</li>
<li>가중치 초기화 [13]의 방식</li>
<li>모든 plain/residual 네트워크는 처음부터 학습(pretrain 안씀)</li>
</ul>
<p><strong>✓ 학습 세팅</strong></p>
<ul>
<li>Optimizer : SGD (미니배치 =256)</li>
<li>learning rate : 0.1에서 시작, plateau(수렴상태)마다 10배씩 감소</li>
<li>Iteration(반복) : 최대 60만 회</li>
<li>Weight decay(가중치 감쇠) : 0.001, Momentum : 0.9</li>
<li>Dropout 사용 안함</li>
</ul>
<p><strong>✓ 테스트 세팅</strong></p>
<ul>
<li>10-crop testing : 표준 평가 방법 사용</li>
<li>Fully convolutional 구조 사용</li>
<li>여러 스케일(224,256,384,480,640)에서 결과를 평가</li>
</ul>
<hr>
<h2 id="4-experiments">4. Experiments</h2>
<h3 id="41-imagenet-classification"><strong>4.1 ImageNet Classification</strong></h3>
<ul>
<li>1000개 클래스 포함된 ImageNet 2012 분류 데이터셋 제안 방법 평가<ul>
<li>128만개 학습 이미지로 훈련 + 5만개의 검증이미지로 평가</li>
</ul>
</li>
</ul>
<p><strong>✓ Plain Networks</strong> → 18-layer &amp; 34-layer 네트워크 평가</p>
<ul>
<li><p>34-layer plain net이 훈련/검증 오류 모두 높음 → Degradation problem</p>
<ul>
<li>18층 네트워크의 해 공간 ⊂ 34층 네트워크의 해 공간</li>
</ul>
</li>
<li><p>BN 사용으로 forward/backward 신호 소실은 아님 → 기울기는 정상</p>
<p>✓ <strong>[원인 추측]</strong> <em>지수적으로 낮은 수준의 수렴 속도</em> → 최적화가 어려움</p>
</li>
<li><p>34층도 일정 수준의 정확도는 달성(= 최적화 알고리즘이 어느정도는 작동함을 시사)</p>
</li>
</ul>
<p><strong>✓ Residual Networks</strong> → 18-layer &amp; 34-layer 네트워크 평가</p>
<ul>
<li>Plain Net + 3x3 필터쌍마다 shortcut 추가(<strong>항등 매핑 + zero padding; 차원증가</strong>)</li>
</ul>
<p><strong>① 깊이 증가 효과 (18층 vs. 34층)</strong></p>
<ul>
<li><p>Plain Net: 34층 → 18층보다 성능저하 (Degradation problem)</p>
</li>
<li><p>ResNet: 34층 → 18층보다 2.8% 성능 향상</p>
<p>→ 잔차 학습이 깊어질수록 성능을 높여주더라~</p>
</li>
</ul>
<p><strong>② 훈련 오류 &amp; 일반화</strong></p>
<ul>
<li><p>34층 ResNet은 훈련 오류⬇️</p>
</li>
<li><p>검증 데이터에도 잘 일반화</p>
<p>→ Degradation problem 해결 + 깊이 증가로 정확도 이득</p>
</li>
</ul>
<p><strong>③ Plain Net vs ResNet(동일 깊이, 34층)</strong></p>
<ul>
<li><p>ResNet이 PlainNet보다 Top-1 오류율 3.5% 감소</p>
<p>→ 매우 깊은 네트워크에서도 residual learning의 효과 입증</p>
</li>
</ul>
<p><strong>④ 18층 모델 비교</strong></p>
<ul>
<li>정확도는 Plain과 ResNet 거의 동일</li>
<li>그런데 ResNet이 수렴속도가 훨씬 빠르더라~</li>
</ul>
<p><strong>✓ Identity vs. Projection Shortcuts</strong></p>
<blockquote>
<p><strong>✓ A/B/C shortcut 비교</strong></p>
<p>(A) : <strong>(차원 증가시)</strong> 0-padding 지름길 사용, (나머지) <strong>항등 지름길</strong> 사용 / 모든 지름길 파라미터X</p>
<p>(B) : <strong>(차원 증가시)</strong> projection 지름길 사용, (나머지) <strong>항등 지름길</strong> 사용</p>
<p>(C) : (모든 지름길) projection 지름길 사용</p>
</blockquote>
<p>⇒ A&lt;B&lt;C 이긴 하나, 성능 차이 크지 X - projection이 필수적이진 않다~</p>
<p><strong>✓ A&lt;B:</strong> 0으로 채운 차원은 실제로 잔차학습이 일어나지 않기 때문</p>
<p><strong>✓ B&lt;C:</strong> 다수(13개)의 projection 지름길로 인해 추가 파라미터가 도입되었기 때문</p>
<blockquote>
<p><strong>✓ 왜 projection을 사용할까?</strong></p>
<ul>
<li>입력과 출력 차원이 같은 경우 → Identity shortcut 이 효율적</li>
<li>입력과 출력 차원이 다를 경우<ul>
<li>Zero padding → 채널 부족분을 0으로 채움(파라미터X)</li>
<li>Projection shortcut → 1x1 Conv로 변환해서 정확히 맞춤(파라미터, 연산량 O)</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li>Zero padding은 단순히 빈 채널을 0으로 두기 때문에, <strong>그 채널에서는 학습이 전혀 안 일어남</strong></li>
<li>Projection은 1x1 Conv를 통해 실제로 의미있는 학습된 변환을 넣어줌<ul>
<li>보통 차원이 바뀔 때 projection을 쓰는 게 더 안정적</li>
</ul>
</li>
</ul>
<p>⇒ Zero padding은 단순히 모양 맞추기인 반면, projection은 단순히 크기만 맞추는 것이 아닌 차원을 늘리거나 줄일때 중요한 특징을 보존/강조하는 방향으로 학습</p>
</blockquote>
<p><strong>✓ Deeper Bottleneck Architectures</strong></p>
<p>→ 훈련시간의 부담을 줄이기 위하여 <strong>기본블록 → 병목 구조</strong>로 수정</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/901fe897-08d0-4ffa-ae7a-3db47fcb0859/image.png" alt=""></p>
<blockquote>
<p><strong>✓ Identity shortcut vs. Projection shortcut</strong></p>
<ul>
<li><p><strong>Identity shortcut:</strong> 입력 x를 그대로 더함 → 파라미터 X, 연산량 X</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1db25bfc-b70d-477e-a8dd-c8a418575275/image.png" alt=""></p>
</li>
<li><p><strong>Projection shortcut:</strong> 입력을 1x1 conv 등으로 변환하여 더함 → 파라미터, 연산량 추가</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/aed36377-21a5-4d8d-aced-6a7e64a274de/image.png" alt=""></p>
<ul>
<li>입력과 출력의 shape(특히 채널 수)가 다를 때, 그냥 더하면 안 맞음</li>
<li>1x1 conv → 픽셀 위치(공간좌표)는 그대로, 채널 차원에서 선형결합하여 새로운 채널공간으로 매핑<ul>
<li>입력을 원하는 차원으로 바꾼 뒤 더함</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>✓ 복습</strong></p>
<ul>
<li>1x1 conv: 채널 변환</li>
<li>3x3 conv: 채널 변환 + 공간</li>
</ul>
<p>→ projection shortcut은 공간은 건드리지 말고 채널만 맞추자!</p>
<hr>
<p>원래 shortcut은 “연결선”처럼 아무것도 안하는 통로인데, projection을 쓰면 그 통로 안에 1x1 conv라는 작은 layer 추가</p>
<p>즉, shortcut 경로도 단순한 선이 아니라 <strong>연산을 수행하는 새로운 레이어</strong>가 되는 것!</p>
</blockquote>
<blockquote>
<p><strong>✓ Projection shortcut이 비효율적인 이유</strong></p>
<ul>
<li>Identity shortcut은 입력을 통과시키면 끝이지만,</li>
<li>Projection shortcut은 1x1conv를 고차원 feature에 적용해야함<ul>
<li>블록의 입력/출력은 보통 채널수가 많은 고차원 feature map</li>
<li>shortcut 연결은 블록의 입력x와 출력y를 바로 더해야 함</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>고차원 feature에 1x1 conv를 적용하면 연산량이</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/8b0a37e6-695b-4c0f-acb5-442936b72d83/image.png" alt=""></p>
<p>이라서 파라미터와 연산비용이 큼
→ bottleneck 구조는 중간(3x3 conv)에서 채널을 줄여 효율적으로 계산하려고 만든건데,
→ projection은 블록 양 끝 고차원 부분에 직접 1x1 conv를 때려야 하니까 연산량⬆️</p>
</li>
</ul>
</blockquote>
<p><strong>✓ 50-layer ResNet</strong></p>
<ul>
<li>34층 네트워크의 2층 블록을 3층 블록으로 교체하여 50층 ResNet 구성</li>
</ul>
<p><strong>✓ 101-layer and 152-layer ResNets</strong></p>
<ul>
<li>더 많은 3층 블록을 사용하여 101층과 152층 ResNet 구성<ul>
<li>깊이가 크게 증가했음에도 VGG-16/19보다 복잡도 낮음</li>
<li>깊이 늘릴수록 성능 향상(degradation problem X)</li>
</ul>
</li>
</ul>
<p><strong>✓ Comparisons with State-of-the-art-Methods (최신기법과 비교)</strong></p>
<ul>
<li>152층 단일 모델 → 기존 앙상블보다 우수~</li>
<li>깊이가 다른 6개의 모델 앙상블(152층 2개 포함) → 테스트 셋 Top-5 오류율 3.57%<ul>
<li>ILSVRC 2015 1위~</li>
</ul>
</li>
</ul>
<h3 id="42-cifar-10-and-analysis"><strong>4.2 CIFAR-10 and Analysis</strong></h3>
<p><strong>✓ CIFAR-10 실험 결과</strong></p>
<ul>
<li>목적: 최고 성능 기록 갱신 X, <strong>극도로 깊은 네트워크 동작 특성 관찰</strong><ul>
<li>의도적으로 단순한 아키텍처 사용</li>
</ul>
</li>
<li>구조<ul>
<li>입력: 32 x 32 이미지, 첫 층 3x3 conv</li>
<li>그 다음에 3개의 stage (32→16→8)<ul>
<li>Stage 1: 특성맵 크기 32x32, 2n개의 3x3 conv 층 - 필터 16개</li>
<li>Stage 2: 특성맵 크기 16x16, 2n개의 3x3 conv층 - 필터 32개</li>
<li>Stage 3: 특성맵 크기 8x8, 2n개의 3x3 conv층 - 필터 64</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 왜 2n개일까?</strong></p>
<ul>
<li>ResNet은 기본적으로 Residual Block 단위로 쌓임<ul>
<li>3x3 conv → 3x3 conv (2개) 로 구성
→ Residual Block</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 3개의 stage?</strong></p>
<ul>
<li><p>CIFAR-10 입력은 32x32로 작음</p>
<p>→ 다운샘플링을 너무 많이 하면 feature map 1x1 수준까지 금방 줄어들어 학습이 힘들어짐</p>
</li>
</ul>
</blockquote>
<ul>
<li>전체 층 수: 6n+2(첫 conv 1개+각 stage 6n개 + 마지막 FC 1개)</li>
<li>다운샘플링(8→4): stride=2 conv로 처리</li>
<li>마지막: global average pooling → 10-way FC → Softmax
(10-way FC: 출력노드가 10개인 FC, 10개의 클래스 분류 문제에 사)</li>
<li>Identity shortcut만 사용
→ plain과 resnet의 깊이/너비/파라미터 수 정확히 동일해서 “잔차 연결 유무”만의 효과를 공정하게 비교 가능</li>
<li>학습<ul>
<li>weight decay 0.001, 모멘텀 0.9, BN사용, dropout 없음</li>
<li>미니배치 128, GPU</li>
<li>학습률 0.1 시작 → 32k/48k반복에서 10배 감소 → 64k 반복에서 종료</li>
</ul>
</li>
<li>결과<ul>
<li>plain net: 깊어질수록 훈련/테스트 에러⬆️ → 최적화 난이도 증가</li>
<li>ResNet: 깊어질수록 최적화 문제를 극복하고 정확도⬆️</li>
<li>110층 ResNet(n=18): 잘 수렴, SOTA 수준 달성</li>
<li>1202층 ResNet(n=200): 학습은 성공했으나 110층보단 별루<ul>
<li>과적합</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>⇒ Plain 네트워크는 깊어질수록 오히려 성능 저하, ResNet은 깊어질수록 정확도 향상</strong></p>
<p><strong>✓ Analysis of Layer Responses (레이어 반응 분석)</strong></p>
<ul>
<li>ResNet이 일반 네트워크보다 전반적으로 더 작은 반응값을 가짐<ul>
<li>잔차함수가 일반함수보다 보통 0에 가깝다는 가설 뒷받침</li>
</ul>
</li>
<li>깊어질수록 반응이 더 작아짐</li>
</ul>
<p><strong>✓ Exploring Over 1000 layers ( 1000층 이상 네트워크 탐구)</strong></p>
<ul>
<li>1202층 네트워크 110층과 훈련 오류는 유사, 테스트 성능은 낮음<ul>
<li>과적합때문</li>
</ul>
</li>
</ul>
<h3 id="43-object-detection-on-pascal-and-ms-coco"><strong>4.3 Object Detection on PASCAL and MS COCO</strong></h3>
<ul>
<li>R-CNN 사용</li>
<li>깊은 잔차 네트워크를 기반으로 1위 차지 했다~</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] YOLOv11: An Overview of the Key Architectural Enhancements]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-YOLOv11-An-Overview-of-the-Key-Architectural-Enhancements</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-YOLOv11-An-Overview-of-the-Key-Architectural-Enhancements</guid>
            <pubDate>Wed, 22 Jul 2026 12:19:50 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: YOLOv11: An Overview of the Key Architectural Enhancements
<strong>학회(출판연도)</strong>: arXiv (2024)
<strong>연구분야</strong>: 딥러닝 기반 객체 탐지 및 컴퓨터 비전(Object Detection &amp; Computer Vision)</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<blockquote>
<p><strong>✓ 아키텍쳐적 분석</strong></p>
<ul>
<li>모델 구조를 세부적으로 뜯어 보겠다~</li>
<li>보통 논문에서 “아키텍처 분석”이라고 하면<br>→ 이 모델이 왜 빠른지? 어떤 모듈이 정확도를 높였는지? 기존 아키텍처와 비교해 어떤 구조적 차이가 있는지? 같은 걸 따져 보겠다</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 인스턴스 세그멘테이션</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/fce73324-b2c6-4b9a-8aae-5d6edf38631f/image.png" alt=""></p>
<ul>
<li>물체를 픽셀 단위로 잘라내면서 동시에 “각 객체(인스턴스)”를 구분<ul>
<li>각 클래스 내에서도 <strong>개별 객체를 분리</strong>한다는 점에서 단순 semantic segmentation과 다름</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 포즈 추정</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/96b17d9a-ba30-4fc4-a1cd-4b6943523c9b/image.png" alt=""></p>
<ul>
<li>객체(특히 사람)의 관절/키포인트 위치를 추정해 “자세”를 파악</li>
</ul>
<p><strong>[방식]</strong></p>
<p><strong>① Top-down</strong></p>
<ul>
<li>객체(사람) 탐지 → 그 영역에서 관절 좌표 추정</li>
</ul>
<p><strong>② Bottom-up</strong></p>
<ul>
<li>이미지 전체에서 관절 후보 검출 → 이들을 연결하여 각 사람의 포즈 구성</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Oriented Object Detection(OBB, 방향성 객체 탐지)</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b0c56717-cc07-4b8d-a085-f76e91d6b792/image.png" alt=""></p>
<ul>
<li>객체의 기울어진 바운딩 박스 검출<ul>
<li>기본 Object Detection은 축과 평행한 직사각형 박스만 가능 → 기울어진 물체 표현⬇️</li>
</ul>
</li>
<li>중심 좌표(x,y), 폭, 높이, 회전각(세타) 예측 → 박스를 물체 방향에 맞게 회전</li>
</ul>
</blockquote>
<p><strong>✓ YOLOv 11</strong></p>
<ul>
<li>C3k2 블록(Cross Stage Partial with kernel size 2), SPPF(Spatial Pyramid Pooling-Fast), C2PSA(Convolutional block with Parallel Spatial Attention) 구성요소의 도입</li>
<li>객체 탐지 + 인스턴스 세그멘테이션, 포즈 추정, Oriented Object Detection(OBB)</li>
<li>mAP &amp; 계산 효율성 개선 + 파라미터 수와 정확도 사이의 trade-off</li>
<li>nano<del>extra-large 모델 크기까지 제공 → 엣지 디바이스</del>고성능 서버 환경까지 가</li>
</ul>
<hr>
<h2 id="1-introduction서론">1. Introduction(서론)</h2>
<p><strong>✓ 배경</strong></p>
<ul>
<li>CV에서 중요한 건 “객체 탐지(object detection)”<ul>
<li>이미지, 비디오 스트림 속 객체를 정확히 식별하고 위치를 찾는 것까지 포함</li>
</ul>
</li>
</ul>
<p><strong>✓ YOLO</strong></p>
<ul>
<li>전체 이미지 한 번만 처리 → 객체와 객체의 위치 탐지</li>
<li>회귀문제로 정의 → 1 stage<ul>
<li>CNN → 바운딩 박스 + 클래스 확률 동시 예측 : 훨씬 단순화된 파이프라인</li>
</ul>
</li>
</ul>
<p><strong>✓ YOLOv 11</strong></p>
<ul>
<li>고도화된 특징 추출 기법 → 파라미터 수를 최소화하면서 정교한 세부 정보를 포착 가능해짐</li>
</ul>
<hr>
<h2 id="2-evolution-of-yolo-models">2. Evolution of YOLO models</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c5e29c68-7a80-4520-97f0-77f08ef9b636/image.png" alt=""></p>
<ul>
<li><strong>&lt;초기 YOLO&gt;</strong> single-stage 객체 탐지 방식 ~ <strong><YOLOv10></strong> NMS-free 학습방식까지</li>
<li><strong><YOLOv11></strong> 특징추출, 효율성, 멀티태스크 처리 능력 향상</li>
</ul>
<hr>
<h2 id="3-what-is-yolov11">3. What is YOLOv11?</h2>
<p><strong>✓ 차별화</strong></p>
<p>→ <strong>① 포즈 추정(posture estimation) ② 인스턴스 세그멘테이션(instance segmentation)</strong></p>
<p>⇒ 모델의 적용 가능성 확장가능</p>
<p><strong>✓ 설계</strong></p>
<p>→ <strong>① 성능 ② 실용성의 균형</strong> 에 중점 → 더 높은 정확성과 효율성 해결 목표</p>
<hr>
<h2 id="4-architectural-footprint-of-yolov11">4. Architectural footprint of YOLOv11</h2>
<p><strong>✓ YOLO 프레임 워크</strong></p>
<p>: BBox 회귀와 객체 분류 작업을 동시에 처리할 수 있는 통합 신경망 구조의 도입 → 객체 탐지의 혁신</p>
<p>① Single-stage(↔ 2단계 탐지 방식)</p>
<p>② 완전 미분 가능 설계 → end-to-end 학습 가능</p>
<p><strong>✓ YOLO 아키텍처의 핵심, 3가지 구성요소</strong></p>
<blockquote>
<p><strong>✓ 다중 스케일 특징맵</strong></p>
<ul>
<li><p>CNN은 레이어를 거치면서 “특징맵(feature map)”의 크기가 점점 작아짐(해상도⬇️)<br>→ 채널 수, 추상적 의미⬆️</p>
<ul>
<li><p><strong>얕은 레이어(앞단)</strong>: 해상도 <strong>높음</strong>, 세부 디테일(모서리,질감,작은 물체) 잘 보존</p>
</li>
<li><p><strong>깊은 레이어(뒷단)</strong>: 해상도 <strong>낮음</strong>, 의미적 정보(ex. 이건 고양이) 잘 표현</p>
<p>→ 작은 물체는 앞단 feature에서 잘 보이지만, 뒤로 갈수록 사라짐</p>
<p>→ 큰 물체는 뒷단 feature에서 잘 잡히지만, 앞단에서 구분이 어려움</p>
</li>
</ul>
</li>
</ul>
<p>⇒ <strong>여러 스케일의 feature map을 동시에 활용하는 것이 필요!</strong></p>
<ul>
<li><strong>대표적인 3가지 구조</strong><ul>
<li><strong>FPN(Feature Pyramid Network)</strong><ul>
<li>깊은 feature와 얕은 feature를 top-down + lateral 연결해서 결합</li>
<li>작은/중간/큰 객체를 모두 잡도록 설계</li>
</ul>
</li>
<li><strong>PANet</strong><ul>
<li>FPN에 <strong>bottom-up 경로</strong> 추가 → 정보 전달 더 강화</li>
</ul>
</li>
<li><strong>YOLO 계열</strong><ul>
<li>YOLOv3부터 3가지 크기의 feature map 사용(13x13, 26x26, 52x52)</li>
<li>작은 grid → 큰 객체 탐지/큰 grid → 작은 객체 탐지</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Grid와 Feature Map 관계</strong></p>
<p>✓ <YOLO>에서 grid = 최종 feature map의 <strong>”cell”</strong></p>
<p>⇒ grid가 작아질수록, 한 칸이 보는 영역(receptive field)가 훨씬 넓어짐</p>
<p>✓ 큰 객체: 넓은 영역을 커버해야하므로, 작은 grid가 유리</p>
<p>✓ 작은 객체: 세밀한 픽셀 차이까지 잡아야하므로, 큰 grid가 유리</p>
</blockquote>
<p>① <strong>백본(backbone)</strong>: <strong>주요 특징 추출기</strong>로 작동/CNN을 통해 원본 이미지를 <strong>다중 스케일 특징 맵</strong>으로 변환</p>
<p>② <strong>넥(neck)</strong>: <strong>중간 처리 단계</strong>로 기능/특수화된 층을 사용해 <strong>서로 다른 스케일 특징을 통합 및 강화</strong></p>
<blockquote>
<p><strong>✓ 서로 다른 스케일 특징을 통합 및 강화?</strong></p>
<ul>
<li><p>특수화된 층: FPN, PANet, C3k2, Attention 모듈</p>
<p>→ 이 층들은 서로 다른 깊이(스케일)에서 나온 특징들을 합치고(aggregation),<br>중요한 정보는 강조(attention/weighting)해서 모델이 더 잘 인식하도록 도움!</p>
</li>
</ul>
<p>⇒ 작은 물체, 큰 물체 각각에 맞는 정보를 잘 쓰기 위해 다양한 깊이에서 뽑힌 특징들을 합쳐서(통합) 중요한 부분은 더 강조(강화)하는 층들을 사용한다</p>
</blockquote>
<p>③ <strong>헤드(head)</strong>: <strong>예측 매커니즘</strong>/정제된 특징맵을 바탕으로 <strong>객체 위치(localization)과 분류 결과</strong> 최종 출력</p>
<p><strong>✓ YOLOv 11</strong></p>
<p>→ YOLOv 8을 확장 및 개선</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f028435a-2464-4fd9-8a74-d8364015c0ed/image.png" alt=""></p>
<h3 id="41-backbone">4.1 Backbone</h3>
<p>→ 입력 이미지로부터 <strong>다중 스케일 특징 추출</strong>하는 역할 담당</p>
<ul>
<li>합성곱 층과 특수 블록을 적층하여 다양한 해상도의 feature map 생성!</li>
</ul>
<p><strong>4.1.1 Convolutional Layers</strong></p>
<ul>
<li>초기 합성곱(Conv)층을 사용해 이미지를 <strong>다운샘플링</strong>하면서 특징 뽑음<ul>
<li>해상도⬇️ 채널 수⬆️ → 점점 더 추상적인 특징맵 get!</li>
</ul>
</li>
</ul>
<p><strong>✓ 주요 개선점</strong></p>
<p><strong>✓ C3k2 블록 도입</strong></p>
<ul>
<li>CSP 병목구조를 더 효율적으로 구현</li>
<li>하나의 큰 합성곱 대신 작은 합성곱 2개 사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e64179e5-036b-4824-8c58-acf0c9cd61ec/image.png" alt=""></p>
<p><strong>4.1.2 SPPF &amp; C2PSA</strong></p>
<blockquote>
<p><strong>✓ SPPF(Spatial Pyramid Pooling-Fast) → 멀리 가까이 동시에 보기</strong></p>
<p>→ 다양한 크기의 객체를 잘 잡기 위해 여러 크기의 receptive field를 동시에 보는 블록</p>
<ul>
<li>구조<ul>
<li>보통 하나의 5x5 max pooling을 반복해서 9x9, 13x13 같은 큰 커널 효과 얻음</li>
<li>마지막에 concat해서 채널 방향 합침</li>
</ul>
</li>
</ul>
<p><strong><em>→ ✓SPPF 이거 다시 보기,, 뭔 구조야</em></strong></p>
</blockquote>
<blockquote>
<p><strong>✓ C2PSA(Cross Stage Partial with Spatial Attention) → 중요한 부분에 초점</strong></p>
<p>→ “공간적 주의집중(spatial attention)”을 도입해서, 이미지 안에서 어디가 중요한 영역인지 강조</p>
<p>→ CSP(Cross Stage Partial) 구조 위에 어텐션 모듈을 얹은 것</p>
<ul>
<li><p>구조</p>
<ul>
<li><p>C2f(CSP 변형 블록) + Spatial Attention 모듈</p>
</li>
<li><p>Spatial Attention은 보통 “어떤 위치가 중요할까?”를 학습해서 중요도 맵(heatmap)을 곱해줌</p>
<p>ex. 배경은 약하게, 객체는 강하게</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li><p><strong>SPPF 블록</strong> → <strong><em>다양한 크기</em></strong>의 객체에 잘 반응하도록 만드는 블록</p>
<ul>
<li>YOLOv5, v8에도 있던 블록인데, v11에도 유지됨</li>
</ul>
</li>
<li><p><strong>SPPF 블록 뒤에 C2PSA 블록 추가</strong></p>
<ul>
<li><p>C2PSA = CSP구조(C2f와 비슷) + 공간적 어텐션(spatial attention)</p>
</li>
<li><p>단순 특징맵을 합치는 것이 아닌 어떤 위치/공간이 중요한 지 강조하는 기능 추가</p>
<p>⇒ 모델이 이미지 전체를 균등하게 보는 것이 아니라,</p>
<p><strong>중요한 부분(=관심영역, object 후보 위치)에 집중 가능</strong></p>
<p>⇒ 작은 물체나 복잡한 배경 속에 물체 탐지 정확도가 향상될 수도 있음</p>
</li>
</ul>
</li>
</ul>
<h3 id="42-neck">4.2 Neck</h3>
<p>→ 여러 스케일의 특징을 <strong>결합하여 헤드(head)에 전달</strong>해 예측에 활용</p>
<ul>
<li><strong>업샘플링과 다른 레벨의 특징맵의 연결</strong>을 통해 다중 스케일 정보를 효과적으로 포착하도록!</li>
</ul>
<p><strong>4.2.1 C3k2 block</strong></p>
<ul>
<li><strong>C2f → C3k2 블록</strong>으로 교체</li>
<li>업샘플링, 연결 후 속도와 성능 강화</li>
</ul>
<blockquote>
<p><strong>✓ 다운 샘플링</strong></p>
<p>→ feature map 크기를 줄이는 것</p>
<hr>
<p><strong>✓왜 할까?</strong></p>
<ul>
<li>계산량 줄이기: 이미지가 클수록 연산량이 커짐</li>
<li>추상적 특징 학습: 국소적인 정보(edge, pattern)를 점차 요약해서 의미적 정보로 변환</li>
<li>큰 수용영역 : 더 큰 맥락 파악</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 업 샘플링</strong></p>
<p>→ feature map 크기를 늘리는 것</p>
<hr>
<p><strong>✓왜 할까?</strong></p>
<ul>
<li>해상도 복원: 세그멘테이션에서 원본 크기와 같은 출력 필요</li>
<li>작은 객체 탐지 강화: 해상도를 키워서 세밀한 디테일 다시 확보</li>
<li><strong>feature fusion: 깊은 층(추상적 의미) + 얕은 층(디테일)을 합칠 때 크기를 맞춰야 함</strong></li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Backbone과 Neck 모두 C3k2? → YES!</strong></p>
<ul>
<li><strong>Backbone</strong><ul>
<li>기존 YOLOv의 C2f 블록을 C3k2 블록으로 교체</li>
<li>초기 단계부터 &lt;<strong>특징 추출&gt;</strong>을 더 가볍고 효율적으로 수행</li>
</ul>
</li>
<li><strong>Neck</strong><ul>
<li>마찬가지로 기존 <strong>C2f → C3k2</strong>로 교체</li>
<li>멀티스케일 &lt;<strong>특징을 합치는 과정&gt;</strong>에서 연산량을 줄이고 속도를 높임</li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>4.2.2 Attention Mechanism</strong></p>
<ul>
<li><p><strong>C2PSA 모듈을 통한 공간적 어텐션</strong> 강화</p>
<p>→ 이미지 내의 중요 영역 집중할 수 있게 해서 <strong>작거나 부분적으로 가려진 객체 탐지 정확도 향상</strong></p>
</li>
</ul>
<h3 id="43-head">4.3 Head</h3>
<p>→ 객체 탐지의 분류에 대한 <strong>최종 예측</strong></p>
<p>Neck에서 전달된 특징맵을 처리해, 최종적으로 이미지 내 <strong>객체의 바운딩 박스가 클래스 레이블 출력</strong></p>
<p><strong>4.3.1 C3k2 block</strong></p>
<ul>
<li>헤드 내 여러 경로에 배치되어 다양한 깊이의 다중 스케일 특징을 처리하는 역할(효율적)</li>
<li>파라미터 값에 따라 유연하게 동작<ul>
<li><strong>C3k = False</strong>: C3k2모듈이 C2f 블록과 유사하게 동작(기본적인 bottleneck 구조)</li>
<li><strong>C3k = True:</strong> 병목 구조가 C3 모듈로 대체되어, 더 <strong>깊고</strong> <strong>복잡한 특징</strong> 추출 가능</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ C3k=True/False와 add=True/False 비교</strong></p>
<ul>
<li><strong>C3k=True/False</strong><ul>
<li>C3k2 <strong><em>블록의 구조</em></strong>를 어떤 식으로 쓸 지 선택(C2f형 vs C3형)</li>
</ul>
</li>
<li><strong>add=True/False</strong><ul>
<li>skip connection에서 덧셈을 할 지, concat을 할 지 <strong><em>연결 방식</em></strong> 제어</li>
</ul>
</li>
</ul>
<p>⇒ C3k는 블록 내부 구조 선택</p>
<p>⇒ add는 연결 방식 선택</p>
</blockquote>
<p><strong>✓ C3k2 블록의 주요 특징</strong></p>
<ul>
<li><strong>Faster processing</strong><ul>
<li>2개의 작은 합성곱을 사용하여 큰 합성곱 하나보다 계산 부담⬇️</li>
<li>특징 추출 속도 빨라짐</li>
</ul>
</li>
<li><strong>Parameter efficiency</strong><ul>
<li>C3k2는 CSP 병목 구조의 더 간결한 버전</li>
<li>학습 가능한 파라미터 수 측면에서 아키텍처를 더 효율적으로</li>
</ul>
</li>
<li><strong>커널 크기</strong> 사용자가 정의 가능 → 유연성⬆️<ul>
<li>더 세밀한 특징 추출하는데 유</li>
</ul>
</li>
</ul>
<p><strong>4.3.2 CBS blocks</strong></p>
<ul>
<li>C3k2 블록 이후 여러 개의 CBS 레이어 포함</li>
<li>특징추출, 탐지과정 ← 기초적인 구성요소로 작동</li>
<li>정제된 특징맵 이후 레이어로 전달되어 바운딩 박스와 분류 예측에 활용될 수 있도록 보장</li>
</ul>
<p><strong>✓ 특징맵 정제 방법 (Conv → BN → SiLU)</strong></p>
<p>① 관련 특징 추출</p>
<p>② BN을 통해 데이터 흐름을 안정화 및 정규화</p>
<p>③ SiLU(Sigmoid Linear Unit) 활성화 함수를 사용해 비선형성 도입 → 모델 성능 향상 기</p>
<p><strong>4.3.3 Final Convolutional Layers and Detect Layer</strong></p>
<ul>
<li>각 detection branch는 Conv2D 레이어 집합으로 끝<br>→ 이 레이어들이 특징맵을 줄여서 BBox 좌표와 클래스 예측에 필요한 출력 수로 변환</li>
</ul>
<p><strong>✓ Detect layer의 예측</strong></p>
<ul>
<li>이미지 내 객체 위치를 찾기 위한 <strong>BBox 좌표</strong></li>
<li>객체가 존재할 가능성을 나타내는 <strong>객체성 점수</strong></li>
<li>탐지된 객체의 종류를 판별하기 위한 <strong>클래스 점수</strong></li>
</ul>
<p><strong>&lt;YOLOv11 전체 흐름&gt;</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5fa9d2e7-80e8-4185-98b9-0899acd06117/image.png" alt=""></p>
<hr>
<h2 id="5-key-computer-vision-tasks-supported-by-yolov11">5. Key Computer Vision Tasks Supported by YOLOv11</h2>
<p>→ YOLOv 11 다양한 CV 작업 지원</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] You Only Look Once: Unified, Real-Time Object Detection]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-You-Only-Look-Once-Unified-Real-Time-Object-Detection</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-You-Only-Look-Once-Unified-Real-Time-Object-Detection</guid>
            <pubDate>Wed, 22 Jul 2026 12:09:11 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: You Only Look Once: Unified, Real-Time Object Detection
<strong>학회(출판연도)</strong>: CVPR (2016)
<strong>연구분야</strong>: 딥러닝 기반 객체 탐지 및 컴퓨터 비전</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<blockquote>
<p><strong>✓ 단일 네트워크</strong></p>
<ul>
<li><p>입력(이미지)부터 출력(탐지 결과)까지 <strong>하나의 신경망</strong>이 책임지는 구조</p>
<p>ex. <YOLO> 객체 후보 영역→특징추출→분류를 따로따로 하지 않고<br><em>하나의 네트워크에서 한 번에 처리!</em></p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 손실함수(Loss Function)</strong></p>
<ul>
<li>모델이 예측한 값과 실제 정답 사이의 차이를 수치로 나타낸 함수<ul>
<li>값이 <strong>작을수록</strong> → 예측이 정답에 가깝다.</li>
<li>값이 <strong>클수록</strong> → 예측이 많이 틀렸다.</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 엔드 투 엔드(end-to-end) 학습</strong></p>
<ul>
<li><p>입력에서 출력까지 전체 과정을 “<strong>하나의 목적(손실함수)”으로 묶어 직접 최적화</strong></p>
<ul>
<li><p><strong>&lt;전통적&gt;</strong>: Region Proposal 네트워크 따로, CNN 분류기 따로<br>→ 각각 부분 최적화</p>
</li>
<li><p><strong><YOLO>:</strong> 탐지 성능(mAP 등)을 반영한 <strong>하나의 손실함수</strong>로  
<strong>좌표+ 클래스 예측을 동시에 학습</strong></p>
<p>→ 네트워크 전체가 한 번에 업데이트!  
<strong>(구간 별 개선X, 최종 기록 하나만 보고 훈련)</strong></p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 목적이 손실함수?</strong></p>
<ul>
<li><p>머신러닝 모델은 학습 과정에서 “손실 함수의 값을 최소화”하는<br>방향으로 파라미터(가중치)를 업데이트</p>
<p>→ <strong>학습 과정 전체의 최종목표가 손실함수를 줄이는 것이기 때문</strong></p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ YOLO에서의 손실함수 예시</strong></p>
<ul>
<li>바운딩 박스 위치 오차(좌표 손실)</li>
<li>박스 크기 오차(width, height)</li>
<li>객체 존재 여부(objectness)</li>
<li>클래스 분류 오차</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 엔드 투 엔드 방식의 장점</strong></p>
<ul>
<li>전체 최적화, 단순한 파이프라인, 빠른 학습 및 추론, 에러 누적 방지, 확장성과 일반화</li>
</ul>
<p>→ 처음부터 끝까지 한 팀이 전체를 보고 최적화하기 때문에 최종 결과       품질이 좋아짐</p>
<p>✓ 각각의 다른 팀들이 따로 최적화를 하면 최종적인 결과가 이상해질 수도 있음</p>
</blockquote>
<p><strong>✓ YOLO(You Only Look Once)</strong></p>
<p>→ “이미지를 단 한 번만 보고, 동시에 탐지와 분류를 끝낸다”</p>
<blockquote>
<p><strong>&lt;전통적&gt; R-CNN 계열</strong>: 이미지를 여러 번 본다</p>
<p>→ 먼저 영역 후보(region proposal)를 찾고 그 영역을 다시 CNN으로 분류</p>
<p><strong><YOLO></strong>: 이미지를 <em>딱 한 번만</em> 본다(look once)</p>
<p>→ 한 번의 네트워크 연산으로 <strong>객체의 위치 + 클래스</strong>를 동시에 예측</p>
</blockquote>
<blockquote>
<p>✓ 이미지를 한 번만 전체적으로 훑어서,</p>
<p>그리드 단위로 <strong>객체의 위치(바운딩 박스)와 종류(클래스)를 “동시에 예측”</strong>하는</p>
<p>실시간 객체 탐지 알고리즘</p>
</blockquote>
<ol>
<li><p><strong>기존 방식과의 차이점</strong></p>
<p><strong>&lt;기존&gt;</strong></p>
<ul>
<li>주로 이미지 분류 모델을 변형해 객체 탐지에 사용 → 속도가 느리고 과정이 복잡</li>
</ul>
<p><strong><YOLO></strong></p>
<ul>
<li><p>객체 탐지를 <strong>하나의 회귀(regression)</strong> 문제로 정의</p>
<p>→ 바운딩 박스 위치 + 클래스 확률을 동시에 예측</p>
</li>
<li><p>이미지를 입력받으면 <strong>“단일 신경망”</strong>이 바로 전체 탐지 수행</p>
<ul>
<li><p>여러 단계X <strong>“한 번에(You Only Look Once)”</strong> 결과를 내는 구조</p>
<p>→ <strong>엔드 투 엔드 최적화</strong><br>(성능 기준으로 전체 네트워크를 직접 조정 가능)</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>YOLO의 특징</strong></p>
</li>
</ol>
<blockquote>
<ul>
<li><strong>기본 YOLO:</strong> 초당 45프레임(실시간 영상 처리 가능)</li>
<li><strong>Fast YOLO:</strong> 초당 155프레임(매우 빠른 속도)<ul>
<li>mAP(mean Average Precision): 기존 <strong>실시간 탐지기보다 약 2배 높음</strong></li>
</ul>
</li>
</ul>
</blockquote>
<p><strong>✓ 장점</strong></p>
<ul>
<li>빠름 → 실시간 응용에 적합</li>
<li><em>배경에서의 잘못된 탐지를 줄임</em><ul>
<li><em>배경(물체가 아닌 부분)을 물체라고 착각하는 일이 적다.</em></li>
</ul>
</li>
<li>학습한 특징이 일반적이므로, 다른 도메인(ex. 예술작품)에도 잘 적용 가능!</li>
</ul>
<p><strong>✓ 단점</strong></p>
<ul>
<li><p>다른 최신 객체 시스템과 비교했을 때 위치(localization) 정확도가 떨어짐<br>(박스가 덜 정확할 수도)</p>
<p><strong>⇒ YOLO는 “진짜 물체인지 아닌지(배경인지)”를 잘 구별하지만,<br>물체의 위치를 아주 정교하게 잘라내는 능력은 부족하다~</strong></p>
</li>
</ul>
<hr>
<h2 id="1-introduction서론">1. Introduction(서론)</h2>
<p><strong>✓ 왜 객체 탐지가 중요한가?</strong></p>
<p><strong>&lt;사람&gt;:</strong> 한 번 흘끗 보기만 해도<br><em>①이미지 안에 <strong>무엇이</strong> 있는지 ②<strong>어디에</strong>  있는지 ③ <strong>어떻게</strong>  상호작용하는지</em> 즉시 파악</p>
<p>→ 이러한 능력을 컴퓨터가 갖추면, 자율주행, 시각 보조 등 다양하게 활용 가능해짐</p>
<p><strong>✓ (P) 이전 방식의 한계 → (S) YOLO의 등장</strong></p>
<ol>
<li><strong>이전 방식과 YOLO</strong></li>
</ol>
<table>
<thead>
<tr>
<th></th>
<th>DPM</th>
<th>R-CNN</th>
<th>YOLO</th>
</tr>
</thead>
<tbody><tr>
<td>핵심 아이디어</td>
<td>부분(Parts) 조합<br>+ HOG</td>
<td>영역제안<br>+ CNN</td>
<td>단일 네트워크 한번에<br>예측</td>
</tr>
<tr>
<td>특징 추출</td>
<td>수작업 특징(HOG)</td>
<td>CNN</td>
<td>CNN</td>
</tr>
<tr>
<td>탐지방식</td>
<td>다중 스케일<br>슬라이딩 윈도우</td>
<td>Selective Search로 후보 생성 → 후보마다 CNN</td>
<td>이미지 그리드별로<br>동시 예측</td>
</tr>
<tr>
<td>학습 구조</td>
<td>HOG + SVM</td>
<td>CNN 사전 학습→ SVM → BBox 회귀</td>
<td>엔드 투 엔드 단일 손실로 공동 학</td>
</tr>
<tr>
<td>속도</td>
<td>느림(실시간 불가)</td>
<td>매우느림</td>
<td>실시간</td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6e421ec9-fe03-42bf-a7f7-b43120ba1c3d/image.png" alt=""></p>
<ol>
<li><strong>(P)</strong></li>
</ol>
<ul>
<li><p><strong>DPM:</strong> 슬라이딩 윈도우 방식 ← 이미지 전체 일정 간격 위치에서 분류기 실행</p>
</li>
<li><p><strong>R-CNN:</strong></p>
<p>영역 제안(region proposal) → 이미지 내에 잠재적 바운딩 박스 생성<br>→ 이 박스 각각에 분류기 적용 → 후처리(박스보정, 중복제거, 재 점수화)</p>
</li>
</ul>
<ol>
<li><strong>(S): YOLO</strong></li>
</ol>
<ul>
<li><p><strong>하나의 회귀(regression) 문제</strong>로 재정의</p>
<p>→ <strong>이미지 픽셀에서 바로 바운딩 박스 좌표와 클래스 확률을 예측</strong>하는 방식</p>
<p>⇒ 한 번만 보더라도 “어떤” 객체가 “어디에”있는지 예측 가능</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b071ce25-5432-4f84-820d-dea1cc7d50d5/image.png" alt=""></p>
<ul>
<li>하나의 합성곱 신경망이 여러개의 바운딩 박스와 각 박스에 대한 클래스 확률 동시 예측</li>
<li><strong>전체 이미지</strong>에 대해 학습 + 탐지 성능 <strong>직접 최적화</strong></li>
</ul>
<blockquote>
<p><strong>✓ 매우 빠름</strong></p>
<ul>
<li>탐지를 <strong>회귀문제</strong>로 정의하여 복잡한 파이프라인 필요없음</li>
<li>실시간 스트리밍 충분(기본: 45FPS, 빠른 버전: 150+FPS, 지연 25ms미만)</li>
</ul>
<p><strong>✓ 이미지 전체를 전역적으로 고려</strong></p>
<ul>
<li><p>객체 외형뿐 아니라 “<strong>맥락 정보</strong>”까지 포함 가능</p>
<p>↔ Fast R-CNN: 전체 맥락 못 봄</p>
<p>⇒ YOLO가 배경 오탐수 절반 이하</p>
</li>
</ul>
<p><strong>✓ 객체에 대한 일반화 가능한 표현 학습</strong></p>
<ul>
<li><p>자연 이미지로 학습 후, 예술작품으로 테스트했을 때, 성능하락 덜함</p>
<p>→ 새로운 도메인이나 예상치 못한 입력에도 견고</p>
</li>
</ul>
<hr>
<p>✓ <strong>정확도는 아쉽긴 하다</strong></p>
<ul>
<li><em>작은 객체</em>의 경우 정확한 위치를 지정하는데에 어려움</li>
</ul>
</blockquote>
<hr>
<h2 id="2-unified-detection통합된-탐지">2. Unified Detection(통합된 탐지)</h2>
<p>: <code>제안 → 분류 → 후처리</code> 를 따로 돌리지 않고 한 개의 CNN이 한 번에 모든 박스와 클래스</p>
<p>동시 예측</p>
<p>⇒ 이미지 전체 맥락을 본 상태로 판단(엔드투엔드 학습, 실시간 처리 속도, 평균 정밀도)</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f755efb0-21d8-48f7-bc0d-dc0102067f40/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 조건부 확률</strong></p>
<p>→ 어떤 사건이 이미 일어났다는 조건 하에 다른 사건이 일어난 확률</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/da63c1d6-6be8-4377-bacb-797c79470a5b/image.png" alt=""></p>
<ul>
<li>P(A | B): 사건 B가 일어났을 때 사건 A가 일어난 확률</li>
<li>P(A교B): 사건 A와 B가 동시에 일어날 확률</li>
<li>P(B): 사건 B가 일어날 확률
<img src="https://velog.velcdn.com/images/hyooo__s/post/f026451c-23c5-490b-a1b9-a2acc03ccf69/image.png" alt=""></li>
</ul>
</blockquote>
<p>✓ <strong>예측값에서 왜 <code>Bx5</code> 일까?</strong></p>
<p>출력 구조 : <strong>S</strong> x <strong>S</strong> x <strong>(B x 5 + C)</strong></p>
<h3 id="21-network-design네트워크-설계">2.1 Network Design(네트워크 설계)</h3>
<p>→ CNN으로 구현 후, PASCAL VOC 객체 탐지 데이터셋으로 성능 평가</p>
<p>→ 네트워크 초기 합성곱 계층은 이미지의 특징을 추출하고,<br>이후, 완전연결층(FC) 계층들이 츨력 확률과 좌표 예측</p>
<ul>
<li>구글넷에서 영감<ul>
<li>24개의 합성곱 계층 + 2개의 완전 연결 계층</li>
<li>인셉션 대신 1x1 축소 계층 + 3x3 합성곱 계층 배치하는 구조</li>
</ul>
</li>
<li>Fast YOLO버전 학습(초고속 객체 탐지 목적)<ul>
<li>합성곱계층(24→9), 필터 수 줄임</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6aaca753-5824-4dee-a934-1ccd2531a529/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 왜 굳이 1x1로 줄일까? 그냥 피쳐맵의 개수를 좀 줄이면 되는 거 아닌가?</strong></p>
<ul>
<li><p>그냥 채널 수를 줄이게 되면(필터수의 적게 잡거나, 일부 채널 버림)</p>
<p>→ 어떤 조합을 남길 지가 모델의 학습을 통해 정해지는 것이 아닌 설계자가 미리 결정하는 꼴이 됨</p>
</li>
<li><p>1x1 Conv는 각 위치에서 채널을 선형결합하여<br><strong>“학습적으로”<br>“어떤 정보만 압축할지”를 선택</strong></p>
<p>→ 손실을 최소화하며 줄일 수 있음</p>
</li>
</ul>
<hr>
<ul>
<li>연산량 K^2 x C_in x C_out<ul>
<li>그냥 C_out을 줄이는 건 여전히 3x3xC_in을 모두 계산해야해서 비싸다</li>
<li>1x1로 먼저 C_in → C_mid로 압축 필요</li>
</ul>
</li>
</ul>
</blockquote>
<h3 id="22-training학습">2.2 Training(학습)</h3>
<p><strong>✓ 사전학습</strong></p>
<ul>
<li><p>분류용 ImageNet(1000 class)로 앞쪽 20개 Conv 먼저 학습</p>
</li>
<li><p>그 위에 Average Pooling + FC 붙여서 약 1주 학습</p>
<p>→ ImageNet 2012 검증셋 Top-5 정확도 88% 달성</p>
</li>
<li><p>프레임워크: Darknet 사용</p>
<blockquote>
<p><strong>✓ 프레임워크</strong></p>
<p>→ 딥러닝 모델을 구현, 학습, 추론할 수 있는 툴킷</p>
<p><strong>✓ Darknet</strong></p>
<p>→ YOLO 개발자가 직접 만든 초경량,초고속 딥러닝 프레임워크(C/CUDA 기반)</p>
</blockquote>
</li>
</ul>
<p><strong>✓ 객체 탐지용으로 변환</strong></p>
<ul>
<li>그 뒤에 (Conv 4개 + FC 2개) 추가 + 가중치 무작위로 초기화</li>
<li>탐지 ← 섬세한 시각 정보 필요<br>⇒ 입력 해상도: 224 x 224 → 448x448</li>
</ul>
<p><strong>✓ 최종 계층</strong></p>
<p>→ 클래스 확률과 바운딩 박스 좌표 모두 예측</p>
<ul>
<li><p><code>바운딩 박스</code>의 너비, 높이 → <code>이미지</code>의 너비, 높이로 정규화</p>
<ul>
<li><p>바운딩박스의 x,y좌표는 해당 박스가 속한 격자 셀 위치를 기준으로 offset 형태로 예측</p>
<blockquote>
<p><strong>✓ 오프셋(offset) 형태</strong></p>
<ul>
<li><p>(x,y) 좌표를 셀 전체 이미지 좌표로 예측하지 않고,</p>
<p><strong>셀 좌상단 기준</strong> (0,0), 셀 크기를 1로 정규화한 상대좌표로 예측</p>
<p>⇒ 셀 안에서 상대적 위치를 [0,1] 범위 값으로 나타냄</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 offset 형태로 할까?</strong></p>
<ul>
<li>안정적인 학습 가능<ul>
<li>이미지 절대 좌표(0~448)를 직접 예측하면 값의 스케일이 크고 학습이 불안정</li>
<li>셀 단위 오프셋(0~1)은 범위가 작아서 학습이 쉬움</li>
</ul>
</li>
<li>셀 단위 책임 부여<ul>
<li>어떤 셀이 객체를 예측해야하는지 명확해짐</li>
<li>이 셀 안에서 객체 중심이 여기쯤 있다라는 방식으로 직관적으로 표현 가능</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>네트워크 중간/은닉 계층 → <strong>Leaky ReLU</strong></p>
<ul>
<li><p>일반 ReLU는 x&lt;0일 때 죽어버리는 문제</p>
</li>
<li><p>Leaky ReLU는 음수여도 작은 기울기 0.1을 남겨서 뉴런이 완전히 죽지 않게!</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6bc391e3-0cb7-4a00-b1f9-25c1599661e5/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>네트워크 출력 계층 → <strong>Linear activation fuction(선형활성화함수)</strong></p>
<blockquote>
<p><strong>✓ 선형활성화함수</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/47fbede4-5738-44fc-ab95-25809b286737/image.png" alt=""></p>
<p>→ 입력값을 가공하지 않고 그대로 출력하는 함수</p>
</blockquote>
<blockquote>
<p><strong>✓ YOLO에서 선형활성화함수를 사용하는 이유?</strong></p>
<p>→ 출력층에서는 경우에 따라 “비선형성이 필요 없는” 상황 존재</p>
<p>ex. 회귀: 예측값이 제한없이 연속적인 실수여야함</p>
<ul>
<li>YOLO의 최종 출력은 바운딩 박스 좌표(x,y,w,h)나 confidence 같은 실수값<ul>
<li>값을 제한하면 불필요하게 꼬일 수 있기 때문에 선형활성화 사용!</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
<p><strong>✓ 출력</strong></p>
<p>→ <strong>제곱 오차 합(Sum-Squared Error, SSE)을 최소화</strong> 하도록 최적화</p>
<p>BUT <strong>(P)</strong>: 최적화는 쉬우나, <strong>평균정밀도(mAP) 최대화</strong>와 딱 들어맞진 않음</p>
<blockquote>
<p><strong>① 위치(localization) 오류와 분류(classification) 오류를 동일하게 가중</strong></p>
<ul>
<li>현실 영향도와 불일치<ul>
<li>mAP에선 어떤 장면에는 위치가 더 중요하고, 어떤 장면에서는 분류가 더 중요할 수 있는데 SSE는 구분하지 않고 같은 무게로 더해버림</li>
</ul>
</li>
</ul>
<p><strong>② 빈 셀이 훨씬 많음(대부분의 격자 셀에 객체 X)</strong></p>
<p><strong>(P)</strong></p>
<p>그 셀들의 confidence를 0으로 끌어내려는 항이 손실을 지배해서 정작 객체가 있는 셀의 신호가 묻힐 수 있음(초기 발산 위험)</p>
<p><strong>(S)</strong></p>
<p><strong>바운딩박스좌표 예측 손실 가중치 ⬆️, 객체가 없는 박스의 신뢰도 예측손실 가중치 ⬇️</strong></p>
<ul>
<li><p>파라미터 (5와 0.5는 경험적으로 튜닝한 값)</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/02089335-27ae-4f87-b84d-33c16eca7bca/image.png" alt=""></p>
<p>→ coord =5 (좌표 오차_바운딩 박스 위치/크기에 곱하는 가중치)</p>
<p>: 바운딩 박스 좌표 손실을 얼마나 크게 볼 (정확한 위치 학습) … ①</p>
<p>→ noobj =0.5 (객체가 없는 셀의 confidence 오차에 곱하는 가중치)</p>
<p>: 배경셀의 confidence 손실 약화(배경에 끌려가지 않게) … ②</p>
</li>
</ul>
<p><strong>③ 큰 박스 vs 작은박스</strong></p>
<p><strong>(P)</strong></p>
<p>같은 픽셀 편차라 해도 작은 박스에서 더 치명적인데 SSE는 같게 취급</p>
<p><strong>부분적 (S)</strong></p>
<p>너비와 높이 직접 예측이 아니라 <strong>제곱근을 예측</strong>하도록</p>
</blockquote>
<blockquote>
<p><strong>✓ 왜 제곱근 변환이 해결책?</strong></p>
<p>큰 박스: 실제 200px → 예측 210px(오차10) → 상대적으로 덜 중요</p>
<p>작은 박스: 실제 20px → 예측 30px(오차10) → 엄청 중요해야함</p>
<p>but, (S)제곱 오차는 두 경우 모두 10만큼 틀림으로 취급</p>
<hr>
<p>(S) 제곱근으로 변환하면</p>
<p>큰 박스: 제곱근을 취하면 <strong>값이 압축</strong> → 같은 차이라도 오차 작아짐</p>
<p>작은 박스: 제곱근을 취하면 <strong>값 변화율 커짐</strong> → 작은 차이도 오차 크게 반영</p>
<p>⇒ 모델이 작은 객체 위치/크기 예측에 더 신경쓰도록 유</p>
</blockquote>
<p><strong>✓ 각 셀마다 여러 개의 바운딩 박스 예측 but 학습할 땐 한 객체당 한 박스만 책임지게끔!</strong></p>
<p>→ 각 바운딩 박스 예측기는 특정 크기, 종횡비, 특정 클래스에 특화되어 재현율 향상에 기여</p>
<blockquote>
<p><strong>✓ 왜 셀마다 B개의 박스를 예측시키면서 학습할 땐 한 객체당 한 박스만 책임지게 할까?</strong></p>
<ol>
<li>경쟁 중복 방지</li>
<li>전문화(특정크기/종횡비/클래스)</li>
<li>손실설계와 정합</li>
<li>중복탐지, 후처리 부담 완화</li>
</ol>
</blockquote>
<p><strong>✓ 다중 손실 함수(Multi-part Loss Function) 최적화</strong></p>
<p>→ 학습 과정에서 다중 손실 함수 최적화</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/641f322b-736a-4efb-82ea-28e2d41e5d25/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 주의</strong></p>
<ol>
<li>분류 오차(Classification error)는 해당 셀에 객체가 존재할 때만 계산</li>
<li>바운딩 박스 좌표 오차는 해당 예측기가 책임 지는 경우에만 계산<br>→ 해당 셀 내 예측기 중 IoU가 가장 높은 경우</li>
</ol>
</blockquote>
<ul>
<li><p>과적합 방지</p>
<ul>
<li><p>드롭아웃(Dropout): 훈련중 랜덤하게 뉴런 일부를 꺼버리는 방식</p>
<ul>
<li>첫 번째 완전연결 계층 뒤에 드롭아웃(비율0.5)적용 → 계층간 공적응 방지</li>
</ul>
</li>
<li><p>데이터 증강(Data augmentation): 인위적으로 바꿔서 더 일반적인 패턴 배우게 함</p>
<ul>
<li><p>이미지 크기 최대 ±20% 범위에서 임의 스케일 조정 및 평행 이동</p>
</li>
<li><p>HSV 색공간에서 노출과 채도를 ±1.5배 범위에서 랜덤 조정</p>
<p>(H: Hue, S: Saturation, V: Value - 색, 채도, 명도)</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="23-inference추론">2.3 Inference(추론)</h3>
<p>→ 학습과 마찬가지로 테스트 이미지에 대해 탐지 결과 예측하는 것도 <strong>한 번의 네트워크 평가</strong>만!</p>
<ul>
<li><strong>격자(grid)기반 설계</strong>: 바운딩 박스 예측에서 <strong>공간적 다양성</strong>을 보장<ul>
<li>각 객체당 하나의 박스만 예측</li>
<li>중복탐지 → NMS로 해결</li>
</ul>
</li>
</ul>
<blockquote>
<p>✓ <strong>공간적 (위치) 다양성을 보장한다</strong></p>
<p>= 예측되는 바운딩 박스들이 이미지 여러 위치에 고르게 분포되도록 구조적으로 유도</p>
</blockquote>
<blockquote>
<p><strong>✓ 공간적 다양성을 보장하면 좋은 점?</strong></p>
<ul>
<li><strong>여러 물체가 서로 떨어져 있을 때</strong>: 각 물체의 중심이 다른 셀에 들어가면 각 셀이 자기 물체 담당 → 놓칠 확률(재현율)↓</li>
<li><strong>큰 물체/경계 근처 물체</strong>: 인접한 여러 셀에서 각각 “괜찮은” 박스가 나올 수 있어 후보 다양성↑</li>
<li><strong>편향 완화:</strong> 데이터가 한 가운데에 많은 중앙편향이 있어도 구조적으로 주변부까지 커</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ One Network Evaluation vs. End-to-End</strong></p>
<table>
<thead>
<tr>
<th></th>
<th><strong>One Network Evaluation</strong></th>
<th><strong>End-to-End</strong></th>
</tr>
</thead>
<tbody><tr>
<td>의미</td>
<td>추론 시 CNN 1회 실행</td>
<td>학습 시 전체 네트워크를 한꺼번에 최적화</td>
</tr>
<tr>
<td>방식</td>
<td>Inference 방식</td>
<td>Training 방식</td>
</tr>
<tr>
<td>YOLO 장점</td>
<td>실시간 처리 가능</td>
<td>파이프라인 분리없이 직접학습</td>
</tr>
</tbody></table>
<p><strong>✓ One Network Evaluation</strong></p>
<ul>
<li><p>보통 R-CNN계열은 복잡한 파이프 라인 가짐</p>
<p>→ CNN 여러번 실행</p>
</li>
<li><p>YOLO는 이미지를 넣으면 CNN 한 번만 forward 시켜서<br>→ BBox + class 확률 동시 예측</p>
<p>⇒ 추론 과정에서 CNN 한 번만 돌리면 된다</p>
</li>
</ul>
<p><strong>✓ End-to-End</strong></p>
<ul>
<li>훈련 과정의 개념</li>
<li><strong>R-CNN</strong>: CNN 따로 학습 + SVM 따로 학습 + BBox regression 따로 학습</li>
<li><strong>YOLO</strong>: 입력이미지→출력(박스+클래스 확률)까지 하나의 네트워크로 구성</li>
</ul>
</blockquote>
<h3 id="24-limitations-of-yoloyolo의-한계">2.4 Limitations of YOLO(YOLO의 한계)</h3>
<p><strong>① 강한 공간적 제약</strong></p>
<p>→ 각 격자 셀은 최대 2개의 바운딩 박스만 예측 + 하나의 클래스만 할당 가능<br>(모델 단순화, 각 predictor가 다른 형태에 특화되도록 유도/셀당 객체 중심 하나라는 가정)</p>
<p>⇒ <strong>서로 가까이 있는 다수의 객체 예측하는 능력 제한</strong>(ex. 무리지어가는 새)</p>
<p>② <strong>새롭거나 특이한 종횡비나 배치를 가진 객체에 대해 일반화X</strong></p>
<p>← 데이터로부터 바운딩박스를 예측하는 법을 학습하기 때문</p>
<p>③ <strong>바운딩 박스 예측에 상대적으로 거친 특징 사용됨</strong></p>
<p>← 네트워크 아키텍쳐에 여러 단계의 다운샘플링이 포함되어 있기 때문</p>
<p>④ <strong>작은 BBox와 큰 BBox 오차 동일하게 취급</strong></p>
<p>→ 작은 BBox에서 IoU 큰 영향</p>
<p>⇒ <strong>잘못된 위치 예측</strong></p>
<blockquote>
<p><strong>✓ 공간적 다양성 vs 강한 공간적 제약?</strong></p>
<ul>
<li><p>공간적 다양성 보장</p>
<ul>
<li><p>그리드로 나눠 셀마다 박스를 예측</p>
<p>→ 이미지 전역의 각 셀이 “내 구역”을 책임짐</p>
<p>→ 큰 물체는 여러 셀이 잡고 NMS로 최종 하나만 남김</p>
</li>
</ul>
</li>
<li><p>강한 공간적 제약</p>
<ul>
<li>각 셀의 예측 능력에 한계 두기</li>
</ul>
</li>
</ul>
<p>⇒ 그리드 설계가 <em>후보를 전역에 뿌려주는 다양성</em>을 주는 동시에<br><em>셀 단위 예측 한계</em>라는 공간적 제약도 함께 갖는다.</p>
</blockquote>
<hr>
<h2 id="3-comparison-to-other-detection-systems">3. Comparison to Other Detection Systems</h2>
<p><strong>✓ 객체 탐지 방식</strong></p>
<ul>
<li><p><strong>전통 파이프 라인 vs. YOLO의 일체형(통합)모델</strong></p>
<p><strong>&lt;전통&gt;</strong> 특징 추출→후보/슬라이딩윈도우→분류/회귀→후처리 <code>단계별로 나뉜 파이프라인</code></p>
<p><strong><YOLO></strong> 한 번의 CNN으로 <strong>박스+클래스를 동시에 예측</strong> → 속도, 단순성 확 살아남</p>
</li>
</ul>
<hr>
<p><strong>① DPM(Deformable Parts Models) - 슬라이딩 윈도우</strong></p>
<ul>
<li><p>DPM: 특징 추출, 영역 분류, 고득점 영역의 바운딩 박스 예측 등 서로 분리된 단계로 구성</p>
<p>↔ <strong>YOLO: 이 모든 단계를 하나의 CNN으로 대체</strong></p>
<p>⇒ 특징추출, 바운딩박스 예측, NMS, 맥락 분석 동시에 수행  </p>
<ul>
<li>탐지 작업에 맞게 학습된 특징 사용 (not 고정된 특징)</li>
</ul>
</li>
</ul>
<p><strong>② R-CNN - 영역제안</strong></p>
<ul>
<li>R-CNN: Selective Search로 잠재적 바운딩 박스 생성 → 합성곱 신경망으로 특징 추출 →<br><em>SVM으로 박스 점수 계산</em> → 선형 모델로 바운딩 박스 조정 → NMS로 중복 제거</li>
<li>YOLO: 각 격자셀에 잠재적 바운딩 박스 제안 → <em>합성곱 특징을 이용해 점수</em><br>(but, <strong>격자 셀 안에 공간적 제약</strong>을 두어 동일 객체에 대한 <strong>중복 탐지를 줄임</strong>)  
→ 개별 구성요소를 하나의 모델로 통합하여 <strong>공동 최적화</strong></li>
</ul>
<p><strong>③ Other Fast Detectors(Fast R-CNN, Faster R-CNN)</strong></p>
<ul>
<li><p>Fast R-CNN과 Faster R-CNN은 R-CNN 속도를 높이기 위해</p>
<p>① 연산 공유 + ② Selective Search 대신 <em>신경망 기반</em> Region Proposal Network 사용</p>
<p>→ R-CNN 대비 속도, 정확도가 좋긴 하지만, <strong>“실시간 성능”</strong> 부족</p>
</li>
<li><p>YOLO: 처음부터 파이프라인 없애고 속도를 염두에 두고 설계</p>
</li>
</ul>
<p><strong>④ Single-class Detectors(단일 클래스 탐지기)</strong></p>
<ul>
<li>얼굴이나 사람처럼 단일 클래스만 탐지하는 경우, 딱 최적화된 탐지기 가능</li>
<li>YOLO는 다양한 객체를 동시에 탐지할 수 있는 <strong><em>범용탐지기</em></strong></li>
</ul>
<p><strong>⑤ Deep MultiBox</strong></p>
<ul>
<li><p>Selective Search 대신 합성곱 신경망으로 ROI(관심영역) 예측</p>
</li>
<li><p>신뢰도 예측 대신 단일 클래스 예측을 수행하면 단일 객체 탐지 가능</p>
<p>BUT, 범용 객체 탐지 불가능 + 이미지 패치 분류가 필요한 대규모 탐지 파이프 라인에 불과</p>
</li>
<li><p>YOLO, Deep MultiBox 모두 <strong>합성곱 네트워크로 바운딩박스 예측</strong><br>YOLO: 완전한 탐지 시스템</p>
</li>
</ul>
<p><strong>⑥ OverFeat</strong></p>
<ul>
<li>합성곱 신경망으로 위치 수행 → 슬라이딩 윈도우로 탐지 수행 but, 분리된 시스템</li>
<li>탐지성능X, <strong>지정성능에 최적화 + 국소 정보만 보고 판단(문맥고려X)</strong></li>
</ul>
<p><strong>⑦ MultiGrasp</strong></p>
<ul>
<li>YOLO의 격자 기반 바운딩 박스 회귀 접근에 영감을 줌</li>
<li>단 하나의 그립 가능한 영역만 예측<ul>
<li>객체의 크기, 위치, 경계, 클래스 예측하지 않아도 ok</li>
</ul>
</li>
<li>YOLO: 여러 객체와 여러 클래스를 동시에, 바운딩 박스와 클래스 확률까지 예측해야함</li>
</ul>
<hr>
<h2 id="4-experiments">4. Experiments</h2>
<ul>
<li><p>PASCAL VOC 2007에서 비교</p>
<ul>
<li><p>Fast R-CNN과 YOLO 의 오류 분석</p>
<p>→ 서로 다른 오류 특성을 기반으로 YOLO를 이용해 Fast R-CNN 탐지 결과를 재점수<br>→ 배경에 대한 오탐을 줄이고, 성능 향상 가능</p>
</li>
</ul>
</li>
</ul>
<h3 id="41-comparison-to-other-real-time-systems">4.1 Comparison to Other Real-Time Systems</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/794ec417-b69f-4537-937c-e600e03208c7/image.png" alt=""></p>
<p><strong>✓ Trade-off</strong></p>
<ul>
<li>DPM: 빠르긴 한데, 정확도가 너무 안 나옴</li>
<li>R-CNN: 정확도는 높은데, 느려</li>
<li>YOLO: 처음으로 <strong>“실시간(30FPS 이상) + CNN 기반 정확도“</strong> 동시 달성!</li>
</ul>
<h3 id="42-voc-2007-error-analysis">4.2 VOC 2007 Error Analysis</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/79a579fa-87f2-4bf2-82df-59cb90fe0062/image.png" alt=""></p>
<h3 id="43-fast-r-cnn과-yolo의-결합">4.3 Fast R-CNN과 YOLO의 결합</h3>
<ul>
<li><p><code>YOLO</code> 배경에 대한 잘못된 객체 탐지 훨씬 적게 발생</p>
<p>→ YOLO를 이용해 <strong><code>Fast R-CNN</code>의 배경 탐지를 제거</strong>하면 성능이 크게 향상</p>
<p>⇒ <strong>Fast R-CNN이 예측한 각 바운딩 박스에 대해 YOLO가 유사한 박스를 예측했는지 확인</strong><br>if 有) <strong>YOLO가 예측한 확률</strong>과 <strong>두 박스의 중첩도(IoU)에 기반</strong>하여 해당 예측 점수를 조정</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/bda4e164-6d34-4e71-9722-d6bf1390f8e6/image.png" alt=""></p>
<p>  ⇒ 단순한 모델 앙상블 효과X<br>  <strong>YOLO와 Fast R-CNN이 서로 다른 유형의 오류를 범하기 때문!</strong></p>
<h3 id="44-voc-2012-results">4.4 VOC 2012 Results</h3>
<ul>
<li>YOLO는 작은 객체 탐지에서 경쟁 모델에 비해 어려움을 겪음<ul>
<li>bottle, sheep, tv/monitor 같은 카테고리: 성능 낮음</li>
<li>cat, train 같은 카테고리: 더 높은 성능</li>
</ul>
</li>
<li><code>Fast R-CNN</code> + <code>YOLO</code> 결합 모델: 상위권 성능!</li>
</ul>
<h3 id="45-generalizability-person-detection-in-artwork">4.5 Generalizability: Person Detection in Artwork</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/db876125-44ab-487f-9ebf-ab971cd5aab2/image.png" alt=""></p>
<ul>
<li><p><strong>R-CNN</strong></p>
<ul>
<li><p>VOC 2007에서는 높은 AP(Average Precision_평균정밀도)</p>
</li>
<li><p>예술작품에 적용하면 성능이 크게 하락</p>
<p>→ R-CNN의 바운딩 박스 제안이 자연이미지에 최적화되어 있으며,<br>분류 단계는 작은 영역만 보고 좋은 제안에 의존하기 때문</p>
</li>
</ul>
</li>
<li><p><strong>DPM</strong></p>
<ul>
<li>예술작품에 적용했을 때 AP 유지력이 좋음</li>
<li>강력한 공간모델로 객체의 형태와 배치를 잘 표현하기 때문에 성능 유지 가능</li>
<li>but, 기본 AP가 YOLO나 R-CNN보다 낮음</li>
</ul>
</li>
<li><p><strong>YOLO</strong></p>
<ul>
<li>VOC 2007에서 좋은 AP, 예술작품에 적용했을 때 성능하락폭이 더 적음</li>
<li>DPM과 마찬가지로 객체의 크기,형태뿐 아니라 <strong>객체 간 관계와 객체가 주로 나타나는 위치까지 모델링</strong></li>
<li>예술작품과 자연 이미지는 픽셀 수준에서 매우 다르지만,<br><strong>객체의 크기와 형태가 유사하기 때문에</strong> 여전히 양질의 BBox와 탐지 생성 가능</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-real-time-detection-in-the-wild">5. Real-Time Detection In The Wild</h2>
<p>→ YOLO를 웹캠에 연결해서 실시간 성능이 유지되는지 검증함</p>
<hr>
<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li><p>YOLO는 분류기기반 접근방식과 달리,</p>
<p><strong>①탐지성능과 ②직접적으로 연관된 손실함수</strong> 로 학습, <strong>③모델 전체를 공동(joint)학습</strong></p>
</li>
<li><p>새로운 도메인에 대해서도 일반화 성능이 뛰어나서 다양한 응용이 가능하다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] ShuffleNet - An Extremely Efficient Convolutional Neural Network for Mobile]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0ShuffleNet-An-Extremely-Efficient-Convolutional-Neural-Network-for-Mobile</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0ShuffleNet-An-Extremely-Efficient-Convolutional-Neural-Network-for-Mobile</guid>
            <pubDate>Wed, 22 Jul 2026 11:55:15 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
<strong>학회(출판연도)</strong>: CVPR (2018)
<strong>연구분야</strong>: 딥러닝 기반 컴퓨터 비전 백본 네트워크</p>
</blockquote>
<hr>
<h2 id="abstract초록">Abstract(초록)</h2>
<p><strong>✓ ShuffleNet</strong></p>
<ul>
<li><p>10~150 MFLOPs 수준처럼 <strong>연산 자원이 매우 제한적인 모바일 기기</strong>에 특화 설계</p>
<ul>
<li><p>Pointwise group convolution</p>
</li>
<li><p>Channel shuffle</p>
<p>⇒ 정확도를 높이고 연산량 줄임</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 왜 10~150MFLOPs 수준이 연산이 제한적?</strong></p>
<ul>
<li>최신 대형 CNN 모델(VGG-16, ResNet-50 등)은 수십~수백억 FLOPs를 소모함<ul>
<li>VGG-16: 약 15,500 MFOPs(15.3GFLOPs)</li>
<li>ResNet-50: 약 4 GFLOPs</li>
</ul>
</li>
<li>반면, 10~150 MFLOPs는 이런 모델의 1/100 ~ 1/1000 수준에 불과</li>
</ul>
<p>⇒ 이렇게 적은 연산량은 스마트폰, 드론, IoT 기기처럼 저전력&amp;저성능 CPU나 GPU의 <strong>실시간 처리</strong>를 할 수 있도록 맞춘 설계</p>
</blockquote>
<hr>
<h2 id="1-introduction서론">1. Introduction(서론)</h2>
<p><strong>&lt;기존&gt; - 더 깊고 더 큰 합성곱 신경망(CNN)을 구축하자!</strong></p>
<ul>
<li>가장 정확도가 높은 CNN: 수백 개의 층 + 수 천개의 채널 → 수십억 FLOPs 수준의 연산 필요</li>
</ul>
<blockquote>
<p><strong>✓ 층(Layer)</strong></p>
<ul>
<li><p>신경망을 구성하는 연산 단위.</p>
<ul>
<li>입력 → 합성곱 → 활성화 → 풀링 같은 단계 각각이 하나의 층이 될 수 있음</li>
</ul>
</li>
<li><p>깊이(depth): 층의 개수가 많아질수록 네트워크 깊이가 깊어짐</p>
<p>ex. ResNet-50 → 약 50개의 주요 층</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 채널(Channel)</strong></p>
<ul>
<li><p><strong>한 층</strong>에서 처리하는 <strong>특징맵(feature map)의 개수</strong></p>
<p>ex. RGB이미지 → 3개의 채널(R,G,B)</p>
</li>
<li><p>합성곱 층에서는 <strong>채널</strong>이 <strong>필터의 개수</strong>와 동일</p>
<p>→ 네트워크가 깊어질수록 채널 수가 늘어나는 경향이 있어서 더 많은 패턴을 병렬 추출 가능하다.</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 필터, 특징맵, 채널간의 관계</strong></p>
<p>: 필터(Filter, Kernel) → 특징맵(Feature Map) → 채널(Channel)</p>
<ul>
<li><p><strong>필터(Filter, Kernel)</strong></p>
<ul>
<li><p>입력 데이터에서 특정 패턴을 감지하는 작은 가중치 행렬</p>
<p>→ 합성곱 연산을 통해 경계, 질감, 모양 등의 특징 추출</p>
</li>
<li><p>하나의 필터 → 입력과 합성곱 → 하나의 특징맵</p>
</li>
</ul>
</li>
<li><p><strong>특징맵(Feature Map)</strong></p>
<ul>
<li>필터가 입력에 대해 <strong>합성곱 연산을 한 결과</strong></li>
<li>해당 필터가 감지한 패턴의 공간적 분포 나타냄</li>
<li>CNN 한 층의 출력은 여러 개의 특징맵으로 구성됨</li>
</ul>
</li>
<li><p><strong>채널(Channel)</strong></p>
<ul>
<li>한 층의 출력에서 특징맵들의 집합을 의미하는 “깊이” 방향의 개수</li>
</ul>
</li>
</ul>
<p><strong>⇒ 필터: 패턴을 찾는 도구</strong></p>
<p><strong>⇒ 특징맵: 찾은 패턴의 지도</strong></p>
<p><strong>⇒ 채널: 이런 지도들의 묶음</strong></p>
</blockquote>
<p><strong>&lt;ShuffleNet의 목표&gt; - 모바일같은 저전력 환경(10~150 MFLOPs)에서 최고 성능을 달성해보자!</strong></p>
<blockquote>
<p><strong>&lt;기존&gt;</strong></p>
<p>1) 가지치기(pruning) 2) 압축(compression) 3) 저비트 표현(low-bit representation) 집중</p>
</blockquote>
<blockquote>
<p><strong>✓ 가지치기(pruning)</strong></p>
<ul>
<li><p>네트워크에서 중요도가 낮은 연결(가중치)나 필터를 제거하여 모델을 가볍게!</p>
<p>⇒ 파라미터 수와 연산량(FLOPs) 감소로 추론 속도 향상 및 메모리 절약 가능</p>
</li>
</ul>
<p><strong>✓ 압축(compression)</strong></p>
<ul>
<li><p>학습된 모델을 저장&amp;배포하기 쉽게 크기 줄이기</p>
<p>⇒ 저장 공간 절약, 메모리 대역폭 사용량 감소</p>
</li>
</ul>
<p><strong>✓ 저비트 표현(low-bit representation)</strong></p>
<ul>
<li><p>가중치나 활성화값을 32비트(부동소수점) 대신 16비트, 8비트, 심하면 1~4비트로 표현</p>
<p>⇒ 모델 크기 축소 + 연산 속도 향상</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 기존의 CNN 연구가 여기에 초점을 맞췄을까?</strong></p>
<p><strong>P:</strong> CNN은 정확도를 높이려고 점점 층 수 증가 + 채널 수 증가</p>
<p>→ 수십억 FLOPs, 수백MB 모델 크기<br>→ 스마트폰, 드론, 로봇 같은 저성능&amp;저전력 기기에서 실행 불가</p>
<p><strong>S:</strong> <strong>이미 잘 학습된 기존 큰 모델을 쓰되</strong>, “효율적으로 줄이자”</p>
<p>→ 가지치기, 압축, 저비트 표현 기법 같은 모델 경량화 기법이 연구 초점!</p>
</blockquote>
<p><strong><ShuffleNet></strong></p>
<blockquote>
<p>연산범위에 맞춰 효율적인 기본 아키텍처 자체를 <strong>새로 설계</strong>하자!</p>
</blockquote>
<ul>
<li><p><strong>P: Xception, ResNeXt 같은 최신 구조도 작은 네트워크 안에서는 효율이 떨어짐</strong></p>
<p>→ <strong>밀집 1x1 합성곱(dense 1x1 convolutions)</strong> 때문(비용이 큼)</p>
</li>
<li><p><strong>S</strong></p>
<ul>
<li><p><strong>포인트와이즈 그룹 합성곱(pointwise group convolution)</strong></p>
<ul>
<li>1x1 합성곱을 그룹으로 나눠 계산 → 연산량 감소</li>
</ul>
<blockquote>
<p><strong>✓ 포인트와이드 그룹 합성곱</strong></p>
<ul>
<li><p>일반 1x1 합성곱: <strong>모든</strong> 입력 채널과 <strong>모든</strong> 출력 채널 <strong>연결</strong></p>
</li>
<li><p>그룹 합성곱: 채널을 g개의 그룹으로 나눠서, <strong>각 그룹 안에서만 연산</strong></p>
<p>→ 연산량의 <strong>약 g배 절감</strong></p>
<p>⇒ P: 그룹끼리 정보가 안 섞임 → 표현력 저하</p>
</li>
</ul>
</blockquote>
</li>
<li><p><strong>채널 셔플(channel shuffle)</strong></p>
<ul>
<li><p>그룹 합성곱 때문에 줄어드는 채널 간 정보 흐름 문제 해결</p>
</li>
<li><p>채널 순서를 섞어서 그룹 간 정보가 섞이게 끔</p>
<p><strong>⇒ 같은 연산 예산 내에서 더 많은 채널  → 더 많은 정보 인코딩 가능</strong></p>
<p><strong>⇒ MobileNet보다 40MFLOPs 수준에서 Top-1 오류율 7.8% 낮음</strong></p>
<p><strong>⇒ 실제 ARM칩(하드웨어)에서 AlexNet보다 13배 빠름, 정확도는 비슷</strong></p>
</li>
</ul>
<blockquote>
<p><strong>✓ 채널 셔플(channel shuffle)</strong></p>
<ul>
<li><p>그룹 합성곱 후, 채널을 섞어서 재배치</p>
</li>
<li><p><strong>다음 그룹 합성곱에서 다른 그룹의 채널을 입력으로 받게</strong> 함</p>
<p>⇒ 정보가 그룹 간 흐르게 되어 성능 회복!</p>
</li>
</ul>
</blockquote>
<p>✓ 1x1 합성곱 연산을 그룹화 → 연산 절감</p>
<p>채널 셔플 → 정보 흐름 유지</p>
<p>이렇게 절감한 연산량으로 채널 수를 늘려서 작은 모델에서 성능을 키울 수 있는듯</p>
<blockquote>
<p><strong>✓ ShuffleNet처럼 연산예산이 제한된 경우, 채널수 늘리는 것이 성능 극대화?</strong></p>
<ul>
<li><p>채널: 이미지 특징을 담은 필터의 개수</p>
<p>즉, 채널이 많을 수록</p>
<ul>
<li>더 다양한 패턴, 형태, 색상 정보 병렬 추출 가능</li>
<li>표현력이 증가 됨</li>
</ul>
<p>BUT, 무작정 늘릴 수는 없음 → 채널 늘리면 FLOPs도 급증!(속도저하)</p>
</li>
</ul>
<p>⇒ ShuffleNet의 경우</p>
<p>절감한 연산량을 채널수 늘리는데 재투자해서</p>
<p>작은 네트워크에서 부족한 표현력을 보완하여 성능을 키우겠다는 뜻!</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-related-work관련연구">2. Related Work(관련연구)</h2>
<p><strong>효율적인 모델 설계(Efficient Model Designs)</strong></p>
<p>&lt;최근&gt; 고품질의 심층신경망 임베디드 장치에서 실행하려는 수요⬆️ → 효율적 모델 설계 필요성⬆️</p>
<ul>
<li><strong>GoogLeNet:</strong> 단순 계층 쌓기 대신 복잡도를 낮추며 깊이 증가 <code>Inception모듈</code></li>
<li><strong>SqueezeNet:</strong> 정확도 유지 + 파라미터와 연산량 절감</li>
<li><strong>ResNet:</strong> 효율적인 <strong>bottelneck구조</strong>로 성능 향상<ul>
<li>Bottleneck: 중간에 채널수를 줄였다가 다시 늘리는 구조</li>
</ul>
</li>
<li><strong>SENet</strong>: 연산량 소폭 증가로 성능 향</li>
<li><strong>NASNet(모바일)</strong>: 강화학습+모델 검색으로 구조 탐색, ShuffleNet과 비슷한 성능</li>
</ul>
<p><strong>Group Convolution(그룹 합성곱)</strong></p>
<p><strong>&lt;도입&gt;</strong> AlexNet - 2개의 GPU로 모델을 분산하기 위해 사용</p>
<p><strong>&lt;효율성 입증&gt;</strong> ResNet</p>
<p><strong>✓ Depthwise Separable Convolution ← Inception 시리즈의 분리 합성곱 아이디어를 일반화</strong></p>
<p><strong>&lt;최근&gt;</strong> MobileNet이 Depthwise Separable Convolution 활용하여 경량 모델 중 최고 성능</p>
<p><strong><ShuffleNet></strong></p>
<p><strong>⇒ ① 그룹합성곱 과 ② Depthwsie Separable Convolution을 새로운 형태로 일반화!</strong></p>
<p><strong>채널 셔플 연산(Channel Shuffle Operation)</strong></p>
<p><strong>&lt;배경&gt;</strong> “채널 셔플”이라는 개념이 이전에는 거의 다뤄지지 않았다.</p>
<p><strong>&lt;기존 사례&gt;</strong></p>
<ul>
<li><strong>cuda-convnet</strong>: 랜덤 채널 셔플 + 그룹 합성곱 형태<ul>
<li>목적: 구조 효율화X 랜덤 희소 합성곱 실험용O</li>
</ul>
</li>
<li><strong>연구[41]</strong>: 2단계 합성곱에서 “채널 셔플” 사용<ul>
<li>but, 채널 셔플 자체 효과나 초소형 모델 설계에 미치는 영향은 분석 안 함</li>
</ul>
</li>
</ul>
<p>⇒ ShuffleNet은 채널 셔플을 의도적으로 설계의 핵심요소로 도입하여,</p>
<ul>
<li><strong>그룹 합성곱의 단점</strong>(그룹 간 정보 흐름 제한)을 해결하고</li>
<li><strong>초소형&amp;저연산 네트워크 환경에서도 성능 향상</strong>에 기여 하겠다!</li>
</ul>
<p><strong>모델 가속(Model Acceleration)</strong></p>
<ul>
<li><p>목표: 사전 학습된 모델의 <strong>정확도를 유지</strong>하면서 <strong>추론속도를 높이자!</strong></p>
<ul>
<li><strong>가지치기(Pruning):</strong>네트워크의 연결 [6, 7]이나 채널 [38]을 제거하여 불필요한 연산을 줄임<ul>
<li>중요하지 않은 연결(가중치)나 채널 잘라내서 연산량과 메모리 줄임</li>
</ul>
</li>
<li><strong>양자화(Quantization):</strong> [31, 27, 39, 45, 44] 저비트 표현으로 계산량 절감<ul>
<li>숫자 정밀도를 줄여서 계산을 가볍게 하는 방법</li>
</ul>
</li>
<li><strong>분해(Factorization):</strong> [22, 16, 18, 37] 계산을 더 단순하게 분해하여 속도 향상<ul>
<li>큰 연산을 작은 연산 여러 개로 쪼개서 효율을 높이자</li>
</ul>
</li>
<li><strong>합성곱 최적화:</strong> FFT(푸리에변환) 기반 [25, 35] 또는 다른 알고리즘 [2]으로 연산 속도 개선<ul>
<li>합성곱 계산을 더 빠르게 하는 알고리즘 적용(구조X 속도만 개선)</li>
</ul>
</li>
<li><strong>지식 증류(Distillation)</strong><ul>
<li>큰 모델이 배운 지식을 작은 모델로 전달하는 기법</li>
</ul>
</li>
</ul>
<p>⇒ 신경망 모델을 가볍고 빠르게 만드는 대표적 기법</p>
</li>
</ul>
<hr>
<h2 id="3-approach">3. Approach</h2>
<h3 id="31-channel-shuffle-for-group-convolutions">3.1 Channel Shuffle for Group convolutions</h3>
<p>&lt;현대&gt;동일한 구조의 빌딩 블록을 반복해서 쌓는 형태</p>
<ul>
<li><p>Xception &amp; ResNeXt: <strong>Depthwise Separable Convolution</strong> 또는 <strong>Group Convolution</strong> 도입</p>
<p>→ 표현력과 계산 비용 사이에서 우수한 균형 달성</p>
</li>
</ul>
<p>BUT!</p>
<p><strong>P: 1x1 합성곱에서의 연산 비용 충분히 고려X</strong></p>
<p><strong>[ResNeXt]</strong> 3x3 계층에서만 그룹 합성곱 적용</p>
<p>→ <strong>Residual Unit</strong>에서 <strong>Pointwise Convolution(1x1 Conv)</strong>이 전체 연산량의 93.4% 차지</p>
<p><strong>[소형 네트워크]</strong> 연산량을 맞추기 위해 채널 수 제한 → Pointwise Conv이 병목되어 정확도 하락</p>
<p><strong>S: 1x1 계층에도 채널 희소 연결(channel sparse connection) → “그룹 합성곱” 적용하자!</strong></p>
<p>→ 각 합성곱 연산이 자신과 대응되는 입력 채널 그룹에서만 작동하므로 연산 비용⬇️</p>
<p><strong>P:  합성곱을 여러층 쌓게 되면, 그룹 간 정보 흐름 차단</strong></p>
<p>→ 표현력 약화</p>
<p><strong>S: 채널 간 흐름 복원 → 다음 그룹 합성곱 층이 이전 층의 다른 그룹으로부터 입력 받을 수 있도록!</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/00170144-4678-4199-9fe0-97f126563bca/image.png" alt=""></p>
<h3 id="32-shufflenet-unit">3.2 ShuffleNet Unit</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/06ce5d38-d79c-4648-93f4-83f01715b9f2/image.png" alt=""></p>
<blockquote>
<p><strong>✓ (c)에서 왜 다운 샘플링?</strong></p>
<ul>
<li>[CNN] 보통 Stage가 바뀔 때 <strong>공간 크기를 절반으로 줄이고 채널 수를 늘리는</strong> 패턴<ul>
<li><strong>계산량 절감:</strong> 해상도를 줄이면 이후 레이어에서 연산량이 줄어듦</li>
<li><strong>수용영역 확대</strong>: 한 픽셀이 더 많은 영역의 정보를 포괄</li>
<li><strong>추상화 수준 상승</strong>: 점점 더 고수준 특징 학습 가능</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ (c)에서 왜 Add 대신 Concat?(합집합 - 크기는 같은 채널수가 다를때 사용)</strong></p>
<ul>
<li>stride =2 를 쓰면<ul>
<li>출력 채널수를 늘리면서 해상도를 줄임</li>
</ul>
</li>
</ul>
<p>⇒ 채널 수를 늘리면서 연결하기 위함</p>
</blockquote>
<p>⇒ &lt;기존&gt; stride=2 블록에서는 채널을 늘리려면 1x1 Conv 같은 연산 해야함(FLOPs 증가)</p>
<p>⇒ <Shuffle> stride=2블록은 Concat만 사용해서 채널 확장 → 연산량 거의 없이 채널 증가 가능</p>
<p>&lt;챗지-ShuffleNet 실 사용 순서 예시&gt;</p>
<p>네트워크 설계에서 stage 첫 블록 (c) → 나머지는 (b) / (a)는 비교 실험용으로만</p>
<p><strong>✓ 연산 효율성</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/7dc65e39-ea20-4239-9921-fb7f996ed816/image.png" alt=""></p>
<p>→ 뫄뫄한 수식으로 인해 같은 연산 예산 하에서 ShuffleNet은 더 넓은 특징맵 사용 가능</p>
<p>⇒ 작은 네트워크는 정보를 처리할 채널 수가 부족하므로 채널을 넓히는 건 성능향상에 있어 중요!</p>
<p><strong>✓ Depthwise Conv의 사용전략</strong></p>
<ul>
<li><p>Shuffle Net 에서는 <strong>“병목 특징 맵(Bottleneck featuremap)”</strong>에만 적용</p>
<ul>
<li><p>Depthwise Conv는 이론적으로는 매우 낮은 복잡도를 갖지만,<br>실제 저전력 모바일 기기에서는 효율적으로 구현하기 어렵기 때문</p>
<p>⇒ 계산 대비 메모리 접근 비율이 나쁨</p>
<p>→ 불필요한 오버헤드를 최소화 하기 위함</p>
</li>
</ul>
</li>
</ul>
<h3 id="33-network-architecture">3.3 Network Architecture</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/e93903a5-3346-41e0-9687-f668906a9a01/image.png" alt=""></p>
<p>→ 이렇게 채널 수를 2배 늘리고</p>
<p>ShuffleNet Unit의 <strong>bottleneck 채널수</strong>는 <strong>출력 채널수의 1/4</strong>로 설정</p>
<blockquote>
<p><strong>✓ 왜 1/4 비율일까?</strong></p>
<p><strong>✓ Bottleneck 구조: 줄이기 → 처리 → 늘리기</strong></p>
<ul>
<li><p>처음 1x1 Conv에서 채널 수를 줄이면 중간 연산(특히, 3x3 Conv 또는 Depthwise Conv)에 필요한 연산량이 비례해서 줄어듦</p>
</li>
<li><p>마지막 1x1 Conv에서 다시 채널수 복원</p>
</li>
<li><p>너무 많이 줄이면→ 연산량이 줄지만 정보손실도 커짐(정확도 하락)</p>
</li>
<li><p>너무 적게 줄이면→ 정보는 남지만, 연산량 절감 효과 떨어짐</p>
</li>
</ul>
<p>⇒ 그냥 경험적으로~ 좋다</p>
</blockquote>
<p><strong>✓ g(그룹 수)와 채널 수의 관계</strong></p>
<ul>
<li>ShuffleNet 유닛에서 그룹수는 Pointwise Convolution의 연결 희소성을 결정<ul>
<li>전체 연산량(약 140MFLOPs)가 대체로 일정하게 유지하도록 출력 채널 수 조정</li>
</ul>
</li>
</ul>
<p>⇒ <strong>그룹 수가 커질수록 같은 연산 내에서 “출력 채널 수(=합성곱필터수)가 많아진다.</strong></p>
<p>더 많은 정보를 인코딩할 수 있게 하지만, 동시에 각 개별 합성곱 필터가 참조할 수 있는 입력 채널수가 제한되므로 성능저하로 이어질 수도 있음.</p>
<blockquote>
<p>그냥 쉽게 생각하면,</p>
<ul>
<li><p>그룹 합성곱이라는게,</p>
<p>입력 채널을 g개로 나누고 각 그룹별로 독립적으로 합성곱</p>
</li>
<li><p>g가 늘어나면 날수록 각 그룹의 입력 채널수는 당연히 줄겠지</p>
<p>→ 한 개의 필터가 처리하는 연산량이 줄어서 같은 연산량 예산에서 더 많은 출력 채널</p>
<p>을 배치할 수 있었잖어~</p>
</li>
</ul>
<p>⇒ 이렇게 g가 커질수록 <strong>한 개의 합성곱 필터가 볼 수 있는 입력 채널수가 제한</strong>되기 때문에</p>
<p>입력 특징 정보의 다양성이 줄어들 수 밖에.</p>
</blockquote>
<p><strong>⇒ g가 커져도 성능을 유지하려면 그룹 간 정보가 섞여야 함</strong></p>
<p>⇒ Channel Shuffle은<br>이전 레이어 출력 채널을 재배치해서 다음 그룹 합성곱이 다른 그룹의 정보를 참조하게끔!</p>
<p><strong>✓ 복잡도 조절법</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f101d484-ff8e-40ba-b749-1c4e3002c1ab/image.png" alt=""></p>
<p>→ 채널 수에 따라 <strong>스케일 팩터(scale factor)</strong> 적용</p>
<ul>
<li><p>ShuffleNet sx : ShuffleNet 1x의 <strong>필터 수를 s배로 늘린</strong> 모델 의미</p>
<p>→ 전체 연산 복잡도: s^2</p>
</li>
</ul>
<blockquote>
<p>✓ 모델이 작을수록 그룹수를 늘리는게 효과적</p>
<ul>
<li>가로(같은 모델에서 g) → 그룹수를 늘리면 같은 연산량 내에서 채널수를 늘릴 수 있어서 성능이 좋아지기도 함</li>
<li>세로(같은g에서 모델크기) → 채널수와 연산량이 줄어들면 정확도 떨어짐</li>
</ul>
<p>✓ 너무 큰 g는 오히려 성능 하락 ex. ShuffleNet 0.5x</p>
<p>✓ 아주 작은 모델의 경우에는 그룹 수가 커질수록 성능이 꾸준히 향상</p>
</blockquote>
<hr>
<h2 id="4-experiments">4. Experiments</h2>
<p><strong>[평가방법]</strong></p>
<ul>
<li><p>ImageNet 2012 분류 데이터셋에서 제안한 모델 평가</p>
<p><strong>[예외]</strong></p>
<ul>
<li><p>Weight Decay 값을 4 x 10^(-5) 로 설정</p>
</li>
<li><p>학습률 정책 사용</p>
</li>
<li><p>데이터 전처리에서 “스케일 증강” 약하게 적용</p>
<p>⇒ 작은 네트워크의 경우 <strong>“과소적합”</strong>에 더 취약하기 때문에 예외를 둠</p>
</li>
</ul>
</li>
</ul>
<p>⇒ 채널 셔플을 적용하면 모든 경우 오류율 감소 + 그룹수(g)가 클수록 효과가 더 큼!</p>
<h3 id="41-ablation-study">4.1 Ablation Study</h3>
<ul>
<li><p><strong>Ablation Study?</strong></p>
<p>→ AI시스템에서 특정부분을 제거함으로써 그 부분이 전체적인 시스템 성능에 기여하는 바를 연구하는 것</p>
<p>즉, 제안한 요소가 모델에 어떤 영향이 미치는지 확인하고 싶을때,</p>
<p>이 요소를 포함한 모델 vs. 요소를 포함하지 않은 모델을 비교하는 것</p>
</li>
</ul>
<h3 id="4112-pointwise-group-convolutions--channel-shuffle-유무">4.1.1&amp;2 Pointwise Group Convolutions &amp; channel Shuffle 유무</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/aac0ee92-2d90-4665-abdd-46774cf0fa1c/image.png" alt=""></p>
<ul>
<li>g=1인 모델보다 <strong>g&gt;1인 모델</strong> 성능이 좋더라~</li>
<li><strong>작은 모델일수록</strong> 그룹 합성곱의 이점을 더 많이 보더라~<ul>
<li>넓은 특징맵은 더 많은 정보를 인코딩할 수 있어 성능 향상에 기여</li>
<li><strong>작은 네트워크는 특징맵의 폭이 얇기 때문에 넓어지면 이점을 더 크게 누림!</strong></li>
</ul>
</li>
<li><strong>아주 작은 모델의 경우</strong>에는 넓은 특징맵이 주는 이점이 더 크더라~</li>
<li><strong>채널 셔플을 적용</strong> 한 경우, 분류 성능이 좋더라~<ul>
<li><strong>그룹수가 큰 경우</strong> 더 큰 폭으로 개선됨 → 그룹 간 정보 교환이 중요하다!</li>
</ul>
</li>
</ul>
<h3 id="42-comparison-with-other-structure-units">4.2 Comparison with Other Structure Units</h3>
<ul>
<li>같은 연산량에서 더 많은 채널 수 확보 → 정확도 향상<ul>
<li>VGG-like, ResNet, Xception-like, ResNeXt 등 다양한 CNN 블록구조와 동일한 연산량 조건으로 성능 비교</li>
</ul>
</li>
<li>MobileNet 대비 우수하더라~</li>
<li>Inception 계열보다도 효율적이더라~</li>
</ul>
<h3 id="43-comparison-with-mobilenets-and-other-frameworks">4.3 Comparison with MobileNets and Other Frameworks</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/efeb87d8-b103-4e58-bb0f-e4970e2d4620/image.png" alt=""></p>
<ul>
<li>모든 연산 복잡도 내에서 SuffleNet이 더 낮은 분류 오류율을 냄</li>
<li>ShuffleNet은 원래 150 MFLOPs 미만 소형 모델을 목표로 설계됐지만, 500MFLOPs이상에서도 더 좋더라</li>
</ul>
<hr>
<p>ShuffleNet은 50개의 계층(layers)로 구성된 반면, MobileNet은 28개의 계층만 가지고 있음</p>
<p>→ ShuffleNet의 stage2~4에서 블록 절반을 없앤 26계층 버전(SuffleNet 0.5 shallow (g=3)) 실험</p>
<p>: 그래도 MobileNet보다 성능이 좋더라</p>
<p>⇒ ShuffleNet의 성능이 <strong>“깊이”보다 “효율적인 구조 설계”에 기인</strong>한다는 것을 시사</p>
<hr>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/4a64528a-b773-4ad6-a7d4-af5a413abbe5/image.png" alt=""></p>
<p>→ ShuffleNet이 비슷한 정확도를 가지면서도 효율적이다</p>
<hr>
<p><strong>✓ 아키텍쳐 확장성</strong></p>
<p>→ ShuffleNet은 단순한 구조 덕분에, 최신 기법을 쉽게 적용 가능하다</p>
<h3 id="44-generalization-ability-일반화">4.4 Generalization Ability (일반화)</h3>
<ul>
<li><strong>전이학습평가</strong><ul>
<li><strong>전이학습</strong>: 이미 대량의 데이터로 학습된 모델의 지식을 다른 관련 작업에 적용하는 과정</li>
<li>MS COCO 객체 탐지 과제에서 Faster R-CNN 프레임워크로 테스트</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/37eba272-4dca-470e-9272-a049ea042811/image.png" alt=""></p>
<ul>
<li>ShuffleNet 2x<ul>
<li>MobileNet보다 해상도 좋다.</li>
</ul>
</li>
<li>ShuffleNet 1x<ul>
<li>600해상도에서 MobileNet과 비슷한 성능 but 복잡도는 4배 낮다.</li>
</ul>
</li>
</ul>
<p>⇒ <strong>ShuffleNet이 단순한 구조</strong>를 가졌기 때문이다.</p>
<h3 id="45-actual-speedup-evaluation-속도평가">4.5 Actual Speedup Evaluation (속도평가)</h3>
<ul>
<li><p>ShuffleNet은 그룹수(g)가 큰 경우 성능이 더 좋긴 하지만, 구현에서의 효율성이 떨어짐</p>
<p>→ <strong>g=3</strong>이 good!</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ecd05df5-8e6f-4cfd-ae04-dfb33cdd1710/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] A ConvNet for the 2020s]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-A-ConvNet-for-the-2020s</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-A-ConvNet-for-the-2020s</guid>
            <pubDate>Wed, 22 Jul 2026 11:21:34 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: A ConvNet for the 2020s
<strong>학회(출판연도)</strong>: CVPR(2022)
<strong>연구분야</strong>: 컴퓨터 비전 백본 네트워크</p>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ea6c71a1-3ce8-4acd-96a9-edc4cd69fca9/image.png" alt=""></p>
<blockquote>
<p><strong>✓ 의미론적 분할</strong></p>
<ul>
<li><p>이미지를 <strong>픽셀 단위로 분류</strong>하는 작업</p>
</li>
<li><p>사진 속 픽셀에 대해 “이 픽셀은 사람”, “이 픽셀은 도로” 와 같이 클래스 레이블 부여</p>
<p>→ 원본 이미지와 크기가 같은 <strong>“클래스맵(class map)”</strong> 만들어지고, 각 픽셀은 <strong>그 픽셀의 의미적 범주</strong>를 지님</p>
<p>⇒ 장면의 이해(자율주행, 의료 영상 분석, 위성 이미지 분석 등)에 많이 쓰임</p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5b85ad48-e4ca-4e26-b9d7-26d5bcfd95fb/image.png" alt=""></p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 범용 비전 백본(General-purpose Vision Backbone)</strong></p>
<p><strong>백본(backbone)</strong></p>
<ul>
<li><p>이미지에서 특징(feature)을 추출하는 기본 골격 네트워크</p>
<ul>
<li>백본: 이미지 → <strong>특성(feature) 추출을 담당하는 신경망 구조</strong></li>
<li>특성맵: 백본이 이미지를 통과시켜 얻어낸 결과물</li>
</ul>
<p>ex. ResNet, Swin-T</p>
</li>
</ul>
<p><strong>범용 백본</strong></p>
<ul>
<li><p>특정 작업에만 특화되지 않고, 분류·탐지·분할 등 다양한 비전 작업에 공통적으로 사용할 수 있는 구조</p>
<p>⇒ 한 번 학습된 백본을 가져다가(전이 학습) 다른 작업용 네트워크 입력으로 연결할 수 있도록</p>
</li>
</ul>
</blockquote>
<p>⇒ <strong>현재는 Transformer가 우수하다는 인식이 강하지만, 순수 ConvNet 역시 뒤지지 않는 성능을 낼 수 있다!</strong></p>
<p>: 본 논문의 저자는 <strong>ConvNeXt</strong>를 제안하며, 정확도와 확장성에서 Transformer와 견줄 뿐 아니라, 단순성과 효율성까지 유지함을 보여주려 한다.</p>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<h3 id="2010s-cnn이-cv에서-왜-지배적이었는가-alexnet-→-vgg-→-resnet"><strong>&lt;2010s&gt; CNN이 CV에서 왜 지배적이었는가? (AlexNet → VGG → ResNet)</strong></h3>
<p>→ 슬라이딩 윈도우(sliding window), 귀납적 편향(inductive bias), 이동 등변성(translation equivariance)</p>
<blockquote>
<p><strong>✓ 슬라이딩 윈도우(sliding window)</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/301000b9-4319-47ab-b580-f588cd42227c/image.png" alt=""></p>
<ul>
<li><p>작은 크기의 필터(커널)를 입력 데이터(이미지)에 겹치면서 조금씩 이동시키며 연산하는 방식</p>
</li>
<li><p>CNN에서는 이 슬라이딩 과정에서 합성곱 연산이 이루어져 featuremap 만듦</p>
<p>→ 이미지 전체를 한 번에 보는 것이 아니라 <strong>“지역적 특징(local feature)”</strong>을 잡을 수 있음</p>
<p>→ <strong>필터 가중치를 공유</strong>하므로 파라미터 수가 줄어듦</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 파라미터 수가 줄어들까?</strong></p>
<p>CNN의 합성곱층에서는</p>
<ul>
<li><p>작은 필터(커널) 하나를 학습하고, 이걸 이미지의 모든 위치에 “공유(weight sharing)”해서 적용</p>
<p>ex. 3 x 3 크기, 채널 3개짜리 필터 → 가중치 개수는 3x3x3=27개 뿐</p>
</li>
<li><p>이 필터를 왼쪽 위, 오른쪽 아래 등 모든 위치에 같은 값으로 사용</p>
<p>⇒ 전체 픽셀 위치마다 다른 가중치(필터의 숫자)를 둘 필요가 없음(파라미터수 감소)</p>
</li>
</ul>
<p><strong>✓ 이렇게 해도 괜찮은가?</strong></p>
<p>→ 이미지 특징은 위치에 상관없이 동일한 패턴으로 나타난다는 가정 때문</p>
</blockquote>
<blockquote>
<p><strong>✓ 귀납적 편향(inductive bias)</strong></p>
<ul>
<li><p>모델이 학습할 때 데이터의 일반적인 규칙을 추론하기 위해 가지는 사전 가정</p>
</li>
<li><p>CNN의 경우</p>
<p>1️⃣ <strong>지역성(locality)</strong>:  중요한 특징은 국소 영역에서 나타난다</p>
<p>2️⃣ <strong>가중치 공유(weight sharing)</strong>: 같은 특징은 이미지 어디서는 동일하게 나타날 수 있다</p>
<p>3️⃣ <strong>이동 등변성(Translation Equivariance):</strong> 물체가 위치를 옮겨도 그 특징은 그대로</p>
<p>⇒ 이러한 편향 덕분에 CNN은 이미지 인식에서 데이터가 적어도 잘 학습하고 연산량도 효율적</p>
</li>
</ul>
</blockquote>
<h3 id="2020s-vit의-등장">&lt;2020s&gt; ViT의 등장</h3>
<ol>
<li><p><strong>ViT의 주요 목표: 스케일링</strong></p>
<p>→ 작은 데이터셋에서는 CNN이 더 우수하지만,</p>
<p>모델과 데이터셋이 충분히 크다면, ResNet보다도 뛰어난 성능을 낼 수 있음을 보여줌</p>
<blockquote>
<p><strong>✓ ViT의 주요 목표가 스케일링인 이유</strong></p>
<ul>
<li><p>CNN은 모델 크기를 무작정 키우면 성능이 일정 수준에서 멈추는 경향이 있음</p>
</li>
<li><p>ViT는 데이터와 파라미터를 계속 키워도 성능이 거의 선형적으로 증가</p>
<p>⇒  <strong>큰 데이터+큰 모델 = 성능↑</strong> 이 뚜렷하게 보이는 구조라, 대규모 학습에서 특히 강력!</p>
</li>
</ul>
</blockquote>
</li>
<li><p><strong>한계 → CV에는 이미지 분류만 있는 것이 아니다!</strong></p>
<ul>
<li><p>** 귀납적 편향(inductive bias)가 없는 기본형 ViT**</p>
<ul>
<li>ViT는 CNN의 귀납적 편향(지역성, 가중치 공유, 이동 등변성)없이 <strong>완전히 데이터 기반으로 학습</strong></li>
</ul>
<p>→ 데이터가 적으면 성능이 떨어지고, 과적합이 쉬움</p>
</li>
</ul>
</li>
</ol>
<ul>
<li><p>** 전역 self-attention의 이차적 복잡도**</p>
<ul>
<li><p>ViT의 핵심 연산인 self-attention은 모든 패치가 모든 다른 패치와 상호작용</p>
<ul>
<li><p>패치수 = N 이면, 연산량은 N^2</p>
<p>→ 이미지가 커질수록 패치수 급증 → 계산량 폭발</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>[정리]</strong></p>
<ul>
<li>ViT는 데이터와 모델이 클수록 CNN을 능가할 수 있다.</li>
<li>하지만 CNN처럼 범용 백본(backbone)으로 쓰이기엔 연산량과 구조상의 한계 존재</li>
<li>특히, 고해상도 입력에서 self-attention의 연산량이 너무 커짐</li>
</ul>
</blockquote>
<h3 id="-2020s-계층형-transformer-swin-t의-등장">** &lt;2020s&gt; 계층형 Transformer, Swin-T의 등장**</h3>
<p>→ ViT의 한계(self-attenton, 귀납적편향X)를 해결하고자 등장</p>
<p>⇒ <strong>ConvNet 차용</strong></p>
<ul>
<li>지역 윈도우 내에서의 attention</li>
<li>슬라이딩 윈도우 전략</li>
</ul>
<p><strong>[ImageNet-1K 분류 정확도와 연산량 비교]</strong></p>
<blockquote>
<p><strong>✓ ImageNet-1K</strong></p>
<ul>
<li>1000개의 카테고리(classs)로 분류된 데이터셋</li>
<li>총 이미지 수: 120만 장</li>
</ul>
<p><strong>✓ ImageNet-22K</strong></p>
<ul>
<li>약 22,000개의 카테고리로 분류된 훨씬 더 큰 버전</li>
<li>총 이미지 수: 1,400만 장(훨씬 더 세분화된 분류; 개 → 품종 별 100종 이상)</li>
</ul>
<p><strong>✓ 파인 튜닝(fine-tuning)</strong></p>
<ul>
<li>이미 학습된 모델로 가져와서, 내가 원하는 데이터나 목적에 맞게 “마무리 학습”하는 과정</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/94158ec8-4977-4373-ac8d-c9bb6af6ae21/image.png" alt=""></p>
<blockquote>
<ul>
<li><strong>가로축</strong><ul>
<li>왼: ImageNet-1K로만 학습한 모델</li>
<li>오: ImageNet-22K로 <strong>사전학습 후,</strong> ImageNet-1K로 <strong>파인튜닝</strong>한 모델</li>
</ul>
</li>
<li><strong>세로축</strong><ul>
<li>ImageNet-1K에서 Top-1 Accuracy(%)</li>
</ul>
</li>
<li><strong>버블크기</strong><ul>
<li>해당 모델의 연산량</li>
</ul>
</li>
<li><strong>색상</strong><ul>
<li>주황색: ViT, Swin-T</li>
<li>보라색: ConvNet 계열</li>
</ul>
</li>
</ul>
</blockquote>
<p>** 기존 ResNet-50(큰 원)**</p>
<p>→ 정확도는 낮지만, 효율성은 나쁘지 않다</p>
<p>** Swin-T**</p>
<p>→ Transformer 기반으로 정확도 향상</p>
<p>→ 다양한 CV 작업에 활용 가능</p>
<p>** ConvNeXt**</p>
<p>→ ResNet-50을 현대식으로 개량하여 Swin-T</p>
<p>보다 높은 정확도 달성</p>
<p>→ FLOPs 수준은 동일하지만, 구조가 단순하고</p>
<p>효율적</p>
<p>→ ConvNet도 여전히 최신 Transformer와 경쟁</p>
<p>가능하다는 것을 입증</p>
<blockquote>
<p><strong>✓  많은 데이터로 학습하면 좋은 거 아닌가? 왜 22K에서 끝내지 않고 1K로 파인튜닝할까?</strong></p>
<ul>
<li><p>데이터가 많으면 일반적인 표현력은 좋아진다. 하지만, 모델의 “최종목적”이 중요한 것!</p>
</li>
<li><p>보통, 새로운 모델 성능을 비교할 때 “ImageNet-1K에서의 정확도” 사용</p>
<p>→ 목표가 1K 기준 평가라면 22K로 학습한 그대로 쓰면 라벨 체계가 맞지 않기 때문에, 라벨 매핑과 모델 조정이 필요하다</p>
<p>ex. 22K에서는 “비글 vs 포메” 라면, 1K에서는 “개” 로 분류해야 함</p>
</li>
</ul>
</blockquote>
<hr>
<h2 id="2-modernizing-a-convnet-a-roadmap">2. Modernizing a ConvNet: a Roadmap</h2>
<p><strong>→ ResNet을 출발점으로 Transformer와 유사한 형태의 ConvNet으로 발전시켜보자!</strong></p>
<ul>
<li>Macro Design (큰 틀 설계)</li>
<li>ResNeXt 스타일 도입</li>
<li>Inverted Bottleneck 구조</li>
<li>대형 커널 사용</li>
<li>레이어 단위 세부 설계(Micro Design)</li>
</ul>
<h3 id="21-training-techniques학습방법">2.1 Training Techniques(학습방법)</h3>
<p>→ 모델의 구조뿐만 아니라 <strong>학습방식도</strong> 성능에 큰 영향!</p>
<p><strong>[1단계] ViT의 학습 절차를 적용하여 ResNet-50/200 학습 시킴</strong></p>
<p>→ 둘 다 쓰는 이유는 50은 소형 비교군, 200은 대형 비교군</p>
<blockquote>
<p><strong>✓ ResNet-50 → 50개의 층(layer)</strong></p>
<ul>
<li>대략 50층의 연산 경로를 갖도록 설계</li>
<li>블록 구성(3,4,6,3)<ul>
<li>stage1: 3개 블록</li>
<li>stage2: 4개 블록</li>
<li>stage3: 6개 블록</li>
<li>stage4: 3개 블록</li>
</ul>
</li>
</ul>
<p><strong>✓ stage</strong></p>
<p>CNN이나 ViT에서 해상도(특징맵 크기)가 일정하게 유지되는 구간</p>
<ul>
<li>1x1, 3x3 같은 Conv 층을 합산해서 개수 계산</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 3x3 Conv → 공간적 특징 추출</strong></p>
<ul>
<li>3x3 필터는 주변 픽셀과의 관계(엣지, 패턴)을 잘 잡아냄</li>
<li>커널이 작아서 연산 효율이 좋고, 여러 층을 쌓으면 큰 수용영역 확보 가능</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓  왜 커널이 작으면 연산 효율이 좋을까?</strong></p>
<p>연산량 ∝ <strong>커널 크기 ^2 × 출력 채널 수 × 출력 feature map 크기</strong></p>
<p>→ 커널 크기를 키우면 연산량이 <strong>제곱</strong>으로 늘어남</p>
<p>→ 작은 커널이 계산량이 훨씬 적음</p>
</blockquote>
<blockquote>
<p><strong>✓  왜 여러 층을 쌓으면 큰 수용영역을 확보할 수 있을까?</strong></p>
<p>수용영역 = 한 출력 픽셀이 참조하는 <strong>입력 이미지 영역 크기</strong></p>
<ul>
<li><p>한 층의 3×3 커널 수용영역 = 3×3</p>
</li>
<li><p>두 층을 연달아 쌓으면?</p>
<ul>
<li>첫 번째 층이 만든 3×3 특징맵 위에서 또 3×3을 봄</li>
<li>입력 이미지 기준으로 보면 → <strong>5×5 영역</strong>을 커버</li>
</ul>
</li>
<li><p>세 층 쌓으면 → <strong>7×7 영역</strong></p>
<p>→ 층이 늘어날수록 수용영역이 커짐</p>
</li>
</ul>
<p><strong>⇒ 작은 커널: 계산량이 적고, 더 많은 층을 쌓아 복잡한 패턴 학습 가능</strong></p>
<p><strong>⇒ 여러 층: 수용영역이 커져서 더 넓은 문맥 정보 반영 가능</strong></p>
</blockquote>
<blockquote>
<p><strong>✓ 1x1 Conv → 채널(feature map) 조정</strong></p>
<ul>
<li><p>채널수 축소/확장에 사용(차원 변화)</p>
</li>
<li><p>공간의 크기는 유지하면서 <strong>“채널 간의 결합(정보 혼합)”</strong>을 수행</p>
</li>
<li><p>연산량이 매우 적어서 네트워크 폭을 유연하게 조절 가능</p>
<p>⇒ 1x1 Conv는 한 픽셀 위치에서 모든 채널 값을 가중합에 새로운 채널 만들어냄</p>
</li>
</ul>
<p><strong>✓ 정보혼합</strong></p>
<p>서로 다른 특징을 합치고 조합하는 과정</p>
<p>→ (수평선+수직선+ 색상패턴,,,)</p>
</blockquote>
<p>&lt;참고&gt; <a href="https://ffighting.net/deep-learning-basic/%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90/1x1-convolution/">https://ffighting.net/deep-learning-basic/%EB%94%A5%EB%9F%AC%EB%8B%9D-%ED%95%B5%EC%8B%AC-%EA%B0%9C%EB%85%90/1x1-convolution/</a></p>
<blockquote>
<p><strong>✓ ResNet-200 → 200개의 층(layer)</strong></p>
<ul>
<li><p>훨씬 깊은 버전, 더 많은 파라미터와 연산량</p>
</li>
<li><p>블록 구성(3,24,36,3)</p>
<ul>
<li>stage3의 블록 수가 매우 많아짐</li>
</ul>
<p>→ 더 깊어서 성능은 높지만, <strong>연산량(FLOPs)과 메모리 사용량</strong>도 큼</p>
</li>
</ul>
</blockquote>
<p><strong>[2단계] ResNet 기본 학습 epoch수 90 → 300으로 학습 기간 연장</strong></p>
<p>⇒ 강력한 데이터 증강 및 정규화 조합 + 대규모 모델을 사용하기 때문</p>
<p>⇒ 짧게 돌리면 잠재력을 다 못 끌어내고, 길게 돌려도 과적합 위험이 낮으므로 늘림</p>
<ul>
<li><p>옵티마이저 : AdamW</p>
</li>
<li><p>데이터 증강 : Mixup, Cutmix, RandAugment, Random Erasing</p>
</li>
<li><p>정규화 : Stochastic Depth, Label Smoothing</p>
</li>
</ul>
<blockquote>
<p><strong>✓ epoch</strong></p>
<ul>
<li>전체 학습 데이터셋을 한 번 모두 사용해 학습하는 주기</li>
</ul>
<p><strong>✓ 옵티마이저 → 가중치를 어떻게 조정할지 결정하는 “규칙” 또는 “알고리즘</strong></p>
<ul>
<li>AdamW = Adam + Weight Decay(가중치 감쇠; 과적합 방지)</li>
</ul>
<p><strong>✓ 데이터 증강(입력 쪽 변화)</strong></p>
<ul>
<li>훈련 데이터를 인위적으로 변형 및 추가해서 데이터의 양과 다양성을 늘리는 기법</li>
</ul>
<p><strong>✓ 정규화(모델 쪽 변화)</strong></p>
<ul>
<li>모델이 과적합하지 않도록 학습과정이나 구조를 제약하는 기법</li>
</ul>
</blockquote>
<h3 id="22-macro-design매크로-설계">2.2 Macro Design(매크로 설계)</h3>
<p>→ Swin-T의 매크로 네트워크 설계 분석</p>
<p>ㄴ ⭐ 1️⃣ 스테이지 연산 비율 + 2️⃣ 스템셀(stem cell) 구조</p>
<blockquote>
<p><strong>✓ 매크로 설계란? → 모델을 만들 때, 큰 틀을 먼저 잡는 것을 의미</strong></p>
<ul>
<li><p>모델 전반의 골격과 계층 구조를 설계하는 단계</p>
<p>ex.  stage가 몇 개일지, 각 stage의 해상도와 채널 수, 어디서 다운 샘플링할 지 등</p>
<p>↔ 마이크로 설계(Micro)</p>
</li>
</ul>
<p><strong>✓ 스템셀(stem cell) 구조</strong></p>
<ul>
<li>이미지를 처음 받아서 특징 추출이 잘 되게 전처리하는 첫 레이어 집합</li>
</ul>
</blockquote>
<ol>
<li><p><strong>스테이지 연산 비율</strong></p>
<ul>
<li><p><strong>ResNet:</strong> [Stage별 블록 개수] 3:4:6:3</p>
<p>→ <strong>초반 Stage(고해상도)에도 블록이 많아 연산량이 큼</strong></p>
</li>
<li><p><strong>ConvNeXt:</strong> [Stage별 블록 개수] 1:1:<strong>3:</strong>1(→Swin Transformer 스타일)</p>
<p>→ 초반 Stage는 얕게, 중간 Stage(특히 Stage3)에 연산 집중</p>
<p>⇒ 연산의 효율성을 높이고, 중요한 중·후반부 특징 학습 강화!</p>
</li>
</ul>
</li>
<li><p><strong>스템셀 구조</strong></p>
<ul>
<li><p><strong>ResNet Stem:</strong> 7x7 Conv(Stride=2) + 3x3 MaxPool(stride=2)</p>
<p>→ <strong>2번의 다운샘플링으로 해상도 1/4로 축소</strong></p>
</li>
</ul>
<blockquote>
<p><strong>✓ Vision Transformer(ViT)의 패치화(Patchify)</strong></p>
<ul>
<li><p>입력 이미지를 일정 크기 “패치(조각)”으로 잘라서 Transformer에 넣음</p>
<p>→ 이때, 패치 생성은 <strong>비중첩(non-overlapping) 합성곱</strong>으로 구현 가능</p>
<p>ex. 16x16 커널, stride=16 → 이미지가 바로 16x16 크기 토큰들로 변환</p>
</li>
</ul>
<p><strong>✓ Swin Transformer의 Patchify</strong></p>
<ul>
<li><p>ViT처럼 단일 패치 크기가 16이 아니라 작은 패치(4x4)로 시작</p>
<p>→ Swin은 다단계 구조라서 초반에 해상도를 너무 줄이면 정보 손실이 커서, 처음에는 조금만</p>
<p>줄임</p>
<p>→ Stage를 거치며 점진적으로 다운 샘플링</p>
</li>
</ul>
</blockquote>
<ul>
<li><p><strong>ConvNeXt Stem(Patchify Stem)</strong>: <strong>4x4 Conv(stride=4) 한 번으로도 해상도 1/4 축소</strong></p>
<p>→ Swin Transformer의 patch embedding과 유사</p>
<p>⇒ 초기 연산량을 감소하여, 이후 stage에 더 많은 연산 자원 배분 가능</p>
<p><strong>⇒ 처음부터, 4x4 비중첩 패치화</strong></p>
<p><strong>⇒ ResNet에서도 복잡한 Stem 대신에 ViT, Swin 스타일의 Patchify Stem을 써도 성능 유지</strong></p>
</li>
</ul>
</li>
</ol>
<blockquote>
<p><strong>[정리]</strong></p>
<ul>
<li><p>ConvNeXt 는<br>1️⃣ <strong>Stage 연산 비율을 Swin 스타일로 조정하고 2️⃣ Stem을 Patchify 방식으로 단순화</strong>하여<br>CNN을 현대화!</p>
<p>⇒ ConvNeXt는 ResNet의 초반 구조(Stem)을 없애고, Swin처럼 4x4 (stride=4) patchify레이어로 시작해도 성능이 거의 떨어지지 않으니, 구조를 단순화하고 효율을 높였다는 뜻!</p>
</li>
</ul>
</blockquote>
<h3 id="23-resnext-fiy">2.3 ResNeXt-fiy</h3>
<p>→ Depthwise Convolution(채널별 공간연산) 도입함으로써 FLOPs 절감</p>
<h4 id="-resnext-아이디어-→-그룹-수를-늘리고-채널-수너비를-확장하라">** ResNeXt 아이디어 → 그룹 수를 늘리고, 채널 수(너비)를 확장하라**</h4>
<ul>
<li><p><strong>Grouped Convolution</strong> 사용</p>
<ul>
<li><p>합성곱 필터를 여러 그룹으로 나눠서 각 그룹별로 합성곱을 수행 → 연산량(FLOPs) 감소</p>
<p>ex. 입력 채널이 64개, 그룹 수가 4개이면 그룹당 16 채널만 처리</p>
<p>‼️FLOPs가 줄어든 만큼 채널수를 늘려 모델의 표현력 손실 보완</p>
</li>
</ul>
</li>
<li><p><strong>Depthwise Convolution</strong> → Grouped Conv의 극단적인 경우</p>
<ul>
<li><p>그룹 수 = 입력 채널 수</p>
<p>→ 채널마다 자기 채널만 따로 합성곱</p>
</li>
<li><p>공간적인 특징만 추출하고, 채널 간 결합은 없음 + 채널 결합은 1x1 Conv로 처리</p>
</li>
</ul>
</li>
</ul>
<p><strong>[Grouped Conv vs. Depthwise Conv]</strong></p>
<table>
<thead>
<tr>
<th></th>
<th>Grouped Conv</th>
<th>Depthwise Conv</th>
</tr>
</thead>
<tbody><tr>
<td>그룹수</td>
<td>지정 가능 (1~채널수)</td>
<td>채널 수와 동일</td>
</tr>
<tr>
<td>채널 처리 방식</td>
<td>그룹 내 채널끼리만 처리</td>
<td>각 채널 독립 처리</td>
</tr>
<tr>
<td>채널 결합</td>
<td>가능(같은 그룹 내)</td>
<td>없음 → 1x1 Conv 필요</td>
</tr>
<tr>
<td>연산량 절감</td>
<td>O(1/그룹수)</td>
<td>O(1/채널수) → 가장 많이 절감</td>
</tr>
</tbody></table>
<h4 id="-convnext의-선택">** ConvNeXt의 선택**</h4>
<ul>
<li><strong>ResNeXt</strong> → 그룹 수를 여러 개로 나누는 Grouped Conv</li>
<li><strong>ConvNeXt</strong> → Depthwise Conv로 변경<br>: ViT의 MSA처럼 <strong>공간 정보 처리와 채널 정보 처리 분리</strong></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/91642879-9fee-4948-afe7-3551f9e48c60/image.png" alt=""></p>
<h3 id="24-inverted-bottleneck역병목구조">2.4 Inverted Bottleneck(역병목구조)</h3>
<h4 id="-inverted-bottleneck이란">** Inverted Bottleneck이란?**</h4>
<ul>
<li><strong>Bottleneck (ResNet/ResNeXt 스타일)</strong><ul>
<li>채널 <strong>축소</strong> → 연산 → <strong>확장</strong></li>
<li>연산량 절감 목적</li>
</ul>
</li>
<li><strong>Inverted Bottleneck(MobileNetV2·Transformer 스타일)</strong><ul>
<li>채널 먼저 <strong>확장</strong> → 연산 → 다시 <strong>축소</strong></li>
<li>Transformer에서 MLP 은닉 차원이 입력의 4배</li>
<li>ConvNeXt에서도 확장 비율 4를 채택</li>
</ul>
</li>
</ul>
<p><strong>[ConvNeXt 설계]</strong></p>
<p>: (a) → (b) → (c) 변화가 모두 순차적으로 적용됨</p>
<ul>
<li><strong>(a) ResNeXt Block → (b) Inverted Bottleneck</strong><ul>
<li>채널 확장 → 공간 연산 → 채널 축소로 변경하여, 더 많은 채널 상태에서 공간 특징 학습</li>
</ul>
</li>
<li><strong>(b) Inverted Bottleneck → (c) Depthwise Conv 위치 이동</strong><ul>
<li>블록 시작 시 공간 특징부터 추출 → 이후 채널 확장/축소로 더 복합적인 특징 학습</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/9ea7d8e3-3326-4be7-ba64-0df4e5cbb542/image.png" alt=""></p>
<h4 id="-flops와-성능-변화">** FLOPs와 성능 변화**</h4>
<ul>
<li><p>Depthwise Conv 연산량은 증가 → 채널 확장 때문</p>
<p>BUT! 다운샘플링 residual 블록의 shortcut <code>1x1 Conv</code> 연산량이 크게 감소</p>
</li>
</ul>
<blockquote>
<p><strong>[정리]</strong></p>
<ul>
<li>ConvNeXt는 MobileNet V2:Transformer에서 차용한 Inverted Bottleneck을 활용하여<ul>
<li>표현력 강화: 더 많은 채널에서 공간 정보 처리</li>
<li>효율성 유지: FLOPs 감소</li>
</ul>
</li>
<li>공간 채널 분리 처리 + inverted bottleneck 구조 공유</li>
</ul>
</blockquote>
<h3 id="25-large-kernel-sizes-큰-커널-크기">2.5 Large Kernel Sizes (큰 커널 크기)</h3>
<h4 id="-convnet에서도-커널의-크기를-키우면-성능이-좋아질까">** ConvNet에서도 커널의 크기를 키우면 성능이 좋아질까?**</h4>
<blockquote>
<ul>
<li>ConvNeXt는 <strong>“Transfromer가 전역 시야를 갖는 이유”</strong>를 <strong>ConvNet 방식으로 흉내낸 것</strong></li>
<li>블록 앞쪽의 대형 커널의 Depthwise Conv를 넣어, 적은 채널로 넓은 영역의 공간 정보를 보고,<br>이후에<br>1x1 Conv에서 채널을 넓혀 세부처리를 하는데,,</li>
</ul>
<p>⇒ <strong>7x7</strong>에서 성능이 가장 잘 나오더라~</p>
</blockquote>
<h3 id="26-micro-design-마이크로-설계">2.6 Micro Design (마이크로 설계)</h3>
<p>→ ConvNeXt가 블록 내부 세부 설계(layer 수준)를 Transformer 스타일에 맞게 수정하면서 성능 높이자!</p>
<h4 id="-relu-→-gelu-성능변화x">** ReLU → GELU (성능변화X)**</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1084d2d3-7844-4cff-8186-ada35fa63511/image.png" alt=""></p>
<ul>
<li><strong>ReLU</strong>: 단순하고 빠르지만 값이 0 이하일 때 완전히 끊김</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/67b2f240-9d59-467a-8803-3cc45d63efa3/image.png" alt=""></p>
<ul>
<li><strong>GELU</strong>: 부드러운 곡선형 활성화</li>
</ul>
<p>⇒ 부드러운 비선형성을 가져오지만 성능 차이는 미미</p>
<h4 id="-활성화-함수-개수-줄이기-07">** 활성화 함수 개수 줄이기 (+0.7%)**</h4>
<ul>
<li><strong>ResNet</strong>: 거의 모든 Conv layer 뒤에 활성화 함수 붙임</li>
<li><strong>Transformer</strong>: MLP 블록에 활성화 함수 1개만 사용</li>
<li><strong>ConvNeXt</strong><ul>
<li>Residual block에서 1x1 Conv 2개 사이에 GELU 1개만 남김 → 나머지 GELU 제거</li>
</ul>
</li>
</ul>
<h4 id="-정규화-계층-줄이기-01">** 정규화 계층 줄이기 (+0.1%)**</h4>
<ul>
<li><strong>Transformer:</strong>  정규화 계층 수 적음</li>
<li><strong>ConvNeXt</strong><ul>
<li>블록 내의 BN(Batch Norm) 2개 제거 → 1x1 Conv 앞에 BN 1개만 유지</li>
</ul>
</li>
</ul>
<h4 id="-bnbatch-norm-→-lnlayer-norm-01">** BN(Batch Norm) → LN(Layer Norm) (+0.1%)**</h4>
<ul>
<li><p><strong>BN:</strong> ConvNet에서 표준, BUT 배치 크기에 민감하고 복잡</p>
</li>
<li><p><strong>LN:</strong> Transformer에서 주로 사용, 배치 크기 무관, 더 단순</p>
<p><strong>⇒ 배치 크기에 덜 민감하고 Transformer와 일관성 있는 구조로 만들기 위함</strong></p>
<p>✔️ 기존의 ResNet에서 BN → LN 직접 교체 시 성능 저하</p>
<p>✔️ <strong>ConvNeXt는 앞선 구조 변경과 학습 기법 덕분에 LN 사용 가능!</strong></p>
</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th>BN (Batch Normalization)</th>
<th>LN (Layer Normalization</th>
</tr>
</thead>
<tbody><tr>
<td>정규화 기준</td>
<td>배치 내 채널 별 평균/분산</td>
<td>샘플 내 전체 피처 평균/분</td>
</tr>
<tr>
<td>배치 크기 영향</td>
<td>있음(작아지면 성능 저하)</td>
<td>없음</td>
</tr>
<tr>
<td>주 사용 분야</td>
<td>CNN(이미지), 대규모 배치 학습</td>
<td>RNN, Transformer, NLP</td>
</tr>
<tr>
<td>계산 위치</td>
<td>채널별</td>
<td>전체 피처별</td>
</tr>
</tbody></table>
<blockquote>
<p><strong>✓ 샘플</strong></p>
<ul>
<li>데이터 1개 의미</li>
</ul>
<p><strong>✓ 배치</strong></p>
<ul>
<li>여러 샘플을 묶어서 한 번에 학습시키는 단위<ul>
<li>배치크기: 한번에 처리하는 샘플 개수</li>
</ul>
</li>
</ul>
</blockquote>
<p><em>비유하자면, BN은 반 전체 평균 / LN은 각 학생 자기 점수 평균</em></p>
<h4 id="-다운샘플링-구조-변경--05">** 다운샘플링 구조 변경  (+0.5%)**</h4>
<ul>
<li><strong>ResNet:</strong> 스테이지 시작 블록에서 stride =2 Conv로 다운샘플링</li>
<li><strong>Swin Transformer:</strong> 스테이지 사이에 별도의 다운샘플링 레이어 존재</li>
<li><strong>ConvNeXt</strong><ul>
<li>스테이지 사이에 2x2 Conv(stride=2)로 다운 샘플링 분리</li>
<li>해상도 변경 구간마다 LN 추가 (안정화 목적)</li>
</ul>
</li>
</ul>
<hr>
<p> <strong>[정리]</strong></p>
<ul>
<li>큰 구조가 아닌<br><strong>블록 내부의 연산 순서 및 종류를 Transformer와 비슷하게</strong> 바꿔서 성능을 올림</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] LETS-C : Leveraging Text Embedding for Time Series Classification]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-LETS-C-Leveraging-Text-Embedding-for-Time-Series-Classification</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-LETS-C-Leveraging-Text-Embedding-for-Time-Series-Classification</guid>
            <pubDate>Sat, 28 Feb 2026 06:35:19 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: LETS-C : Leveraging Text Embedding for Time Series Classification
<strong>학회(출판연도)</strong>: ACL(2025)
<strong>연구분야</strong>: 딥러닝 기반 시계열 표현 학습</p>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li>최근 사전학습된 LLM을 시계열 분류 과제에 맞게 파인튜닝하는 방식이 SOTA 달성</li>
<li>하지만, LLM기반 모델들의 학습 파라미터가 수백만 개에 달하는 대규모 모델이라는 단점 존재
⇒ LLM을 파인튜닝하기 보단, 
① 텍스트 임베딩 모델을 통해서 시계열 데이터를 임베딩 한 후
② CNN과 다층 퍼셉트론(MLP)로 구성된 간단한 분류 헤드와 결합하자!</li>
</ul>
<p><strong>[결과]</strong></p>
<ul>
<li>기존 SOTA 모델 능가 </li>
<li>평균적으로 SOTA대비 14.5%정도 학습 가능한 파라미터 사용</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>시계열 분류</p>
<ul>
<li>금융, 헬스케어, 활동 인식 등 다양한 분야에서 폭넓게 활용
→ 효율적이면서도 정확한 분류 방법에 대한 필요성이 높아지고 있음</li>
</ul>
</li>
<li><p>TSC의 NLP와 LLM의 적용</p>
<ul>
<li>프롬프팅 기법</li>
<li>사전 학습 LLM에 파인튜닝 하는 방식</li>
</ul>
</li>
</ul>
<p>  <strong>(P) [한계]</strong></p>
<pre><code> - LLM은 수십억개의 파라미터를 가진 거대한 모델

      → 계산 비용이 높아 제한된 환경에서는 실용적X

 - 부분적으로 동결된 사전 학습 LLM을 파인튜닝하더라도 수백만개의 학습가능한 파라미터 필요</code></pre><ul>
<li><strong>(S) LETS-C</strong><ul>
<li>기성 텍스트 임베딩 모델을 활용하자!</li>
<li>텍스트 임베딩 + CNN과 MLP로 구성된 분류헤드 결합<ul>
<li>텍스트 임베딩 모델: 시간적 데이터에 내재된 복잡한 패턴과 의존성 포착</li>
<li>분류헤드: 서로 다른 클래스간 구분</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><strong>[기여]</strong></p>
<p><strong>1. 최고 수준 성능</strong></p>
<ul>
<li>다양한 시계열 도메인 데이터셋에서 SOTA 달성<ul>
<li>27개의 베이스라인모델 능가</li>
</ul>
</li>
</ul>
<p><strong>2. 계산 효율성</strong></p>
<ul>
<li>기존 SOTA대비 14.5%의 파라미터만을 사용</li>
</ul>
<p><strong>3. 시계열 임베딩 내재적 판별력</strong></p>
<ul>
<li>텍스트 임베딩이 분류 정확도 향상에 기여</li>
</ul>
<p><strong>4. 다양한 텍스트 임베딩 모델에 대한 일반화 성능</strong> - 서로 다른 텍스트 임베딩 모델에서도 굿</p>
<p><strong>5. 정확도 손실을 최소화한 모델 크기 최적화</strong></p>
<ul>
<li>모델 크기를 줄여도 높은 정확도 유지</li>
</ul>
<hr>
<h2 id="2-related-work">2. Related Work</h2>
<h3 id="time-series-classification">Time Series Classification</h3>
<h4 id="초기연구">[초기연구]</h4>
<ul>
<li><p>지도학습</p>
<ul>
<li>DTW, SVM 같은 거리 기반 접근법</li>
<li>특징추출기법 + XGBoost 분류기 결합 방식</li>
<li>CNN, MLP, LSTM같은 순환 신경망(RNN)을 포함한 딥러닝 기반 접근법</li>
<li>최근 Transformer기반 self-attention을 활용하여 장기 의존성 포착</li>
</ul>
</li>
<li><p>비지도학습</p>
<ul>
<li>마스킹된 시계열 복원 과제로 사전학습</li>
<li>분류와 같은 다운스트림 과제에 파인튜닝하는 방식</li>
</ul>
</li>
</ul>
<p>⇒ 높은 계산 비용으로 인해 학습 과정에서 부담有</p>
<h3 id="language-models-for-time-series">Language Models for Time Series</h3>
<h4 id="최근-연구">[최근 연구]</h4>
<ul>
<li><p>시계열 - 텍스트 모델링, 시계열에 대한 자연어 설명, 다양한 응용을 포함하여 시계열과 언어의 결합 탐구</p>
<ul>
<li>프롬프팅 → 시계열 예측에 활용 (일부 설명 가능한 금융 예측 생성 가능성 탐구됨)</li>
<li>Time-LLM<ul>
<li>시계열 데이터를 언어 임베딩 공간으로 매핑하여 LLM기반 예측</li>
</ul>
</li>
<li>GPT와 같은 LLM을 파인튜닝 → SOTA 달성<h4 id="lets-c">[LETS-C]</h4>
</li>
</ul>
</li>
<li><p>LLM을 직접 사용하기보단 텍스트 임베딩 활용</p>
<h3 id="text-embeddings">Text Embeddings</h3>
</li>
<li><p>NLP의 핵심적 표현 기법</p>
<ul>
<li>단어 또는 문장을 밀집 벡터 공간으로 매핑하여 의미적, 구문적 정보 포착</li>
<li>단어 수준의 임베딩: Word2Vec, GloVe</li>
<li>문맥기반 임베딩: BERT, RoBERTa </li>
</ul>
<blockquote>
</blockquote>
<p><strong>✓ Word2Vec</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/02e3c494-436b-4187-8b80-b993d84f04c0/image.png" alt=""></p>
<ul>
<li>단어 하나마다 <strong>항상 같은 벡터</strong>를 부여하는 방식</li>
<li>각 점 = 단어 하나</li>
<li>비슷한 단어들이 공간에서 가까이 모여 있음</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ GloVe</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/e2acd2d4-5104-48b4-8347-831b9b1afa73/image.png" alt=""></p>
</blockquote>
<ul>
<li>단어들이 전체 말뭉치에서 얼마나 같이 등장하는지 보는 방식</li>
<li>같이 등장한 빈도 기반으로 벡터 공간 형성</li>
<li>고정된 단어 벡터</li>
</ul>
<ul>
<li><p>시계열</p>
<ul>
<li>NLP에 비해 대규모 데이터셋 부족</li>
<li>임베딩을 처음부터 학습하는 것에 대한 어려움</li>
</ul>
</li>
</ul>
<p>⇒ 시계열을 잘 표현하려면, <strong>시퀀스 전체 문맥을 요약</strong>할 수 있는 임베딩이 필요한데, NLP에서는 BERT계열이 가장 잘해왔다.</p>
<blockquote>
<p>LETS-C는 그걸 학습하지 않고, 그냥 가져다 쓰는(lightweight) 전략을 사용하자는 것!
즉, <strong>LLM을 학습하기 보단, 이미 학습된 표현공간을 활용하자는 아이디어</strong></p>
</blockquote>
<hr>
<h2 id="3-methodology">3. Methodology</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/f752865a-7bb5-4ee7-84e8-55916c03fcba/image.png" alt=""></p>
<ul>
<li><p>시계열 분류 데이터셋</p>
<ul>
<li>다변량 시계열 샘플 x_i를 클래스 레이블 y_i에 대응
<img src="https://velog.velcdn.com/images/hyooo__s/post/c9c4f1b3-e406-47c3-93be-af625340eb96/image.png" alt=""></li>
</ul>
</li>
<li><p>목표: 각 시계열에 대해 클래스 레이블(햇y)을 정확히 예측하는 분류기 학습</p>
</li>
<li><p>과정</p>
<ul>
<li><p>시계열 데이터 정규화 (전처리)</p>
</li>
<li><p>정규화된 데이터로 임베딩 생성</p>
</li>
<li><p>임베딩과 원본 시계열 데이터 결합</p>
</li>
<li><p>결합 데이터를 CNN과 MLP로 구성된 분류 헤드에 입력</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 단순한 분류 헤드를 선택한 이유</strong></p>
</blockquote>
<ul>
<li>** 텍스트 임베딩만으로도** 효과적인 분류를 하기에 충분하다</li>
</ul>
<h3 id="preprocessing">Preprocessing</h3>
<ul>
<li><p>x_i의 각 특징 차원 [0,1]범위로 min-max 정규화</p>
<ul>
<li>일관된 스케일 보장 목적<h3 id="text-embedding-of-time-series">Text Embedding of Time Series</h3>
<blockquote>
<p><strong>✓ 임베딩이란?</strong></p>
</blockquote>
</li>
</ul>
</li>
<li><p>컴퓨터의 입장에서는 &quot;고양이가 귀엽다&quot;에서 고양이? 귀엽다? 의미를 모름 (숫자만 계산 가능)
→ 때문에 단어에 숫자를 붙이기 시작했음!</p>
</li>
<li><p><strong>one-hot encoding</strong>
  <img src="https://velog.velcdn.com/images/hyooo__s/post/5e7b6023-ee87-4f21-9b47-5412f6cc5d09/image.png" alt=""></p>
<ul>
<li>이렇게 되면 서로가 모두 다른 값이고 고양이와 강아지가 비슷하다와 같은 정보를 얻을 수 없음</li>
<li>또한 단어 수가 늘면 벡터가 엄청나게 커지는 문제 발생
**  ⇒ 비슷한 의미의 단어는 숫자 벡터에서도 비슷하게 만들자!**</li>
</ul>
</li>
<li><p><strong>임베딩</strong>
<img src="https://velog.velcdn.com/images/hyooo__s/post/427f7682-c243-4aca-a321-6e44df2719a2/image.png" alt=""></p>
<ul>
<li>복잡한 대상(단어, 문장, 이미지 등)을 의미를 담은 숫자 벡터로 바꾸는 것</li>
<li>벡터간 거리 = 의미 유사도</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 텍스트 임베딩이란?</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/10aa9e84-8350-4e58-9fff-393dec7ce9ed/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>문장(텍스트)의 &quot;의미&quot;를 숫자 벡터 하나로 압축해서 표현하는 것</p>
</li>
<li><p>핵심: 비슷한 의미의 문장은 숫자벡터에서도 가깝게 만들자!</p>
<ul>
<li>어떤 단어들이, 어떤 순서로, 어떤 문맥에서 함께 나오는지를 배움</li>
</ul>
</li>
<li><p>수치 문자열의 토크나이제이션 방식이 임베딩 결과에 큰 영향을 미칠 수 있으므로 텍스트 임베딩 적용 전 전처리된 시계열을 문자열 형태로 신중하게 변환하는 것이 중요!</p>
<ul>
<li>(P) 일반적으로 사용되는 서브워드 토크나이저 → 숫자를 임의로 분할</li>
<li>(S) <strong>digit-space 토크나이제이션</strong><ul>
<li>각 자릿수를 공백으로 분리</li>
<li>시간 단계 구분을 위해 쉼표 추가</li>
<li>고정 소수점 정밀도 가정 → 소수점 제거</li>
</ul>
</li>
</ul>
</li>
<li><p>text-embedding-3-large model 사용</p>
<ul>
<li>변환된 시계열 문자열을 임베딩 공간으로 매핑하기 위함
즉, NLP모델을 쓰기 위함
 <img src="https://velog.velcdn.com/images/hyooo__s/post/6abf5e10-5b53-46eb-aa65-93b8ce4cdf2f/image.png" alt=""></li>
</ul>
</li>
</ul>
<blockquote>
<p>즉, 정리하자면</p>
</blockquote>
<ul>
<li>시계열은 길고 무겁기 때문에 각 채널별로 텍스트 임베딩을 만든 후</li>
<li>각 채널 임베딩을 쌓아 행렬로 만든다</li>
<li>이 결과는 항상 같은 크기이기 때문에 <strong>한 번 계산하면 계속해서 사용 가능</strong>하다</li>
</ul>
<h3 id="fusing-embedding-and-time-series">Fusing Embedding and Time Series</h3>
<ul>
<li><p>제로 패딩 적용</p>
<ul>
<li><p>차원 일관성 유지 목적</p>
<ul>
<li>요소별 덧셈을 하기 위해서는 두 벡터(또는 행렬)의 크기가 완전히 같아야 함<ul>
<li>보통 <strong>임베딩 벡터 길이 &lt; 시계열 길이</strong> 이므로 남는 길이는 0으로 채움
⇒ 즉, 정보는 왜곡하지 않으면서 형태만 맞춘다</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>요소별 덧셈(element-wise addition) 사용</p>
<ul>
<li>같은 위치의 값을 더한다
⇒ <strong>임베딩과 전처리된 시계열 데이터 결합</strong></li>
</ul>
<blockquote>
<p><strong>✓ 임베딩과 전처리된 시계열 데이터의 결합</strong></p>
</blockquote>
<ul>
<li><strong>시계열 임베딩(Global)</strong><ul>
<li>텍스트 임베딩으로 얻은 벡터로, 전체 시계열의 전반적인 패턴 요약</li>
</ul>
</li>
<li><strong>전처리된 시계열(local)</strong><ul>
<li>정규화 및 패딩만 거친 시계열로 시간 별 세부 변화, 로컬 패턴
⇒ <strong>(P)이 둘의 형태가 다르기 때문에 (S)제로패딩!</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>요소별 덧셈은 ResNet의 Shortcut과 일맥상통하는 아이디어!</p>
<ul>
<li>ResNet에서 깊은층이 입력을 뭉그러뜨릴 수 있는 것처럼 LETS-C에서는 임베딩이 원본시계열을 뭉그러뜨릴 수 있음</li>
<li>때문에, <strong>임베딩 정보를 쓰되, 원본 시계열 기준으로 보정만 하자!</strong></li>
</ul>
</li>
<li><ul>
<li>⇒ fused = raw time seires + embedding**</li>
</ul>
<blockquote>
<p><strong>✓ ResNet의 Shortcut?</strong>
<img src="https://velog.velcdn.com/images/hyooo__s/post/8604da74-c0fe-43d3-8ecf-8bc94520fdb5/image.png" alt=""></p>
</blockquote>
<ul>
<li>이전 딥러닝에서는 층을 많이 쌓으면 더 똑똑하겠지?라는 믿음으로 CNN을 점점 더 깊게 만듦</li>
<li>그런데 20층 모델보다 50층의 모델이 더 성능이 나쁜것임!
과적합도 아니고 데이터 부족도 아니었음
⇒ <strong>성능열화문제(degradation problem)</strong></li>
</ul>
<blockquote>
<p>예를 들어, 입력이 고양이 → 출력도 고양이가 나와야함</p>
<pre><code>**(P)** 층을 거치면서 변형이 너무 많아지면 &quot;고양이였다&quot;는 정보 자체가 사라질 수 있음</code></pre><p> <strong>(S)</strong> 어떤 층은 아무 일도 안하는게 최선이라면? 
 → <strong>출력 = 원래 + 바뀐 것</strong> (즉, 차<strong>이(residual)</strong>을 배우게 하자!)
 <img src="https://velog.velcdn.com/images/hyooo__s/post/55da0271-7906-4c02-901b-10dee011c84e/image.png" alt=""></p>
</blockquote>
<ul>
<li><strong>x: 원본입력</strong>
⭐ 절대로 잃으면 안되는 정보!<ul>
<li>F(x): 여러 층을 거쳐 계산한 결과
ex. 귀 강조, 털 질감 등<ul>
<li>원본을 보완하기 위해 학습된 변화로, 만일 어떤층이 쓸모가 없다면 F(x)=0 즉, y=x로 학습하도록 함
⇒ <strong>층을 쌓더라도 최소한 손해를 보지 않음!</strong>
⇒ ResNet의 핵심은 학습된 표현이 원본 입력을 대체하지 못하게 하고 <strong>원본 입력을 항상 기준으로!</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>서로 다른 모달리티 임베딩 결합</p>
<ul>
<li>시계열, 텍스트 임베딩은 서로 다른 종류의 정보</li>
<li>멀모에서 흔한 결합 방식으로는 concat, attention, element-wise addition이 있는데 그중 덧셈이 가장 단순하고 파라미터 증가가 없는 안정적인 방법이었음<h3 id="lightweight-classification-head">Lightweight Classification Head</h3>
</li>
</ul>
</li>
<li><p>위에서 결합한 시계열 표현이 <strong>1차원 CNN</strong>과 <strong>MLP로 구성된 분류 헤드</strong>와 결합</p>
</li>
</ul>
<ul>
<li><p>CNN 출력 → <strong>평탄화</strong> → *<em>MLP(softmax) *</em>→ 시계열 클래스 확률 벡터 출력</p>
<p>⇒ 단순 분류 헤드를 사용함으로써 transformer 기반 기존의 SOTA보다 훨씬 적은 학습 파라미터 사용</p>
</li>
</ul>
<blockquote>
<p>✓ <strong>주의</strong>: CNN은 특징추출기이고, CNN 뒤의 MLP와 softmax가 분류기!</p>
</blockquote>
<blockquote>
<p>✓ <strong>텍스트 임베딩을 통해 이미 특징을 다 뽑아 온거 아닌가? 왜 CNN이 필요한가?</strong></p>
</blockquote>
<ul>
<li>텍스트 임베딩 모델은<ul>
<li>입력을 고정된 벡터로 매핑, 비슷한 패턴을 가깝게 배치까지는 해줌</li>
<li>하지만 <strong>어떤 방향이 클래스 경계인지, 어떤 조합이 최적의 분리인지는 알려주지 않음</strong>
⇒ 즉 임베딩 = feature space, CNN = dicision boundary learner</li>
</ul>
</li>
<li>CNN은 지역적 패턴을 다시 추출해서 데이터셋의 specific한 특징을 강조하고 노이즈를 걸러내는 역할<ul>
<li>특징을 또 뽑는다기보단, 특징을 재구성한다는 표현이 더 맞음<ul>
<li>local 패턴 강조<ul>
<li>embedding이 준 global 정보와 raw가 준 local 정보를 조합하여 어떤 조합이 클래스 구분에 중요한가를 학습! </li>
<li><strong>단순 MLP만 사용할 경우 완전 연결이므로 시간 구조를 직접적으로 활용하지 못함</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>✓ 시계열 CNN</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/d6e014f6-8439-4124-8545-a8bc4415e2e2/image.png" alt=""></p>
</blockquote>
<blockquote>
<p><strong>✓ 최종 흐름</strong>
<img src="https://velog.velcdn.com/images/hyooo__s/post/a0393b27-df38-464f-98c8-36cdc3a87c80/image.png" alt=""></p>
</blockquote>
<hr>
<h2 id="4-experimental-protocol-and-details">4. Experimental Protocol and Details</h2>
<h3 id="datasets-and-evaluation-metrics">Datasets and Evaluation Metrics</h3>
<ul>
<li><p>벤치마크 기준으로 평가</p>
</li>
<li><p>데이터셋</p>
<ul>
<li>Ethanol Concentration, Face Detection, Handwriting, Heartbeat, Japanese Vowels, PEMS-SF, SelfRegulationSCP1, SelfRegulationSCP2, Spoken Arabic Digits, UWaveGestureLibrary</li>
</ul>
</li>
<li><p>변수 차원: 3~963</p>
</li>
<li><p>시계열 길이: 최대 1751</p>
</li>
<li><p>클래스 수: 최대 26개</p>
</li>
<li><p>평가지표: AvgWins</p>
<ul>
<li>우수한 성능 평균 횟수(동률포함), 학습가능파라미터 수 기준으로 계산 효율성<h3 id="baselines">Baselines</h3>
</li>
</ul>
</li>
<li><p>27개의 베이스 라인 모델</p>
<ul>
<li><p>전통적</p>
<ul>
<li>Dynamic Time Warping(DTW), eXtreme Gradient Boosting(XGBoost), RandOm Convolutional KErnel Transform(ROCKET)</li>
</ul>
</li>
<li><p>MLP기반</p>
<ul>
<li>DLinear</li>
</ul>
</li>
<li><p>RNN기반</p>
<ul>
<li>LSTM, LSTNet, 그리고 Linear State Space Layer(LSSL)</li>
</ul>
</li>
<li><p>CNN기반</p>
<ul>
<li><p>Temporal Convolutional Network(TCN), TimesNet</p>
</li>
<li><p>) 비지도 T-Loss, Temporal Neighborhood Coding(TNC), TS2Vec</p>
</li>
</ul>
</li>
<li><p>Transformer기반</p>
<ul>
<li><p>Transformer, Reformer, Informer, Pyraformer, Autoformer, Non-stationary Transformer, FEDformer, ETSformer, Flowformer, PatchTST</p>
</li>
<li><p>) 비지도 TS-TCC, Time Series Transformer(TST), MOMENT</p>
</li>
</ul>
</li>
<li><p>LLM기반</p>
<ul>
<li>OneFitsAll</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="5-results-and-analysis">5. Results and Analysis</h2>
<h3 id="51-performance-and-efficiency">5.1 Performance and Efficiency</h3>
<h4 id="comparison-to-state-of-the-art">Comparison to State of the art</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/0aa160fb-1251-4358-b448-73f7a90a84ef/image.png" alt=""></p>
<ul>
<li><p>27개의 베이스 라인 모델과 비교했을 때 LETS-C 모든 데이터셋에서 강건한 성능</p>
</li>
<li><p>기존 SOTA 대비 경쟁력 있다~</p>
<h4 id="computational-efficiency">Computational Efficiency</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c070b9a1-752d-4548-845d-b1e1bf92d813/image.png" alt=""></p>
</li>
<li><p>자원이 제한된 환경에서 성능과 계산 효율성 간의 균형 평가</p>
</li>
<li><p>OneFitsAII대비 평균적으로 14.48%정도의 학습가능파라미터만으로도 좋은 성능</p>
<ul>
<li>OneFitsAII은 TimesNet이나 FEDformer와 같은 주요 모델 대비 파라미터 수가 적다는 장점이 있는 모델임</li>
</ul>
</li>
<li><p>LETS-C는 텍스트 임베딩 계산이 딱 1번 수행된다는 점이 중요!</p>
<ul>
<li>OneFitsAII같은 모델은 부분 동결 LLM을 파인튜닝하는 과정에서 지속적으로 계산 발생<h3 id="52-effectiveness-of-lets-c">5.2 Effectiveness of LETS-C<img src="https://velog.velcdn.com/images/hyooo__s/post/ac3780fc-4a33-4e44-8b0d-f430f4e6d775/image.png" alt=""></h3>
</li>
</ul>
</li>
<li><p>텍스트 임베딩이 시계열 분류에 적절한지 검증</p>
<ul>
<li>동일 클래스 내의 시계열 쌍과 서로 다른 클래스 간의 시계열 쌍에 대해 평균 코사인 유사도 계산</li>
</ul>
</li>
<li><p>히트맵: 빨간색 - 유사도 높고, 파란색 - 유사도 낮음</p>
<ul>
<li>클래스 내부 유사도가 클래스 간 유사도보다 일관되게 높게 나타남<h4 id="generalization-across-various-text-embedding-models">Generalization Across Various Text Embedding Models</h4>
</li>
</ul>
</li>
<li><p>text-embedding-3-large이외의 다양한 텍스트 임베딩 모델에 대한 일반화 성능 평가<img src="https://velog.velcdn.com/images/hyooo__s/post/885ae250-e2eb-4990-9d77-e651bcef4f8d/image.png" alt=""></p>
<ul>
<li><p>e5-mistral-7b-instruct, gte-large-en-v1.5, nomic-embed-text-v 모델 추가 적용</p>
</li>
<li><p>다양한 텍스트 임베딩 모델 전반에서도 우수한 성능</p>
<h4 id="optimizing-model-size-with-minimal-accuracy-loss">Optimizing Model Size with Minimal Accuracy Loss</h4>
</li>
</ul>
</li>
<li><p>모델 정확도와 모델 크기 간의 trade-off 분석</p>
<ul>
<li>분류 헤드의 선형 계층 및 합성곱 계층 수를 1개~5개까지 조절</li>
</ul>
</li>
<li><p>trade-off가 데이터셋에 따라 다소 차이가 있으나 전반적으로 파라미터수를 줄여도 정확도 크게 안변함</p>
<h3 id="53-additional-analysis">5.3 Additional Analysis</h3>
<h4 id="ablation-study">Ablation Study</h4>
</li>
<li><p>텍스트 임베딩 + 시계열 데이터 결합이 단일 모달리티보다 어떤 이점을 갖는지 검증</p>
<h4 id="alternative-methods-for-fusing-time-series-with-embeddings">Alternative Methods for Fusing Time Series with Embeddings</h4>
</li>
<li><p>단순 덧셈 외, 시계열과 임베딩을 결합하기 위한 2가지 추가적인 방법 검증</p>
<ul>
<li>임베딩 → 합성곱 계층, 시계열 데이터 → 완전연결계층으로 처리한 뒤
두 분기의 특징을 하나의 최종 밀집 네트워크에서 결합</li>
<li>시계열과 임베딩 concat한 후, 경량 분류 헤드를 통해 처리</li>
<li>교차 어텐션은 계산복잡도가 커서 안했음</li>
</ul>
</li>
<li><p>본 연구의 목표는 경량모델개발이므로 보다 단순한 파라미터 구조의 덧셈 방식 최종 채택</p>
</li>
</ul>
<hr>
<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li>기성 텍스트 임베딩을 시계열 분석, 특히 분류 과제에 적용한 최초의 연구</li>
<li>시계열 데이터를 텍스트 임베딩 모델을 통해 투영하고 단순하지만 효과적인 분류 헤드를 사용함으로써 SOTA달성</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Modern TCN : A Modern Temporal Convolutional Network for Time Series Forecasting]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Modern-TCN-A-Modern-Temporal-Convolutional-Network-for-Time-Series-Forecasting</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Modern-TCN-A-Modern-Temporal-Convolutional-Network-for-Time-Series-Forecasting</guid>
            <pubDate>Wed, 18 Feb 2026 06:05:00 GMT</pubDate>
            <description><![CDATA[<h2 id="overview"><strong>Overview</strong></h2>
<blockquote>
<ul>
<li><strong>논문명:</strong> ModernTCN: A Modern Temporal Convolutional Network for Time Series Forecasting</li>
</ul>
</blockquote>
<ul>
<li><strong>학회(출판연도):</strong> ICLR(2024)</li>
<li><strong>연구분야:</strong> 머신러닝, 시계열 예측, 시퀀스 모델 아키텍쳐 설계</li>
</ul>
<hr>
<h2 id="abstract">Abstract</h2>
<p>최근 Transformer 또는 MLP 기반 모델이 시계열 분석에 주도권을 가지고 있으나, 전통적인 TCN을 현대화함으로써 더 나은 효율성과 성능을 증명</p>
<blockquote>
<p><strong>✓ 설명을 덧붙이자면</strong> </p>
</blockquote>
<ul>
<li>2018년~2022년동안 시계열 분야는 LSTM → Transformer → 더 복잡한 Transformer 변형과 같이 발전</li>
<li>하지만 Transformer가 NLP에서 성공했을지라도 시계열은 NLP와 분명히 다르기 때문에 Transformer가 항상 최적은 아닐 수 있다.</li>
<li>*[참고]**
&lt;NLP의 경우&gt; ① 데이터가 많고 ② 문맥이 복잡하며 ③ 문장 길이가 제한되어 있다
↔ &lt;시계열&gt;은 ① 데이터가 적고 ② 패턴이 반복적이며 ③ 수 천~수 만 길이 가능</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<h3 id="시계열-예측">시계열 예측</h3>
<blockquote>
<p>** ✓ 시계열 예측이란?**</p>
</blockquote>
<ul>
<li>과거 데이터를 기반으로 미래 값을 예측하는 문제
X_{t-L:t} → X_{t+1:t+H}</li>
<li>시계열 예측은 시간 순서가 절대적이고, 패턴이 고정되어 있지 않으며, 계절성 및 추세, 잡음이 많기 때문에 쉽지 않음</li>
</ul>
<blockquote>
<p>** ✓ TCN은 무엇인가?**</p>
</blockquote>
<ul>
<li>TCN은 시계열 데이터를 처리하기 위해 설계된 1차원 합성곱(1D Conv)기반 시퀀스 모델
즉, <strong>단순 CNN이 아님!</strong></li>
<li>RNN → LSTM/GRU → Transformer → (다시) Convolution <ul>
<li>RNN의 경우 병렬화의 어려움과 기울기 소실 문제가 있고,</li>
<li>Transformer의 경우에는 메모리를 많이 사용하고 작은 데이터셋에서는 과적합 등의 문제로 인해 다시 Convolution으로 흐름이 변하고 있는 추세</li>
</ul>
</li>
</ul>
<blockquote>
<p>** ✓ TCN의 3가지 핵심구조**</p>
</blockquote>
<ul>
<li><strong>인과적 합성곱(Causal Convolution)</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/f6a99eab-b395-4315-9be7-c408106051d5/image.png" alt="">    <ul>
<li>출력 y_t는 현재와 과거만 연결, 미래는 연결X (시계열 예측에서는 미래 정보를 보면 안되기 때문</li>
</ul>
</li>
<li><strong>확장 합성곱(Dilated Convolution)</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/ae9d2e2e-cf6e-429b-85bc-fd5a843eebdf/image.png" alt=""><ul>
<li>커널 사이에 dilation(간격)을 둬서 긴 과거 정보(long-range dependecy)를 적은 층으로 커버</li>
<li>dilation을 1,2,4,8식으로 늘리는데 커널 간격을 띄어서 과거를 샘플링하는 방식</li>
<li>레이어 수는 줄이고 계산량은 거의 유지할 수 있다는 장점</li>
</ul>
</li>
<li><strong>Residual Connection</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/8a84b800-6d1d-45c6-9bb4-7747f2ef48d6/image.png" alt=""><ul>
<li>깊어질수록 gradient 소실 문제 발생</li>
<li>Resnet스타일의 구조를 활용하여 깊은 네트워크에서도 학습 안정성 확보<ul>
<li>y=x+TCNBlock(x)</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>결측치 예측, 행동 예측, 이상치 탐지 등 많은 활동이 가능함</p>
</li>
<li><p>Transformer기반 방법, MLP기반 모델이 특히 두드러짐    </p>
<ul>
<li>2010년대: TCN과 그 변형들이 많이 사용됨</li>
<li>2020년대: Transformer기반, TCN기반 모델들이 몇 년 사이에 등장해서 안정적인 성능 가능</li>
</ul>
</li>
</ul>
<h3 id="erf문제">ERF문제</h3>
<blockquote>
<h4 id="✓-erf란">✓ ERF란?</h4>
</blockquote>
<ul>
<li><p>모델의 출력 하나가 실제로 얼마나 넓은 입력 범위의 정보에 영향을 받는지</p>
</li>
<li><p>실제로는 학습과 추론에서 의미이쎅 기여하는 범위를 의미</p>
</li>
<li><p>입력시계열의 더 넓은 범위의 데이터를 사용하여 각 출력 지점의 정보 계산</p>
</li>
<li><p><strong>전통적 TCN의 경우</strong>
: 이론상 reception field는 커질 수 있지만, 실제 ERF는 <strong>중앙에 집중</strong>되고 멀어질수록 영향이 급격히 줄어드는 경우가 많음</p>
</li>
<li><p>** Transformer/MLP기반 모델의 경우**
: <strong>전역적인 ERF</strong>를 가짐으로써 먼 시점의 정보도 출력에 실질적인 영향을 줌
⇒ 제한된 ERF로 합성곱 기반 모델이 약세</p>
</li>
</ul>
<h3 id="modorn-tcn의-등장">Modorn TCN의 등장</h3>
<ul>
<li>Transformer 블록과 유사한 구조</li>
<li>ERF를 효과적으로 증가시킬 수 있는 대형 커널 주로 사용</li>
<li>현재 기준에서 성능이 그다지 높지 않지만, 합성곱이 변수간 의존성도 포착 가능</li>
<li>장단기예측, 결측값 보간, 분류, 이상탐지를 포함한 5가지 주요 시계열 분석 과제로 평가
→ 우수한 성능
<img src="https://velog.velcdn.com/images/hyooo__s/post/0a1799d1-d0f9-4010-bfbb-2b1b0e6a28c5/image.png" alt=""><img src="https://velog.velcdn.com/images/hyooo__s/post/e00b4030-a23d-4f2f-8239-860872417e0f/image.png" alt=""> ✓ 색이 진할수록 해당 시점 출력에 더 큰 영향을 미친다는 의미
⇒ 깊게 쌓기, 복잡한 구조, 멀티 브랜치가 아닌 <strong>큰 커널을 사용한 현대적 conv</strong>를 사용하자!
⇒ 합성곱이 시계열에서 밀린 이유는 구조가 낡았기 때문이지 합성곱 자체가 약해서가 아니다</li>
</ul>
<hr>
<h2 id="2-related-work">2. Related work</h2>
<h3 id="21-convolution-in-time-series-analysis">2.1 Convolution In Time Series Analysis</h3>
<h4 id="1-micn">1. MICN</h4>
<ul>
<li><p>인과적 합성곱뿐만 아니라 다중 스케일 합성곱 구조 제안</p>
<ul>
<li>시계열에서 국소적 특징과 전역적 상관관계를 결합하기 위함</li>
</ul>
</li>
</ul>
<h4 id="2-scinet">2. SCINet</h4>
<ul>
<li><strong>재귀적인 다운 샘플 - 합성곱 - 상호작용</strong> 구조 도입</li>
</ul>
<h4 id="한계">[한계]</h4>
<p>제한된 ERF로 인해 장기 의존성을 모델링하는데에 어려움</p>
<h4 id="3-timesnet">3. TimesNet</h4>
<ul>
<li><strong>1차원 합성곱을 사용하는 다른 모델과 달리</strong>
1차원 시계열을 2차원 변형으로 변환한 뒤, CV에서 사용되는 <strong>2D 합성곱 백본을 활용</strong>해서 정보성 높은 표현을 얻음</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/aaf550e7-fe7e-4a8e-aea8-31bda6052534/image.png" alt=""><img src="https://velog.velcdn.com/images/hyooo__s/post/a55270fa-5905-4b29-896c-06580d6fc839/image.png" alt=""></p>
<p>⇒ Transformer가 강한 이유는 attention이 아닌 <strong>블록설계</strong>에 있다.
때문에, Modern TCN은 ① Transformer block 구조 차용, ② attention 제거, ③ 큰 커널의 Conv로 ERF를 확보하고, ConvFFN으로 변수간 의존성 처리</p>
<h3 id="22-modern-convolution-in-computer-vision">2.2 Modern Convolution in Computer Vision</h3>
<h4 id="1-convnext">1. ConvNeXt</h4>
<p>: ConvNet → ViT → Modern Conv(ConvNeXt)</p>
<ul>
<li>20년대에 들어오면서 ViT가 제안되며 ConvNet을 능가</li>
<li>이를 따라 잡기 위해 Modern Conv가 도입되었고, ConvNeXt는 합성곱 블록을 <strong>Transformer 블록과 유사하게 설계</strong></li>
</ul>
<h4 id="2-replnet">2. RepLNet</h4>
<ul>
<li><p><strong>구조적 재파라미터화 기법</strong>으로 커널 크기를 31x31로 확장</p>
<ul>
<li>Transformer의 전역 ERF에 더 가까워지기 위함</li>
</ul>
</li>
</ul>
<h4 id="3-slak">3. SLak</h4>
<ul>
<li>큰 커널을 2개의 직사각형 <strong>병렬 커널로 분해</strong><ul>
<li>동적 희소성 사용
→ 커널 크기 51x51로 확장</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-modern-tcn">3. Modern TCN</h2>
<h3 id="31-modernize-the-1d-conv-block">3.1 Modernize The 1D Conv Block</h3>
<h4 id="1d-합성곱-블록의-재설계">[1D 합성곱 블록의 재설계]</h4>
<ul>
<li><p>DWConv</p>
<ul>
<li>각 feature별로 토큰들 사이의 시간적 정보 학습</li>
<li>Transformer의 self-attention 모듈과 동일한 역할</li>
</ul>
</li>
<li><p>ConvFFN</p>
<ul>
<li><p>Transformer의 FFN 모듈과 유사</p>
</li>
<li><p>2개의 PWConv로 구성</p>
</li>
<li><p>ConvFFN블록의 hidden 채널수가 입력 채널보다 r배 더 큰 inverted bottleneck 구조 채택</p>
<blockquote>
<h4 id="✓-inverted-bottleneck-역병목-구조">✓ inverted bottleneck (역병목 구조)</h4>
<p>: 입력과 출력 차원을 중간층(Hidden layer)의 차원을 훨씬 크게(r배) 가져가는 구조
즉, 채널을 <strong>먼저 확장</strong>하고 연산한 후 <strong>다시 줄이는 구조</strong>
↔ <strong>[병목구조]</strong>: 중간채널을 줄였다가 다시 <strong>늘리는 구조</strong><img src="https://velog.velcdn.com/images/hyooo__s/post/0193e709-eec8-4101-af8c-ee0f566757b9/image.png" alt="">→ 더 적은 파라미터로도 효율적으로 깊은 특징을 학습할 수 있음</p>
</blockquote>
<blockquote>
<h4 id="참고">[참고]</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ff526d41-5a8d-46d5-ae08-ea348b59cc5a/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p>⇒ 이러한 설계는 시간정보와 feature 정보의 혼합을 분리함</p>
<p>⇒ 즉, DWConv와 ConvFFN은 각각 시간 차원 또는 feature 차원 중 하나에서만 정보를 혼합하고, 이는 <strong>두 차원을 동시에 섞는 전통적인 합성곱과 다름!</strong></p>
<h4 id="한계-1">[한계]</h4>
<ul>
<li><p>시계열의 특성을 고려하지 못함</p>
<ul>
<li>시계열은 feature, 시간 차원 이외에도 <strong>변수 차원</strong>이 존재</li>
<li>하지만 그림2(b)와 같이 설계된 합성곱 블록을 쌓은 백본은 변수 차원을 제대로 처리하지 못함</li>
</ul>
</li>
</ul>
<h3 id="32-time-series-related-modifications">3.2 Time Series related modifications</h3>
<h4 id="cv">[CV]</h4>
<ul>
<li>백본 이전에 각 픽셀의 3채널(RGB) 특징을 embedding layer을 통해 D차원 벡터로 임베딩하여 RGB채널 정보를 혼합</li>
</ul>
<h4 id="한계-2">[한계]</h4>
<ul>
<li><p>유사한 변수 혼합(각 시점에서 m개의 변수를 단순히 d차원 벡터로 임베딩하는 방식)은 시계여에는 적합하지 않음</p>
</li>
<li><p>시계열의 변수들 간의 차이는 RGB 채널간 차이보다 훨씬 크기 때문</p>
<ul>
<li>단순한 임베딩 레이어만으로 변수간 복잡한 의존성을 학습할 수 없고,
서로 다른 행동 특성을 고려하지 못해서 변수의 독립적인 특성마저 잃게 될 수 있음</li>
</ul>
</li>
<li><p>이러한 임베딩 설계는 변수 차원을 제거하게 되어 이후 변수간 의존성을 연구할 수 없음</p>
</li>
</ul>
<h4 id="1-patchify-variable-independent-embedding-패치화-변수-독립-임베딩">1. Patchify Variable-independent Embedding (패치화 변수 독립 임베딩)</h4>
<ul>
<li>입력: 길이 L을 갖는 M개의 변수의 입력 시계열</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/2204ba5c-6022-4f47-a81c-ee61ca08c221/image.png" alt=""></p>
<ul>
<li>적절한 패딩 후 이를 patch 크기P의 N개의 패치로 나눔</li>
</ul>
<pre><code>- 패칭 과정의 stride = S (연속된 두 패치의 비중첩 길이)
- 즉 시간 축을 길이가 P짜리 덩어리로 나눈다.
     ![](https://velog.velcdn.com/images/hyooo__s/post/4fb03f07-9349-4563-9aee-e41a62160492/image.png)</code></pre><ul>
<li><p>이후 패치들은 D차원 임베딩 벡터로 변환
  <img src="https://velog.velcdn.com/images/hyooo__s/post/7ea8e8c1-d645-4bcb-899f-d79bc67a38b1/image.png" alt=""></p>
<ul>
<li><p>입력 임베딩
  <img src="https://velog.velcdn.com/images/hyooo__s/post/923e7610-ef45-4c60-935d-0e682be6c460/image.png" alt=""></p>
<ul>
<li>m: 변수 개수(채널, 센서수)<ul>
<li>d: 임베딩 차원(feature 차원)</li>
<li>n: 패치 개수(시간 토큰 수)</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>L이 아니라 N으로 Patchify<blockquote>
<h4 id="✓-왜-m-x-d-x-n-이어야-하는가">✓ 왜 M x D x N 이어야 하는가?</h4>
<ul>
<li><strong>M이 가장 먼저 있는 이유</strong>
: 변수는 처음부터 섞으면 안된다.
→ 각 변수는 독립적으로 patchify 및 embedding</li>
<li><strong>D가 있어야 하는 이유</strong>
: 이 패치를 어떠한 관점으로 볼 것인가?
상승하강, 주기성, 변화량 등을 담는 표현 공간임</li>
<li><strong>마지막에 N인 이유</strong>
: 시간축으로 Conv해야함
즉, N이 새로운 time axis</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>구현을 단순화하기 위해 본 논문에서는</p>
<ul>
<li><p>Patchify embedding을 <strong>완전 합성곱 방식</strong> 채택</p>
<ul>
<li>X in shape를 M x 1 x L로 확장한 뒤,
커널 크기 P, Stride를 S를 갖는 1D Conv layer에 입력</li>
<li>이 Stem layer는 입력 1채널을 D개의 출력 채널로 매핑 <strong>(시간축만 압축)</strong></li>
<li>단 M개의 단변량 시계열은 <strong>서로 독립적으로</strong> 임베딩 
→ 변수 차원 유지 가능  </li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2-dwconv-시간">2. DWConv (시간)</h4>
<ul>
<li><p>채널A, 채널 B가 서로 정보를 주고 받지 않고, 채널 A 내부에서만 과거 시점들을 컨볼루션으로 시간적으로 혼합한다는 뜻</p>
</li>
<li><p>원래 시간 정보를 학습하도록 설계됨</p>
<ul>
<li>DWConv만으로 시간 간, 변수 간 의존성을 동시에 학습하는 것은 어렵기 때문에, DWConv가 변수 차원 정보 혼합까지 담당하도록 하는 것은 부적절<ul>
<li>기존의 feature 독립 DWConv를 feature와 변수 모두에 대해 독립적인 형태로 수정
⇒ 각 단변량이 사간적 의존성을 독립적으로 학습하도록!</li>
</ul>
</li>
</ul>
</li>
<li><p>DWConv에 큰 커널을 사용</p>
<ul>
<li>ERF 확장 및 시간 모델링 능력 향상</li>
</ul>
</li>
</ul>
<h4 id="3-convffn-특징">3. ConvFFN (특징)</h4>
<ul>
<li><p>각 토큰의 새로운 <strong>특징 표현을 학습</strong></p>
</li>
<li><p>DWConv가 feature 및 변수가 독립적이므로 이를 보완하기 위해 feature 및 변수를 혼합해야함!</p>
</li>
<li><p>단일 ConvFFN으로 feature과 변수간의 의존성을 학습하는데에는 무리
⇒ PWConv를 grouped PWConv로 대체해서 서로 다른 group수를 설정</p>
</li>
<li><p>즉 단일 ConvFFN을 ConvFFN1, ConvFFN2로 추가 분리</p>
<ul>
<li>ConvFFN1: 변수별 새로운 <strong>feature</strong> 표현학습</li>
<li>ConvFFN2: feature별 <strong>변수 간</strong> 의존성 포착</li>
</ul>
</li>
</ul>
<h4 id="위-3개의-수정을-거쳐-최종-modern-tcn-블록-완성">위 3개의 수정을 거쳐 최종 Modern TCN 블록 완성</h4>
<h3 id="33-overall-structure">3.3 Overall Structure</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b16a3520-318c-48f9-ac61-775e50f1e11e/image.png" alt=""></p>
<hr>
<h2 id="4-experiments">4. Experiments</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/d97a09c8-3ff3-4ca0-9eef-28644f490570/image.png" alt="">Modern TCN 좋다~</p>
<hr>
<h2 id="5-model-analysis">5. Model Analysis</h2>
<p>커널 크기 늘리는 것이 ERF 에 좋았다~</p>
<hr>
<h2 id="6-conclusion-and-future-work">6. Conclusion And Future Work</h2>
<p>시계열 분석에 있어서 컨볼루션 기반도 좋다~
향후 더 긴 시퀀스, 다양한 도메인에서의 일반화 및 모델 경량화, 추론 최적화같은 방향 확장이 과제</p>
]]></description>
        </item>
    </channel>
</rss>