<?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>Fri, 11 Sep 2026 01:16:02 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[[논문리뷰] Retrieval-Augmented Generation for
Knowledge-Intensive NLP Tasks]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Retrieval-Augmented-Generation-forKnowledge-Intensive-NLP-Tasks</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Retrieval-Augmented-Generation-forKnowledge-Intensive-NLP-Tasks</guid>
            <pubDate>Fri, 11 Sep 2026 01:16:02 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
<strong>학회(출판연도)</strong>: NeurIPS 2020
<strong>연구분야</strong>: NLP, Retrieval-Augmented Generation (RAG), Information Retrieval, Knowledge-Intensive NLP</p>
</blockquote>
<p><strong>발표자료</strong>: <a href="https://canva.link/uqltbnklfi451am">https://canva.link/uqltbnklfi451am</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via
Reinforcement Learning]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DeepSeek-R1-Incentivizing-Reasoning-Capability-in-LLMs-viaReinforcement-Learning</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-DeepSeek-R1-Incentivizing-Reasoning-Capability-in-LLMs-viaReinforcement-Learning</guid>
            <pubDate>Fri, 11 Sep 2026 01:13:36 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
<strong>학회(출판연도)</strong>: arXiv, Nature (2025)
<strong>연구분야</strong>: LLM, Reasoning, Reinforcement Learning, Chain-of-Thought, Large Language Models</p>
</blockquote>
<p><strong>발표 자료</strong>: <a href="https://canva.link/5illk8xhlgr7kh4">https://canva.link/5illk8xhlgr7kh4</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] SimCSE: Simple Contrastive Learning of Sentence ]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-SimCSE-Simple-Contrastive-Learning-of-Sentence</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-SimCSE-Simple-Contrastive-Learning-of-Sentence</guid>
            <pubDate>Thu, 06 Aug 2026 04:32:09 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: SimCSE: Simple Contrastive Learning of Sentence Embeddings
<strong>학회(출판연도)</strong>: EMNLP 2021
<strong>연구분야:</strong> NLP, Sentence Embedding, Contrastive Learning, Representation Learning</p>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li><p>SimCSE(Simple Contrastive Sentence Embedding)이라는 새로운 문장 임베딩 학습 방법 제안</p>
<ul>
<li>당시 최고 수준의 Sentence Embedding 성능을 크게 향상 시킴</li>
</ul>
</li>
<li><p>비지도 학습</p>
<ul>
<li><p>입력 문장을 받아서 <strong>대조학습 목적 함수 안에서 자기 자신을 예측</strong>하고 일반적인 <strong>Dropout</strong>만을 노이즈로 사용함</p>
<p>⇒ 이 방법은 기존의 지도학습 기반 방법들과 동등한 성능을 보임!!</p>
</li>
</ul>
</li>
<li><p>본 연구에서 Dropout이 <strong>최소한의 데이터 증강 역할</strong>을 하고, 이를 제거하면 표현이 붕괴되는 현상이 발생된다는 것을 발견함</p>
</li>
<li><p>NLI(자연어 추론) 데이터세트의 라벨이 달린 문장쌍을 활용한 지도학습 버전도 제안</p>
<ul>
<li>Entailment쌍 → Positive Pair</li>
<li>Contradiction쌍 → Hard Negative pair로 사용</li>
</ul>
</li>
<li><p>SimCSE를 표준 의미적 유사도(STS) 과제에서 평가하였고, BERT-base를 사용한 비지도 모델과 지도 모델은 각각 평균 76.3%와 81.6%의 Spearman 상관계수 달성</p>
<p>  ⇒ Contrastive Learning은 BERT 임베딩 공간이 특정 방향으로 몰려 있는 비등방성 문제를 완화하여 임베딩을 더 균등하게 분포시키고,
  지도학습에서는 의미가 같은 문장들을 더욱 가깝게 하여 배치한다는 사실도 확인함</p>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>범용적인 문장 임베딩(universal sentence embedding)을 학습하는 것은 자연어 처리에 있어서 핵심 연구 주제이고, 지금까지 많은 연구가 이루어져 왔음</p>
<p>  → 본 논문에서는 BERT나 RoBERTa와 Contrastive Learning(대조학습)을 결합하면 Sentence Embedding 성능을 크게 향상시킬 수 있음을 보여줌</p>
<ul>
<li>또한, 이 방법은 비지도, 지도 데이터 모두에서 사용할 수 있고 두 경우 모두 뛰어는 Sentence Embedding을 학습할 수 있는 프레임워크임</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5fb903fb-94c6-4c18-b6e8-54ecf77592ad/image.png" alt=""></p>
<h3 id="unsupervised-simcse">Unsupervised SimCSE</h3>
<ul>
<li><p>Dropout만을 노이즈로 사용하여 입력 문장 자기 자신을 예측함</p>
<ul>
<li><p>즉, 같은 문장을 2번 입력하고, Dropout도 2번 적용하여 서로 다른  임베딩을 얻고 이 차이만 이용해서 대조학습을 수행한다는 것</p>
<p>  → Positive Pair로 사용</p>
</li>
<li><p>그리고 같은 미니배치 안의 문장들은 Negative로 사용하여, 여러 Negative 중에서 Positive를 맞추도록 학습</p>
</li>
</ul>
</li>
<li><p>이 방법은 단순해보이지만, 다음 문장 예측, 단어 삭제, 단어 교체와 같은 기존 학습 방법보다 큰 폭으로 더 좋은 성능을 보이고, 심지어 기존 지도학습과 맞먹는 성능을 냄</p>
<ul>
<li>Dropout이 hidden Representation에 대한 최소한의 데이터 증강 역할을 하고, 이를 제거하면 모든 문장이 비슷해지는 Representation Collapse가 발생함을 확인</li>
</ul>
</li>
</ul>
<h4 id="supervised-simcse">Supervised SimCSE</h4>
<ul>
<li>최근 Sentence Embedding에서 성공적으로 사용된 NLI 데이터세트를 기반으로 라벨이 있는 문장쌍을 대조학습에 포함시킴<ul>
<li>기존 연구들은 Entailment, Neutral, Contradiction 3개의 클래스를 분류하는 문제로 다루었음 
↔ 본 연구는 Entailment Pair가 Positive Sample로 사용될 수 있음을 활용함<ul>
<li>또한, 대응되는 Contradiction Pair를 <strong>Hard Negative</strong>로 추가하면 성능이 더욱 향상됨을 발견</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>또한, 우리는 SimCSE가 왜 뛰어난 성능을 보이는지 확인하기 위해 Wang&amp;Isola가 제안한 평가 기준을 차용함.</p>
<p>→ 의미적으로 연결되어 있는 ① <strong>Positive Pair가 얼마나 잘 모여있는지(Alignment)</strong>와 ② <strong>전체 임베딩 공간이 얼마나 균등하게 퍼져 있는지(Uniformity)</strong>를 함께 측정하여 임베딩 품질을 평가함</p>
<p><strong>⇒ [분석 결과]</strong></p>
<ul>
<li>NLI 학습 신호는 Positive Pair 사이의 Alignment를 더욱 향상시키고, 더 좋은 Sentence Embedding을 생성한다는 것을 보여줌</li>
<li>사전학습된 Word Embedding이 <strong>비등방성(Anisotropy)문제</strong>를 겪는다는 최근 연구와 연결하여 <strong>스펙트럼 관점</strong>에서 대조학습 목적함수가<ul>
<li>Sentence Embedding 공간의 Singular Value Distribution을 평탄하게 만들고,</li>
<li>그 결과 Uniformity를 향상시킨다는 것을 증명함</li>
</ul>
</li>
</ul>
<p>⇒ SimCSE를 7개의 표준 STS 과제와 7개의 Transfer Task에서 종합적으로 평가함 — 기존 성능보다 각각 4.2%, 2.2% 향상</p>
<hr>
<h2 id="2-background-contrastive-learning">2. Background: Contrastive Learning</h2>
<ul>
<li><p><strong>대조학습</strong>은 의미적으로 가까운 이웃은 서로 가깝게 끌어당기고, 가깝지 않은 데이터는 서로 멀어지게끔 학습하는 방법</p>
<ul>
<li>$D={(x_i, x_i^+)}_{i=1}^{m}$ 라는 문장쌍 집합이 있다고 가정<ul>
<li>여기서 $x_i, x_i^+$는 의미적으로 관련된 데이터(Positive Pair)</li>
</ul>
</li>
</ul>
</li>
<li><p>Chen et al.(2020)의 대조학습 프레임워크를 따랐고, <strong>미니배치 안의 Negative Sample</strong>을 사용하는 Cross Entropy 목적 함수 사용</p>
<ul>
<li><p>$h_i, h_i^+$를 각각 $x_i$와 $x_i^+$의 표현이라고 하자.</p>
<p>  → 즉, $h_i, h_i^+$는 각각 Anchor와 positive의 임베딩 벡터임. 이를 통해 Contrastive Loss를 계산함</p>
</li>
<li><p>N개의 쌍으로 이루어진 미니배치에서 $(x_i, x_i^+)$의 학습 목적함수</p>
<p>  $\ell_i=-\log\frac{\exp(\operatorname{sim}(h_i,h_i^+)/\tau)}{\sum_{j=1}^{N}\exp(\operatorname{sim}(h_i,h_j^+)/\tau)}$</p>
<p>  → Anchor가 자기 positive를 맞추도록 하는 Loss</p>
<ul>
<li><p>τ : Temperature Hyperparameter(민감도 조절)</p>
<p>  → Similarity를 얼마나 강조할지를 결정</p>
</li>
<li><p>$\operatorname{sim}(h_i,h_i^+)$: 두 벡터 사이의 코사인 시밀러리티</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>본 연구에서는 BERT와 RoBERTa와 같은 사전학습 언어모델을 통해 $h = f_{\theta}(x)$로 인코딩하고, Contrastive Learning Loss(Eq.1)를 이용해서 모든 파라미터를 파인튜닝함</p>
</li>
</ul>
<h4 id="positive-instances">Positive instances</h4>
<ul>
<li>대조학습에서 가장 중요한 문제 중 하나는 Positive pair를 어떻게 만드는가임<ul>
<li>이미지: 같은 이미지에 crop, flip, 왜곡, 회전 등의 랜덤 변환을 적용하여 만듦</li>
<li>언어: word deletion, word reordering, word substitution 같은 데이터 증강 기법을 적용</li>
</ul>
</li>
<li>그러나 NLP에서 데이터 증강은 언어의 <strong>이산적인 특성</strong>때문에 본질적으로 어려움<ul>
<li>3장에서 말하겠지만, Hidden representation에 표준 Dropout만 적용하는 것이 이런 이산적인 Operator보다 더 좋은 성능을 냄</li>
</ul>
</li>
<li>NLP에서도 유사한 대조학습은 다양한 문제에서 연구되어 옴<ul>
<li>기존엔 질문-문서(QA)처럼 이미 짝이 정해진 데이터세트를 Positive pair로 사용했었음<ul>
<li>Question과 Passage처럼 입력의 성격이 다르므로 각각을 처리하기 위해 2개의 인코더를 사용하는 <strong>듀얼 인코더 구조</strong>를 사용함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="alignment-and-uniformity">Alignment and uniformity</h4>
<ul>
<li><p>기존) Loss가 작으면 좋은 모델</p>
<p>  ↔ 좋은 임베딩은 Alignment와 Uniformity를 동시에 만족해야함</p>
<ul>
<li>Alignment: 의미가 같은 데이터는 서로 가까워야함</li>
<li>Uniformity: 전체 임베딩은 공간 전체에 고르게 퍼져 있어야 함</li>
</ul>
</li>
<li><p>Positive Pair의 분포는 $p_{pos}$가 주어졌을 때, <strong><code>Alignment</code></strong>는 짝지어진 데이터들의 임베딩 사이의 기대 거리를 계산함</p>
<ul>
<li><p>단, 임베딩은 이미 정규화되어 있다고 가정</p>
<p> $L_{\mathrm{align}}=\mathbb{E}_{(x,x^+)\sim p{\mathrm{pos}}}\left[|f(x)-f(x^+)|^2\right]$</p>
<ul>
<li><p>$f(x)$: 문장을 Encoder(BERT)에 넣어서 얻은 embedding</p>
</li>
<li><p>$f(x^+)$: positive pair의 embedding</p>
</li>
<li><p>$|f(x)-f(x^+)|^2$: 두 임베딩 사이의 거리</p>
<p>   → 거리가 작을수록 좋음</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>→ 즉 결국은 alignment는 positive pair 거리의 평균</code></pre><ul>
<li><p>반면, <strong><code>Uniformity</code></strong>는 Embedding이 얼마나 균일하게 분포하는지를 측정함</p>
<ul>
<li><p>즉, 임베딩이 특정 방향으로 몰리지 않고 공간 전체에 얼마나 고르게 퍼져 있는지를 측정하는 지표임</p>
<p>  $L_{\mathrm{uniform}}=\log\mathbb{E}e^{-2|f(x)-f(y)|^2}$</p>
<p>  → 모든 데이터 쌍의 거리를 이용하여 Embedding이 얼마나 균등하게 퍼져있는지를 계산</p>
<p>  ** 여기서 주의해야할 것은 positive pair가 아니라 아무 문장이나 2개를 뽑아서 랜덤한 문장을 비교하는 것 
  ⇒ Uniformity는 <strong>전체 공간의 분포</strong>를 보기 때문</p>
</li>
</ul>
</li>
</ul>
<h2 id="3-unsupervised-simcse">3. Unsupervised SimCSE</h2>
<ul>
<li><p>비지도 SimCSE의 아이디어는 매우 단순함</p>
<ul>
<li><p>문장 집합 ${x_i}_{i=1}^{m}$를 가지고 positive pair를 $x_i^+ = x_i$ 로 사용</p>
<ul>
<li><p><code>Anchor</code> : 오늘 날씨가 좋다</p>
</li>
<li><p><code>Positive</code> : 오늘 날씨가 좋다.</p>
<p>⇒ 즉, 기존 대조학습에서 positive pair를 만들기 위해 crop, rotation, word deletion 같은 증강이 필요했음</p>
<p>벗뜨, SimCSE는 ‘그냥 같은 문장 쓰자’ 라는 아이디어</p>
</li>
</ul>
</li>
<li><p>이걸 positive pair처럼 작동하기 위해서는 $x_i$와 $x_i^+$에 대해 <strong>서로 독립적으로 샘플링된 Dropout Mask</strong>를 사용</p>
<p>  $\ell_i = - \log
  \frac{
  e^{\operatorname{sim}(h_i^z,h_i^{z&#39;})/\tau}
  }{
  \sum_{j=1}^{N}
  e^{\operatorname{sim}(h_i^z,h_j^{z&#39;})/\tau}
  }$</p>
</li>
</ul>
</li>
<li><p>Transformer의 일반적인 학습에서 Dropout mask가</p>
<ul>
<li><p>fully connected layer</p>
</li>
<li><p>attention probability 모두가 적용됨</p>
</li>
<li><p>기본 dropout 확률은 0.1</p>
<p>  $h_i^z = f_{\theta}(x_i, z)$</p>
<ul>
<li>$z$: Transformer의 기본 Dropout Mask (추가적인 Dropout은 x)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="dropout-noise-as-data-augmentation">Dropout noise as data augmentation</h4>
<ul>
<li>dropout을 본 논문에서는 가장 작은 형태의 data augmentation이라고 해석함<ul>
<li>문장은 전혀 바뀌지 않고, embedding만 약간 달라짐</li>
</ul>
</li>
<li>STS-B Development Set에서 이 방법을 다른 학습 방법으로 비교</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c402492c-85ec-4182-a3f7-a7d8825bd9f5/image.png" alt=""></p>
<ul>
<li><p>Crop, Word Deletion, Word Replacement 같은 일반적인 데이터 증강을 비교함</p>
<ul>
<li>$h=f_\theta(g(x),z)$<ul>
<li>$g$는 입력 문장에 적용되는 <strong>랜덤한 이산 연산</strong>을 의미함</li>
</ul>
</li>
</ul>
</li>
<li><p>실험결과, 단어 하나만 삭제하는 간단한 증강조차 성능을 떨어뜨렸고, 모든 텍스트 증강 기법보다 Dropout만 사용하는 SimCSE가 더 좋은 성능을 보였음</p>
<p>  <img src="https://velog.velcdn.com/images/hyooo__s/post/31689d5f-f3a9-446d-a985-4fbed284d31e/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>또한, 저자들은 SimCSE의 학습 방식(self-prediction)이 기존의 Next Sentence Prediction기반 대조학습보다 좋은지 확인하기 위해 비교 실험을 수행함<ul>
<li>+) Encoder를 하나만 사용할 때와 두 개를 사용할 때도 같이 비교 진행</li>
</ul>
</li>
<li>SimCSE는 Next-Sentence 목적 함수보다 훨씬 좋은 성능을 보였음<ul>
<li>즉, 본 연구의 방법에서는 2개의 인코더보다 한 개의 인코더를 사용하는 것이 더 효과적임</li>
</ul>
</li>
</ul>
<h4 id="why-does-it-work">Why does it work?</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/85b9f69e-63ee-4b4f-85f1-d57c56966ce7/image.png" alt=""></p>
<ul>
<li>비지도 SimCSE에서 Dropout Noise역할의 중요성을 확인하기 위해 다양한 확률로 바꾸어 실험 진행 → p=0.1(기본값)이 가장 좋은 성능을 보였음</li>
<li>특히, ① Dropout을 완전히 제거한 경우 ② Dropout은 사용하지만 두 문장에 동일한 Dropout Mask를 적용한 경우(Fixed 0.1) 두 경우는 성능이 크게 감소<ul>
<li>positive pair의 embedding이 완전히 동일해졌고, 그 결과 성능이 크게 감소했기 때문</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/48485345-ed34-4b02-ba5f-5671389fa4c5/image.png" alt=""></p>
<ul>
<li>학습과정에서 10 step마다 모델의 Checkpoint를 저장하고, <code>Figure2</code> 에서 <strong>Alignment</strong>와 <strong>Uniformity</strong>를 시각화함<ul>
<li>또한, “delete one word” 데이터 증강 모델도 함께 비교함</li>
</ul>
</li>
<li>pre-trained checkpoint에서 시작한 모든 모델은 uniformity를 크게 향상시킴<ul>
<li>즉, BERT에서 시작한 모든 모델은 대조학습을 하면서 임베딩이 더 균등하게 퍼짐</li>
</ul>
</li>
<li>dropout을 하지 않거나 Fixed 0.1 모델의 경우에는 Alignment가 크게 악화됨<ul>
<li>하지만 unsupervised SimCSE는 Dropout Noise 덕분에 Alignment를 안정적으로 유지함</li>
</ul>
</li>
<li>또한, 사전학습된 모델로 시작하는 게 좋은게, 초기에 좋은 Alignment를 제공하기 때문</li>
<li>Delete one word의 경우 Alignment를 향상시키긴 하지만, Uniformity는 조금만 향상됨</li>
</ul>
<hr>
<h2 id="4-supervised-simcse">4. Supervised SimCSE</h2>
<ul>
<li><p>3절에서 Dropout Noise를 추가하는 것이 Positive pair$(x,x^+)$의 좋은 Alignmnet(적절히 가깝게 유지)를 유지할 수 있음을 확인할 수 있었음</p>
<ul>
<li>이번 절에서는 지도학습 데이터세트를 활용해서 Alignment를 더 개선해보겠다.</li>
</ul>
</li>
<li><p>기존 연구에서는 지도학습 NLI데이터세트가 Sentence Embedding 학습에 효과적임을 보여주었음</p>
<ul>
<li><p>Entailment (의미적으로 참)</p>
</li>
<li><p>Neutral (애매함)</p>
</li>
<li><p>Contradiction (모순)</p>
<p>  중 무엇인지 예측하도록 구성되어 있음</p>
</li>
</ul>
</li>
<li><p>본 연구에서는 NLI를 분류 문제가 아니라 NLI 지도 데이터세트에서 Positive Pair를 사용하여 대조학습을 수행함</p>
<p>  ⇒ 즉, 분류 문제가 아니라 <strong>임베딩 학습</strong></p>
</li>
</ul>
<h4 id="choices-of-labeled-data">Choices of labeled data</h4>
<ul>
<li>지도학습 데이터세트라고 해서 모두 좋은 게 아니기 때문에, 어떤 데이터세트가 대조학습에 가장 적합한지를 비교 실험을 수행함<ul>
<li><code>QQP</code>: Quora question pairs — 같은 질문인지 아닌지 판별하는 데이터세트</li>
<li><code>Flickr 30k</code>: 같은 사진을 설명하는 두 문장은 같은 의미를 담고 있으므로 positive pair로 사용</li>
<li><code>ParaNMT</code>: 대규모 Back-Translation 기반 Paraphrase 데이터세트</li>
<li>NLI — SNLI, MNLI</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/c753c36f-13ca-4825-9f01-d05421c0b5a4/image.png" alt=""></p>
<ul>
<li>동일한 대조학습 구조를 유지하고 데이터세트만 바꿔가며 성능 비교 진행<ul>
<li>학습 pair 수도 동일하게 맞췄음</li>
</ul>
</li>
<li>모든 선택지 중에서 NLI (SNLI + MNLI)의 Entailment pair가 가장 좋은 성능을 보였음<ul>
<li>NLI 데이터세트는 crowdsourcing 문장쌍으로 이루져 있고,</li>
<li>annotator들도 premise 기반으로 hypothesis를 직접 작성하기 때문에 두 문장은 Lexical Overlap이 적음</li>
</ul>
</li>
</ul>
<h4 id="contradiction-as-hard-negatives">Contradiction as hard negatives</h4>
<ul>
<li>NLI 데이터세트의 장점을 Entailment pair만 사용하는 것에 끝나는 게 아니라,  contradiction pair를 hard negative로 사용하면서 더욱 활용함<ul>
<li>기존의 대조학습에서는 Anchor → positive → 같은 의미, Negative는 아무 문장임 — 이건 너무 쉽</li>
<li>근데, contradiction pair에서는 <code>“A dog is running”</code> → <code>“No Animal is moving”</code> 처럼 비슷한 단어는 많지만 의미는 정반대인 hard negative를 활용함</li>
</ul>
</li>
<li>NLI 데이터세트의 경우에는 하나의 premise가 주어지면, Annotator는<ul>
<li>반드시 참인 문장(Entailment)</li>
<li>참일 수도 있는 문장(Neutral)</li>
<li>반드시 거짓인 문장(Contradiction)을 작성해야함</li>
</ul>
</li>
<li>따라서, positive pair가 있으면 같은 premise에 대응하는 hard negative도 자동으로 존재함!<ul>
<li>그래서 $(x_i, x_i^+)$ → $(x_i, x_i^+, x_i^-)$로 확장함</li>
</ul>
</li>
</ul>
<p>   $-\log
        \frac{
        e^{\operatorname{sim}(h_i,h_i^+)/\tau}
        }{
        \sum_{j=1}^{N}
        \left(
        e^{\operatorname{sim}(h_i,h_j^+)/\tau}
        +
        e^{\operatorname{sim}(h_i,h_j^-)/\tau}
        \right)
        }$</p>
<p> ⇒ positive similarity는 크게 만들고, hard negative similarity는 작게 만듦</p>
<hr>
<h2 id="5-connection-to-anisotropy">5. Connection to Anisotropy</h2>
<ul>
<li><p>기존의 BERT 같은 모델의 임베딩은 벡터 공간 전체에 퍼져있는 게 아니라 한 방향으로 몰려 있는 경향(Anisotropy)가 있음</p>
<ul>
<li>그래서 서로 다른 문장이 비슷한 벡터를 가지게 되어서 문장들을 잘 구분하지 못하는 문제가 존재함</li>
</ul>
</li>
<li><p>그런데 이런 임베딩 행렬을 SVD로 분해해보면, 몇 개의 축(방향)만 매우 강하고 나머지 방향은 거의 사용되지 않음</p>
<blockquote>
<p><strong>✓ SVD 관련 내용</strong>        </p>
<pre><code>  https://darkpgmr.tistory.com/106</code></pre></blockquote>
<ul>
<li><p>즉 첫번째 방향만 거의 모든 정보를 가지고 있어서 임베딩은 그 쪽으로 몰리게 됨 = Anisotropy</p>
<p>⇒ 이 문제를 완화하는 간단한 방법은 <strong>후처리</strong></p>
</li>
<li><p>가장 큰 주성분을 제거하거나</p>
</li>
<li><p>임베딩을 Isotropic Distribution으로 변환하는 것</p>
<blockquote>
<p><strong>✓ Isotropic Distribution</strong></p>
<ul>
<li><p>Iso = 같은(equal)</p>
</li>
<li><p>tropic = 방향(direction)</p>
<p>  ⇒ 즉, 모든 방향이 동일한 성질을 가진다.</p>
</li>
<li><p>벡터 공간에서 임베딩들이 특정 방향에 몰리지 않고, 모든 방향으로 고르게 퍼져 있는 상태</p>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>대조학습은 Negative Instance를 서로 멀어지게 만들어서, 임베딩들이 공간 전체에 퍼질 수 있게 함</p>
<ul>
<li>SVD(특이값 분해)를 이용하여 대조학습이 몇 개의 방향에만 집중된 임베딩을 여러 방향으로 고르게 사용</li>
</ul>
</li>
<li><p>Negative가 매우 많다고 가정을 한다면, Contrastive Loss를 2개의 항으로 나누어 해석할 수 있음</p>
<ul>
<li><p>실제로 SimCSE는 미니 배치 안의 모든 문장을 Negative로 사용함</p>
</li>
<li><p>Batch가 충분히 크면, 이론적으로는 Negative가 무한히 많다고 볼 수 있고 그래서 loss를 깔끔하게 분해할 수 있음</p>
<blockquote>
<p><strong>✓ 수식 상세히 설명</strong></p>
<p>$\ell_i = - \log
\frac{
e^{\operatorname{sim}(h_i^z,h_i^{z&#39;})/\tau}
}{
\sum_{j=1}^{N}
e^{\operatorname{sim}(h_i^z,h_j^{z&#39;})/\tau}
}$</p>
<ul>
<li>$h_i = f(x_i)$</li>
<li>$h_i^+ = f(x_i^+)$</li>
<li>sim = cosine similarity</li>
<li>$τ$  = temperature<blockquote>
<ul>
<li><strong>✓ 이 식이 의미하는 것은</strong></li>
</ul>
</blockquote>
<ul>
<li>Anchor: “A dog is running”</li>
<li>Positive: “A puppy is running”</li>
<li>배치 안에 Negative1 Negative2 Negative3 Negative4 … 와 같이 있다면, 분자는 Positive와의 similarity를 의미함</li>
<li>분모는 배치 안의 모든 후보들과 similarity</li>
</ul>
</li>
</ul>
<p>그래서 이 식에서 Negative sample이 무한히 많다고 가정을 해보자.</p>
<p>즉, Batch가 엄청 크다고 생각을 하는건데,</p>
<p>그러면 합(sum)이 기댓값(expectation)으로 바뀌게 됨</p>
<p>⇒ 위의 Loss 수식을 두 부분으로 나눔 (eq.6)</p>
<p>$-\frac{1}{\tau}E_{(x,x^+)}\left[f(x)^T f(x^+)\right]$ + $E_x\left[\log E_{x^-}e^{f(x)^T f(x^-)/\tau}\right]$</p>
<ul>
<li>이때 첫 번째 항은 Positive를 의미함<ul>
<li>정규화되어 있으므로 $f(x)^Tf(x^+) = \cos(\theta)$ → 즉, cosine similarity임!</li>
<li>Loss는 앞에 마이너스가 있으므로 Similarity를 최대한 크게 만들려고 함<ul>
<li>즉, Anchor → positive를 계속해서 붙이면서 Alignment를 담당하는 항</li>
</ul>
</li>
</ul>
</li>
<li>두번째 항은 Negative를 의미하는데<ul>
<li>만약에 Negative Similarity가 크다면 ex. $e^{0.95/\tau}$도 매우 커지게 됨</li>
<li>그러면 Loss가 엄청 커지게되고, loss를 줄이기 위해 similarity를 줄여야함. 즉, negative를 멀리 보내야함!</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>이때, $P_{data}$가 유한한 샘플 {$x_i$} 위에서 균등분포라고 하면, $h_i = f(x_i)$일 때, Jensen 부등식을 이용하여 더 간단한 형태로 유도할 수 있음</p>
<ul>
<li>$E_{x\sim p_{\mathrm{data}}}
\left[
\log
E_{x^{-}\sim p_{\mathrm{data}}}
\left[
e^{f(x)^T f(x^-)/\tau}
\right]
\right]$ $=
\frac{1}{m}
\sum_{i=1}^{m}
\log
\left(
\frac{1}{m}
\sum_{j=1}^{m}
e^{h_i^T h_j/\tau}
\right)$ $\ge
\frac{1}{\tau m^2}
\sum_{i=1}^{m}
\sum_{j=1}^{m}
h_i^T h_j$</li>
</ul>
</li>
<li><p>$W$를 문장 임베딩 행렬이라고 하면, $W$의 i번째 행은 $h_i$</p>
<ul>
<li>행: 하나의 문장 임베딩</li>
<li>열: 임베딩의 각 차원</li>
</ul>
</li>
<li><p>eq6의 두번째 항을 최적화 하는 것(Negative를 멀리 보내는 것)은 본질적으로 $WW^T$의 모든 원소의 합의 상한을 최소화하는 것</p>
<ul>
<li>즉, $\operatorname{Sum}(WW^T)=\sum_i\sum_j h_i^T h_j$ → 모든 문장 임베딩기리의 내적의 총합을 줄이는 것과 동일하다.</li>
<li>이 값이 작다는 건 서로 덜 비슷하다는 뜻이니까, 공간 전체로 잘 퍼져있다는 것을 의미함(uniformity가 좋아짐)</li>
</ul>
</li>
<li><p>또한, $h_i$를 정규화해놨기때문에, $WW^T$의 대각 원소는 모두 1임
→ 모든 고유값의 합은 상수!!</p>
<ul>
<li>이때 $WW^T$의 모든 원소가 양수이면 $Sum(WW^T)$은 가장 큰 고유값의 상한이 됨 → 즉, 모든 내적의 합을 줄이면 가장 큰 고유값도 함께 줄어듦</li>
</ul>
</li>
</ul>
<p>   ⇒ 임베딩 공간의 Singular Spectrum이 평평해짐(여러 방향으로 퍼짐)</p>
<p>   ⇒ 그래서 결과적으로 대조학습은 문장 임베딩의 Uniformity를 향상시킬 것으로 기대됨</p>
<hr>
<h2 id="6-experiment">6. Experiment</h2>
<h3 id="61-evaluation-setup">6.1 Evaluation Setup</h3>
<ul>
<li>7개의 Semantic Textual Similarity(STS) 과제에서 실험 수행<ul>
<li>비지도 학습 — STS 데이터는 오직 “평가”에만 사용했음</li>
</ul>
</li>
<li>지도학습 SimSCE에서도 STS의 정답을 이용해 학습하는 것이 아닌 SNLI, MNLI 같은 별도의 레이블 데이터만 사용함</li>
<li>목적: 의미적으로 비슷한 의미의 문장을 가깝게 표시하는 것</li>
</ul>
<h4 id="semantic-textual-similarity-tasks">Semantic Textual Similarity Tasks</h4>
<ul>
<li>7개의 STS 벤치마크를 사용했음 + 기존 논문들이 STS를 사용하더라도 평가방법이 조금씩 달랐어서 Sentence-BERT 논문의 평가방식으로 통일하여 진행함<ul>
<li>Regressor 사용 여부</li>
<li>Spearman 상관 계수 or Pearson 상관계수 사용</li>
<li>결과를 평균내는 방법</li>
</ul>
</li>
</ul>
<h4 id="training-details">Training Details</h4>
<ul>
<li><p>사전학습된 BERT 또는 RoBERTa를 사용하고, <code>[CLS]</code> Representation을 Sentence Embedding으로 사용하였음</p>
</li>
<li><p>비지도 SimCSE는 영어 위키피디아 문장 100만개 학습했고,</p>
<p>  지도 SimCSE는 MNLI와 SNLI를 합친 31만 4천 개 데이터로 학습함</p>
</li>
</ul>
<h3 id="62-main-results">6.2 Main Results</h3>
<ul>
<li>비지도 SimCSE와 지도 SimCSE를 STS 과제에서 기존 최신 SOTA 문장 임베딩 방법들과 함께 비교했음<ul>
<li>비지도 baseline<ul>
<li>평균 GloVe Embedding</li>
<li>평균 BERT 또는 RoBERTa Embedding</li>
<li>BERT-flow</li>
<li>BERT-whitening 등이 포함됨</li>
</ul>
</li>
</ul>
</li>
<li>그리고 대조 학습 기반의 최신 모델들도 함께 비교를 진행했음<ul>
<li><code>IS-BERT</code> 는 문장 전체 정보(global)과 일부 토큰 정보(local)사이를 비슷하게 만드는 방식</li>
<li><code>DeCLUTR</code> 는 같은 문서의 다른 구간(span)을 postive pair로 사용</li>
<li><code>CT</code> 는 2개의 서로 다른 인코더에서 나온 같은 문장의 임베딩을 정렬함</li>
</ul>
</li>
<li>지도학습에서는 대표적인 문장 임베딩 모델들과 비교를 진행했음<ul>
<li>InferSent, Universal Sentence Encoder, <strong>SBERT</strong>, SRoBERTa, 후처리(BERT-flow, Whitening, CT)를 적용한 방법까지</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/34c53947-ca38-4050-afee-4b45449219d8/image.png" alt=""></p>
<ul>
<li>결과적으로 SimCSE는 추가적인 NLI Supervision의 유무와 관계없이 모든 데이터세트에서 성능을 크게 향상시켰고 기존의 SOTA를 크게 능가했음</li>
</ul>
<h3 id="63-ablation-studies">6.3 Ablation Studies</h3>
<ul>
<li><p>또한 <strong>다양한 Pooling 방법</strong>과 <strong>Hard Negative</strong>가 미치는 영향을 조사했음</p>
<blockquote>
<p><strong>✓ NLP에서도 Pooling을 적용하나?</strong></p>
<ul>
<li><p>NLP에서도 Pooling은 매우 많이 사용됨. 다만, CNN에서 사용하는 Pooling과는 목적이 조금 다른 편</p>
</li>
<li><p>그러면 NLP에서 Pooling이 왜 필요할까? → BERT를 예로 들자.</p>
<ul>
<li><p>문장이 “I love BOAZ”라면, 토큰화 이후에는 <code>[CLS]</code> <code>I</code> <code>love</code> <code>BOAZ</code> <code>.</code> 로, BERT를 통과하면 각 토큰마다 하나씩 벡터가 나오게 됨</p>
<ul>
<li><p><code>[CLS]</code> → 768차원</p>
</li>
<li><p><code>I</code> → 768차원</p>
</li>
<li><p><code>love</code> → 768차원</p>
</li>
<li><p><code>BOAZ</code> → 768차원</p>
</li>
<li><p><code>.</code> → 768차원</p>
<p>  ⇒ 즉 결과는 5 x 768</p>
</li>
</ul>
</li>
<li><p>그런데 문장 임베딩은 <strong>문장 하나 = 벡터 하나</strong>이어야함</p>
<p>  <strong>→ 여러 개의 토큰 벡터를 하나의 벡터로 합치는 과정이 필요!!</strong></p>
</li>
</ul>
</li>
<li><p>대표적인 Pooling 방법</p>
<ul>
<li>CLS Pooling<ul>
<li><code>[CLS]</code> 벡터만 사용</li>
<li>BERT의 경우 <code>[CLS]</code> 가 문장 전체 정보를 담도록 학습되어 있기 때문에 많이 사용됨</li>
</ul>
</li>
<li>Mean Pooling<ul>
<li>모든 토큰 평균 내는 방법</li>
</ul>
</li>
<li>Max Pooling<ul>
<li>각 차원마다 가장 큰 값만 선택</li>
</ul>
</li>
</ul>
</li>
<li><p>CNN의 Pooling과는 어떻게 다를까?</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>CNN Pooling</th>
<th>NLP Pooling</th>
</tr>
</thead>
<tbody><tr>
<td>Feature map 크기 감소</td>
<td>여러 토큰 벡터를 하나의 문장 벡터로 합침</td>
</tr>
<tr>
<td>공간 정보 요약</td>
<td>문장 의미 요약</td>
</tr>
<tr>
<td>MaxPool, AvgPool 사용</td>
<td>CLS, Mean, Max Pooling 사용</td>
</tr>
</tbody></table>
</blockquote>
</li>
</ul>
<h4 id="pooling-methods">Pooling Methods</h4>
<ul>
<li>기존 연구에서 사전학습 모델의 <strong>평균 임베딩(특히 첫번째와 마지막 layer)</strong>을 사용하는 것이 <code>[CLS]</code> 보다 더 좋은 성능을 낸다고 보고함<ul>
<li><code>[CLS]</code> 표현의 경우에는 원래 BERT 구현에서는 바로 사용하는 게 아니라 MLP(Dense layer)를 한 번 더 거치게 됨</li>
<li>본 논문에서는 이 MLP를 언제 사용할 지에 대해 3가지 방법을 비교했음</li>
</ul>
</li>
</ul>
<ol>
<li>keeping the MLP layer</li>
</ol>
<ul>
<li>학습과 테스트 모두 <code>CLS</code> → <code>MLP</code> → <code>Embedding</code></li>
</ul>
<ol>
<li>no MLP layer</li>
</ol>
<ul>
<li>학습과 테스트 모두 <code>CLS</code> → <code>Embedding</code></li>
</ul>
<ol>
<li>keeping MLP during training but removing it at testing time</li>
</ol>
<ul>
<li><p>학습 중에는 MLP 유지, 테스트에서는 MLP 제거</p>
<blockquote>
<p><strong>✓ 왜 이렇게 하지?</strong></p>
<ul>
<li><p>MLP는 대조학습을 조금 더 쉽게 만들어주는 역할임</p>
</li>
<li><p>하지만, 최종적인 문장 임베딩의 경우에는 MLP를 제거한 원래 CLS가 더 일반화가 잘됨</p>
<p>  → 그래서 학습할 때만 MLP를 사용</p>
</li>
</ul>
<p> 비지도 SimCSE는 Train에 MLP를 쓰고, Test에서는 제거하는 것이 가장 좋았고, 지도 SimCSE에서는 Pooling 방법에 따른 차이가 크지 않았음</p>
<p> 기본 Pooling 설정은 <strong>비지도: Train에서만 MLP, 지도: 항상 MLP</strong></p>
</blockquote>
</li>
</ul>
<h4 id="hard-negatives">Hard Negatives</h4>
<ul>
<li>Hard Negative는 Anchor와 주제가 비슷하면서 의미가 반대이므로 어려움<ul>
<li>따라서 Eq.5의 목적 함수를 각 Negative에 서로 다른 가중치를 주도록 확장함</li>
</ul>
</li>
</ul>
<pre><code>$-\log
    \frac{
    e^{\operatorname{sim}(h_i,h_i^+)/\tau}
    }{
    \sum_{j=1}^{N}
    \left(
    e^{\operatorname{sim}(h_i,h_j^+)/\tau}
    +
    \alpha^{\,l_j}_i
    e^{\operatorname{sim}(h_i,h_j^-)/\tau}
    \right)
    }$

   - 여기서 $\alpha$가 hard negative의 가중치임! → 다양한 $\alpha$값으로 변환시켜서 학습!!</code></pre><p><img src="https://velog.velcdn.com/images/hyooo__s/post/2a7976a5-8ca1-4812-bc8d-60df14ff0691/image.png" alt=""></p>
<p>→ 결과적으로 $\alpha$=1이 가장 좋은 성능을 보였고, Neutral Hypothesis는 추가적인 성능향상을 가져오진 못했음</p>
<h2 id="7-analysis">7. Analysis</h2>
<ul>
<li>본 절에서는 SimCSE가 왜 효과적인지에 대해 다양한 분석을 진행함<ul>
<li>대조학습이 Uniformity를 높인다</li>
<li>NLI가 Alignment를 높인다 등을 실제 데이터에도 맞는지 확인</li>
</ul>
</li>
</ul>
<h4 id="uniformity-and-alignment">Uniformity and Alignment</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b5bdb67a-60a6-4b43-92b1-0c342d07e16e/image.png" alt=""></p>
<ul>
<li><p>여러 문장 임베딩 모델들이 Uniformity와 Alignment, 평균 STS 성능을 비교했음</p>
<ul>
<li><p>일반적으로 Alignment와 Uniformity가 모두 좋은 모델이 더 좋은 성능을 달성함</p>
</li>
<li><p>사전학습 임베딩은 좋은 Alignment를 가지고 있긴 하지만, Uniformity는 좋지 않았음</p>
<p>  → 즉, BERT는 의미가 비슷한 문장들을 잘 모아주긴 하는데, 벡터 공간 전체에 고르게 퍼져 있진 않더라</p>
</li>
<li><p>BERT-flow와 BERT-whitening같은 후처리 방법은 Uniformity를 크게 향상시키긴 하느데, Alignment는 약화됨</p>
</li>
<li><p>비지도 SimCSE는 사전학습 임베딩의 Uniformity를 효과적으로 향상시키면서 좋은 Alignment를 유지함</p>
</li>
<li><p>SimCSE에서 지도 데이터를 추가하면 Alignment가 더 향상되더라</p>
</li>
</ul>
</li>
</ul>
<h4 id="qualitative-comparison">Qualitative Comparison</h4>
<ul>
<li>SBERTbase와 SimCSE-BERTbase를 사용하여 작은 규모의 검색 실험을 수행함<ul>
<li>Flickr30k 데이터세트의 15만개 Caption을 사용하고,</li>
<li>임의의 문장을 Query로 사용하여</li>
<li>코사인시밀러리티 기반으로 유사문장을 검색함</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/031a4128-c689-4f6f-8830-68c5c071be18/image.png" alt=""></p>
<ul>
<li>실제 검색 결과를 비교해보니 SimCSE가 의미적으로 더 적절한 문장을 찾아옴</li>
</ul>
<hr>
<h2 id="8-related-work">8. Related work</h2>
<ul>
<li>초기 문장 임베딩 연구는 주변 문장을 예측하는 방식에 기반했음</li>
<li>최근 연구들은 대조학습을 도입해서 데이터 증강이나 인코더를 활용하여 Positive pair를 만들었음</li>
<li>SimCSE는 위 방법들보다 더 단순하게 Dropout Mask만 적용하여 positive pair를 만들었음에도 STS에서 SOTA 달성</li>
<li>기존의 문장 임베딩은 NLI 데이터를 활용했고 또 다른 연구들은 BERT-flow나 BERT-whitening처럼 Anisotropy를 완화하는 방향으로 발전</li>
<li>SimCSE는 대조학습 자체로 Alignment와 Uniformity를 동시에 개선하여 두 흐름을 효과적으로 연결한 모델이라고 할 수 있음</li>
</ul>
<hr>
<h2 id="9-conclusion">9. Conclusion</h2>
<ul>
<li>본 연구에서는 SimCSE라는 대조학습 프레임 워크를 제안했고 STS과제에서 SOTA 달성<ul>
<li>Dropout Noise를 사용하여 입력 문장 자기 자신을 예측하는 비지도 접근법과</li>
<li>NLI 데이터세트를 활용하는 지도 접근법을 제시함</li>
</ul>
</li>
<li>SimCSE와 다른 Baseline 모델의 Alignment와 Uniformity를 분석함으로써 왜 효과적인지도 설명했음</li>
<li>해당 아이디어는 문장 임베딩뿐만 아니라 다른 연속 벡터 표현에도 적용할 수 있고, 앞으로는 언어 모델의 사전학습 과정에도 활용될 가능성이 있음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] Mixtral of Experts]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Mixtral-of-Experts</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Mixtral-of-Experts</guid>
            <pubDate>Tue, 04 Aug 2026 03:15:53 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명:</strong> Mixtral of Experts
<strong>학회(출판연도):</strong> arXiv (2024)
<strong>연구분야:</strong> Large Language Models (LLM), Mixture of Experts (MoE), Efficient AI</p>
</blockquote>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li><p>Mixtral 8x7B라는 Sparse Mixture of Experts(SMoE)기반 언어모델 제안</p>
<ul>
<li>여기서 중요한 키워드는 <strong>Sparse</strong>인데,<ul>
<li>기존의 Transformer는 <code>입력</code> → <code>FFN</code>으로 모든 FFN을 항상 계산함</li>
<li>하지만, SMoE는 <code>입력</code> → <code>Router</code> → <code>Expert1</code> <code>Expert5</code> 처럼 필요한 Expert만 선택해서 계산해서 계산량이 크게 줄어듦</li>
</ul>
</li>
</ul>
</li>
<li><p>Mixtral은 기본적으로 Mistral 7B와 동일한 구조를 사용하지만, 각 Transformer layer의 FFN 대신 <strong>8개의 Feed Forward Network(Expert)</strong>를 둔 것이 차이점</p>
<ul>
<li>기존 Transformer layer<ul>
<li><code>Attention</code> → <code>FFN</code></li>
</ul>
</li>
<li>Mixtral Transformer layer<ul>
<li><code>Attention</code> → <code>Expert1</code> <code>Expert2</code> <code>Expert3</code> <code>Expert4</code> <code>Expert5</code> <code>Expert6</code> <code>Expert7</code> <code>Expert8</code></li>
</ul>
</li>
</ul>
</li>
<li><p>각 토큰이 각 layer를 통과할 때마다, Router가 8개의 Expert 중 2개를 선택하고 선택된 Expert의 출력을 합쳐서 다음 layer로 전달</p>
<ul>
<li><p>그래서 토큰마다 선택되는 Expert가 달라질 수 있음</p>
<ul>
<li>“The” → Router → <code>Expert2</code> <code>Expert6</code></li>
<li>“cat” → Router → <code>Expert1</code> <code>Expert8</code></li>
</ul>
</li>
<li><p>각 토큰은 항상 2개의 Expert만 사용하지만, 어떤 Expert를 사용할지는 토큰마다 다름</p>
<p>  ⇒ 각 토큰은 전체 47B 파라미터를 활용할 수 있지만, 실제 추론 시에는 13B정도의 파라미터만 활성화되어 계산됨</p>
<blockquote>
<p><strong>✓ 왜 13B일까?</strong></p>
<ul>
<li><p>Mixtral은 Expert x 8이 있지만, Top-2만 계산함</p>
<ul>
<li><p>즉, 전체 파라미터는 47B이고 실제 계산은 Expert 2개 ≈ 13B</p>
<p>⇒ 큰 모델의 표현력과 작은 모델 수준의 계산량을 동시에 얻을 수 있음</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>또한 Mixtraldms 32,000토큰의 긴 문맥을 처리할 수 있도록 학습됨</p>
</li>
<li><p>대부분의 벤치마크에서 Llama2 70B와 GPT-3.5 이상의 성능을 보임</p>
<ul>
<li>특히, 수학, 코드생성, 다국어에서는 Llama 2 70B보다 훨씬 우수한 성능을 달성함</li>
</ul>
</li>
<li><p>instruction tuning을 수행한 Mixtral 8x7B-Instruct도 함께 공개</p>
</li>
<li><p>사람이 평가한 벤치마크에서는 GPT-3.5 Turbo, Claude 2.1, Gemini Pro, Llama 2 70B Chat 보다도 높은 평가를 받음</p>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>본 논문에서는 Mixtral 8x7B 라는 Sparse Mixture of Experts(SMoE)기반의 오픈소스 언어모델을 소개함(Apaceh 2.0 라이선스)</p>
<blockquote>
<p><strong>✓ SMoE(</strong>Sparse Mixture of Experts)**</p>
<ul>
<li><strong>MoE(Mixture of Experts)</strong><ul>
<li>여러 개의 작은 전문가 모델(Expert)를 만들고, 입력마다 적절한 전문가만 선택해서 사용하는 구조</li>
<li>라우터가 <strong>“누가 이 입력을 처리할지”</strong>를 결정함</li>
</ul>
</li>
<li><strong>Sparse</strong><ul>
<li>모든 Expert를 사용하지 않고 일부 Expert만 사용한다</li>
</ul>
</li>
</ul>
</blockquote>
<ul>
<li>해당 모델은 대부분의 벤치마크에서 Llama 2 70B와 GPT-3.5를 능가함</li>
<li>각 토큰마다 자신의 파라미터 중 일부만 사용하기 때문에 작은 배치에서 더 빠른 추론 속도, 큰 배치에서는 더 높은 처리량 제공</li>
</ul>
</li>
<li><p>Mixtral은 Sparse Mixture-of-Experts 네트워크</p>
<ul>
<li><p>GPT랑 똑같이 Decoder-only Transformer 구조이고, FFN(Feedforward block)부분에서 8개의 Expert 중 필요한 것만 선택함</p>
<blockquote>
<p><strong>✓ Transformer란?</strong></p>
<ul>
<li><p>현재 대부분의 LLM의 기반이 되는 모델로, 기본적인 구조로는 입력 문장 — Encoder(여러 층) — Encoder Output — Decoder(여러 층) — 출력 문장</p>
<p>  !image.png</p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Encoder은 무슨 역할을 할까?</strong></p>
<ul>
<li><p>입력 문장을 이해하는 것</p>
</li>
<li><p>예를 들어, <code>The cat sat on the mat.</code> 이라는 문장이 들어오면, 인코더에서는 <code>The → 벡터</code>, <code>cat → 벡터</code> 처럼 단어를 숫자로 바꿈</p>
<ul>
<li><p>각 단어가 무엇을 의미하는지, 다른 단어와 어떤 관계인지 학습</p>
<p>  → 그래서 BERT, RoBERTa 같은 모델을 사용함</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Decoder은 무슨 역할을 할까?</strong></p>
<ul>
<li>다음 단어를 생성하는 것</li>
<li>예를 들어, <code>오늘 날씨가</code> 가 입력되면, 디코더에서는 <code>좋네요</code> 를 예측함. 이후 <code>좋네요</code> 를 생성하고 다음 단어를 생성</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 그러면 왜 GPT는 Decoder만 사용할까?</strong></p>
<ul>
<li><p>원래 트렌스포머는 Encoder → Decoder 구조 이지만, GPT의 경우에는 Decoder만 사용함</p>
<ul>
<li><p>왜냐하면, GPT의 목표는 <strong>“다음 단어 맞추기”</strong> 이기 때문</p>
<ul>
<li><p>입력을 별도로 압축해서 전달할 필요가 없기 때문에 인코더를 제거함</p>
<p>  → GPT, Llama, Mistral, Mixtral 모두 디코더 온리 모델</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>디코더 layer 하나를 보면, <code>input</code> → <code>self attention</code> -<code>FFN</code> → <code>output</code> 구조인데 이 layer가 여러번 반복됨</p>
<ul>
<li>self attention: 문장 안에서 어떤 단어가 중요한지를 찾는 과정</li>
<li>FFN: 작은 신경망(MLP)<ul>
<li>입력 → linear → activation → linear → 출력</li>
</ul>
</li>
</ul>
</li>
<li><p>Attention과 FFN의 차이?</p>
<ul>
<li>attention은 단어들끼리 관계를 찾는 것을 의미</li>
<li>FFN은 attention이 만든 표현을 더 좋은 표현으로 변환하는 것</li>
<li>그래서 attention은 <strong>정보를 모으는 역할</strong>, FFN은 <strong>정보를 가공하는 역할</strong></li>
</ul>
</li>
<li><p>Mixtral에서는 FFN 하나가 하던 일을 여러개의 FFN(Expert)로 나눔(각 Expert는 독립적인 FFN)</p>
<ul>
<li>전체 구조를 살펴보면,<ul>
<li>self-attention(다른 토큰과의 관계) → Router(어떤 Expert를 사용할지) → Top-2 Expert(각 Expert는 하나의 FFN) → 선택된 두 Expert 출력 가중합 → 다음 Decoder layer</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<h2 id="2-architectural-details">2. Architectural details</h2>
<ul>
<li><p>Mixtral은 기본적으로 Mistral과 같은 Transformer 구조를 사용하지만 크게 아래 두가지가 다름</p>
<ul>
<li>긴 문맥(32K 토큰)을 처리할 수 있도록 개선</li>
<li><strong>⭐️ 기존 FFN을 MoE Layer로 교체</strong></li>
</ul>
</li>
<li><p>모델 구조 파라미터</p>
<p>  <img src="https://velog.velcdn.com/images/hyooo__s/post/abaacf76-e2a9-4820-974a-9c02c432f803/image.png" alt=""></p>
</li>
</ul>
<h3 id="21-sparse-mixture-of-experts">2.1 Sparse Mixture of Experts</h3>
<ul>
<li>MoE Layer</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/6a9c1897-537d-4729-8a8b-914c662ce226/image.png" alt=""></p>
<ul>
<li><p>입력 $x$에 대한 MoE 모듈 출력은 Expert들의 출력을 가중합해서 계산되며, 그 가중치는 <strong>Gating Network(라우터)</strong> 출력으로 결정됨</p>
<ul>
<li>$\sum_{i=0}^{N-1} G(x)<em>{i} \cdot E</em>{i}(x)$<ul>
<li>$E_{i}(x)$: Expert의 출력</li>
<li>$G(x)_{i}$: 라우터가 준 점수</li>
</ul>
</li>
</ul>
</li>
<li><p>⭐️ 만약, Gating Vector가 Sparce하다면, Gate가 0인 Expert는 계산하지 않아도 됨 → 연산량 크게 줄어듦</p>
</li>
<li><p>$G(x)$를 구현하는 방법은 여러 가지가 있지만, 간단하면서도 성능이 좋은 방법은 Linear layer의 Logit에 대해 <strong>Top-K softmax</strong>를 사용하는 것</p>
<ul>
<li>$G(x) = \operatorname{Softmax}\left(\operatorname{TopK}(x \cdot W_g)\right)$<ul>
<li>$x$: 현재 입력 토큰의 벡터(이미 attention을 거친 표현)</li>
<li>$W_g$: Router가 학습하는 가중치. 즉, <strong>어떤 입력이 어떤 Expert로 가야하는가?</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>$(\operatorname{TopK}(\ell))_i$</p>
<ul>
<li>$\ell_i$가 상위 K개의 Logit 중 하나라면 그대로 유지하고, 그렇지 않다면 -∞로 설정<ul>
<li>그렇다면 왜 하필 -∞이냐라고 하면, Softmax에 넣었을 때 $e^{-∞}$=0이기 때문</li>
</ul>
</li>
<li>K는 토큰 1개당 사용하는 Expert의 개수이고, 각 토큰을 처리하는 계산량을 조절하는 하이퍼파라미터임</li>
</ul>
</li>
<li><p>Expert 개수(n)를 늘리고 K를 그대로 유지하면, 모델 파라미터 수는 증가하지만, 계산 비용은 거의 일정하게 유지됨</p>
<ul>
<li><p>Expert가 아무리 늘어나봐야 어차피 K개 만큼만 계산하니까</p>
<p>  ⇒ 따라서 모델 전체 파라미터 수와 토큰 하나를 처리할 때 실제로 사용하는 파라미터 수는 구분할 필요가 있음</p>
</li>
</ul>
</li>
<li><p>MoE layer는 Expert가 여러개라서 느릴 것 같지만, 고성능 특수 커널(GPU에 특화된 연산 방식)을 사용하면, 단일 GPU에서도 효율적으로 실행 가능</p>
<ul>
<li>MegaBlocks<ul>
<li>MoE Layer의 FFN 연산을 큰 <strong>Sparse Matrix Multiplication</strong>으로 변환해서 실행 속도를 크게 향상시키고, Expert마다 서로 다른 개수의 토큰이 할당되는 경우도 자연스럽게 처리</li>
</ul>
</li>
<li>일반적인 Model Parallelism과 Expert Parallelism(EP)를 활용하여 여러 GPU에 분산하기도 함<ul>
<li><strong>Model Parallelism:</strong> 모델 자체를 여러 GPU에 나누어 넣는 것</li>
<li><strong>Expert Parallelism(EP)</strong>: layer가 아니라 Expert를 나눔</li>
</ul>
</li>
</ul>
</li>
<li><p>MoE layer를 실행할때 특정 Expert가 처리해야하는 토큰은 해당 Expert가 있는 GPU로 전달되고, 처리가 끝난 후, 원래 위치로 반환</p>
<ul>
<li><p>그런데, Expert Parallelism은 Load Balancing 문제를 발생시킴</p>
<p>  → GPU마다 작업량이 균등하게 분배하지 않으면, 일부 GPU가 과부하되거나 병목 현상이 발생할 수 있기 때문</p>
<ul>
<li><p>이게 무슨소리냐하면,</p>
<pre><code>    Expert1은 10개의 토큰, Expert2는 500개의 토큰을 담당하고 있다고 하자. 그러면 Expert2가 있는 GPU는 엄청 바쁘고, Expert1이 있는 GPU는 거의 놀고 있겠죠?</code></pre><p> → 때문에 각 Expert들을 비슷하게 분배해야함!!</p>
<blockquote>
<p><strong>✓ 이렇게 Expert가 균등하게 사용되면 전문성이 떨어지는 것은 아닐까?</strong></p>
<ul>
<li><p>MoE는 2가지 목표를 동시에 만족해야함</p>
<ul>
<li><p>각 토큰에 적합한 Expert를 선택해서 성능을 높인다</p>
</li>
<li><p>Expert 사용이 한쪽으로 쏠리지 않게 해서 계산 효율을 유지한다</p>
<p>⇒ 그래서 실제 학습에서는 <code>Load Balancing Loss</code> 를 추가하여 특정 Expert만 계속 선택되는 것을 막음</p>
<p>그렇다고 모든 Expert를 동일한 빈도로 사용하는 것은 아니고, Specialization과 Balance 사이의 적절한 타협점을 찾는 것이 핵심!</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Transformer 모델에서 MoE layer는</p>
<ul>
<li>각 토큰마다 독립적으로 적용<ul>
<li>예를들어, “I love BOAZ” 라고 했을 때,
I | love | BOAZ 이렇게 토큰이 나뉘어서 각 토큰마다 router를 실행한다는 것</li>
<li>이때, 문장 전체가 Expert 하나 선택하는 게 아니라 토큰마다 서로 다른 Expert를 선택 → Sparse Routing</li>
</ul>
</li>
<li>Transformer block의 Feed-Forward(FFN) 서브 블록을 대체함<ul>
<li>Transformer에서 토큰마다 router를 실행해서 <code>Expert</code>를 선택하고, 기존의 FFN 대신에 MoE를 넣음</li>
</ul>
</li>
</ul>
</li>
<li><p>Mixtral에서는 Expert 함수 $E_i(x)$로 SwiGLU구조를 사용하고, 여기서 K는 2를 선택함</p>
<ul>
<li><p>이때 Expert는 <code>Linear → SwiGLU → Linear</code> 구조를 가지고 있음 → 즉, FFN과 거의 동일한 구조 but 차이점은 이게 1개가 아니라 <strong>8개</strong>라는 점</p>
<blockquote>
<p><strong>✓ SwiGLU?</strong></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/05399f86-ffbd-41ce-8689-3ffbb6293227/image.png" alt=""></p>
<ul>
<li><p>SwiGLU = <code>Swish</code> + <code>GLU(Gated Linear Unit)</code> 를 결합한 활성화 함수 구조</p>
</li>
<li><p>먼저 Transformer의 FFN구조를 보면 일반적인 Transformer의 FFN은 보통 <code>입력x → Linear 1 → Activation → Linear2 → 출력</code> 와 같이 생김</p>
<ul>
<li>$FFN(x) = W_2\sigma(W_1x)$</li>
<li>Linear: 입력 벡터를 다른 공간으로 변환함<ul>
<li>768차원 → 3072차원 처럼 차원을 키움 (더 많은 특징을 표현하기 위함)</li>
</ul>
</li>
</ul>
</li>
<li><p>GLU는 일반적인 FFN에 Gate를 한 추가하는 구조</p>
<p>  → 일반적은 FFN의 경우에는 모든 특징을 동일한 방식으로 처리하지만, GLU의 경우에는 입력을 2번 Linear하여 하나는 실제 정보, 다른 하나는 그 정보를 얼마나 사용할지 결정하는 Gate가 있음(즉, 중요한 특징만 getget!)</p>
<ul>
<li>⭐️ 왜 그냥 Attention만으로 안되는지 의문이 생길 수 있는데, Attention의 경우에는 <strong>토큰 간의 관계</strong>를 학습하고, GLU의 경우에는 그 feature마다 사용량을 조절함</li>
</ul>
</li>
</ul>
</blockquote>
</li>
<li><p><em>✓ 예시를 들어보자면,*</em></p>
<blockquote>
<ul>
<li><p><code>Attention</code></p>
<ul>
<li><p>I love BOAZ라는 문장이 있다고 할 때, love의 경우 I와 BOAZ를 많이 참고함</p>
<ul>
<li><code>GLU</code></li>
<li><code>love</code>라는 벡터 안에는 수천 개의 feature가 존재하는데 그 GLU가 그 feature마다 사용량을 조절함<pre><code>   → 벡터 내부 특징 조절</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1b466d43-7501-4417-9bb8-44acbd974f4a/image.png" alt=""></p>
<ul>
<li><p>입력이 두 갈래로 나뉨</p>
<p>→ $\operatorname{GLU}(x) = (W_1x) \odot \sigma(W_2x)$</p>
<ul>
<li>$W_1x$: 정보부분 — 이 정보를 전달할까?</li>
<li>$\sigma(W_2x)$: Gate부분 — 얼마나 열어줄까?</li>
</ul>
</li>
<li><p>Swish(SiLU)는 Google이 제안한 활성화함수</p>
</li>
<li><p>$\operatorname{Swish}(x)=x \cdot \operatorname{sigmoid}(x)$</p>
</li>
<li><p>중요한 값을 통과시키고 중요하지 않은 값은 줄이는 부드러운 Gate 역할</p>
</li>
<li><p><strong>⭐️ 그렇다면, SwiGLU는?</strong></p>
</li>
<li><p>GLU의 Gate부분의 <code>sigmoid</code>를 <code>Swish</code>로 수정</p>
</li>
<li><p>$\operatorname{SwiGLU}(x)=\operatorname{Swish}(W_1x)\odot(W_2x)$</p>
<ul>
<li>Gate가 있는 활성화 함수 부분</li>
</ul>
</li>
<li><p>$\operatorname{SwiGLU}(x) = W_2\left(\operatorname{Swish}(W_1x) \odot W_3x\right)$</p>
<ul>
<li>FFN은 $W_2\sigma(W_1x)$ 구조이므로, 위와 같은 식이 논문에 적혀 있는 것</li>
<li>$W_1$은 첫번째 변환으로 $x → W_1x$ 를 진행한 후 Swish를 적용</li>
<li>$W_3$는 Gate 역할, GLU의 핵심이고 “얼마나 통과시킬지”를 결정함</li>
<li>$W_2$는 출력 projection으로 곱한 결과를 다시 원래 차원으로 돌리는 역할</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 SwiGLU?</strong></p>
<ul>
<li>기존의 FFN은 <code>하나의 변환 → Activation → 출력</code> 이었다면,</li>
<li>SwiGLU는 <code>2개의 변환 → 하나는 정보, 하나는 조절 → 결합</code> 구조이므로, “어떤 정보를 얼마나 사용할지”를 더 세밀하게 학습할 수 있음</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ Mixtral에서 SwiGLU는 어디에 들어갈까?</strong></p>
<ul>
<li><p>Mixtral 구조</p>
<ul>
<li>Token → Attention → Router → Expert 선택 → Expert FFN → 출력<ul>
<li>여기서 Expert = SwiGLU FFN임</li>
<li>즉, Expert마다 Linear → SwiGLU → Linear 과 같은 구조</li>
</ul>
</li>
</ul>
</li>
<li><p>그러면 SwiGLU와 MoE는 무슨 관계인지!</p>
<ul>
<li><p>SwiGLU는 FFN 내부 구조 개선 목적 → FFN을 어떻게 더 잘 만들지</p>
</li>
<li><p>MoE는 FFN을 여러 개 만들고 선택 → FFN을 여러 개 두고 어떤 것을 사용할지</p>
<p>⇒ 즉, SwiGLU는 Swish 활성화 함수와 GLU의 Gate 구조를 결합한 FFN 구조로, 중요한 정보를 선택적으로 통과시키는 능력을 높이는 방식임. Mixtral에서는 각 Expert가 하나의 SwiGLU기반 FFN으로 구성되고, Router가 각 토큰마다 8개의 Expert 중 2개를 선택함</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>이 구조는 GShared와 유사한데, Mixtral의 경우</p>
<ul>
<li><p>모든 FFN을 MoE Layer로 바꾸었고, GShard는 한 층 건너 하나씩만 바꾸었음</p>
</li>
<li><p>그리고 GShard는 토큰에 할당되는 두 번째 Expert를 선택할 때 더 복잡한 Gating 전략을 사용함</p>
<p>  → Mixtral이 Router 구조를 더 단순하게 만듦</p>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="3-result">3. Result</h2>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/5932af75-b903-4f30-9cdf-332cb66f9f00/image.png" alt=""></p>
<ul>
<li>Mixtral과 Llama와 비교했고, 공정하게 비교하기 위해 모든 벤치마크를 자체 평가 파이프라인으로 다시 실행함</li>
<li>또한, LLM의 경우 한 가지 능력만 좋으면 안되기 때문에 (상식, 독해, 수학, 코딩 등 모든 영역에서 잘해야함) 여러 벤치마크를 활용했음<ul>
<li>Commonsense Reasoning<ul>
<li>모델이 사람이라면 당연히 아는 상식을 이해하는지 평가</li>
</ul>
</li>
<li>World Knowledge<ul>
<li>모델이 세상에 대한 지식을 얼마나 많이 알고 있는지를 평가</li>
</ul>
</li>
<li>Reading Comprehension<ul>
<li>긴 글을 읽고 질문에 답할 수 있는지 평가</li>
</ul>
</li>
<li>Math<ul>
<li>수학 성능은 GSM8K(초중등수준) MATH 데이터세트로 평가함</li>
</ul>
</li>
<li>Code<ul>
<li>코드 생성 능력을 HumanEval과 MBPP로 평가<ul>
<li>HumanEval은 OpenAI가 만든 python 코드 생성 벤치마크</li>
<li>MBPP는 간단한 Python 문제 모음</li>
</ul>
</li>
</ul>
</li>
<li>Popular Aggregated Results<ul>
<li>여러 분야를 한꺼번에 평가하는 종합 실험임<ul>
<li>MMLU(57개 과목 — 의학, 법학, 역사, 철학 등)</li>
<li>BBH(매우 어려운 추론 문제)</li>
<li>AGI Eval(LLM 종합 시험)</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/9360c94d-33c8-4db2-b903-f5c71db92629/image.png" alt=""></p>
<ul>
<li>Mixtral은 대부분 평가 지표에서 Llama 2 70B를 능가함<ul>
<li>특히, 코드 생성 과 수학 벤치마크에서 더 뛰어난 성능을 보였음</li>
</ul>
</li>
</ul>
<h4 id="size-and-efficiency">Size and Efficiency</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/4bf286d4-9a68-4d6b-a0b8-d131749b5a7c/image.png" alt=""></p>
<ul>
<li>Llama 2 계열 모델과 성능을 비교해서 Mixtral이 비용 대비 성능 측면에서 얼마나 효율적인지 분석함 (→ 즉, 같은 계산량이면 누가 더 성능이 좋을지)<ul>
<li>Sparse MoE 모델인 Mixtral은 모델 자체는 47B이지만, 토큰 하나를 처리할 때 13B Active 파라미터들만 사용<ul>
<li>Expert가 8개이지만, K=2로 실제 계산량은 13B정도</li>
</ul>
</li>
<li>또한, 이 분석은 계산량만 비교한 것<ul>
<li>추론 비용에는 계산량, 메모리, GPU 활용률 3가지 가 있는데, 여기서는 계산량만!</li>
</ul>
</li>
</ul>
</li>
<li>Mixtral은 13B만 계산하지만, GPU에는 47B를 올려야 하긴함<ul>
<li>Router가 어떤 Expert를 선택할지 모르기 때문임</li>
<li>그럼에도 Llama2의 70B보다는 메모리가 작긴함</li>
</ul>
</li>
<li>장치 활용 측면에서는 SMoE Layer는 Routing과 여러 Expert 실행 때문에 추가적인 오버헤드(본래 목적 외 추가적으로 드는 비용)를 발생시킴<ul>
<li>MoE는 Arithmetic Intensity가 높은 Batch 작업에 더 적합함(→ 토큰이 많을수록 더 효율적)</li>
</ul>
</li>
</ul>
<h4 id="comparison-with-llama-2-70b-and-gpt-35">Comparison with Llama 2 70B and GPT-3.5</h4>
<ul>
<li><p>대표적인 대형 오픈소스 모델인 Llama2 70B와 대표적인 폐쇄형 모델 GPT-3.5와 비교 진행</p>
<p> <img src="https://velog.velcdn.com/images/hyooo__s/post/d04b3f26-366e-4593-8684-3d82dff73f1b/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>결과를 보면, Mixtral이 70B Dense 모델과 GPT-3.5를 따라잡거나 넘어섰음을 볼 수 있음<ul>
<li>MMLU에서 Mixtral이 훨씬 작은 용량임에도 더 높은 성능을 보였음</li>
<li>MT-Bench 에서는 당시 사용가능한 최신 GPT-3.5-turbo-1106 성능과 비교함</li>
</ul>
</li>
</ul>
<h4 id="evaluation-differences">Evaluation Differences</h4>
<ul>
<li>같은 모델이라도 평가 방식이 조금만 달라져도 점수가 달라질 수 있음<ul>
<li>일부 벤치마크에서는 본 논문의 평가 프로토콜과 Llama2논문에서 사용한 프로토콜 사이에 차이가 있다<ul>
<li>MBPP에서는 hand-verified된 부분집합(subset)을 사용했음</li>
<li>TriviaQA에서는 위키피디아 문서를 제공하지 않았음</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="31-multilingual-benchmarks">3.1 Multilingual Benchmarks</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/637ed861-5ba1-417a-9415-c9ffb694b37a/image.png" alt=""></p>
<ul>
<li>Mistral 7B와 비교하여 사전학습 과정에서 다국어(multilingual) 데이터의 비중을 크게 늘렸음<ul>
<li>보통은 다국어를 많이 학습하게 되면 영어 성능이 조금 떨어질 수도 있지만, Mixtral의 경우에는 영어도 잘하고, 프랑스어, 독일어 등등 모두 잘했음<ul>
<li>왜그런가하면, Dense 모델의 경우에는 FFN 하나만 가지고 있지만, Mixtral의 경우에는 Expertrk 8개이므로 모델 전체 파라미터가 늘어나서임!</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="32-long-range-performance">3.2 Long Range Performance</h3>
<ul>
<li>Mixtral이 긴 문맥을 처리하는 능력을 평가하기 위해 <code>Passkey Retrieval</code> 이라는 테스트를 진행함<ul>
<li>32K Context는 30,000~40,000 단어 정도를 한 번에 읽을 수 있다는 의미인데, 읽는다고 해서 다 기억하는 건 아님 → 즉, 기억력을 테스트해봐야함</li>
<li><code>Passkey Retrieval</code>은 긴 프롬프트 안에서 무작위로 삽입된 Passkey를 모델이 찾아낼 수 있는지를 측정하기 위한 Synthetic task임</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/4be68e04-f712-424a-a554-a6e9bb647e1e/image.png" alt=""><img src="https://velog.velcdn.com/images/hyooo__s/post/79df333d-927c-480d-b237-8d5628dbc87e/image.png" alt=""></p>
<ul>
<li><p>Mixtral이 context의 길이나 passkey의 위치와 관계없이 100%정확도 달성(모두 초록색 1.0)</p>
<ul>
<li>passkey가 앞에 있어도, 뒤에 있어도 항상 다 찾아냄!</li>
</ul>
</li>
<li><p>Proof-Pile 데이터세트의 일부에서 Context 크기가 증가할수록 Mixtral의 <strong>Perplexity</strong>가 단조적으로 감소함</p>
<ul>
<li><p>즉, 문맥을 더 많이 보여줄수록 더 정확하게 다음 단어를 예측했다는 의미임</p>
<blockquote>
<p><strong>✓ Perplexity?</strong></p>
<ul>
<li>LLM이 다음 단어를 얼마나 잘 맞추는지를 측정하는 지표임</li>
<li>이는 작을 수록 좋은데,</li>
</ul>
<pre><code>| PPL | 의미 |
| --- | --- |
| 100 | 매우 나쁨 |
| 20 | 보통 |
| 10 | 좋음 |
| 5 | 매우 좋음 </code></pre></blockquote>
</li>
</ul>
</li>
</ul>
<h4 id="33-bias-benchmarks">3.3 Bias Benchmarks</h4>
<ul>
<li><p>파인튜닝하고 preference modeling을 통해 수정해야할 결함을 찾기 위해서 base 모델 성능을 BBQ와 BOLD 벤치마크에서 측정함</p>
<ul>
<li><p>BBQ는 사람이 직접 작성한 질문들로 이루어진 데이터세트이고,</p>
<p>  사회적으로 확인된 편향을 9개의 범주(나이, 장애 여부, 성 정체성, 국적, 외모, 인종/민족, 종교, 사회 경제적 지위, 성적 지향)에 대해 평가함</p>
</li>
<li><p>BOLD는 5개의 영역에서 편향을 평가하기 위한 23,679개의 영어 생성 프롬프트로 구성된 대규모 데이터세트임</p>
<p>  → BBQ는 <code>질문-답변</code> 구조인데, BOLD는 문장을 생성함</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>Mixtral과 Llama2를 Evaluation Framework를 사용하여 평가함</p>
<ul>
<li><p>BBQ의 경우, 점수가 높을수록 더 공정한 답변을 함</p>
</li>
<li><p>BOLD는 ① 평균 감성 점수 ② 표준편차를 활용함</p>
<ul>
<li><p>평균 감성점수는 높을수록 긍정적인 문장 생성</p>
</li>
<li><p>표준편차는 낮을수록 사람마다 비슷하게 대함</p>
<p>  → 예를 들어, 여성에 대해서는 항상 긍정적으로 말하고 남성에 대해서는 항상 부정적으로 말한다면 평균만 보면 판단하기 어려움. 때문에 그룹마다 얼마나 차이가 나는지도 측정함</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>결과적으로, Mixtral은 전체적으로 더 긍정적인 표현을 사용했고, 특정 집단만 특별히 다르게 대하지도 않았음</p>
</li>
</ul>
<hr>
<h2 id="4-instruction-fine-tuning">4. Instruction Fine-tuning</h2>
<ul>
<li><p>Mixtral-Instruct는 한 번에 만들어진 건 아니고 총 2단계로 학습 진행</p>
<ul>
<li><p><code>Instruction dataset</code>를 사용하여 <code>supervised fine-tuninig(SFT)</code>을 수행한 후,</p>
</li>
<li><p><code>Paired Feedback Dataset</code>을 사용하여 <code>Direct Preference Optimization(DPO)</code>을 적용하여 <code>Mixtral-Instruct</code>를 학습시킴</p>
<p>⇒ 사람이 작성한 좋은 예시를 따라 배우고(SFT), 그 다음에는 사람이 더 선호하는 답변을 선택하도록(DPO) 추가학습</p>
</li>
</ul>
</li>
<li><p>Mixtral-Instruct는 MT-Bench에서 8.30점을 기록햇고, 23년 12월 기준으로 가장 우수한 Open-Weights 모델이 됨</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/19931e67-86a0-4ce6-921b-06047e7f9650/image.png" alt=""></p>
<ul>
<li>LMSys라는 기관에서 평가를 진행했을 때, 다른 모델들보다 더 우수한 성능을 보였음</li>
</ul>
<hr>
<h2 id="5-routing-analysis">5. Routing analysis</h2>
<ul>
<li>본 절에서는 <strong>“Router가 도대체 어떤 기준으로 Expert를 고르는지”</strong><ul>
<li>특히 학습과정에서 일부 Expert가 특정 도메인(ex. 수학, 생물학, 철학 등)에 전문화되었는지를 확인하고자 함</li>
</ul>
</li>
<li>The Pile Validation Dataset의 여러 하위 데이터세트에서 선택된 Expert의 분포를 측정함<ul>
<li>0층, 15층, 31층을 분석함</li>
<li>transformer에서는 layer가 깊어질수록 표현이 바뀜<ul>
<li>layer0 → 거의 단어 자체</li>
<li>layer31 → 의미가 많이 반영된 표현</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/128a9d4d-0777-444f-97b2-112006f74e66/image.png" alt=""></p>
<ul>
<li><strong>⭐️ 결과적으론, 주제에 따라 Expert가 할당되는 명확한 패턴을 관찰하지는 못함 ⭐️</strong><ul>
<li>모든 Layer에서 ArXiv 논문, 생물학 문서, 철학 문서는 모두 비슷한 Expert분포를 보였음</li>
</ul>
</li>
</ul>
<blockquote>
<p> ⇒ <strong>❓ 그러면 어디에 특화된거지?</strong></p>
<ul>
<li>Expert분포는 DM Mathematics에서만 다르게 나타났음, 근데 차이가 그렇게 크진 않았음</li>
<li>수학이라서 생긴 차이라고 보진 않았고, 그냥 데이터세트가 인위적이라서로 판단</li>
<li>Expert분포의 경우에는 첫 번째 layer와 마지막 layer에서 특히 차이가 두드러졌음<ul>
<li>이 layer들의 hidden state는 각각 입력 임베딩과 출력 임베딩이 매우 높은 상관 관계를 갖기 때문<ul>
<li>layer0의 경우에는 거의 입력 단어 그 자체이고(DM Mathematics의 특이한 입력 구조가 그대로 반영됨)</li>
<li>layer 31의 경우에는 거의 출력 단어 직전 상태임(수학 토큰 같은 특수 출력이 반영됨)
  ⇒ 즉, 그 차이가 가장 잘 드러나는 위치가 맨 앞과 맨 뒤 층이라는 것
  ⇒ 이는 Router가 일정한 <strong>구문적 행동</strong>을 보인다는 것을 시사함</li>
</ul>
</li>
</ul>
</li>
<li>수학인지, 철학인지를 보는게 아니라 <strong>문법(구문)</strong>을 보고 있다는 것!!</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 왜 이런 결과가 나왔을까?</strong></p>
<ul>
<li><p>FFN은 문장을 이해하는 곳이라기보단, 각 토큰의 표현을 변환하는 곳임</p>
</li>
<li><p>도메인 정보의 경우에는 Attention에서 처리될 가능성이 존재함</p>
</li>
<li><p>즉, FFN(MoE)은 <strong>“이 토큰이 어떤 종류의 표현 반환을 필요로 하는가?”</strong>에 더 집중할 가능성이 있음</p>
<ul>
<li>식별자, 들여쓰기, 함수호출, 조사 및 관사 처럼 비슷한 구조를 가진 토큰은 서로 비슷한 변환이 필요할 수 있음</li>
<li>때문에 router가 구문적 특징을 기준으로 Expert를 선택하는 것이 자연스러운 결과라고 볼 수 있음</li>
</ul>
</li>
<li><p><strong>좀 더 자세히 설명해보자면~</strong></p>
<ul>
<li><p>Transformer</p>
<ul>
<li>하나의 layer에서는 input → multi-head self-attention → feed forward network(FFN) → output</li>
</ul>
</li>
<li><p>Mixtral</p>
<ul>
<li><p>Attention → MoE(=여러 Expert FFN)으로 바뀜</p>
<p>  ⇒ 즉, Attention은 FFN만 Expert 여러 개로 바뀐 것</p>
</li>
</ul>
</li>
<li><p>Attention은 토큰끼리의 관계를 보는 곳임 → 즉, 문맥, 의미, 토큰 간의 관계를 만드는 것이 <code>어텐션</code></p>
</li>
<li><p>반면, FFN은 토큰 하나를 독립적으로 변환하는 역할 → Attention이 끝나면 각 토큰은 이미 <code>cat → &quot;고양이 + 주변 문맥&quot;</code> 을 가지고 있음</p>
<p>  → FNN은 그래서 이 표현을 더 좋은 표현으로 바꾸는 역할을 함(벡터를 더 유용한 벡터로)</p>
<ul>
<li>입력이 <code>self</code> 라고 하면, Attention이후에는 “python 코드 안의 self” 라는 의미를 가지고 있는데, FFN은 이 벡터를 더 코드에 적합한 표현으로 변환하는 역할<ul>
<li>self → python 변수 → <strong>클래스의 인스턴스 변수</strong></li>
</ul>
</li>
</ul>
</li>
<li><p>그러면 왜 self를 항상 같은 Expert가 처리를 할까.</p>
<ul>
<li>router가 “python 코드다!!” 를 본게 아니라
”self라는 토큰은 항상 비슷한 표현 변환이 필요하네” 라고 학습했을 가능성이 있기 때문이다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 그런데, 논문을 보면 self, 들여쓰기 와 같은 토큰은 Expert로 가는데, dog나 biology처럼 의미를 담고 있는 단어들은 같은 Expert로 가지 않는다. 왜 그럴까?</strong></p>
<ul>
<li><p>일단 먼저, Router의 목표는 무엇일까?</p>
<ul>
<li><p>수학 → 수학 Expert라고 생각하지만, 실제로는 그렇지 않음</p>
</li>
<li><p>router은 도메인을 분류하는 모델이 아니다.</p>
<p>⇒ Router의 목표는 <strong>“이 ‘토큰’을 가장 잘 처리할 Expert가 누구인가”</strong></p>
</li>
<li><p>예를 들면, python 코드가 아래와 같이 있다고 하자.</p>
<blockquote>
<p>class Dog:</p>
<pre><code>def bark(self):
    print(&quot;멍&quot;)</code></pre></blockquote>
<p>  ⇒ Router는 문서전체를 보고 “이건 python이다.”라고 판단하지 않고, 대신 토큰 하나하나를 보는 편</p>
<ul>
<li><p><code>class</code> → 어떤 Expert?, <code>def</code> → 어떤 Expert? …</p>
</li>
<li><p>이때 <code>self</code> 를 보면, 역할이 거의 동일함(”현재 객체 자신”) → 때문에 표현을 변환하는 방식도 비슷</p>
<p>  ⇒ 그래서 Router의 입장에서는 self → 항상 Expert3으로 보내는 것이 학습하기 쉬울 것</p>
</li>
</ul>
</li>
<li><p>반면, dog와 같이 의미가 담긴 토큰이라면, dog과 hotdog는 같은 dog가 들어가더라도 전혀 다른 의미를 가지고 있음 ⇒ 때문에 항상 같은 Expert로 보낼 이유가 없음!!</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/b1e2eeb8-0f40-479a-8791-1ba4a31204a4/image.png" alt=""></p>
<ul>
<li><p>각 토큰은 자신이 선택된 Expert에 대응하는 배경색으로 표시되어 있음</p>
<ul>
<li><p>즉, Router가 실제로 어떤 토큰을 어떤 Expert로 보내는지에 대해 나와있음</p>
</li>
<li><p>python의 <code>self</code>, 영어의 <code>Question</code> 같은 단어가 여러 번 등장하더라도 같은 Expert로 라우팅됨을 보여줌</p>
<ul>
<li>이때, LLM은 단어(word)가 아닌 토큰(token)을 처리하는데, 이때 단어가 토크나이저에 의해 <code>Quest</code>/<code>ion</code> 처럼 2개 이상의 토큰으로 분리될 수도 있음에도 각 토큰들이 같은 Expert를 선택</li>
</ul>
</li>
<li><p>들여쓰기 토큰들도 항상 같은 Expert에 할당됨</p>
</li>
<li><p>연속된 토큰들도 종종 같은 Expert에 할당됨을 확인할 수 있었음</p>
<ul>
<li><p>토큰 하나만 같은 Expert가 아니라 옆에 있는 <strong>토큰들까지도 같은 Expert로 가능 경우</strong>도 있었음</p>
<p>  ⇒ <strong>Positional Locality</strong></p>
<blockquote>
<p><strong>✓ Positional Locality가 뭘까?</strong></p>
<ul>
<li><p>결과적으로 옆에 있는 토큰들이 같은 Expert를 선택하는 경우가 많았다는 관찰 결과임</p>
</li>
<li><p>본 논문에서는 왜 이런 현상이 나타났는지에 대해 나와있진 않고, 일반적인 연구자들의 해석은 어떻냐 하면!!</p>
<ul>
<li><p>문장이 <code>I am glad to be a BOAZ member.</code> 라고 하면, 토큰은 <code>I</code> <code>am</code> <code>glad</code> <code>to</code> <code>be</code> <code>a</code> <code>BOAZ</code> 가 됨</p>
</li>
<li><p>Attention을 거친 후에는 이 토큰들의 hidden state가 완전히 독립적이지 x</p>
<ul>
<li><p>glad는 am도 보고 to 도 보고 be도 봄.</p>
</li>
<li><p>a 도 be 를 보고 있음</p>
<p>  ⇒ 즉, 연속된 토큰들은 <strong>비슷한 문맥을 공유</strong>함</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>    ⇒ 그래서 **hidden state가 비슷하면** 선택되는 Expert도 비슷해질 가능성이 높아짐</code></pre></blockquote>
<blockquote>
<p><strong>✓ Positional Locality가 모델 성능 관점에 있어서도 괜찮을까?</strong></p>
<ul>
<li><p>같은 Expert만 사용하게 된다면 다양성이 떨어지면서 더 낮지 않을까 라는 생각을 했었음</p>
<ul>
<li><p>논문에서는 성능이 떨어진다는 증거는 없었음 오히려, 더 좋은 성능을 냄</p>
<p>  → 하지만, <strong>Router는 학습됨</strong> 즉, 성능이 떨어지면 역전파를 통해 Router의 가중체 $W_g$도 함께 수정됨</p>
</li>
</ul>
</li>
<li><p>시스템 측면에서는 장단점이 존재함</p>
<ul>
<li>같은 Expert를 계속 사용하면 GPU가 계속 같은 Expert를 실행하면됨<ul>
<li>Expert3 → Expert3 → Expert3 이렇게 되면 메모리나 캐시를 재사용하기 쉬워서 추론이 빨라질 수 있음</li>
</ul>
</li>
<li>반면, Expert Parallelism에서는 문제가 될 수 있음<ul>
<li>GPU마다 Expert 하나씩 있다고 할 때, 토큰 1000개가 모두 Expert3로만 가면 GPU3만 엄청 바빠지게 됨</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="6-conclusion">6. Conclusion</h2>
<ul>
<li>본 논문에서는 Mixtral 8x7B를 소개했음<ul>
<li>오픈소스 모델 중 SOTA 성능을 달성한 최초의 Mixture-of-Experts 네트워크</li>
<li>사람들이 평가한 벤치마크에서도 당시의 대표적인 상용 LLM보다 더 좋은 평가를 받았었음</li>
</ul>
</li>
<li>또한, Mixtral은 매 시점마다 2개의 Expert만 사용하기 때문에 토큰당 13B의 Active Parmeters만 사용하면서도, 토큰당 70B파라미터를 사용하는 기존 최고 모델(Llama2 70B)보다 더 뛰어난 성능을 달성함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[논문리뷰] OpenVLA:
An Open-Source Vision-Language-Action Model]]></title>
            <link>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-OpenVLAAn-Open-Source-Vision-Language-Action-Model</link>
            <guid>https://velog.io/@hyooo__s/%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-OpenVLAAn-Open-Source-Vision-Language-Action-Model</guid>
            <pubDate>Thu, 30 Jul 2026 04:23:08 GMT</pubDate>
            <description><![CDATA[<h2 id="overview">Overview</h2>
<blockquote>
<p><strong>논문명</strong>: OpenVLA: An Open-Source Vision-Language-Action Model
<strong>학회(출판연도)</strong>: IEEE International Conference on Robotics and Automation (ICRA 2025)
<strong>연구분야</strong>: Vision-Language-Action(VLA) 모델, 로봇 조작(Robot Manipulation), 멀티모달 로보틱스, 로봇 파운데이션 모델</p>
</blockquote>
<hr>
<h2 id="background">Background</h2>
<h3 id="vla의-등장-배경">VLA의 등장 배경</h3>
<ul>
<li>LLM(Large Language Model)<ul>
<li>GPT처럼 텍스트 → 텍스트를 처리하는 모델로 언어만 이해하고, 언어만 생성함<ul>
<li>입력: 고양이를 설명해줘 → 출력: 고양이는 포유류,,,</li>
</ul>
</li>
</ul>
</li>
<li>VLM(Vison-Language Model)<ul>
<li>이미지 + 텍스트 → 텍스트</li>
<li>CLIP, BLIP, LLaVA, GPT-4V</li>
<li>이미지를 이해할 뿐, 실제 행동까지는 x</li>
</ul>
</li>
<li>VLA(Vision-Language-Action)<ul>
<li>이미지 + 텍스트 → 행동</li>
</ul>
</li>
</ul>
<hr>
<h2 id="abstract">Abstract</h2>
<ul>
<li><p>기존에는 로봇에게 새로운 작업을 시킬 때마다 그 작업만을 위한 모델을 새롭게 학습했어야 했음</p>
<ul>
<li>하지만, 이미지-텍스트 데이터와 실제 로봇 데이터를 함께 학습한 대규모 VLA 모델이 있다면, 기존 모델을 파인튜닝하는 것만으로도 새로운 작업을 잘 수행하는 로봇을 만들 수 있지 않을까?</li>
</ul>
</li>
<li><p>하지만, 기존 로보틱스 분야에서 ① 대부분 비공개로 일반 연구자가 접근할 수 없고, ② 기존 연구는 새로운 작업에 대해 VLA를 효율적으로 fine-tuning하는 방법을 충분히 연구하지 않았었음</p>
<p>  ⇒ 이런 문제를 해결하기 위해 97만 개의 실제 로봇 시연 데이터로 학습된 70억(7B) 파라미터 규모의 오픈소스 VLA인 OpenVLA를 제안</p>
<ul>
<li>LLaMa2 언어 모델을 기반으로 하여, DINOv2와 SigLIP에서 사전 학습된 특징을 융합하는 시각 인코더를 결합한 구조임</li>
</ul>
</li>
<li><p>OpenVLA는 RT-2-X보다 훨씬 가볍고, 메모리도 적게 쓰는데 성능은 더 우수했음</p>
</li>
<li><p>여기에 더불어 OpenVLA를 새로운 환경에서 fine-tuning할 수 있음을 확인했고, 여러 객체가 포함된 다중 작업 환경에서도 뛰어난 일반화 성능과 언어 명령을 이해하는 능력도 굿굿!</p>
</li>
<li><p>거대 GPU가 아닌 일반 소비자용의 GPU로도 가능하다!</p>
</li>
</ul>
<hr>
<h2 id="1-introduction">1. Introduction</h2>
<ul>
<li><p>기존의 로봇 정책은 학습 데이터를 넘어서 일반화하는데에는 아쉬움이 있었음</p>
<ul>
<li>기존에는 물체의 위치나 조명이 조금 달라지는 경우에는 어느정도 대응을 할 수 있지만, 장면 속에 방해 요소나 새로운 물체가 등장, 혹은 이전에 보지 못했던 새로운 작업 명령을 받게 되면 성능이 크게 떨어졌음</li>
</ul>
</li>
<li><p>반면, 로보틱스 분야 밖의 CLIP, SigLIP, LLaMa2와 같은 비전 및 언어 파운데이션 모델 같은 경우에는 일반화 성능뿐 아니라, 그 이상의 능력도 갖추고 있음</p>
<ul>
<li>인터넷 규모의 사전 학습 데이터세트로 인한 사전 지식 덕분</li>
</ul>
</li>
<li><p>로보틱스 분야에서도 이러한 규모의 사전학습을 재현하면 좋겠지만, 로보틱스에서 가장 큰 데이터 세트인 로봇 조작에서도 10만~100만개 정도의 예제만 포함되어 있음</p>
<p>  ⇒ 그러면 이미 학습된 vision-language 파운데이션 모델을 핵심 구성 요소로 학습해보면 어떨까?</p>
</li>
<li><p>물론 기존에도 사전 학습된 언어모델과, vision-language 모델을 로봇 표현 학습에 활용하거나, 작업 계획 및 실행을 위한 모듈형 시스템의 구성 요소로 활용하긴 했었음</p>
<ul>
<li>즉 VLM은 단순 “설명”을 하고 실제 행동은 다른 모델이 담당</li>
</ul>
</li>
<li><p>최근에는 제어를 위해 VLA모델을 직접 학습하는데 사용</p>
<ul>
<li>PaLI같은 VLM을 직접 파인튜닝해서 로봇 제어 행동을 생성하고, 이를 통해 사전학습된 비전 및 언어 파운데이션 모델을 로보틱스에 직접 활용하는 방식</li>
<li>이렇게 인터넷 규모로 학습된 모델을 기반으로 하다보니, RT-2와 같은 VLA는 기존의 로봇보다 일반화 성능이 좋았음</li>
</ul>
</li>
<li><p>그러나 기존 VLA가 널리 활용되지 못하는 이유가 2가지 있음</p>
<ul>
<li>현재 모델의 대부분은 비공개이고, 모델 구조, 학습 방법, 데이터 구성에는 정보가 제한적</li>
<li>새로운 로봇, 환경, 작업에 VLA를 적용하고 적응시키는 방법, 특히 일반 소비자용 GPU와 같은 하드웨어에서의 적용 방법을 제시하지 않음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="2-related-work">2. Related work</h2>
<h4 id="visually-conditioned-language-models">Visually-Conditioned Language Models</h4>
<ul>
<li><p>입력 이미지와 언어 프롬프트로부터 자연어를 생성하도록 인터넷 규모의 데이터로 학습된 VLMs → 시각 질의응답(VQA)부터 객체 위치 추정(Object Localization)에 이르기까지 다양한 응용분야에서 활용됨</p>
<ul>
<li><p>최근 VLM의 발전을 이끈 핵심 요소 중 하나는 사전 학습된 비전 인코더의 특징과 사전 학습된 언어 모델을 연결하는 구조임!</p>
</li>
<li><p>초기 연구는 이미지와 텍스트를 연결하는 복잡한 구조를 많이 연구했었지만, 최근에는 더 단순한 방식이 주류가 됨 → <code>Patch-as-token</code></p>
<p>  ⇒ 이러한 방법을 사용해서 OpenVLA도 기존의 성능이 좋은 VLM을 가져와서 백본으로 활용할거임~!</p>
<ul>
<li>DINOv2(저수준 공간 정보) + SigLIP(고수준 의미 정보)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="generalist-robot-policies">Generalist Robot Policies</h4>
<ul>
<li>최근 로보틱스에서 다양한 로봇 데이터세트를 이용하여 여러 작업을 수행할 수 있는 <strong>범용 로봇 정책</strong>을 학습하는 방향으로 연구가 진행되고 있음<ul>
<li>기존 범용 로봇 정책 <code>Octo</code> 도 유연하게 새로운 환경에서도 파인튜닝 가능했었음</li>
</ul>
</li>
<li>다만, 기존 연구와 OpenVLA의 핵심적인 차이는 모델 구조<ul>
<li>기존의 연구: 여러 사전학습 모듈을 조합한 뒤 새로운 모듈을 추가하여 학습</li>
<li>OpenVLA: 직접 파인튜닝해서 로봇 행동 생성</li>
</ul>
</li>
</ul>
<h4 id="vision-language-action-models">Vision-Language-Action Models</h4>
<ul>
<li>여러 연구에서 VLM을 로봇에 활용하고 있었음(시각 상태 표현, 객체 검출, 고수준 계획, 피드백 신호 등)<ul>
<li>하지만, 복잡한 구조 또는 정밀하게 보정된 카메라를 필요로 했었음</li>
</ul>
</li>
<li>VLA란, 기존에는 <code>image → text</code> 였다면, 이제는 <code>image → action</code> 로 바뀐 것을 의미한다. 즉 로봇 제어 행동을 VLM 백본에 통합함</li>
</ul>
<p>⇒ VLA의 장점</p>
<ul>
<li>이미지와 언어가 이미 인터넷 규모에서 잘 정렬되어 있다.</li>
<li>VLM 구조를 그대로 사용한다.</li>
<li>VLM이 발전하면 VLA도 자동으로 발전한다.</li>
</ul>
<hr>
<h2 id="3-the-openvla-model">3. The OpenVLA Model</h2>
<ul>
<li><p>OpenVLA</p>
<ul>
<li>Open X-Embodiment 데이터세트의 97만 개 로봇 시연으로 학습된 70억 파라미터 규모의 VLA 모델</li>
</ul>
</li>
<li><p>VLA 모델을 개발할 때, 최적의 방법에 대해서 아직 충분히 연구되지 않은 질문들이 존재함</p>
<ul>
<li><p>어떤 모델의 백본? 어떤 데이터세트? 어떤 하이퍼 파라미터?</p>
<p>  → VLA가 새로운 분야라서 아직 명확한 기준이 없다</p>
</li>
</ul>
</li>
</ul>
<h3 id="31-preliminaries-vision-language-models">3.1 Preliminaries: Vision-Language Models</h3>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/1277450b-ebe4-4952-8fee-dbd8854da9be/image.png" alt=""></p>
<ul>
<li><p>VLM의 구조</p>
<ul>
<li><p>이미지를 여러개의 <strong>이미지 패치 임베딩</strong>으로 변환하는 <code>Visual encoder</code></p>
<ul>
<li>대표적으로는 CLIP, DINOv2, SigLIP</li>
</ul>
</li>
<li><p>Visual Encoder의 출력을 언어 모델의 입력 공간으로 변환하는 <code>Projector</code></p>
<ul>
<li>visual encoder와 llm의 사용하는 feature 공간이 다르기때문에 맞춰주기 위한 목적</li>
</ul>
</li>
<li><p><code>LLM 백본</code></p>
<ul>
<li>Llama2가 이미지 정보를 포함하여 텍스트 생성</li>
</ul>
<p>⇒ VLM 학습 과정에서 모델 전체가 End-to-End 방식으로 학습 + 인터넷에서 수집한 이미지 - 텍스트 쌍을 이용하여 다음 텍스트 토큰을 예측하는 목적 함수로 사용</p>
</li>
</ul>
</li>
<li><p>본연구에서는 <code>Prismatic-7B</code> VLM 기반(backbone)으로 사용</p>
<ul>
<li><p>Prismatic-7B</p>
<ul>
<li><p>표준 VLM 구조를 따름</p>
<ul>
<li>600M 파라미터의 Visual Encoder</li>
<li>2층 MLP Projector</li>
<li>7B Llama2 Backbone</li>
</ul>
</li>
<li><p>다른 점은 두 부분으로 구성된 비주얼 인코더를 사용하며, SigLIP, DinoV2를 함께 사용함</p>
<ul>
<li><p>입력 이미지 패치는 각각 두 인코더를 통과하여 생성된 feature를 채널 방향으로 concatenate함</p>
</li>
<li><p>일반적으로는 CLIP 또는 SigLIP 1개만 비주얼 인코더로 사용을 하는데, DINOv2를 추가함으로써 공간적 추론 향상 가능</p>
<blockquote>
<p><strong>✓ DINOv2를 추가하면 왜 공간적 추론 향상?</strong></p>
<ul>
<li>물체가 어디에 있는지, 얼마나 떨어져 있는지와 같은 공간정보를 잘 표현하기 때문</li>
<li>로봇은 단순이 “컵이다”를 아는 것보다는 “컵이 왼쪽으로 15cm 있다”를 아는 것이 더 도움이 되기 때문이다.</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
<li><p>사전 학습된 SigLIP, DinoV2, Llama2를 사용</p>
</li>
<li><p>또한, 단순히 Llama2와 DINOv2를 연결한게 아니라 LLaVA 1.5에서 사용한 약 100만 개의 이미지-텍스트, 텍스트 전용 샘플을 활용하여 파인튜닝 진행</p>
<blockquote>
<p><strong>✓ 학습 과정을 조금 더 상세히 말하자면</strong></p>
<p>[ <code>Llama2(인터넷 텍스트)</code> + <code>SigLIP(인터넷 이미지-텍스트)</code> + <code>DINOv2(인터넷 이미지)</code> ] → Prismatic (LLaVA 1.5 데이터로 파인튜닝) → OpenVLA (Open X-Embodiment의 97만 개 로봇 시연 데이터로 다시 파인튜닝)</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="32-openvla-training-procedure">3.2 OpenVLA Training Procedure</h3>
<ul>
<li><p>OpenVLA를 학습하기 위해 사전학습된 Prismatic-7B VLM 백본을 로봇 행동 예측을 하도록 파인튜닝 진행</p>
</li>
<li><p>행동 예측 문제를 Vision-Language 문제로 정의</p>
<ul>
<li>입력 이미지 + 자연어 작업 지시 → 예측된 로봇 행동을 문자열로 출력하도록</li>
<li>즉, 로봇 행동도 하나의 “문장”처럼 생성하도록 함</li>
</ul>
</li>
<li><p>LLM이 로봇 행동을 예측할 수 있도록 연속적인 로봇 행동을 언어 모델의 토크나이저가 사용하는 이산 토큰으로 변환(256개의 bin 중 하나로, 1~99% 범위만)</p>
<ul>
<li><p>LLM은 원래 “apple”, “robot”과 같은 단어(token)만 출력할 수 있는데, 로봇의 행동은 x=0.43, y=-0.12와 같이 실수로 되어 있다</p>
</li>
<li><p>즉, 이 실수를 토큰으로 바꾸는 과정이 필요한 것!</p>
<p>  → <code>0.73</code>이라는 값을 <code>Token #182</code>처럼 바꿔 출력함</p>
</li>
</ul>
</li>
<li><p>(P)그런데, Llama 토크나이저가 새롭겍 추가할 수 있는 스페셜 토큰을 100개만 제공을 하는데, Action을 표현하기 위해서는 256개의 토큰이 필요한 것!</p>
<p>  → (S) 가장 사용 빈도가 낮은 256개의 토큰을 Action Token으로 덮어씀</p>
<ul>
<li>즉, 새로운 토큰을 만드는대신, 거의 사용하지 않는 토큰을 action 토큰으로 교체</li>
<li>이렇게 행동 토큰 시퀀스로 변환되면, OpenVLA는 다음 토큰 예측 방식으로 학습 진행 (loss도 Action 토큰 내에서만 계산)<ul>
<li>즉, 학습 방식은 GPT와 동일한데, text token을 맞추는 것이 아닌 action token을 맞추도록 학습한다는 점이 다른 점!</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="33-training-data">3.3 Training Data</h3>
<ul>
<li><p>OpenVLA 학습 데이터의 목표</p>
<ul>
<li><p>다양한 로봇 종류</p>
</li>
<li><p>다양한 장면</p>
</li>
<li><p>다양한 작업 을 포함하는 것</p>
<p>⇒ 하나의 로봇만 학습하게 되면 다른 로봇에서는 잘 작동하지 않기 때문에 최대한 다양한 데이터를 활용하려고 했음(Franka, WidowX, Google Robot)</p>
</li>
</ul>
</li>
<li><p>Open X-Embodiment(OpenX)를 기반 데이터세트로 사용</p>
<ul>
<li>70개 이상의 로봇 데이터세트</li>
<li>200만개 이상의 로봇 trajectory를 포함</li>
</ul>
</li>
<li><p>위 데이터세트를 여러 단계에 걸쳐 정제를 진행했는데, 데이터 정제의 목표에는</p>
<ul>
<li><p>모든 데이터가 같은 입력과 출력 형식을 갖도록</p>
</li>
<li><p>특정 작업만 너무 많지 않도록 데이터를 균형 있게 2가지가 있음</p>
<ul>
<li><p>Manipulation 데이터세트만 사용, Third-person Camera, Single-arm End-effector Control을 사용하는 데이터만 선택</p>
<p>→ 데이터 균형을 맞추기 위해서 Octo에서 사용한 Mixture Weight를 활용함</p>
</li>
<li><p>데이터가 너무 많은 데이터세트는 비중을 줄이고, 다양성이 높은 데이터세트는 비중을 높이는 방식</p>
</li>
</ul>
</li>
</ul>
</li>
<li><p>추가적으로 DROID 데이터세트도 10% 비율로 실험했지만, 학습 과정에서 Acition Token 정확도가 낮게 나타났음</p>
</li>
</ul>
<h3 id="34-openvla-design-decisions">3.4 OpenVLA Design Decisions</h3>
<ul>
<li>OpenVLA 모델을 개발하는 과정에서 바로 거대한 OpenVLA를 학습한 것이 아닌 먼저 작은 규모의 실험을 반복하며 어떤 설계가 가장 좋을지를 확인해봄<ul>
<li>계산 비용을 줄이고 실험 속도를 높이기 위해 OpenX 데이터세트 전체를 활용하는 대신 BridgeDataV2에서 OpenVLA를 학습하고 평가함</li>
</ul>
</li>
</ul>
<h4 id="vlm-backbone">VLM Backbone</h4>
<ul>
<li><p>Prismatic외에도 IDEFICS-1과 LLaVA를 로봇 행동 예측에 파인튜닝해 봄</p>
<ul>
<li><p>두 모델 모두 물체가 하나만 있는 작업에서는 비슷한 성능을 보였음</p>
</li>
<li><p>여러 물체가 있는 경우에는 LLaVA가 좀 더 뛰어난 언어 grounding 성능을 보임</p>
<p>  ⇒ 언어-객체 연결에서 LLaVA가 더 뛰어났다는 뜻</p>
</li>
</ul>
</li>
<li><p>BridgeData V2의 5개 언어 이해 작업에서 LLaVA가 IDEFICS-1보다 평균 35% 높은 절대 성공률 기록함</p>
</li>
<li><p>파인튜닝된 Prismatic은 이러한 LLaVA보다도 10% 높은 절대 성공률 기록!</p>
<p>  → SigLIP과 DINOv2를 함께 사용하는 구조라서 공간 추론 능력이 더 좋아서라고 판단</p>
<p>  +) Prismatic은 코드 구조가 모듈화 되어 있고 사용하기 쉬워서 최종적으로 선택</p>
</li>
</ul>
<h4 id="image-resolution">Image Resolution</h4>
<ul>
<li><p>입력 이미지 해상도는 학습 계산량에 큰 영향을 미침</p>
<ul>
<li>해상도가 높을수록 패치 토큰이 많아지고 context 길이가 증가해서 계산량이 제곱으로 증가</li>
</ul>
</li>
<li><p>실험결과, 224x224와 384x384 해상도를 비교했지만, 성능 차이는 없었음</p>
<p>  → 즉, 해상도를 높이더라도 큰 차이가 없었다는 뜻</p>
<p>  (로봇의 경우, “뭐가 있다”가 중요하지 해상도가 크게 중요하지 않다)</p>
</li>
</ul>
<h4 id="fine-tuning-vision-encoder">Fine-Tuning Vision Encoder</h4>
<ul>
<li><p>VLM 연구에서 Vision Encoder를 고정하는 것이 더 좋은 성능을 내는 경우가 많아서 보통을 이 부분은 잘 건들이진 않음</p>
<ul>
<li><p>그런데, VLA의 경우, Vision Encoder를 같이 학습하는 게 좋은 성능을 내는데에 있어 중요하다는 것을 발견함</p>
<blockquote>
<p><strong>✓ 왜 그럴까?</strong></p>
<ul>
<li>인터넷에서 학습한 Vision Encoder는 “고양이”, “자동차”와 같은 일반적인 특징은 잘 알지만,</li>
<li>로봇의 경우에는 “컵 손잡이 위치”, “집을 부분”, “미세한 거리” 이런 정보들이 더 중요하기 때문에 로봇 데이터에 맞게 다시 학습해야한다는 것</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<h4 id="training-epochs">Training Epochs</h4>
<ul>
<li><p>일반적은 LLM과 VLM의 경우, 1-2epoch 정도만 학습 진행</p>
<p>  ↔ VLA는 훨씬 많은 epoch 필요, Action Token 정확도가 95% 넘을 때까지 실제 로봇 성능이 계속 향상되었음 (최종적으로는 27epoch 학습)</p>
</li>
</ul>
<h4 id="learning-rate">Learning Rate</h4>
<ul>
<li>여러 Learning Rate를 실험한 결과 2x10^(-5)가 가장 좋은 성능을 보였음</li>
<li>또한 대부분의 Transformer는 초기에 Warmup을 사용하지만 OpenVLA에서는 필요하지 않았음</li>
</ul>
<h3 id="35-infrastructure-for-training-and-inference">3.5 Infrastructure for Training and Inference</h3>
<ul>
<li><p>학습시</p>
<ul>
<li>64개의 NVIDA A100 GPU로 14일동안 학습</li>
<li>총 21,500 A100 GPU-hours 사용됨</li>
</ul>
</li>
<li><p>추론시</p>
<ul>
<li><p>bfloat16으로 약 15GB GPU 메모리가 필요하며, RTX 4090에서 6Hz로 동작</p>
<p>  (학습은 고성능의 컴퓨팅 자원이 필요하지만, 실행에 있어서는 일반적인 GPU에서도 ok)</p>
</li>
<li><p>양자화를 적용하면 메모리 사용량을 더 줄일 수 있고, 로봇 성능도 유지됨</p>
<blockquote>
<p><strong>✓ 왜 양자화를 하는걸까?</strong></p>
<ul>
<li><p>“양자화”라고 하면 물리학에서 쓸 법한 용어같지만, 딥러닝에서는 <strong>모델을 더 작고 빠르게 만드는 압축 기술</strong>이라고 할 수 있음</p>
</li>
<li><p>먼저, OpenVLA의 경우에는 70억 개의 파라미터를 가지 모델임
→ 즉, 파라미터 하나하나가 숫자인데, 이런 숫자들이 70억개 있다고 보면 됨. 이 숫자들을 저장해야하니까 모델은 엄청 커질 수 밖에 없는 상황</p>
<ul>
<li>이때, 숫자를 32bit(float32)로 저장하게 된다면, 0.123456789 처럼 소수점을 굉장히 자세히 저장하게 되는데,</li>
<li>실제로는 0.12만 저장해도 성능 차이가 거의 없는 경우가 많음</li>
</ul>
<p>⇒ 그래서 “굳이 이렇게 정밀하게 저장할 필요가 있을까?” 라는 생각에서 나온 것이 <strong>양자화</strong></p>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ 양자화의 정의</strong></p>
<ul>
<li><p>연속적이고 정밀한 숫자를 더 적은 비트로 표현하는 기술</p>
<ul>
<li>즉, 숫자 표현을 더 단순하게 만드는 것</li>
</ul>
</li>
<li><p>OpenVLA의 경우,</p>
<ul>
<li><p>70억 파라미터를</p>
<ul>
<li><p>float32로 표현했을 때, 32bit ≈ 28GB</p>
</li>
<li><p>float16 ≈ 14GB</p>
</li>
<li><p>int4 ≈ 3.5GB</p>
<p>와 같이 양자화를 진행하게 되면 GPU 메모리를 거의 절반 이하로 줄일 수 있다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
<hr>
<h2 id="4-the-openvla-codebase">4. The OpenVLA Codebase</h2>
<ul>
<li><p>VLA 모델을 학습하기 위한 모듈형 PyTorch 코드베이스 공개: <a href="https://openvla.github.io/">https://openvla.github.io/</a></p>
<ul>
<li><p>본 코드베이스는 단일 GPU에서 VLA 파인튜닝부터 여러 노드의 GPU 클러스터에서 수십억 파라미터를 가진 VLA를 학습하는 것까지 확장 가능함</p>
</li>
<li><p>또한 대규모 transformer 모델 학습을 위한 최신 기술인 Automatic Mixed Precision(AMP), FlashAttention, Fully Sharded Data Parallelism(FSDP)을 지원함</p>
<blockquote>
<p><strong>✓ AMP(Automatic Mixed Precision)?</strong></p>
<ul>
<li><p>자동 혼합 정밀도 학습</p>
<ul>
<li><p>기존에는 <code>Float32</code>만 사용을 했는데, AMP의 경우에는 <code>Float32</code>+<code>Float16(BF16)</code>를 자동으로 섞어서 사용</p>
</li>
<li><p>즉, 필요한 계산은 32bit로, 덜 중요한 계산은 16bit로 자동 처리하는 기술임</p>
<p>→ GPU 메모리 절약, 학습속도 증가, 성능은 거의 유지됨</p>
</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ FlashAttention?</strong></p>
<ul>
<li>Transformer에서 가장 많은 계산을 차지하는 부분이 <strong>Attention 연산</strong> 부분<ul>
<li>FlashAttention은 이 Attention을 더 효율적으로 계산하는 알고리즘임</li>
</ul>
</li>
</ul>
</blockquote>
<blockquote>
<p><strong>✓ FSDP(Fully Sharded Data Parallelism?</strong></p>
<ul>
<li><p>대형모델은 GPU 한 장에 모두 올릴 수 없는 경우도 많음</p>
<p>  → 그래서 FSDP는 모델을 여러 GPU에 조각을 내어 나누고 저장하고 학습하는 기술임</p>
<ul>
<li>GPU1 → 모델 1/4, GPU2 → 모델 1/4, …  이렇게 나누어 저장한 후 필요할 때만 데이터를 주고 받으며 학습!</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>그리고 해당 코드베이스는 기본적으로 별도의 추가 작업없이, OpenX 데이터세트로 바로 학습을 시작할 수 있고, Hugging Face의 AutoModel 클래스와 통합되어 있어서 쓰기에 용이함</p>
<p>  +) LoRA 파인튜닝과 양자화된 모델 추론도 지원</p>
</li>
</ul>
<hr>
<h2 id="5-experiments">5. Experiments</h2>
<ul>
<li>실험 평가 목표는<ul>
<li>OpenVLA가 추가 학습 없이 학습 직후 그래도 사용해도 잘 동작하는지?</li>
<li>새로운 환경에서 조금만 파인튜닝하면 더 잘 적응하는지?</li>
</ul>
</li>
<li>그래서 아래의 3가지 연구 질문을 검증하고자 함<ul>
<li>여러 로봇과 다양한 일반화 상황에서 평가했을 때, OpenVLA는 기존 범용 로봇 정책과 비교했을 때 어떠한 성능을 보이는지<ul>
<li>RT-2, Octo, RT-1</li>
</ul>
</li>
<li>OpenVLA는 새로운 로봇 환경과 작업에 효과적으로 파인튜닝될 수 있는지, 그리고 imitation learning 방법과 비교했을 때 어떤 성능을 보이는지<ul>
<li>Diffusion Policy, Octo Fine-tuning</li>
</ul>
</li>
<li>적은 GPU에서도 사용 가능한가?, 성능과 계산량 사이에서 어떤 트레이드 오프가 존재하는가?<ul>
<li>즉, LoRA와 Quantization을 사용했을 때 성능이 얼마나 유지되고, GPU 사용량은 얼마나 줄어드는지를 확인하고자 함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="51-direct-evaluations-on-multiple-robot-platforms">5.1 Direct Evaluations on Multiple Robot Platforms</h3>
<h4 id="robot-setups-and-tasks">Robot Setups and Tasks</h4>
<ul>
<li><p>추가학습없이 여러 로봇에서 얼마나 잘 동작하는지 평가하기 위함</p>
</li>
<li><p>OpenVLA의 out-of-the-box 성능을 두 가지 로봇 플랫폼(robot embodiments)에서 평가</p>
<ul>
<li><p>BridgeData V2의 WidowX 로봇</p>
</li>
<li><p>RT-1 및 RT-2에서 사용된 Google Robot</p>
<blockquote>
<p><strong>✓ 여기서 robot embodiments는?</strong></p>
<ul>
<li><p>단순 로봇이라는 의미가 아니라 <strong>“로봇의 물리적 형태와 하드웨어 구조 전체”</strong>를 의미함</p>
<ul>
<li><p>WidowX → 작은 로봇 팔</p>
</li>
<li><p>Google Robot → 이동 가능한 모바일 매니퓰레이터</p>
<p>  는 서로 다른 embodiment임</p>
<p>  ⇒ 즉, 하나의 모델이 서로 다른 하드웨어에서도 잘 동작하는지를 확인하려는 것</p>
</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>본 플랫폼 2개에서 다양한 일반화 능력을 평가할 수 있도록 포괄적인 평가 작업들을 구성함</p>
<ul>
<li>시각적 일반화<ul>
<li>훈련 때 보지못했던 배경, 방해 물체, 물체 색깔, 물체 외형에서도 잘 동작하는지</li>
<li>예를 들어 훈련 때에는 빨간 컵만 봤었는데 테스트에서 파란 컵이 나와도 집을 수 있는지를 평가함</li>
</ul>
</li>
<li>동작 일반화<ul>
<li>훈련 때와 다른 위치에 물체가 있어도 잘 집는가</li>
<li>예를 들어, 훈련때에는 컵이 가운데에 있었는데 테스트 때에는 컵이 오른쪽에 있다고 해도 잘 집을 수 있는지 평가</li>
</ul>
</li>
<li>물리적 일반화<ul>
<li>훈련에서 보지 못한 크기, 모양의 물체도 잘 다룰 수 있는지를 평가</li>
<li>학습 때는 작은 컵만 봤었는데 테스트에서 큰 컵이 나왔을 때에도 집을 수 있는지 평가</li>
</ul>
</li>
<li>의미적 일반화<ul>
<li>훈련때 없는 새로운 물체, 명령, 인터넷 개념도 이해하는지</li>
<li>훈련때 <code>바나나</code>가 없었는데, 명령어가 <code>바나나를 집어라</code> 라고 했을 때에도 수행할 수 있는지
→ VLM의 사전지식 사용</li>
</ul>
</li>
</ul>
</li>
<li><p>또한, 여러 개의 물체가 있는 장면에서 사용자의 프롬프트에 지정된 올바른 물체를 조작할 수 있는지도 평가 → <code>언어 조건 능력 측정</code></p>
<ul>
<li><p>그러니까 책상위에 빨간컵, 파란컵, 초록컵이 있을 때 명령어가 “빨간 컵을 집어” 라고 하면 정말 빨간색 컵만 집는지를 확인</p>
<p>⇒ 전체적으로 BridgeData V2에서는 17개의 작업 x 10번의 시도 = 170회 rollout, Google Robot에서는 12개의 작업 x 5번의 시도 = 60회의 rollout으로 각 방법을 평가함</p>
<blockquote>
<p><strong>✓ Rollout이란?</strong></p>
<ul>
<li>강화학습과 로봇분야에서 하나의 작업을 처음부터 끝까지 실제 수행한 한 번의 실행을 의미함</li>
<li>예를 들어, “컵을 집어서 상자에 넣어”라고 하면,<ul>
<li><code>카메라 입력 → 컵 탐색 → 컵 집기 → 상자로 이동 → 놓기 → 종료</code> 이 전체 과정에 1rollout</li>
</ul>
</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>평가는 모두 A/B 평가 방식으로 수행되었고, 공정한 비교를 위해 동일한 작업(task)과 동일한 초기 로봇 및 물체 상태를 사용</p>
<blockquote>
<p><strong>✓ A/B Evaluation?</strong></p>
<ul>
<li><p>같은 환경에서 모델 A와 모델 B를 직접 비교하는 평가 방식</p>
<p> <img src="https://velog.velcdn.com/images/hyooo__s/post/df0d2041-2693-4f29-b946-007fabbeea0e/image.png" alt=""></p>
</li>
</ul>
</blockquote>
</li>
</ul>
<h4 id="comparisions">Comparisions</h4>
<ul>
<li>OpenVLA를 기존의 3가지 범용 조작 정책과 비교함<ul>
<li>RT-1-X, RT-2-X, Octo</li>
</ul>
</li>
<li>RT-1-X(3,500만 파라미터) &amp; Octo(9,300만 파라미터)<ul>
<li>OpenX 데이터세트 일부를 이용하여 처음부터 학습된 Transformer기반 정책</li>
<li>Octo는 오픈소스 조작 정책 중 SOTA</li>
</ul>
</li>
<li>RT-2-X(550억 파라미터)<ul>
<li>사전학습된 Vision 및 Language Backbone을 사용하는 SOTA의 비공개 VLA</li>
</ul>
</li>
</ul>
<h4 id="실험결과"><strong>[실험결과]</strong></h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/216f1987-6f75-498c-96cc-9ff950d53d73/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/34384eb3-7621-4ee7-89ee-29b3e0e50cc9/image.png" alt=""></p>
<ul>
<li>RT-1-X와 Octo는 복잡한 환경(방해 물체가 존재할 때)에서 성능이 많이 떨어졌음<ul>
<li>기존 논문보다 더 어려운 task로 진행했기 때문에, 인터넷 사전학습을 사용하지 않은 모델이 성능이 낮게 나타나는 것은 당연하다</li>
</ul>
</li>
<li>반면, 인터넷 사전학습된 RT-2-X는 위 두 모델보다 훨씬 뛰어난 성능을 보였음</li>
<li>특히, OpenVLA는<ul>
<li>GoogleRobot 평가에서 RT-2-X와 비슷한 성능</li>
<li>BridgeData V2에서는 RT-2-X보다 훨씬 뛰어난 성능</li>
<li>그럼에도 불구하고 모델크기는 7B/55B로 약 1/10 수준!</li>
</ul>
</li>
</ul>
<h4 id="qualitative-results">Qualitative Results</h4>
<ul>
<li><p>단순 성공률뿐만 아니라 행동 자체도 RT-2-X와 OpenVLA는 다른 모델들보다 훨씬 안정적인 행동을 보임</p>
<ul>
<li>방해 물체가 있어도 올바른 물체에 접근하고,</li>
<li>목표 물체의 방향에 맞게 로봇의 말단을 적절히 회전시키며</li>
<li>물체를 불안정하게 집었을 경우에도 이를 다시 잡는 행동을 수행함</li>
</ul>
</li>
<li><p>RT-2-X는 Semantic Generalization 작업에서는 더 높은 성능을 보임</p>
<ul>
<li><p>즉, 새로운 개념을 이해하는 능력은 RT-2-X가 조금 더 좋더라~~</p>
<p>  ⇒ RT-2-X가 더 큰 규모의 인터넷 사전 학습 데이터를 사용했고, 로봇 데이터뿐 아니라 인터넷 데이터도 같이 사용해서 사전학습을 더 잘 유지했을 것이라고 예상</p>
</li>
</ul>
</li>
<li><p>하지만, 그래도 OpenVLA는 나머지 모든 작업에 있어서 BridgeData V2와 Google Robot 모두 RT-2-X와 비슷하거나 더 뛰어난 성능을 보였음</p>
<ul>
<li><p>그 이유로는</p>
<ul>
<li><p>더 많은 학습 데이터(로봇)</p>
</li>
<li><p>더 깨끗한 데이터
→ Bridge Dataset에 있는 All-zero Actions를 제거함</p>
<blockquote>
<p><strong>✓ All-zero Action</strong></p>
<ul>
<li>예를 들어, 로봇 Action이 [0,0,0,0,0,0,0] 이면, 아무것도 하지 않는 건데, 이런 데이터가 많게 되면 모델은 “가만히 있는 것이 정답”이라고 잘못 학습할 수 있게 됨</li>
<li>그래서 이걸 제거해서 데이터 품질을 높였다고 할 수 있음</li>
</ul>
</blockquote>
</li>
<li><p>더 좋은 Vision Encoder
→ OpenVLA는 SigLIP + DINOv2 함께 사용</p>
<p> 즉, Semantic 정보와 Spatial 정보를 동시에 활용하여 로봇 제어에 유리</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="52-data-efficient-adaptation-to-new-robot-setups">5.2 Data-Efficient Adaptation to New Robot Setups</h3>
<ul>
<li><p>기존 연구들은 주로 VLA를 추가 학습 없이(out-of-the-box) 평가하는데 집중
→ 우리는 새로운 로봇 환경에 대한 효과적인 파인튜닝에 대한 연구를 진행함</p>
<ul>
<li>즉 쉽게 말해 OpenVLA가 Google Robot으로 학습되었지만, 실제 사용자는 Franka Robot을 사용할 수도 있음. 때문에 새로운 로봇에 얼마나 쉽게 적응하는지가 중요한 것!</li>
</ul>
</li>
<li><p>OpenVLA에 대해 간단한 파인튜닝 방식을 사용</p>
<ul>
<li>즉 <strong>모든 모델 파라미터를 대상</strong>으로 목표대상에 대한 <strong>10-150개 시연</strong>만을 사용하여 학습</li>
</ul>
</li>
<li><p>OpenVLA를 2가지 환경에서 평가함</p>
<ul>
<li><p>Franka-Tabletop</p>
<ul>
<li><p>고정된 테이블 위에 설치된 Franka Emika Panda 7자유도(7-DoF, 7개의 관절) 로봇 팔</p>
<p>  → 움직이지 않는 일반적인 연구실 로봇</p>
</li>
</ul>
</li>
<li><p>Franka-DROID</p>
<ul>
<li>최근 공개된 DROID 데이터세트에서 사용된 Franka 로봇 환경으로 이동 가능한 책상 위에 설치되어 있음</li>
</ul>
<p>⇒ 각 환경은 5Hz와 15Hz의 non-blocking controller 사용</p>
</li>
</ul>
</li>
</ul>
<h4 id="comparisons">Comparisons</h4>
<ul>
<li><p>OpenVLA와 현재 SOTA인 imitation learning 방법인 Diffusion Policy와도 비교 진행</p>
<ul>
<li>공정한 비교를 위해서 입출력 조건도 맞춘 버전으로 진행</li>
</ul>
</li>
<li><p>또한 파인튜닝을 지원하는 범용 정책인 Octo도 동일한 데이터로 파인튜닝하여 비교 진행</p>
<ul>
<li>동일 데이터세트로 OpenVLA 파인튜닝해서 이를 OpenVLA라고 표기</li>
</ul>
</li>
<li><p>마지막 Ablation 실험으로 OpenX로 사전학습된 OpenVLA 대신 Prismatic VLM을 바로 파인튜닝한 모델과도 비교 진행</p>
<ul>
<li><p>Prismatic → 새작업 → OpenVLA Sacratch</p>
</li>
<li><p>Prismatic → OpenX 학습 → OpenVLA → 새 작업</p>
<p>  ⇒ 이렇게 비교 진행 — “OpenX 사전 학습이 도움이 되는가?”</p>
</li>
</ul>
</li>
</ul>
<h4 id="results">Results</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/756792aa-c422-4f4d-b284-749f2d630124/image.png" alt=""></p>
<ul>
<li>두 가지 Diffusion Policy는<ul>
<li>&quot;Put Carrot in Bowl&quot;, &quot;Pour Corn into Pot&quot; 와 같은 단일 명령의 작업에서는 Octo와 OpenVLA보다 경쟁력이 있거나 더 우수한 성능을 보였음</li>
</ul>
</li>
<li>하지만, 여러 물체가 존재하고 언어 조건이 복잡한 작업에 있어서는 사전학습된 범용 정책(OpenVLA, Octo)이 더 좋은 성능을 보였음<ul>
<li>또한 OpenX로 사전학습하지 않은 OpenVLA Scratch에서도 낮은 성능을 보였음</li>
<li>OpenVLA가 모든 평가 작업에서 최소 50%이상의 성공률을 달성한 유일한 방법이었음</li>
<li>섬세한 작업에 있어서는 Diffusion Policy가 더 부드럽고 정밀했음</li>
</ul>
</li>
<li>[향후 연구 과제] Diffusion Policy에서 사용하는 Action Chunking과 Temporal Smoothing을 OpenVLA에 적용한다면, 동일한 수준의 정교한 작업을 얻을 수 있지 않을까?</li>
</ul>
<h3 id="53-parameter-efficient-fine-tuning">5.3 <strong>Parameter-Efficient Fine-Tuning</strong></h3>
<ul>
<li>이전 절에서 수행한 OpenVLA의 Full Fine-tuning은 높은 성능을 달성하기 위해 작업마다 그리고 데이터세트 크기에 따라 8개의 A100 GPU를 사용하여 5-15시간동안 학습 진행<ul>
<li>VLA를 처음부터 사전학습하는 것에 비하면 휠씬 적은 계산량이긴하지만, 본 절에서는 계산량과 학습 파라미터를 더욱 줄일 수 있는 파인튜닝 방법을 탐구해볼 것</li>
</ul>
</li>
</ul>
<h4 id="full-fine-tuning">Full Fine-tuning</h4>
<ul>
<li>파인튜닝 과정에서 모든 가중치를 업데이트하는 것</li>
</ul>
<h4 id="last-layer-only">Last layer Only</h4>
<ul>
<li>OpenVLA Transformer의 마지막 레이어와 token embedding matrix만 파인튜닝<ul>
<li>즉 출력에 가까운 부분만 학습한다는 뜻</li>
</ul>
</li>
</ul>
<h4 id="frozen-vision">Frozen Vision</h4>
<ul>
<li>Vision Encoder를 고정하고 나머지 가중치는 파인튜닝하는 것<ul>
<li>즉, 이미지 특징은 그대로 두고, LLM만 학습</li>
</ul>
</li>
</ul>
<h4 id="sandwich-fine-tuning">Sandwich Fine-tuning</h4>
<ul>
<li>Vision Encoder, Token Embedding Matrix, 마지막 layer만 학습 가능하게 함<ul>
<li>즉, 앞과 뒤만 학습한다는 것</li>
</ul>
</li>
</ul>
<h4 id="lora">LoRA</h4>
<ul>
<li>Hu 등의 Low-Rank Adaptation 기법을 사용하여 여러 rank 값 $r$을 적용하여 모델의 모든 Linear Layer에 적용</li>
</ul>
<h4 id="결과">결과</h4>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/ada879ee-a67c-4ed3-b946-ee9d0f473a3f/image.png" alt=""></p>
<ul>
<li><p>마지막 레이어만 학습하거나 비전 인코더를 고정하는 방법의 경우에는 성능이 낮았음</p>
<ul>
<li>이는 목표 환경에 맞게 Vision Feature를 추가적으로 적응시키는 것이 매우 중요함을 의미함</li>
</ul>
</li>
<li><p>반면 Sandwich Fine-tuning은 비전 인코더를 파인튜닝하기 때문에 더 좋은 성능을 달성함</p>
<ul>
<li>또한, 전체 LLM Backbone을 Fine-tuning하지 않기 때문에 GPU 메모리도 덜 사용하는 편</li>
</ul>
</li>
<li><p>마지막으로 LoRA는 성능과 학습 메모리 사용량 사이에서 가장 좋은 trade-off를 달성했음</p>
<ul>
<li><p>전체 파라미터 1.4%만 학습하면서도 Full fine-tuning과 동일한 성능</p>
</li>
<li><p>LoRA의 Ranke 값은 정책 성능에 거의 영향을 주지 않았음
→ 기본 Rank값으로 r=32를 사용하는 것을 권장</p>
<p>⇒ LoRA를 사용함으로써 단일 A100 GPU 한 장만으로도 10-15시간 안에 OpenVLA를 새로운 작업에서 Fine-tuning할 수 있었으며, 이는 Full fine-tuning과 비교하여 계산량을 8배 줄인 것</p>
</li>
</ul>
</li>
</ul>
<h3 id="54-memory-efficient-inference-via-quantization">5.4 <strong>Memory-Efficient Inference via Quantization</strong></h3>
<ul>
<li>OpenVLA는 70억 개의 파라미터를 가진 모델로 1억 파라미터를 가진 Octo와 같은 기존 오픈소스 범용 정책보다 추론시 더 많은 메모리를 사용함<ul>
<li>OpenVLA를 bfloat16 정밀도로 저장하고 불러와 추론을 수행(일반적인 방법)</li>
<li>메모리 사용량을 절반으로 줄여서 16GB GPU메모리 만으로도 OpenVLA를 실행할 수 있게 함</li>
</ul>
</li>
<li>본 절에서는 LLM추론을 위해 개발된 <strong>양자화 기법</strong>을 사용해서 정책 추론에 필요한 메모리를 줄이고 VLA의 접근성을 높일 수 있는지 평가<ul>
<li>네트워크 가중치를 더 낮은 정밀도로 불러오고</li>
<li>그 결과 메모리 사용량은 감소하지만 추론 속도와 정확도가 일부 감소할 수 있는 trade-off 발생</li>
</ul>
</li>
</ul>
<h4 id="실험">실험</h4>
<ul>
<li>8-bit와 4-bit 정밀도로 OpenVLA를 실행하여 BridgeDataV2의 대표적인 8개 작업에서 평가<ul>
<li>INT8, INT4</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hyooo__s/post/cef75987-fcb3-461b-81a8-14e71133cb4c/image.png" alt=""></p>
<ul>
<li>비교 기준은 메모리, 실제 성공률임, 다양한 소비자용 및 서버용 GPU에 달성 가능한 제어 주파수도 표에 제시함</li>
</ul>
<h4 id="결과-1">결과</h4>
<ul>
<li>대부분의 GPU에서 8비트 양자화 추론 속도를 느리게 만든다는 것을 관찰함<ul>
<li>추가적인 양자화 연산 때문</li>
</ul>
</li>
<li>반면, 4비트 추론은 더 높은 처리량을 달성함<ul>
<li>GPU메모리 전송량이 크게 줄어들어서 양자화 연산의 오버헤드를 상쇄하기 때문</li>
<li>추론 속도가 감소한 결과, 8비트 양자화에서는 성능이 크게 감소했음</li>
</ul>
</li>
<li>4비트 양자화 모델은 A5000 GPU에서 3Hz로 실행될 수 있었으며, 이는 데이터 수집 당시의 시스템 동작(5Hz)에 더 가까움</li>
</ul>
<p>⇒ 즉, 무조건 더 높은 비트(INT8)가 좋은 게 아니라 OpenVLA에서 INT4양자화가 메모리 절감과 성능 유지에 있어 가장 좋은 균형을 보였음</p>
<h2 id="6-discussion-and-limitations">6. <strong>Discussion and Limitations</strong></h2>
<ul>
<li>본 논문에서 SOTA OpenVLA를 공개하며, 다양한 로봇에 대한 추가학습이 없더라도 좋은 성능을 냈음</li>
<li>또한, OpenVLA가 5.3절의 Parameter-efficient Fine-tuning 기법을 사용하여 새로운 로봇 환경에서도 쉽게 적응할 수 있음을 보였음</li>
</ul>
<p>하지만 한계도 존재했는데,</p>
<ul>
<li><p>현재는 한 장의 이미지만을 입력으로 사용할 수 있다</p>
<ul>
<li>실제 로봇 환경은 매우 다양하고 사용 가능한 센서 입력 또한 매우 당야함</li>
<li>그래서 OpenVLA가 여러 장의 이미지, 고유 감각 정보, 그리고 과거 관측까지 지원하도록 확장하는 것이 중요한 미래 연구 방향이라는 것</li>
<li>이미지와 텍스트를 번갈아 포함된 데이터로 사전학습된 VLM을 활용하면 더 유연한 VLA를 만들 수 있지 않을까?</li>
</ul>
</li>
<li><p>OpenVLA의 추론 처리량을 높이는 것이 50Hz로 동작하는 ALOHA와 같은 고주파 제어 환경에서 VLA를 사용하기 위해 매우 중요함</p>
<ul>
<li>현재 논문은 대부분 한 팔인데, 앞으로는 양 팔을 활용하여 복잡한 작업도 가능해질 것이다.</li>
<li>또한 속도를 높이기 위해 Speculative Decoding같은 최적화 기법이 이러한 문제를 해결 할 수 있을 것</li>
</ul>
</li>
<li><p>계산 자원의 한계때문에 많은 VLA 설계 문제들이 충분히 연구되지 못했음</p>
<ul>
<li><p>기본 VLM의 크기는 VLA의 성능에 어떤 영향을 미치는지</p>
</li>
<li><p>로봇 행동 데이터와 인터넷 규모의 vision-language 데이터를 함께 학습하면 VLA 성능이 크게 향상 되는지</p>
</li>
<li><p>어떤 시각 특징이 VLA에 가장 적합한지</p>
<p>  ⇒ 때문에 우리가 이 코드 베이스르 공개하니까 연구 커뮤니티가 함게 연구했으면 좋겠다~~</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <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>