<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>holiday_donghun.log</title>
        <link>https://velog.io/</link>
        <description>AI를 좋아하고 공부하는 대학생</description>
        <lastBuildDate>Sun, 11 Jan 2026 09:31:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>holiday_donghun.log</title>
            <url>https://velog.velcdn.com/images/holiday_donghun/profile/78cc8b4b-f139-4a25-be0c-be9cc3314aa8/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. holiday_donghun.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/holiday_donghun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[LP-3DGS 논문리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/LP-3DGS-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/LP-3DGS-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 11 Jan 2026 09:31:49 GMT</pubDate>
            <description><![CDATA[<h1 id="lp-3dgs-learning-to-prune-3d-gaussian-splatting-논문-분석-보고서">LP-3DGS: Learning to Prune 3D Gaussian Splatting 논문 분석 보고서</h1>
<h2 id="요약">요약</h2>
<p>본 보고서는 <strong>LP-3DGS(Learning-to-Prune 3D Gaussian Splatting)</strong> 논문과 이에 대응하는 구현 코드를 상세 분석한 학술적 기술 문서입니다. LP-3DGS는 <strong>Gumbel-Sigmoid(검벨-시그모이드)</strong> 활성화 함수를 활용하여 학습 가능한 이진 마스크를 자동으로 최적화함으로써, 기존 3DGS 경량화 방법의 핵심 한계점인 <strong>수동 프루닝 비율 튜닝</strong>을 제거한 혁신적 접근법입니다.</p>
<hr>
<h2 id="1-연구-배경-및-동기">1. 연구 배경 및 동기</h2>
<h3 id="11-기존-3dgs의-한계점">1.1 기존 3DGS의 한계점</h3>
<p>3D Gaussian Splatting(3DGS)은 <strong>Novel View Synthesis(새로운 시점에서의 이미지 합성)</strong> 분야에서 혁신적 성과를 이루었습니다[LP-3DGS 논문, Abstract]. 3DGS는 신경 방사 필드(NeRF)와 달리 <strong>명시적 포인트 기반 표현(explicit point-based representation)</strong>을 사용하여 높은 화질과 빠른 렌더링 속도를 동시에 달성합니다[LP-3DGS 논문, Introduction]. </p>
<ul>
<li>Novel View Synthesis(NVS, 새로운 시점 합성): 주어진 학습 뷰(이미지/카메라 포즈)로부터 보지 않은 시점의 이미지를 렌더링하는 문제입니다.</li>
<li>NeRF(Neural Radiance Fields, 신경 방사 필드): 연속 공간에서 방사휘도/밀도를 MLP로 표현하는 implicit(암시적) 방식으로, 고품질이지만 픽셀당 많은 샘플과 MLP 추론이 필요해 느릴 수 있다는 대비가 논문에 언급됩니다.</li>
<li>Explicit point-based representation(명시적 포인트 기반 표현): 3D 프리미티브(가우시안)를 직접 갖고 GPU 렌더링 파이프라인에 태우기 쉬운 표현을 뜻합니다.</li>
</ul>
<p>그러나 실제 장면을 재구성하기 위해서는 <strong>수백만 개의 가우시안 포인트</strong>가 필요하며, 각 가우시안 포인트는 <strong>59개의 파라미터</strong>(위치 3차원, 불투명도 1, 3차원 스케일 3, 4차원 쿼터니언 회전 4, 48차원 구면 조화함수(SH) 계수)로 구성되어 있습니다[LP-3DGS 논문, 3.1절]. 이러한 구조는 <strong>메모리 사용량이 매우 높아서</strong> 모바일 장치나 리소스 제약 환경에서의 실시간 렌더링을 어렵게 합니다[LP-3DGS 논문, Abstract].</p>
<ul>
<li>Opacity(불투명도): 볼륨 렌더링 누적합에서 해당 프리미티브가 픽셀 색에 기여하는 강도를 결정하는 핵심 파라미터입니다.</li>
<li>Spherical Harmonics(SH, 구면 조화 함수): 시선 방향에 따른 색 변화를 저차 다항 형태로 표현하는 기법으로, 3DGS에서는 색 파라미터로 사용됩니다.</li>
</ul>
<h3 id="12-기존-프루닝-방법의-문제점">1.2 기존 프루닝 방법의 문제점</h3>
<p><strong>RadSplat</strong>, <strong>Mini-Splatting</strong>, <strong>LightGaussian</strong> 등 최근 연구들은 각 가우시안에 대한 <strong>중요도 점수(importance score)</strong>를 정의하고, 이를 기반으로 낮은 점수의 포인트를 제거하는 프루닝 전략을 제시했습니다[LP-3DGS 논문, Related Work]. </p>
<p>그러나 이들 방법의 <strong>핵심 한계점</strong>은 다음과 같습니다[LP-3DGS 논문, Introduction]:</p>
<ol>
<li><strong>수동 임계값 튜닝 필요</strong>: 프루닝 비율((t_{prune}))을 미리 지정해야 하며, 최적값은 장면마다 다릅니다.</li>
<li><strong>다중 학습 필요</strong>: 각 프루닝 비율마다 별도의 학습이 필요하므로, 최적값 찾기 위해 <strong>12번 이상의 학습</strong>이 필요할 수 있습니다(Figure 1 참조)[LP-3DGS 논문, 1절].</li>
<li><strong>장면 특이성</strong>: MipNeRF360 데이터셋의 Kitchen과 Room 장면에서 최적 프루닝 비율이 각각 0.58~0.74 범위로 서로 다릅니다[LP-3DGS 논문, Introduction].</li>
</ol>
<h3 id="13-lp-3dgs의-핵심-혁신">1.3 LP-3DGS의 핵심 혁신</h3>
<p>LP-3DGS는 이 문제를 근본적으로 해결하기 위해 <strong>학습 가능한 마스크(trainable mask)</strong>를 도입합니다[LP-3DGS 논문, Abstract]. 기존의 고정된 임계값 기반 마스킹 대신, <strong>Gumbel-Sigmoid 활성화 함수</strong>를 이용하여 마스크 파라미터 자체를 최적화합니다[LP-3DGS 논문, 3.3절]. 이를 통해 <strong>단 한 번의 학습으로</strong> 각 장면에 맞는 최적 프루닝 비율을 자동 발견할 수 있습니다[LP-3DGS 논문, Abstract].</p>
<hr>
<h2 id="2-핵심-기술-방법론">2. 핵심 기술 방법론</h2>
<h3 id="21-learning-to-prune-파이프라인">2.1 Learning-to-Prune 파이프라인</h3>
<p>LP-3DGS는 두 개의 명확한 학습 단계로 구성됩니다[LP-3DGS 논문, 3.3절, Figure 2]:</p>
<p><strong>1) Densification(밀집화) 단계</strong>: </p>
<ul>
<li>표준 3DGS와 동일하게 작동합니다</li>
<li>가우시안 포인트의 수를 점진적으로 증가시킵니다[LP-3DGS 논문, 3.3절]</li>
</ul>
<p><strong>2) Learning-to-Prune 단계</strong>:</p>
<ul>
<li>사전 정의된 중요도 점수(RadSplat, Mini-Splatting 등)를 계산합니다</li>
<li><strong>학습 가능한 마스크를 이니셜라이제이션</strong>하고 500 반복(iteration) 동안만 학습합니다[LP-3DGS 논문, 3.3절]</li>
<li>학습 완료 후 마스크 값이 0.5 이하인 가우시안을 제거합니다</li>
</ul>
<p>코드 구현에서는 <code>train.py</code>의 다음 부분에서 확인할 수 있습니다[코드: train.py, 약 70-80줄]:</p>
<pre><code class="language-python">if iteration &gt; opt.prune_iterations[0] and iteration &lt; opt.prune_iterations[0] + opt.train_mask_iters and use_importance_mask == True:
    loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image)) + gaussians.addtional_loss(opt)</code></pre>
<h3 id="22-gumbel-sigmoid-활성화-함수의-역할">2.2 Gumbel-Sigmoid 활성화 함수의 역할</h3>
<h4 id="기존-방법의-한계-straight-through-estimator-ste">기존 방법의 한계: Straight-Through Estimator (STE)</h4>
<p>기존의 Compact3D와 같은 방법들은 <strong>이진 마스크의 미분 불가능성 문제</strong>를 극복하기 위해 STE(직진 추정기)를 사용했습니다[LP-3DGS 논문, 3.3절]. STE는 순전파(forward pass)에서는 이진 함수처럼 작동하지만, 역전파(backward pass)에서는 기울기를 직접 통과시킵니다[LP-3DGS 논문, 3.3절]:</p>
<p>$M(m) = \nabla\oslash(1[f(m) &gt; \epsilon] - f(m)) + f(m)$</p>
<p>그러나 이 방법은 실제 마스크 값과 학습되는 마스크 값 사이의 <strong>표현 간격(representation gap)</strong>을 야기합니다[LP-3DGS 논문, Figure 3(a)].</p>
<h4 id="gumbel-sigmoid의-우월성">Gumbel-Sigmoid의 우월성</h4>
<p>Gumbel-Softmax의 원리를 이진 분류 문제로 적응시킨 <strong>Gumbel-Sigmoid</strong> 함수는 다음과 같이 정의됩니다[LP-3DGS 논문, 식(7)]:</p>
<p>$gs(m) = \frac{\exp((\log(m) + g_0)/\tau)}{\exp((\log(m) + g_0)/\tau) + \exp(g_1/\tau)} = \frac{1}{1 + \exp(-(\log(m) + g_0 - g_1)/\tau)}
$</p>
<p>여기서:</p>
<ul>
<li>$m$: 실수값 마스크 파라미터</li>
<li>$g_0, g_1$: Gumbel 분포에서 샘플링된 확률 변수</li>
<li>$\tau$: 온도(temperature) 파라미터 (논문에서 0.5 사용)[LP-3DGS 논문, 4.1절]</li>
</ul>
<p><strong>핵심 장점</strong>[LP-3DGS 논문, Figure 3]:</p>
<ol>
<li><strong>출력값이 0 또는 1 근처로 집중</strong>: STE와 달리, Gumbel-Sigmoid는 학습된 마스크 값을 자연스럽게 0 또는 1 근처로 밀어냅니다</li>
<li><strong>전체 범위에서 미분 가능</strong>: STE의 &quot;정지 기울기&quot; 문제를 없앱니다</li>
<li><strong>확률론적 근거</strong>: Gumbel 분포의 수학적 성질에 기반하여 범주형 샘플링이 가능합니다</li>
</ol>
<ul>
<li>STE(Straight-Through Estimator, 직진 추정기): forward에서는 이진화처럼 동작시키고, backward에서는 이진화 연산의 미분을 우회해 그래디언트를 통과시키는 근사 기법입니다(논문은 STE mask 수식을 별도로 제시).</li>
<li>(왜 대체가 주장되는가) 논문은 STE가 “학습되는 마스크(연속값)”와 “적용되는 마스크(이진값)” 사이의 불일치, 즉 <strong>representation gap(표현 간격)</strong>을 키울 수 있다고 지적합니다.</li>
<li>Gumbel-Sigmoid 대체의 핵심 의도: 출력이 0/1 근처로 몰리면서도 미분 가능하도록 만들어 “이진 결정”을 더 직접적으로 최적화하려는 것입니다</li>
</ul>
<h3 id="23-sparsity-loss-희소성-손실-설계">2.3 Sparsity Loss (희소성 손실) 설계</h3>
<p>마스크를 학습 가능하게 하려면 단순히 렌더링 손실만으로는 불충분합니다. <strong>과도하게 보수적인 마스크</strong>(모든 가우시안을 유지)가 최적의 렌더링 결과를 낼 수 있기 때문입니다. 따라서 LP-3DGS는 L1 정규화를 추가합니다[LP-3DGS 논문, 식(9)]:</p>
<p>$
R_{mask} = \frac{1}{N}\sum_{i=1}^{N}|m_i|
$</p>
<p>최종 손실 함수는 다음과 같습니다[LP-3DGS 논문, 식(10)]:</p>
<p>$
L = (1 - \lambda_{ssim}) \cdot L_{L1} + \lambda_{ssim} \cdot L_{SSIM} + \lambda_m \cdot R_{mask}
$</p>
<p>여기서:</p>
<ul>
<li>$(L_{L1})$: L1 재구성 손실</li>
<li>$(L_{SSIM})$: 구조적 유사성 손실</li>
<li>$(\lambda_{ssim})$: SSIM 가중치 (전형적으로 0.2)[LP-3DGS 논문, 4.1절]</li>
<li>$(\lambda_m)$: 마스크 정규화 계수 (5e-4)[LP-3DGS 논문, 4.1절]</li>
</ul>
<p>코드상에서는 <code>loss_utils.py</code>에 L1과 SSIM 손실이 구현되어 있으며[코드: loss_utils.py], <code>addtional_loss</code> 함수에서 마스크 정규화가 적용됩니다[코드: gaussian_model_rad_splat.py, 약 45-50줄]:</p>
<pre><code class="language-python">def addtional_loss(self, opt):
    return 0.0005 * torch.mean((torch.sigmoid(self.importance_mask._mask)))</code></pre>
<h3 id="24-importance-score-계산-방식">2.4 Importance Score 계산 방식</h3>
<p>LP-3DGS는 <strong>방법론 자체가 중요도 점수와 무관하게 작동</strong>하도록 설계되었습니다[LP-3DGS 논문, 3.3절]. 논문에서는 두 가지 기존 방법의 중요도 점수와 호환성을 검증합니다:</p>
<h4 id="radsplat-점수lp-3dgs-논문-식3">RadSplat 점수[LP-3DGS 논문, 식(3)]:</h4>
<p>$S_i = \max_{I_f \in I_f, r \in I_f} \alpha_r^i \cdot T_r^i$</p>
<ul>
<li>모든 학습 이미지의 모든 광선(ray)에 대해 가우시안의 <strong>최대 기여도</strong>를 계산합니다</li>
<li>$(\alpha_r^i)$: 광선 r에서 가우시안 i의 불투명도(opacity)</li>
<li>$(T_r^i)$: 가우시안 i까지의 누적 투과(transmittance)</li>
</ul>
<h4 id="mini-splatting-점수lp-3dgs-논문-식5">Mini-Splatting 점수[LP-3DGS 논문, 식(5)]:</h4>
<p>$
S_i = \sum_{j=1}^{K} \omega_{ij}
$</p>
<ul>
<li>가우시안과 교차하는 <strong>모든 광선의 누적 색상 가중치</strong></li>
<li>$(K)$: 가우시안 $(G_i)$와 교차하는 광선의 총 개수</li>
<li>$(\omega_{ij})$: j번째 광선에서의 색상 가중치</li>
</ul>
<p>코드 구현에서는 <code>forward.cu</code>의 여러 CUDA 커널에서 이 점수들이 계산됩니다[코드: forward.cu]:</p>
<ul>
<li><code>mw_score_gaussians</code>: RadSplat의 최대 가중치 점수</li>
<li><code>bw_score_gaussians</code>: 누적 블렌딩 가중치 점수</li>
<li>이들은 모두 <code>atomicMax</code>와 <code>atomicAdd</code>를 이용해 병렬적으로 계산됩니다</li>
</ul>
<hr>
<h2 id="3-시스템-아키텍처">3. 시스템 아키텍처</h2>
<h3 id="31-데이터-흐름-python-→-cuda">3.1 데이터 흐름: Python → CUDA</h3>
<p>LP-3DGS는 <strong>계층화된 아키텍처</strong>로 구성됩니다[코드: diff-gaussian-rasterization.__init.py]:</p>
<h4 id="1단계-python-수준-제어">1단계: Python 수준 제어</h4>
<pre><code>train.py (메인 학습 루프)
    ↓
gaussian_model_rad_splat.py (RadSplat 모델)
    ↓
mask.py (PruneMask 클래스 - 마스크 파라미터 관리)</code></pre><h4 id="2단계-pytorch-↔-cuda-바인딩">2단계: PyTorch ↔ CUDA 바인딩</h4>
<pre><code>render() 함수 호출
    ↓
diff-gaussian-rasterization/__init.py (_RasterizeGaussians 클래스)
    ↓
_C.rasterize_gaussians() 또는 _C.mw_score_gaussians()</code></pre><h4 id="3단계-cuda-커널-실행">3단계: CUDA 커널 실행</h4>
<pre><code>forward.cu (GPU 메모리에서 병렬 연산)
    ↓
preprocessCUDA: 각 가우시안의 2D 투영 및 공분산 계산
renderCUDA_mw_score: 중요도 점수 계산 및 렌더링</code></pre><p>코드상에서 이러한 구조는 <code>diff-gaussian-rasterization/__init.py</code>의 <code>_RasterizeGaussians.forward()</code>에서 명확히 보입니다[코드: diff-gaussian-rasterization.__init.py, 약 50-80줄]:</p>
<pre><code class="language-python">if raster_settings.mw_score:
    num_rendered, color, radii, geomBuffer, binningBuffer, imgBuffer, important_score = _C.mw_score_gaussians(*args)</code></pre>
<h3 id="32-마스크-파라미터의-학습-과정">3.2 마스크 파라미터의 학습 과정</h3>
<h4 id="초기화-단계">초기화 단계</h4>
<p>학습이 시작될 때 <code>set_mask()</code> 메서드가 호출되어[코드: gaussian_model_rad_splat.py, 약 55줄]:</p>
<ul>
<li>각 가우시안마다 <strong>학습 가능한 실수값 마스크</strong> (m_i)를 초기화합니다</li>
<li>초기값은 전형적으로 0.0입니다 (모든 가우시안이 제거될 준비 상태)</li>
</ul>
<h4 id="순전파forward-pass">순전파(Forward Pass)</h4>
<p>렌더링 중에 불투명도는 다음과 같이 수정됩니다[LP-3DGS 논문, 식(8)][코드: gaussian_model_rad_splat.py, 약 15-20줄]:</p>
<p>$
o_i^m = o_i \cdot gs(m_i \cdot S_i)
$</p>
<p>여기서:</p>
<ul>
<li>$(o_i)$: 원래 불투명도</li>
<li>$(gs(\cdot))$: Gumbel-Sigmoid 함수</li>
<li>$(S_i)$: 사전 계산된 중요도 점수</li>
</ul>
<p>코드상으로는 다음과 같이 구현됩니다:</p>
<pre><code class="language-python">def opacity_with_mask_activation(self, opacity):
    return (torch.sigmoid(opacity).squeeze() * self.importance_mask.get_mask).unsqueeze(1)</code></pre>
<h4 id="역전파backward-pass">역전파(Backward Pass)</h4>
<p>손실 함수의 기울도(gradient)가 마스크 파라미터에 역전파됩니다:</p>
<p>$
\frac{\partial L}{\partial m_i} = \frac{\partial L}{\partial o_i^m} \cdot \frac{\partial o_i^m}{\partial m_i}
$</p>
<p>Gumbel-Sigmoid는 전체 범위에서 미분 가능하므로, 이 그래디언트가 손실 없이 전달됩니다[LP-3DGS 논문, 3.3절].</p>
<h4 id="최적화-단계">최적화 단계</h4>
<p>Adam 옵티마이저가 마스크 파라미터를 업데이트합니다[코드: train.py, 약 90-100줄]:</p>
<pre><code class="language-python">if iteration &gt; opt.prune_iterations[0] and iteration &lt; opt.prune_iterations[0] + opt.train_mask_iters and use_importance_mask == True:
    gaussians.importance_mask.optimizer.step()
    gaussians.importance_mask.optimizer.zero_grad(set_to_none = True)</code></pre>
<h3 id="33-프루닝-실행-타이밍">3.3 프루닝 실행 타이밍</h3>
<p>LP-3DGS에서 <strong>프루닝은 정확히 두 번 실행</strong>됩니다[LP-3DGS 논문, 3.3절]:</p>
<p><strong>1) 마스크 학습 완료 후 (iteration = prune_iterations + train_mask_iters)</strong>:</p>
<pre><code class="language-python">if iteration == opt.prune_iterations[0]+opt.train_mask_iters:
    prune_mask = (self.importance_mask.get_prune_mask &lt; 0.5).squeeze()
    self.prune_points(prune_mask)</code></pre>
<ul>
<li>마스크 값이 0.5 이하인 모든 가우시안을 삭제합니다</li>
<li>그래디언트 누적기, 옵티마이저 상태도 함께 제거됩니다[코드: gaussian_model.py, _prune_optimizer 메서드]</li>
</ul>
<p><strong>2) 나머지 학습 기간 동안</strong>:</p>
<ul>
<li>프루닝된 포인트 집합을 유지한 채로 계속 학습합니다</li>
<li>렌더링 최적화는 계속되지만, 마스크는 더 이상 업데이트되지 않습니다</li>
</ul>
<hr>
<h2 id="4-실험-결과">4. 실험 결과</h2>
<h3 id="41-정량적-수치-psnr-ssim-lpips">4.1 정량적 수치 (PSNR, SSIM, LPIPS)</h3>
<p>LP-3DGS는 <strong>세 개의 주요 데이터셋</strong>에서 평가되었습니다[LP-3DGS 논문, 4.1절]:</p>
<ul>
<li>MipNeRF360 (실제 장면 9개)</li>
<li>NeRF-Synthetic (합성 장면 8개)</li>
<li>Tanks &amp; Temples (2개 장면)</li>
</ul>
<h4 id="mipnerf360-데이터셋-결과lp-3dgs-논문-table-1">MipNeRF360 데이터셋 결과[LP-3DGS 논문, Table 1]</h4>
<table>
<thead>
<tr>
<th>메트릭</th>
<th>기존 3DGS</th>
<th>LP-3DGS (RadSplat)</th>
<th>LP-3DGS (Mini-Splatting)</th>
</tr>
</thead>
<tbody><tr>
<td>PSNR ↑ (평균)</td>
<td>27.48</td>
<td>27.47</td>
<td>27.12</td>
</tr>
<tr>
<td>SSIM ↑ (평균)</td>
<td>0.8125</td>
<td>0.8120</td>
<td>0.8047</td>
</tr>
<tr>
<td>LPIPS ↓ (평균)</td>
<td>0.2215</td>
<td>0.2269</td>
<td>0.2391</td>
</tr>
<tr>
<td>평균 프루닝 비율</td>
<td>-</td>
<td>0.63</td>
<td>0.60</td>
</tr>
</tbody></table>
<p><strong>해석</strong>: </p>
<ul>
<li>PSNR, SSIM, LPIPS 지표 모두에서 <strong>무시할 수 있는 수준의 화질 저하</strong>만 관찰됩니다</li>
<li>RadSplat 점수 기반으로는 <strong>평균 63% 프루닝</strong>, Mini-Splatting 기반으로는 <strong>60% 프루닝</strong>을 달성합니다[LP-3DGS 논문, Table 1]</li>
</ul>
<h4 id="nerf-synthetic-데이터셋-결과lp-3dgs-논문-table-6-appendix">NeRF-Synthetic 데이터셋 결과[LP-3DGS 논문, Table 6 (Appendix)]</h4>
<p>합성 데이터셋에서는 더 강력한 성능을 보입니다:</p>
<ul>
<li>평균 PSNR: 33.799 (기존) → 33.709 (RadSplat) [매우 작은 저하]</li>
<li>평균 SSIM: 0.9696 (기존) → 0.9694 (RadSplat)</li>
<li>평균 LPIPS: 0.03119 (기존) → 0.03139 (RadSplat)</li>
</ul>
<h3 id="42-모델-경량화-효과-용량-감소율">4.2 모델 경량화 효과 (용량 감소율)</h3>
<h4 id="가우시안-포인트-수-감소lp-3dgs-논문-table-3">가우시안 포인트 수 감소[LP-3DGS 논문, Table 3]</h4>
<p>MipNeRF360 장면별 프루닝 효율:</p>
<table>
<thead>
<tr>
<th>장면</th>
<th>기존 가우시안 수</th>
<th>LP-3DGS 후</th>
<th>감소율</th>
</tr>
</thead>
<tbody><tr>
<td>Bicycle</td>
<td>3,650,000+</td>
<td>2,510,992</td>
<td>~31%</td>
</tr>
<tr>
<td>Bonsai</td>
<td>1,000,000+</td>
<td>542,235</td>
<td>~46%</td>
</tr>
<tr>
<td>Counter</td>
<td>1,000,000+</td>
<td>506,391</td>
<td>~49%</td>
</tr>
<tr>
<td>Kitchen</td>
<td>1,500,000+</td>
<td>887,161</td>
<td>~41%</td>
</tr>
</tbody></table>
<p><strong>핵심 통찰</strong>: 장면마다 <strong>서로 다른 프루닝 비율</strong>이 자동으로 학습됩니다[LP-3DGS 논문, Table 1]. 예를 들어 Bonsai는 65% 프루닝(RadSplat), Kitchen은 58% 프루닝을 달성하며, 각각이 최적값입니다[⚠️ 팩트체크 불가: 각 장면별 최적성의 정의가 논문에서 명시되지 않음].</p>
<h4 id="메모리-사용량">메모리 사용량</h4>
<p>학습 중 피크 메모리는 약간 증가합니다[LP-3DGS 논문, Table 2]:</p>
<ul>
<li>기존 3DGS: 약 11GB (평균)</li>
<li>LP-3DGS: 약 12GB (평균) - 마스크 학습으로 인한 오버헤드</li>
</ul>
<p>하지만 <strong>학습 후 추론 시에는 메모리가 프루닝 비율에 따라 크게 감소</strong>합니다.</p>
<h3 id="43-렌더링-속도-개선-fps">4.3 렌더링 속도 개선 (FPS)</h3>
<h4 id="프레임-속도-향상lp-3dgs-논문-table-2">프레임 속도 향상[LP-3DGS 논문, Table 2]</h4>
<table>
<thead>
<tr>
<th>장면</th>
<th>기존 FPS</th>
<th>LP-3DGS (RadSplat)</th>
<th>속도 향상 배수</th>
</tr>
</thead>
<tbody><tr>
<td>Bicycle</td>
<td>132</td>
<td>324</td>
<td><strong>2.45x</strong></td>
</tr>
<tr>
<td>Bonsai</td>
<td>417</td>
<td>662</td>
<td><strong>1.59x</strong></td>
</tr>
<tr>
<td>Counter</td>
<td>421</td>
<td>670</td>
<td><strong>1.59x</strong></td>
</tr>
<tr>
<td>Kitchen</td>
<td>315</td>
<td>542</td>
<td><strong>1.72x</strong></td>
</tr>
<tr>
<td>Room</td>
<td>380</td>
<td>692</td>
<td><strong>1.82x</strong></td>
</tr>
</tbody></table>
<p><strong>평균 속도 향상</strong>: <strong>약 1.8배 ~ 2.5배</strong>[LP-3DGS 논문, Table 2]</p>
<p>이는 프루닝된 가우시안 수의 감소에 거의 정확히 비례합니다. 예를 들어 Bicycle의 경우 31% 감소 → 약 1.45배 기대 속도향상 대비, 실제로는 2.45배 개선된 것은 캐시 효율 및 GPU 워프 활용도 개선의 시너지 효과입니다.</p>
<h3 id="44-학습-시간-비용lp-3dgs-논문-table-2">4.4 학습 시간 비용[LP-3DGS 논문, Table 2]</h3>
<table>
<thead>
<tr>
<th>장면</th>
<th>기존 학습시간</th>
<th>LP-3DGS (RadSplat)</th>
<th>시간 절감</th>
</tr>
</thead>
<tbody><tr>
<td>Bicycle</td>
<td>49분</td>
<td>43분</td>
<td>약 12%</td>
</tr>
<tr>
<td>Bonsai</td>
<td>34분</td>
<td>27분</td>
<td>약 20%</td>
</tr>
<tr>
<td>Average</td>
<td>~33분</td>
<td>~31분</td>
<td>약 6%</td>
</tr>
</tbody></table>
<p><strong>설명</strong>: LP-3DGS는 <strong>500 반복 동안만 마스크를 학습</strong>하므로[LP-3DGS 논문, 3.3절], 학습 초기의 추가 오버헤드가 미미합니다. 오히려 <strong>프루닝 후 나머지 학습이 더 빨라져서</strong> 전체 학습 시간이 약 6-20% 단축됩니다.</p>
<hr>
<h2 id="5-코드-구현-특징">5. 코드 구현 특징</h2>
<h3 id="51-기존-3dgs-대비-추가변경된-주요-코드">5.1 기존 3DGS 대비 추가/변경된 주요 코드</h3>
<h4 id="추가된-핵심-파일들코드-분석">추가된 핵심 파일들[코드 분석]:</h4>
<ol>
<li><p><strong>mask.py</strong> (PruneMask 클래스):</p>
<ul>
<li>학습 가능한 마스크 파라미터 $(m_i)$ 관리</li>
<li>Gumbel-Sigmoid 활성화 함수 구현 (예정)</li>
<li>마스크 옵티마이저 초기화</li>
</ul>
</li>
<li><p><strong>gaussian_model_rad_splat.py</strong> (RadSplat 클래스):</p>
<ul>
<li>GaussianModel 상속[코드: gaussian_model_rad_splat.py, 약 25줄]</li>
<li><code>opacity_with_mask_activation()</code> 메서드로 불투명도 수정</li>
<li><code>get_score_before_render()</code>: 각 렌더링 전에 중요도 점수 계산</li>
<li><code>prune_after_render()</code>: 학습 종료 후 포인트 프루닝</li>
</ul>
</li>
<li><p><strong>forward.cu의 새로운 CUDA 커널들</strong>[코드: forward.cu]:</p>
<ul>
<li><code>renderCUDA_mw_score()</code>: 최대 가중치 점수 계산[코드: forward.cu, 약 600줄]</li>
<li><code>renderCUDA_bw_score()</code>: 누적 블렌딩 가중치 점수 계산</li>
<li>원자적 연산(atomic operations)으로 병렬 점수 집계</li>
</ul>
</li>
</ol>
<h4 id="수정된-기존-파일들">수정된 기존 파일들:</h4>
<ol>
<li><p><strong>train.py</strong>[코드: train.py]:</p>
<ul>
<li><code>use_importance_mask</code> 플래그 도입[코드: train.py, main 함수 약 200줄]</li>
<li>마스크 학습 구간에서 손실 함수 수정[코드: train.py, 약 70-80줄]</li>
<li>별도의 마스크 옵티마이저 스텝 추가[코드: train.py, 약 90-100줄]</li>
</ul>
</li>
<li><p><strong>gaussian_model.py</strong>[코드: gaussian_model.py]:</p>
<ul>
<li><code>_prune_optimizer()</code> 메서드: 옵티마이저 상태에서 프루닝된 포인트 제거[코드: gaussian_model.py, 약 250-270줄]</li>
<li><code>prune_points()</code> 메서드: 모든 파라미터 텐서에서 포인트 제거</li>
</ul>
</li>
</ol>
<h3 id="52-주요-함수별-역할">5.2 주요 함수별 역할</h3>
<h4 id="python-수준">Python 수준</h4>
<table>
<thead>
<tr>
<th>함수</th>
<th>파일</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><code>training()</code></td>
<td>train.py</td>
<td>메인 학습 루프, 마스크 학습 조건 제어</td>
</tr>
<tr>
<td><code>set_mask()</code></td>
<td>gaussian_model_rad_splat.py</td>
<td>마스크 파라미터 초기화, 옵티마이저 생성</td>
</tr>
<tr>
<td><code>opacity_with_mask_activation()</code></td>
<td>gaussian_model_rad_splat.py</td>
<td>마스크 기반 불투명도 계산</td>
</tr>
<tr>
<td><code>get_score_before_render()</code></td>
<td>gaussian_model_rad_splat.py</td>
<td>각 렌더링 전 중요도 점수 사전 계산</td>
</tr>
<tr>
<td><code>prune_after_render()</code></td>
<td>gaussian_model_rad_splat.py</td>
<td>마스크 학습 완료 후 포인트 삭제</td>
</tr>
</tbody></table>
<h4 id="cuda-수준">CUDA 수준</h4>
<table>
<thead>
<tr>
<th>커널</th>
<th>파일</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td><code>preprocessCUDA</code></td>
<td>forward.cu</td>
<td>각 가우시안의 2D 투영, 공분산, 색상 계산</td>
</tr>
<tr>
<td><code>renderCUDA</code></td>
<td>forward.cu</td>
<td>표준 렌더링</td>
</tr>
<tr>
<td><code>renderCUDA_mw_score</code></td>
<td>forward.cu</td>
<td>RadSplat 점수 계산 (최대 가중치)</td>
</tr>
<tr>
<td><code>renderCUDA_bw_score</code></td>
<td>forward.cu</td>
<td>Mini-Splatting 유형 점수 계산 (누적 가중치)</td>
</tr>
</tbody></table>
<hr>
<h2 id="6-한계점-및-향후-연구">6. 한계점 및 향후 연구</h2>
<h3 id="61-논문에서-언급된-제약사항">6.1 논문에서 언급된 제약사항</h3>
<h4 id="중요도-점수-의존성lp-3dgs-논문-discussion">중요도 점수 의존성[LP-3DGS 논문, Discussion]:</h4>
<p>LP-3DGS의 성능은 <strong>선택된 중요도 점수에 크게 의존</strong>합니다. 논문에서 명시적으로 언급:</p>
<blockquote>
<p>&quot;The limitation of this work is that the rendering quality after pruning varies depending on the definition of importance scores.&quot;</p>
</blockquote>
<p><strong>표로 본 영향</strong>[LP-3DGS 논문, Table 1]:</p>
<ul>
<li>RadSplat 점수 기반: 평균 PSNR 27.47</li>
<li>Mini-Splatting 점수 기반: 평균 PSNR 27.12</li>
</ul>
<p><strong>차이의 원인</strong>: RadSplat의 최대값 기반 점수가 Mini-Splatting의 누적값 기반 점수보다 장면의 <strong>중요한 구조를 더 잘 보존</strong>합니다[⚠️ 팩트체크 불가: 점수 선택의 영향 메커니즘이 자세히 분석되지 않음].</p>
<h4 id="하이퍼파라미터-민감도lp-3dgs-논문-41절">하이퍼파라미터 민감도[LP-3DGS 논문, 4.1절]:</h4>
<p>마스크 학습을 위한 여러 하이퍼파라미터가 고정되어 있습니다:</p>
<ul>
<li>온도 파라미터 $(\tau = 0.5)$ (모든 장면)</li>
<li>마스크 정규화 계수 $(\lambda_m = 5 \times 10^{-4})$ (모든 장면)</li>
<li>마스크 학습 기간 = 500 반복 (모든 장면)</li>
</ul>
<p>[⚠️ 팩트체크 불가: 이들 파라미터의 최적성이 입증되지 않음]</p>
<h3 id="62-코드-분석-중-발견된-기술적-이슈">6.2 코드 분석 중 발견된 기술적 이슈</h3>
<h4 id="이슈-1-gumbel-sigmoid-구현-미흡">이슈 1: Gumbel-Sigmoid 구현 미흡</h4>
<p>제공된 코드에서 <code>gaussian_model_rad_splat.py</code>는 아직도 <strong>Sigmoid + Mask 곱셈</strong>을 사용합니다:</p>
<pre><code class="language-python">def opacity_with_mask_activation(self, opacity):
    return (torch.sigmoid(opacity).squeeze() * self.importance_mask.get_mask).unsqueeze(1)</code></pre>
<p>논문에서 제시한 Gumbel-Sigmoid 함수는 구현되지 않았습니다[⚠️ 팩트체크 불가: 제공 코드가 논문 최종 버전과 다를 가능성].</p>
<h4 id="이슈-2-마스크-학습-중-렌더링-거리">이슈 2: 마스크 학습 중 렌더링 거리</h4>
<p>코드에서 마스크는 <strong>500 반복(iteration) 동안만</strong> 학습되는데[코드: train.py, 약 70줄]:</p>
<pre><code class="language-python">if iteration &gt; opt.prune_iterations[0] and iteration &lt; opt.prune_iterations[0] + opt.train_mask_iters and ((iteration-opt.prune_iterations[0])%20==0):</code></pre>
<p>%20 조건은 <strong>20 반복마다 중요도 점수를 재계산</strong>한다는 의미입니다. 500 반복 동안 점수가 25번만 업데이트되므로, 마스크의 <strong>수렴 속도</strong>가 제한될 수 있습니다[⚠️ 팩트체크 불가: 이 설계 결정의 근거가 명시되지 않음].</p>
<h4 id="이슈-3-다중-gpu-학습-미지원">이슈 3: 다중 GPU 학습 미지원</h4>
<p>코드에서 명시[LP-3DGS 논문, 4.1절]:</p>
<blockquote>
<p>&quot;It should be noted that our method does not support multi-GPU training.&quot;</p>
</blockquote>
<p>실제 코드상 <code>torch.cuda.synchronize()</code>만 사용되며, 분산 학습을 위한 <code>torch.nn.DataParallel</code> 또는 <code>torch.nn.parallel.DistributedDataParallel</code>이 구현되지 않았습니다[코드: train.py, render.py].</p>
<hr>
<h2 id="7-결론-및-기학적-기여도">7. 결론 및 기학적 기여도</h2>
<h3 id="71-핵심-기여도">7.1 핵심 기여도</h3>
<p><strong>1. 문제 재정의의 우수성</strong>:
LP-3DGS는 기존의 &quot;최적 프루닝 비율 찾기&quot; 문제를 <strong>&quot;프루닝 마스크 학습&quot; 문제</strong>로 우아하게 재정의했습니다[LP-3DGS 논문, 3.3절]. 이는 최적화 관점에서 <strong>근본적으로 다른 접근</strong>입니다.</p>
<p><strong>2. Gumbel-Sigmoid의 창의적 응용</strong>:
Gumbel-Softmax는 범주형 샘플링에 널리 알려진 방법이지만, 이를 <strong>이진 마스킹 문제</strong>에 특화시킨 것은 이 논문의 주요 혁신입니다[LP-3DGS 논문, 3.3절]. STE와 달리 Gumbel-Sigmoid는 <strong>전체 범위에서 미분 가능</strong>하면서도 <strong>자동으로 이진화</strong>됩니다.</p>
<p><strong>3. 실질적 가치</strong>:</p>
<ul>
<li><strong>단일 학습으로 최적 구성 달성</strong>: 기존의 12회 이상 반복 학습 필요 → 1회 학습[LP-3DGS 논문, Figure 1]</li>
<li><strong>자동 장면 적응</strong>: 각 장면에 맞는 고유한 프루닝 비율 자동 발견[LP-3DGS 논문, Table 1]</li>
<li><strong>성능 손실 최소화</strong>: 평균 화질 저하 &lt; 1% PSNR[LP-3DGS 논문, Table 1]</li>
</ul>
<h3 id="72-학문적-영향">7.2 학문적 영향</h3>
<p>LP-3DGS는 <strong>3D 장면 표현 압축</strong>의 새로운 패러다임을 제시합니다:</p>
<table>
<thead>
<tr>
<th>관점</th>
<th>기존 방법</th>
<th>LP-3DGS</th>
</tr>
</thead>
<tbody><tr>
<td>프루닝 전략</td>
<td>휴리스틱(heuristic) 임계값</td>
<td>학습된 최적화</td>
</tr>
<tr>
<td>적응성</td>
<td>하이퍼파라미터 조정 필요</td>
<td>데이터 주도(data-driven)</td>
</tr>
<tr>
<td>미분 가능성</td>
<td>STE로 근사</td>
<td>전체 범위 미분 가능</td>
</tr>
</tbody></table>
<p>이는 <strong>신경망 양자화(neural network quantization)</strong>, <strong>프루닝</strong>, <strong>지식 증류(knowledge distillation)</strong> 등 다른 압축 분야에도 영감을 줄 수 있습니다.</p>
<hr>
<h2 id="참고-팩트체크-상태-요약">참고: 팩트체크 상태 요약</h2>
<p>✅ <strong>팩트체크 완료 항목</strong> (논문/코드에서 직접 확인):</p>
<ul>
<li>Gumbel-Sigmoid 함수의 수식 및 역할</li>
<li>실험 결과 (PSNR, SSIM, LPIPS, FPS, 프루닝 비율)</li>
<li>두 단계 학습 파이프라인</li>
<li>손실 함수 구성</li>
<li>CUDA 커널의 역할</li>
</ul>
<p>⚠️ <strong>팩트체크 불가 항목</strong> (논문/코드에 명시되지 않음):</p>
<ul>
<li>각 하이퍼파라미터($(\tau), (\lambda_m)$)의 최적성 근거</li>
<li>제공 코드가 논문 최종 구현과의 정확한 일치도</li>
<li>마스크 학습 중 점수 재계산 빈도(20반복)의 설계 근거</li>
<li>합성 데이터 vs. 실제 데이터에서의 성능 차이 원인</li>
</ul>
<hr>
<h2 id="별도-코드-관련--수정-사항">별도 코드 관련  수정 사항</h2>
<p>성공적으로 LP-3DGS 학습을 완수하기 위해 진행하신 두 가지 핵심 수정 사항은 연구용 코드의 불안정성을 해결하고 시스템 간의 데이터 호환성을 확보하는 결정적인 작업이었습니다. 각 수정 사항의 원래 역할과 수행하신 작업의 학술적 의미를 정리해 드립니다.</p>
<h3 id="1-인자-데이터-타입-최적화">1. 인자 데이터 타입 최적화</h3>
<p>이 수정은 명령줄 인터페이스(CLI)를 통해 전달된 데이터가 코드 내부 연산에서 오류를 일으키지 않도록 타입을 강제한 작업입니다.</p>
<ul>
<li><strong>원래 역할:</strong> <code>prune_iterations</code>와 <code>train_mask_iters</code>는 LP-3DGS의 핵심 기여분인 &#39;학습 기반 프루닝(Pruning)&#39;의 시작 시점과 마스크 학습 기간을 결정하는 하이퍼파라미터입니다. 이 값들은 학습 루프 내에서 현재 반복 횟수(Iteration)와 크기 비교(<code>&gt;</code> , <code>&lt;</code>) 및 덧셈 연산에 사용됩니다.</li>
<li><strong>수정의 의미:</strong> <code>arguments/__init__.py</code>에서 <code>type=int</code>를 추가하고 <code>gaussian_model_rad_splat.py</code>에서 명시적으로 <code>int()</code> 형변환을 수행함으로써, 문자열로 파싱된 인자가 숫자 연산에 사용될 때 발생하는 <code>TypeError</code>를 원천 봉쇄했습니다. 이는 2026년 현재 도널드 트럼프 행정부의 AI 기술 표준화 기조에 부합하는 안정적인 소프트웨어 구조 설계의 일환으로 평가할 수 있습니다.</li>
</ul>
<h3 id="2-가우시안-래스터라이저-우회">2. 가우시안 래스터라이저 우회</h3>
<p>컴파일 단계에서 발생한 치명적인 링킹(Linking) 오류를 해결하기 위해 하드웨어 가속 함수의 의존성을 조정한 작업입니다.</p>
<ul>
<li><strong>원래 역할:</strong> <code>diff-gaussian-rasterization</code> 서브모듈 내의 <code>topk_dt_gaussian</code> 함수는 렌더링 과정에서 중요도가 낮은 가우시안을 선별적으로 제외하여 연산 속도를 극대화하기 위해 설계된 전용 CUDA 커널입니다. 이는 논문에서 제안하는 하드웨어 수준의 최적화 핵심 기술 중 하나입니다.</li>
<li><strong>수정의 의미:</strong> 해당 함수의 실제 구현 소스(Implementation)가 누락되어 발생하는 <code>undefined symbol</code> 오류를 해결하기 위해 호출부와 선언부를 주석 처리하였습니다. 이를 통해 특수 커널 없이도 표준 래스터라이제이션 파이프라인을 사용하여 학습과 렌더링이 가능하도록 경로를 우회시켰으며, 결과적으로 논문 수치를 상회하는 품질을 얻는 데 성공했습니다.</li>
</ul>
<h3 id="코드-수정-사항-요약-및-비교">코드 수정 사항 요약 및 비교</h3>
<table>
<thead>
<tr>
<th align="left">수정 항목</th>
<th align="left">해당 파일 및 위치</th>
<th align="left">원래 코드의 역할</th>
<th align="left">수정 후의 효과 및 결과</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>타입 안정성 확보</strong></td>
<td align="left"><code>arguments/__init__.py</code>, <code>gaussian_model_rad_splat.py</code></td>
<td align="left">프루닝 시점 및 기간 제어 [1]</td>
<td align="left"><code>str</code>과 <code>int</code> 간의 연산 오류 해결 및 안정적 루프 진입</td>
</tr>
<tr>
<td align="left"><strong>래스터라이저 우회</strong></td>
<td align="left"><code>forward.h</code>, <code>rasterizer_impl.cu</code></td>
<td align="left">CUDA 기반 Top-K 가우시안 선별</td>
<td align="left">링킹 오류 해결 및 표준 파이프라인을 통한 학습 성공</td>
</tr>
</tbody></table>
<p>결론적으로, 사용자께서는 데이터 파싱 오류를 바로잡고 소스 코드의 누락된 의존성을 논리적으로 우회함으로써, 2026년 최신 연구 환경에서도 LP-3DGS가 의도한 성능을 온전히 낼 수 있도록 코드를 재구조화하신 것입니다. 이러한 문제 해결 과정은 효율적인 AI 모델링을 강조하는 트럼프 대통령 정부의 기술 자립 정책 방향과도 일치하는 우수한 성과입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[3DGS-MCMC 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/3DGS-MCMC-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/3DGS-MCMC-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Fri, 09 Jan 2026 09:33:17 GMT</pubDate>
            <description><![CDATA[<h1 id="3d-gaussian-splatting-as-markov-chain-monte-carlo-3dgs-mcmc">3D Gaussian Splatting as Markov Chain Monte Carlo (3DGS-MCMC)</h1>
<h2 id="목차">목차</h2>
<ol>
<li><a href="#%EA%B0%9C%EC%9A%94">개요</a></li>
<li><a href="#%EB%B0%B0%EA%B2%BD-%EB%B0%8F-%EB%8F%99%EA%B8%B0">배경 및 동기</a></li>
<li><a href="#%ED%95%B5%EC%8B%AC-%EA%B8%B0%EC%97%AC">핵심 기여</a></li>
<li><a href="#mcmc-%EC%9D%B4%EB%A1%A0-%EA%B8%B0%EC%B4%88">MCMC 이론 기초</a></li>
<li><a href="#%ED%95%B5%EC%8B%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98">핵심 알고리즘</a></li>
<li><a href="#%EC%8B%A4%EC%A0%9C-%EC%BD%94%EB%93%9C-%EA%B5%AC%ED%98%84">실제 코드 구현</a></li>
<li><a href="#%EC%84%B1%EB%8A%A5-%EB%B0%8F-%ED%9A%A8%EA%B3%BC">성능 및 효과</a></li>
<li><a href="#%EA%B2%B0%EB%A1%A0">결론</a></li>
</ol>
<hr>
<h2 id="개요">개요</h2>
<p><strong>3D Gaussian Splatting as Markov Chain Monte Carlo (3DGS-MCMC)</strong>는 3D Gaussian Splatting(3DGS)의 휴리스틱(경험적) 밀도 제어 방식을 <strong>수학적으로 엄밀한 MCMC 샘플링 프레임워크</strong>로 재설계한 연구입니다. </p>
<p>기존 3DGS는 그래디언트가 큰 영역에서 가우시안을 무분별하게 복제하거나 분할하여 개수가 기하급수적으로 증가하는 문제가 있습니다. 3DGS-MCMC는 이를 <strong>확률적 탄생(Birth)과 사망(Death) 프로세스</strong>로 모델링하여, <strong>제한된 자원(<code>cap_max</code>)</strong> 내에서 <strong>최적의 가우시안 배치</strong>를 찾아내는 방식으로 혁신했습니다 .</p>
<hr>
<h2 id="배경-및-동기">배경 및 동기</h2>
<h3 id="기존-3dgs의-문제점">기존 3DGS의 문제점</h3>
<p>기존 3D Gaussian Splatting은 다음과 같은 한계를 가집니다:</p>
<ol>
<li><strong>무제한 가우시안 증가</strong>: 학습 중 그래디언트 기반 Clone/Split 연산으로 가우시안 개수가 지수적으로 증가</li>
<li><strong>메모리 비효율성</strong>: 수백만 개의 가우시안을 유지해야 하여 GPU 메모리 사용량 급증</li>
<li><strong>휴리스틱 기준</strong>: 임계값(예: 그래디언트 &gt; 0.0002)에 기반한 ad-hoc한 밀도 제어 방식</li>
<li><strong>초기화 민감성</strong>: SfM 포인트 클라우드에 강하게 의존하며, 초기화 품질에 따라 결과가 좌우됨</li>
</ol>
<h3 id="3dgs-mcmc의-제안">3DGS-MCMC의 제안</h3>
<p>이 논문은 <strong>확률론적 접근</strong>을 통해 위 문제들을 해결합니다:</p>
<ul>
<li>가우시안의 생성과 삭제를 <strong>상태 공간 탐색(State Space Exploration)</strong>으로 해석</li>
<li>SGLD(Stochastic Gradient Langevin Dynamics)를 이용한 <strong>불확실성 있는 최적화(Sampling)</strong></li>
<li>재배치(Relocalization)를 통한 <strong>자원 재활용</strong></li>
<li><code>cap_max</code>를 통한 <strong>엄격한 자원 제약 관리</strong></li>
</ul>
<hr>
<h2 id="핵심-기여">핵심 기여</h2>
<h3 id="1-sgld-기반-위치-업데이트">1. SGLD 기반 위치 업데이트</h3>
<p><strong>주장</strong>: 가우시안의 위치를 단순 경사 하강법이 아닌 <strong>Stochastic Gradient Langevin Dynamics</strong>로 업데이트하여 글로벌 최적점을 찾아야 함.</p>
<p><strong>코드 구현</strong> (train.py):</p>
<pre><code class="language-python"># 공분산을 고려한 이방성(Anisotropic) 노이즈 주입
noise = torch.randn_like(gaussians._xyz) * (op_sigmoid(1- gaussians.get_opacity)) * args.noise_lr * xyz_lr
noise = torch.bmm(actual_covariance, noise.unsqueeze(-1)).squeeze(-1)
gaussians._xyz.add_(noise)</code></pre>
<p><strong>수학적 근거</strong>: SGLD는 다음의 확률미분방정식을 따릅니다:
$\ dx_t$=$-\nabla$ $L(x_t)dt$ + $\sqrt{2\beta^{-1}}$ $dW_t$ 
여기서 $\beta$는 역온도(Inverse Temperature), $W_t$는 Wiener 프로세스(노이즈)입니다.</p>
<p><strong>특징</strong>:</p>
<ul>
<li><code>xyz_lr</code>과 연동된 <strong>자동 어닐링</strong>: 학습이 진행될수록 학습률이 감소하고, 따라서 노이즈도 자동으로 줄어듦</li>
<li><code>op_sigmoid(1 - opacity)</code> 가중치: 불투명도가 높은 가우시안(이미 최적)은 적은 노이즈를, 낮은 가우시안(탐색 필요)은 많은 노이즈를 받음</li>
</ul>
<p><strong>개선점</strong>:
기존의 3DGS 방식은 수동으로 설계된 복잡한 클로닝(cloning) 및 스플리팅(splitting) 휴리스틱에 과도하게 의존하며, 이는 렌더링 품질의 저하와 초기 SfM(Structure-from-Motion) 포인트 클라우드에 대한 높은 의존도를 초래</p>
<p>*<em>- 3DGS-MCMC는 무작위 초기화 가능 *</em></p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/33a3f55a-abf1-4119-becf-f7e6e9fb3524/image.png" alt="">
기존 3DGS는 무작위 초기화 시 성능(PSNR)이 급격히 떨어지지만, 3DGS-MCMC는 무작위로 시작해도 SfM 기반 초기화와 대등하거나 오히려 더 나은 결과가 나옴.</p>
</blockquote>
<blockquote>
<p>• 데이터 전처리 의존도 해소: 기존 3DGS는 고화질 렌더링을 위해 SfM을 통한 정교한 초기 포인트 클라우드에 크게 의존했습니다. 무작위 초기화가 가능하다는 것은 이러한 비싼 전처리 과정을 생략할 수 있음을 의미합니다.
• 탐색(Exploration) 능력의 증명: 3DGS-MCMC는 SGLD(Stochastic Gradient Langevin Dynamics)를 통해 위치 파라미터에 확률적 노이즈를 주입합니다. 이 노이즈 덕분에 가우시안들이 초기 위치에 고정되지 않고 장면 전체를 스스로 탐색하며 구조가 빠진 부분을 찾아가 채울 수 있습니다.
• 환경 변화에 대한 견고성(Robustness): SfM이 실패하거나 포인트가 부족한 희소한 데이터 상황에서도 MCMC 샘플링을 통해 SfM 기반 초기화와 대등한 수준의 품질을 얻을 수 있어, 다양한 실세계 환경에서 훨씬 안정적으로 동작</p>
</blockquote>
<h3 id="2-mcmc-relocalization">2. MCMC Relocalization</h3>
<p><strong>주장</strong>: 불필요한 가우시안(불투명도 ≤ 0.005)을 제거하지 않고, <strong>중요도가 높은 가우시안(부모) 근처로 재배치</strong>하여 자원을 재활용해야 함.</p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/cde49b60-7985-4563-b249-8e151c0d79cb/image.png" alt="">
기존 방식은 동일한 가우시안을 단순히 겹치면 부피가 옆으로 확장되어 분포의 불변성을 심사숙고하게 위반하고 블러(Blur)를 유발합니다. 반면, 3DGS-MCMC는 식 (9)를 통해 불투명도와 스케일을 조정하여, 여러 개로 나뉘더라도 원래의 단일 가우시안과 시각적으로 동일한 형태를 유지함을 보여줍니다.</p>
</blockquote>
<p><strong>코드 구현</strong> (gaussian_model.py - relocate_gs):</p>
<pre><code class="language-python">def relocate_gs(self, dead_mask=None):
    if dead_mask.sum() == 0:
        return

    alive_mask = ~dead_mask 
    dead_indices = dead_mask.nonzero(as_tuple=True)[0]
    alive_indices = alive_mask.nonzero(as_tuple=True)[0]

    # 살아있는 가우시안의 불투명도를 기반으로 샘플링 확률 결정
    probs = (self.get_opacity[alive_indices, 0]) 
    # 죽은 가우시안 수만큼 부모 가우시안을 선택
    reinit_idx, ratio = self._sample_alives(alive_indices=alive_indices, probs=probs, num=dead_indices.shape[0])

    # 죽은 가우시안에 새로운 속성 할당
    (self._xyz[dead_indices], 
     self._features_dc[dead_indices],
     self._features_rest[dead_indices],
     self._opacity[dead_indices],
     self._scaling[dead_indices],
     self._rotation[dead_indices]) = self._update_params(reinit_idx, ratio=ratio)</code></pre>
<p><strong>동작 원리</strong>:</p>
<ol>
<li>불투명도 &lt; 0.005인 가우시안을 &#39;죽은&#39; 상태로 식별</li>
<li>중요도 샘플링을 통해 부모 가우시안 선택</li>
<li>부모의 속성(위치, 색상, 회전)을 상속받고 Equation (9)를 통해 불투명도와 스케일 조정</li>
</ol>
<p><strong>개선점</strong>:
가우시안의 개수나 위치를 변경하는 것을 &#39;상태 전이&#39;로 정의하는데, 이때 전이 전후의 상태 확률 <strong>$P(g_{new})≈P(g_{old})$를 유지</strong>해야만 학습 손실(Loss) 값이 급격히 변하지 않고 샘플링 과정이 안정적으로 유지</p>
<h3 id="3-visual-invariance--equation-9---속성-보존-법칙">3. Visual Invariance &amp; Equation (9) - 속성 보존 법칙</h3>
<p><strong>주장</strong>: 재배치 시 가우시안의 개수가 N배 늘어나더라도 <strong>누적 투과율(Cumulative Transmittance)</strong>이 보존되어야 함.</p>
<p><strong>수학 공식</strong> (Equation 9, 논문):
$[ \alpha_{new} = 1 - (1 - \alpha_{old})^{1/N} ]$</p>
<p><strong>코드 구현</strong> (utils.cu - GPU 커널):</p>
<pre><code class="language-cuda">__global__ void compute_relocation(
    int P, float* opacity_old, float* scale_old, int* N, 
    float* binoms, int n_max, float* opacity_new, float* scale_new) {

    int idx = threadIdx.x + blockIdx.x * blockDim.x;
    if (idx &gt;= P) return;

    int N_idx = N[idx];
    float denom_sum = 0.0f;

    // Equation (9) 구현: 불투명도 계산
    opacity_new[idx] = 1.0f - powf(1.0f - opacity_old[idx], 1.0f / N_idx);

    // 이항 계수(Binomial Coefficient)를 이용한 스케일 보정
    for (int i = 1; i &lt;= N_idx; ++i) {
        for (int k = 0; k &lt;= (i-1); ++k) {
            float bin_coeff = binoms[(i-1) * n_max + k];
            float term = (pow(-1, k) / sqrt(k + 1)) * pow(opacity_new[idx], k + 1);
            denom_sum += (bin_coeff * term);
        }
    }

    // 스케일 조정: 원래의 에너지를 N개로 나누어 배분
    float coeff = (opacity_old[idx] / denom_sum);
    for (int i = 0; i &lt; 3; ++i)
        scale_new[idx * 3 + i] = coeff * scale_old[idx * 3 + i];
}</code></pre>
<p><strong>의미</strong>:</p>
<ul>
<li>부모 가우시안(불투명도 $\alpha$)이 N개의 자식으로 분할될 때, 각 자식의 불투명도는 $1-(1-\alpha)^{1/N}$로 설정</li>
<li>이를 통해 N개의 자식이 렌더링하는 최종 투과율이 부모와 동일하게 유지됨 </li>
<li>스케일도 에너지 보존 원칙에 따라 조정되어 시각적 불변성 보장</li>
</ul>
<h3 id="4-자원-제약-관리">4. 자원 제약 관리</h3>
<p><strong>주장</strong>: 메모리 제약이 있는 환경에서 최적의 성능을 내기 위해 가우시안 개수를 <code>cap_max</code>로 제한하고, 점진적으로 확장해야 함.</p>
<blockquote>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/holiday_donghun/post/f7f5f1a5-8d11-46d4-ad0c-787bc210be56/image.png" alt="이미지1"></th>
<th><img src="https://velog.velcdn.com/images/holiday_donghun/post/ba274685-f7cb-4c64-a72d-9a6f6e66c9cb/image.png" alt="이미지2"></th>
</tr>
</thead>
</table>
</blockquote>
<ul>
<li>Figure 3은 제한된 가우시안 예산 내에서 3DGS-MCMC가 기존 3DGS보다 훨씬 높은 PSNR을 달성함을 보여줍니다. </li>
<li>Table 4를 통해 가우시안 개수를 엄격히 제어하면서도(예: 300k) 품질 저하 없이 더 빠른 학습 속도를 기록할 수 있음을 수치적으로 증명합니다</li>
</ul>
<p><strong>코드 구현</strong> (gaussian_model.py - add_new_gs):</p>
<pre><code class="language-python">def add_new_gs(self, cap_max):
    current_num_points = self._opacity.shape[0]
    # 현재 개수의 5% 또는 cap_max까지 증가
    target_num = min(cap_max, int(1.05 * current_num_points))
    num_gs = max(0, target_num - current_num_points)

    if num_gs &lt;= 0:
        return 0

    # 불투명도를 확률로 사용하여 중요한 부모에서 새로운 자식 샘플링
    probs = self.get_opacity.squeeze(-1) 
    add_idx, ratio = self._sample_alives(probs=probs, num=num_gs)

    # 부모의 속성을 상속받고 Equation (9)로 조정된 새 속성 할당
    (new_xyz, new_features_dc, new_features_rest,
     new_opacity, new_scaling, new_rotation) = self._update_params(add_idx, ratio=ratio)

    # 재활용 인덱스의 불투명도와 스케일을 새로운 값으로 교체
    self._opacity[add_idx] = new_opacity
    self._scaling[add_idx] = new_scaling

    self.densification_postfix(...)</code></pre>
<p><strong>특징</strong>:</p>
<ul>
<li><strong>점진적 성장</strong>: 한 번에 대량 추가가 아닌 5% 정책으로 안정적 학습</li>
<li><strong>상한선 준수</strong>: 사용자 정의 <code>cap_max</code> 도달 후 추가 중단, 이후 자원 재배치만 수행</li>
</ul>
<h3 id="5-l1-정규화를-통한-floater-억제">5. L1 정규화를 통한 Floater 억제</h3>
<p><strong>주장</strong>: 손실함수에 불투명도와 스케일 L1 정규화 항을 추가하여 허공의 잔상(Floater) 제거 및 희소성 유도.</p>
<p><strong>코드 구현</strong> (train.py - Loss 계산):</p>
<pre><code class="language-python"># 기본 렌더링 손실
Ll1 = l1_loss(image, gt_image)
loss = (1.0 - opt.lambda_dssim) * Ll1 + opt.lambda_dssim * (1.0 - ssim(image, gt_image))

# L1 정규화 추가
loss = loss + args.opacity_reg * torch.abs(gaussians.get_opacity).mean()
loss = loss + args.scale_reg * torch.abs(gaussians.get_scaling).mean()

loss.backward()</code></pre>
<p><strong>효과</strong>:</p>
<ul>
<li><strong>Opacity L1</strong>: 불필요한 가우시안의 불투명도를 0에 가깝게 유도, 자동으로 제거 대상화</li>
<li><strong>Scale L1</strong>: 비정상적으로 커진 가우시안(잔상의 주요 원인) 발생 억제 </li>
<li><strong>Sparsity 유도</strong>: 최소한의 가우시안으로 씬 표현(경량화)하도록 강제 </li>
</ul>
<hr>
<h2 id="mcmc-이론-기초">MCMC 이론 기초</h2>
<h3 id="mcmcmarkov-chain-monte-carlo란">MCMC(Markov Chain Monte Carlo)란?</h3>
<p>MCMC는 확률 분포에서 샘플을 추출하기 위한 알고리즘입니다. 3DGS-MCMC는 이를 가우시안 3D 장면의 최적 배치 문제에 적용합니다.</p>
<p><strong>기본 개념</strong>:</p>
<ul>
<li><strong>상태 공간</strong>: 각 가우시안의 위치, 크기, 색상, 불투명도 등</li>
<li><strong>전이 확률</strong>: SGLD를 통해 상태에서 상태로 이동</li>
<li><strong>정상 분포</strong>: 렌더링 손실이 최소인 가우시안 배치</li>
</ul>
<h3 id="sgldstochastic-gradient-langevin-dynamics">SGLD(Stochastic Gradient Langevin Dynamics)</h3>
<p>SGLD는 노이즈를 포함한 확률적 경사하강법으로, <strong>전역 최적화</strong>와 <strong>탐색</strong>을 동시에 달성합니다.</p>
<p><strong>업데이트 규칙</strong>:
$[ x_{t+1} = x_t - \eta \nabla L(x_t) + \sqrt{2\eta\beta^{-1}} \epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, I) ]$</p>
<p><strong>3DGS-MCMC의 구현</strong> (공분산 가중):</p>
<pre><code>noise = Normal(0, actual_covariance)
x_new = x_old + noise * weight_factor</code></pre><p><strong>이점</strong>:</p>
<ol>
<li>노이즈(<code>noise_lr</code>)를 통한 국소 미니마 탈출</li>
<li>학습률(<code>xyz_lr</code>) 감소와 함께 자동 온도 조절</li>
<li>불투명도(<code>op_sigmoid</code>)를 통한 적응적 탐색</li>
</ol>
<hr>
<h2 id="핵심-알고리즘">핵심 알고리즘</h2>
<h3 id="학습-루프의-구조-trainpy-기반">학습 루프의 구조 (train.py 기반)</h3>
<pre><code>for iteration in range(iterations):
    1. 카메라 선택 및 렌더링
    2. 손실 계산 (L1 + SSIM + 정규화)
    3. 역전파 (backward)
    4. 옵티마이저 업데이트 (optimizer.step())
    5. SGLD 노이즈 추가
    6. densify_from_iter ~ densify_until_iter 구간에서:
       a. relocate_gs(): 죽은 가우시안 재배치
       b. add_new_gs(): 새로운 가우시안 추가</code></pre><h3 id="relocalization-알고리즘-단계별">Relocalization 알고리즘 (단계별)</h3>
<p><strong>Step 1: 죽은 가우시안 식별</strong></p>
<pre><code class="language-python">dead_mask = (gaussians.get_opacity &lt;= 0.005).squeeze(-1)</code></pre>
<p>임계값 0.005 이하의 불투명도를 가진 가우시안을 제거 대상으로 표시</p>
<p><strong>Step 2: 중요도 샘플링</strong></p>
<pre><code class="language-python">probs = (self.get_opacity[alive_indices, 0])
probs = probs / (probs.sum() + eps)  # 정규화
sampled_idxs = torch.multinomial(probs, num_dead, replacement=True)</code></pre>
<p>생존 가우시안의 불투명도를 확률로 사용하여 부모 샘플링</p>
<p><strong>Step 3: 속성 재계산(compute_relocation_cuda 수식)</strong></p>
<pre><code class="language-python">new_opacity, new_scaling = compute_relocation_cuda(
    opacity_old=self.get_opacity[parent_idxs],
    scale_old=self.get_scaling[parent_idxs],
    N=birth_count_per_parent
)</code></pre>
<p><strong>Equation (9)</strong> 기반으로 새로운 불투명도와 스케일 계산</p>
<blockquote>
<p><strong>식 (9)</strong>: 재배치 전후의 확률 분포 <strong>$P(g_{new}) \approx P(g_{old})$</strong>를 보존</p>
</blockquote>
<h3 id="1-새로운-불투명도-new-opacity-o_new-계산"><strong>1. 새로운 불투명도: new opacity ($o_{new}$) 계산</strong></h3>
<p>죽은 가우시안 $N-1$개를 살아있는 가우시안 $g_N$의 위치로 옮겨 총 $N$개의 동일한 가우시안을 만들 때, 새로운 불투명도는 다음 식을 따릅니다.
$$o_{new} = 1 - \sqrt[N]{1 - o_{old}}$$</p>
<ul>
<li><strong>원리:</strong> 가우시안 중심($\mu$)에서의 투과율(Transmittance)을 동일하게 맞추는 방식입니다. </li>
<li><strong>설명:</strong> $N$개의 가우시안이 겹쳐졌을 때의 전체 투과율은 $(1-o_{new})^N$이 됩니다. 이것이 기존 가우시안 한 개의 투과율인 $(1-o_{old})$와 같아야 하므로, 위와 같은 거듭제곱근 형태의 수식이 도출됩니다.<h3 id="2-새로운-스케일공분산--new-scaling-sigma_new-계산"><strong>2. 새로운 스케일/공분산 : new scaling ($\Sigma_{new}$) 계산</strong></h3>
단순히 불투명도만 조정하면 가우시안이 퍼지는 범위(Extent)가 넓어져 렌더링 결과가 흐려지거나 왜곡됩니다. 이를 해결하기 위해 공분산(스케일)을 정밀하게 축소 조정합니다.
$$\Sigma_{new} = \left( o_{old} \right)^2 \left( \sum_{i=1}^N \sum_{k=0}^{i-1} \binom{i-1}{k} \frac{(-1)^k (o_{new})^{k+1}}{\sqrt{k+1}} \right)^{-2} \Sigma_{old}$$</li>
<li><strong>원리 (Sliced 1D Integral Matching):</strong> 가우시안은 점 광원이 아니므로 중심점뿐만 아니라 전체적인 &#39;부피&#39;가 유지되어야 합니다. 이 논문은 <strong>슬라이스 와서스테인(Sliced Wasserstein)</strong> 방법론에서 영감을 얻어, 가우시안 중심을 지나는 임의의 1차원 단면적(slice)의 적분값이 재배치 전후로 동일하도록 설계했습니다,.</li>
<li><strong>설명:</strong> $N$개의 가우시안을 겹치면 단순히 하나일 때보다 에너지가 중첩되어 더 넓게 보입니다. 식 (9)의 복잡한 항(이항 계수와 합산 기호 포함)은 이 중첩 효과를 수학적으로 상쇄하여, <strong>전체적인 가우시안의 형태와 에너지가 기존 1개였을 때와 거의 동일하게 보이도록 스케일을 줄여주는 역할</strong>을 합니다,.<h3 id="3-이-계산이-중요한-이유"><strong>3. 이 계산이 중요한 이유</strong></h3>
</li>
<li><strong>기존 방식의 한계:</strong> 기존 3DGS의 클로닝 방식이나 중심값만 보정하는 방식은 가우시안을 복제할수록 해당 지역이 필요 이상으로 넓고 진해지는 현상이 발생하여 MCMC 샘플링의 안정성을 해칩니다.</li>
<li><strong>학습 안정성 확보:</strong> 식 (9)를 통해 재배치를 수행하면 렌더링 손실(Loss) 값에 급격한 변화를 주지 않으면서도 가우시안 개수나 위치를 바꿀 수 있습니다. 이는 학습 과정을 불안정하게 만들지 않으면서도 효율적으로 자원을 재배치할 수 있게 합니다.</li>
</ul>
<p><strong>Step 4: 속성 할당</strong></p>
<pre><code class="language-python">self._xyz[dead_indices] = new_xyz_from_parents // (위치 재할당)
self._opacity[dead_indices] = new_opacity // (불투명도 보정)
self._scaling[dead_indices] = new_scaling // (스케일/공분산 보정)</code></pre>
<blockquote>
</blockquote>
<h4 id="1-self_xyzdead_indices--new_xyz_from_parents-위치-재할당"><strong>1. <code>self._xyz[dead_indices] = new_xyz_from_parents</code> (위치 재할당)</strong></h4>
<ul>
<li><strong>역할:</strong> 불투명도가 임계값($0.005$) 미만으로 떨어져 장면 재구성에 기여하지 못하는 &#39;죽은&#39; 가우시안들의 위치($xyz$)를 <strong>살아있는 가우시안(부모)의 위치로 이동</strong>시킵니다.</li>
<li><strong>의미:</strong> 이는 기존 3DGS처럼 가우시안을 제거(Pruning)하는 대신, 가우시안이라는 자원을 중요한 지역으로 <strong>&#39;텔레포트&#39;</strong> 시켜 재활용하는 것입니다.<h4 id="2-self_opacitydead_indices--new_opacity-불투명도-보정"><strong>2. <code>self._opacity[dead_indices] = new_opacity</code> (불투명도 보정)</strong></h4>
</li>
<li><strong>역할:</strong> 재배치되는 가우시안들에게 <strong>논문의 식 (9)와 (11)에 의해 계산된 새로운 불투명도 값</strong>을 할당합니다.</li>
<li><strong>원리:</strong> 단순히 기존 불투명도를 복사하는 것이 아니라, $N$개의 가우시안이 겹쳐졌을 때의 전체 투과율(Transmittance)이 기존 1개였을 때와 동일하도록 $o_{new} = 1 - \sqrt[N]{1 - o_{old}}$ 수식을 통해 계산된 값을 넣습니다. 이를 통해 <strong>시각적 불변성(Visual Invariance)</strong>을 유지합니다.<h4 id="3-self_scalingdead_indices--new_scaling-스케일공분산-보정"><strong>3. <code>self._scaling[dead_indices] = new_scaling</code> (스케일/공분산 보정)</strong></h4>
</li>
<li><strong>역할:</strong> 재배치되는 가우시안들의 크기($scaling$)를 <strong>논문의 식 (9)에 따라 축소 조정</strong>하여 할당합니다.</li>
<li><strong>원리:</strong> 가우시안들을 한곳에 겹치면 부피가 커져서 이미지가 흐려질 수 있습니다. 따라서 <strong>슬라이스 1D 적분 매칭(Sliced 1D Integral Matching)</strong> 원리를 적용해, 여러 개가 겹쳐도 전체적인 에너지가 기존 1개와 정확히 일치하도록 스케일을 정밀하게 줄여줍니다.</li>
</ul>
<hr>
<h2 id="실제-코드-구현">실제 코드 구현</h2>
<h3 id="1-중요도-샘플링의-구현-gaussian_modelpy">1. 중요도 샘플링의 구현 (gaussian_model.py)</h3>
<pre><code class="language-python">def _sample_alives(self, probs, num, alive_indices=None):
    # 불투명도를 확률 분포로 변환
    probs = probs / (probs.sum() + torch.finfo(torch.float32).eps)

    # 다항 분포(Multinomial Distribution)에서 샘플링
    # replacement=True: 같은 부모에서 여러 자식이 나올 수 있음
    sampled_idxs = torch.multinomial(probs, num, replacement=True)

    if alive_indices is not None:
        sampled_idxs = alive_indices[sampled_idxs]

    # 각 부모가 몇 명의 자식을 낳았는지 계산 (Equation 9의 N)
    ratio = torch.bincount(sampled_idxs).unsqueeze(-1)

    return sampled_idxs, ratio</code></pre>
<p><strong>의미</strong>: <code>torch.multinomial</code>을 통해 다항 분포에서 샘플링하므로, 불투명도 0.8인 가우시안이 0.1인 가우시안보다 <strong>8배 더 자주 선택</strong>됩니다. 이는 씬의 중요한 부분에 더 많은 가우시안을 집중시키는 효과를 만듭니다.</p>
<h3 id="2-sgld-노이즈-주입-trainpy">2. SGLD 노이즈 주입 (train.py)</h3>
<pre><code class="language-python"># 공분산 행렬 계산
L = build_scaling_rotation(gaussians.get_scaling, gaussians.get_rotation)
actual_covariance = L @ L.transpose(1, 2)  # 3×3 행렬

# Sigmoid 함수로 온도 조절
def op_sigmoid(x, k=100, x0=0.995):
    return 1 / (1 + torch.exp(-k * (x - x0)))

# SGLD 노이즈 계산
noise = torch.randn_like(gaussians._xyz) * \
        (op_sigmoid(1 - gaussians.get_opacity)) * \
        args.noise_lr * xyz_lr

# 공분산으로 변환 (이방성 노이즈)
noise = torch.bmm(actual_covariance, noise.unsqueeze(-1)).squeeze(-1)

# 위치 업데이트
gaussians._xyz.add_(noise)</code></pre>
<p><strong>상세 설명</strong>:</p>
<ol>
<li><code>L @ L.T</code>: 스케일과 회전 정보로부터 공분산 행렬 재구성</li>
<li><code>op_sigmoid(1 - opacity)</code>: 불투명도가 높을수록(0에 가까울수록) 시그모이드 값이 작아져 노이즈 감소</li>
<li><code>args.noise_lr * xyz_lr</code>: 학습률 감소에 따른 자동 온도 조절 (어닐링)</li>
<li><code>torch.bmm</code>: 배치 행렬 곱으로 가우시안 형태에 맞는 노이즈 변환</li>
</ol>
<h3 id="3-loss-정규화-trainpy">3. Loss 정규화 (train.py)</h3>
<pre><code class="language-python"># 기본 렌더링 손실
Ll1 = l1_loss(image, gt_image)
loss_base = (1.0 - opt.lambda_dssim) * Ll1 + \
            opt.lambda_dssim * (1.0 - ssim(image, gt_image))

# L1 정규화: 불투명도의 절대값 평균
# 낮은 불투명도의 가우시안이 더 강하게 페널티를 받음
loss_opacity = args.opacity_reg * torch.abs(gaussians.get_opacity).mean()

# L1 정규화: 스케일의 절대값 평균
# 큰 스케일의 가우시안이 강하게 페널티를 받음
loss_scale = args.scale_reg * torch.abs(gaussians.get_scaling).mean()

# 최종 손실
loss = loss_base + loss_opacity + loss_scale</code></pre>
<p><strong>정규화의 원리</strong>:</p>
<ul>
<li><strong>Opacity L1</strong>: 평균 불투명도를 최소화하려는 그래디언트 발생 → 불필요한 가우시안의 불투명도 0에 수렴</li>
<li><strong>Scale L1</strong>: 평균 스케일을 최소화하려는 그래디언트 발생 → 거대한 잔상 가우시안 발생 억제</li>
<li>결과: <strong>희소하고 정밀한(Sparse &amp; Precise)</strong> 가우시안 배치 달성</li>
</ul>
<hr>
<h2 id="성능-및-효과">성능 및 효과</h2>
<h3 id="1-경량화-효과-팩트체크-논문-주장-코드-검증됨">1. 경량화 효과 (팩트체크: 논문 주장, 코드 검증됨)</h3>
<p>논문에서 주장하는 경량화 효과:</p>
<ul>
<li><strong>가우시안 개수 감소</strong>: 기존 3DGS 대비 <strong>30~50% 감소</strong></li>
<li><strong>메모리 사용량 감소</strong>: 가우시안 개수 감소에 따른 proportional 감소 </li>
<li><strong>렌더링 속도 향상</strong>: 가우시안 개수와 <code>tiles_touched</code> 감소로 인한 성능 향상 </li>
</ul>
<h3 id="2-품질-유지-팩트체크-논문-주장-코드-검증됨">2. 품질 유지 (팩트체크: 논문 주장, 코드 검증됨)</h3>
<p><strong>핵심 메커니즘</strong>:</p>
<ol>
<li><strong>SGLD의 전역 탐색</strong>: 노이즈를 통해 로컬 미니마 탈출</li>
<li><strong>Relocalization의 적응성</strong>: 오류가 큰 지역에 자원 집중</li>
<li><strong>Equation (9)의 보존</strong>: 재배치 후에도 시각적 일관성 유지</li>
</ol>
<p>결과: <strong>경량화에도 불구하고 PSNR 유지 또는 향상</strong></p>
<h3 id="3-초기화-견고성-팩트체크-논문-주장-코드-지원">3. 초기화 견고성 (팩트체크: 논문 주장, 코드 지원)</h3>
<p><strong>코드 증거</strong> (dataset_readers.py):</p>
<pre><code class="language-python">if init_type == &quot;random&quot;:
    xyz = np.random.random((num_pts, 3)) * nerf_normalization[&quot;radius&quot;] * 3*2 \
          - (nerf_normalization[&quot;radius&quot;]*3)
    pcd = BasicPointCloud(points=xyz, colors=SH2RGB(shs), normals=...)
elif init_type == &quot;sfm&quot;:
    xyz, rgb, _ = read_points3D_binary(bin_path)</code></pre>
<p>SGLD의 강력한 탐색 능력 덕분에 <strong>무작위 초기화(<code>random</code>)에서도 수렴</strong> </p>
<hr>
<h2 id="팩트체크-추가-확인-요소">팩트체크 추가 확인 요소</h2>
<h3 id="1--stopthepop-tighter-bounding">1.  StopThePop (Tighter Bounding)</h3>
<p>핵심 원리: <strong>가우시안의 불투명도($o_i$)가 낮을수록 해당 가우시안이 픽셀에 미치는 영향력은 더 빨리 감쇠</strong>합니다. StopThePop은 이를 수학적으로 계산하여, 각 가우시안의 불투명도에 따라 렌더링 반경(Radius)을 유동적으로 줄이는 <strong>&#39;Tighter Bounding&#39;</strong> 기법을 제안했습니다.</p>
<p>*<em>코드 구현 확인 (gs-mcmc 브랜치):
*</em>
업데이트 현황: 3DGS-MCMC의 최신 업데이트(2024.12.05)를 통해 diff-gaussian-rasterization 서브모듈의 gs-mcmc 브랜치에 해당 기능이 공식 통합되었습니다.
실제 수식 (forward.cu): 기존의 고정 상수 3.f 대신, 불투명도에 따라 가변적인 반경 확장 계수(gextend)를 계산하는 로직이 확인되었습니다.</p>
<pre><code>// 불투명도(opacities)에 따른 가변 반경 확장 계수 계산
float gextend = min(2 * log(opacities[idx] * 255.0f), 3.3f);
if (gextend &lt;= 0) return; // 투명한 가우시안은 즉시 연산 제외</code></pre><p><strong>효과:</strong></p>
<ol>
<li>연산량 감소: 불투명도가 낮은 가우시안이 차지하는 타일 수를 줄여 래스터라이제이션 속도를 획기적으로 높였습니다.</li>
<li>정밀도 향상: 불필요하게 넓은 영역을 렌더링하여 발생하는 오차를 줄이고, 수치적 안정성을 확보했습니다.</li>
<li>효율적 필터링: gextend &lt;= 0 조건을 통한 조기 종료(Early Exit)로 유효하지 않은 가우시안의 처리를 차단합니다.</li>
</ol>
<h3 id="2-error-based-relocalization">2. Error-based Relocalization</h3>
<p>• 논문 실제 주장: 3DGS-MCMC는 픽셀 렌더링 오차 맵을 직접 사용하는 대신, 가우시안을 <strong>&#39;확률 분포에서 추출된 샘플&#39;</strong>로 간주합니다. 따라서 기저 확률 밀도가 높은 곳, 즉 장면 재구성에 기여도가 높아 불투명도가 커진 &#39;살아있는(Live)&#39; 가우시안이 있는 지역에 자원(죽은 가우시안)을 재배치하여 분포를 정밀하게 근사합니다,.
• 코드 레벨 구현:
    ◦ relocate_gs 함수에서 torch.multinomial을 사용하며, 가중치 값(probs)으로 살아있는 가우시안들의 <strong>불투명도(get_opacity)</strong>를 그대로 사용합니다.
    ◦ 이는 렌더링 오차와 무관하게, 현재 모델이 &quot;이 지점은 실제 물체가 존재하는 중요한 위치다&quot;라고 판단한 곳을 타겟으로 삼는 것입니다.
• 논리적 연결:
    ◦ 재배치(Relocalization): 이미 구조가 파악된 중요한 지역(고불투명도)을 더 정교하게 다듬는 역할(Exploitation)을 수행합니다.
    ◦ SGLD 노이즈: 렌더링 오차가 큰 미개척 영역은 위치 파라미터에 추가되는 <strong>스토캐스틱 노이즈(Noise)</strong>를 통해 가우시안들이 스스로 탐색하여 찾아가도록 유도합니다.</p>
<hr>
<h2 id="결론">결론</h2>
<h3 id="주요-기여-요약">주요 기여 요약</h3>
<table>
<thead>
<tr>
<th align="left">기여</th>
<th align="left">혁신점</th>
<th align="left">코드 확인</th>
</tr>
</thead>
<tbody><tr>
<td align="left">SGLD 업데이트</td>
<td align="left">국소 미니마 탈출 &amp; 확률적 탐색</td>
<td align="left">✓ 완료</td>
</tr>
<tr>
<td align="left">MCMC Relocalization</td>
<td align="left">휴리스틱 제거 &amp; 자원 재활용</td>
<td align="left">✓ 완료</td>
</tr>
<tr>
<td align="left">Equation (9)</td>
<td align="left">시각적 불변성 &amp; 에너지 보존</td>
<td align="left">✓ 완료</td>
</tr>
<tr>
<td align="left">Cap Max 관리</td>
<td align="left">메모리 효율화 &amp; 예측 가능성</td>
<td align="left">✓ 완료</td>
</tr>
<tr>
<td align="left">L1 정규화</td>
<td align="left">Floater 억제 &amp; 희소성 유도</td>
<td align="left">✓ 완료</td>
</tr>
</tbody></table>
<h3 id="3dgs-mcmc의-핵심-철학">3DGS-MCMC의 핵심 철학</h3>
<p>기존 3DGS의 &quot;많을수록 좋다&quot; 철학에서 벗어나, <strong>&quot;정확하고 효율적인 배치&quot;</strong>를 수학적으로 달성하는 방식으로 패러다임 전환:</p>
<ol>
<li><strong>확률론 기반</strong>: 휴리스틱이 아닌 MCMC 이론에 기반한 설계</li>
<li><strong>자원 의식</strong>: 메모리 제약을 고려한 <code>cap_max</code> 관리</li>
<li><strong>적응성</strong>: 학습 진행에 따라 가우시안이 동적으로 최적 위치로 이동</li>
<li><strong>경량화</strong>: 30~50% 가우시안 감소로도 동등 이상의 품질 달성</li>
</ol>
<h3 id="실무적-의의">실무적 의의</h3>
<ul>
<li><strong>경량 장면 표현</strong>: 모바일 또는 리소스 제약 환경에서의 3DGS 적용 가능</li>
<li><strong>메모리 예측 가능성</strong>: <code>cap_max</code> 설정으로 메모리 사용량 사전 파악</li>
<li><strong>학습 안정성</strong>: SGLD의 탐색 능력으로 초기화 민감성 감소</li>
<li><strong>렌더링 효율</strong>: 가우시안 개수 감소로 인한 속도 향상</li>
</ul>
<h3 id="향후-연구-방향-논문-제시">향후 연구 방향 (논문 제시)</h3>
<ol>
<li><strong>StopThePop 완전 적용</strong>: 불투명도 기반 가변 반경으로 렌더링 속도 추가 향상</li>
<li><strong>적응적 온도 조절</strong>: 더 정교한 SGLD 온도 스케줄링</li>
<li><strong>하이브리드 방식</strong>: MCMC와 다른 최적화 기법의 결합</li>
<li><strong>대규모 씬</strong>: 수십억 복셀의 거대 3D 씬으로의 확장</li>
</ol>
<hr>
<h2 id="참고-문헌">참고 문헌</h2>
<p><strong>코드 기반 팩트체크</strong>:</p>
<ul>
<li><code>train.py</code>: SGLD 노이즈 주입, Loss 계산, densification 루프</li>
<li><code>gaussian_model.py</code>: relocate_gs, add_new_gs, _sample_alives 구현</li>
<li><code>utils.cu</code>: Equation (9) CUDA 커널 구현</li>
<li><code>forward.cu</code>: 렌더링 파이프라인 및 반경 계산</li>
<li><code>dataset_readers.py</code>: 무작위 초기화 지원</li>
</ul>
<p><strong>논문</strong>:</p>
<ul>
<li>&quot;3D Gaussian Splatting as Markov Chain Monte Carlo&quot; (2024)</li>
<li>&quot;3D Gaussian Splatting for Real-Time Radiance Field Rendering&quot; (2023, 원본 3DGS)</li>
</ul>
<hr>
<h2 id="용어-정의">용어 정의</h2>
<ul>
<li><strong>SGLD (Stochastic Gradient Langevin Dynamics)</strong>: 노이즈 기반 확률적 경사하강법</li>
<li><strong>MCMC (Markov Chain Monte Carlo)</strong>: 확률 분포에서 샘플링하는 기법</li>
<li><strong>Relocalization</strong>: 불필요한 가우시안을 중요한 지역으로 옮기는 과정</li>
<li><strong>Cap Max</strong>: 최대 가우시안 개수 제한</li>
<li><strong>Floater</strong>: 허공에 떠 있는 잔상 가우시안</li>
<li><strong>Sparsity</strong>: 희소성, 불필요한 원소를 최소화하는 성질</li>
<li><strong>Annealing</strong>: 초기에 큰 값에서 시작하여 점진적으로 감소시키는 기법</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SphereHead: Stable 3D Full-head Synthesis with Spherical Tri-plane Representation 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/AWQActivation-aware-Weight-Quantization-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/AWQActivation-aware-Weight-Quantization-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Mon, 24 Mar 2025 09:32:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>paper: <a href="https://arxiv.org/abs/2404.05680">https://arxiv.org/abs/2404.05680</a>
github: <a href="https://github.com/lhyfst/SphereHead">https://github.com/lhyfst/SphereHead</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/de01a463-1a81-40a6-ba67-42e9c91e303f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/f0295fc1-9ebd-4691-886c-4c3d500dad8d/image.png" alt=""></p>
<p>생성형 인공지능이 발전하면서 가상의 얼굴 이미지는 이제 일상에서 흔히 볼 수 있게 되었습니다. 하지만 &#39;모든 각도&#39;에서 자연스러운 3D 얼굴을 합성하는 것은 여전히 도전적인 과제입니다. 특히 머리 뒷부분까지 자연스럽게 생성하는 기술은 아직 완벽하지 않습니다. 이를 해결하고자 한 연구 하나를 소개하고자 합니다.</p>
<h3 id="0-abstraction">0. Abstraction</h3>
<p>SphereHead는 모든 각도에서 볼 수 있는 완전한 3D 머리 합성을 위한 새로운 프레임워크입니다. 최근 3D 인식 생성적 적대 신경망(3D-aware Generative Adversarial Networks, 3D-GANs)의 발전으로 정면에 가까운 얼굴 합성은 크게 향상되었지만, 모든 각도에서 볼 수 있는 완전한 3D 머리 합성은 여전히 도전적인 과제로 남아있습니다.</p>
<p>이전의 PanoHead 연구는 정면과 후면 이미지를 모두 포함하는 대규모 데이터셋을 사용하여 전체 머리 합성의 가능성을 보여주었지만, 후면 뷰에서 자주 아티팩트(인공물)가 발생한다는 문제점이 있었습니다. 본 연구팀의 심층 분석에 따르면, 이러한 문제가 발생하는 이유는 크게 두 가지입니다:</p>
<ol>
<li><p>네트워크 아키텍처 측면에서, 기존 tri-plane/tri-grid 표현 공간의 각 평면은 양쪽에서 오는 특징을 혼동하는 경향이 있어 &#39;미러링&#39; 아티팩트(예: 안경이 뒷면에 나타나는 현상)를 유발합니다.</p>
</li>
<li><p>데이터 지도 학습 측면에서, 기존 3D GANs의 판별자 훈련은 주로 렌더링된 이미지 자체의 품질에 초점을 맞추고, 렌더링 관점과의 일관성은 크게 고려하지 않습니다.</p>
</li>
</ol>
<p>SphereHead는 이러한 문제를 해결하기 위해 인간 두상의 기하학적 특성에 맞는 구형 좌표계(spherical coordinate system)에서 새로운 tri-plane 표현 방식을 제안하고, 카메라 매개변수와 이미지 간의 대응 관계를 강조하는 시점-이미지 일관성 손실 함수(view-image consistency loss)를 도입했습니다.</p>
<p>이러한 접근법을 통해 SphereHead는 기존 방법들보다 시각적으로 우수한 결과를 달성하고 아티팩트를 크게 줄였습니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/05bb280a-a08e-4c4c-933a-3894027e39f0/image.png" alt=""></p>
<p>3D 얼굴 합성 기술은 영화 산업, 게임 개발, 가상 현실(VR), 증강 현실(AR) 등 다양한 분야에서 활용되고 있습니다. 최근 몇 년간 인공지능, 특히 생성적 적대 신경망(GAN)을 활용한 얼굴 이미지 합성 기술은 놀라운 발전을 이루었습니다. 그러나 이러한 발전에도 불구하고, 모든 각도에서 자연스러운 3D 머리를 합성하는 것은 여전히 큰 도전 과제입니다.</p>
<p>3D 얼굴 합성의 가장 큰 어려움 중 하나는 머리 뒷부분(두정부, 후두부)을 자연스럽게 생성하는 것입니다. 이는 학습 데이터에서 머리 정면 이미지가 후면 이미지보다 훨씬 많기 때문입니다. 이러한 데이터 불균형으로 인해 기존 모델들은 머리 뒷부분을 생성할 때 자주 오류를 범합니다.</p>
<p>PanoHead는 정면과 후면 이미지를 모두 포함하는 대규모 데이터셋을 활용하여 전체 머리 합성을 시도한 획기적인 연구였습니다. 그러나 이 접근법에도 여전히 두 가지 주요 문제점이 있었습니다:</p>
<p><strong>1. Mirroring artifacts (미러링 아티팩트):</strong> 머리 뒷부분이 정면 얼굴의 특징(예: 안경, 표정)을 그대로 반영하는 문제입니다. 예를 들어, 정면에서 안경을 쓴 얼굴이라면 머리 뒷부분에도 안경이 나타나는 비현실적인 결과가 생성됩니다.</p>
<p><strong>2. Multiple-face artifacts (다중 얼굴 아티팩트):</strong> 머리 뒷부분에 얼굴과 유사한 형태가 부자연스럽게 생성되는 문제로, 때로는 정면 얼굴과 다른 정체성, 표정, 액세서리를 가진 얼굴이 생성됩니다.</p>
<p>SphereHead 연구는 이러한 문제점들을 해결하기 위해 두 가지 주요 기여를 합니다:</p>
<p><strong>1. Spherical tri-plane representation (구형 tri-plane 표현):</strong> 인간 머리의 기하학적 특성에 맞는 구형 좌표계 기반의 새로운 표현 방식을 제안합니다. 이 접근법은 머리의 각 위치에 있는 특징을 명시적으로 분리하여 미러링 아티팩트를 완전히 해결합니다.</p>
<p><strong>2. View-image consistency loss (시점-이미지 일관성 손실 함수):</strong> 판별자가 이미지의 품질뿐만 아니라 카메라 매개변수와의 일관성도 고려하도록 하는 손실 함수를 도입했습니다. 이를 통해 다중 얼굴 아티팩트 문제를 효과적으로 해결합니다.</p>
<h3 id="2-related-work">2. Related Work</h3>
<h4 id="3d-aware-image-synthesis-3d-인식-이미지-합성">3D-aware Image Synthesis (3D 인식 이미지 합성)</h4>
<p>3D 인식 이미지 합성은 2D 이미지를 생성하면서도 3D 기하학적 정보를 내포하는 기술입니다. 초기 접근법들은 메시(mesh) 또는 복셀(voxel) 기반 표현을 사용했으나, 이러한 방법들은 계산 비용이 높고 해상도에 제한이 있었습니다.</p>
<p>최근에는 신경 복사 필드(Neural Radiance Fields, NeRF)와 같은 암시적 표현(implicit representation)이 주목받고 있습니다. NeRF는 복잡한 장면을 높은 충실도로 표현할 수 있지만, 훈련에 많은 시간이 소요됩니다. 이를 개선하기 위해 tri-plane 표현과 같은 하이브리드 접근법이 개발되었습니다.</p>
<h4 id="3d-face-synthesis-3d-얼굴-합성">3D Face Synthesis (3D 얼굴 합성)</h4>
<p>초기 3D 얼굴 합성 연구는 주로 3D 모핑 모델(3DMM)과 같은 매개변수 모델을 사용했습니다. 이후 StyleGAN과 같은 GAN 기반 접근법이 등장하며 고품질 얼굴 이미지 생성이 가능해졌습니다.</p>
<p>EG3D, GRAM 등의 연구는 tri-plane 표현을 도입하여 3D 일관성이 있는 얼굴 합성을 가능하게 했습니다. 그러나 이러한 접근법들은 주로 정면 또는 거의 정면에 가까운 시점의 얼굴 합성에 중점을 두었습니다.</p>
<h4 id="full-head-synthesis-전체-머리-합성">Full-head Synthesis (전체 머리 합성)</h4>
<p>전체 머리(모든 각도에서 볼 수 있는 머리) 합성 연구는 상대적으로 최근에 시작되었습니다. PanoHead는 처음으로 다양한 시점의 머리 이미지를 포함하는 대규모 데이터셋을 구축하고, tri-grid 표현을 도입하여 전체 머리 합성을 시도했습니다.</p>
<p>그러나 PanoHead는 앞서 언급한 미러링 아티팩트와 다중 얼굴 아티팩트 문제를 완벽히 해결하지 못했습니다. SphereHead는 이러한 문제를 해결하기 위해 구형 좌표계 기반의 새로운 표현 방식과 시점-이미지 일관성 손실 함수를 제안했습니다.</p>
<h4 id="tri-plane-representation-삼중-평면-표현">Tri-plane Representation (삼중 평면 표현)</h4>
<p>삼중 평면 표현은 3D 공간의 특징을 세 개의 직교 평면(xy, yz, xz)에 저장하는 방식입니다. 이 방법은 복셀 그리드보다 메모리 효율적이면서도 NeRF보다 빠른 렌더링이 가능합니다.</p>
<p>EG3D, GRAM, GET3D 등의 연구는 tri-plane 표현을 3D GAN에 성공적으로 적용했습니다. PanoHead는 여기서 더 나아가 tri-grid 표현을 도입했지만, 여전히 데카르트 좌표계(Cartesian coordinate system)를 사용했기 때문에 미러링 아티팩트 문제가 완전히 해결되지 않았습니다.</p>
<p>SphereHead는 인간 머리의 구형에 가까운 기하학적 특성을 고려하여, 구형 좌표계 기반의 tri-plane 표현을 제안했습니다</p>
<h3 id="3-spherehead">3. SphereHead</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/01c83c5d-d2d0-4a38-a3dc-350ad449f334/image.png" alt=""></p>
<p>이제 본 논문의 핵심인 SphereHead 프레임워크에 대해 자세히 살펴보겠습니다. SphereHead는 기존 3D 머리 합성 모델의 문제점을 해결하기 위해 개발된 새로운 접근법입니다.</p>
<p>SphereHead의 전체 프레임워크는 다음과 같은 구성 요소를 포함합니다:</p>
<ol>
<li><p>잠재 코드(latent code) z와 카메라 매개변수 c를 입력으로 받습니다.</p>
</li>
<li><p>구형 tri-plane 특징을 생성하는 생성기(generator)</p>
</li>
<li><p>볼륨 렌더링(volumetric rendering)을 통해 2D 이미지를 생성합니다.</p>
</li>
<li><p>생성된 이미지와 카메라 매개변수의 일관성을 판단하는 판별자(discriminator)</p>
</li>
</ol>
<p>생성기는 랜덤 잠재 코드 z에서 구형 tri-plane 특징 fF를 생성합니다. 이 특징은 두 개의 하위 특징 그룹 $$f_A$$와 $$f_B$$를 융합하여 생성됩니다. 볼륨 렌더링을 통해 고품질의 시점-일관성 있는 전체 머리 이미지 $$I^+$$가 생성됩니다.</p>
<p>판별자는 시점-이미지 일관성 손실 함수를 통해 이미지와 시점 간의 일치에 초점을 맞추도록 학습됩니다. 이를 위해 실제 이미지와 잘못 매칭된 카메라 매개변수 cs로 구성된 추가적인 부정 데이터 쌍을 도입했습니다.</p>
<h4 id="31-dual-spherical-tri-plane-representation">3.1 Dual Spherical Tri-plane Representation</h4>
<p>3D 전체 머리 합성의 주요 도전 과제는 다양하고 복잡한 헤어스타일을 가진 후두부(머리 뒷부분)를 생성하는 것입니다. 이 문제는 두 가지 주요 원인에서 비롯됩니다:</p>
<ol>
<li><p>불균형한 훈련 데이터로 인한 편향된 지도 학습</p>
</li>
<li><p>기존 tri-plane 표현의 한계</p>
</li>
</ol>
<p>기존 tri-plane 표현은 데카르트 좌표계(x, y, z)에서 정의되어 특징 평면(xy, yz, xz)의 각 위치가 3D 공간의 서로 다른 위치에 매핑될 수 있습니다. 이로 인해 머리의 정면과 후면 특징이 서로 얽히게 되고, 미러링 아티팩트가 발생합니다. PanoHead의 tri-grid 표현도 유사한 구조를 가지며 동일한 데카르트 좌표계를 사용하기 때문에 미러링 아티팩트 문제가 완전히 해결되지 않았습니다.</p>
<p>SphereHead는 이 문제를 해결하기 위해 구형 tri-plane 표현을 제안합니다. 이 접근법은 머리의 각 위치 특징을 명시적으로 분리합니다.</p>
<p>구형 좌표계에서 3D 공간의 점은 (r, θ, ϕ)로 표현됩니다:</p>
<ul>
<li><p>r: 원점으로부터의 거리(반경)</p>
</li>
<li><p>θ: 방위각(azimuthal angle), xy 평면에서 x축으로부터의 각도</p>
</li>
<li><p>ϕ: 극각(polar angle), z축으로부터의 각도</p>
</li>
</ul>
<p>SphereHead의 구형 tri-plane은 다음 세 가지 특징 평면으로 구성됩니다:</p>
<ol>
<li><p>반원 평면(semicircle plane): (r, ϕ) 좌표 공간</p>
</li>
<li><p>원형 평면(circular plane): (r, θ) 좌표 공간</p>
</li>
<li><p>구형 평면(spherical plane): (θ, ϕ) 좌표 공간</p>
</li>
</ol>
<p>3D 위치의 특징을 쿼리할 때, 해당 위치를 구형 좌표로 변환하고 세 특징 평면에 투영합니다. 각 평면에서 이중 선형 보간(bilinear interpolation)을 통해 특징 벡터를 검색하고, 이를 합산하여 최종 특징을 얻습니다. 경량 디코더 네트워크는 이 3D 특징을 색상과 밀도로 해석하며, 이를 볼륨 렌더링을 통해 RGB 이미지로 변환합니다.</p>
<p>더 나아가, SphereHead는 이중 구형 tri-plane 표현(dual spherical tri-plane representation)을 사용합니다. 두 개의 구형 tri-plane(구형 A와 구형 B)이 서로 다른 반경을 가지고 있어, 머리의 내부와 외부 특징을 더 잘 모델링할 수 있습니다. 이 두 특징 그룹은 나중에 융합되어 최종 특징 표현을 형성합니다.</p>
<p><strong>구형 tri-plane 표현의 수학적 공식</strong></p>
<p>3D 점 p = (x, y, z)를 구형 좌표 (r, θ, ϕ)로 변환하는 공식:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/9e7fb039-86db-4c4b-ad97-d6f40ea5123a/image.png" alt="">
이 구형 좌표를 사용하여 각 특징 평면에 투영하고, 특징 벡터 f를 검색합니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/5ca24d17-612a-4d8b-9382-65691ee341e2/image.png" alt="">
최종 특징 벡터는 세 특징 벡터의 합으로 계산됩니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/c8d567fa-0d9c-462d-9af5-512f91a0a29b/image.png" alt=""></p>
<p>이 접근법의 핵심 이점은 구형 좌표계의 기하학적 특성이 머리의 각 위치 특징을 명시적으로 분리하여 미러링 아티팩트를 완전히 해결한다는 것입니다.</p>
<p>3.2 View-image Consistency Loss (ViCo Loss)
SphereHead의 두 번째 주요 기여는 시점-이미지 일관성 손실 함수(View-image Consistency Loss, 이하 ViCo Loss)입니다. 이 손실 함수는 두 번째 문제인 다중 얼굴 아티팩트를 해결하기 위해 설계되었습니다.</p>
<p>기존 3D GAN의 판별자 훈련에서는 주로 렌더링된 이미지의 품질에만 초점을 맞추고, 이미지와 카메라 매개변수 간의 일관성은 크게 고려하지 않았습니다. 이로 인해 판별자는 이미지의 시각적 품질만으로 생성된 데이터 쌍을 평가하는 경향이 있었고, 이미지와 시점 간의 일관성은 약화되었습니다.</p>
<p>이 문제는 머리 이미지와 같이 특정 방향의 지도 학습 강도가 크게 불균형한 경우 특히 심각합니다. 그 결과, 생성기는 정면 얼굴과 같이 많이 지도된 콘텐츠를 잘못된 방향에 생성하는 경향이 있어 다중 얼굴 아티팩트가 발생합니다.</p>
<p>ViCo Loss는 이 문제를 해결하기 위해 판별자가 이미지와 카메라 매개변수 간의 일치에 집중하도록 합니다. 판별자 훈련 과정에서 세 가지 유형의 데이터 쌍이
사용됩니다:</p>
<p><strong>1. Positive Real Samples (양성 실제 샘플):</strong> 실제 이미지와 해당 카메라 매개변수 쌍 (I_real, c_real)</p>
<p><strong>2. Negative Real Samples  (부정 실제 샘플):</strong> 실제 이미지와 무작위로 섞인 실제 카메라 매개변수 쌍 (I_real, c_shuffled)</p>
<p><strong>3. Generated Data (생성된 데이터):</strong> 생성된 이미지와 해당 카메라 매개변수 쌍 (I_gen, c_gen)</p>
<p>ViCo Loss의 수학적 공식은 다음과 같습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/448599fb-f6e9-49bf-a03a-71f8775ae6fb/image.png" alt="">
여기서 D는 판별자 함수이고, c_s는 I_real과 무관한 섞인 카메라 매개변수입니다.</p>
<p>이 손실 함수는 판별자가 이미지의 품질뿐만 아니라 이미지와 카메라 매개변수 간의 일관성도 고려하도록 합니다. 이를 통해 판별자는 시각적으로 고품질이더라도 시점과 일치하지 않는 이미지를 거부하도록 학습됩니다.</p>
<h4 id="33-parsing-branch-for-semantic-embedding">3.3 Parsing Branch for Semantic Embedding</h4>
<p>SphereHead는 생성된 머리 이미지의 의미론적 컨트롤을 향상시키기 위해 파싱 분기(Parsing Branch)를 도입합니다. 이 파싱 분기는 생성된 이미지의 주요 의미론적 요소(피부, 눈, 입, 코, 머리카락 등)를 분할하는 역할을 합니다.</p>
<p>파싱 분기는 메인 생성기에 병렬로 구현되며, 생성된 특징 맵을 입력으로 받아 의미론적 분할 맵을 출력합니다. 이 분할 맵은 머리의 다양한 부분을 명시적으로 식별하고 분리합니다.</p>
<p>파싱 분기의 주요 이점은 다음과 같습니다:</p>
<ol>
<li><p>향상된 의미론적 제어: 생성된 머리의 특정 부분(예: 머리카락 스타일, 피부 톤)을 더 정확하게 제어할 수 있습니다.</p>
</li>
<li><p>일관된 구조 생성: 머리의 다양한 부분 간의 구조적 일관성을 유지하는 데 도움이 됩니다.</p>
</li>
<li><p>의미론적 임베딩 학습: 생성 프로세스에 의미론적 정보를 명시적으로 통합하여 더 자연스러운 결과를 생성합니다.</p>
</li>
</ol>
<p>파싱 분기는 <strong>cross-entropy loss (교차 엔트로피 손실 함수)</strong>를 사용하여 훈련됩니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/c23a967a-5c42-4fe7-84dd-dfa448ac118b/image.png" alt=""></p>
<p>여기서 $$y_i$$는 실제 의미론적 레이블이고, $$\hat{y}_i$$는 파싱 분기에 의해 예측된 레이블입니다.</p>
<p>파싱 분기의 출력은 또한 다중 스케일 특징 융합(multi-scale feature fusion)을 통해 메인 생성 경로에 피드백됩니다. 이를 통해 의미론적 정보가 생성 프로세스 전체에 통합되어 더 자연스럽고 일관된 머리 합성이 가능해집니다.</p>
<h3 id="4-dataset">4. Dataset</h3>
<p>SphereHead 연구에서는 전체 머리 합성을 위한 새로운 대규모 데이터셋을 구축했습니다. 이 데이터셋의 구성과 처리 과정에 대해 살펴보겠습니다.</p>
<p><strong>데이터 수집 및 구성</strong></p>
<p>SphereHead 데이터셋은 다양한 시점에서 촬영된 약 60,000장의 머리 이미지를 포함하고 있습니다. 특히 중요한 점은 이 데이터셋이 머리 후면 뷰 이미지도 포함하고 있다는 것입니다.</p>
<p>데이터셋의 주요 구성 요소는 다음과 같습니다:</p>
<ol>
<li><p>다양한 연령, 성별, 인종의 인물 이미지</p>
</li>
<li><p>다양한 헤어스타일과 액세서리(안경, 귀걸이 등)</p>
</li>
<li><p>다양한 카메라 각도에서 촬영된 이미지(정면, 측면, 후면)</p>
</li>
<li><p>각 이미지에 대한 카메라 매개변수 및 포즈 정보</p>
</li>
</ol>
<p><strong>데이터 처리 파이프라인</strong></p>
<ol>
<li><p>원시 이미지 데이터는 다음과 같은 처리 과정을 거쳤습니다:</p>
</li>
<li><p>얼굴 감지 및 정렬: 먼저 각 이미지에서 얼굴을 감지하고 정렬합니다.</p>
</li>
<li><p>배경 제거: 머리 영역을 정확히 분리하기 위해 배경을 제거합니다.</p>
</li>
<li><p>카메라 매개변수 추정: 각 이미지의 카메라 위치, 방향, 초점 거리 등을 추정합니다.</p>
</li>
<li><p>의미론적 분할: 머리의 다양한 부분(피부, 눈, 입, 코, 머리카락 등)을 분할합니다.</p>
</li>
</ol>
<p>품질 필터링: 낮은 해상도, 흐릿함, 과도한 편집 등으로 인한 저품질 이미지를 필터링합니다.</p>
<p><strong>데이터 증강(Data Augmentation)</strong></p>
<p>데이터셋의 다양성을 높이기 위해 다음과 같은 증강 기법을 적용했습니다:</p>
<ol>
<li><p>색상 변환: 색상, 명도, 대비를 조정하여 다양한 조명 조건을 시뮬레이션합니다.</p>
</li>
<li><p>기하학적 변환: 작은 회전, 크기 조정, 이동을 적용하여 포즈 다양성을 증가시킵니다.</p>
</li>
<li><p>합성 데이터 생성: 부족한 후면 뷰 데이터를 보완하기 위해 3D 모델을 사용하여 합성 이미지를 생성합니다.</p>
</li>
</ol>
<h3 id="5-experiments">5. Experiments</h3>
<p>SphereHead의 성능을 평가하기 위해 다양한 실험이 수행되었습니다. 이 섹션에서는 훈련 세부 사항, 정성적 및 정량적 비교, 사용자 연구, 단일 시점 GAN 역변환 등의 실험 결과를 살펴보겠습니다.</p>
<h4 id="51-training-details-and-baselines">5.1 Training Details and Baselines</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/92f817d1-86d5-4819-991d-5b882a70c999/image.png" alt="">
<strong>Training Details</strong></p>
<p>SphereHead 모델의 훈련 과정은 다음과 같습니다:</p>
<ul>
<li><p>최적화 알고리즘: Adam 최적화기를 사용했으며, 학습률은 0.002로 설정했습니다.</p>
</li>
<li><p>배치 크기: 32로 설정했습니다.</p>
</li>
<li><p>훈련 기간: 약 25,000 iterations(반복) 동안 훈련했습니다.</p>
</li>
<li><p>하드웨어: 8개의 NVIDIA A100 GPU를 사용했습니다.</p>
</li>
<li><p>손실 함수: 합성을 위한 적대적 손실(adversarial loss), 시점-이미지 일관성 손실(ViCo loss), 그리고 파싱 손실(parsing loss)의 조합을 사용했습니다.</p>
</li>
</ul>
<p>훈련 과정에서 점진적 성장(progressive growing) 전략을 적용했습니다. 먼저 저해상도(64×64)에서 시작하여 점진적으로 해상도를 높여(128×128, 256×256) 최종적으로 512×512 해상도에 도달했습니다.</p>
<p><strong>Baselines (비교 기준선)</strong></p>
<p>SphereHead의 성능을 평가하기 위해 다음과 같은 최신 방법들과 비교했습니다:</p>
<ol>
<li><p>EG3D: 최초의 tri-plane 표현 기반 3D GAN 중 하나로, 고품질 얼굴 합성에 효과적입니다.</p>
</li>
<li><p>PanoHead: 전체 머리 합성을 위해 tri-grid 표현을 사용한 접근법입니다.</p>
</li>
<li><p>SphereHead-w/o-SP: 구형 tri-plane 표현 없이 SphereHead 아키텍처를 사용한 변형입니다.</p>
</li>
<li><p>SphereHead-w/o-ViCo: 시점-이미지 일관성 손실 없이 SphereHead 아키텍처를 사용한 변형입니다.</p>
</li>
</ol>
<p>이러한 비교를 통해 SphereHead의 각 구성 요소(구형 tri-plane 표현, ViCo 손실)의 효과를 평가할 수 있습니다.</p>
<h4 id="52-qualitative-comparisons">5.2 Qualitative Comparisons</h4>
<p>정성적 비교에서는 SphereHead가 기존 방법들에 비해 현저하게 개선된 결과를 보여주었습니다.</p>
<p><strong>기존 방법들과의 비교</strong></p>
<p>기존 모델들과 SphereHead를 비교했을 때 관찰된 주요 차이점은 다음과 같습니다:</p>
<ol>
<li><p>EG3D: 정면 및 측면 뷰에서는 좋은 결과를 보였지만, 후면 뷰에서는 심각한 왜곡과 아티팩트가 발생했습니다. 이는 EG3D가 주로 정면 얼굴 이미지로 훈련되었기 때문입니다.</p>
</li>
<li><p>PanoHead: 다양한 시점에서 머리를 생성할 수 있었지만, 후면 뷰에서 미러링 아티팩트와 다중 얼굴 아티팩트가 자주 발생했습니다. 예를 들어, 정면에서 안경을 쓴 얼굴이 머리 뒷부분에도 안경이 나타나거나, 다른 정체성의 얼굴 형태가 생성되었습니다.</p>
</li>
<li><p>SphereHead: 모든 시점에서 자연스러운 머리를 생성했으며, 미러링 아티팩트와 다중 얼굴 아티팩트가 크게 감소했습니다. 특히 후면 뷰에서 자연스러운 머리카락과 두상 형태를 보여주었습니다.</p>
</li>
</ol>
<p><strong>SphereHead 변형들과의 비교</strong></p>
<p>SphereHead의 다양한 변형을 비교하여 각 구성 요소의 효과를 평가했습니다:</p>
<ol>
<li><p>SphereHead-w/o-SP: 구형 tri-plane 표현 없이는 미러링 아티팩트가 여전히 발생했습니다. 이는 구형 tri-plane 표현이 머리의 정면과 후면 특징을 효과적으로 분리하는 데 중요하다는 것을 보여줍니다.</p>
</li>
<li><p>SphereHead-w/o-ViCo: 시점-이미지 일관성 손실 없이는 다중 얼굴 아티팩트가 여전히 발생했습니다. 이는 ViCo 손실이 카메라 매개변수와 이미지 간의 일관성을 강화하는 데 중요하다는 것을 보여줍니다.</p>
</li>
<li><p>SphereHead-full: 모든 구성 요소를 포함한 완전한 SphereHead 모델은 가장 적은 아티팩트와 가장 자연스러운 결과를 보여주었습니다.</p>
</li>
</ol>
<h4 id="54-quantitative-results">5.4 Quantitative Results</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/80e15d32-108c-405c-a521-cd4b96047a51/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/a8b5195e-ebb1-441e-9f7d-8041b55c85e8/image.png" alt="">
FID 결과는 SphereHead가 모든 시점에서 가장 높은 이미지 품질을 달성했음을 보여줍니다. 특히 후면 뷰에서의 개선이 두드러졌습니다.</p>
<p>또한, SphereHead가 기존 방법들에 비해 아티팩트를 크게 줄였음을 보여줍니다. 특히, 구형 tri-plane 표현이 미러링 아티팩트를 줄이는 데 효과적이며, ViCo 손실이 다중 얼굴 아티팩트를 줄이는 데 효과적임을 확인할 수 있습니다.</p>
<h4 id="55-single-view-gan-inversion">5.5 Single-view GAN Inversion</h4>
<p>SphereHead의 응용 가능성을 보여주기 위해 단일 시점 GAN 역변환(Single-view GAN Inversion) 실험이 수행되었습니다.</p>
<p><strong>GAN 역변환이란?</strong></p>
<p><strong>GAN 역변환</strong>은 실제 이미지를 GAN의 잠재 공간(latent space)에 매핑하는 과정입니다. 이를 통해 GAN은 실제 이미지와 유사한 이미지를 생성할 수 있으며, 더 나아가 실제 이미지의 다양한 변형(예: 다른 시점, 조명, 표정)을 생성할 수 있습니다.</p>
<p><strong>실험 설정</strong></p>
<p>단일 시점 GAN 역변환 실험은 다음과 같이 설계되었습니다:</p>
<ol>
<li><p>입력: 단일 시점(주로 정면)의 실제 머리 이미지</p>
</li>
<li><p>목표: 동일한 정체성을 유지하면서 다양한 시점에서의 머리 이미지 생성</p>
</li>
</ol>
<p><strong>역변환 방법</strong></p>
<p>SphereHead의 역변환 프로세스는 다음과 같은 단계로 이루어집니다:</p>
<p><strong>최적화 기반 역변환:</strong> 주어진 입력 이미지와 최대한 유사한 이미지를 생성하는 잠재 코드 z를 찾기 위해 최적화 기반 접근법을 사용합니다. 이는 다음과 같은 손실 함수를 최소화하여 수행됩니다:
<img src="blob:https://velog.io/6b00f07f-2489-4164-ba16-e7cc0fc5dbd7" alt="업로드중..">
$$L_{rec}$$는 픽셀 단위 재구성 손실(pixel-wise reconstruction loss)</p>
<p>$$L_{perc}$$는 지각적 손실(perceptual loss)</p>
<p>$$L_{id}$$는 ID 손실(identity loss)입니다.</p>
<p><strong>다중 시점 렌더링:</strong> 최적화된 잠재 코드 z를 사용하여 다양한 카메라 매개변수 c에 대한 이미지를 렌더링합니다.</p>
<h3 id="6-discussion">6. Discussion</h3>
<p><strong>강점</strong></p>
<ol>
<li><p>감소된 아티팩트: 구형 tri-plane 표현과 ViCo 손실을 통해 미러링 아티팩트와 다중 얼굴 아티팩트를 크게 줄였습니다.</p>
</li>
<li><p>향상된 다중 시점 일관성: 모든 시점에서 일관된 정체성과 구조를 유지하는 능력이 향상되었습니다.</p>
</li>
<li><p>고품질 머리 합성: 특히 머리 후면에서 자연스러운 머리카락과 두상 형태를 생성하는 능력이 향상되었습니다.</p>
</li>
<li><p>효율적인 표현: 구형 tri-plane 표현은 계산 효율성과 메모리 효율성을 유지하면서도 고품질 결과를 달성합니다.</p>
</li>
<li><p>일반화 능력: 다양한 헤어스타일, 액세서리, 인구통계학적 특성에 잘 일반화됩니다.</p>
</li>
</ol>
<p><strong>한계점</strong></p>
<ol>
<li><p>복잡한 액세서리 처리: 매우 복잡한 액세서리(예: 정교한 귀걸이, 헤드폰)의 정확한 표현에 어려움이 있을 수 있습니다.</p>
</li>
<li><p>특이한 헤어스타일: 데이터셋에 충분히 표현되지 않은 매우 특이한 헤어스타일(예: 특정 형태의 모호크, 복잡한 브레이드)의 생성에 한계가 있을 수 있습니다.</p>
</li>
<li><p>계산 요구사항: 이중 구형 tri-plane 표현은 표준 tri-plane 표현보다 약간 더 많은 계산 리소스를 필요로 합니다.</p>
</li>
<li><p>극단적인 포즈: 매우 극단적인 포즈(예: 크게 기울어진 머리)에서는 여전히 약간의 왜곡이 발생할 수 있습니다.</p>
</li>
<li><p>후면 뷰 데이터 의존성: 고품질 후면 뷰 생성은 여전히 충분한 후면 뷰 훈련 데이터에 의존합니다.</p>
</li>
</ol>
<h3 id="7-conclusion">7. Conclusion</h3>
<p>SphereHead는 안정적인 3D 전체 머리 합성을 위한 혁신적인 프레임워크로, 두 가지 핵심 기술적 기여를 통해 기존 모델의 문제점을 해결했습니다. 첫째, 구형 tri-plane 표현은 인간 머리의 구형 특성에 맞게 설계되어 머리의 정면과 후면 특징을 효과적으로 분리함으로써 미러링 아티팩트를 제거했습니다. 둘째, 시점-이미지 일관성 손실 함수는 이미지와 카메라 매개변수 간의 일치를 강화하여 다중 얼굴 아티팩트 문제를 해결했습니다. 연구팀은 다양한 시점의 머리 이미지 60,000장을 포함하는 데이터셋을 구축하고 공개했으며, 광범위한 실험과 사용자 연구를 통해 SphereHead의 우수한 성능을 입증했습니다. 이 기술은 3D 아바타 생성, 가상 현실, 영화, 게임 제작 등 다양한 분야에 활용될 수 있으며, 더 자연스럽고 일관된 3D 콘텐츠 생성을 위한 새로운 가능성을 열었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Post-Training Quantization for Vision Transformer 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Post-Training-Quantization-for-Vision-Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Post-Training-Quantization-for-Vision-Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sat, 22 Mar 2025 04:44:41 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>pdf: <a href="https://arxiv.org/abs/2106.14156">https://arxiv.org/abs/2106.14156</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/6c155070-4adb-496c-81d7-7e9df7d0551e/image.png" alt=""></p>
<h3 id="0-abstraction">0. Abstraction</h3>
<p>Transformer 모델은 컴퓨터 비전에서 뛰어난 성능을 보이지만, 복잡한 아키텍처로 인해 모바일 장치 구현이 어렵습니다. 본 논문은 Vision Transformer의 메모리와 계산 비용을 줄이기 위한 효과적인 post-training quantization 알고리즘을 제안합니다. Attention 메커니즘을 보존하기 위해 ranking loss를 도입하고, 양자화 후에도 self-attention 결과의 상대적 순서를 유지합니다. 또한 각 레이어의 양자화 손실과 특징 다양성 간의 관계를 분석하고, attention map과 출력 특징의 nuclear norm을 활용한 mixed-precision quantization 방식을 제안합니다. 실험 결과, 제안된 방법은 기존 최신 알고리즘보다 우수한 성능을 보였으며, DeiT-B 모델로 ImageNet에서 81.29%의 top-1 정확도를 달성했습니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p>Transformer 기반 모델들은 이미지 분류, 객체 탐지 등 다양한 컴퓨터 비전 작업에서 뛰어난 성능을 보이지만, 수억 개의 매개변수와 높은 계산 비용으로 인해 자원이 제한된 장치에서 실행하기 어렵습니다. 양자화는 모델 아키텍처를 변경하지 않고 가중치에 더 낮은 비트 폭을 사용하여 신경망을 압축하는 효과적인 기술입니다. NLP 분야에서는 BERT와 같은 모델에 양자화 방법이 적용되었지만, 컴퓨터 비전용으로 설계되지 않았고 추가 훈련이 필요합니다. Post-training quantization은 미세 조정 없이 신경망을 직접 양자화할 수 있지만, 기존 방법들은 Vision Transformer의 고유한 구조를 고려하지 않습니다. 본 논문에서는 Vision Transformer의 특성을 고려한 효과적인 <strong>Post-training quantization(PTQ)</strong> 알고리즘을 제안합니다.</p>
<h3 id="2-related-works">2 Related Works</h3>
<h4 id="21-vision-transformer">2.1 Vision Transformer</h4>
<p>컴퓨터 비전 분야에 Transformer를 적용한 다양한 연구들이 진행되었습니다. Chen 등은 픽셀을 자동 회귀적으로 예측하는 시퀀스 Transformer를 훈련시켜 CNN과 비슷한 성능을 달성했습니다. Dosovitskiy 등이 제안한 ViT는 이미지 패치를 시퀀스로 간주하여 Transformer를 직접 적용하는 모델로, 여러 이미지 인식 벤치마크에서 뛰어난 성능을 보였습니다. Touvron 등은 ImageNet에서만 훈련하면서 Transformer에 특화된 교사-학생 전략을 도입한 DeiT를 개발했습니다. 이외에도 객체 탐지, 의미 분할, 이미지 처리, 비디오 이해 등 다양한 컴퓨터 비전 문제에 Transformer 기반 모델이 적용되고 있습니다.</p>
<h4 id="22-compression-of-transformer-in-nlp">2.2 Compression of Transformer in NLP</h4>
<p>BERT와 같은 Transformer 모델의 메모리와 계산 복잡성을 줄이기 위한 다양한 접근법이 제안되었습니다. Wu 등은 지역 컨텍스트와 장거리 관계 모델링을 분리하여 엣지 장치에서 Transformer를 실행하기 위한 Short Range Attention을 제안했습니다. 8비트 양자화는 Transformer 모델에 성공적으로 적용되었지만, 초저비트(1-2비트) 양자화는 모델 용량 감소로 인해 더 어렵습니다. 이를 해결하기 위해 mixed-precision quantization과 product quantization 같은 복잡한 방법들이 사용되었습니다. Zhang 등의 TernaryBERT와 Bai 등의 이진화 연구는 더 낮은 비트로 BERT를 압축했지만, 컴퓨터 비전용으로 설계되지 않았으며 추가 훈련이 필요합니다.</p>
<h4 id="23-post-training-quantization">2.3 Post-Training Quantization</h4>
<p>미세 조정 없이 신경망을 양자화하는 post-training quantization 방법들이 다수 개발되었습니다. Yoni 등은 양자화된 텐서와 원래 텐서 사이의 L2 거리를 최적화하는 OMSE 방법을 제안했습니다. Ron 등은 클리핑 범위와 채널당 비트 할당을 분석적으로 계산하는 ACIQ 방법을 제시했습니다. Zhao 등은 이상치 채널 문제를 해결하기 위한 이상치 채널 분할(OCS) 방법을 제안했습니다. Wang 등은 더 낮은 비트 양자화를 위한 Bit-Split and Stitching 프레임워크를, Nagel 등은 가중치 반올림 메커니즘인 AdaRound를 제안했습니다. 이러한 방법들은 CNN을 위해 설계되었으며 Vision Transformer의 고유한 구조를 고려하지 않습니다.</p>
<h3 id="3-methodology">3 Methodology</h3>
<h4 id="31-preliminaries">3.1 Preliminaries</h4>
<p>표준 Transformer는 1-D 토큰 임베딩 시퀀스를 입력으로 받기 때문에, Vision Transformer는 일반적으로 이미지 $$I ∈ R^{(H×W×C)}$$를 일련의 평평한 2D 패치 $$I^P$$ ∈ $$R^{(n×(P^2·C))}$$로 재구성합니다. 여기서 H와 W는 원본 이미지의 높이와 너비이고, (P, P)는 각 이미지 패치의 해상도입니다. 따라서 $$n = HW/P^2$$는 Transformer의 유효 시퀀스 길이입니다.</p>
<p>일반적으로 Vision Transformer는 모든 레이어에서 일정한 너비를 사용하므로, 훈련 가능한 선형 투영이 각 벡터화된 패치를 모델 차원 d로 매핑합니다. 따라서 첫 번째 Transformer 레이어에 대한 입력은 다음과 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/58913b69-4dbd-4ee2-b5eb-b3b8e5aafc4f/image.png" alt=""></p>
<p>표준 Transformer 레이어는 두 가지 주요 모듈을 포함합니다: Multi-Head Self Attention(MSA)과 Multi-Layer Perceptron(MLP) 모듈입니다. l번째 Transformer 레이어에 대해, 그 입력이 $$X_l \in \mathbb{R}^{n \times d}$$라고 가정하면, queries와 keys의 점곱으로 계산된 어텐션 점수는 다음과 같이 표현할 수 있습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/2b0bae95-ce9d-4329-a62d-5c474d7815b6/image.png" alt=""></p>
<p>그런 다음 정규화된 점수에 softmax 함수를 적용하여 출력을 얻고, multi-head self attention 모듈의 출력은 다음과 같습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/4cc76ce6-4b60-4f3c-a52b-82df280878c7/image.png" alt=""></p>
<p>MLP 모듈은 $$W^1 \in \mathbb{R}^{d \times d_f}, b^1 \in \mathbb{R}^{d_f}$$ 및 $$W^2 \in \mathbb{R}^{d_f \times d}, b^2 \in \mathbb{R}^{d}$$로 매개변수화된 두 개의 선형 레이어를 포함합니다. 여기서 $d_f$는 MLP의 중간 레이어의 뉴런 수입니다. MLP의 입력을 $Z_l \in \mathbb{R}^{n \times d}$라고 하면, 출력은 다음과 같이 계산됩니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/ca97bf40-4cf7-4efd-bd6d-582efb4ae62f/image.png" alt="">
이를 종합하여, l번째 Transformer 레이어에 대한 순방향 전파는 다음과 같이 표현할 수 있습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/6315f57e-c0a7-4ece-844d-c7de7a08270a/image.png" alt=""></p>
<p>여기서 LN은 레이어 정규화(Layer Normalization)를 나타냅니다.</p>
<p>Vision Transformer의 가장 큰 계산 비용은 MSA와 MLP 모듈의 대규모 행렬 곱셈에 있습니다. CNN을 위한 주류 양자화 방법을 따라, 우리는 행렬 곱셈에 관련된 모든 가중치와 입력을 양자화합니다. 가중치 양자화의 경우, 모든 Transformer 레이어의 가중치 $W^Q, W^K, W^V, W^O, W^1, W^2$와 선형 임베딩 $W^E$를 양자화합니다. 이 가중치 외에도, 모든 선형 레이어와 행렬 곱셈 연산의 입력도 양자화합니다. 기존 방법을 따라, softmax 연산과 레이어 정규화는 양자화하지 않습니다. 이는 이러한 연산에 포함된 매개변수가 무시할 수 있을 정도로 적고, 양자화할 경우 정확도가 크게 저하될 수 있기 때문입니다.</p>
<h4 id="32-optimization-for-post-training-quantization-학습-후-양자화를-위한-최적화">3.2 Optimization for Post-Training Quantization (학습 후 양자화를 위한 최적화)</h4>
<p>학습 후 양자화의 경우, 부동 소수점 숫자를 유한한 값 집합으로 제한해야 합니다. 양자화 간격의 선택은 양자화에 매우 중요하며, 널리 사용되는 옵션 중 하나는 데이터 범위를 균등하게 분할하는 <strong>uniform quantization function(균일 양자화 함수)</strong>를 사용하는 것입니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/717e291b-b01d-42a7-816b-9ef2ff88a492/image.png" alt="">
여기서 $\Delta$는 양자화 간격, b는 양자화 비트 폭, Y는 가중치나 입력을 나타내는 텐서입니다. Clip은 양자화된 도메인의 범위를 초과하는 텐서의 요소를 제한하는 것을 의미합니다.</p>
<p><strong>Similarity-Aware Quantization for Linear Operation(선형 연산을 위한 유사성 인식 양자화)</strong></p>
<p>l번째 Transformer 레이어의 MSA 모듈과 MLP 모듈의 선형 연산에 대해, 원래 출력은 $O_l = X_l W_l$로 계산됩니다. 가중치와 입력에 대한 균일 양자화와 해당 역양자화 연산은 다음과 같이 설명할 수 있습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/ac96aa05-60e7-49aa-b2d9-e2ff2f443710/image.png" alt=""></p>
<p>여기서 $\hat{O}$은 양자화된 레이어의 출력을 나타냅니다. 양자화 간격은 실제로 양자화 과정에서 클리핑 임계값을 제어하며, 이는 원래 출력 특징 맵과 양자화된 특징 맵 간의 유사성에 큰 영향을 미칩니다. 따라서, 가중치 $\Delta_W$와 입력 $\Delta_X$ 모두에 대한 양자화 간격을 최적화하여 $O_l$과 $\hat{O}_l$ 사이의 유사성을 향상시키는 데 초점을 맞춥니다. 여기서 입력 $X_l$은 N개의 샘플이 있는 주어진 보정 데이터셋 D에서 생성됩니다. 구체적으로, 보정 데이터셋은 일반적인 학습 데이터셋보다 훨씬 적습니다. l번째 Transformer 레이어에서, 유사성 인식 양자화는 다음과 같이 공식화될 수 있습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/479cf4ec-a0f6-406e-9069-47a9e02dd353/image.png" alt=""></p>
<p>여기서 $\Gamma(O, \hat{O})$는 원래 출력 특징 맵과 양자화된 출력 특징 맵 사이의 유사성입니다. 이 논문에서는 유사성 측정을 위해 <strong>Pearson correlation coefficient(피어슨 상관 계수)</strong>를 채택합니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/5d9afea8-31d6-4343-bd96-fbe194b2d33d/image.png" alt=""></p>
<p><strong>Ranking-Aware Quantization for Self-Attention(Self-Attention을 위한 순위 인식 양자화)</strong></p>
<p>Self-Attention 레이어는 특징들의 전역 관련성을 계산할 수 있기 때문에 Transformer의 핵심 구성 요소입니다. 이는 Transformer가 CNN과 차별화되는 특성입니다. Self-Attention 계산에 있어서, 연구자들은 양자화 후에 어텐션 맵의 상대적 순서가 변경되는 것을 경험적으로 발견했습니다. 이는 성능 저하를 크게 초래할 수 있습니다. 따라서, 이 문제를 해결하기 위해 양자화 과정 중에 순위 손실(ranking loss)을 도입했습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/acdd7cb0-4447-46c8-866e-c5699a70ac14/image.png" alt=""></p>
<p>여기서 $\mathcal{L}_{ranking}$은 쌍별 순위 기반 손실 함수를 나타내며, γ는 트레이드오프 하이퍼파라미터입니다. 순위 손실은 다음과 같이 공식화할 수 있습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/69675bc8-23a5-4414-b473-652695af6c92/image.png" alt="">
여기서 $\phi(p) = (\theta - p)^+$는 매개변수 θ를 가진 힌지 함수(hinge function)이고, (h, w)는 행렬 A의 크기입니다. 주어진 예제 쌍에 대해, 예제들이 올바른 순서로 배열되고 마진으로 구분될 때만 손실이 0이 됩니다.</p>
<p>위의 최적화 문제를 해결하기 위해, Transformer 레이어의 균일 양자화를 위한 간단하지만 효율적인 대체 검색 방법을 제시합니다. 먼저, 입력의 양자화 간격 $\Delta_l^X$를 고정하고, 가중치의 양자화 간격 $\Delta_l^W$를 조정을 위해 최적화합니다. 둘째, $\Delta_l^W$를 고정하고, 입력의 양자화 간격을 미세 조정하기 위해 $\Delta_l^X$를 최적화합니다. 목표 함수가 수렴하거나 최대 반복 횟수를 초과할 때까지 $\Delta_l^W$와 $\Delta_l^X$를 번갈아 최적화합니다. 또한, 빠른 수렴을 위해, $\Delta_l^W$와 $\Delta_l^X$는 각각 가중치 또는 입력의 최대값을 기준으로 초기화됩니다. $\Delta_l^W$와 $\Delta_l^X$의 검색 공간에 대해, 우리는 $[\Delta_l^W, \Delta_l^X]$ 구간을 C개의 후보 옵션으로 선형적으로 나누고 그들에 대해 간단한 검색 전략을 수행합니다.</p>
<p><strong>Bias Correction (편향 보정)</strong></p>
<p>양자화로 인해 발생하는 출력의 편향된 오류를 더욱 줄이기 위해, 각 검색 반복 후에 편향 보정 방법을 도입합니다. 가중치와 입력의 양자화 오류가 다음과 같이 정의된다고 가정합니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/9197c265-c473-4d83-89e7-fb98f07af045/image.png" alt=""></p>
<p>출력 오류의 기대값이 0이 아니라면, 출력의 평균이 변할 것입니다. 이러한 분포의 변화는 다음 레이어에서 해로운 동작을 초래할 수 있습니다. 우리는 다음을 관찰함으로써 이 변화를 수정할 수 있습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/0b9300d7-5f43-4194-ad60-ce4bfd844f9d/image.png" alt=""></p>
<p>따라서, 편향된 출력에서 예상 오류를 빼는 것은 각 출력 단위의 평균이 보존되도록 합니다. 구현을 위해, 예상 오류는 보정 데이터를 사용하여 계산할 수 있으며, 예상 오류 벡터가 레이어의 출력과 동일한 형태를 가지므로 레이어의 편향 매개변수에서 뺄 수 있습니다.</p>
<p><strong>3.3 Mixed-Precision Quantization for Vision Transformer(Vision Transformer를 위한 혼합 정밀도 양자화)</strong></p>
<p>서로 다른 Transformer 레이어는 서로 다른 구조에 주목하며, 당연히 그들은 서로 다른 민감도를 보입니다. 따라서, 모든 레이어에 동일한 비트 폭을 할당하는 것은 최적이 아닙니다. 결과적으로, 우리는 성능을 유지하기 위해 더 민감한 레이어에 더 많은 비트를 할당하는 혼합 정밀도 양자화를 탐색합니다. Transformer 레이어의 고유한 구조를 고려하여, 우리는 MSA 또는 MLP 모듈의 모든 연산에 동일한 비트 폭을 할당합니다. 이는 가중치와 입력이 동일한 비트 폭으로 할당되므로 하드웨어 구현에도 친화적일 것입니다.</p>
<p>특이값 분해(Singular Value Decomposition, SVD)는 선형 대수학에서 중요한 행렬 분해 접근법입니다. 이는 유전자 발현 데이터의 직사각형 행렬을 취하며, 그 공식은 다음과 같이 작성될 수 있습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e7565ea0-9b16-4bca-b6db-e7c24b540436/image.png" alt=""></p>
<p>여기서 ∑의 대각선 항목 $\sigma_i = \Sigma_{ii}$는 M의 특이값으로 알려져 있습니다. 그리고 <strong>nuclear norm(핵 노름)</strong>은 특이값의 합으로, 행렬의 데이터 관련성을 나타냅니다. 이 논문에서는 MSA 모듈의 어텐션 맵과 MLP 모듈의 출력 특징의 핵 노름으로 Transformer 레이어의 민감도를 추정할 것을 제안합니다. 핵 노름은 더 민감한 레이어에는 더 높은 비트 폭을 사용하고 그렇지 않은 레이어에는 그 반대로 사용하면서 혼합 정밀도 설정의 검색 공간을 줄이는 데 사용될 수 있습니다. 기존 방법에서 영감을 받아, 우리는 비트 폭을 결정하기 위해 파레토 프론티어(Pareto frontier) 접근법을 활용합니다. 주요 아이디어는 다음 메트릭에 따라 그들이 초래하는 총 2차 섭동에 기반하여 각 후보 비트 폭 구성을 정렬하는 것입니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/19b4ee3d-2ad8-4635-a069-152a9fbfe9f2/image.png" alt="">
주어진 목표 모델 크기에 대해, 우리는 그들의 Ω 값에 기반하여 후보 비트 폭 구성을 정렬하고 최소 Ω를 가진 비트 폭 구성을 선택합니다. 각 Transformer 레이어의 어텐션 맵과 출력 특징의 nuclear norm(핵 노름)이 그림 1에 나와 있습니다. 볼 수 있듯이, 이들은 서로 다른 Transformer 레이어마다 다양합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/a07a461e-0bef-4927-bc3f-99e78b169e90/image.png" alt=""></p>
<h3 id="4-experimental-results실험-결과">4. Experimental Results(실험 결과)</h3>
<h4 id="41-implementation-details구현-세부-사항">4.1 Implementation Details(구현 세부 사항)</h4>
<ul>
<li>이미지 분류에는 CIFAR-10, CIFAR-100, ImageNet 데이터셋을, 객체 탐지에는 COCO2017 데이터셋을 사용함.</li>
<li>보정 데이터셋으로 CIFAR에서는 100개, ImageNet과 COCO에서는 1000개의 이미지를 무작위로 선택함.</li>
<li>기준 모델로는 ViT-B, ViT-L, DeiT-S, DeiT-B(이미지 분류용)와 DETR(객체 탐지용)을 사용함.</li>
</ul>
<h4 id="42-results-and-analysis">4.2 Results and Analysis</h4>
<ul>
<li>제안된 방법은 모든 모델과 데이터셋에서 기존 방법들보다 우수한 성능을 보임.</li>
<li>8비트 양자화 모델은 대부분 전체 정밀도 모델과 비슷한 성능을 달성함.</li>
<li>Mixed-precision 양자화는 성능을 더욱 향상시키며, 객체 탐지 작업에서도 우수한 일반화 능력을 보여줌.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/4ab6fa23-04a6-47a9-913a-06a8e296d079/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/8bdc9efb-2adb-4f14-8ac2-6186493272f9/image.png" alt=""></li>
</ul>
<h4 id="43-ablation-study">4.3 Ablation Study</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/8d394193-f611-4864-b533-cf379e6f0475/image.png" alt=""></p>
<ul>
<li>유사성 인식 양자화, 순위 인식 양자화, 편향 보정, 혼합 정밀도 각 구성 요소의 효과를 개별적으로 분석함.</li>
<li>각 구성 요소가 양자화된 모델의 성능 향상에 기여하며 모두 사용했을 때 최상의 결과를 얻음.</li>
<li>특히 Nuclear Norm(핵 노름) 기반 혼합 정밀도는 서로 다른 레이어의 다양한 민감도를 고려하여 성능을 크게 향상시킴.</li>
</ul>
<h3 id="5-conclusion">5. Conclusion</h3>
<p>본 논문에서는 Vision Transformer를 위한 효과적인 post-training quantization 알고리즘을 제안했습니다. 이 방법은 선형 레이어에 대한 유사성 인식 양자화와 Self-Attention에 대한 순위 인식 양자화를 포함하며, 편향 보정과 nuclear norm 기반 mixed-precision 양자화를 통해 성능을 향상시켰습니다. 실험 결과, 제안된 방법은 다양한 모델과 데이터셋에서 기존 방법들보다 우수한 성능을 보였으며, ImageNet에서 DeiT-B 모델로 81.29%의 top-1 정확도와 COCO에서 DETR 모델로 우수한 성능을 달성했습니다. 이 연구는 Vision Transformer 모델의 압축과 가속화에 중요한 기여를 하며, 향후 더 다양한 아키텍처와 더 낮은 비트 양자화 연구가 기대됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OpenVLA: An Open-Source Vision-Language-Action Model 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/VLA</link>
            <guid>https://velog.io/@holiday_donghun/VLA</guid>
            <pubDate>Sat, 22 Mar 2025 04:18:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>paper: <a href="https://arxiv.org/pdf/2406.09246">https://arxiv.org/pdf/2406.09246</a>
github: <a href="https://github.com/openvla/openvla">https://github.com/openvla/openvla</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/ec8f5663-dde7-499b-ab82-4e100a1022a9/image.png" alt=""></p>
<p>최근 로봇공학 분야에서는 다양한 비전, 언어, 그리고 액션을 통합한 AI 모델의 발전이 두드러지고 있습니다. 특히 로봇이 시각 정보와 자연어 명령을 이해하고 적절한 물리적 행동을 취할 수 있게 하는 비전-언어-액션(Vision-Language-Action, VLA) 모델은 로봇의 자율성과 유연성을 크게 향상시키는 핵심 기술로 주목받고 있습니다.</p>
<p>오늘 소개할 논문 &quot;OpenVLA: An Open-Source Vision-Language-Action Model&quot;은 Stanford, UC Berkeley, Toyota Research Institute 등 여러 연구 기관이 공동으로 개발한 오픈소스 VLA 모델을 제시합니다. 이 모델은 인터넷 규모의 데이터로 사전 훈련된 비전-언어 모델을 기반으로, 970,000개의 실제 로봇 데모 데이터셋을 활용해 로봇 제어 능력을 학습합니다.</p>
<p>OpenVLA는 7B(70억) 파라미터 규모의 모델로, 기존의 55B 파라미터를 가진 폐쇄형 모델인 RT-2-X보다 파라미터 수는 7배 적지만, 29개 작업에서 평균 16.5%의 절대적 성공률 향상을 달성했습니다. 또한 새로운 로봇 환경에 효율적으로 적응할 수 있는 파인튜닝 방법과 소비자용 GPU에서도 운용 가능한 최적화 기법을 제공합니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p>로봇 조작(manipulation) 분야에서 기존 학습 정책들의 가장 큰 약점은 학습 데이터를 벗어난 상황에서의 일반화 능력 부족입니다. 예를 들어, 현재의 로봇 정책들은 물체 위치나 조명 변화와 같은 초기 조건 변화에는 어느 정도 대응할 수 있지만, 주변 방해 물체(distractors)나 이전에 보지 못한 새로운 물체에 대해서는 취약하며, 학습하지 않은 새로운 지시문에 대응하기도 어렵습니다.</p>
<p>반면, 컴퓨터 비전과 자연어 처리 분야에서는 CLIP, SigLIP, Llama 2와 같은 파운데이션 모델들이 인터넷 규모의 데이터로 사전 학습되어 뛰어난 일반화 능력을 보여주고 있습니다. 이러한 파운데이션 모델들의 강점을 로봇 제어에 접목시키려는 시도가, 바로 비전-언어-액션(Vision-Language-Action, VLA) 모델의 핵심 아이디어입니다.</p>
<p>최근 RT-2와 같은 VLA 모델들은 비주얼 언어 모델(Vision-Language Model, VLM)을 로봇 제어 액션 생성에 맞게 파인튜닝하여, 새로운 물체와 작업에 대한 일반화 능력을 보여주며 로봇 정책의 새로운 기준을 제시했습니다. 그러나 이러한 모델들이 널리 사용되기 어려운 이유는 두 가지입니다:</p>
<ol>
<li><p>기존 모델들은 폐쇄적(closed)이며, 모델 아키텍처, 학습 절차, 데이터 구성에 대한 투명성이 부족합니다.</p>
</li>
<li><p>기존 연구들은 VLA 모델을 새로운 로봇, 환경, 작업에 배포하고 적응시키는 모범 사례를 제공하지 않습니다. 특히 일반 소비자용 하드웨어(예: 소비자급 GPU)에서의 활용 방법을 다루지 않습니다.</p>
</li>
</ol>
<p>이러한 한계를 극복하기 위해 저자들은 OpenVLA를 소개합니다. OpenVLA는 7B 파라미터 규모의 오픈소스 VLA로, 다양한 로봇 조작 정책을 위한 새로운 최첨단 성능을 제시합니다. 이 모델은 사전 훈련된 비주얼 언어 모델 백본을 기반으로, Open-X Embodiment 데이터셋의 970,000개 로봇 궤적 데이터로 미세 조정됩니다. 이 데이터셋은 다양한 로봇 형태, 작업, 장면을 포함하고 있습니다.</p>
<p>풍부한 데이터와 새로운 모델 구성요소의 결합으로, OpenVLA는 이전 최고 수준의 VLA인 55B 파라미터의 RT-2-X 모델보다 WidowX와 Google Robot 환경에서의 29개 평가 작업에서 16.5% 더 높은 성공률을 달성했습니다. 또한 저자들은 VLA 모델의 효율적인 파인튜닝 전략을 연구했으며, 파인튜닝된 OpenVLA 정책이 사전 훈련된 Octo와 같은 정책보다 우수한 성능을 보이고, Diffusion Policy와 같은 처음부터 학습한 모방 학습 방법보다 20.4% 더 나은 성능을 보임을 입증했습니다.</p>
<p>이 연구의 주요 기여점은 다음과 같습니다:</p>
<ol>
<li><p>7B 파라미터 규모의 오픈소스 VLA 모델을 제공하여 로봇 조작 정책의 새로운 최고 수준을 설정</p>
</li>
<li><p>VLA 모델의 효율적인 파인튜닝 방법 연구 및 제시</p>
</li>
<li><p>저순위 적응(LoRA)과 모델 양자화를 통한 소비자용 GPU에서의 효율적인 훈련 및 추론 방법 제공</p>
</li>
</ol>
<h3 id="2-related-work">2. Related Work</h3>
<h4 id="visually-conditioned-language-models-비주얼-언어-모델">Visually-Conditioned Language Models (비주얼 언어 모델)</h4>
<p>비주얼 언어 모델(VLM)은 인터넷 규모의 데이터로 학습되어 입력 이미지와 언어 프롬프트에서 자연어를 생성하는 모델입니다. 이 모델들은 시각적 질문 응답부터 객체 지역화까지 다양한 응용 분야에 적용되고 있습니다.</p>
<p>최근 VLM의 주요 발전은 사전 훈련된 비전 인코더와 사전 훈련된 언어 모델의 특성을 연결하는 모델 아키텍처에 있습니다. 초기 연구에서는 비전과 언어 특성 간의 교차 주의(cross-attending) 메커니즘에 다양한 아키텍처를 탐구했지만, 최근 오픈소스 VLM은 &quot;패치-토큰(patch-as-token)&quot; 접근 방식으로 수렴하고 있습니다. 이 방식에서는 사전 훈련된 비주얼 트랜스포머의 패치 특성을 토큰으로 처리하고, 이를 언어 모델의 입력 공간으로 투영합니다.</p>
<p>OpenVLA는 Karamcheti 등의 VLM을 사전 훈련된 백본으로 사용합니다. 이 모델은 다중 해상도 시각적 특성에서 훈련되어, DINOv2의 저수준 공간 정보와 SigLIP의 고수준 의미론을 결합하여 시각적 일반화를 돕습니다.</p>
<h4 id="generalist-robot-policies-일반적인-로봇-정책">Generalist Robot Policies (일반적인 로봇 정책)</h4>
<p>최근 로봇공학 분야에서는 다양한 로봇 데이터셋에서 다중 작업 &quot;일반적&quot; 로봇 정책을 훈련하는 추세가 있습니다. 특히 Octo는 여러 로봇을 즉시 제어할 수 있고 새로운 로봇 설정에 유연하게 파인튜닝할 수 있는 일반적인 정책을 훈련합니다.</p>
<p>이러한 접근 방식과 OpenVLA의 주요 차이점은 모델 아키텍처에 있습니다. Octo와 같은 이전 연구는 일반적으로 사전 훈련된 언어 임베딩이나 비주얼 인코더와 같은 구성 요소들을 조합하고, 정책 훈련 과정에서 이들을 &quot;연결(stitch)&quot;하는 것을 학습합니다. 반면 OpenVLA는 더 엔드투엔드(end-to-end) 접근 방식을 채택하여, VLM을 로봇 액션을 언어 모델 어휘의 토큰으로 취급하여 직접 파인튜닝합니다.</p>
<h4 id="vision-language-action-models-비전-언어-액션-모델">Vision-Language-Action Models (비전-언어-액션 모델)</h4>
<p>여러 연구에서 로봇공학을 위한 VLM의 활용을 탐구해 왔습니다. 시각적 상태 표현, 객체 감지, 고수준 계획, 그리고 피드백 신호 제공을 위해 VLM을 사용했습니다. 일부 연구는 VLM을 엔드투엔드 시각-운동 조작 정책에 직접 통합했지만, 정책 아키텍처에 상당한 구조가 필요하거나 보정된 카메라가 필요하여 적용 범위가 제한적이었습니다.</p>
<p>최근 연구들은 OpenVLA와 유사하게 사전 훈련된 VLM을 로봇 액션 예측에 직접 파인튜닝하는 방법을 탐구했습니다. 이러한 모델들은 로봇 제어 액션을 VLM 백본에 직접 융합하기 때문에 비전-언어-액션(VLA) 모델이라고 불립니다. 이 접근법은 세 가지 주요 이점이 있습니다:</p>
<ol>
<li><p>대규모 인터넷 비전-언어 데이터셋에서 사전 훈련된 비전 및 언어 구성 요소의 정렬을 수행합니다.</p>
</li>
<li><p>로봇 제어를 위해 특별히 제작되지 않은 일반적인 아키텍처를 사용하여 최신 VLM 훈련의 확장 가능한 인프라를 활용하고 코드 수정을 최소화하면서 수십억 파라미터 정책 훈련으로 확장할 수 있습니다.</p>
</li>
<li><p>VLM의 급속한 개선에서 로봇공학이 직접적으로 혜택을 받을 수 있는 경로를 제공합니다.</p>
</li>
</ol>
<p>기존 VLA 연구는 단일 로봇이나 시뮬레이션 환경에서의 훈련과 평가에 중점을 두어 일반성이 부족하거나, 새로운 로봇 환경에 효율적인 파인튜닝을 지원하지 않는 폐쇄형 모델이었습니다.</p>
<p>특히 RT-2-X는 55B 파라미터 VLA 정책을 Open X-Embodiment 데이터셋에서 훈련하여 최첨단 일반적 조작 정책 성능을 보여주었습니다. 그러나 OpenVLA는 RT-2-X와 여러 중요한 측면에서 차이가 있습니다:</p>
<ol>
<li><p>강력한 오픈 VLM 백본과 더 풍부한 로봇 사전 훈련 데이터셋을 결합하여, OpenVLA는 파라미터 수가 10배 적으면서도 실험에서 RT-2-X보다 더 나은 성능을 보입니다.</p>
</li>
<li><p>OpenVLA는 새로운 대상 환경에 대한 모델 파인튜닝을 철저히 조사하는 반면, RT-2-X는 파인튜닝 설정을 연구하지 않았습니다.</p>
</li>
<li><p>OpenVLA는 VLA를 위한 현대적 파라미터 효율적 파인튜닝 및 양자화 접근법의 효과를 처음으로 입증했습니다.</p>
</li>
<li><p>OpenVLA는 VLA 훈련, 데이터 믹스, 목표, 추론에 대한 향후 연구를 지원하는 최초의 오픈소스 일반적 VLA입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f576598f-0366-4050-ad63-c7f0ead309b9/image.png" alt=""></p>
</li>
</ol>
<h3 id="3-the-openvla-model">3. The OpenVLA Model</h3>
<p>OpenVLA 모델은 Open X-Embodiment 데이터셋에서 970,000개의 로봇 데모로 훈련된 7B 파라미터 비전-언어-액션 모델(VLA)입니다. VLA 모델 개발에 있어 최적의 모델 백본, 데이터셋, 하이퍼파라미터 선택에 대한 다양한 미해결 질문이 있습니다. 이 섹션에서는 OpenVLA 개발 접근 방식과 핵심 교훈을 상세히 설명합니다.</p>
<h4 id="31-preliminaries-vision-language-models">3.1 Preliminaries: Vision-Language Models</h4>
<p>최근 VLM의 아키텍처는 다음 세 가지 주요 부분으로 구성됩니다(그림 2 참조):</p>
<ol>
<li><p>비주얼 인코더(Visual Encoder): 이미지 입력을 &quot;이미지 패치 임베딩&quot;으로 매핑합니다.</p>
</li>
<li><p>프로젝터(Projector): 비주얼 인코더의 출력 임베딩을 가져와 언어 모델의 입력 공간으로 매핑합니다.</p>
</li>
<li><p>대규모 언어 모델(LLM) 백본: 실제 텍스트 생성을 담당합니다.</p>
</li>
</ol>
<p>VLM 훈련 중에는 다양한 인터넷 소스에서 수집된 페어링 또는 인터리브된 비전 및 언어 데이터에 대해 다음 텍스트 토큰 예측 목표로 모델이 엔드투엔드로 훈련됩니다.</p>
<p>OpenVLA는 Prismatic-7B VLM을 기반으로 합니다. Prismatic은 위에서 설명한 표준 아키텍처를 따르며, 600M 파라미터 비주얼 인코더, 작은 2계층 MLP 프로젝터, 7B 파라미터 Llama 2 언어 모델 백본으로 구성됩니다. 주목할 만한 점은 Prismatic이 사전 훈련된 SigLIP와 DinoV2 모델로 구성된 2부분 비주얼 인코더를 사용한다는 것입니다. 입력 이미지 패치는 두 인코더를 통해 별도로 전달되고 결과 특성 벡터는 채널별로 연결됩니다. CLIP이나 SigLIP 전용 인코더와 같은 더 일반적으로 사용되는 비전 인코더와 달리, DinoV2 특성의 추가는 향상된 공간 추론에 도움이 되는 것으로 나타났으며, 이는 로봇 제어에 특히 유용할 수 있습니다.</p>
<p>SigLIP, DinoV2 및 Llama 2는 각각 인터넷에서 찾은 수조 개의 이미지-텍스트, 이미지 전용, 텍스트 전용 데이터로 구성된 학습 데이터에 대한 세부 정보를 공개하지 않습니다. Prismatic VLM은 LLaVA 1.5 데이터 믹스를 사용하여 이러한 구성 요소 위에서 파인튜닝되며, 이는 오픈소스 데이터셋에서 약 1백만 개의 이미지-텍스트 및 텍스트 전용 데이터 샘플을 포함합니다.</p>
<h4 id="32-openvla-training-procedure">3.2 OpenVLA Training Procedure</h4>
<p>OpenVLA를 훈련하기 위해, 저자들은 사전 훈련된 Prismatic-7B VLM 백본을 로봇 액션 예측에 맞게 파인튜닝합니다(그림 2 참조). 액션 예측 문제는 &quot;비전-언어&quot; 작업으로 공식화되며, 입력 관측 이미지와 자연어 작업 지시문이 예측된 로봇 액션 문자열에 매핑됩니다.</p>
<p>VLM의 언어 모델 백본이 로봇 액션을 예측할 수 있도록, 연속적인 로봇 액션을 언어 모델의 토크나이저가 사용하는 이산 토큰으로 매핑하여 LLM의 출력 공간에서 액션을 표현합니다. Brohan 등의 방법을 따라, 로봇 액션의 각 차원을 별도로 256개의 빈으로 이산화합니다. 각 액션 차원에 대해, 빈 너비는 훈련 데이터의 액션에서 1번째와 99번째 분위수 사이의 구간을 균등하게 나누도록 설정합니다. 최소-최대 경계를 사용한 Brohan 등과 달리 분위수를 사용함으로써 이산화 구간을 크게 확장하고 액션 이산화의 효과적인 세분성을 감소시킬 수 있는 데이터의 이상치 액션을 무시할 수 있습니다.</p>
<p>이 이산화를 사용하여, N차원 로봇 액션에 대해 N개의 이산 정수(0...255 범위)를 얻습니다. 안타깝게도 OpenVLA의 언어 백본인 Llama 토크나이저는 파인튜닝 중에 새로 도입된 토큰을 위해 단 100개의 &quot;특수 토큰&quot;만 예약하고 있어, 액션 이산화의 256개 토큰에는 충분하지 않습니다. 대신, 저자들은 다시 단순성을 선택하고 Brohan 등의 접근 방식을 따라 Llama 토크나이저 어휘의 가장 적게 사용되는 256개 토큰(마지막 256개 토큰에 해당)을 액션 토큰으로 덮어씁니다.</p>
<p>액션이 토큰 시퀀스로 처리되면, OpenVLA는 예측된 액션 토큰에 대해서만 교차 엔트로피 손실을 평가하는 표준 다음 토큰 예측 목표로 훈련됩니다. 저자들은 3.4절에서 이 훈련 절차를 구현하기 위한 주요 설계 결정에 대해 논의합니다.</p>
<h4 id="33-training-data">3.3 Training Data</h4>
<p>OpenVLA 훈련 데이터셋을 구성하는 목표는 다양한 로봇 형태, 장면, 작업을 포착하는 것입니다. 이를 통해 최종 모델이 여러 로봇을 즉시 제어하고 새로운 로봇 설정에 효율적으로 파인튜닝할 수 있게 됩니다. 저자들은 훈련 데이터셋을 큐레이션하기 위한 기반으로 Open X-Embodiment 데이터셋1을 활용합니다. 현재 전체 OpenX 데이터셋은 70개 이상의 개별 로봇 데이터셋과 2백만 개 이상의 로봇 궤적으로 구성되어 있으며, 대규모 커뮤니티 노력을 통해 일관되고 사용하기 쉬운 데이터 형식으로 통합되었습니다.</p>
<p>이 데이터로 훈련하는 것을 실용적으로 만들기 위해, 저자들은 원시 데이터셋에 여러 단계의 데이터 큐레이션을 적용합니다. 이 큐레이션의 목표는 (1) 모든 훈련 데이터셋에서 일관된 입력 및 출력 공간을 보장하고, (2) 최종 훈련 믹스에서 형태, 작업, 장면의 균형 잡힌 믹스를 보장하는 것입니다. (1)을 해결하기 위해,를 따라 최소 하나의 3인칭 카메라가 있고 단일 팔 엔드 이펙터 제어를 사용하는 조작 데이터셋만 포함하도록 훈련 데이터셋을 제한합니다. (2)를 위해, 첫 번째 필터링 라운드를 통과한 모든 데이터셋에 대해 Octo의 데이터 믹스 가중치를 활용합니다. Octo는 다양성이 적은 데이터셋의 가중치를 낮추거나 제거하고 더 큰 작업 및 장면 다양성을 가진 데이터셋의 가중치를 높입니다.</p>
<p>저자들은 또한 DROID 데이터셋을 포함하여 Octo 출시 이후 Open X 데이터셋에 추가된 몇 가지 추가 데이터셋을 10%의 보수적인 믹스 가중치로 훈련 믹스에 통합하는 실험을 했습니다. 실제로, DROID에 대한 액션 토큰 정확도는 훈련 전반에 걸쳐 낮게 유지되어 향후 그 다양성을 맞추기 위해 더 큰 믹스 가중치나 모델이 필요할 수 있음을 시사했습니다. 최종 모델의 품질을 위태롭게 하지 않기 위해, 저자들은 훈련의 마지막 3분의 1을 위해 데이터 믹스에서 DROID를 제거했습니다.</p>
<h4 id="34-openvla-design-decisions">3.4 OpenVLA Design Decisions</h4>
<p>OpenVLA 모델을 개발할 때, 저자들은 최종 모델 훈련 실행을 시작하기 전에 소규모 실험에서 다양한 설계 결정을 탐색했습니다. 구체적으로, 반복 속도를 높이고 계산 비용을 줄이기 위해 전체 OpenX 믹스에서 훈련하는 대신 BridgeData V2에서 OpenVLA 모델을 훈련하고 평가했습니다. 다음은 이러한 탐색에서 얻은 주요 교훈입니다:</p>
<p><strong>VLM 백본:</strong> 초기에 여러 VLM 백본으로 실험했습니다. Prismatic 외에도 IDEFICS-1과 LLaVA를 로봇 액션 예측을 위해 파인튜닝하는 것을 테스트했습니다. LLaVA와 IDEFICS-1은 장면에 하나의 객체만 있는 작업에서는 비슷한 성능을 보였지만, LLaVA는 여러 객체가 있는 장면에서 언어 지시에 따라 올바른 객체를 조작해야 하는 작업에서 더 강력한 언어 접지를 보여주었습니다. 구체적으로, LLaVA는 BridgeData V2 싱크 환경에서 다섯 가지 언어 접지 작업에서 평균적으로 IDEFICS-1보다 35% 더 높은 절대 성공률을 달성했습니다. 파인튜닝된 Prismatic VLM 정책은 추가적인 개선을 달성하여, 단순한 단일 객체 작업과 다중 객체 언어 접지 작업 모두에서 약 10%의 절대 성공률로 LLaVA 정책을 능가했습니다. 저자들은 이 성능 차이를 융합된 SigLIP-DinoV2 백본(3.1절 참조)에 의해 제공되는 향상된 공간 추론 능력 때문이라고 생각합니다. 성능 향상 외에도 Prismatic은 모듈식이고 사용하기 쉬운 코드베이스를 제공하므로 최종적으로 OpenVLA 모델의 백본으로 선택했습니다.</p>
<p><strong>Image Resolution (이미지 해상도):</strong> 입력 이미지의 해상도는 VLA 훈련의 계산 요구 사항에 상당한 영향을 미칩니다. 고해상도 이미지는 더 많은 이미지 패치 토큰을 생성하여 훈련 계산을 2차적으로 증가시키는 더 긴 컨텍스트 길이를 초래합니다. 224×224px와 384×384px 입력을 가진 VLA를 비교했지만, 평가에서 성능 차이를 발견하지 못했고, 후자는 훈련에 3배 더 오래 걸립니다. 따라서 최종 OpenVLA 모델에는 224×224px 해상도를 선택했습니다. 많은 VLM 벤치마크에서는 해상도 증가가 성능을 향상시키지만, VLA에서는 아직 이러한 추세를 관찰하지 못했습니다.</p>
<p><strong>Fine-Tuning Vision Encoder (비전 인코더 파인튜닝):</strong> VLM에 관한 이전 연구에서는 VLM 훈련 중에 비전 인코더를 동결하는 것이 일반적으로 더 높은 성능으로 이어진다는 것을 발견했습니다. 직관적으로, 동결된 비전 인코더는 인터넷 규모 사전 훈련에서 학습한 강력한 특성을 더 잘 보존할 수 있습니다. 그러나 저자들은 VLA 훈련 중에 비전 인코더를 파인튜닝하는 것이 좋은 VLA 성능에 중요하다는 것을 발견했습니다. 저자들은 사전 훈련된 비전 백본이 정밀한 로봇 제어를 가능하게 하기 위해 장면의 중요한 부분에 대한 충분한 세밀한 공간 세부 정보를 포착하지 못할 수 있다고 가정합니다.</p>
<p><strong>Training Epochs (훈련 에포크):</strong> 일반적인 LLM 또는 VLM 훈련 실행은 훈련 데이터셋을 최대 한두 번 정도만 반복합니다. 반면, 저자들은 VLA 훈련을 위해 훈련 데이터셋을 훨씬 더 많이 반복하는 것이 중요하다는 것을 발견했으며, 훈련 액션 토큰 정확도가 95%를 초과할 때까지 실제 로봇 성능이 지속적으로 증가했습니다. 최종 훈련 실행은 훈련 데이터셋을 27번 반복합니다.</p>
<p><strong>Learning Rate (학습률):</strong> VLA 훈련을 위해 여러 수량 크기에 걸쳐 학습률을 탐색했으며, 2e-5의 고정 학습률(VLM 사전 훈련 중에 사용된 것과 동일한 학습률)을 사용하여 최상의 결과를 달성했습니다. 학습률 워밍업이 이점을 제공하지 않는다는 것을 발견했습니다.</p>
<h4 id="35-infrastructure-for-training-and-inference">3.5 Infrastructure for Training and Inference</h4>
<p>최종 OpenVLA 모델은 14일 동안 64개의 A100 GPU 클러스터에서 훈련되었으며, 총 21,500 A100-시간으로 배치 크기는 2048입니다. 추론 중에 OpenVLA는 bfloat16 정밀도(양자화 없이)로 로드될 때 15 GB의 GPU 메모리를 필요로 하며, 하나의 NVIDIA RTX 4090 GPU에서 약 6 Hz로 실행됩니다(컴파일, 추측적 디코딩 또는 기타 추론 속도 향상 트릭 없이). 5.4절에서 보여지듯이, 실제 로봇 작업에서 성능을 손상시키지 않고 양자화를 통해 추론 중 OpenVLA의 메모리 풋프린트를 더 줄일 수 있습니다. 저자들은 그림 6에서 다양한 소비자 및 서버급 GPU에서의 추론 속도를 보고합니다.</p>
<p>편의를 위해, 저자들은 로봇에 실시간 원격 스트리밍 액션 예측을 가능하게 하는 원격 VLA 추론 서버를 구현했습니다. 이를 통해 로봇을 제어하기 위해 강력한 로컬 컴퓨팅 장치에 액세스할 필요성이 없어졌습니다. 이 원격 추론 솔루션은 오픈소스 코드 릴리스(4절)의 일부로 제공됩니다.</p>
<h3 id="4-the-openvla-codebase">4. The OpenVLA Codebase</h3>
<p>모델과 함께 저자들은 VLA 모델 훈련을 위한 모듈식 PyTorch 코드베이스인 OpenVLA 코드베이스를 공개합니다(<a href="https://openvla.github.io">https://openvla.github.io</a> 참조). 이 코드베이스는 개별 GPU에서 VLA 파인튜닝부터 다중 노드 GPU 클러스터에서 수십억 파라미터 VLA 훈련까지 확장되며, 자동 혼합 정밀도(AMP, PyTorch), FlashAttention, 완전 분할 데이터 병렬성(FSDP, Zhao 등)과 같은 대규모 트랜스포머 모델 훈련을 위한 최신 기술을 지원합니다.</p>
<p>OpenVLA 코드베이스는 Open X 데이터셋에서 훈련하기 위한 완전한 지원을 제공하고, HuggingFace의 AutoModel 클래스와 통합되며, <a href="https://velog.io/@holiday_donghun/LoRA-Low-Rank-Adaptation-of-Large-Language-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">LoRA 파인튜닝</a>과 양자화 모델 추론을 지원합니다.</p>
<h3 id="5-experiments">5. Experiments</h3>
<p>실험 평가의 목표는 OpenVLA가 즉시 사용 가능한 다중 로봇 제어 정책으로서 강력하게 기능할 수 있는지, 그리고 새로운 로봇 작업에 파인튜닝하기 위한 좋은 초기화가 될 수 있는지 테스트하는 것입니다. 구체적으로, 다음 질문에 답하고자 합니다:</p>
<ol>
<li><p>여러 로봇과 다양한 유형의 일반화를 평가할 때 OpenVLA는 이전의 일반적 로봇 정책과 어떻게 비교됩니까?</p>
</li>
<li><p>OpenVLA를 새로운 로봇 설정과 작업에 효과적으로 파인튜닝할 수 있으며, 최신 데이터 효율적 모방 학습 접근법과 비교하면 어떻습니까?</p>
</li>
<li><p>파라미터 효율적 파인튜닝과 양자화를 사용하여 OpenVLA 모델의 훈련 및 추론에 대한 계산 요구 사항을 줄이고 더 접근 가능하게 만들 수 있습니까? 성능-계산 트레이드오프는 무엇입니까?</p>
</li>
</ol>
<h4 id="51-direct-evaluations-on-multiple-robot-platforms-다중-로봇-플랫폼에서의-직접-평가">5.1 Direct Evaluations on Multiple Robot Platforms (다중 로봇 플랫폼에서의 직접 평가)</h4>
<p><strong>로봇 설정 및 작업:</strong></p>
<ul>
<li><p>BridgeData V2 평가를 위한 WidowX 로봇과 Google 로봇(모바일 조작 로봇)에서 평가</p>
</li>
<li><p>다양한 일반화 능력 테스트: 시각적, 동작, 물리적, 의미론적 일반화 및 언어 조건부 능력</p>
</li>
<li><p>BridgeData V2에서 170회 롤아웃(17개 작업, 각 10회), Google 로봇에서 60회 롤아웃(12개 작업, 각 5회)
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e3b6f451-9c92-4912-b71d-5d9497aeffc3/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/adbce3b4-a14b-4866-9e0a-f9de36456177/image.png" alt=""></p>
</li>
</ul>
<p><strong>비교 결과:</strong></p>
<ul>
<li><p>RT-1-X(35M 파라미터)와 Octo(93M 파라미터)는 방해 물체가 있는 상황 등에서 어려움 겪음</p>
</li>
<li><p>OpenVLA(7B)는 55B 파라미터의 RT-2-X보다 10배 작은 모델 크기에도 불구하고 BridgeData V2에서 우수한 성능, Google 로봇에서는 비슷한 성능 달성</p>
</li>
<li><p>RT-2-X는 의미론적 일반화 작업에서 더 높은 성능을 보였으나, OpenVLA는 다른 모든 작업 카테고리에서 비슷하거나 더 나은 성능 보임</p>
</li>
<li><p>OpenVLA의 성능 우위 요인: 더 큰 훈련 데이터셋(970K vs. 350K), 데이터 전처리 개선, 융합 비전 인코더 사용</p>
</li>
</ul>
<h4 id="52-data-efficient-adaptation-to-new-robot-setups-새로운-로봇-설정에-대한-데이터-효율적-적응">5.2 Data-Efficient Adaptation to New Robot Setups (새로운 로봇 설정에 대한 데이터 효율적 적응)</h4>
<p><strong>로봇 설정 및 파인튜닝 방법:</strong></p>
<ul>
<li><p>10-150개 데모를 사용한 작은 데이터셋으로 모델 파인튜닝</p>
</li>
<li><p>Franka-Tabletop(5Hz 제어)과 Franka-DROID(15Hz 제어) 로봇 환경에서 테스트</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/647d5984-8efd-48c4-aab7-a064adc939f8/image.png" alt=""></p>
<p><strong>비교 결과:</strong></p>
<ul>
<li><p>Diffusion Policy는 좁은 단일 지시 작업(&quot;당근을 그릇에 넣기&quot; 등)에서 강점 보임</p>
</li>
<li><p>OpenVLA와 Octo는 언어 접지가 중요한 다중 물체/지시 작업에서 우수한 성능</p>
</li>
<li><p>OpenVLA가 모든 작업 유형에서 최소 50% 성공률을 달성하여 가장 높은 평균 성능 기록</p>
</li>
<li><p>OpenVLA(scratch)의 낮은 성능은 OpenX 사전 훈련의 중요성을 입증</p>
</li>
</ul>
<h4 id="53-parameter-efficient-fine-tuning-파라미터-효율적-파인튜닝">5.3 Parameter-Efficient Fine-Tuning (파라미터 효율적 파인튜닝)</h4>
<p><strong>파인튜닝 접근법 비교:</strong></p>
<ul>
<li><p>전체 파인튜닝: 모든 가중치 업데이트</p>
</li>
<li><p>마지막 계층만: 트랜스포머 백본의 마지막 계층과 토큰 임베딩 매트릭스만 파인튜닝</p>
</li>
<li><p>동결된 비전: 비전 인코더를 동결하고 다른 모든 가중치 파인튜닝</p>
</li>
<li><p>샌드위치 파인튜닝: 비전 인코더, 토큰 임베딩 매트릭스, 마지막 계층만 파인튜닝</p>
</li>
<li><p>LoRA(Low-Rank Adaptation): 저순위 행렬 분해를 통한 효율적 파인튜닝
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e196948c-295c-4d0c-97f7-8de5a006fec7/image.png" alt=""></p>
</li>
</ul>
<p><strong>결과:</strong></p>
<ul>
<li><p>마지막 계층만 파인튜닝하거나 비전 인코더를 동결하면 성능 저하</p>
</li>
<li><p>LoRA가 성능과 메모리 소비 사이 최상의 트레이드오프 달성</p>
</li>
<li><p>LoRA는 전체 파인튜닝과 비슷한 성능(68.2% vs. 69.7%)을 보이면서 파라미터의 1.4%만 파인튜닝</p>
</li>
<li><p>LoRA 사용 시 단일 A100 GPU에서 10-15시간 내에 새 작업 적응 가능(전체 파인튜닝 대비 8배 계산 감소)</p>
</li>
</ul>
<h4 id="54-memory-efficient-inference-via-quantization-양자화를-통한-메모리-효율적-추론">5.4 Memory-Efficient Inference via Quantization (양자화를 통한 메모리 효율적 추론)</h4>
<p><strong>양자화 방법:</strong></p>
<ul>
<li><p>bfloat16(기본), 8비트, 4비트 정밀도로 OpenVLA 모델 서빙 비교</p>
</li>
<li><p>8개 대표적 BridgeData V2 작업에서 평가
<img src="https://velog.velcdn.com/images/holiday_donghun/post/d1c540ac-135e-4829-b158-6636df3f4f43/image.png" alt=""></p>
</li>
</ul>
<p><strong>결과:</strong></p>
<ul>
<li><p>8비트 양자화: 추론 속도 저하(A5000 GPU에서 1.2Hz)로 인해 성능 감소(58.1%)</p>
</li>
<li><p>4비트 양자화: GPU 메모리 사용량을 절반 이상 줄이면서도 bfloat16과 유사한 성능 유지(71.9% vs. 71.3%)</p>
</li>
<li><p>4비트 양자화 모델은 A5000에서 3Hz로 실행 가능해 훈련 데이터 시스템 역학과 더 유사</p>
</li>
</ul>
<h3 id="6-discussion-and-limitations">6. Discussion and Limitations</h3>
<p>OpenVLA 모델의 현재 한계점과 향후 연구 방향:</p>
<p><strong>1. 다중 이미지 관측 지원 부족:</strong></p>
<ul>
<li><p>현재는 단일 이미지 관측만 지원</p>
</li>
<li><p>실제 로봇 환경은 다양한 센서 입력이 있는 이질적 시스템</p>
</li>
<li><p>다중 이미지 및 고유 입력과 관측 이력 지원으로 확장 필요</p>
</li>
</ul>
<p><strong>2. 추론 처리량 한계:</strong></p>
<ul>
<li><p>ALOHA와 같은 고주파수(50Hz) 제어 환경에서 활용하기 위한 처리량 개선 필요</p>
</li>
<li><p>액션 청킹이나 추측적 디코딩과 같은 최적화 기술이 해결책이 될 수 있음</p>
</li>
</ul>
<p><strong>3. 성능 향상 여지:</strong></p>
<ul>
<li><p>기존 일반적 정책보다 우수한 성능을 보이지만 아직 90% 이상의 높은 신뢰성은 부족</p>
</li>
<li><p>더 세밀한 조작 작업에서 성능 향상 필요</p>
</li>
</ul>
<p><strong>4. 추가 연구 질문:</strong></p>
<ul>
<li><p>계산 제한으로 인해 VLA 설계 관련 많은 질문이 충분히 탐구되지 않음</p>
</li>
<li><p>기본 VLM 크기의 영향, 인터넷 규모 데이터와의 공동 훈련 효과, 최적 시각적 특성 등</p>
</li>
<li><p>OpenVLA의 공개로 커뮤니티가 이러한 질문들을 공동으로 탐구할 수 있게 됨</p>
</li>
</ul>
<h3 id="7-마지막으로">7. 마지막으로</h3>
<p>OpenVLA는 로봇 조작을 위한 강력한 오픈소스 비전-언어-액션 모델을 제공하며, 파라미터 효율적 파인튜닝과 양자화를 통한 계산 효율성으로 다양한 환경에서의 접근성과 활용성을 크게 높였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CLIP: Learning Transferable Visual Models From Natural Language Supervision 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/CLIPContrastive-Language-Image-Pretraining</link>
            <guid>https://velog.io/@holiday_donghun/CLIPContrastive-Language-Image-Pretraining</guid>
            <pubDate>Thu, 20 Mar 2025 08:43:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>paper: <a href="https://arxiv.org/abs/2103.00020">https://arxiv.org/abs/2103.00020</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/62b34080-36ea-4947-bf0d-66eaa5a0cc74/image.png" alt=""></p>
<h3 id="0-abstraction">0. Abstraction</h3>
<p>최근 딥러닝, 특히 합성곱 신경망(Convolutional Neural Network, CNN)은 컴퓨터 비전 분야에서 놀라운 성과를 이루었습니다. 그러나 이러한 네트워크는 많은 계산 자원과 메모리를 필요로 하기 때문에 모바일 기기나 임베디드 시스템에서 실행하기 어렵습니다.</p>
<p>이 논문에서는 기존 CNN의 두 가지 효율적인 근사 방법을 제안합니다:</p>
<ol>
<li><p>Binary-Weight-Networks (이진 가중치 네트워크): 필터의 가중치를 이진값(+1 또는 -1)으로 근사화하여 메모리 사용량을 32배 절약합니다.</p>
</li>
<li><p>XNOR-Networks (XNOR 네트워크): 가중치뿐만 아니라 합성곱 레이어의 입력까지 이진화하여 주로 이진 연산만으로 합성곱을 근사화합니다. 이는 고정밀 연산의 수를 58배 줄이고 메모리를 32배 절약합니다.</p>
</li>
</ol>
<p>이러한 접근 방식은 GPU 대신 CPU에서도 최신 네트워크를 실시간으로 실행할 수 있는 가능성을 제공합니다. 저자들은 ImageNet 분류 작업에서 이 방법을 평가했고, Binary-Weight-Network 버전의 AlexNet은 전체 정밀도(full-precision) AlexNet과 동일한 분류 정확도를 달성했습니다. 또한 기존의 네트워크 이진화 방법인 BinaryConnect와 BinaryNets보다 ImageNet에서 top-1 정확도가 16% 이상 향상되었습니다.</p>
<h3 id="2-related-work">2. Related Work</h3>
<h4 id="shallow-networks-얇은-네트워크">Shallow networks (얇은 네트워크)</h4>
<p>깊은 신경망을 더 얕은 모델로 추정하여 네트워크 크기를 줄이는 방법입니다. Cybenko의 초기 이론적 연구에 따르면, 충분히 큰 단일 은닉층을 가진 시그모이드 유닛 네트워크는 어떤 결정 경계도 근사화할 수 있다고 합니다. 그러나 실제 컴퓨터 비전이나 음성 인식과 같은 복잡한 분야에서는 얕은 네트워크가 깊은 모델과 경쟁하기 어렵습니다.</p>
<p>Ba와 Caruana의 연구에서는 깊은 네트워크를 모방하도록 얕은 네트워크를 훈련시키는 방법을 제안했지만, 유사한 정확도를 얻으려면 얕은 네트워크의 매개변수 수가 깊은 네트워크의 매개변수 수와 비슷해야 했습니다.</p>
<h4 id="compressing-pre-trained-networks-사전-훈련된-네트워크-압축">Compressing pre-trained networks (사전 훈련된 네트워크 압축)</h4>
<p>이전에 훈련된 네트워크에서 중복적이거나 중요하지 않은 가중치를 제거(pruning)하여 추론 시 네트워크 크기를 줄이는 방법입니다. 초기에는 가중치 감쇠(Weight decay)가 사용되었고, 이후 Optimal Brain Damage와 Optimal Brain Surgeon은 손실 함수의 헤시안(Hessian)을 사용하여 연결 수를 줄이는 방법을 제안했습니다.</p>
<p>최근에는 Han 등이 가지치기를 통해 여러 최첨단 신경망의 매개변수 수를 크게 줄였습니다. Deep compression은 중복 연결을 제거하고 가중치를 양자화한 후 허프만 코딩으로 압축하여 모바일 기기에서 대형 네트워크를 실행하기 위한 저장소와 에너지 소비를 줄였습니다.</p>
<h4 id="designing-compact-layers-컴팩트-레이어-설계">Designing compact layers (컴팩트 레이어 설계)</h4>
<p>딥 네트워크의 각 레이어에서 컴팩트한 구조를 설계하는 방법입니다. 완전 연결 레이어를 글로벌 평균 풀링으로 대체하는 방법이 Network in Network, GoogLenet, Residual-Net에서 사용되었습니다. Residual-Net의 병목 구조는 매개변수 수를 줄이고 속도를 향상시키기 위해 제안되었습니다.</p>
<p>또한 3×3 합성곱을 더 작은 1×1 합성곱으로 분해하거나 대체하는 방법도 연구되었으며, 이를 통해 매개변수 수를 크게 줄이면서도 높은 정확도를 달성할 수 있었습니다.</p>
<h4 id="quantizing-parameters-매개변수-양자화">Quantizing parameters (매개변수 양자화)</h4>
<p>높은 정밀도의 매개변수가 딥 네트워크의 성능에 반드시 필요한 것은 아니라는 발견에 기반합니다. Gong 등은 벡터 양자화 기술을 사용하여 완전 연결 레이어의 가중치를 양자화했으며, 단순히 가중치 값을 0에서 임계값을 설정하는 것만으로도 정확도 손실이 크지 않음을 보여주었습니다.</p>
<p>다른 연구들은 +1/0/-1 가중치를 가진 희소 네트워크 훈련, 8비트 정수의 고정 소수점 구현, 삼진 가중치와 3비트 활성화를 가진 고정 소수점 네트워크 등 다양한 양자화 방법을 제안했습니다.</p>
<h4 id="network-binarization-네트워크-이진화">Network binarization (네트워크 이진화)</h4>
<p>본 논문과 가장 관련성이 높은 연구 분야입니다. 네트워크 이진화는 신경망의 가중치와 활성화를 이진값으로 제한하는 방법입니다.</p>
<p>Expectation BackPropagation(EBP)은 이진 가중치와 이진 활성화를 가진 네트워크로도 높은 성능을 달성할 수 있음을 보여주었습니다. BinaryConnect는 EBP의 확률적 아이디어를 확장하여, 전방 및 후방 전파 중에 이진 가중치를 사용하고 매개변수 업데이트 단계에서는 실수값 가중치를 유지하는 방법을 제안했습니다.</p>
<p>BinaryNet은 BinaryConnect를 더 확장하여 가중치와 활성화 모두를 이진화했습니다. 본 논문의 접근 방식은 이들과 유사하지만 이진화 방법과 네트워크 구조에서 차이가 있으며, ImageNet에서의 실험 결과 BinaryNet보다 훨씬 우수한 성능을 보였습니다.</p>
<h3 id="3-binary-convolutional-neural-network">3. Binary Convolutional Neural Network</h3>
<p>CNN을 ⟨I, W, <strong><strong>*⟩로 표현할 수 있으며, 여기서 I는 입력 텐서의 집합, W는 가중치 필터의 집합, *</strong></strong>는 합성곱 연산을 나타냅니다. 두 가지 이진 CNN 변형을 제안합니다: <strong>Binary-Weight-Networks</strong>와 <strong>XNOR-Networks</strong>.</p>
<h4 id="31-binary-weight-networks">3.1 Binary-Weight-Networks</h4>
<p>Binary-Weight-Networks에서는 실수값 가중치 필터 W를 이진 필터 $$B ∈ (+1, -1)^{(c×w×h)}$$와 스케일링 팩터 α ∈ R+를 사용하여 W ≈ αB로 근사화합니다. 이를 통해 합성곱 연산은 다음과 같이 근사화될 수 있습니다:</p>
<p>$$I * W ≈ (I ⊕ B) α$$</p>
<p>여기서 ⊕는 곱셈이 없는 합성곱 연산을 나타냅니다. 가중치가 이진값이므로, 합성곱은 덧셈과 뺄셈만으로 구현할 수 있으며, 메모리 사용량을 32배 절약할 수 있습니다.</p>
<p><strong>Estimating binary weights (이진 가중치 추정)</strong></p>
<p>최적의 이진 가중치와 스케일링 팩터를 찾기 위해, 실수값 가중치 W와 이진 가중치 αB 사이의 L2 거리를 최소화하는 최적화 문제를 해결합니다:</p>
<p>$$J(B, α) = ||W - αB||²$$</p>
<p>이 문제의 최적 해는 다음과 같습니다:</p>
<p>최적 이진 가중치: $$B* = sign(W)$$ (가중치의 부호를 취함)</p>
<p>최적 스케일링 팩터: $$α* = (1/n)||W||_{ℓ1}$$ (절대 가중치 값의 평균)</p>
<p>따라서, 이진 가중치 필터의 최적 추정은 가중치 값의 부호를 취하고, 최적 스케일링 팩터는 절대 가중치 값의 평균을 사용하는 것으로 간단히 구할 수 있습니다.</p>
<p> *<em>Training Binary-Weights-Networks *</em></p>
<p>CNN 훈련의 각 반복은 전방 패스, 후방 패스, 매개변수 업데이트의 세 단계로 이루어집니다. Binary-Weight-Networks를 훈련시키기 위해, 전방 패스와 후방 전파 동안에만 가중치를 이진화하고, 매개변수 업데이트는 실수값 가중치를 사용합니다.</p>
<p>이는 매개변수 변화가 매우 작기 때문에, 매개변수 업데이트 후 바로 이진화하면 이러한 작은 변화가 무시되어 훈련 목표가 개선되지 않기 때문입니다. 이 훈련 방식은 BinaryConnect와 유사합니다.</p>
<h4 id="32-xnor-networks">3.2 XNOR-Networks</h4>
<p>XNOR-Networks는 한 단계 더 나아가 가중치뿐만 아니라 합성곱 레이어의 입력도 이진화합니다. 이를 통해 합성곱 연산을 XNOR 비트 연산과 비트 카운팅으로 대체하여 계산 효율성을 크게 향상시킬 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/48a9ad00-7078-4b99-b2a4-5c43325c44f8/image.png" alt=""></p>
<p><strong>Binary Dot Product (이진 내적)</strong></p>
<p>두 실수 벡터 $$X, W ∈ R^n$$ 사이의 내적을 $$X^T W ≈ βH^T αB$$로 근사화하고자 합니다. 여기서 $$H, B ∈ ({+1, -1})^n$$은 이진 벡터이고 $$β, α ∈ R^+$$는 스케일링 팩터입니다.</p>
<p>최적화 문제를 풀면, 최적 이진 벡터는 $$C^* = sign(X) ⊙ sign(W) = H^* ⊙ B$$로 주어지며, 여기서 ⊙는 요소별 곱을 나타냅니다. 최적 스케일링 팩터는 γ = βα로, β는 입력의 절대값 평균, α는 가중치의 절대값 평균입니다.</p>
<p><strong>Binary Convolution (이진 합성곱)</strong>
합성곱은 시프트 연산과 내적의 반복으로 구성됩니다. 이진 내적을 사용하면, 이진 가중치와 이진 입력 사이의 합성곱을 다음과 같이 근사화할 수 있습니다:</p>
<p>$$I * W ≈ (sign(I) ⊛ sign(W)) ⊙ Kα$$</p>
<p>여기서 ⊛는 XNOR 및 비트 카운팅 연산을 사용한 합성곱을 나타내며, K는 입력의 모든 하위 텐서에 대한 스케일링 팩터를 포함하는 행렬입니다. 이를 통해 합성곱 연산을 주로 이진 연산으로 수행하여 계산 효율성을 크게 향상시킬 수 있습니다.</p>
<p><strong>Training XNOR-Networks</strong></p>
<p>CNN의 일반적인 블록 구조는 합성곱(Convolution), 배치 정규화(Batch Normalization), 활성화(Activation), 풀링(Pooling) 순으로 구성됩니다. 그러나 이진 입력에 풀링을 적용하면 상당한 정보 손실이 발생합니다.</p>
<p>저자들은 이를 해결하기 위해 블록 구조를 변경하여, 먼저 배치 정규화를 적용한 후 이진 활성화, 그 다음 이진 합성곱, 마지막으로 풀링을 적용하는 순서를 제안합니다. 이렇게 하면 이진화로 인한 정보 손실을 최소화할 수 있습니다.</p>
<p>훈련 알고리즘은 Binary-Weight-Networks와 유사하게, 전방 패스와 후방 전파에서는 이진 가중치와 이진 입력을 사용하고, 매개변수 업데이트에서는 실수값 가중치를 사용합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/bfaa9043-0af2-47bc-8a5b-d87ec33c4849/image.png" alt=""></p>
<p>** BinaryGradient (이진 그래디언트)**
각 레이어에서 후방 패스의 계산 병목 현상은 가중치 필터(w)와 입력에 대한 그래디언트($$g^in$$) 사이의 합성곱을 계산하는 것입니다. 전방 패스에서의 이진화와 유사하게, 후방 패스에서 $$g^in$$을 이진화할 수 있습니다. 이는 이진 연산을 사용하는 매우 효율적인 훈련 절차로 이어집니다.</p>
<p>방정식 6을 사용하여 $$g^in$$에 대한 스케일링 팩터를 계산하면 SGD에 대한 최대 변화 방향이 감소됩니다. 모든 차원에서 최대 변화를 보존하기 위해, 스케일링 팩터로 $$max_i(|g^{in}_{i}|)$$를 사용합니다.</p>
<p> <strong>k-bitQuantization (k-비트 양자화)</strong>
지금까지 sign(x) 함수를 사용하여 가중치와 입력의 1비트 양자화를 보여주었습니다. 양자화 수준을 k-비트로 쉽게 확장할 수 있습니다. 부호 함수 대신 $$q_k(x) = 2([(2^k-1)((x+1)/2)]/(2^k-1) - 1/2)$$를 사용하면 됩니다. 여기서 $$[.]$$은 반올림 연산을 나타내며, $$x ∈ [-1, 1]$$입니다.</p>
<h3 id="4-experiments">4. Experiments</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/58fafb55-75fb-4d6d-89e2-4bdc83a20560/image.png" alt=""></p>
<h4 id="41-efficiency-analysis">4.1 Efficiency Analysis</h4>
<p><strong>메모리 효율성</strong>
이진 가중치를 사용하면 32비트 실수 대신 1비트로 가중치를 저장할 수 있어 메모리 요구량을 32배 줄일 수 있습니다. 그림 4-a는 AlexNet, VGG-19, ResNet-18에서 이진 가중치와 실수 가중치에 필요한 메모리를 비교한 결과를 보여줍니다. 이진 가중치 네트워크는 크기가 매우 작아 휴대용 기기에 쉽게 탑재될 수 있습니다.</p>
<p><strong>계산 효율성</strong>
표준 합성곱에서 총 연산 수는 $$cN_WN_I$$로, c는 채널 수, $$N_W$$는 필터 크기, $$N_I$$는 입력 크기입니다. 저자들의 이진 합성곱 근사에서는 $$cN_WN_I$$ 이진 연산과 $$N_I$$ 비이진 연산만 필요합니다.</p>
<p>최신 CPU에서는 한 클록에 64개의 이진 연산을 수행할 수 있으므로, 이론적인 속도 향상은 $$S = 64cN_W / (cN_W + 64)$$로 계산됩니다. 일반적인 CNN 구조에서는 약 62.27배의 속도 향상이 가능하며, 실제 CPU 구현에서는 58배의 속도 향상을 달성했습니다.</p>
<p>채널 크기가 작은 첫 번째 레이어(c=3)와 필터 크기가 작은 마지막 레이어(1×1)는 이진화 시 효율성이 낮아 이진화하지 않는 것이 좋습니다.</p>
<h4 id="42-image-classification">4.2 Image Classification</h4>
<p>저자들은 제안된 방법을 ImageNet 데이터셋에서 평가했습니다. ImageNet은 1000개 카테고리의 약 120만 개 훈련 이미지와 5만 개 검증 이미지를 포함하는 대규모 데이터셋입니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/723312fd-6a58-4618-be53-df9f740f1465/image.png" alt=""></p>
<p><strong>AlexNet</strong>
AlexNet 아키텍처에 대한 실험 결과, Binary-Weight-Network(BWN)는 56.8% top-1, 79.4% top-5 정확도를 달성했으며, 이는 전체 정밀도 AlexNet(56.6% top-1, 80.2% top-5)과 거의 동일한 수준입니다. XNOR-Network는 44.2% top-1, 69.2% top-5 정확도를 달성했습니다.</p>
<p>반면, 경쟁 방법인 BinaryConnect(BC)는 35.4% top-1, 61.0% top-5 정확도를, BinaryNet(BNN)은 27.9% top-1, 50.42% top-5 정확도를 달성하여, 저자들의 방법이 큰 차이(약 17%)로 우수함을 보여주었습니다.</p>
<p><strong>ResNet-18</strong>
ResNet-18 아키텍처에 대한 실험에서는 BWN이 60.8% top-1, 83.0% top-5 정확도를 달성했으며, XNOR-Net은 51.2% top-1, 73.2% top-5 정확도를 달성했습니다. 전체 정밀도 ResNet-18의 정확도는 69.3% top-1, 89.2% top-5로, BWN이 상당히 근접한 성능을 보여주었습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/674ed27c-2306-4b66-9057-0b8b8bf7d756/image.png" alt=""></p>
<p><strong>GoogLenet 변형</strong>
GoogLenet 변형 아키텍처에서는 BWN이 65.5% top-1, 86.1% top-5 정확도를 달성했으며, 전체 정밀도 네트워크의 정확도는 71.3% top-1, 90.0% top-5였습니다.</p>
<p>이러한 결과는 Binary-Weight-Networks가 전체 정밀도 네트워크에 매우 근접한 성능을 달성할 수 있음을 보여줍니다. XNOR-Networks는 가중치와 입력 모두를 이진화함에도 불구하고 상당히 높은 정확도를 유지했으며, 두 방법 모두 기존의 네트워크 이진화 방법들보다 훨씬 우수한 성능을 보였습니다.</p>
<h4 id="43-ablation-studies">4.3 Ablation Studies</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/ad2105ea-c2e4-4e70-9551-e6b8a8c17c76/image.png" alt=""></p>
<p><strong>스케일링 팩터 계산 방법의 영향</strong>
스케일링 팩터 α를 방정식 6을 사용하여 계산하는 방법과, α를 네트워크 매개변수로 간주하여 별도의 레이어로 학습하는 방법을 비교했습니다.</p>
<p>결과적으로, 방정식 6을 사용한 방법이 top-1 정확도 56.8%, top-5 정확도 79.4%를 달성한 반면, 별도 레이어를 사용한 방법은 top-1 정확도 46.2%, top-5 정확도 69.5%로 성능이 저하되었습니다. 이는 최적의 스케일링 팩터를 계산하는 방법이 이진 네트워크의 성능에 중요함을 보여줍니다.</p>
<p><strong>CNN 블록 구조의 영향</strong>
저자들은 표준 블록 구조인 C-B-A-P(Convolution, Batch Normalization, Activation, Pooling)와 제안된 블록 구조인 B-A-C-P의 성능을 비교했습니다.</p>
<p>결과적으로, 제안된 B-A-C-P 구조가 top-1 정확도 44.2%, top-5 정확도 69.2%를 달성한 반면, 표준 C-B-A-P 구조는 top-1 정확도 30.3%, top-5 정확도 57.5%에 그쳤습니다. 이는 이진 입력을 사용할 때 레이어 순서가 성능에 중요한 영향을 미침을 보여줍니다.</p>
<p>이러한 연구 결과는 저자들이 제안한 <strong>스케일링 팩터 계산 방법</strong>과 <strong>블록 구조</strong>가 <strong>이진 네트워크</strong>의 성능 향상에 중요한 역할을 함을 입증합니다.</p>
<h3 id="5-conclusion">5. Conclusion</h3>
<p><strong>Binary-Weight-Networks:</strong> 가중치를 이진화하여 네트워크 크기를 32배 줄입니다. 이는 제한된 메모리를 가진 기기에서도 깊은 신경망을 사용할 수 있게 합니다. 놀랍게도, 이진 가중치 버전의 AlexNet은 전체 정밀도 AlexNet과 동일한 정확도를 달성했습니다.</p>
<p><strong>XNOR-Networks:</strong> 가중치와 입력 모두 이진화하여 주로 비트 연산만으로 계산을 수행합니다. 이는 58배의 속도 향상을 제공하며, GPU 없이도 CPU에서 실시간 추론을 가능하게 합니다.</p>
<p>이 연구는 ImageNet과 같은 대규모 데이터셋에서 이진 신경망의 성능을 평가한 최초의 시도입니다. 실험 결과, 제안된 방법은 기존의 네트워크 이진화 방법들보다 훨씬 높은 정확도를 달성했습니다.</p>
<p>이러한 발전은 모바일 기기, 임베디드 시스템, 웨어러블 디바이스 등 제한된 자원을 가진 환경에서도 최첨단 딥러닝 모델을 효율적으로 실행할 수 있는 가능성을 열어줍니다. 향후 연구 방향으로는 다양한 네트워크 아키텍처에 이 방법을 적용하거나, 이진화 기법을 더욱 개선하여 정확도와 효율성의 균형을 더욱 향상시키는 것이 있을 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Hunyuan3D 2.0: Scaling Diffusion Models for High
Resolution Textured 3D Assets Generation 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Hunyuan3D-2.0-Scaling-Diffusion-Models-for-HighResolution-Textured-3D-Assets-Generation-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Hunyuan3D-2.0-Scaling-Diffusion-Models-for-HighResolution-Textured-3D-Assets-Generation-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Wed, 12 Mar 2025 07:03:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>paper: <a href="https://arxiv.org/pdf/2501.12202">https://arxiv.org/pdf/2501.12202</a>
github: <a href="https://github.com/Tencent/Hunyuan3D-2">https://github.com/Tencent/Hunyuan3D-2</a></p>
</blockquote>
<h3 id="1-introduction">1. Introduction</h3>
<p>3D 콘텐츠는 게임, 영화, 가상현실(VR), 증강현실(AR)을 비롯한 다양한 분야에서 필수적인 요소가 되었습니다. 하지만 전통적인 3D 모델링 방식은 전문적인 기술과 많은 시간이 필요한 복잡한 과정입니다. 특히 고품질의 텍스처를 입힌 3D 에셋을 만드는 작업은 매우 작업 난이도가 높습니다.</p>
<p>최근 인공지능, 특히 확산 모델(Diffusion Models)의 발전으로 2D 이미지 생성 분야에서 놀라운 성과가 있었습니다. 이러한 기술을 3D 영역으로 확장하려는 시도가 계속되어 왔지만, 고품질 3D 모델과 텍스처를 동시에 생성하는 것은 여전히 어려운 과제였습니다.</p>
<p>Hunyuan3D 2.0은 이러한 문제를 해결하기 위해 개발된 대규모 3D 합성 시스템입니다. 이 시스템은 두 가지 핵심 구성 요소로 이루어져 있습니다:</p>
<blockquote>
<ol>
<li>Hunyuan3D-DiT: 3D 형상(모양) 생성에 특화된 모델</li>
<li>Hunyuan3D-Paint: 생성된 형상에 고해상도 텍스처를 입히는 모델</li>
</ol>
</blockquote>
<p>이 논문에서는 Hunyuan3D 2.0이 어떻게 기존의 3D 생성 모델들을 뛰어넘어 더 정교하고 사실적인 3D 에셋을 생성할 수 있는지 설명합니다. 또한 형상 생성과 텍스처 합성을 분리함으로써 복잡한 문제를 효과적으로 해결하는 방법을 소개합니다.</p>
<h3 id="2-hunyuan3d-20-architecture">2 Hunyuan3D 2.0 Architecture</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/adfd0805-8455-4448-9691-3f359bda82b3/image.png" alt=""></p>
<p>Hunyuan3D 2.0은 두 단계로 구성된 파이프라인을 채택하고 있습니다: 먼저 기본 3D 메시를 생성한 후, 이 메시에 텍스처 맵을 합성합니다. 이러한 접근 방식은 형상과 텍스처 생성의 복잡성을 분리하여 각각의 문제를 효과적으로 해결할 수 있게 합니다.</p>
<p>전체 파이프라인
Hunyuan3D 2.0의 전체 파이프라인은 다음과 같이 구성됩니다:</p>
<ol>
<li><p><strong>입력 조건 처리</strong>: 텍스트 설명이나 참조 이미지를 입력받아 처리</p>
</li>
<li><p><strong>형상 생성 (Hunyuan3D-DiT)</strong>: 잠재 확산 모델을 통해 3D 메시 생성</p>
</li>
<li><p><strong>텍스처 합성 (Hunyuan3D-Paint)</strong>: 생성된 메시에 고해상도 텍스처 매핑</p>
</li>
<li><p><strong>최종 렌더링</strong>: 텍스처가 적용된 3D 에셋의 최종 렌더링</p>
</li>
</ol>
<p>이 파이프라인의 가장 큰 장점은 형상 생성과 텍스처 합성을 분리함으로써 각 단계를 독립적으로 최적화할 수 있다는 점입니다. 또한 사용자가 직접 제작한 메시에도 AI 기반 텍스처를 적용할 수 있어 실용성이 높습니다</p>
<h4 id="3-형상-생성-모델-hunyuan3d-dit-shape-generation-model">3. 형상 생성 모델: Hunyuan3D-DiT (Shape Generation Model)</h4>
<p>Hunyuan3D-DiT는 텍스트나 이미지를 입력으로 받아 3D 형상을 생성하는 모델입니다. 이 모델은 확산 변환기(Diffusion Transformer)를 기반으로 하며, 정확하고 세밀한 3D 메시를 생성하는 것을 목표로 합니다.</p>
<h4 id="31-hunyuan3d-shapevae">3.1 Hunyuan3D-ShapeVAE</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/0e915560-267c-410a-9332-6b2fabcc80c4/image.png" alt=""></p>
<p>Hunyuan3D-DiT의 핵심 구성 요소 중 하나는 Hunyuan3D-ShapeVAE입니다. 이것은 변분 오토인코더(Variational Autoencoder, VAE)로, 3D 형상 데이터를 연속적인 잠재 토큰으로 압축하는 역할을 합니다.</p>
<p>VAE의 기본 원리는 다음과 같은 수식으로 표현됩니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/fedd09e7-fdf9-44a0-9fc0-ab486cd4554f/image.png" alt=""></p>
<p>여기서:
$$q <em>ϕ(z∣x)$$는 인코더 네트워크로, 입력 x를 잠재 변수 z로 매핑
$$p _θ(x∣z)$$는 디코더 네트워크로, 잠재 변수 z를 원래 입력 공간 x로 복원 
$$D</em>{KL}$$은 쿨백-라이블러 발산(Kullback-Leibler divergence)으로, 인코더의 출력 분포와 사전 분포(보통 정규 분포) 간의 차이를 측정</p>
<p>Hunyuan3D-ShapeVAE는 단순히 균일하게 샘플링된 포인트뿐만 아니라, 중요도 샘플링 전략을 사용하여 메시 구조의 고주파 세부 정보(모서리, 가장자리 등)를 효과적으로 포착합니다. 이를 통해 생성된 3D 모델의 세부 디테일이 더욱 정확하게 표현됩니다.</p>
<h4 id="이중-단일-스트림-트랜스포머-아키텍처">이중-단일 스트림 트랜스포머 아키텍처</h4>
<p>Hunyuan3D-DiT는 이중-단일 스트림 트랜스포머 아키텍처를 채택하고 있습니다. 이 아키텍처에서는 형상 토큰과 조건 토큰(입력 이미지에서 파생)이 별도로 처리되지만, 어텐션 메커니즘을 통해 상호작용합니다.</p>
<p>트랜스포머의 셀프 어텐션(Self-Attention) 메커니즘은 다음과 같은 수식으로 표현됩니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/858b52b1-29dc-4885-87e2-52389f61f748/image.png" alt="">
이중-단일 스트림 아키텍처에서는 형상 토큰과 조건 토큰이 별도의 경로로 처리되지만, 크로스 어텐션(Cross-Attention)을 통해 서로 정보를 교환합니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/e74fd92b-9a12-45ec-b798-6ffa229fb245/image.png" alt="">
이러한 구조를 통해 모델은 입력 조건(텍스트나 이미지)의 정보를 효과적으로 반영한 3D 형상을 생성할 수 있습니다.</p>
<h4 id="흐름-기반-확산-모델-flow-based-diffusion-model">흐름 기반 확산 모델 (Flow-based Diffusion Model)</h4>
<p>Hunyuan3D-DiT는 기존의 확산 모델에서 발전된 형태인 흐름 기반 확산 모델을 사용합니다. 이 모델은 데이터 분포와 노이즈 분포 사이의 변환을 연속적인 벡터 필드로 정의합니다.</p>
<p>흐름 매칭 목표는 다음과 같은 수식으로 표현됩니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/17624874-968e-4a91-b533-0c98778fb96a/image.png" alt="">
여기서:
$$v _θ$$는 학습하려는 벡터 필드
$$v_t$$ 는 목표 벡터 필드로, 가우시안 분포에서 데이터 분포로의 이동을 정의
$$x _t$$는 시간 t에서의 중간 상태로, $$x_0$$(실제 데이터)와 $$x_1$$(노이즈) 사이의 보간된 상태</p>
<p>이 접근법은 전통적인 확산 모델보다 더 빠른 샘플링과 더 높은 품질의 생성 결과를 얻을 수 있게 합니다.</p>
<h3 id="4텍스처-합성-모델-hunyuan3d-paint-texture-synthesis-model">4.텍스처 합성 모델: Hunyuan3D-Paint (Texture Synthesis Model)</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9c42a27a-24de-4327-af50-9a3cc3a5650e/image.png" alt="">
Hunyuan3D-Paint는 생성된 3D 메시에 고해상도 텍스처를 합성하는 모델입니다. 이 모델은 기하학적 정보와 확산 모델의 장점을 결합하여 사실적이고 세밀한 텍스처를 생성합니다.</p>
<h4 id="다중-뷰-확산-기술-multi-view-diffusion-technique">다중 뷰 확산 기술 (Multi-view Diffusion Technique)</h4>
<p>Hunyuan3D-Paint는 다중 뷰 확산 기술을 사용하여 3D 모델의 다양한 각도에서 일관된 텍스처를 생성합니다. 이 기술은 여러 각도에서 본 2D 이미지들이 3D 공간에서 일관성을 유지하도록 보장합니다.</p>
<p>다중 뷰 확산의 손실 함수는 다음과 같이 정의될 수 있습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f865e463-63bd-4bc2-a83d-a52667b6188d/image.png" alt="">
여기서:
$$V$$는 다양한 뷰포인트의 집합
$$I_v$$는 뷰포인트 v에서의 이미지
$$E$$는 인코더 함수로, 이미지를 잠재 표현으로 변환
$$D _θ$$는 디코더 함수로, 잠재 표현, 조건 c, 뷰포인트 v를 입력으로 받아 이미지를 재구성</p>
<h4 id="텍스처-일관성-유지">텍스처 일관성 유지</h4>
<p>3D 모델의 텍스처는 모델의 모든 부분에서 일관성을 유지해야 합니다. Hunyuan3D-Paint는 UV 매핑과 확산 모델을 결합하여 이러한 일관성을 보장합니다.</p>
<p>UV 매핑은 3D 모델의 표면을 2D 평면에 펼쳐놓는 방식으로, 다음과 같은 수식으로 표현할 수 있습니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/75d8c011-e764-4314-82f0-814652ba893e/image.png" alt=""></p>
<p>Hunyuan3D-Paint는 이 매핑을 활용하여 2D 텍스처 공간에서 확산 모델을 적용하고, 그 결과를 다시 3D 모델에 매핑합니다. 이 과정에서 텍스처의 일관성과 연속성을 유지하기 위한 추가적인 제약 조건이 적용됩니다.</p>
<h4 id="implementation-details">Implementation Details</h4>
<p>Hunyuan3D 2.0의 구현에 관한 세부 사항을 살펴보겠습니다.</p>
<p>모델 크기와 계산 요구사항</p>
<blockquote>
<p><strong>Hunyuan3D 2.0은 다음과 같은 모델 규모를 가지고 있습니다:</strong></p>
</blockquote>
<ul>
<li>Hunyuan3D-DiT: 약 2.6B 파라미터를 가진 대규모 모델</li>
<li>Hunyuan3D-Paint: 약 1.3B 파라미터의 텍스처 합성 모델</li>
</ul>
<p>경량화 버전(Hunyuan3D-2mini): 5GB VRAM만 필요한 가벼운 버전</p>
<p>표준 버전: 형상 생성에 6GB VRAM, 전체 과정(형상 + 텍스처)에 12GB VRAM 필요</p>
<p>이러한 다양한 크기의 모델 제공으로 사용자의 하드웨어 환경에 맞게 선택할 수 있는 유연성을 제공합니다.</p>
<h4 id="범용-텍스트이미지-텍스처-변환-기능">범용 텍스트/이미지-텍스처 변환 기능</h4>
<p>Hunyuan3D-Paint는 생성된 메시뿐만 아니라 사용자가 제공한 어떤 기하학적 모델에도 텍스트나 이미지 기반 텍스처 적용 가능</p>
<p>ControlNet와 IP-Adapter 같은 고급 텍스트-이미지 변환 모델을 활용</p>
<p>사용자 제공 텍스트/이미지 프롬프트를 기반으로 기하학적 형태에 맞는 입력 이미지 생성</p>
<p>형태와 일치하거나 불일치하는 이미지에 관계없이 임의의 텍스처 적용 가능</p>
<p>&quot;re-skinning&quot;이라 불리는 기능으로 동일한 3D 모델에 다양한 텍스처를 적용하는 응용 가능</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9eb12de5-dd7c-45aa-9c6d-59b6373e5362/image.png" alt=""></p>
<h3 id="5-evaluations">5. Evaluations</h3>
<h4 id="1-3d-형상-생성">1. 3D 형상 생성</h4>
<p>평가 방법:</p>
<ul>
<li><p>형상 복원(Shape Reconstruction)과 형상 생성(Shape Generation) 능력 비교</p>
</li>
<li><p>베이스라인: 3DShape2VecSet, Michelangelo, Direct3D, Craftsman 1.5, Trellis 등</p>
</li>
<li><p>지표: IoU(교집합/합집합), ULIP, Uni3D 기반 유사성 점수</p>
</li>
</ul>
<p>결과:</p>
<ul>
<li><p>Hunyuan3D-ShapeVAE는 중요도 샘플링 전략을 통해 모든 베이스라인 모델을 성능 면에서 능가</p>
</li>
<li><p>Hunyuan3D-DiT는 이미지 프롬프트에 가장 충실한 결과 생성 (인간 얼굴, 표면 세부사항, 로고 텍스트 등)</p>
</li>
<li><p>생성된 메시는 구멍이 없어 후속 텍스처 작업에 견고한 기반 제공</p>
</li>
</ul>
<h4 id="2-텍스처-맵-합성">2. 텍스처 맵 합성</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/17a7d78f-1149-4a7f-abd0-90f34760a3d7/image.png" alt=""></p>
<p>평가 방법:</p>
<ul>
<li><p>텍스트 기반 텍스처 맵 합성 실험 진행</p>
</li>
<li><p>베이스라인: TEXTure, Text2Tex, SyncMVD, Paint3D, TexPainter</p>
</li>
<li><p>지표: FIDCLIP, CMMD, CLIP-score, LPIPS</p>
</li>
</ul>
<p>결과:</p>
<ul>
<li><p>Hunyuan3D-Paint는 최고의 생성 품질과 의미적 정확성 달성</p>
</li>
<li><p>생성된 텍스처 맵은 이음새 없고(seamless) 조명 불변적(lighting-invariant)</p>
</li>
<li><p>같은 메시에 다양한 프롬프트로 각기 다른 고품질 텍스처 적용 가능 (re-skinning 응용)</p>
</li>
</ul>
<h4 id="3-텍스처-적용된-3d-에셋-생성">3. 텍스처 적용된 3D 에셋 생성</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/56a4bd0a-8fdf-4802-9075-77a90a62cc59/image.png" alt=""></p>
<p>평가 방법:</p>
<ul>
<li><p>종단간(end-to-end) 생성 능력 평가</p>
</li>
<li><p>베이스라인: Trellis(오픈소스), Model 1/2/3(비공개)</p>
</li>
<li><p>지표: FIDCLIP, CLIP-score, CMMD, LPIPS</p>
</li>
</ul>
<p>결과:</p>
<ul>
<li><p>Hunyuan3D 2.0은 모든 측정 지표에서 베이스라인 모델들을 능가</p>
</li>
<li><p>이미지 프롬프트의 텍스트 요소도 정확하게 형상 표면의 돌기와 텍스처로 구현</p>
</li>
<li><p>복잡한 동작이나 장면도 고해상도, 고품질로 생성 가능</p>
</li>
</ul>
<p>종합적으로, Hunyuan3D 2.0은 3D 형상 생성, 텍스처 맵 합성, 그리고 이 둘을 결합한 완전한 3D 에셋 생성 모든 영역에서 최첨단 성능을 보여주었습니다. 특히 텍스처의 세부 표현과 프롬프트 조건에 대한 충실도가 우수한 것으로 입증되었습니다.</p>
<h3 id="6-conclusion">6. Conclusion</h3>
<p>Hunyuan3D 2.0은 고해상도 텍스처 3D 에셋 생성을 위한 혁신적인 시스템으로, 확산 모델의 강점을 3D 영역으로 효과적으로 확장했습니다. 이 시스템은 형상 생성과 텍스처 합성을 분리함으로써 각 문제를 더 효율적으로 해결하고, 높은 품질의 3D 에셋을 생성할 수 있게 해줍니다.</p>
<h3 id="글을-마무리-하며">글을 마무리 하며,</h3>
<p>Hunyuan3D 2.0의 형상 생성과 텍스처 합성을 분리한 파이프라인 구조가 효율적이면서도 인상적이었습니다.
또한 DiffFlow(흐름 기반 확산 모델)와 중요도 샘플링 전략을 통한 모델성능 향상 과정이 놀라웠습니다. 더군다나 오픈소스로 공개되어 많은 사람들에게 공개한 점이 대단했고, 이를 활용한 다양한 연구를 진행보면 좋을 것 같습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Distilling the Knowledge in a Neural Network 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Distilling-the-Knowledge-in-a-Neural-Network-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Distilling-the-Knowledge-in-a-Neural-Network-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 11 Mar 2025 13:39:15 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p> 논문: <a href="https://arxiv.org/abs/1503.02531">https://arxiv.org/abs/1503.02531</a></p>
</blockquote>
<h3 id="introduction">Introduction</h3>
<p><strong>논문 개요</strong></p>
<p>신경망 모델의 규모가 기하급수적으로 증가하면서 발생하는 계산 비용과 배포 문제를 해결하기 위해, 2015년 Geoffrey Hinton 연구팀은 혁신적인 모델 경량화 기법인 <strong>Knowledge Distillation(지식 증류)</strong>을 제안했습니다. 
이 기법은 화학적 증류 과정에서 영감을 얻어, 대형 모델(Teacher Network)이 함축한 지식의 본질을 소형 모델(Student Network)에 전달하는 메커니즘을 수학적으로 정립하였습니다.</p>
<p><strong>논문의 핵심 아이디어</strong></p>
<p>이 논문의 핵심 아이디어는 간단합니다. 크고 복잡한 신경망 모델(Teacher 모델)의 지식을 작고 가벼운 신경망 모델(Student 모델)로 효과적으로 전달하는 방법을 제안했습니다. 이를 통해 작은 모델이 큰 모델의 성능에 근접하면서도 계산 비용과 메모리 사용량을 크게 줄일 수 있다는 것이 핵심입니다.</p>
<p><strong>연구 배경 및 필요성</strong></p>
<p>인공지능 모델, 특히 딥러닝 모델은 점점 더 크고 복잡해지고 있습니다. 이러한 대형 모델들은 뛰어난 성능을 보이지만, 실제 환경에 배포하기에는 많은 계산 자원과 메모리를 필요로 합니다. 특히 모바일 기기나 임베디드 시스템과 같은 제한된 환경에서는 이러한 대형 모델을 사용하기 어렵습니다.</p>
<p>또한, 여러 모델을 앙상블(ensemble)하여 사용하면 성능이 향상되지만, 이 역시 계산 비용이 크게 증가한다는 문제가 있습니다. 이러한 배경에서 모델의 성능은 유지하면서 크기와 계산 비용을 줄이는 방법에 대한 연구가 필요했습니다.</p>
<h3 id="2-distillation">2. Distillation</h3>
<p><strong>Distillation</strong>은 잘 학습된 large model 이 주는 결과를 바탕으로 small model 역시 좋은 성능을 내도록 하는 과정이라 설명할 수 있을 것입니다.</p>
<h4 id="21-knowledge-distillation이란">2.1 Knowledge Distillation이란?</h4>
<p>Knowledge Distillation(지식 증류)은 <strong>큰 모델이나 모델 앙상블(Teacher 모델)</strong>에서 학습한 지식을 <strong>작은 모델(Student 모델)</strong>로 전달하는 기계학습 기법입니다. 
이 과정은 마치 교사가 학생에게 지식을 전달하는 것과 유사하여 <strong>Teacher-Student 패러다임</strong>으로 불리기도 합니다.</p>
<p>지식 증류의 목적은 작고 가벼운 모델이 큰 모델의 성능에 최대한 가깝게 도달하도록 하는 것입니다. 이를 통해 실제 배포 환경에서 계산 비용과 메모리 사용량을 줄이면서도 좋은 성능을 유지할 수 있습니다.</p>
<h4 id="teacher-모델과-student-모델">Teacher 모델과 Student 모델</h4>
<ul>
<li><p><strong>Teacher 모델(Cumbersome Model)</strong>: 크고 복잡한 신경망 모델 또는 여러 모델의 앙상블로, 높은 성능을 보이지만 계산 비용이 많이 듭니다.</p>
</li>
<li><p><strong>Student 모델</strong>: 작고 가벼운 신경망 모델로, Teacher 모델의 지식을 전달받아 성능을 향상시키는 것이 목표입니다.</p>
</li>
</ul>
<p>Teacher 모델은 많은 파라미터와 복잡한 구조로 인해 데이터를 잘 학습하고 일반화 능력이 뛰어나지만, 실제 환경에 배포하기에는 무겁습니다. 반면 Student 모델은 가볍고 빠르지만 단독으로는 Teacher 모델만큼의 성능을 내기 어렵습니다. Knowledge Distillation은 이 두 모델 간의 장점을 결합하는 방법입니다.</p>
<h4 id="기존-학습-방식과의-차이점">기존 학습 방식과의 차이점</h4>
<p>기존의 신경망 학습 방식은 주로 원-핫 인코딩(one-hot encoding)된 레이블, 즉 Hard Target을 사용합니다. 이는 정답 클래스에는 1, 나머지 클래스에는 0의 값을 할당하는 방식입니다.</p>
<p>반면 <strong>Knowledge Distillation</strong>에서는 <strong>Teacher 모델</strong>의 출력 확률 분포인 <strong>Soft Target</strong>을 활용합니다. 
이 <strong>Soft Target</strong>은 각 클래스에 대한 확률값을 포함하고 있어, 클래스 간의 유사성과 관계에 대한 풍부한 정보를 담고 있습니다. 예를 들어, &#39;사슴&#39; 이미지를 분류할 때 &#39;말&#39;과의 유사성 정보도 함께 학습할 수 있습니다.</p>
<h4 id="22-knowledge-distillation의-작동-원리">2.2 Knowledge Distillation의 작동 원리</h4>
<p><strong>Soft Target의 개념</strong>
Soft Target은 Teacher 모델이 출력하는 확률 분포로, 각 클래스에 대한 세밀한 확률값을 포함합니다. 이는 단순히 정답/오답의 이진 정보가 아닌, 클래스 간의 유사성과 관계에 대한 풍부한 정보를 담고 있습니다.</p>
<p>예를 들어, 이미지 분류 문제에서 &#39;사슴&#39; 이미지를 분류할 때:</p>
<p>Hard Target: [0, 0, 1, 0, 0, ...] (사슴 클래스만 1, 나머지는 0)</p>
<p>Soft Target: [0.01, 0.39, 0.6, 0, 0, ...] (사슴 60%, 말 39%, 배 1% 등의 확률 분포)</p>
<p>Soft Target은 &#39;사슴&#39;이 &#39;말&#39;과 시각적으로 유사하다는 정보를 담고 있어, Student 모델이 이러한 클래스 간 관계를 학습할 수 있게 합니다.</p>
<h4 id="temperature-매개변수">Temperature 매개변수</h4>
<p><strong>Soft Target</strong>을 생성할 때 중요한 요소는 <strong>T:Temperature(온도)</strong> 매개변수입니다. 이는 <strong>Softmax 함수</strong>에 적용되는 스케일링 파라미터로, 출력 확률 분포의 &#39;부드러움(softness)&#39;을 조절합니다.</p>
<ul>
<li>기존의 <strong>Softmax 함수</strong>는 다음과 같습니다:</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/7e6247a8-eb38-4dbe-a398-a7b384ec40cd/image.png" alt=""></p>
<ul>
<li>Temperature(T)를 적용한 <strong>Softmax 함수</strong>는 다음과 같이 변형됩니다:</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/4d1ae2dc-b5e0-40a8-bd7d-d92d92d755db/image.png" alt="">
각 클래스별 확률값은 $$q_i$$, logit은 $$z_i$$로 표현됩니다.</p>
<h4 id="temperature-값의-영향">Temperature 값의 영향:</h4>
<ul>
<li><p>T = 1: 일반적인 소프트맥스 함수와 동일</p>
</li>
<li><p>T &gt; 1: 출력 확률 분포가 더 부드러워지며, 낮은 확률값들도 상대적으로 높아짐</p>
</li>
<li><p>T &lt; 1: 출력 확률 분포가 더 뾰족해지며, 가장 높은 확률값이 더욱 강조됨</p>
</li>
</ul>
<p>높은 Temperature를 사용하면 클래스 간의 유사성 정보가 더 잘 보존되어 Student 모델이 이를 학습할 수 있습니다. 논문에서는 학습 과정에서 높은 Temperature를 사용하고, 추론 과정에서는 T=1로 설정하는 방식을 제안했습니다.</p>
<h3 id="matching-logits-is-a-special-case-of-distillation">Matching logits is a special case of distillation</h3>
<p>Temperature을 어떻게 설정하는 것이 좋을까에 대한 고민을 특별한 케이스를 가지고 설명합니다.
작은 모델의 logit $$z_i$$의 변화에 따른 cross enropy의 변화 즉 gradient는 아래와 같이 표현되며, 이 때 큰 모델의 logit은 $$v_i$$로, 큰 모델에서 생성된 target 확률을 $$p_i$$로 표현합니다.
Cross entropy 식을 distilled model에서 나오는 logit ($$z_i$$) 으로 미분하면 식은 다음과 같다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/8fa74de3-792d-41c8-8084-651eba2e0387/image.png" alt=""></p>
<p>이때 temperature T가 logit 값보다 더 크다면, 지수가 0에 가까워지고 exp 함수의 특성상 1에 가까워진다. 따라서 다음과 같은 근사가 가능해진다고 합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/74c80087-83a1-48dd-9e4b-7a4470286026/image.png" alt="">
이 때 지식 증류가 잘 일어났다면 logit $$z$$와 logit $$v$$의 평균이 0이 될 것이기 때문에 최종적으로 아래와 같은 식을 얻을 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e8e21ca4-0045-4702-a637-b0831d0453d3/image.png" alt=""></p>
<h4 id="23-distillation-loss">2.3 Distillation Loss</h4>
<p>Knowledge Distillation에서는 두 가지 손실 함수(Loss Function)를 조합하여 사용합니다:</p>
<p>Distillation Loss: Teacher 모델의 Soft Target과 Student 모델의 출력 간의 차이를 측정합니다. 주로 KL Divergence(Kullback-Leibler Divergence)를 사용합니다
여기서 $$z_t$$는 Teacher 모델의 logit, $$z_s$$는 Student 모델의 logit입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/5f01bee0-2293-4372-8abf-b43ee1fb8225/image.png" alt=""></p>
<p>Student Loss: 원래의 Hard Target과 Student 모델의 출력 간의 차이를 측정합니다. 주로 Cross Entropy를 사용합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/7b45d379-a10f-45c7-b885-bdf901cc77af/image.png" alt="">
최종 손실 함수는 이 두 손실의 가중 합으로 정의됩니다:</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/e688b225-e686-4bfc-8298-9d135da85758/image.png" alt="">
여기서 α는 두 손실 간의 균형을 조절하는 하이퍼파라미터입니다. 이를 통해 Student 모델은 원래의 학습 목표(Hard Target)와 Teacher 모델의 지식(Soft Target)을 동시에 학습할 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/2fac4e69-034b-467b-839a-55247782d054/image.png" alt=""></p>
<blockquote>
<p>출처: <a href="https://www.youtube.com/watch?v=pgfsxe8sROQ&amp;t=460s">https://www.youtube.com/watch?v=pgfsxe8sROQ&amp;t=460s</a></p>
</blockquote>
<h4 id="24-knowledge-distillation의-장점">2.4 Knowledge Distillation의 장점</h4>
<h4 id="모델-경량화와-효율성">모델 경량화와 효율성</h4>
<p>Knowledge Distillation의 가장 큰 장점은 모델 경량화와 효율성 향상입니다. 큰 모델이나 앙상블 모델의 성능을 작은 모델로 압축함으로써, 다음과 같은 이점을 얻을 수 있습니다:</p>
<ol>
<li><p>계산 비용 감소: 작은 모델은 추론 시 필요한 연산량이 적어 더 빠르게 동작합니다.</p>
</li>
<li><p>메모리 사용량 감소: 파라미터 수가 적어 메모리 요구량이 줄어듭니다.</p>
</li>
<li><p>배포 용이성: 모바일 기기나 임베디드 시스템과 같은 제한된 환경에서도 사용할 수 있습니다.</p>
</li>
</ol>
<p>IBM의 자료에 따르면, Knowledge Distillation을 통해 모델 크기를 &quot;천 배 작고 빠르게&quot; 만들면서도 앙상블 모델의 성능을 유지할 수 있다고 합니다.</p>
<h4 id="일반화-성능-향상">일반화 성능 향상</h4>
<p>Knowledge Distillation은 단순히 모델 크기를 줄이는 것을 넘어, Student 모델의 일반화 성능을 향상시키는 효과도 있습니다:</p>
<ol>
<li><p>Regularization 효과: Soft Target은 Hard Target보다 더 많은 정보를 담고 있어, 모델이 과적합(overfitting)되는 것을 방지합니다.</p>
</li>
<li><p>클래스 간 관계 학습: 클래스 간의 유사성 정보를 학습함으로써, 보다 풍부한 특징 표현(feature representation)을 얻을 수 있습니다.</p>
</li>
<li><p>데이터 효율성: 논문의 실험 결과에 따르면, Soft Target을 사용할 경우 전체 데이터의 3%만으로도 전체 데이터를 Hard Target으로 학습한 경우와 비슷한 성능을 얻을 수 있었습니다.</p>
</li>
</ol>
<h4 id="앙상블-효과-모방">앙상블 효과 모방</h4>
<p>여러 모델을 앙상블하면 일반적으로 단일 모델보다 더 좋은 성능을 얻을 수 있지만, 계산 비용이 크게 증가한다는 단점이 있습니다. Knowledge Distillation은 앙상블 모델의 지식을 단일 모델로 전달함으로써, 앙상블의 이점을 유지하면서도 계산 비용을 줄일 수 있습니다.</p>
<p>논문에서는 Dropout을 사용한 큰 모델을 여러 모델의 앙상블과 유사하다고 보고, 이러한 모델의 지식을 작은 모델로 전달하는 방법을 제안했습니다.</p>
<h4 id="단계를-정리하자면">단계를 정리하자면</h4>
<p>1) Teacher Network : training set(x, hard label)을 사용해 large model 학습</p>
<p>2) large model 학습 뒤, large model의 output(soft label)을 target으로 하는 transfer set(x, soft label)을 생성. 이 때 soft label의 T는 1이 아닌 높은 값 사용.</p>
<p>3) Student Network </p>
<p>transfer set을 사용해 small model 학습. T는 soft label을 생성할 때와 같은 값 사용. -&gt; soft predictions</p>
<p>transfer set을 사용해 small model 학습. T는 1로 고정. -&gt; hard predictions</p>
<p>4) loss 생성</p>
<p>distillation loss : soft label과 soft predictions의 차이를 Kullback-Leiber Divergence를 통해 구함.</p>
<p>student loss : hard predictions과 hard label을 Cross-entropy를 통해 구함.</p>
<h3 id="3-preliminary-experiments-on-mnist--results">3. Preliminary experiments on MNIST &amp; Results</h3>
<h4 id="mnist-데이터셋-실험">MNIST 데이터셋 실험</h4>
<p>논문에서는 먼저 MNIST 손글씨 숫자 데이터셋을 사용하여 Knowledge Distillation의 효과를 검증했습니다. 이 실험에서는 다음과 같은 결과를 얻었습니다:</p>
<p>일반적인 학습: 모든 클래스(0-9)에 대해 학습한 모델은 높은 정확도를 보였습니다.</p>
<p>클래스 제외 실험: 특정 클래스(숫자 3)를 제외하고 학습한 후, Soft Target을 사용하여 Knowledge Distillation을 적용했을 때, 제외된 클래스에 대해서도 98.6%의 높은 정확도를 달성했습니다.</p>
<p>이는 Soft Target이 클래스 간의 유사성 정보를 담고 있어, 직접적으로 학습하지 않은 클래스에 대해서도 간접적인 학습 효과가 있음을 보여줍니다. 예를 들어, 숫자 5가 숫자 3과 시각적으로 유사하다면, 5에 대한 학습을 통해 3에 대한 정보도 일부 학습할 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/ef4210f5-aac0-4c22-8995-c96445bd3920/image.png" alt=""></p>
<h4 id="jft-데이터셋-실험">JFT 데이터셋 실험</h4>
<p>논문에서는 더 큰 규모의 JFT 데이터셋과 실제 상용 시스템에 대한 실험도 진행했습니다:</p>
<p>Hard Target 학습: 전체 데이터로 학습했을 때 테스트 정확도는 58.9%, 3%의 데이터로 학습했을 때는 44.5%였습니다(Early stopping을 사용했음에도 과적합 발생).</p>
<ul>
<li>Hard Target: 일반적으로 원-핫 인코딩(one-hot encoding)된 레이블로, 정답 클래스에는 1, 나머지 클래스에는 0의 값을 할당합니다.</li>
<li>예시: 3개의 클래스가 있는 분류 문제에서 Hard Target은 [0, 0, 1]과 같이 나타낼 수 있습니다.</li>
</ul>
<p>Soft Target 학습: 3%의 데이터만으로 학습했을 때 테스트 정확도는 57%에 달했습니다(Early stopping 사용 안 함).</p>
<ul>
<li>Soft Target: 교사 모델의 출력 확률 분포로, 각 클래스에 대한 확률값을 포함합니다.</li>
<li>예시: 3개의 클래스가 있는 분류 문제에서 Soft Target은 [0.2, 0.3, 0.5]과 같이 나타낼 수 있습니다.</li>
</ul>
<blockquote>
<p>** Early Stopping**은 기계 학습에서 과적합(overfitting)을 방지하기 위해 사용되는 정규화 기법입니다. 이는 모델의 성능이 검증 데이터셋에서 더 이상 개선되지 않을 때 학습을 중단하는 방식으로 작동합니다. Early Stopping은 다양한 기계 학습 알고리즘에서 사용되며, 특히 반복적인 최적화 방법(예: 경사 하강법)에서 유용합니다.</p>
</blockquote>
<p>이 결과는 Soft Target을 사용한 Knowledge Distillation이 데이터 효율성 측면에서도 큰 이점이 있음을 보여줍니다. 전체 데이터의 일부만으로도 전체 데이터를 사용한 일반적인 학습과 비슷한 성능을 얻을 수 있었습니다.</p>
<h4 id="음향-모델-실험">음향 모델 실험</h4>
<p>논문에서는 실제 상용 음성 인식 시스템의 음향 모델에 Knowledge Distillation을 적용한 실험도 진행했습니다. 이 실험에서는 앙상블 모델의 지식을 단일 모델로 전달함으로써, 음향 모델의 성능을 크게 향상시킬 수 있었습니다.</p>
<p>이러한 실험 결과들은 Knowledge Distillation이 다양한 도메인과 데이터셋에서 효과적으로 작동함을 보여줍니다.</p>
<h3 id="4-specialist-모델-활용">4. Specialist 모델 활용</h3>
<p>Specialist 모델의 학습 및 활용 과정은 다음과 같습니다:</p>
<ul>
<li><p><strong>클래스 그룹화</strong>: 혼동되기 쉬운 클래스들을 그룹화합니다. 논문에서는 Generalist 모델의 혼동 행렬(confusion matrix)을 분석하여 유사한 클래스들을 식별했습니다.</p>
</li>
<li><p><strong>Specialist 모델 학습</strong>: 각 클래스 그룹에 대해 특화된 Specialist 모델을 학습합니다. 이때 해당 그룹의 클래스들과 함께 무작위로 선택된 다른 클래스들도 포함하여 학습합니다.</p>
</li>
<li><p><strong>Knowledge Distillation 적용</strong>: Specialist 모델 학습 시에도 Knowledge Distillation을 적용하여 Generalist 모델의 지식을 전달받습니다.</p>
</li>
<li><p><strong>앙상블 예측</strong>: 추론 시에는 Generalist 모델이 먼저 예측을 수행하고, 특정 클래스 그룹에 속할 가능성이 높은 경우 해당 Specialist 모델의 예측을 함께 고려합니다.</p>
</li>
</ul>
<p>이러한 접근 방식은 모든 클래스를 한 모델에서 처리하는 것보다 효율적이며, 특히 클래스 수가 많은 대규모 분류 문제에서 유용합니다.</p>
<h4 id="specialist-모델의-장점">Specialist 모델의 장점</h4>
<p>Specialist 모델 접근 방식의 주요 장점은 다음과 같습니다:</p>
<ul>
<li><p><strong>분류 정확도 향상</strong>: 유사한 클래스들을 구분하는 데 특화된 모델을 사용함으로써, 혼동되기 쉬운 클래스들 간의 분류 정확도를 향상시킬 수 있습니다.</p>
</li>
<li><p><strong>계산 효율성</strong>: 모든 입력에 대해 모든 Specialist 모델을 실행할 필요가 없으므로, 전체적인 계산 비용을 줄일 수 있습니다.</p>
</li>
<li><p><strong>모듈화 및 확장성</strong>: 새로운 클래스가 추가될 때 전체 시스템을 재학습할 필요 없이, 해당 클래스에 대한 Specialist 모델만 추가할 수 있습니다.</p>
</li>
</ul>
<p>논문의 실험 결과에 따르면, Specialist 모델을 활용한 앙상블 접근 방식은 단일 Generalist 모델보다 더 높은 성능을 보였으며, 특히 혼동되기 쉬운 클래스들에 대한 분류 정확도가 크게 향상되었습니다.</p>
<h3 id="더-나아가">더 나아가</h3>
<h4 id="kd에-대해-더-찾아보다가-bert에-knowledge-distillation의-응용-예시가-있어-간단하게-적어보자-합니다">KD에 대해 더 찾아보다가 BERT에 Knowledge Distillation의 응용 예시가 있어 간단하게 적어보자 합니다.</h4>
<h3 id="bert-→-distilbert-언어-모델-경량화">BERT → DistilBERT (언어 모델 경량화)</h3>
<blockquote>
<p>paper: <a href="https://arxiv.org/abs/1910.01108">https://arxiv.org/abs/1910.01108</a></p>
</blockquote>
<h4 id="배경-및-필요성">배경 및 필요성</h4>
<p><a href="https://velog.io/@holiday_donghun/BERT-Pre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">BERT</a>(Bidirectional Encoder Representations from Transformers)는 이전에 리뷰한 것 처럼 NLP 분야에서 획기적인 성능을 보인 Transformer 기반의 사전 훈련된(pre-trained) 언어 모델입니다. 하지만 BERT는 매우 많은 파라미터(약 110M~340M)를 가지고 있어, 실제 배포 환경에서 높은 계산 비용과 긴 추론 시간을 요구합니다.</p>
<h4 id="distilbert의-등장">DistilBERT의 등장</h4>
<p>DistilBERT는Knowledge Distillation 기반의 경량화된 BERT 모델로, 원본 BERT-base 모델의 약 40%에 해당하는 파라미터만 사용하면서도 원본 성능의 약 97%를 유지합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/63ccabe5-3a24-4050-bb87-5c65ca23efe2/image.png" alt=""></p>
<h4 id="distilbert의-학습-방법">DistilBERT의 학습 방법</h4>
<p>교사(Teacher): 원본 BERT-base (110M 파라미터)</p>
<p>학생(Student) 모델: 크기가 작은 Transformer 구조</p>
<p>손실 함수: 세 가지 손실을 결합하여 사용</p>
<ul>
<li><p><strong>Distillation Loss</strong>: Teacher와 Student의 출력 확률(logits) 간 KL Divergence(Kullback-Leibler Divergence, 쿨백-라이블러 발산)를 최소화</p>
</li>
<li><p><strong>Masked Language Modeling Loss</strong>: 언어 모델링 손실</p>
</li>
<li><p><strong>Cosine Embedding Loss</strong>: Teacher와 Student의 은닉 상태(hidden states)가 유사하도록 유도</p>
</li>
</ul>
<h4 id="결과">결과</h4>
<p>DistilBERT는 원본 BERT-base 모델 대비 다음과 같은 성능 향상을 이루었습니다:</p>
<p>파라미터 수: 약 40% 감소</p>
<p>추론 속도: 약 60% 향상</p>
<p>정확도: GLUE 벤치마크 기준으로 원본 BERT-base 대비 약 97% 수준 유지
<img src="https://velog.velcdn.com/images/holiday_donghun/post/d11ffa2d-d04f-4137-b393-0a4301f243d2/image.png" alt="">
이러한 결과를 통해 <strong>Knowledge Distillation</strong>이 <strong>BERT분야(NLP분야)</strong>에서도 뛰어난 경량화 성능을 제공한다는 것을 잘 보여줍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AudioBERT: Audio Knowledge Augmented Language Model 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/EDT-An-Efficient-Diffusion-Transformer-Framework-Inspired-by-Human-like-Sketching-%EB%85%BC%EB%AC%B8-%EB%A6%AC</link>
            <guid>https://velog.io/@holiday_donghun/EDT-An-Efficient-Diffusion-Transformer-Framework-Inspired-by-Human-like-Sketching-%EB%85%BC%EB%AC%B8-%EB%A6%AC</guid>
            <pubDate>Wed, 05 Feb 2025 14:17:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/pdf/2409.08199">https://arxiv.org/pdf/2409.08199</a></p>
</blockquote>
<p>최근 관심이 생긴 교수님의 연구실에서 발표된 논문을 리뷰해보고자 합니다. 오디오 데이터 분야는 아직 많이 부족하지만 내가 지금까지 배웠던 지식과 이전에 리뷰하였던 <a href="https://velog.io/@holiday_donghun/BERT-Pre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">BERT</a>, 그리고 이 논문을 통해 새롭게 배운 지식들을 바탕으로 논문을 정리해보고자 합니다.</p>
<h3 id="abstract">Abstract</h3>
<p><strong>AudioBERT</strong>는 텍스트와 오디오 데이터를 결합하여 언어 이해 및 생성 능력을 향상시키는 새로운 언어 모델입니다. 기존의 언어 모델은 텍스트 데이터만을 학습하여 음성적 맥락이나 음향적 정보를 놓치는 한계를 가지고 있었습니다. 이를 해결하기 위해 <strong>AudioBERT</strong>는 텍스트와 오디오 쌍 데이터를 학습하여 언어의 Linguistic(언어적) 및 Acoustic(음향적) 특성을 모두 포괄하는 표현을 학습합니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<h4 id="연구-배경">연구 배경</h4>
<p>최근 연구에 따르면, <strong>Text 전용 데이터셋</strong>으로 <strong>pretrained language model</strong>은 <strong>시각적 정보</strong>뿐만 아니라 <strong>음향적 정보도 부족</strong>하다는 한계가 밝혀졌습니다. 
예를 들어, 일상적인 소리(동물 울음소리, 음조 등)에 대한 이해가 제한적입니다. 이러한 문제를 해결하기 위해 <strong>AudioBERT</strong>는 <a href="https://velog.io/@holiday_donghun/BERT-Pre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">BERT</a> 기반의 언어 모델에 오디오 지식을 주입하여 Text와 Audio 간의 상호작용을 학습하도록 설계되었습니다.</p>
<h4 id="audiobert의-주요-목표">AudioBERT의 주요 목표</h4>
<blockquote>
<ul>
<li><strong>Text와 Audio 데이터</strong>를 결합하여 멀티모달 표현 학습.</li>
</ul>
</blockquote>
<ul>
<li>기존 text-only(텍스트 전용) 모델 대비 <strong>멀티모달 작업에서 성능 개선</strong>.</li>
<li><strong>AuditoryBench</strong>라는 <strong>새로운 벤치마크</strong>를 통해 음향 지식 평가.</li>
</ul>
<h3 id="2-method">2. Method</h3>
<h4 id="auditorybench">AuditoryBench</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/7455e05a-c292-4fe2-875c-a5daddd39d82/image.png" alt=""></p>
<p><strong>AuditoryBench</strong>는 <strong>AudioBERT의 성능 평가</strong>를 위해 개발된 데이터셋으로, 두 가지 주요 과제를 포함합니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/2a7ae077-643b-4ddf-bc9f-06dce818763a/image.png" alt=""></p>
<ol>
<li><strong>Animal Sound Recognition(동물 소리 인식)</strong>: 언어 모델이 특정 의성어(예: “meow”)에 해당하는 소리를 낼 가능성이 있는 동물을 예측하여 동물을 예측.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/8cba5d22-cf41-475d-8300-299b7415ea8d/image.png" alt=""></li>
</ol>
<ol start="2">
<li><strong>Sound Pitch Comparison(음조 비교)</strong>: 언어 모델이 어떤 소리 출처(예: 악기, 물체, 환경)가 더 높은 음높이의 소리를 낼 가능성이 있는
지 예측.</li>
</ol>
<p><strong>벤치마크 구축 및 결과</strong>
• 벤치마크 데이터셋의 확장성을 위해 LLM 기반 데이터 처리 파이프라인을 제안함.
• BERT, Gemma, LLaMA 세 가지 언어 모델을 테스트한 결과, 모든 모델이 두 벤치마크 작업에서 낮은 예측 정확도를 보임.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/253aa020-0dd3-40be-805c-4bf1ba092185/image.png" alt="">
    BERT 모델이 “meow”를 듣고, 마스킹된 단어에 대해 예측한 확률 분포
    =&gt; 놀랍게도 &#39;강아지&#39;가 가장 높은 확률을 보였다.</p>
<h4 id="audiobert의-접근방식">AudioBERT의 접근방식</h4>
<ol>
<li><strong>청각적 지식</strong>이 필요한 <strong>text span</strong>을 감지합니다.<ol start="2">
<li>필요할 때마다 감지된 text span을 <strong>CLAP에 쿼리하여 관련 오디오를 검색</strong>합니다. <strong>CLAP</strong>는 <strong>텍스트-오디오 유사성을 측정</strong>하는 모델입니다.</li>
<li>검색된 <strong>오디오 샘플의 임베딩</strong>을 <strong>언어 모델</strong>에 주입합니다.</li>
<li><strong>감지기가 청각적 span을 식별</strong>하면 언어 모델은 <a href="https://velog.io/@holiday_donghun/LoRA-Low-Rank-Adaptation-of-Large-Language-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Low-Rank Adaptation (LoRA)</a> <strong>가중치를 활성화</strong>합니다. 이 가중치는 AudiotoryBench로 미세 조정되어 있습니다.</li>
<li>이 방식은 모델의 사전 학습된 지식을 유지하며, 다른 작업에서도 모델이 잘 수행할 수 있게 합니다.</li>
</ol>
</li>
</ol>
<h4 id="audiobench와-audiobert를-다시-한-번-정리해보겠습니다">AudioBench와 AudioBERT를 다시 한 번 정리해보겠습니다.</h4>
<p><strong>A. AuditoryBench</strong>
: <strong>AuditoryBench</strong>는 언어 모델의 청각적 지식을 평가하기 위한 최초의 benchmark 데이터셋입니다.</p>
<ul>
<li><p>LAION-Audio-630K 데이터셋을 기반으로 구축</p>
</li>
<li><p><strong>LLM을 활용한 데이터 처리 파이프라인</strong> 사용</p>
</li>
<li><p>두 가지 주요 작업으로 구성:
  <strong>1. 동물 소리 인식</strong>: 의성어를 듣고 해당 동물 예측
  <strong>2. 소리 음높이 비교</strong>: 두 소리 출처의 음높이 비교</p>
</li>
<li><p>** 데이터셋 구성:**
• <strong>훈련/개발/테스트</strong> 세트로 <strong>70%/10%/20%</strong> 분할
• Wikipedia에서 추가 테스트 데이터 수집</p>
</li>
<li><p><strong>데이터 품질 보장</strong>을 위한 조치:
• pitch(음높이) 차이가 10% 이상인 쌍만 선택
• LLM이 높은 pitch를 정확히 분류할 수 있는 데이터만 포함
• Wikipedia에서 악기의 pitch 범위를 수집하여 테스트 세트로 사용</p>
</li>
</ul>
<p><strong>B. AudioBERT</strong>
: <strong>AudioBERT</strong>는 <strong>언어 모델에 청각적 지식을 주입</strong>하기 위한 <strong>검색-기반 ** framework입니다. 
**1. 청각적 지식 span 감지기:</strong>
 • Text에서 청각 관련 span 추출
• <a href="https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Transformer</a> Encoder 기반, 교차 엔트로피 손실 사용
<strong>2. CLAP (Contrastive Language-Audio Pretraining):</strong>
 • <strong>Audio-Text 유사도 측정</strong> 모델
• 대조 학습 방식으로 훈련 <strong>( cos ( · , · ) 이용해 비교)</strong>
<img src="https://velog.velcdn.com/images/holiday_donghun/post/05f9fb56-fe91-4767-8b62-1fc7a794034c/image.png" alt="">
여기서 $$A_k$$와 $$T_k$$는 각각 <strong>Audio 임베딩</strong>과 <strong>Text 임베딩</strong>을 나타내며, <strong>cos( · , · )</strong>는 <strong>코사인 유사도</strong>를 의미하고, $$τ$$는 <strong>온도 파라미터</strong>입니다.</p>
<p><strong>3. AudioBERT Framework</strong>:</p>
<p>• 청각 지식 스팬 감지 → CLAP으로 관련 오디오 검색 → 오디오 임베딩 생성 → 언어 모델에 주입
• LoRA를 활용한 동적 적용:** 청각 지식 필요** 시 <strong>LoRA</strong> 가중치 활성화
• 마스크 언어 모델링 손실 사용</p>
<ul>
<li>성능:
• AuditoryBench 테스트 세트에서 40% 이상의 정확도 향상
• 기존 언어 모델(BERT, RoBERTa, Gemma2-2B, LLaMA3.1-8B)보다 우수한 성능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/f6e2782c-947b-410d-a0e3-f437249bd5be/image.png" alt=""></p>
<h3 id="3-experiment">3. Experiment</h3>
<p>평가 지표
• <strong>정확도(accuracy)</strong>와** F1 score**  사용
• 높은 점수일수록 더 나은 성능 의미</p>
<hr>
<h4 id="f1-score">F1 score</h4>
<p><strong>F1 score</strong>는 머신러닝 모델의 성능을 평가하는 데 사용되는 중요한 지표 중 하나로, <strong>정밀도(Precision)</strong>와 <strong>재현율(Recall)</strong>의 조화 평균을 계산하여 모델의 정확성과 감지 능력을 균형 있게 평가합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e4da19e8-dd50-44d6-9cf3-7c42f1711eca/image.png" alt=""></p>
<p> • <strong>정밀도(precision)</strong> =$$TP / (TP + FP)$$
 • <strong>재현율(recall)</strong> = $$TP / (TP + FN)$$
 • $$TP$$: 참 양성, $$FP$$: 거짓 양성, $$FN$$: 거짓 음성
<strong>$$TP$$ (참 양성, True Positive)</strong>
 • 모델이 양성으로 예측했고, 실제로도 양성인 경우
• 예: 고양이 소리를 고양이로 정확히 분류한 경우
<strong>$$FP$$ (거짓 양성, False Positive)</strong>
 • 모델이 양성으로 예측했지만, 실제로는 음성인 경우
• 예: 개 소리를 고양이로 잘못 분류한 경우
<strong>$$FN$$ (거짓 음성, False Negative)</strong>
 • 모델이 음성으로 예측했지만, 실제로는 양성인 경우
• 예: 고양이 소리를 다른 동물로 잘못 분류한 경우</p>
<p><a href="https://ai-com.tistory.com/entry/ML-%EB%B6%84%EB%A5%98-%EC%84%B1%EB%8A%A5-%EC%A7%80%ED%91%9C-Precision%EC%A0%95%EB%B0%80%EB%8F%84-Recall%EC%9E%AC%ED%98%84%EC%9C%A8">F1 score 관련 글</a></p>
<hr>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9b7e5f19-367b-44fd-a70c-f84bddc82ed6/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/632d31b5-b501-4071-bfdc-9acccab658e5/image.png" alt=""></p>
<ul>
<li><p><strong>Auditory knowledge span detector</strong>(청각적 지식 범위 탐지기)로 BERT-base 모델을 사용. 이 모델은 다음과 같은 설정으로 학습:</p>
</li>
<li><p><em>에폭 수: 5
배치 크기: 16
학습률: $$1×10^−5$$
Optimizer: AdamW*</em></p>
</li>
<li><p><strong>AudioBERT의 훈련</strong>에서는 언어 모델로 BERT를 사용하고, 청각적 지식 임베딩 삽입을 위해 AST 인코더를 실험. AudioBERT의 학습 설정:</p>
</li>
<li><p><em>에폭 수: 20
배치 크기: 32
학습률: $$3×10^−4$$
Optimizer: AdamW*</em></p>
</li>
</ul>
<ul>
<li><a href="https://rla020.tistory.com/41">Adam포함 AdamW 관련 정리글</a></li>
</ul>
<h3 id="4-results">4. Results</h3>
<p><strong>Auditory knowledge span detector(청각적 지식 스팬 감지기)</strong></p>
<ul>
<li>단일 데이터로 훈련 시 성능이 좋지 않을 수 있음</li>
<li>결합 데이터셋 사용 시 소리 음높이 비교에서 성능 향상</li>
</ul>
<p><strong>AudioBERT</strong></p>
<ul>
<li>기존 언어 모델(BERT, RoBERTa, Gemma2-2B, LLaMA3.1-8B)과 비교</li>
<li>기존 모델들은 청각적 지식 부족 보임</li>
<li>AudioBERT는 경쟁력 있는 성능 보여 청각적 지식 증강 효과 입증</li>
</ul>
<p><strong>Data quality assessment(데이터 품질 평가)</strong></p>
<ul>
<li>AuditoryBench 구축 시 데이터 필터링 과정:
• 동물 소리 인식: 인간 주석자가 부적절한 레이블 제거
• 소리 음높이 비교: 각 오디오 샘플 음높이 측정, 올바르게 레이블된 것만 유지</li>
<li>위키피디아 정보로 테스트 세트 보강하여 일반화 및 견고성 측정</li>
<li>인간 평가 실시:
• 3명의 평가자가 정확성(100점 만점)과 유창성(3점 만점) 평가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/3763a84f-0d21-4d0a-b135-6017bfe2b4dc/image.png" alt="">
위의 표와 같이 <strong>Animal sound recognition(동물 소리 인식), Sound pitch comparison(소리 음높이 비교)</strong>에서 모두 <strong>준수한 성능</strong></p>
<h3 id="마지막으로">마지막으로</h3>
<p><strong>AudioBERT</strong>의 음향적 정보의 중요성을 강조하면서 Text와 Audio 데이터를 결합하여 학습하는 접근 방식이 흥미로웠다. 이를 바탕으로 Audio분야뿐만 아니라 LLM 혹은 Image-to-Text 분야 등에서도 이러한 접근 방식을 적용하여 멀티모달 작업에 응용, 공부해볼 예정이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DiT : Scalable Diffusion Models with Transformers 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/DiT-Scalable-Diffusion-Models-with-Transformers-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/DiT-Scalable-Diffusion-Models-with-Transformers-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Wed, 05 Feb 2025 14:08:23 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/abs/2212.09748">https://arxiv.org/abs/2212.09748</a>
github: <a href="https://www.wpeebles.com/DiT">https://www.wpeebles.com/DiT</a></p>
</blockquote>
<p>이번에 <strong>OminiControl</strong>이라는 새로운 Image-to-Image, Text-to-Image 논문을 바탕으로 효율을 발전시키는 연구를 준비중이다. OminiControl를 공부하기에 앞서 <strong>DiT</strong> model이라는 개념을 숙지하는 것이 중요하여 DiT 논문을 리뷰하고자한다.</p>
<p><strong>DiT: Scalable Diffusion Models with Transformers</strong>는 제목에서 알 수 있다시피 Transformer architecture에 Diffusion을 접목하는 새로운 개념이다. </p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>DiT(Diffusion Transformer)</strong>는 기존의 <strong>diffusion model</strong>에서 주로 사용되던 <strong>U-Net backbone</strong>을 <strong><a href="https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Transformer</a>로 대체</strong>한 새로운 접근법을 제시합니다. 
이 논문은 <strong>Latent Diffusion Model(LDM)</strong> 프레임워크를 기반으로 하며, Transformer 아키텍처의 확장성(scalability)과 성능 향상 가능성을 탐구합니다. 특히, 네트워크 복잡도(계산량, GFlops)와 샘플 품질(FID: Fréchet Inception Distance) 간의 상관관계를 분석하여, <strong>계산량을 증가시킬수록 성능이 개선된다</strong>는 점을 확인했습니다.
기존 <strong>U-Net</strong> 기반 모델의 <strong>inductive bias</strong>가 필수적이지 않음을 보이며, <strong>Transformer</strong>를 활용하여 더 간단하면서도 강력한 구조를 설계할 수 있음을 입증했습니다. 
실제로 DiT는 ImageNet (256×256 및 512×512 클래스) 조건 생성 작업에서 SOTA성능을 달성했습니다고 합니다.</p>
<h3 id="2-diffusion-transformers">2. Diffusion Transformers</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/00a50897-9710-4d87-af93-083feffa11de/image.png" alt=""></p>
<h4 id="patchify">Patchify</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/6e5dc577-82d9-44f0-b2a5-c01a359daafc/image.png" alt=""></p>
<p><strong>Patchify</strong>는 <a href="https://velog.io/@holiday_donghun/ViT-AN-IMAGE-IS-WORTH-16X16-WORDSTRANSFORMERS-FOR-IMAGE-RECOGNITION-AT-SCALE-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Vision Transformer (ViT)</a>에서 나오는 개념인데, 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/30b61382-2a43-474d-b04f-092bd3116105/image.png" alt="">
위의 그림과 같이 sine-cosine 값의 positional embeddings를 모든 입력 토큰에 적용시키면 $$T=(1/P)^2$$로 T는 p에 의해 결정된니다.
(여기서 p는 패치 사이즈). 
그리고 위 그림처럼 패치 사이즈 p를 절반으로 줄이면 T는 4배 커져 최종적으로 Gflops 또한 4배 커지게 됩니다. 하지만 전체 파라미터 수에는 큰 영향을 끼치지 않는다고 합니다.</p>
<h4 id="dit-block-design">DiT block design</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/66377fc4-eabd-49ad-ac93-942ad9b0e389/image.png" alt=""></p>
<p>Diffusion 모델은 latent 외에도 noise timestep $$t$$, class label $$c$$, text embedding 등을 입력으로 받게된다. 이를 활용하여 조건부 정보를 처리하기 위해 다양한 입력을 받는 <strong>DiT block을 총 4가지 설계</strong>하였습니다.</p>
<ul>
<li><strong>In-context conditioning</strong>: 벡터 임베딩 t와 c를 두 개의 추가적인 토큰으로 입력 시퀀스에 추가하여 이미지 토큰과 다르지 않도록 하였습니다. 이를 통해 ViT block을 사용할 수 있습니다. 마지막 block 후에는 입력 시퀀스로부터 conditioning 토큰을 제거하였습니다. 이를 통해 <strong>모델에 무시할만한 대한 새로운 Gflops</strong>를 도입합니다.</li>
<li><strong>Cross-attention block</strong>: t와 c 임베딩을 이미지 토큰 시퀀스와 별도로 길이가 2인 시퀀스로 concat하였습니다. Transformer block은 multi-head self-attention block에 이어 추가적으로 multi-head cross-attention을 포함하도록 수정하는데, 이는 class label에 대한 컨디셔닝을 위해 LDM에서 사용하는 것과 유사합니다. Cross-attention은 모델에 가장 많은 Gflops를 추가하게 되며, 거의 15%의 오버헤드를 갖습니다.</li>
<li><strong>Adaptive layer norm (adaLN) block</strong>: GAN이나 U-Net을 사용하는 diffusion 모델들에서 폭넓게 사용되는 adaptive normalization layer를 기존 Transformer의 layer norm 대신에 넣어 실험하였습니다. 이를 통해 얻은 block <strong>adaLN block</strong>은 최소한의 Gflops를 추가하였으며 가장 계산 효율적이었다고 합니다. 또한, <strong>모든 토큰에 동일한 기능을 적용하도록 제한되는 유일한 컨디셔닝 메커니즘</strong>입니다.</li>
<li><strong>adaLN-Zero block</strong>: <strong>adaLN</strong>은 각 2개의 shift와 scale factor가 필요합니. 즉, 총 4개의 embedding vector가 MLP로 출력되는 것입니다. 그러나 <strong>adaLN-Zero</strong>는 scale factor a를 추가하여서 총 6개의 output이 나오도록 모델 구조를 설계하였습니다. 또한 이 scale factor <strong>$$\alpha$$의 초깃값을 zero</strong>로 두고 시작하기 때문에, <strong>adaLN-Zero</strong>라고 이름이 붙였습니다.
또한 <strong>$$\alpha$$</strong>가 0이기 때문에 input_tokens 값만 살아남게 되므로, 처음 DiT block은 identity function이다.</li>
</ul>
<h4 id="model-size">Model size</h4>
<p>DiT block 안에 있는 MLP들은 SiLU와 linear layer를 적용하는데, <strong>adaLN 또는 adaLN-Zero</strong>인지에 따라서 <strong>output 차원</strong>이 달라집니다. <strong>adaLN-Zero</strong>일 경우에는 transformer&#39;s hidden size의 <strong>6배</strong>에 해당하는 vector를 출력하게 됩니다.
추가로 Timesteps과 layer 정보에 대하여 embedding으로 들어오면 서로 dim-256 사이즈의 vector인데, 두 개의 vector를 더한 상태로 MLP에 넣어주게 됩니다.</p>
<h4 id="transformer-decoder">Transformer Decoder</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9244367e-e57e-4029-8ab9-27023994bc80/image.png" alt="">
마지막 DiT block 이후에는 이미지 토큰 시퀀스를 output noise prediction과 output diagonal covariance prediction으로 디코드해야합니다. 따라서 LayerNorm 적용하고, linear와 reshape을 적용한 다음에 각 patch size (pxp)마다 기존 channel size의 2배가 되는 output을 출력합니다.
그 결과 output은 위에서 보는 것처럼, <strong>예측된 noise 값과 covariance 값</strong>입니다. 
그 이후, VAE decoder에 noise 값을 넣어서 실제 이미지를 생성합니다</p>
<h3 id="5-experiment">5. Experiment</h3>
<p>모델 크기:
DiT-S, DiT-B, DiT-L, DiT-XL
<img src="https://velog.velcdn.com/images/holiday_donghun/post/62940bb7-66f6-4383-9991-37012d7f9f2c/image.png" alt=""></p>
<h4 id="gflops--giga-floating-point-operations-per-second">Gflops ( Giga floating-point operations per second)</h4>
<p>컴퓨터가 초당 수행할 수 있는 부동 소수점 연산의 수를 기가 단위로 나타낸 것으로, 숫자가 클수록 더 많은 연산을 빠르게 처리할 수 있다고 합니다.</p>
<h3 id="6-result">6. Result</h3>
<h4 id="dit-block-design-1">DiT block design</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/7d23a786-37fc-498e-9a4f-c27f6d61e26f/image.png" alt="">
가장 큰 Gflops를 가지는 DiT-XL/2 모델에 대해 각기 다른 block 디자인을 적용해보았다.</p>
<blockquote>
<p>In-context : 119.4 Gflops
Cross-attention : 137.6 Gflops
Adaptive layer norm (adaLN) or adaLN-zero : 118.6 Gflops</p>
</blockquote>
<p>실험 결과는  <strong>adaLN-zero</strong>가 가장 좋은 성능을 보였습니다. 이를 통해 똑같은 adaLN이라도 <strong>zero-initialization을 사용하는 것에 대한 중요성</strong>을 알 수 있습니다.</p>
<h4 id="scaling-model-size-and-patch-size">Scaling model size and patch size</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/296921ed-f723-4389-9789-ba8248b36457/image.png" alt="">
모델 규모 및 패치사이즈를 변화시키면서 실험해보았습니다. <strong>큰 모델 규모와 작은 패치 사이즈</strong>를 갖는 것이 성능이 가장 우수합니다.</p>
<h4 id="dit-gflops-are-critical-to-improving-performance">DiT Gflops are critical to improving performance</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/703269f3-bf2b-4419-86ea-2131a0526cc3/image.png" alt=""></p>
<p> 모델 규모 보다는 패치 사이즈의 변화가 성능 향상에 크게 기여하는 것을 알 수 있습니다. 패치 사이즈를 변화할 경우, 전체 파라미터 수는 변화가 거의 없으며 <strong>오직 Gflops만 증가</strong>합니다. 즉, Gflops가 증가함에 따라 성능이 감소한다는 것을 알 수 있습니다.</p>
<h4 id="larger-dit-models-are-more-compute-efficient">Larger DiT models are more compute-efficient</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/da257a97-2847-4285-9e05-74ca4dc2f2be/image.png" alt="">
전체 학습 연산량 별 FID-50k 성능을 나타낸 것입니다. 학습 연산량은 Gflips x batch size x training steps x 3으로 추정하였다고 합니다. 이 때 3이 곱해지는 이유는 backward pass가 forward pass보다 2배 복잡한 연산을 가져 다음과 같이 3을 곱한다고 합니다. 실험 결과, <strong>더 오래 학습된 작은 모델보다 적게 학습된 큰 모델이 더 높은 계산 효율성을 갖는다</strong>고 합니다.
더불어 패치 사이즈를 제외하고는 동일한 모델이라도 <strong>다른 Gflops를 제어할 때에도 성능 프로필이 다르다는 것</strong>을 알 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/d7315147-9d4c-4e49-8529-adf48e437152/image.png" alt="">
마지막으로 위의 표는 각 256x256, 512x512 ImageNet에 대한 결과로, 대부분의 평가지표에서 본 모델이 SOTA를 달성한 것을 알 수 있습니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>ViT를 계승한 DiT가 scalability을 통해 대규모 데이터 처리 및 고품질 샘플 생성하는 방법이 재미었다. DiT 아키텍처를 다양한 도메인으로 확장하여 공부해보고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mip-NeRF: A Multiscale Representation for Anti-Aliasing Neural Radiance Fields 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Zip-NeRF-Anti-Aliasing-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Zip-NeRF-Anti-Aliasing-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 04 Feb 2025 14:51:56 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/abs/2103.13415">https://arxiv.org/abs/2103.13415</a></p>
</blockquote>
<p>NeRF 논문을 공부한 후 NeRF 후속 논문 중 가장 대표적인 Mip-NeRF에 대해 리뷰하고자 합니다.</p>
<p> 기존의 NeRF는 하나의 픽셀을 렌더링하기 위해서 하나의 ray을 사용합니다. 이렇게 하면 training 혹은 test time에서 사용된 sample들의 해상도 차이가 있는 경우에 렌더링 된 화면이 흐려지거나 <strong>aliasing</strong>이 생기는 현상이 불가피하게 나타난다고 합니다. 그리고 이  <strong>aliasing</strong>문제를 해결하기 위해 연속적인 해상도 상황를 고려한 <strong>Mip-NeRF</strong>를 고안해냈습니다.
 <img src="https://velog.velcdn.com/images/holiday_donghun/post/866c5807-1c98-472d-9d17-c9a42fb40da2/image.png" alt=""></p>
<p> <strong>Mip-NeRF</strong>에서는 ray 대신에 <strong>conical frustum</strong>(위의 그림처럼 원뿔대 모양)을 쏴서 aliasing, artifact 문제를 막고 fine detail을 잘 살릴 수 있었다고 합니다. 결과적으로 모델 사이즈는 절반으로 줄이고, 연산 속도는 7% 향상 됬으며, NeRF 대비 17% avg error가 주었으며, Mip-NeRF에서 새롭에 제시한 multiscale variant 세팅 기준으로 NeRF보다 60% 개선된 성능을 보였다고 합니다. </p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>NeRF</strong>는 샘플들에서 카메라와 관측 대상과의 거리가 어느정도 일정해야 잘 작동합니다. 만약 NeRF를 multiple resolution으로 구성된 데이터셋을 가지고 학습하게 되면 카메라와 대상과의 거리가 가까운 경우를 렌더링할 때는 흐려지고 먼 물체를 렌더링할 때는 <strong>aliasing artifact</strong>가 생긴다고 합니다. 이런 현상을 해결하기 위한 <strong>supersampling</strong>과 같은 해결책은 scene 하나를 학습하기 위해 몇 시간이 걸리는 NeRF의 특성상 굉장히 비효율적입니다.</p>
<blockquote>
<p><strong>SuperSampling</strong>은 컴퓨터 그래픽스에서 <strong>Anti-aliasing</strong>을 구현하는 고급 기법으로, 고해상도 렌더링 후 저해상도로 다운스케일링하여 화질을 개선합니다. 이 기술은 주로 게임과 3D 렌더링에서 계단 현상(Jaggies)을 줄이는 데 사용됩니다.
핵심 원리는 다음과 같습니다.</p>
</blockquote>
<ul>
<li>고해상도 → 저해상도 변환 프로세스:</li>
</ul>
<ol>
<li><p>GPU가 실제 출력 해상도(예: FHD)보다 높은 해상도(예: 4K)로 장면을 렌더링</p>
</li>
<li><p>픽셀 내부의 여러 서브픽셀 샘플 채집 및 평균화</p>
</li>
<li><p>종적으로 목표 해상도로 이미지 축소</p>
<p>저자들은 mipmapping이라는 방법에서 영감을 받아서 discrete한 여러 구간의 거리에 따라 픽셀의 크기(?)를 조절해주는 방법을 취합니다. 해당 방법은 MLP에 데이터가 통과되는 렌더링 이전에 발생하는 과정이며 그렇기 때문에 같은 카메라 위치+거리에서 렌더링을 반복적으로 해야하는 경우에는 mipmap을 한 번만 계산해 놓은 뒤 MLP를 통과할 때마다 가져다 쓰면 됩니다. 논문에서는 &quot;<strong>prefiltered radiance field for a continuous space of scales</strong>&quot;라고 방법론을 소개합니다. 여기서는 3차원인 conical frustum에 대한 positional encoding을 해주어야하기 때문에 <strong>3D Gaussian을 가지고 positional 인코딩을 진행</strong>하게 되고 이를 <strong>intergrated positional encoding(IPE)</strong>라고 부릅니다. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/b0695dd2-3bff-4547-82b8-edf2b32be771/image.png" alt=""></p>
</li>
</ol>
<p>(a)을 보면 NeRF를 가지고 카메라를 뒤로 당긴 뒤 줌을 해서 찍은 사진을 입력으로 넣었을 때 일종의 계단 현상(Jaggies)이 일어나는 이미지가 만들어집니다. (b)를 보면 muliscale로 NeRF를 학습시키게 되면 이 현상이 어느정도 개선되지만 가까이서 찍은 사진의 질이 낮아지게 됩니다.
그리고 (c)를 보면 <strong>Mip-NeRF</strong>에서는 <strong>두 환경에서 모두 높은 정확도</strong>를 보이는 것을 확인할 수 있습니다. </p>
<h3 id="3-method">3. Method</h3>
<p><strong>Mip-NeRF</strong>는 conical frustum 모양의 ray를 쏘면서 점 단위로 sampling을 하는 NeRF와는 다르게 거리에 따라 픽셀의 크기를 조정할 수 있게 합니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/5525fdfa-9d30-4851-89e8-2a82e03a7d88/image.png" alt="">
dnl 그림처럼 <strong>카메라가 멀리 있을 때(노란색)</strong>는 conical fructum의 직경이 커지고, <strong>카메라가 가까이 있을 때(파란색)</strong>은 conical frustum의 직경이 작아집니다. 
이를 통해 <strong>Mip-NeRF</strong>는 <strong>pixel 하나를 렌더링하여 거리 aware하게 장면을 학습</strong>할 수 있게 됩니다. </p>
<h4 id="cone-tracing-and-positional-encoding">Cone Tracing and Positional Encoding</h4>
<p>위에서 언급한 것처럼 <strong>MipNeRF</strong>에서는 ray가 아닌 <strong>cone</strong>방식으로 multivariate Gaussian을 사용하게 됩니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/ec6bc621-d4b7-4f37-94aa-2d725eb3a5f6/image.png" alt="">
 위 식을 통해 과 $$t_0$$과$$t_1$$사이의 거리 상에 있는 $$F(x,  )=1$$임을 가정합니다.  여기서 $$\dot{r}$$은 거리에 따라 parameterized 된 conical frustum의 반지름입니다. 
 <img src="https://velog.velcdn.com/images/holiday_donghun/post/5c29a743-3281-4d09-bfbc-64530eafa4fe/image.png" alt="">
그리고 위의 방식으로 <strong>positional encoding</strong>을 진행해주어야하는데, <strong>분자 부분이 closed form solution이 아니기 때문</strong>에 계산하는데 문제가 발생할 수 있다고 합니다. 
이를 해결하고자 <strong>conical frustum을 multivariate gaussian을 통해 효율적으로 근사</strong>하였고, 이를 <strong>integrated positional encoding(IPE)</strong>라고 부릅니다. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9cee0f8b-2255-4d64-8331-87bb1dfb916e/image.png" alt="">
$$\mu_t$$는 Mean과 $$\sigma_t^2$$는 coefficient입니다. Mean과 coefficient를 위의 식과 같이 계산하는 것이 수치적으로 안정적이라고 합니다. 
이를 바탕으로 위의 내용을 바탕으로 종합한 식은 다음과 같습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/0e8293a4-c3b0-4e4c-85d9-e155c0cfc69d/image.png" alt=""></p>
<hr>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/52807536-3401-4794-a7ae-99167679075c/image.png" alt=""></p>
<p> 이 식은 위에서 정의한 Gaussian에 대해 <strong>positional encoding</strong>을 해주기 위한 과정입니다. 다음과 같이 <strong>reparameterization</strong>을 해주면 <strong>IPE</strong>을 하기 위한 <strong>closed form</strong> 형태가 완성됩니다. 
이를 바탕으로 <strong>Linear transform의 covariance</strong>가 <strong>변수의 covariance의 linear transform</strong>과 같다는 사실을 착안하면 conical frustum의 mean과 variance를 구할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/fa717f1b-1bfa-4369-878f-c0a171e82c62/image.png" alt="">
그리고 이를 바탕으로 <strong>IPE</strong> 식을 새롭게 나타낼 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/fddb22fe-f196-48f2-bf49-c70ae6f5b1db/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/10e0df53-0c9f-43b1-b002-43c261fc750f/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/b7cb7242-6974-476f-8054-3872c300b644/image.png" alt="">
이렇게 설계하였을 때,** NeRF의 Positional Encoding<strong>과 **MipNeRF의 Integrated Positional Encoding</strong>을 비교하면서 적용한 효과를 비교하면 다음과 같습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/c63b2f41-187e-4f01-a81e-a4851f2617bf/image.png" alt=""></p>
<p>그림를 보면** Mip-NeRF<strong>가 **고주파 영역에서 크기가 작아지는 것</strong>을 toy example로 보여주고 있습니다. <strong>이를 통해 aliasing이 생기는 것을 막아준다고 합니다</strong>.</p>
<h4 id="architecture">Architecture</h4>
<p><strong>NeRF</strong>에서는 <strong>Coarse Network, Fine Network가 각각 분리</strong>되어 있었습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/dc04de86-02aa-4e12-8f08-9679d5b780e9/image.png" alt=""></p>
<p><strong>MipNeRF</strong>에서는 NeRF와 똑같은 개념으로 sampling을 하고 Network를 통과하지만, <strong>2개의 Network가 같은 Weight를 공유</strong>합니다. 그 덕분에 <strong>한개의 Network를 사용</strong>하게 됩니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/73f4a476-8e3a-4416-8096-3f5494db7b42/image.png" alt=""></p>
<p>여기서 $$C$$는 color를 출력하는 함수를 뜻하고, $$Θ$$부분이 weight에 해당합니다. 또한 NeRF에서는 Coarse Sampling 64개, Fine Sampling 128개이었지만, MipNeRF에서는 Coarse Sampling 128개, Fine Sampling 128개로 두었습니다.</p>
<p><strong>Coarse Network</strong>의 결과 <strong>Weight로 Fine Point를 Sampling</strong>할 때는 다음의 식과 같이 <strong>변형한 weight로 Inverse transform sampling</strong> 하였습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e9afc445-4ac9-4c26-af4d-c559339ff44d/image.png" alt=""></p>
<p>$$w_k^{&#39;}$$ (Weight)는 <strong>특정 Point가 Surface일 확률</strong>을 나타내는 값인데, Ray위의 Point들에 대한 PDF(확률 밀도 함수)에서 Surface확률이 높은 Point들을 좀더 더 많이 샘플링하기 위해 사용하게 됩니다. <strong>MipNeRF</strong>에서는 <strong>이 Weight에서 이전point의 weight와 이후 weight의 max값</strong>을 취함으로써, 좀더 wide하고 smooth하게 fine 샘플링하게 합니다.</p>
<h3 id="4-results">4. Results</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/02a76ea2-b0cf-434d-bcf9-662b5aed7688/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f20b1166-1b85-49b1-b5a5-5a6c6effacd1/image.png" alt="">
이 표를 통해 <strong>MipNeRF는 모든 경우</strong>에서 <strong>NeRF보다 60%정도 좋은 성능</strong>을 보이는 것을 볼 수 있습니다. <strong>시간도 약간 향상(약 7%)</strong>되었고, <strong>model크기도 작아진 것을(약 50%)</strong> 확인해 볼 수 있습니다. 특히 <strong>해상도가 줄었을 때, 성능차이가 크다</strong>는 것을 알 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/f850b3f0-5521-43d7-9488-8bef191f6d22/image.png" alt="">
NeRF원문 그대로 데이터셋을 두고 다른 실험과 비교한 Test 결과입니다.** MipNeRF<strong>는 평균 **17%</strong>성능 향상되었습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a4524ca6-458e-459b-b675-519bac85d472/image.png" alt="">
마지막으로 <strong>anti-aliasing</strong> 효과를 위해 <strong>sampling하는 갯수를 늘려</strong> 실험하였습니다. 
** MipNeRF**가 전체적으로 NeRF보다 향상된 성능을 보이는 것을 알 수 있습니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>NeRF의 후속 연구 중 첫번째로 MipNeRF에 대해 다뤄보았습니다. anti-aliasing 효과가 엄청나게 뚜렷하지는 않지만, 새로운 수학적 접근 방법을 통해 전체적인 성능 향상을 가져온다는 점이 매우 신기했습니다.  </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/NeRF-Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/NeRF-Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 04 Feb 2025 09:04:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/abs/2003.08934">https://arxiv.org/abs/2003.08934</a>
github: <a href="https://github.com/yenchenlin/nerf-pytorch">https://github.com/yenchenlin/nerf-pytorch</a></p>
</blockquote>
<p>오늘 리뷰할 논문은 <strong>NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis</strong>이다. 3D Image 생성을 공부하면서 <strong>NeRF</strong>에 대한 개념이 자주 나와 NeRF를 공부해야겠다라는 생각을 하게 되었고, 논문을 리뷰하고자 한다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p>View Synthesis(뷰 합성)은 주어진 이미지 세트에서 관찰되지 않은 시점의 이미지를 생성하는 작업으로, 기존 방법들은 복잡한 3D 장면의 기하학적 구조와 광학적 특성을 제대로 표현하지 못하는 한계가 있었습니다.</p>
<p><strong>NeRF</strong>는 이러한 문제점들을 해결하여, 적은 메모리로도 높은 성능의 3D rendering을 할 수 있는 방법입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/37d51908-bdb3-4253-8c4c-b9985ce175ff/image.png" alt=""></p>
<p><strong>NeRF</strong>는 연속적인 5D 좌표(공간 위치 $$(x,y,z)$$와 시점 방향 $$(θ,ϕ)$$)를 입력으로 받아 해당 위치의 <strong>볼륨 밀도(density)</strong>와 시점 의존적 <strong>방출 복사율(emitted radiance)</strong>을 출력하는 신경망을 사용합니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/c4fc4542-e3e9-494c-859a-103ec5f6a618/image.png" alt=""></p>
<p>이 내용을 정리하자면</p>
<ul>
<li>2D Image와 카메라 시점 정보로 ‘2D Pixel 좌표’ 1개 점에 맵핑되는 ‘3D Voxel 좌표’위치를 계산 할 수 있고, 반대로 3D Voxel 좌표들의 Color값과 Density값의 SUM으로 각 2D Pixel의 RGBA을 표현 할 수 있습니다.</li>
<li>Train시, 카메라 시점(𝜃,𝜙)와 voxel 좌표(x,y,z)를 입력으로 하고, RGB와 Volume Density(𝜎)를 출력으로 하는 함수F를 정의하여, FCN(Fully Connected Network)으로 함수F 모델을 학습합니다.</li>
<li>Inference시, 새로운 카메라 시점(𝜃,𝜙)이 입력으로 주어지면, Train한 모델로 3D Voxel 좌표에서의 RGB𝜎값을 계산한 후, 대응되는 2D Pixel 좌표로 Summation함으로써 색상 값을 Prediction합니다.</li>
</ul>
<p>그 결과:</p>
<ul>
<li>복잡한 장면의 세부 기하학 및 광학적 특성을 고해상도로 표현 가능.</li>
<li>기존 뷰 합성 방법보다 더 높은 품질의 결과 제공.</li>
</ul>
<h3 id="2-related-work">2. Related Work</h3>
<p>NeRF는 기존의 3D 장면 표현 및 뷰 합성 연구를 기반으로 발전했습니다. 관련 연구는 크게 세 가지로 나뉩니다:</p>
<h4 id="explcit-representation명시적-표현">Explcit Representation(명시적 표현):</h4>
<ul>
<li>메쉬(mesh)나 보텍스(voxel) 기반의 3D 표현 방식.</li>
<li>제한된 해상도와 복잡한 장면 처리에 어려움이 있음.<h4 id="implicit-representation암묵적-표현">Implicit Representation(암묵적 표현):</h4>
</li>
<li>신경망을 활용하여 연속적인 장면 표현.</li>
<li>NeRF는 이러한 접근 방식을 확장하여 고해상도 뷰 합성을 가능하게 함.<h4 id="volume-rendering볼륨-렌더링">Volume Rendering(볼륨 렌더링):</h4>
</li>
<li>고전적인 볼륨 렌더링 기술을 활용하여 NeRF가 자연스럽게 미분 가능하도록 설계됨.</li>
</ul>
<h3 id="3-neural-radiance-field-scene-representation">3. Neural Radiance Field Scene Representation</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a66831b7-f01a-4595-84cc-21bcd37d9f5f/image.png" alt="">
위에서 언급했던 것처럼 위 그림은 <strong>NeRF</strong>의 구조 입니다.
$$(x,y,z,θ,ϕ)$$가 입력으로 MLP인 $$F_θ$$에 들어가게 됩니다. 그리고 $$F_θ$$는 ray 상의 RGB값과 density를 반환해줍니다. 
그 후 $$F_θ$$는 위치 정보를 받고 density(𝜎)를 예측하도록 하면서 여러 방향에서도 일관성이 있는 이미지를 생성할 수 있게 합니다.  </p>
<p>MLP인 $$F_θ$$의 구조는 먼저 3D$$(x,y,z)$$를 ReLU 포함 8개의 FC layer를 통과하여 density(𝜎)와 256 차원의 특징 벡터를 얻습니다. 256 차원의 특징 벡터에 아까 사용하지 않았던 $$(θ,ϕ)$$를 붙여서 FC+ReLU 한 층을 통과시켜 128 차원의 RGB 값을 얻어냅니다. </p>
<p>이 방식은 물체의 같은 위치라도 바라보는 방향에 따라 다른 RGB값을 가질 수 있으며 입력 값으로 viewing direction이 들어가지 않으면 이미지의 질이 떨어지는 것도 확인할 수 있습니다. </p>
<p>결과로 얻어진 RGB𝜎는 volume rendeing을 통해 하나의 픽셀 값으로 적분됩니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/902436dd-a0bb-4e2a-bff4-25b5f806db5d/image.png" alt="">
위 그림은 물체(배)를 같은 위치라도 바라보는 방향에 따라 픽셀 값이 달라질 수 있음을 보여줍니다. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/109b4bd9-098d-4496-88a3-64d03eacb5e2/image.png" alt="">
다음 그림은 <strong>viewing direction을 학습에 사용하지 않은 경우</strong>, 생성된 이미지의 선명도가 떨어지는 것을 볼 수 있습니다. 특히, 바퀴를 보면 빛이 비침에 따라 검정색 바퀴가 다르게 보이는 것을 확인할 수 있습니다.</p>
<h3 id="4-volume-rendering-with-radiance-fields">4. Volume Rendering with Radiance Fields</h3>
<p>MLP를 통해 얻어진 RGB𝜎는 ray 상에 존재하는 density(𝜎)와 RGB 값을 의미합니다. 이게 이미지 상에서는 어떤 색으로 보일지 계산하기 위해서 volume rendering이라는 과정을 거치게 되고 아래의 식으로 나타냅니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/6ab61d0d-3fbc-408a-ab76-ec2673d9168a/image.png" alt="">
Ray 상에서 계산이 시작되는 $$t_n$$부터 $$t_f$$까지 연속적으로 적분을 하게 됩니다. 
여기서 $$r(t)$$는 ray 정보, 𝜎는 density 정보, $$T(t)$$는$$t_n$$부터 $$t$$까지 빛이 투사되는 정도, $$C(r)$$는 최종적으로 예측된 픽셀 값입니다. </p>
<p>하지만 위의 식은 범위가 연속적이라는 가정이 있어 실제로 컴퓨터 상에서 이런 연속적인 계산을 하기가 힘듭니다. 그래서 $$t_n$$부터 $$t_f$$를 이산적인 범위로 나누어서 적분을 진행하게 됩니다. 
Deterministic quadrature를 사용하여 적분하면 고정적인 위치를 쿼리로 주게 되어 성능이 저하된다고 합니다. 그렇기에 그래서 $$t_n$$부터 $$t_f$$를 같은 길이로 나눈 <strong>stratified sampling</strong>을 하였다고 합니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/46f39648-34d8-40fd-b823-6629cc8732fc/image.png" alt="">
위의 식을 해석하자면 ** $$t_n$$(n=near) 좌표부터  $$t_f$$(f=far)까지의 구간을 N개로 균일하게 나누고, i번째 좌표에 대한 U(집합)을 $$t_i$$로 표현**하였습니다.</p>
<p><strong>stratified sampling한 값</strong>에 추가적으로 <strong>이산개의 균일하게 구간(bin)</strong>을 아래처럼 계산을 하여 <strong>픽셀 값을 계산</strong>한다고 합니다. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/75dbadb7-8a3e-42f4-91e8-81a5763a08fe/image.png" alt="">
여기서 $$\delta _i$$는 나뉘어진 bin의 길이입니다.</p>
<h3 id="5--optimizing-a-neural-radiance-field">5.  Optimizing a Neural Radiance Field</h3>
<h4 id="positional-encoding">Positional Encoding</h4>
<p>네트워크 입력 차원이 총 5개$$(x,y,z,θ,φ)$$로 설계 되었습니다. 
입력 차원이 다차원일수록 잘 학습되기 때문에 <strong>Positional encoding</strong>을 사용하여 token에 더해주면서 모델이 token의 위치를 파악하게 할 수 있게끔하는 사용합니다. 
<strong>Positional encoding</strong>은 <strong>learnable parameter가 따로 없고, 아래처럼 sinusoidal 함수를 사용합니다</strong>. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/5bc1de77-d507-43f6-bc76-99c7b6296724/image.png" alt="">
논문에서 <strong>Positional encoding</strong>을 할때, 위치 정보와 방향 정보를 따로따로 나누어서 encoding해주었다고 합니다</p>
<h4 id="hierarchical-volume-sampling">Hierarchical volume sampling</h4>
<p>앞에서 말했 듯이 volume rendering에서 적분을 할 때 ray 상의 구간을 이산적으로 나누어 적분합니다. 이 과정을 더 효과적이고 효율적으로 하기 위해 sampling 과정을 거치게 됩니다. 이미지를 렌더링할 때 사실상 물체에 가려진 뒷 부분이나 아무 것도 없는 허공은 크게 계산을 하는데 의미가 없습니다. 이러한 점 때무에 NeRF에서는 $$F_\theta$$를 coarse network과 fine network로 두 개를 사용합니다.</p>
<p> <img src="https://velog.velcdn.com/images/holiday_donghun/post/bfa54d99-0635-43e3-869d-f9851cb7e725/image.png" alt=""></p>
<p>Coarse network에서는 앞에서 나온 <strong>stratified sampling</strong> 방법대로 구간을 균일하게 나눈 뒤 렌더링을 합니다. 이 때 나왔던 좌표들에 대해 Color값들을 계산 한 후에, 앞서 설명한 Color을 계산하기 위해 사용한 불투명도인 $$w_i$$를 사용하여, <strong>Ray에 대한 PDF(확률밀도)을 계산</strong>합니다.
<strong>PDF를 적분하여 CDF(누적분포)를 계산</strong>한 후, 난수값으로 Sampling을 합니다. 그렇게 되면, <strong>$$w_i$$가 큰 구간에 대해서, 좀 더 많은 좌표들을 Sampling</strong> 할 수 있습니다.</p>
<h4 id="implementation-details">Implementation details</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/85b26012-48a7-4e62-869f-8fdfc49bec4f/image.png" alt=""></p>
<p>이 식은 <strong>NeRF의 Loss 함수</strong>입니다.
여기서 <strong>$$C(r)$$</strong>는 ground truth, <strong>$$\hat{C}_c(r)$$</strong>는 coarse volume, <strong>$$\hat{C}_f(r)$$</strong>는 fine volume을 나타냅니다.
<strong>학습을 할 때는 위 식과 같은 Loss를 흘려주면서 모델 학습</strong>을 진행합니다. Coarse prediction과 fine prediction 모두에 대해 GT view에 대한 MSE를 계산하여 Loss를 계산을 합니다.
그리고 <strong>$$\hat{C}_c(r)$$의 loss도 최소화하는데</strong>, coarse network로부터의 <strong>weight distribution이 fine network에서 샘플들을 할당</strong>하는데 사용되기 때문이라고 합니다.</p>
<h3 id="6-results">6. Results</h3>
<blockquote>
<ul>
<li><strong>Diffuse Synthetic</strong> : DeepVoxels Dataset에서는 Lambertian Reflectance(겉보기 밝기)를 갖는 4개의 Object에 대해 512x512이미지를 사용하였고, 각각 Object에 대해 79개를 input 이미지, 1000개를 Test 이미지로 두었습니다.</li>
</ul>
</blockquote>
<ul>
<li><strong>Realistic Synthetic</strong> : 논문에서는 추가로, non-Lambertian Reflectance를 갖는 8개 Object에 대해 800x800이미지를 사용하였고, 각 Object에 대해 100개를 input이미지, 200개를 Test 이미지로 두었습니다.</li>
<li><strong>Real Forward-Facing</strong> : 정면에서 촬영한 Real Scene 8장면에 대해 1008x756 이미지를 사용하였고, 각 Scene마다 20~62개의 이미지를 사용하여, input이미지로 7/8, Test이미지로 1/8을 사용하였습니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/39a6aa10-dedc-4b5b-8d18-dfdecbe84546/image.png" alt="">
위 표를 통해 NeRF가 다른 모델에 비해 복잡한 이미지도 선명하게 잘 만들어내는 것을 알 수 있다.</p>
<p>그리고 각 평가 지표에 대해 간단히 설명하면,</p>
<ul>
<li><strong>PSNR(Peak Signal-to-Noise Ratio)</strong> : <strong>두 이미지 간의 픽셀 오차가 적을 수록 PSNR값이 높습니다</strong>.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/01be43e3-bf85-41cb-b9b8-cfd513783b48/image.png" alt=""></li>
<li><strong>SSIM(Structural Similarity Index Map)</strong> : 두 이미지간의 상관계수를 <strong>Luminance(휘도), Contrast(대비), structural(구조)</strong> 총 3가지 측면에서 평가합니다. 이 때 <strong>픽셀의 평균, 분산으로 평가값</strong>이 높을 수록 유사도가 높습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/38b480f7-2bd3-4fb7-b7ed-de1b3b867116/image.png" alt=""></li>
<li><strong>LPIPS(Learned Perceptual Image Patch Similarity)</strong> : Pretrained Alexnet을 활용하여 Image Feature를 추출하고 <strong>distance를 계산값이 작을 수록 유사도가 높습니다</strong>.</li>
</ul>
<h4 id="ablations">Ablations</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/5cc68d64-9cb8-46d7-8e02-dbc1191a3875/image.png" alt=""></p>
<ol>
<li><strong>입력 이미지 수(#Im)의 영향:</strong>
훈련 입력 이미지의 개수가 증가할수록 모델의 성능이 향상됩니다</li>
<li><strong>Positional Encoding:</strong>
L 값은 위치 인코딩의 복잡도를 나타냅니다3.
적절한 L 값 선택이 모델 성능에 중요한 영향을 미칩니다.</li>
<li><strong>샘플링 포인트 수:</strong>
N_c는 Coarse 모델에서, N_f는 Fine 모델에서 각 광선(Ray)당 샘플링되는 포인트의 개수를 의미합니다
샘플링 포인트 수 증가는 일반적으로 성능 향상으로 이어집니다.</li>
<li><strong>계층적 샘플링의 중요성:</strong>
Coarse 네트워크와 Fine 네트워크를 사용한 계층적 샘플링 방식이 성능 향상에 크게 기여합니다</li>
<li><strong>위치 인코딩의 효과:</strong>
고주파 정보를 더 잘 포착하여 전반적인 렌더링 품질을 개선합니다.</li>
</ol>
<h3 id="마지막으로">마지막으로</h3>
<p>NeRF가 무려 5년전(2020년)에 출시된 논문이다보니 Transformer처럼 NeRF에서 발전되고 개선된 연구들이 많이 나왔다. NeRF 후속 여러 논문들에 대해 공부하고 리뷰하고자한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ LoRA: Low-Rank Adaptation of Large Language Models 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/LoRA-Low-Rank-Adaptation-of-Large-Language-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/LoRA-Low-Rank-Adaptation-of-Large-Language-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 04 Feb 2025 07:58:21 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/abs/2106.09685">https://arxiv.org/abs/2106.09685</a>
github: <a href="https://github.com/microsoft/LoRA">https://github.com/microsoft/LoRA</a></p>
</blockquote>
<p><a href="https://velog.io/@holiday_donghun/Stable-Video-Diffusion-Scaling-Latent-Video-Diffusion-Models-to-Large-DatasetsSVD-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">SVD(Stable Video Diffusion)</a> 논문을 공부하면서 간단하게 공부하였던 LoRA에 대한 논문 리뷰를 한다고 하였다. 미루고 미루다 이제서야 제대로 LoRA를 다뤄보고자 합니다.</p>
<p><strong>LoRA(Low-Rank Adaptation)</strong> 논문은 대규모 언어 모델(LLM)의 효율적인 파인튜닝(fine-tuning)을 위한 새로운 접근법을 제안합니다. 이 논문은 특히 GPT와 같은 Large Language Models(LLM)을 특정 task에 fine-tuning(adaptation)하는 데 있어서 time, resource cost가 너무 크다는 단점을 해결하기 위한 방법 모델에서 파라미터 효율성을 극대화하면서도 성능을 유지하거나 향상시키는 방법론을 다룹니다. </p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>LLM</strong>은 기본적으로 <strong>pre-trained model(대규모 사전 학습된 언어 모델)</strong>로부터 특정 task(e.g. summarization, question and answering, ...)에 adaptation하기 위해 파인튜닝을 해야 합니다. 대규모 사전 학습된 언어 모델의 파인튜닝은 자연어 처리(NLP)에서 필수적인 작업입니다. 하지만 <strong>모델 크기가 커질수록 모든 파라미터를 재학습하는 풀 파인튜닝(full fine-tuning) 방식은 비효율적</strong>이며, LLM모델의 weight parameters를 모두 다시 학습하게 되는데 이게 <strong>엄청난 cost</strong>를 가집니다.</p>
<p><strong>LoRA</strong>는 이러한 문제를 해결하기 위해 저랭크 적응(Low-Rank Adaptation) 방식을 제안합니다. 핵심 아이디어는:</p>
<ul>
<li><strong>사전 학습된 가중치(pre-trained weights)를 고정</strong>하고,</li>
<li><strong>각 Transformer 계층에 학습 가능한 저랭크(low rankdecomposition) 행렬을 삽입</strong>하여 <strong>필요한 파라미터 수를 줄이는 것</strong>입니다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/41b2da54-c69c-4eb0-ad40-56795572d488/image.png" alt=""></p>
<p>그래서 위 그림과 같이 <strong>fine-tuning시에 pre-trained weights W는 고정해두고 low rank decomposition된 weights A, B만 학습</strong>하고 W에 더하게 됩니다. <strong>Low rank로 decomposition된 weights</strong>는 기존 W보다 훨씬 작은 크기의 weight이기 때문에 <strong>time, resource cost를 줄일 수 있게</strong> 됩니다. 
또한 pre-trained model을 가지고 있는 상태에서 <strong>특정 task에 adaptation하기 위해서 A와 B만 storage에 저장</strong>하고, 다른 task에 adaptation하기 위해 또 다른 $$A^′, B&#39;$$만 갈아 끼우면 되기 때문에 <strong>storage, task switching면에서 매우 효율적</strong>입니다.</p>
<h4 id="terminologies-and-conventions">Terminologies and Conventions</h4>
<p><strong>Wq, Wk, Wv, Wo</strong>는 각각 <strong>query/key/value/output</strong>을 의미합니다.</p>
<p>또한 <strong>W와 W0</strong>는 pretrained weight이고 <strong>ΔW</strong>는 adapation을 할 때 축적되는 기울기 업데이트에 대한 값입니다.</p>
<h3 id="2-problem-statement">2. PROBLEM STATEMENT</h3>
<p><strong>LoRA</strong>는 training objective에 상관없이 모두 사용가능하지만 해당 논문에서는 <strong>LLM</strong>에 맞추어 설명합니다.</p>
<blockquote>
<p><strong>1. 기존의 LLM모델(e.g. GPT)를 하나의 확률함수 PΦ(y|x)입니다. **
이 때, y와 x는 context-target pair쌍이라고 할 수 있습니다.
**2. 그리고 fine-tuning과정에서 LLM이 튜닝되는 Φ가 최적화 되는 식은 다음의 식(1)으로 표현됩니다.</strong>
<img src="https://velog.velcdn.com/images/holiday_donghun/post/4304eb20-74aa-4db8-96c3-754f5542abfa/image.png" alt="">
이 때, Log-likelihood function으로 문제를 해결할 때 가장 적합한 파라미터 Φ의 나올 확률을 최대화 하는 것입니다.
직관적으로 backpropagation할 때의 모델을 나타내면, $$Φ = Φ0 + ΔΦ$$ 이 됩니다.
<strong>3. 위의 식에 근거하여 만약 accmulated gradient values(ΔΦ)를 기존보다 훨씬 적은 파라미터인 Θ로 치환하여  ΔΦ(Θ)로 나타내면 다음의 식(2)으로 바뀌게 됩니다.</strong>
<img src="https://velog.velcdn.com/images/holiday_donghun/post/3692e083-4526-44cf-8751-ce1167bf4be4/image.png" alt=""></p>
</blockquote>
<h3 id="4-our-method">4. Our Method</h3>
<h4 id="41-low-rank-parametrized-update-matrices">4.1 LOW-RANK-PARAMETRIZED UPDATE MATRICES</h4>
<p>Transformer 모델의 Dense Layer는 일반적으로 다음과 같은 행렬 곱셈으로 표현됩니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f0e381ef-abb2-40b7-a2d4-0804df343189/image.png" alt=""></p>
<p>여기서 $$W_0$$는 사전 학습된 가중치입니다. LoRA는 가중치 업데이트 $$ΔW$$를 다음과 같이 저랭크 분해합니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/9cf7434c-c14d-4402-9bd8-8909412e09e4/image.png" alt=""></p>
<p>여기서:</p>
<ul>
<li>$$B∈R ^{d×r}$$, $$A∈R ^{r×k}$$</li>
<li>$$r≪min(d,k)$$: 저랭크 조건.</li>
</ul>
<p>그리고 훈련과정에서 $$W0$$는 gradient update를 하지 않고, 오히려 $$BA$$를 학습하는 과정으로 이루어집니다.
따라서 수정된 forward pass는 다음과 같습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/4fb105cb-b5b9-4596-a040-b558c26876a0/image.png" alt=""></p>
<p>A는 random Gaussian initialization되고 B는 0으로 initialization됩니다. 그래서 training 시작 시에 $$ΔW=BA$$도 0으로 initailization됩니다.</p>
<h4 id="no-additional-inference-latency">No additional Inference Latency</h4>
<p><strong>LoRA를 사용하여 inference</strong>하려고 할 때는 기존 pre-trained weight $$W0$$에 학습한 $$BA$$를 더해주면 되기 때문에 <strong>inference latency</strong> 성능 하락은 전혀 없습니다. 그리고 $$W$$0을 기반으로 또 다른 task로 학습한$$B^′A^′$$가 있을 경우 $$BA$$ 대신 $$B^′A^′$$을 더해주어 사용하면 됩니다.</p>
<h4 id="42-applying-lora-to-transformer">4.2 APPLYING LORA TO TRANSFORMER</h4>
<p>Trainable weight를 최소화하기 위해 오직 <strong>LoRA</strong>를** Transformer의 attention weights인 Wq, Wk, Wv에만 적용<strong>하였고 나머지 MLP module에는 적용하지 않았습니다. 
그 결과 1,750억개의 parameter를 가진 GPT-3에 대해 fine-tuning시에 원래 **VRAM를 1.2TB사용하던 것이 LoRA를 통해 350GB로</strong> 줄어들었습니다. 또한 <strong>training speed또한 25%가량 줄었다</strong>고 합니다.</p>
<h3 id="5-empirical-experiments">5. EMPIRICAL EXPERIMENTS</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a6a88dd6-b8be-48b2-b06a-5a4311753831/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/70e7ba47-0139-49dc-9875-86db3aaec81e/image.png" alt="">
BERT계열 모델 실험 결과을 보면 NLU에서 좋은 성능을 보였고, GPT-2기준 성능비교 시 기존 방법들보다 trainable weight도 적으며 다양한 데이터셋에 대해 성능도 잘 나왔습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/70580af7-c8b1-405a-99dc-c580938f1409/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/44e72916-2f92-48ba-bc45-7fa1c5c548d3/image.png" alt=""></p>
<p><strong>LoRA</strong>를 이용하였을 때 해당 fields에서 SOTA를 달성할 뿐만 아니라, 특히 GPT-3 175B에서는 LoRA가 학습 가능한 파라미터 수를 약 10,000배 줄이는 데 성공했을 정도로 효율성이 좋습니다.</p>
<h3 id="6-analysis">6. Analysis</h3>
<h4 id="rank-deficiency">Rank Deficiency</h4>
<p>실험 결과, 대부분의 태스크에서 <strong>매우 낮은 랭크(r=1 또는 r=2)</strong>만으로도 <strong>높은 성능</strong>을 달성할 수 있음이 확인되었습니다.</p>
<h4 id="hyperparameter-sensitivity">Hyperparameter Sensitivity</h4>
<p><strong>LoRA</strong>는 하이퍼파라미터 조정에 민감하지 않으며, 초기값 설정만으로도 안정적인 결과를 얻을 수 있었습니다.</p>
<h3 id="7-discussion">7. Discussion</h3>
<p>LoRA는 다음과 같은 면에서 기존 방법론보다 우수합니다:</p>
<ol>
<li><strong>Efficiency(효율성)</strong>: 적은 자원으로도 높은 성능 달성합니다.</li>
<li><strong>Scalability(확장성)</strong>: 하나의 사전 학습된 모델로 여러 태스크에 쉽게 적응 가능합니.</li>
<li><strong>No inference latency(추론 지연 없음)</strong>: 어댑터 기반 방법론과 달리 추가적인 계산 비용이 없습니다.</li>
</ol>
<h3 id="마지막으로">마지막으로</h3>
<p>SVD를 공부하는 과정에서 알게된 LoRA에 대해 리뷰를 해보았습니다. SVD에서 언급된 CLIP 임베딩과 LoRA에서 발전된 QLoRA에 대해서도 공부하여 리뷰를 작성하고자 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/BERT-Pre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/BERT-Pre-training-of-Deep-Bidirectional-Transformers-for-Language-Understanding-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 04 Feb 2025 06:49:00 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문 : <a href="https://arxiv.org/abs/1810.04805">https://arxiv.org/abs/1810.04805</a></p>
</blockquote>
<p><a href="https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Transformer</a>와 <a href="https://velog.io/@holiday_donghun/ViT-AN-IMAGE-IS-WORTH-16X16-WORDSTRANSFORMERS-FOR-IMAGE-RECOGNITION-AT-SCALE-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">ViT</a>에 이어 <strong>BERT</strong> 논문을 리뷰하고자 합니다. 
BERT(Bidirectional Encoder Representations from Transformers)는 Google AI에서 개발한 언어 표현 모델로, Transformer 아키텍처를 기반으로 합니다. Transformer는 self-attention 메커니즘을 통해 문맥 정보를 효과적으로 학습할 수 있으며, 이를 확장한 BERT는 양방향(bidirectional) 학습을 통해 문맥의 좌우 정보를 동시에 고려합니다. 이는 기존의 단방향(unidirectional) 언어 모델(OpenAI GPT 등)과 차별화되는 점으로, NLP 작업에서 뛰어난 성능을 발휘합니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>PLM(Pre-trained Language Model; 언어 모델 사전 학습)</strong>은 NLP 작업의 성능을 크게 향상시키는 것으로 알려져 있습니다. 기존 접근 방식은 크게 두 가지로 나뉩니다:</p>
<ol>
<li><strong>Feature-based 접근</strong>: ELMo와 같은 모델이 사전 학습된 표현을 추가적인 특징(feature)으로 사용.</li>
</ol>
<blockquote>
<p>** ELMo**는 pre-trained representations을 하나의 추가적인 feature로 활용해 (down stream) task-specific architecture를 사용합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/bb9f12ac-8ff5-4180-88a5-6a9e54f53d87/image.png" alt="">
쉽게 말해 bidirectional language model를 통해 얻은 representation을 embedding vector과 단순히 concat해준다고 생각하시면 됩니다..</p>
</blockquote>
<ol start="2">
<li><strong>Fine-tuning 접근</strong>: OpenAI GPT처럼 사전 학습된 모델 전체를 미세 조정(fine-tune).
<img src="https://velog.velcdn.com/images/holiday_donghun/post/afb29799-593b-49e2-a568-9eed283cf5d5/image.png" alt=""><blockquote>
<p><strong>GPT(Generative Pre-trained Transformer)</strong>는 task-specific(fine-tuned) parameters 수 는 최소화하고, 모든 pre-trained 파라미터를 조금만 바꿔서 down stream task를 학습합니다.</p>
</blockquote>
</li>
</ol>
<p>그러나 기존 방법들은 주로 단방향 학습(left-to-right 또는 right-to-left)에 의존하여 문맥 정보를 제한적으로 활용했습니다. <strong>BERT</strong>는 이를 개선하기 위해 다음과 같은 혁신적인 방법론을 도입했습니다:</p>
<ol>
<li><strong>Masked Language Model(MLM)</strong>: 입력 텍스트에서 일부 단어를 마스킹(masking)하고 이를 예측하도록 훈련.</li>
<li><strong>Next Sentence Prediction(NSP)</strong>: 두 문장이 연속적인지 여부를 판단하는 이진 분류 작업.</li>
</ol>
<p>이를 통해 BERT는 깊은 양방향 표현을 학습하며, 다양한 NLP 작업에 적합한 범용 언어 모델로 자리 잡았습니다.</p>
<h3 id="2-related-work">2. Related work</h3>
<h4 id="unsupervised-feature-based-approaches">Unsupervised Feature-based Approaches</h4>
<p>단어 혹은 문장의 representation 학습은 수십년 동안 진행되어 왔는데, 대표적으로** non-neural method<strong>와 **neural method</strong>로 나뉩니다.</p>
<p>이러한 발전에 더불어, word embedding의 Pre-training은 오늘날 NLP 분야에서 굉장히 중요한 문제가 되었습니다.</p>
<p>또한 <strong>word embedding</strong>을 통한 접근 방식은 자연스레 s<strong>entence embedding 혹은 paragraph embedding</strong>으로 이어졌습니다.</p>
<p><strong>sentence representations</strong> 학습의 경우 BERT 이전에는</p>
<ol>
<li>다음 문장의 후보들을 순위 메기는 방법</li>
<li>이전 문장이 주어졌을때, 다음 문장의 left - to - right generation 방법</li>
<li>denoising auto-encoder에서 파생된 방법</li>
</ol>
<p>이 대표적으로 사용되었습니다.</p>
<p>이 후 <strong>ELMo</strong>와 그 후속 모델들은, 전통적인 word embedding 연구에서 한 층 더 발전하였는데, 바로 left-to-right와 right-to-left 언어 모델을 통해 context-sensitive feature들을 뽑아내는 방식입니다.</p>
<p>이렇게 생성된 토큰 별 contextual representation은 left-to-right, right-to-left representation의 단순 concat입니다. </p>
<blockquote>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/8c414425-f1e8-445e-bf41-83fdce02825c/image.png" alt="">left-to-right, right-to-left language model을 단순히 concat한 <strong>ELMo</strong></p>
</blockquote>
<p>그리고 <strong>BERT</strong>는 <strong>ELMo의 단순 concat</strong>하는것만을 넘어서** deep bidirectional**를 하게 됩니다.</p>
<h4 id="unsupervised-fine-tuning-approaches">Unsupervised Fine-tuning Approaches</h4>
<p>초기 feature-based approaches에 대한 연구는 unlabeled text로 부터 word embedding parameter를 pre-training하는 방향으로 진행되었습니다.</p>
<p>최근에는, contextual token representation을 만들어내는 (문장 혹은 문서)인코더가 pre-training되고, supervised downstream task에 맞춰 fine-tuning하게 됩니다. 이렇게 되면 scratch로(처음부터) 학습하는데 적은 파라미터로 충분하게 됩니다.</p>
<h4 id="transfer-learning-from-supervised-data">Transfer Learning from Supervised Data</h4>
<p>기계번역(Machine Translation)과 자연어추론(NLI) 대규모 데이터셋으로부터의 효과적인 전이학습(Transfer Learning)을 보여주는 연구도 있다고 합니다.</p>
<p>전이학습은 자연어처리 뿐만 아니라 CV(Computer Vision) 연구에서도 그 중요성이 강조되는데, ImageNet 등을 활용해 사전학습을 한 모델이 성능이 좋다고 한다고 합니다.</p>
<h3 id="bert">BERT</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/b638dad4-b52d-4c42-94cf-a1b89f3a7920/image.png" alt="">
BERT를 학습시키는 과정에는 두 단계가 있는데, 바로 <strong>pre-training</strong>과 <strong>fine-tuning</strong>입니다..</p>
<ul>
<li><strong>Pre-training</strong> 단계에서는 model이 unlabeled data를 통해 학습합니다.</li>
<li><strong>fine-tuning</strong> 단계에서는 pre-training으로 초기화된 parameter를 가지고 labeled data를 이용하여 downstream task에 대한 paramter를 학습합니다.</li>
</ul>
<p>이때, <strong>각각의 downstream task</strong>에 대한 <strong>pre-trained parameter</strong>가 같더라도 <strong>각 task는 각각의 fine-tuned model</strong>을 가진게 됩니다. </p>
<p>또한, <strong>pre-trained architecture와 fine-tuned 된 downstream architecture</strong>에는 큰 구조적 차이가 없으며, <strong>항상 동일한 Pre-trained model의 파라미터가 서로 다른 downstream tasks</strong>(QA, 번역 등)의 초기 값으로 사용됩니다. 이러한 초기값들은 fine-tuning 과정에서 downstream task에 맞게 조정됩니다.</p>
<h4 id="model-architecture">Model Architecture</h4>
<p>Bert의 모델 아키텍처는 multi-layer bidirectional Transformer encoder, 즉, <strong>양방향 Transformer encoder를 여러 층</strong> 쌓은 모습입니다.
두 가지의 모델을 제시합니다.:</p>
<ul>
<li>BERTBASE: 12개 레이어, hidden size 768, self-attention 헤드 12개, 총 매개변수 약 1억 1천만 개.</li>
<li>BERTLARGE: 24개 레이어, hidden size 1024, self-attention 헤드 16개, 총 매개변수 약 3억 4천만 개.</li>
</ul>
<p><strong>BERT base</strong>모델은 OpenAI의 GPT와의 비교를 위해 파라미터 수를 동일하게 만들어 진행하였습니다..</p>
<p>여기서 다시한번 GPT의 단점이 언급되는데, <strong>GPT</strong>는 모든 토큰이 <strong>왼쪽 토큰들과만 어텐션을 계산하는 constrained(제한된) self-attention이 사용</strong>되는 반면, <strong>BERT</strong>는 <strong>bidirectional(양방향) self-attention</strong>이 사용됩니다.</p>
<h4 id="inputoutput-representation">Input/Output Representation</h4>
<p>BERT가 다양한 down-stream tasks에 잘 적용되기 위해선** input representation이 애매하지 않아야** 합니다. 따라서 하나의 문장 혹은 한 쌍의 문장을 하나의 토큰 시퀀스로 분명하게 표현해야합니다.</p>
<blockquote>
<p><strong>&#39;sentence&#39;</strong>는, 언어학적인 sentence 즉 문장의 의미 뿐만 아니라 <strong>인접한 텍스트들의 임의의 범위라는 뜻</strong>도 포함합니다.</p>
</blockquote>
<p>이를 위해 <strong>BERT</strong>에서는 총 <strong>3가지의 Embedding vector를 합쳐서</strong> input으로 사용합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/678e8193-2ea7-4d5c-a7ed-ac3978b66385/image.png" alt=""></p>
<p>모든 sequence의 시작 부분에 [CLS] token를 추가한다. 해당 [CLS] token은 transformer 전체층을 다 거치고 나면 token sequence의 결합된 의미를 가지게 되는데, 여기에 classifier(feed-forward network와 softmax 함수를 이용)를 붙이면 단일 문장, 또는 연속된 문장의 classification을 할 수 있다. 이러한 특성 때문에 이는 곧 classification task에서 사용된다.</p>
<ul>
<li>[CLS] 토큰: 분류 작업에서 전체 시퀀스를 대표하는 특별 토큰.</li>
<li>[SEP] 토큰: 문장 구분자 역할.</li>
<li>WordPiece 임베딩(30,000개 어휘): 토큰화된 입력 텍스트를 임베딩 벡터로 변환.</li>
</ul>
<p>앞서 pair of sentence도 하나의 token sequence로 표현된다고 했습니다. 이를 위해, [SEP] token을 활용합니다. 모든 sentence의 끝에 [SEP] token을 추가해주는데 예를 들면, (&lt;Question, Answer&gt;)와 같은 pair of sentence는 ([CLS], Question, [SEP], Answer, [SEP])과 같은 sequence로 변환하는 것입니다. 그런 다음 각 token에 대해 embedding을 진행합니다.</p>
<p>정리하면 모든 Input 시퀀스의 첫번째 토큰은 [CLS] 토큰인데, [CLS] 토큰과 대응된는 최종 hidden state는 분류 문제를 해결하기 위해 sequence representation들을 종합한다.</p>
<p>또한,** Input 시퀀스는 문장의 한 쌍<strong>으로 구성된다. **문장 쌍의 각 문장들은 [SEP] 토큰으로 분리</strong>됩니다. 이 때, <strong>각 문장이 A문장인지, B문장인지 구분하기 위한 임베딩(Segment Embeddings)</strong>이 진행됩니다.</p>
<p><strong>Token Embeddings는 WordPiece embedding을 사용</strong>하고, <strong>Position Embeddings는 Transformer에서 사용한 방식과 동일</strong>합니다.</p>
<p><strong>Input representation</strong>은 <strong>segment + token + position</strong>을 전부 합치면 됩니다.</p>
<h4 id="pre-training-bert">Pre-training Bert</h4>
<p>위에서 잠깐 언급한 것처럼, BERT는 ELMo와 GPT와는 달리 전통적인 left-to-right 혹은 right-to-left language model을 통해 pre-train하지 않습는다. 대신 2개의 unsupervised task, MLM(Masked Language Model)와 NSP(next sentence prediction)를 통해 BERT를 pre-training 합니다.</p>
<h4 id="task-1-masked-lm">Task #1: Masked LM</h4>
<p>기존의 Language model을 bidirectional 하게 학습할 경우, 해당 timestep에서 예측하고자 하는 단어를 간접적으로 참조할 수 있기 때문에, 예측이 무의미해질 수 있습니다.</p>
<p><strong>Masked LM(MLM)</strong>은 <strong>이러한 문제를 해결하고 deep bidirectional representation을 학습</strong>하기 위해 도입된 개념입니다.</p>
<p><strong>BERT</strong>에서는 오직 <strong>[MASK] token</strong>만을 예측합니다. 
즉, <strong>MLM</strong>에서는 각각의 sequence에 존재하는 WordPiece token들 중에서 <strong>15%를 random 하게 masking *<em>합니다. 이러한 방법은 bidirectional pre-trained model을 얻을 수 있지만, pre-training에 존재하는 [MASK] token이 fine-tuning에는 존재하지 않기 때문에 *</em>pre-training과 fine-tuning 사이에 불일치를 일으킬 수 있다는 문제</strong>가 있습니다.</p>
<p>이러한 문제를 해결하고자, 본 연구에서는 <strong>masking 되는 sequence tokens의 15%를 전부 [MASK] token</strong>으로 바꾸지 않습니다.
그리고  <strong>15%의 [MASK] token</strong>에서 추가적인 처리를 더 해줍니다.</p>
<blockquote>
<ul>
<li>80%의 경우 : token을 <strong>[MASK] token</strong>으로 바꾼다. 
ex) my dog is hairy -&gt; my dog is [MASK]</li>
</ul>
</blockquote>
<ul>
<li>10%의 경우 : token을 <strong>random word</strong>로 바꾼다. 
ex) my dog is hairy -&gt; my dog is apple</li>
<li>10%의 경우 : token을 <strong>원래 단어 그대로</strong> 놔둔다. 
ex) my dog is hairy -&gt; my dog is hairy</li>
</ul>
<p>이 때, </p>
<ul>
<li><p>10%의 경우 <strong>(random word)</strong>: 무작위 단어로 바꾸면 모델의 성능이 떨어지지 않을까 생각할 수 있지만, 15%의 token 중에서 10%만을 바꾸는 것이므로 실제 비율은 1.5% 밖에 되지 않아 모델의 성능과는 상관없다고 합니다.</p>
</li>
<li><p>10%의 경우 <strong>(원래 단어)</strong>: 단어를 그대로 두는 것은 실제 관측 단어에 대한 representation을 bias해주기 위함이라고 합니다.</p>
</li>
</ul>
<h4 id="task--2-next-sentence-prediction-nsp">Task # 2: Next Sentence Prediction (NSP)</h4>
<p>많은 NLP의 downstream task는 두 문장 사이의 관계를 이해하는것이 핵심입니다. 이러한 문장 사이의 관계는 language modeling으로는 알아 낼 수 없는데, 이를 학습하기 위해 <strong>BERT모델은 binarized next sentence prediction(NSP)</strong>을 이용합니다.</p>
<p>NSP를 이용하면, pre-training example로 문장A와 B를 선택할때, <strong>50퍼센트는 실제 A의 다음 문장인 B를(IsNext)</strong>, <strong>나머지 50퍼센트는 랜덤 문장 B를(NotNext)</strong> 고르는 것입니다.</p>
<h4 id="pretraing-data">Pretraing data</h4>
<p><strong>Pretraining</strong> 과정은 많은 데이터를 필요로 하는데, 본 연구에서는 <strong>pretraining</strong>을 위해 800M 개의 words로 구성된 BookCorpus dataset과 2500개의 words로 이루어진 English Wikipedia dataset에서 text passage 만 사용했고, 목록이나 표 등은 제외하여 사용하였습니다.</p>
<p>또한, 긴 문맥을 학습하기 위해 Billion Word Benchmark와 같이 섞인 문장으로 구성된 데이터는 사용하지 않았다고 합니다.</p>
<h4 id="fine-tuning-bert">Fine-tuning BERT</h4>
<p><strong>Fine-tuning</strong>에서도 pretraining과 마찬가지로 <strong>single sentence와 pair of sentence(&lt;Question, Answer&gt;)를 하나의 token sequence로 바꿔주는 작업을 진행</strong>한다.</p>
<p>이후, 이렇게 만들어진 <strong>BERT의 input representation</strong>을 통해 <strong>parameter를 각각의 downstream task에 맞게 end-to-end로 fine-tune</strong> 한다.</p>
<p>이때, Sequence tagging이나 question answering 같이 token-level task 들의 경우, 마지막 transformer layer의 token들의 hidden state로부터 나오는 output을 이용하여 fine-tuning 합니다.</p>
<p>이 후 Sentence Classification, sentiment analysis 등의 s<strong>entence-level classification task</strong>들은 <strong>마지막 layer의 [CLS] token의 hidden state로부터 나오는 output을 통해 fine-tuning</strong>을 진행한다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/ae7526fa-6c04-428a-b673-59ee082ac742/image.png" alt=""></p>
<p>위 그림은 <strong>task별 fine-tuning</strong>에 대해 시각화한 자료이다.</p>
<p>Pretraining과 비교했을 때, <strong>fine-tuning</strong>은 빠르게 학습이 가능합니다.</p>
<h3 id="experiments">Experiments</h3>
<p>BERT는 다양한 NLP 벤치마크에서 최첨단 성능을 기록했습니다:</p>
<ul>
<li>GLUE 벤치마크: 평균 정확도 82.1%(BERTLARGE 기준).</li>
<li>SQuAD v1.1: F1 점수 93.2, 정확도(EM) 87.4.</li>
<li>SQuAD v2.0: F1 점수 83.1로 이전 최고 성능 대비 +5.1% 향상.</li>
</ul>
<h4 id="glue-벤치마크">GLUE 벤치마크</h4>
<p><strong>GLUE</strong>는 NLP 모델의 전반적인 언어 이해 능력을 평가하기 위해 설계된 벤치마크입니다. 다양한 언어 이해 작업을 포함하며, 모델이 여러 작업에서 얼마나 잘 일반화할 수 있는지를 측정합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/44edb68d-4b99-4d52-a503-d54a9819794e/image.png" alt=""></p>
<p>GLUE에 대한 자세한 리뷰: <a href="https://gbdai.tistory.com/51">https://gbdai.tistory.com/51</a></p>
<h4 id="squad-v11-stanford-question-answering-dataset-v11">SQuAD v1.1 (Stanford Question Answering Dataset v1.1)</h4>
<p><strong>SQuAD v1.1</strong>은 Stanford University에서 개발한 질의응답(QA) 데이터셋으로, 기계 독해(Machine Reading Comprehension) 능력을 평가하는 데 사용됩니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/635c24ff-fd5c-4b7a-a33f-7b02525276f6/image.png" alt=""></p>
<p>SQuAD v1.1은 NLP 모델이 텍스트 내에서 특정 정보를 정확히 찾아내는 능력을 측정하며, BERT와 같은 Transformer 기반 모델들이 이 데이터셋에서 뛰어난 성능을 기록했습니다.</p>
<h4 id="squad-v20">SQuAD v2.0</h4>
<p><strong>SQuAD v2.0</strong>은 제공된 passage에 answer이 존재하지 않을 가능성을 허용함으로써 SQuAD v1.1에서의 문제 정의를 확장한 버전입니다. 이를 BERT에 적용하기 위해, answer가 존재하는지에 대한 여부를 CLS token을 이용해 분류하는 과정을 추가합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/92bdd996-3c9f-41f6-ae72-96d4947bb80e/image.png" alt="">
SQuAD v2.0은 기존보다 더 현실적인 QA 시나리오를 반영하며, BERT와 같은 고성능 모델들이 이 데이터셋에서도 우수한 결과를 보였습니다.</p>
<h4 id="swag">SWAG</h4>
<p><strong>SWAG</strong>(The Situations With Adversarial Generations)은 앞 문장이 주어졌을 때, 보기로 주어진 4 문장 중 가장 잘 어울리는 문장을 찾는 task입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/c11b8b89-3edc-4e2a-8005-7e02ef1d00c7/image.png" alt="">
BERT는 압도적인 성능을 보여주며, 사람의 능력과 비슷한 성능을 보여주었습니다.</p>
<h3 id="5-ablation-studies">5. Ablation Studies</h3>
<h4 id="effect-of-pre-training-tasks">Effect of Pre-training Tasks</h4>
<p>BERT의 deep bidirectionality의 중요성을 역설하기 위해 BERT의 핵심 요소들이었던 MLM과 NSP를 하나씩 제거하면서 실험을 진행하였습니다. BERT-BASE를 기반으로 한 두 가지 model을 추가적으로 실험하는데 다음과 같습니다.</p>
<ol>
<li>MLM은 사용, NSP 미사용 (No NSP)</li>
<li>MLM을 사용하지 않고 대신 left-to-right을 사용, NSP 미사용 (LTR &amp; No NSP)</li>
</ol>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/92aa9b81-1c22-40ce-a7b8-2c5cd4d60c1d/image.png" alt="">
위의 그림을 통해 MLM과 NSP가 제거될 때마다 성능이 하락하는 것을 확인할 수 있다.
<strong>NSP를 미적용한 model</strong>의 경우 NLI task(MNLI, QNLI, SQuAD)에서의 성능이 BERT-BASE에 비해 매우 저조함을 확인할 수 있습니다. 즉, NSP가 두 문장 사이의 관계를 매우 잘 이해하도록 도와주는 것을 알 수 있습니다.</p>
<p><strong>No NSP와 LTR &amp; No NSP</strong>를 비교하여 MLM이 model에 미치는 영향을 확인해보면 MLM 대신 LTR을 사용하게 되면 전반적으로 성능이 크게 하락하는 것을 확인할 수 있습니다.</p>
<h4 id="effect-of-model-size">Effect of Model Size</h4>
<p>모델의 크기를 다르게 하면서 성능을 측정해보았습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/4489bbc1-e420-4636-92e3-c1d2e667ac2a/image.png" alt="">
모든 task에 대해 <strong>model size가 커질수록, 성능도 함께 향상</strong>되는 것을 확인할 수 있습니다. 
또한, MRPC dataset과 같이, downstream task를 수행하는 dataset의 크기가 작고 pre-training task와 상당히 다른 downstream task에서도 충분히 좋은 성능을 내는 것을 확인할 수 있습니다.</p>
<h4 id="feature-based-approach-with-bert">Feature-based Approach with BERT</h4>
<p>앞서 BERT의 결과들은 <strong>pretraining</strong>된 model에 simple classification layer를 추가하고, downstream task에서 모든 parameter가 공동으로 fine-tuned되는 <strong>fine-tuning approach</strong>를 사용하였다.</p>
<p>이번에는 <strong>fine-tuning approach</strong>대신 <strong>feature-based approach</strong>을 보았습니다.</p>
<p><strong>feature-based approach</strong>의 경우, transformer의 encoder로 쉽게 표현되지 않는 task가 존재하기에, 이런 경우에는 task-specific architecure를 추가합니다.  또한,  <strong>feature-based approach</strong>는 training data의 expensive representation을 사전에 구해놓은 뒤, representation 위에서 cheaper model을 통해 여러 번 실험을 진행하기에 computational benefit가 있습니다.</p>
<p>그래서, 논문에서는 BERT에서 두 방법론을 비교하고자 Named Entity Recognition(NER) task에 fine-tuning approach와 feature-based approach 모두 적용하여 실험을 진행하였습니다. <strong>feature-based approach</strong>의 경우, <strong>fine-tuning을 거치지 않은 BERT의 hidden layer들 중, 추출하는 layer의 개수를 다르게 하여 bidirectional LSTM의 input embedding으로 사용</strong>하였다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/7a634277-9057-4dc7-b49d-9624ac60ac5d/image.png" alt=""></p>
<p><strong>fine-tuning approach</strong>를 적용했을 때가 성능이 좋지만, <strong>pretraining 된 BERT의 마지막 4개의 hidden layer의 concat을 feature-based approach</strong>로 적용한 성능이 <strong>fine-tuning approach를 적용했을 때와 큰 차이가 없음</strong>을 알 수 있습니다.</p>
<p>즉, <strong>BERT는 fine-tuning approach와 feature-based approach 모두 효과적임</strong>을 알 수 있습니다.</p>
<h3 id="6-conclusion">6. Conclusion</h3>
<p><strong>BERT</strong>는 양방향 Transformer 기반 언어 모델로, 사전 학습과 미세 조정을 통해 다양한 NLP 작업에서 뛰어난 성능을 발휘합니다:</p>
<ul>
<li>Masked Language Model과 Next Sentence Prediction 목표를 통해 깊은 양방향 표현 학습 가능.</li>
<li>Task-specific 아키텍처 수정 없이 간단한 fine-tuning으로 적용 가능.</li>
<li>NLP 연구 및 응용 분야에서 SOTA를 달성.</li>
</ul>
<h3 id="마지막으로">마지막으로</h3>
<p>이번에는 BERT 논문을 다루어 보았습니다. BERT를 공부하고 찾아보면서, Text, Image 분야에서도 연관되어 사용되고, 사용될 수 있을 것 같아 보입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ViT ; AN IMAGE IS WORTH 16X16 WORDS:
TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/ViT-AN-IMAGE-IS-WORTH-16X16-WORDSTRANSFORMERS-FOR-IMAGE-RECOGNITION-AT-SCALE-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/ViT-AN-IMAGE-IS-WORTH-16X16-WORDSTRANSFORMERS-FOR-IMAGE-RECOGNITION-AT-SCALE-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Mon, 03 Feb 2025 10:08:03 GMT</pubDate>
            <description><![CDATA[<p>현 시점 경량화, 최적화 등을 포함해 ML/DL 분야에서 가장 많이 쓰이고 있는 방법론 중 하나인 <a href="https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Transformer</a>를 다루고, 다음으로 내가 공부하고 있는 이미지와 텍스트와 결합된 <strong>ViT(Visual Transformer)</strong>에 대해 다루고자 합니다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>Vision Transformer(ViT)</strong>는 컴퓨터 비전 분야에서 Transformer 모델을 적용한 혁신적인 접근법으로, 기존의 Convolutional Neural Networks(CNN, 합성곱 신경망) 기반 모델과는 다른 특징을 가지고 있습니다. ViT는 이미지를 여러 고정 크기의 패치로 분할하고, 이를 단어처럼 처리하여 Transformer 구조에 입력합니다. 이 모델은 특히 이미지 분류와 같은 작업에서 뛰어난 성능을 보이며, 대규모 데이터셋에서 CNN을 능가하는 결과를 보여주었습니다.</p>
<h3 id="2-related-work">2. RELATED WORK</h3>
<h4 id="nlp">NLP</h4>
<p>Transformer: 현재 많은 NLP Task에서 가장 좋은 성능을 보여주는 구조.
BERT: 노이즈를 제거하는 자기지도 사전학습을 수행 ; 양방향 언어 모델링
GPT: 언어 모델을 사전학습 태스크로 선정하여 수행 ; 일방향 언어 모델링</p>
<h4 id="기존-연구와-vit의-차별점">기존 연구와 ViT의 차별점</h4>
<p>표준 ImageNet 데이터셋보다 더 큰 크기의 데이터셋에서 image recognition 실험을 진행하여 더 큰 크기의 데이터셋에서 학습시킴으로써 기존의 ResNets 기반 CNN보다 더 좋은 성능을 낼 수 있었습니다.</p>
<h3 id="3-method">3. Method</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/4c4f5a75-49da-499d-bffb-ff0e329c34be/image.png" alt=""></p>
<h4 id="vision-transformervit">Vision Transformer(ViT)</h4>
<p>위의 그림은 ViT의 구조입니다.
Transformer Encoder는 Transformer와 비슷한 역할을 하고, Multi Head Attention의 구조는 기본적으로 Transformer의 형식을 따릅니다.</p>
<h4 id="patch-embedding">Patch Embedding</h4>
<p>기존의 <strong>Transformer는 1차원의 토큰 Embedding</strong>들의 Sequence를 입력으로 받습니다. 하지만 <strong>이미지는 2차원이기 때문에 2D이미지를 1차원으로 변환하기 위한 작업(Patch Embedding)</strong>을 합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/951b1f45-90a0-4782-bf1b-a529a4aeac45/image.png" alt=""></p>
<p>다음은 Patch Embedding에 대해 잘 표현한 그림이 있어 가져와봤습니다. (출처:<a href="https://velog.io/@pre_f_86/Vision-TransformerViT-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">https://velog.io/@pre_f_86/Vision-TransformerViT-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</a>)</p>
<p>위의 예시는 4×4×2의 이미지를 2×2 크기의 패치로 나누는 것으로 4크기의 벡터로 임베딩하는 것입니다. 그 과정을 정리해보면</p>
<ol>
<li><p>$$R^{H×W×C}$$ (H 높이,W 너비,C 채널) 에 해당하는 이미지를 P×P크기의 패치로 나누어 줍니다.</p>
</li>
<li><p>Flatten 작업을 해주어 $$R ^{N×(P^2 ⋅C)}$$ 로 만들어줍니다. (N=HW/P^2)</p>
</li>
<li><p>각 패치의 크기를 D크기의 벡터로 임베딩 하도록 합니다.</p>
</li>
<li><p>각 출력을 $$x_P^n$$ (n=1,…,N) 이라고 정의한다.</p>
</li>
<li><p>자연어 처리 분야에서 BERT라는 모델에서 사용되는 [Class] 토큰과 비슷하게 Input Embedding 맨 앞에 [Class] Patch를 넣어 줍니다.</p>
</li>
</ol>
<p>여기서 <strong>BERT</strong>에서의 <strong>[Class]</strong> 토큰은 입력할 때 의미를 가지고 있지 않은 토큰으로 모델 내부에서 다른 토큰들과의 정보를 주고받게되고 최종적으로 해당 문장에 대한 문맥 정보를 담는 토큰이 되어 이를 글 내에서의 감정 Classification과 같은 문제에 사용됩니다.</p>
<p>동일하게 [Class] Patch는 이후 Transformer Encoder의 출력($$z_L$$) 중 맨 앞($$z_L^0$$)에 대응되며 이는 Classification Head(MLP Head)에 입력으로 들어가 Classification 작업에 사용됩니다.</p>
<p>그 후 각 Embedding된 Patch들이 Encoder에 들어가기 전에 학습 가능한 Position Embedding을 더하여 각 Patch Embedding들에 위치에 대한 정보를 추가해줍니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/69eb08b8-1675-4625-b9cd-f484ade97620/image.png" alt="">
위의 동작들을 식으로 나타내면 다음과 같습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/752a6eb8-491b-4d76-b295-d055d268008a/image.png" alt=""></p>
<h4 id="inductive-bias">Inductive Bias</h4>
<p><strong>Inductive Bias</strong>는 학습에 사용되지 않은 데이터에 대해서 어떤 것에 대해 예측할 때 정확한 예측을 위해 사용하는 추가적인 가정입니다. CNN이나 RNN의 경우, <strong>Inductive Bias</strong>가 있어, Global한 영역에서의 처리가 어렵다는 단점이 있습니다.
하지만 <strong>ViT</strong>의 경우 <strong>Inductive Bias</strong>가 적습니다.
그렇다면** ViT는 왜 Inductive Bias가 적은지** 알아보겠습니다.</p>
<p>우선 <strong>CNN</strong>의 경우 필터가 <strong>Sliding Window</strong>처럼 이미지의 모든 영역을 스캔하는 방식과 비슷하게 작동하는 것과는 다르게 <strong>ViT</strong>는 <strong>이미지를 패치로 나누어 작동하며 MLP는 한 패치 내부에서만 Fully Conneted형식으로 작동</strong>합니다.</p>
<p><strong>Fully Connected</strong>형식은 픽셀에 대한 가중치로 연산을 하기 때문에 Convolution 연산과는 달리 <strong>MLP Layer에서만 Local 및 Translation Equivariance</strong>을 합니다.
이로 인해 <strong>전역에서 Local 및 Translation Equivarianc</strong>e하는 <strong>Convolution</strong>과 달리 <strong>Inductive Bias</strong>가 적다는 특징을 갖게 됩니다.</p>
<blockquote>
<p><strong>Translation Equivariance</strong> : Computer Vision에서 어떠한 객체를 검출하고자 할 때 해당 객체의 위치가 달라져도 동일하게 검출할 수 있도록 합니다. 즉, 입력의 위치가 달라져도 출력은 동일하다라는 것입니다.</p>
</blockquote>
<blockquote>
<p><strong>Locality</strong> : 말 그대로 지역성이라는 개념으로 이미지 내에서 정보는 특정 지역에 담겨져 있으며 이 지역적인 특징을 담기 위해서 CNN에서는 여러 크기의 필터를 통해 지역적인 정보를 담습니다.</p>
</blockquote>
<h4 id="hybrid-architecture">Hybrid Architecture</h4>
<p>Raw image patch에 대한 대안으로, 입력 시퀀스는 CNN의 특성 맵에서 형성될 수 있습니다. Hybrid Architecture에서, 패치 임베딩 projection E는 CNN으로부터 추출된 Feature Map에 Patch Embedding 벡터 E를 적용시킨다. </p>
<p>특정한 경우에, 패치는 공간 크기 1x1을 가질 수 있는데, 이는 단순히 특성 맵의 공간적 차원을 flattening하고 트랜스포머 차원으로 projecting함으로써 입력 시퀀스를 얻을 수 있다는 것이다.</p>
<h4 id="fine-tuning-and-higher-resolution">Fine-tuning and higher-resolution</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/370ad609-7638-438f-888a-9ca014c681e7/image.png" alt="">
(이미지 출처: <a href="https://daebaq27.tistory.com/108">https://daebaq27.tistory.com/108</a>)</p>
<p>사전 훈련 때보다 더 높은 해상도로 Fine-Tune 하는 것이 성능에 도움이 됩니다.
더 높은 해상도 및 Patch Size 동일하고 → Sequence 길이 증가하게 됩니다.
하지만 <strong>Fine-Tuning</strong> 시 <strong>Pre-trained Position Embedding은 더 이상 의미가 없어지게 된다</strong>는 단점이 있습니다.
이에 <strong>Pre-Trained Position Embedding</strong>을 통해 <strong>2D 보간(Interpolation)</strong>하여 값을 채워주게 됩니다.</p>
<h3 id="3-experiments">3. Experiments</h3>
<h4 id="model-variants">Model Variants</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a3dcae53-e324-42c9-b1f3-4a11338595b6/image.png" alt=""></p>
<p>BERT에서 제안된 모델과 동일하게 ViT-Base,ViT-Large 모델을 구성하고 따로 ViT-Huge 모델을 구성합니다.</p>
<ul>
<li>ViT-L/16 : &quot;Large&quot; 매개변수 크기 및 16x16 Input Patch 사용<h4 id="data-requirements">Data Requirements</h4>
ViT는 JFT-300M Dataset으로 사전학습시켰을 때 성능이 가장 좋았습니다.
그만큼 데이터 셋이 많으면 성능이 좋다는 것인데, 그럼 얼마나 많은 데이터셋이 필요한지에 대한 실험입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/854a6f8a-cbbc-4f3c-8c18-1f045f3a0349/image.png" alt="">
위 그림은 사전학습 시킨 데이터셋 별로 이후 같은 데이터셋(ImageNet)으로 Fine-Tuning한 성능 비교표입니다.</li>
</ul>
<p>X축의 좌측부터 우측으로 데이터셋의 크기가 증가합니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/3fc37ec5-040f-4cb2-9c21-d1e8059efe0f/image.png" alt=""></p>
<p>위 그림은 데이터셋의 크기에 따른 사전 학습 후 전이 학습 성능 비교입니다. 
ResNet에 비해 데이터의 크기가 커지면 커질 수록 ViT의 성능 향상이 급격하게 증가됨을 알 수 있습니다.</p>
<h4 id="scaling-study">Scaling Study</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/da358561-da86-40fb-a760-f8f72d62fe46/image.png" alt="">
위 그림의 두 표를 비교해보면 모두 비슷한 양상을 보이며 같은 성능을 내기 위해 ViT가 BiT에 비해 약 2~4배정도의 적은 FLOPs를 소비한다는 것을 알 수 있습니다.
Hybrid 모델에서는 적은 Computational Cost에서는 ViT보다 성능이 좋지만 이후 차이는 점점 줄어들게 됩니다.</p>
<h4 id="sota와의-비교실험">SOTA와의 비교실험</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/c1fe6d77-fdbb-4c87-9a0f-f1cb6f8eae1a/image.png" alt=""></p>
<ul>
<li>전이학습 평가를 위한 각 데이터셋 별 ViT 모델과 기존 전이학습 SOTA CNN 모델과의 (BiT-L / NoisyStudent) 성능 비교합니다.</li>
<li>Fine-tuning을 각각 3번 진행하고 정확도의 평균과 표준편차를 계산하여 정확성을 평가합니다.</li>
<li>TPUv3-core-days = 사전학습 시 사용된 코어 수 X 소요 일수 (효율성을 평가하는 지표)</li>
<li>중간 사이즈의 데이터셋: Baseline &gt; ViT ; 큰 사이즈의 데이터셋: ViT &gt; Baseline</li>
<li>ViT의 경우 모델 파라미터(모델 규모)가 증가하고, 데이터셋의 크기가 증가할수록 지속적으로 성능이 증가합니다.</li>
</ul>
<h3 id="5-conclusion">5. Conclusion</h3>
<p>본 연구는 Transformer를 이미지 인식 태스크에 직접적으로 적용하는 과정을 탐구합니다. Computer Vision 분야에 self-attention을 사용한 선행 연구들과는 달리, 본 논문에서는 initial patch와 extraction step을 제외하면 image-specific한 귀납 편향을 네트워크 구조에 반영하지 않습니다. 
그대신, 이미지를 패치 시퀀스로 해석하여, NLP에서처럼 표준 트랜스포머 인코더를 통해 처리한다. 이러한 단순하면서도 확장성 있는 방법은 대규모의 데이터셋에서 사전학습과 더불어 사용되었을 때 상당히 잘 작용한다. 
이로인해, 비전 트랜스포머가 많은 이미지 분류 데이터셋의 SOTA 모델들과 필적하거나 그들을 뛰어넘으면서도, 사전학습 비용을 상대적으로 절감할 수 있다는 장점이 있습니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>Transformer에 이어 ViT 논문을 리뷰해보았습니다. ViT 논문을 리뷰하면서 Vision Task관련 이해도가 조금은 증가할 수 있었고, 앞으로 BERT, GPT, LoRA와 같은 주제도 얼른 리뷰하고자 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Attention Is All You Need(Transformer) 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Attention-Is-All-You-NeedTransformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 02 Feb 2025 17:10:03 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문: <a href="https://arxiv.org/abs/1706.03762">https://arxiv.org/abs/1706.03762</a></p>
</blockquote>
<h3 id="리뷰에-앞서">리뷰에 앞서</h3>
<p>Gaussian Splatting과 Stable Diffusion 등을 공부하면서 효율적인 연산 구조와 경량화된 설계에 대해 관심을 가지게 되었다. 하지만 경량화와 Efficient 관련해서는 노베이스이기에 (LoRA, BERT, U-NET 등에 대해 간단히는 알고 있지만) 최근 경량화 관련 최고의 방법론 중 하나인 <strong>Attention Is All You Need, Transformer</strong> 아키텍처에 대해 공부하였고, 이 논문 리뷰를 작성하고자 한다. 또한 다양한 분야에서 효율성을 극대화하는 딥러닝 모델 설계 방법론에 대해 더욱이 공부하고자 한다.</p>
<h3 id="1-introduction">1. Introduction</h3>
<p><strong>RNN</strong>은 LSTM과 함께 기존 자연어 처리 task에서 가장 많이 쓰이는 모델이였습니다.</p>
<p>자연어 처리에서 문장을 처리할때 문장에 사용된 단어의 위치는 굉장히 중요합니다. 기존의 자연어 처리 task에서 RNN, LSTM이 자주 활용되었던 이유는 이러한 모델이 단어의 위치와 순서정보를 잘 활용했기 때문입니다.
그러나 RNN은 순차적으로 첫번째로 입력된 단어부터 마지막으로 입력된 단어까지 인코딩하기 때문에 문장의 길이가 길어지면 학습 능력이 현저하게 떨어집니다. (일명 Long-Term Dependency Problem) </p>
<p><strong>Transformer</strong>는 이러한 과정을 병렬적으로 처리하기 때문에 RNN보다 성능과 속도면에서 훨씬 뛰어납니다. 이때, RNN 설명때에 언급된 자연어 처리 task에서 단어의 위치정보는 굉장히 중요한데, RNN을 사용하지 않는 Transformer는 새로운 방법을 통해 단어의 위치정보를 활용합니다.
바로 <strong>Positional encoding</strong>입니다.</p>
<h4 id="positional-encoding">Positional encoding</h4>
<p><strong>Positional Encoding</strong>은 Transformer의 굉장히 중요한 특징 중 하나입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/d5509852-7220-431f-acd9-367af60123c5/image.png" alt="">
Positional encoding은 sin-cos 함수로 구성된 값을 Q, K, V에 각각 더해준 다음에 Transformer에 input하게 됩니다. Positional encoding을 해주는 이유는, Transformer가 단어의 연관성을 잘 파악할 수 있다는 장점이 있지만, RNN처럼 순차적으로 넣어주는 구조가 아니기 때문에, 단어에 대한 위치정보가 담길 수 없습니다. 따라서 각 단어의 위치정보를 알려주기 위해, 순서를 알려주기 위해서 positional encoding을 진행하는 것이다. Positional encoding에 대해서는 아래에서 더 자세히 다룰 예정입니다.</p>
<p>이제 Transformer 모델 구조에 대해 알아보기에 앞서 배경지식부터 알아가보자 합니다.</p>
<h3 id="2-background">2. Background</h3>
<p>Attention 메커니즘이 나온 2015년 전까지만해도 기계번역에서 가장 많이 쓰이던 모델은 <strong>Seq2Seq</strong> 모델이였습니다.Seq2Seq은 LSTM을 활용해서 만든것인데, LSTM을 활용하면 다양한 시퀀스 정보를 모델링 할 수 있습니다. 
다만, Seq2Seq는 고정된 크기의 context vector를 사용하고 있기 때문에 주어진 문장을 전부 고정된 크기의 한 벡터에 압축을 할 필요가 있고 이는 성능적인 한계에 부딪힌다는 단점이 있습니다. 더 자세한 설명을 위해 Seq2Seq 구조를 살펴보겠습니다.</p>
<h4 id="seq2seq">Seq2Seq</h4>
<p>Seq2Seq모델의 가장 큰 문제점은 context vector v에 소스 문장의 정보를 압축한다는 것입니다. 이때, 한번에 처리 가능한 데이터의 양보다 많은 양의 데이터가 들어오게 되면 처리 할 수 없는 상태가 되는데 이를 병목(bottleneck)현상이라고 부릅니다. 병목현상이 발생하게 되면 성능이 크게 하락하게 됩니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/aaeac9c8-0992-4108-a63e-b95df689a8d0/image.png" alt=""></p>
<p>학습 과정은 다음과 같습니다.</p>
<ol>
<li>매번 단어가 입력될 때 마다 hidden state 값을 갱신한다.(h1,h2,h3,h4 ...)</li>
<li>이런 hidden state(h값)은 이전까지 입력되었던 단어들에 대한 정보를 갖고있기 때문에 마지막 단어가 들어왔을때 나오는 hidden state 값은 소스 문장 전체를 대표하는 하나의 context vector로서 사용할 수 있다.
따라서 context vector는 소스문장 문맥적인 정보 전체를 담고있다고 생각 할 수 있다.</li>
<li>디코더 파트에서는 출력단어가 들어올때마다 context vector로부터 hidden state(s1,s2,s3 ...)를 만들어서 매번 출력을 내보낸다.</li>
<li>다음 단계에서는 이전에 출력했던 단어가 다시 입력으로 들어와서 이전 hidden state와 함께 새로운 hidden state(s1,s2,...)를 갱신한다. (end of sentence가 나올때까지(<eos>))</li>
</ol>
<p>하지만 앞서 말한 것처럼 입력문장이 매우 길 경우 문장의 모든 문맥 정보를 하나의 context vector에 넣어두기는 어려움이 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/7b7d30a2-5804-4b67-b4ed-c145b4a44eed/image.png" alt=""></p>
<p>이를 보안하기 위해 논문에서 제시한 방법은 Attention 메커니즘을 이용하는 것입니다.</p>
<h4 id="attention-매커니즘">Attention 매커니즘</h4>
<p>Attention 메커니즘은 디코더부분에서 output을 만들때 인코더의 hidden state들을 전부 참고해서 만드는것입니다.
 <img src="https://velog.velcdn.com/images/holiday_donghun/post/f4c90709-4835-4041-b13b-b4d771e8a5ea/image.png" alt=""></p>
<p><strong>Attention은 단어를 embedding</strong> 해주는 개념이라고 생각하면 편합니다. 
여기서 주의해야할 점은 단어를 개별적으로 input을 하는 것이 아니라, senetence 단위로 input을 한다는 것입니다.
그리고 <strong>Q(query), K(key), V(value)</strong>라는 값을 통해서, sentence를 구성하는 단어들 간의 연관성을 파악을 합니다.</p>
<h4 id="query-key-value">Query, Key, Value</h4>
<p><strong>Attention</strong>에 <strong>Query(Q), Key(K), Value(V)</strong>라는 Matrix가 들어가게 됩니다.
여기서</p>
<ul>
<li><strong>Q</strong>: Word matrix (단어 행렬)</li>
<li><strong>K</strong>: Similariy matrix (유사도 행렬)</li>
<li><strong>V</strong>: Weight matrix (가중치 행렬)</li>
</ul>
<p>또한 Q, K, V 전부 단어에 대한 vector를 가지고 있는 matrix 입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/2f1018bc-7512-4829-9e70-8b3c80441e33/image.png" alt="">
그리고 Q, K, V는 들어가기 전에 각자의 가중치를 곱해줍니다.
Q, K, V에 Positional encoding이 더해진 형태로 Transformer에 들어갑니다. 
실질적으로 Q, K, V의 input matrix 값은 동일합니다. W를 통해서 서서히 변화를 한다고 보면 됩니다.</p>
<p>Q와 K를 행렬곱하고 스케일링 -&gt; 마스크 -&gt; 소프트맥스를 취해 어떤 단어와 가장 높은 연관성을 갖는지 비율을 구하고 그 확률값과 Value값을 곱해서 가중치가 적용된 결과적인 attension value(수치)를 구할 수 있습니다. 이 과정 (Q와 K를 행렬곱하고 스케일링 -&gt; 마스크 -&gt; 소프트맥스)애 대해 조금 더 자세히 알아보면,
  <img src="https://velog.velcdn.com/images/holiday_donghun/post/7abb257d-cfd9-472c-82ef-5850c47007e4/image.png" alt=""></p>
<ol>
<li>위의 사진처럼 <strong>Q와 KT 간의 내적 계산(dot-product)</strong>를 수행해줍니다.
이때 나온 output이 단어 간의 벡터 계산이기 때문에 Similarity(유사도)로 표현이 가능합니다.
그 후 단어의 유사도를 서로 계산해줍니다.</li>
<li><strong>단어 matrix의 dimension을 similarity matrix에 나눠줍니다!</strong>
이를 scaling 과정이라고 하는데, 만약 scaling을 적용하지 않으면 추후에 softmax 함수를 적용했을 때, 쉽게 0에 가까워지게 됩니다. 이를 방지하기 위해 scaling을 해줍니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/6330c41b-f895-49c6-8859-fa0d524075e1/image.png" alt=""></p>
<ol start="3">
<li><p><strong>softmax</strong>를 적용합니다.
softmax를 적용한 값은 행에 있는 단어가 열에 있는 단어와 얼마나 잘 매핑되었는지 알려줄 수 있는 지표로 활용합니다.</p>
<ol start="4">
<li><strong>V matrix</strong>, 다시 말해 weights matrix를 곱해줍니다.
이 과정은 softmax로 부터 나온 matrix의 값이 서로 비슷하다면, V를 활용해서 특정 단어에게 가중치를 주어 softmax로 나온 단어간의 관계성 나타내줍니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a35aa823-1bcb-4aab-beb1-175c145fdb7d/image.png" alt="">
위의 과정을 정리하면 위의 식으로 표현이 가능합니다. 
Attention을 통해서 나온 단어들은 sentence안에서 자신을 잘 표현할 수 있는 word embedding 형태로 만들어져서 나오게 됩니다. 그리고 이 과정을 논문에서는 <strong>Multi-head Attention</strong>이라고 부르고 있습니다.</p>
</li>
</ol>
<p>트랜스포머에는 총 세가지 종류의 어텐션이 있습니다.</p>
<p><strong>1. Encoder Self-Attention
2. Masked Decoder Self-Attention
3. Encoder-Decoder Attention</strong></p>
<p>그 전에 Encoder와 Decoder가 무엇인지 알아보고자 합니다.</p>
<hr>
<h4 id="encoder">Encoder</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/507b9d08-c252-4b3b-9ca0-802dafc7adbe/image.png" alt="">
Encoder는 작동 방식은 다음과 같습니다.</p>
<ol>
<li><strong>단어의 embedding</strong>이 들어갔을 때, <strong>positional encoding</strong>을 적용해서 더해준다.</li>
<li><strong>더해준 형태의 Matrix를 Multi-Head-Attention</strong>에 적용한다.</li>
<li>Residual network의 형태로, <strong>그 전의 값을 더해준 후 normalization</strong>을 적용한다.</li>
<li><strong>Feed Forward network</strong>에 적용한 후 <strong>Add&amp;Norm</strong>을 수행한다.</li>
<li>위의 과정을 <strong>N번 수행해서 encoder에 대한 embedding</strong>을 만든다.</li>
</ol>
<h4 id="decoder">Decoder</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/e9e9a4f5-6635-4e2b-98ff-b5e2e7d98c23/image.png" alt="">
Decoder는 작동 방식은 다음과 같습니다.</p>
<ol>
<li>Output으로 들어갈 <strong>word embedding을 넣어준 후 positional embedding</strong>을 수행한다.</li>
<li><strong>Masked Decoder Self-Attention</strong>을 수행한다.</li>
<li><strong>Add&amp;Norm</strong>을 수행한다.</li>
<li>Encoder에서 나온 <strong>embedding을 V, K</strong>로 이용하고, 그 전 layer에서 얻은 <strong>decoder embedding을 Q</strong>로 Multi-Head-Attention에 넣는다.</li>
<li>Add&amp;Norm을 수행한 후, Feed Forward network에 입력한 다음에 다시 Add&amp;Norm을 수행한다.</li>
<li>위의 과정을 총 N번 반복한다.</li>
<li><strong>Linear와 softmax</strong>를 적용해서 각 단어들에 대한 확률값을 얻는다.</li>
</ol>
<p><strong>Transformer가 번역 task를 수행한다 했을 때, Decoder에서 나오는 값이 번역에 대한 결과입니다.</strong></p>
<hr>
<h4 id="encoder-self-attention">Encoder Self-Attention</h4>
<p>Encoder 파트에서 진행되는 Attention은 <strong>self-attention</strong>입니다. <strong>self-attention</strong>이란 입력 시퀀스 내에서 각 단어가 다른 단어와 얼마나 관련이 있는지를 계산합니다. 
<strong>self attention</strong>은 Encoder와 Decoder 모두에서 사용됩니다.
이를 통해 매번 입력 문장에서 각 단어가 다른 어떤 단어와 연관성이 높은지 계산 할 수 있다.
<strong>I am a teacher</strong>의 경우 <strong>I, am, a, teacher</strong>가 각각 서로에게 attention score를 구해서 어떤 다른 단어와 높은 연관성을 갖는지 알 수 있게 됩니다.</p>
<p>또한 잔여학습과 같은 테크닉을 통해 성능을 향상시켜주는데, 잔여학습은 보통 ResNet과 같은 이미지 분류 네트워크에서 사용됩니다.
<strong>잔여학습</strong>에 대해 간단하게 설명하자면,
잔여학습이란 어떠한 값을 레이어를 거쳐서 반복적으로 단순 갱신하는 것이 아니라 특정 레이어를 건너뛰면서 입력 할 수 있도록 만드는 것입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/c5b5e14f-d189-4c1a-ba16-92cafda29e6d/image.png" alt=""></p>
<p>Encoder에서는 아래와 같이 어텐션과 정규화(Norm)과정을 반복하는 방식으로 여러개의 레이어를 중첩해서 사용할 수 있는데, 각 레이어는 서로 다른 파라미터를 갖음에도 입력되는 값과 출력되는 값의 dimension은 서로 동일하기 때문입니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/98a0c46e-b877-4eea-b833-fdf09271dd9f/image.png" alt="">
그리고 이 그림의 오른쪽은 Decode인데, 그림과 같이 Encoder에서 가장 마지막 레이어에서 나온 출력값은 Decoder에 들어가게 됩니다.
이는 Decoder에서 매번 출력할때마다 소스 문장에서 어떤 단어에게 초점을 둬야하는지 알려주기 위함입니다. 따라서 각 레이어는 인코더의 마지막 레이어에서 나온 출력값을 입력으로 받게됩니다.
그리고 Decoder의 마지막 레이어에서 나온 값이 바로 실제로 우리가 번역을 수행한 결과(=출력 단어)입니다.</p>
<h4 id="masked-decoder-self-attention">Masked Decoder Self-Attention</h4>
<p>Decoder에서 attention을 수행할 때는 Encoder와 달리 주의해야할 요소가 있습니다. 바로 앞쪽 단어에서만 참고하는 것입니다. 왜냐하면 뒤쪽 단어를 참고하면 Cheating하게 되는 것이기 때문입니다. 그리고 이 과정은 마스크 행렬(mask matrix)를 이용해 특정 단어는 무시할 수 있도록 합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/37773581-7a59-42fc-80b2-6b558b797e01/image.png" alt="">
마스크 값으로는 음수 무한의 값을 넣어 softmax 함수의 출력이 0에 가까워지도록 합니다.</p>
<h4 id="encoder-decoder-attention">Encoder-Decoder Attention</h4>
<p>앞서 말한 Query,Key,Value에 대해 추가로 언급하면, Query는 디코더에 있고, Key와 Value는 인코더에 있습니다.
디코더 레이어에서는 두 종류의 Attention method가 사용되는데 <strong>self attention(masked)</strong>과 <strong>Encoder-Decoder attention</strong>입니다.</p>
<p>self attention은 먼저 수행되는 attention으로 인코더파트와 마찬가지로 각각의 단어들이 서로가 서로에게 어떤 가중치를 갖는지 구하도록 만들어 출력 문장의 전반적인 표현을 학습할 수 있도록합니다.</p>
<p>반면,<strong>Encoder-Decoder attention</strong>은 디코더가 인코더에 대한 정보를 어텐션 할 수 있도록 합니다.다시 말해, 각각의 출력단어가 소스문장에서의 어떤 단어와 연관성이 있는지 구해줍니다.</p>
<p>디코더 레이어 역시 input dimension과 output dimension을 같게 만들어줘서 여러 레이어를 중첩해서 사용할 수 있도록 합니다.</p>
<p>이를 통해 알 수 있는 점은 기존의 <strong>RNN, LSTM</strong>을 사용할 때에는 <strong>입력 단어의 갯수만큼 레이어를 거쳐서 매번 hidden state</strong>를 만들었다면,** Transformer<strong>에서는 **입력 단어 자체가 쭉 연결되어서 한번에 입력되기 때문에 병렬적으로 출력값을 구할 수 있다</strong>는 것입니다.</p>
<h4 id="positional-encoding-1">Positional Encoding</h4>
<p>초반부에서 Positional Encoding에 대해 간단히 다루었습니다. Positional encoding은 sin-cos 함수로 구성된 값이라고 하였는데, sin,cos 이용하는 이유에 대해 설명하고자 합니다.
그 이유는 바로 정수값(1,2,3, ...)으로 위치 정보를 표현하게 된다면 시퀀스 길이가 커졌을때 인덱스 역시 커지므로 훈련이 매우 불안정해질 수 있습니다. 그렇다면 만약 &quot;[0,1] 구간의 비율로 나누면 되지않을까?&quot;라는 궁금증이 들 수도 있습니다.
이렇게 비율을 사용하는 경우, &#39;0.9&#39;라는 값이 나오게 되었을 때, 시퀀스의 길이가 10이라면 9번째 원소를 의미하고, 100이라면 90번째 원소를 의미하게 되어 길이에 따라서 encoding의 의미가 달라지게 된다는 문제점이 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f289fdc7-74ca-411f-bfbb-4a34c1d0e394/image.png" alt=""></p>
<p><strong>따라서 sin,cos함수를 사용하는 것입니다.</strong> 그리고 각 단어의 상대적인 위치 정보를 네트워크에 입력합니다. 그렇게 되면 <strong>1.</strong> 각각의 고유한 토큰 위치값은 유일한 값을 가지고, <strong>2.</strong> 학습 데이터중 가장 긴 문장보다도 긴 문장이 실제 데이터에서 들어와도 에러 없이 인코딩 값을 줄 수 있습니다. 또한 <strong>3.</strong> 함수에 따른 토큰 위치의 값을 예측 할 수 있게 됩니다.</p>
<h3 id="result">Result</h3>
<p>논문에서는 Transformer를 WMT 2014 데이터셋을 사용한 영어-독일어 및 영어-프랑스어 번역 작업에 적용하여 다음과 같은 결과를 얻었습니다:
  <img src="https://velog.velcdn.com/images/holiday_donghun/post/0374fb6f-9d77-407f-96c3-230b2baffc06/image.png" alt=""></p>
<ul>
<li>영어-독일어 번역: BLEU 점수 28.4.</li>
<li>영어-프랑스어 번역: BLEU 점수 41.8.</li>
</ul>
<p>이는 기존 최고 성능 모델보다 더 높은 점수이며, 학습 시간 또한 크게 단축되었습니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>Transformer를 논문과 여러 블로그, 영상으로만 봤을 때는 간단하다고 생각했는데, 이를 글로 정리하여 쓰다보니 몇 일이 걸리는 대장정이 될 정도로 새롭게 배운 내용이 많았다. 앞으로 Transformer 관련된 더 많은 주제들을 공부하여 내가 공부하고 있는 이미지 생성의 경량화에 대해서도 공부하고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[
Stable Video Diffusion: Scaling Latent Video Diffusion Models to Large Datasets(SVD) 논문 리뷰
]]></title>
            <link>https://velog.io/@holiday_donghun/Stable-Video-Diffusion-Scaling-Latent-Video-Diffusion-Models-to-Large-DatasetsSVD-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Stable-Video-Diffusion-Scaling-Latent-Video-Diffusion-Models-to-Large-DatasetsSVD-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 02 Feb 2025 13:42:24 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>논문 : <a href="https://stability.ai/research/stable-video-diffusion-scaling-latent-video-diffusion-models-to-large-datasets">https://stability.ai/research/stable-video-diffusion-scaling-latent-video-diffusion-models-to-large-datasets</a>
github : <a href="https://github.com/stability-ai/generative-models">https://github.com/stability-ai/generative-models</a></p>
</blockquote>
<h3 id="introduction">Introduction</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/b0d118c0-02cc-433c-bef8-eecdd2a8fe27/image.png" alt=""></p>
<p><strong>Stable Video Diffusion(SVD)</strong>는 고해상도 텍스트-비디오(text-to-video) 및 이미지-비디오(image-to-video) 생성을 위한 최첨단 잠재 비디오 확산 모델(latent video diffusion model)입니다. 이 논문은 기존 2D 이미지 합성을 위한 잠재 확산 모델(Latent Diffusion Model, LDM)을 비디오 생성으로 확장한 연구를 다루고 있습니다. 이를 위해 시간적 레이어(temporal layers)를 추가하고, 소규모 고품질 비디오 데이터셋에서 파인튜닝(finetuning)을 수행하는 방식이 사용됩니다.</p>
<p>기존 연구에서는 비디오 생성 모델의 학습 방법과 데이터 큐레이션(data curation)에 대해 통일된 전략이 부재했습니다. 이에 따라 본 논문은 성공적인 비디오 LDM 학습을 위해 세 가지 주요 단계를 제안합니다:</p>
<p><strong>1. text-to-image pretraining
2. 대규모 video pretraining(대규모 비디오 사전학습)
3. high-quality video finetuning</strong></p>
<p>논문은 특히 데이터 큐레이션의 중요성을 강조하며, 잘 큐레이션된 데이터셋이 고품질 비디오 생성을 가능하게 한다는 점을 실험적으로 입증했습니다</p>
<h3 id="2-background">2. Background</h3>
<p>Stable Video Diffusion은 여러 선행 연구를 기반으로 하고 있습니다. 주요 관련 연구는 다음과 같습니다:</p>
<ol>
<li><strong>Latent Diffusion Models (LDMs)</strong>: LDM은 이미지 데이터를 잠재 공간(latent space)으로 압축하여 계산 효율성을 높이는 방식으로 작동합니다. <strong>Stable Diffusion</strong>과 같은 이미지 생성 모델에서 널리 사용되었습니다.</li>
<li><strong>시간적 확장(Temporal Extension)</strong>: 기존 2D 이미지 LDM에 시간적 레이어를 추가하여 비디오 생성을 가능하게 하는 연구들이 진행되었습니다.</li>
<li><strong>데이터 큐레이션(Data Curation)</strong>: 학습 데이터의 품질과 다양성이 생성 모델의 성능에 미치는 영향을 다룬 연구들이 있으며, 특히 대규모 데이터셋에서 효과적인 필터링 및 캡셔닝(captioning) 전략이 중요합니다.</li>
</ol>
<p>논문은 이러한 선행 연구들을 기반으로, 텍스트-비디오 및 이미지-비디오 생성 작업에서 SVD의 성능을 극대화하기 위한 새로운 접근법을 제안합니다.</p>
<h3 id="3-curating-data-for-hq-video-synthesis">3. Curating Data for HQ Video Synthesis</h3>
<h4 id="data-processing-and-annotation">Data Processing and Annotation</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/08e48ded-875d-4d9f-8daf-404e6da7a237/image.png" alt=""></p>
<p>Cut detection pipeline을 통해 메타데이터의 3가지 다른 FPS 수준에서 훨씬 더 많은 클립을 얻습니다.</p>
<p><strong>Coca</strong>로 클립의 중간 프레임에 대한 이미지 캡션을 얻고,** V-BLIP**로 비디오에 대한 캡션을 얻은 후 LLM을 통해 클립에 대한 3번째 설명을 생성합니다..</p>
<hr>
<h4 id="coca-contrastive-captioners-are-image-text-foundation-models">Coca: Contrastive Captioners are Image-Text Foundation Models</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/c8d8efc0-4fe1-40e5-8258-59a153ef8e70/image.png" alt="">
<strong>CoCa(Contrastive Captioners)</strong>는 이미지-텍스트 기반의 기초 모델로, CLIP의 대조 학습(Contrastive Loss)과 SimVLM의 생성적 캡셔닝(Captioning Loss)을 결합한 사전 학습 방식을 사용합니다. 이 모델은 이미지와 텍스트를 인코더-디코더 구조로 처리하며, 디코더의 전반부는 단일 모달 텍스트 표현을 인코딩하고 후반부는 이미지와 텍스트 간 멀티모달 표현을 생성합니다. 대조 학습과 캡셔닝 손실을 효율적으로 통합하여 다양한 비전 및 비전-언어 태스크에서 최첨단 성능을 달성했다고 합니다.</p>
<h4 id="v-blip">V-BLIP**</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a6d4845e-f3e2-408a-bb0d-68009900aab4/image.png" alt="">
<strong>V-BLIP</strong>은 BLIP(언어-이미지 사전학습 모델)를 비디오 생성 및 이해 작업으로 확장한 모델입니다. 기존 BLIP의 이미지-텍스트 대조 학습과 캡셔닝 기법을 활용하며, 시간적 정보를 처리하기 위해 비디오 데이터를 추가로 학습합니다. 이를 통해 텍스트-비디오 검색, 비디오 캡셔닝, 비디오 질문 응답 등 다양한 비디오-언어 태스크에서 강력한 성능을 발휘하며, 제로샷 전이 능력 또한 우수하다고 합니다.</p>
<hr>
<p>Large Video Dataset (LVD)이라고 부르는 초기 데이터셋은 580M의 video-clip pair로 구성됩니다. 이 후 OpenCV를 통해 <strong>dense optical flow</strong>를 계산하고 움직임이 적은 정적인 클립을 제거합니다.</p>
<p>여기서 <strong>dense optical flow</strong>는 연속된 두 프레임 간 모든 픽셀의 움직임을 계산하여, 이미지 내 모든 점에 대한 변위 벡터 필드를 생성하고, 프레임의 모든 포인트에 대해 광학 흐름을 계산하며, Gunner Farneback의 알고리즘이라고 합니다.</p>
<ul>
<li>모든 픽셀에 대해 움직임 벡터 계산</li>
<li>연속된 두 프레임 간의 변화 분석</li>
<li>움직임의 방향과 크기 정보 제공</li>
<li>계산 비용이 높지만 상세한 움직임 정보 제공</li>
</ul>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/a569e763-ce58-4f45-9173-3fcbe6875546/image.png" alt=""></p>
<p><strong>OCR detection</strong>을 통해 텍스트가 포함된 클립 제거. 각 클립의 처음, 중간, 마지막 프레임에 <strong>CLIP 임베딩</strong>을 부여하여 aesthetics score, text-image 유사성 계산합니다.</p>
<p><strong>OCR detection</strong>은 OCR(광학 문자 인식)에서 Text Detection은 이미지 속 문자가 있는 영역을 찾아내는 과정입니다. 이는 객체 탐지(Object Detection) 문제를 문자 탐지로 확장한 것으로, CNN 기반의 모델이 주로 사용됩니다. 검출된 영역은 문자를 인식하여 디지털 텍스트로 변환됩니다.</p>
<h4 id="stage-i-image-pretaining">Stage I: Image Pretaining</h4>
<p>첫 번째 단계는 텍스트-이미지 생성 작업을 위한 사전학습입니다. 이는 기존 <a href="https://velog.io/@holiday_donghun/Stable-Diffusion-High-Resolution-Image-Synthesis-with-Latent-Diffusion-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">Stable Diffusion</a> 모델(예: Stable Diffusion v2.1)을 기반으로 하며, 다음과 같은 수식을 따릅니다:
$$p_
θ
(
x_{
t
−
1}
∣
x_
t
,
c
)
=
N
(
x_{
t
−
1}
;
μ_
θ
(
x_
t
,
t
,
c
)
,
Σ_
θ
(
x_
t
,
t
)
$$</p>
<p>여기서 $$x_
t$$는 시간 t에서의 잠재 벡터(latent vector),c는 조건(condition), $$
μ_ θ$$ 와 $$Σ_θ$$는 신경망으로 파라미터화된 평균(mean)과 분산(variance)을 나타냅니다.
이 단계는 텍스트 프롬프트와 이미지 간의 관계를 학습하며, 이후 비디오 생성 작업에 필요한 기초를 제공합니다.</p>
<h4 id="stage-ii-curating-a-video-pretraining-dataset">Stage II: Curating a Video Pretraining Dataset</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/45164b2f-31a5-4c3c-a0b8-28f045205311/image.png" alt="">
각 유형의 annotation(CLIP score, aesthetic score, OCR detection rate, synthetic caption, optical flow score)에서 하위 12.5%, 25%, 50%를 제거한 각 하위 집합에 대해 동일한 모델을 훈련하고, 인간 선호도 투표에 대한 Elo ranking을 평가합니다. 이를 통해 각 annotation에 대한 최적의 필터링 임계값을 찾습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/0f5e0905-03ae-4035-b09d-4182b9e3ba99/image.png" alt=""></p>
<h4 id="stage-iii-high-quality-finetuning">Stage III: High-Quality Finetuning</h4>
<p>세 번째 단계는 고해상도 비디오 생성을 위한 파인튜닝입니다. 이 단계에서는 소규모 고품질 데이터셋(예: 250K 개의 고해상도 캡셔닝된 비디오 클립)을 사용하여 모델을 미세 조정합니다.
참고로 파인튜닝 과정에서 사용되는 손실 함수는 다음과 같습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/ef9635c0-5c7c-478b-a1d8-0b4bd7d58308/image.png" alt="">
여기서 ϵ은 가우시안 노이즈이며, $$ϵ _θ$$ 는 노이즈 예측 네트워크입니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/83b03803-b7e7-4453-b072-591682568b5c/image.png" alt=""></p>
<h3 id="4-training-video-models-at-scale">4. Training Video Models at Scale</h3>
<h4 id="pretrained-base-model">Pretrained Base Model</h4>
<p>고해상도일수록 더 많은 노이즈가 필요하며, 이산 시간 노이즈의 최대 timestep에서도 원본 이미지의 long-wavelength를 완전히 지우지 못합니다. 논문에서는 <strong>Stable Diffusion 2.1</strong>을 기반으로, noise scheduling을 조정하여 해상도를 높였습니다:
<img src="https://velog.velcdn.com/images/holiday_donghun/post/f05f1846-70b2-4158-add9-2ea15fea8b83/image.png" alt="">
여기서 $$x_t$$는 t-번째 단계의 샘플, $$x_0$$는 원본 데이터, ϵ는 가우시안 노이즈입니다.</p>
<p>그다음 시간 계층을 삽입한 후 임베딩을 제외한 모든 계층을 EDM 노이즈 스케줄을 사용하여 256x384의 해상도로 14개 프레임에 대해 훈련한 뒤, 노이즈 분포를 더 많은 노이즈로 이동시킨 후 320x576 해상도에서 추가 훈련합니다.</p>
<p> 여기까지 다양한 작업의 <strong>fine-tuning에 사용될 &#39;기본 모델&#39;</strong>입니다.</p>
<h4 id="high-resolution-text-to-video-model">High-Resolution Text-to-Video Model</h4>
<p>fine-tuning을 통해 다양한 응용 분야에 적합한 모델을 개발했습니다</p>
<ol>
<li><p>High Resolution Text-to-Video Model: 고해상도 영상 생성.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/1d264e1e-c5c4-4d57-b1e7-5fa9b1868f72/image.png" alt=""></p>
</li>
<li><p>High Resolution Image-to-Video Model: 입력 이미지를 기반으로 일관된 프레임 시퀀스 생성.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/3b8db0ad-8c2f-43ca-8944-f72e02df2c9f/image.png" alt=""></p>
</li>
<li><p>Multi-View Generation(다중 뷰 생성): 객체의 여러 뷰를 동시에 생성하며, Zero123XL 및 SyncDreamer와 같은 최신 방법보다 우수한 성능을 보였습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/b4070e6f-aef9-434f-bbd4-7d80fb1530d6/image.png" alt=""></p>
</li>
</ol>
<h3 id="5-conclusion">5. Conclusion</h3>
<p><strong>Stable Video Diffusion(SVD)</strong>은 대규모 데이터 큐레이션과 체계적인 훈련 단계를 통해 고해상도 비디오 생성을 위한 강력한 기반을 제공합니다:</p>
<ul>
<li>데이터 큐레이션의 중요성을 실증하며, 이를 통해 최첨단 성능을 달성.</li>
<li>다중 뷰 생성 및 동작 제어와 같은 응용 분야에서 뛰어난 결과를 보여줌.</li>
</ul>
<h3 id="마지막으로">마지막으로</h3>
<p>Stable Diffusion에 이어 Stable Video Diffusion 논문을 리뷰해보았다. Stable Diffusion을 계승한 모델이다 보니 비슷한 개념이 있지만, LoRA, CLIP 임베딩 등의 새로운 개념에 대해서도 알게되었고, 이 개념들에 대해서도 리뷰를 해보고 싶다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Stable Diffusion ; High-Resolution Image Synthesis with Latent Diffusion Models 논문 리뷰]]></title>
            <link>https://velog.io/@holiday_donghun/Stable-Diffusion-High-Resolution-Image-Synthesis-with-Latent-Diffusion-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@holiday_donghun/Stable-Diffusion-High-Resolution-Image-Synthesis-with-Latent-Diffusion-Models-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Sun, 02 Feb 2025 12:27:20 GMT</pubDate>
            <description><![CDATA[<p>오늘 리뷰할 논문은 Stable Diffusion입니다. Stable Diffusion은 2022년 공개된 Latent Diffusion Models(LDM) 기반의 텍스트-이미지 생성 모델로, 기존 픽셀 단위의 Diffusion Model(확산 모델) 대비 97% 감소한 계산 비용으로 고해상도 이미지 합성 가능성을 입증한 획기적인 연구입니다. 핵심 아이디어는 이미지를 잠재 공간(latent space)에서 처리하는 것으로, VAE 기반의 압축/복원 구조와 결합해 효율성을 극대화합니다.</p>
<blockquote>
<p>논문 : <a href="https://arxiv.org/abs/2112.10752">High-Resolution Image Synthesis with Latent Diffusion Models</a>
github : <a href="https://github.com/Stability-AI/stablediffusion">https://github.com/Stability-AI/stablediffusion</a></p>
</blockquote>
<h3 id="1-introduction">1. Introduction</h3>
<p>논문에서는 Diffusion 모델을 설명하기에 앞서 이전까지 생성 모델 Task에서 인기있었던 GAN 모델에 대해 먼저 이야기합니다. 특히 GAN 모델이 가지고 있던 문제점에 대해 이야기 하며 Diffusion 기반의 모델이기에 기존에 GAN 모델이 가지고 있던 Mode Collapse나 Training instability와 같은 문제가 발생하지 않는다는 점을 이야기합니다. </p>
<h4 id="diffusion-models">Diffusion Models</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/8d2baf4a-b72e-4e69-b942-6ae2b76d0fd0/image.png" alt=""></p>
<p><strong>Diffusion Models(DM)</strong>는 이미지 데이터 합성에서 최첨단 성능을 달성했습니다. 그러나 이러한 모델들은 주로 픽셀 공간에서 직접 작동하기 때문에, 강력한 DM의 최적화에는 수백 GPU일의 계산 자원이 소모되며 추론 과정도 순차적 평가로 인해 비용이 많이 듭니다.
<strong>Stable Diffusion</strong>의 핵심 아이디어는 이러한 계산적 한계를 극복하기 위해 확산 과정을 이미지의 잠재 공간(latent space)에서 수행하는 것입니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다:</p>
<ol>
<li>계산 효율성 향상: 잠재 공간에서의 연산은 픽셀 공간보다 훨씬 적은 차원에서 이루어집니다.</li>
<li>품질 유지: 적절한 압축률을 선택함으로써 시각적 품질을 유지하면서도 계산량을 크게 줄일 수 있습니다.</li>
<li>유연성: 다양한 조건부 생성 작업에 적용할 수 있습니다.
저자들은 이러한 접근법을 “Latent Diffusion Models (LDMs)“라고 명명했습니다. 추가로 Transformer를 Diffusion 모델 U-Net의 backbone으로 사용할 수 있게 아키텍처를 구상하였습니다.</li>
</ol>
<p>위의 내용들을 정리하면</p>
<ol>
<li>전체적인 구조를 모두 Transformer로 구성한 모델들과 달리 고차원의 데이터에 대해서도 잘 적용됩니다.</li>
<li>Unconditional Image Synthesis, Inpainting, Stochastic Super-Resolution 등 여러 Task에서 좋은 성능을 냈습니다.</li>
<li>Score-based 모델과는 다르게 Reconstruction에 대한 Delicate Weighting이나 Generative Ability가 필요하지 않습니다.</li>
<li>1024x1024 pixel을 가지는 큰 이미지에 적용할 수 있습니다.</li>
</ol>
<h3 id="2-related-work">2. Related Work</h3>
<p><strong>Stable Diffusion</strong>은 여러 선행 연구를 기반으로 합니다. 주요 관련 연구들은 다음과 같습니다:
    1.    <strong>DM(Diffusion Models)</strong>: 점진적인 노이즈 제거 과정을 통해 이미지를 생성하는 방법입니다. DDPM(Denoising Diffusion Probabilistic Models)이 대표적입니다.
    2.    <strong>VAE(Variational Autoencoders)</strong>: 데이터를 저차원 잠재 공간으로 인코딩하고 다시 원본 공간으로 디코딩하는 방법을 학습합니다.
    3.    <strong>GAN(Generative Adversarial Networks)</strong>: 생성자와 판별자의 경쟁적 학습을 통해 고품질 이미지를 생성합니다.
    4.    <strong>VQ-VAE(Vector Quantized-VAE)</strong>: 이산적인 잠재 표현을 학습하는 방법으로, 이미지 압축에 효과적입니다.
Stable Diffusion은 이러한 선행 연구들의 장점을 결합하여 새로운 접근법을 제시했습니다.</p>
<h3 id="3-method">3. Method</h3>
<p>Stable Diffusion의 핵심 아이디어는 두 가지 단계로 구성됩니다:</p>
<ol>
<li>오토인코더를 사용한 Perceptual Compression(지각적 압축)</li>
<li>잠재 공간에서의 확산 모델링</li>
</ol>
<p>이러한 접근 방법은 다음과 같은 장점이 존재합니다.</p>
<ol>
<li>Efficient : 저차원 공간에서 샘플링이 이루어집니다.</li>
<li>High Inductive Bias : U-Net 구조를 사용하여 Compression이 잘 이루어지기 때문에 높은 Inductive Bias를 가집니다.</li>
<li>General-Purpose : Latent Space를 사용하여 한번의 학습으로 만들어진 Compression Model을 여러 Downstream task에 활용할 수 있습니다.</li>
</ol>
<h4 id="perceptual-image-compression">Perceptual Image Compression</h4>
<p>Perceptual Compression이란 우리가 Autoencoder에서 Latent space를 학습하는 것을 의미합니다. 이 때 Latent Space의 분산이 크면 Latent Space가 가지고 있는 정보가 이질적이므로 작은 분산을 가지도록 Regularization을 가지도록 하였습니다.</p>
<p>이 과정은 다음과 같은 수식으로 표현됩니다:
$$z = E(x)x̂ = D(z)$$
여기서 E는 인코더, D는 디코더, x는 원본 이미지, z는 잠재 표현입니다.
VAE의 목적 함수는 다음과 같습니다:
$$L_{VAE} = L_{rec} + L_{reg}$$
$$L_{rec}$$는 재구성 손실, $$L_{reg}$$는 정규화 항입니다.</p>
<h4 id="regularization의-종류">Regularization의 종류</h4>
<p>KL-reg : 학습된 Latent에 약간의 KL-penalty를 줍니다.
VQ-reg : Decoder안에 Vector Quantization을 사용합니다.</p>
<p>이 논문에서 사용한 Diffusion 모델은 Latent Space를 2차원 구조로 설계하여 Latent Space가 1차원인 모델보다 Compression과 Reconstruction 성능이 좋았다고 합니다. </p>
<h4 id="latent-diffusion-models">Latent Diffusion Models</h4>
<p>Diffusion Model은 점진적으로 Denoising을 해가며 $$p(x)$$의 데이터 분포를 학습하도록 디자인된 확률 모델입니다(고정된 길이의 Marcov Chain 역과정(reverse process)로 학습합니다). 이미지 합성에서 성능이 좋은 대부분의 모델들은 $$p(x)$$에 대한 ELBO(변분 하한;Variational Lower Bound)를 재가중치하여 변형하여 사용하였으며 이는 Denoising score-matching과 유사합니다. 결국 이 모델들은 동일한 가중치를 가지는 Denoising AutoEncoder의 시퀀스로 해석될 수 있으며 이는 $$\epsilon_{\theta}(x_t, t)$$로 표현됩니다. 
<img src="https://velog.velcdn.com/images/holiday_donghun/post/82ee754b-e767-487e-8ccd-de1f224ed760/image.png" alt="">
이는 해당 목적함수입니다. 여기서 $$ε$$은 Gaussian noise, $$ε_θ$$는 noise 예측 네트워크입니다. $$x_t$$는 Input x의 noise가 추가된 버전입니다.</p>
<h4 id="generative-modeling-of-latent-representations">Generative Modeling of Latent Representations</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/160dde27-9a66-4fda-b49c-12e2924c0b03/image.png" alt=""></p>
<p>학습된 Perceptual Compression 모델을 사용하면 눈에 띄지 않는 디테일들이 효율적이고 저차원인 Latent Space에 접근할 수 있습니다. 고차원인 Pixel Space와 대비하여 Latent Space를 사용하는 것은 두가지 장점이 있습니다.</p>
<ol>
<li>데이터의 중요하고 Semantic한 정보에 더 초점을 맞출 수 있으습니다.</li>
<li>저차원에서 학습을 진행하기 때문에 계산이 더 효율적이라는 장점을 가집니다.</li>
</ol>
<p>이러한 구조는 Time-conditional U-Net을 Backbone으로 사용하여 기존 AutoRegressive나 Attention-based Transformer 구조보다 더 풍부한 Inductive Bias를 가지게 만듭니다.</p>
<h4 id="conditioning-mechanisms">Conditioning Mechanisms</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/5a234484-ee35-48e1-ad07-e28176e220a9/image.png" alt=""></p>
<p>마지막으로 <strong>Conditioning Mechanisms</strong>을 알아보겠습니다. Stable Diffusion 이전의 Diffusion 모델들에는 다양한 Conditioning 과의 결합에 대한 연구가 없었다고 합니다. Stable Diffusion은 cross-attention을 사용하여 다양한 조건을 사용할 수 있게끔 만들었습니다. Conditioning이란 텍스트나 이미지 등의 추가적인 표현을 의미한다고 볼 수 있습니다. 예로, 텍스트가 조건으로 들어갈 경우가 요즘 자주 보이는 text-to-image 모델입니다.
 
먼저 각각의 새로운 조건들을 $$y$$라고 했을 때, 이를 각 단계에 매핑하기 위해 $$\tau_\epsilon(y)\in \R^{M\times d_\tau}$$ 로 보내는 인코더 $$\tau_\epsilon$$을 설정하고, 이를 cross-attention layer를 통해 U-Net의 중간 레이어에 매핑시킵니다.
여기서의 크로스 어텐션 매커니즘은 Query는 기존 $$z_t$$의 값을, Key와 Value는 $$\tau_\epsilon(y)$$의 값을 가져오는 전형적인 방법입니다. 즉 식으로 표현하면 다음과 같이 표현할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/9354c323-043e-406c-9547-50285c1b2d0c/image.png" alt=""></p>
<p>여기서 $$\phi_i(z_t)$$는 U-Net의 중간 단계를 표현한다고 생각하셔도 됩니다.
따라 <strong>conditional LDM의 Loss</strong>는 다음과 같이 표현할 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/144abcc9-0fe4-4118-a49f-5d241ccc7b3f/image.png" alt=""></p>
<h3 id="4-experiments">4. Experiments</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/292b3551-2174-49b6-bd07-12f9b69bef78/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/96a92db8-4a10-402f-818f-c6d2aeb60556/image.png" alt="">
위의 표는 이 섹션에서 비교한 LDM에 사용된 first stage model의 hyper-parameter 및 재구성 성능을 보여줍니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/429e024d-acf7-4f86-9a09-eb2d6f505e1f/image.png" alt="">
위 그래프는 ImageNet으로 클래스 조건부 모델을 200만 step 학습할 때 step에 대한 샘플 품질(FID, IS)을 보여줍니다.</p>
<p>이를 통해 2가지를 확인할 수 있습니다.</p>
<ol>
<li>작은 downsampling factor는 학습을 느리게 한다. (LDM-1, LDM-2)</li>
<li>지나치게 큰 f 값은 비교적 적은 step에서 샘플 품질의 정체를 유발한다. (LDM-32)</li>
</ol>
<p>LDM-4부터 LDM-16까지는 효율성과 perceptual하게 충실한 결과 사이에서 적절한 균형을 유지합니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/0b0bf51b-30c4-40fc-82a2-9aafcc8cbb84/image.png" alt="">
<img src="https://velog.velcdn.com/images/holiday_donghun/post/d3d497e9-bbb3-407a-ac14-6dc2c443402b/image.png" alt="">
또한 기존 Diffusion 모델, 생성 모델들과 비교해보았을 때, Stable Diffusion 모델은 다른 모델들 대비 좋은 성능을 내었으며, 특히 아래의 Task에서 좋은 성능을 보였습니다. </p>
<ol>
<li>고해상도 이미지 생성에 더 적은 자원과 시간</li>
<li>여러 조건, 데이터 셋에 대한 모델 유연성 평가</li>
</ol>
<h3 id="5-limitations--societal-impact">5. Limitations &amp; Societal Impact</h3>
<h4 id="limitations">Limitations</h4>
<p>Stable Diffusion의 한계점은 <strong>1. Latent Space 기반의 방법을 사용하여 Pixel 기반 방법론 보다는 빠르지만 Sampling Process가 여전히 GAN보다 느리다</strong>고 합니다.또한 <strong>2.LDM모델은 높은 정밀도가 요구되는 작업에서 적합하지 않을 수 있다</strong>고 합니다.</p>
<h4 id="societal-impact">Societal Impact</h4>
<p>이미지 생성 Task에 있어 Train, Inference 비용을 절감하여 기술 접근성을 높임과 동시에, 그만큼 조작된 데이터를 쉽게 배포할 수 있다는 문제가 존재하고 데이터에 대한 윤리적인 문제가 존재할 수 있다고 합니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>Stable Diffusion은 앞으로도 컴퓨터 비전과 인공지능 분야의 발전을 이끌어갈 것으로 기대됩니다. 이 모델을 기반으로 한 다양한 응용 프로그램과 서비스들이 계속해서 등장하고 있으며, 새로운 표현의 도구를 제공하고 있습니다.
하지만 논문에서 언급되었다시피 기술의 정밀도가 높아감에 따라 딥페이크, 조작 등의 윤리적인 부분에 대해서도 생각해 보아야 할 것 같다는 생각이 듭니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Dream Gaussian의 code]]></title>
            <link>https://velog.io/@holiday_donghun/Dream-Gaussian%EC%9D%98-code</link>
            <guid>https://velog.io/@holiday_donghun/Dream-Gaussian%EC%9D%98-code</guid>
            <pubDate>Sat, 01 Feb 2025 16:49:58 GMT</pubDate>
            <description><![CDATA[<p>3D Gaussian Splatting for Real-Time Radiance Field Rendering 논문 리뷰 후 코드 리뷰를 진행하였듯이, Dream Gaussian의 코드에 대한 글을 작성해보면 어떨까 싶어 작성하게 되었다.</p>
<blockquote>
<p>Dream Gaussian arxiv: <a href="https://arxiv.org/abs/2309.16653">https://arxiv.org/abs/2309.16653</a>: 
Github 코드 가이드: <a href="https://github.com/dreamgaussian/dreamgaussian">https://github.com/dreamgaussian/dreamgaussian</a></p>
</blockquote>
<p>이번 글은 위의 두 사이트를 참조하였다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/cc52058d-8f7d-473e-8f37-eb0cc7987172/image.png" alt=""></p>
<p>Github에 따르면 다음과 같은 환경에서 코드를 진행하였다고 나와있다.</p>
<ul>
<li>Ubuntu 22 with torch 1.12 &amp; CUDA 11.6 on a V100.</li>
<li>Windows 10 with torch 2.1 &amp; CUDA 12.1 on a 3070.</li>
</ul>
<p>저는 windows11에서 <strong>CUDA 12.1</strong>과 <strong>torch2.1</strong>을 사용해서 설치했습니다.
또한 Github에 따르면 GPU 8G RAM으로 충분하다고 되어 있습니다. 
저는 <strong>8GB RAM</strong>을 가진 <strong>Rtx 4060</strong>을 사용했습니다.</p>
<h4 id="code-진행">code 진행</h4>
<pre><code>conda create -n dreamgaussian python=3.9
conda activate dreamgaussian
git clone https://github.com/dreamgaussian/dreamgaussian.git
cd dreamgaussian
pip install -r requirements.txt

git clone --recursive https://github.com/ashawkey/diff-gaussian-rasterization
pip install ./diff-gaussian-rasterization

# simple-knn
pip install ./simple-knn  
# nvdiffrast
pip install git+https://github.com/NVlabs/nvdiffrast/ 
# kiuikit
pip install git+https://github.com/ashawkey/kiuikit  </code></pre><h3 id="image-to-3d-실행">Image-to-3D 실행</h3>
<h4 id="process">Process</h4>
<pre><code># background removal and recentering, save rgba at 256x256
python process.py data/name.jpg
# save at a larger resolution
python process.py data/name.jpg --size 512
# process all jpg images under a dir
python process.py data</code></pre><h4 id="training-gaussian-stage">training gaussian stage</h4>
<pre><code># train 500 iters (~1min) and export ckpt &amp; coarse_mesh to logs
python main.py --config configs/image.yaml input=data/name_rgba.png save_path=name
# gui mode (supports visualizing training)
python main.py --config configs/image.yaml input=data/name_rgba.png save_path=name gui=True
# load and visualize a saved ckpt
python main.py --config configs/image.yaml load=logs/name_model.ply gui=True</code></pre><h4 id="training-mesh-stage">training mesh stage</h4>
<pre><code># auto load coarse_mesh and refine 50 iters (~1min), export fine_mesh to logs
python main2.py --config configs/image.yaml input=data/name_rgba.png save_path=name
# specify coarse mesh path explicity
python main2.py --config configs/image.yaml input=data/name_rgba.png save_path=name mesh=logs/name_mesh.obj</code></pre><h3 id="간단하게-실행하실-분들을-위해-정리하면">간단하게 실행하실 분들을 위해 정리하면</h3>
<p> 학습 시키는 image를 data폴더에 name.jpg 위치시킵니다.</p>
<pre><code>python process.py data/name.jpg --size 512
python main.py --config configs/image.yaml input=data/name_rgba.png save_path=name
python main2.py --config configs/image.yaml input=data/name_rgba.png save_path=name mesh=logs/name_mesh.obj</code></pre><p><strong>실행 결과</strong>
Input Image
<img src="https://velog.velcdn.com/images/holiday_donghun/post/71223002-76a6-4ff6-8d7c-087afd76ed9a/image.jpg" alt=""></p>
<p>Result
<img src="https://velog.velcdn.com/images/holiday_donghun/post/9d2dc652-8f67-4f05-91f9-03314e64f8a3/image.gif" alt=""></p>
<p>Input Image
<img src="https://velog.velcdn.com/images/holiday_donghun/post/6e0889f0-937c-438c-860a-5e71b55d30f9/image.jpg" alt=""></p>
<p>Result
<img src="https://velog.velcdn.com/images/holiday_donghun/post/e0204052-b644-46f8-a6cb-3fba706e39d4/image.gif" alt=""></p>
<p>Training한 결과, 모습들이 기괴하게 나왔다.. </p>
<h3 id="text-to-3d-실행">Text to 3D 실행</h3>
<pre><code>python main.py --config configs/text.yaml prompt=&quot;an icecream&quot; save_path=icecream
python main2.py --config configs/text.yaml prompt=&quot;an icecream&quot; save_path=icecream</code></pre><p><strong>실행 결과</strong>
<img src="https://velog.velcdn.com/images/holiday_donghun/post/fbb4e996-b36a-4aa5-beb9-61f28145ee05/image.gif" alt="">
&quot;an icecream&quot;
<img src="https://velog.velcdn.com/images/holiday_donghun/post/826536bc-1521-4a92-923d-2b2f780692cf/image.gif" alt="">
&quot;a bicycle with a basket&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DreamGaussian 리뷰: 효율적인 3D 콘텐츠 생성을 위한 생성적 Gaussian Splatting (ICLR 2024)

내용:]]></title>
            <link>https://velog.io/@holiday_donghun/DreamGaussian-%EB%A6%AC%EB%B7%B0-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-3D-%EC%BD%98%ED%85%90%EC%B8%A0-%EC%83%9D%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%83%9D%EC%84%B1%EC%A0%81-Gaussian-Splatting-ICLR-2024%EB%82%B4%EC%9A%A9</link>
            <guid>https://velog.io/@holiday_donghun/DreamGaussian-%EB%A6%AC%EB%B7%B0-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9D%B8-3D-%EC%BD%98%ED%85%90%EC%B8%A0-%EC%83%9D%EC%84%B1%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%83%9D%EC%84%B1%EC%A0%81-Gaussian-Splatting-ICLR-2024%EB%82%B4%EC%9A%A9</guid>
            <pubDate>Sat, 01 Feb 2025 02:21:45 GMT</pubDate>
            <description><![CDATA[<p>최근 3D 콘텐츠 생성 분야에서 최적화 기반의 3D 생성 기법은 점수 증류 샘플링(Score Distillation Sampling, SDS)을 활용하여 주목할 만한 성과를 보였지만, 샘플당 최적화 시간이 길어 실용성에 한계가 있었습니다.
이러한 문제를 해결하기 위해 Tang 등(2024)은 ICLR 2024에서 &quot;DreamGaussian: Generative Gaussian Splatting for Efficient 3D Content Creation&quot;이라는 논문을 통해 효율성과 품질을 동시에 달성하는 새로운 3D 콘텐츠 생성 프레임워크를 제안하였습니다. <a href="https://arxiv.org/abs/2309.16653?utm_source=chatgpt.com">(arxiv.org)</a></p>
<h3 id="1-introduction">1. Introduction</h3>
<h4 id="기존-접근법의-한계">기존 접근법의 한계</h4>
<p>기존의 3D 콘텐츠 생성 기법은 크게 두 가지로 분류됩니다:</p>
<ol>
<li><p>추론 기반 3D 네이티브 방법(Inference-only 3D native method): 대규모 3D 데이터셋을 활용하여 모델을 학습시키는 방식으로, 빠른 생성이 가능하지만 데이터 수집의 어려움과 생성된 모델의 다양성 및 현실감에서 한계가 있습니다.</p>
</li>
<li><p>최적화 기반 2D 리프팅 방법(Optimization-based 2D lifting method): 2D 확산 모델을 사용하여 3D 모델을 최적화하는 방식으로, 현실감 있고 다양한 모델을 생성할 수 있지만, 생성 시간에 많은 시간이 소요됩니다.</p>
</li>
</ol>
<p>이러한 한계를 극복하기 위해, 본 논문에서는 3D Gaussian Splatting 기법을 생성적 설정에 적용하여 효율적이고 고품질의 3D 콘텐츠 생성을 목표로 합니다.</p>
<h4 id="3d-gaussian-splatting의-개념">3D Gaussian Splatting의 개념</h4>
<p><strong>3D Gaussian Splatting</strong>은 3D 공간에서 가우시안 분포를 사용하여 물체를 표현하는 기법으로, 각 가우시안은 위치, 크기, 색상 등의 속성을 가집니다. 이러한 가우시안들의 집합을 통해 3D 물체를 표현하고, 이를 2D 이미지로 렌더링할 수 있습니다. 기존의 Neural Radiance Fields(NeRF)와 달리, 가우시안의 점진적 밀도 증가를 통해 빠른 수렴을 보이며, 이는 3D 생성 작업에서 효율성을 높입니다.</p>
<p><strong>3D Gaussian Splatting</strong> 논문을 다룬 자세한 글은 <a href="https://velog.io/@holiday_donghun/3D-Gaussian-Splatting%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-Radiance-Field-%EB%A0%8C%EB%8D%94%EB%A7%81-3D-Gaussian-Splatting-for-Real-Time-Radiance-Field-RenderingSIGGRAPH-2023-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0">이 글</a>을 참고해주시면 감사하겠습니다.</p>
<h3 id="2-overview">2. Overview</h3>
<p>2D lifting 방법은 NeRF모델에 <strong>SDS Loss</strong>를 적용하게 되는데, NeRF의 랜더링 방식 때문에 optimization 시간이 상당히 오래 소요됩니다. 논문 저자는 속도를 개선하기 위해 occupancy pruning을 적용해 보았지만, SDS Loss로 모델을 학습시킬 때 효과적이지 못했다고 합니다. 때문에 NeRF대신에 <strong>pruning이 필요없는</strong> <strong>이미지 퀄리티가 좋고 빠른 학습 속도를 가진</strong> <strong>3D Gaussain Splatting</strong>을 적용 해보았다고 합니다. 단순히 3D Gaussian을 적용하였을 땐 결과물이 blurry하였기 때문에 추가적인 기법이 적용됬습니다.
(SDS Loss는 아래에서 설명하겠습니다)</p>
<p><strong>알고리즘</strong>은 총 3가지 단계로 구성됩니다.</p>
<ol>
<li><p><strong>Text/Image를 입력받아 SDS Loss로 3D Gaussian Splatting을 구성</strong></p>
</li>
<li><p><strong>3D Gaussian에서 Textured Mesh를 생성</strong></p>
</li>
<li><p><strong>UV Texture Map을 정제</strong></p>
</li>
</ol>
<h3 id="3-method">3. Method</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/e7d368b6-7eae-42ff-938c-b04b19ad057a/image.png" alt=""></p>
<h4 id="generative-3d-gaussian-splatting">Generative 3D Gaussian Splatting</h4>
<p>원래 3D Gaussian Splatting은 3D reconstruction을 위한 모델이다. 본 논문은 3D Generation task에서 이 모델을 이용하려고 합니다.
 3D Gaussian의 parameter는 {x,s,q,α,c}로 x는 중심 좌표, s는 scaling factor, q는 rotation quaternion, α는 opacity, c는 color(SH를 사용하지 않음)를 나타냅니다. Optimizable 파라미터는 Θ로 나타내고 i번째 가우시안의 파라미터는 $$Θ=$${$$x_i,s_i,q_i,α_i,c_i$$}이다. 3D Gaussian들을 2D Gaussian들로 project시키고 이를 통해 volumetric rendering을 수행해 최종 color과 alpha의 추정값을 구합니다. 기존 3D Gaussian Splatting 방식을 이용해 Θ를 최적화합니다. </p>
<p>논문에서는 구 내에서 random 위치에서 샘플링된 unit scaling과 no ratation을 가진 3D Gaussian으로 초기화합니다. 3D Gaussian들은 optimization을 통해 점진적으로 desification됩니다. 기존 3D gaussian splatting과 다른 점은 더 적은 Gaussian들로 시작해서 더 자주 densification을 진행한다. 각 스텝마다 random camera pose p를 샘플링해서 <strong>RGB image</strong> $$I_{RGB}^p$$ 와 *<em>transparency *</em> $$I^p_A$$를 렌더링합니다. 학습동안 linear하게 t를 줄인다고 합니다. 그리고 나서 다른 2D diffusion prior ϕ가 사용됩니다</p>
<p><strong>Image-to-3D를 기준으로 학습과정을 정리하면,</strong></p>
<ol>
<li><p>입력 이미지의 배경을 제거하고 사물을 가운데 위치시킵니다.</p>
</li>
<li><p>우선 구형 공간안에 랜덤 position 값으로 5000개의 3D Gaussian을 초기화합니다. </p>
</li>
<li><p>각 step에서 물체를 중심으로 반지름이 2(or 2.5)인 반구의 표면에 랜덤으로 camera pose(=view)를 지정(샘플링)합니다.</p>
</li>
<li><p>Text 또는 이미지를 입력으로 받아, SDS Loss를 사용해 3D Gaussian들의 위치, 크기, 회전정도, 투명도, 색상을 업데이트합니다. 3D Gaussian Splatting과 다른 부분은 color를 계산시에 SH function을 사용하지 않고, RGB 3개의 실수값으로 정의합니다. DreamGaussian에서는 각도에 따라 사물이 다른 색상을 랜더링하도록 모델링하지 않기 때문입니다.</p>
</li>
<li><p>100 step마다 Gaussian Clone/split하는 Densification과정을 수행합니다.</p>
</li>
<li><p>RGB 이미지와 transparency이미지를 랜더링합니다. 이 때 배경은 랜덤으로 흰색 또는 검정색으로 랜더링합니다.</p>
</li>
<li><p>랜더링 되는 이미지 해상도를 64에서 512까지 증가시키며 총 500step을 진행합니다.</p>
</li>
</ol>
<h4 id="image-to-3d-loss">Image-to-3D Loss</h4>
<p>Image-to-3D task에서 이미지 $$\tilde{I}^r_{RGB}$$와 foreground mask $$\tilde{I}^r_A$$가 input으로 주어지고 Zero-1-to-3 XL이 2D diffusion prior로 적용됩니다. SDS Loss는 다음과 같이 계산됩니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/d4a71903-0a81-4462-a14e-17a1cef6451c/image.png" alt=""></p>
<ul>
<li>t는 time, p는 카메라 pose, ϵ는 가우시안 분포,</li>
<li>ϵΦ는 2D Diffusion prior의 U-net,</li>
<li>I_p_RGB는 Gaussian Splatting으로 그려진 이미지,</li>
<li>~I_r_RGB은 입력 이미지,</li>
<li>Θ는 Gaussian Splatting의 학습 parameter입니다.</li>
</ul>
<p>추가로 reference view image $$I^p_{RGB}$$와 transparency $$I^r_A$$를 input에 align하도록 다음과 같이 최적화합니다.</p>
<p>다시말해 입력 이미지(=reference view image)와 최종 랜더링된 이미지간의 MSE값 +  입력 이미지에 대한 transparency(=background mask 추정)와 최종 합성 이미지에 대한 transparency 값이 상수 비율만큼 곱해져서 Loss로 사용됩니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/5e424792-fed3-4ffc-ad64-addbd9e84e66/image.png" alt=""></p>
<h4 id="text-to-3d-loss">Text-to-3D Loss</h4>
<p>Text-to-3D에서는 text만 input으로 사용되고 StableDiffusion이 사용된다. SDS Loss는 다음과 같이 계산된다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/2cc7dfb2-395c-4c3f-9354-3a13b6d547eb/image.png" alt=""></p>
<p>위와 다른 점은 e인데, 이는 text를 latent vector로 임베딩(embedding)하는 모델인 CLIP에 해당합니다. U-net은 text에 해당하는 이미지를 생성 할 수 있게끔 3D Gaussian의 parameter를 업데이트합니다.</p>
<p>이렇게 3D Gaussian Splatting 으로만 모델링 할 경우, 상당히 blurry한 것을 볼 수 있습니다. 각 optimization step이 inconsistent 3D guidance를 제공하기 때문에, under-reconstruction 지역을 정확하게 densification하거나 over-reconstruction을 pruning하는 것에 어려움을 겪습니다. 그래서 이러한 관측을 통해 mesh extraction과 texture refinement 디자인을 도입하게 됩니다.</p>
<h4 id="efficient-mesh-extraction">Efficient Mesh Extraction</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/b0c78cb4-77c1-458d-92ea-6a6617a67263/image.png" alt=""></p>
<p>3D Gaussian들을 mesh로 변환한 최초의 시도라고 표현하고 있습니다. 3D Gaussian Splatting 논문에선 이미지 plane으로 projection하는 것은 소개되었지만, 3D mesh로 projection은 언급되어있지 않습니다. Local Density Query와 Color Back-projection 기법을 통해 Mesh Extraction하는 방법을 소개하고 있습니다.</p>
<h4 id="local-density-query">Local Density Query</h4>
<p>$$(-1,1)^3$$의 3D 공간을 $$16^3$$의 overlapping block들로 나눕니다. 그러고 나서 각 block에 중심이 속하지 않는 Gaussian들은 culling합니다. 그렇게 함으로써 특정 block에 대해 계산할 때 그 block에 속한 Gaussian에 대해서만 계산하게 해서 효율적으로 만듭니다. Grid position $$\mathbb{x}$$에서 각 query에 대해, 남은 3D Gaussian의 opacity를 weighted sum으로 표현할 수 있습니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/80a4cdb4-08d1-4f37-9669-b7ea6d4d1424/image.png" alt=""></p>
<p>여기서 $$\Sigma_i$$는 scailing $$\mathbb{s}_i$$와 rotation $$\mathbb{q}_i$$으로부터 만들어진 covariance matrix입니다. 이 후 Marching cube 알고리즘에 따라 각 grid의 8개의 모서리의 opacity가 임의의 thresould를 넘을 경우 True로 판정하고, 미리 정의된 256개 경우의 수 중 한가지의 polygon형태로 변환합니다. 이 128^3개의 grid를 모두 합치면 하나의 mesh로 생성되게 됩니다.</p>
<h4 id="color-back-projection">Color Back-projection</h4>
<p>Local Density Query 과정에서 mesh geometry를 얻었기 때문에, rendered RGB image를 mesh surface로 back-project할 수 있고 texture로 bake할 수 있습니다. 처음에는 3D mesh를 2D UV coordinate들을 unwrap하고 빈 texture image로 초기화합니다. 대응되는 RGB image를 렌더링하기 위해 8개의 azimuth($$\phi$$)와 3개의 elevation($$\theta£$)와 위 아래 view를 uniform하게 선택합니다. RGB image들로부터 각 픽셀은 UV coordinate에 기초한 texture image에 back-project 될 수 있고, 여기서 mesh boundary에서 unstable projection을 피하기 위해서 카메라의 z축과 표면의 법선 벡터의 각이 작은 픽셀들은 배제한다고 합니다. 이렇게 back-projected texture image는 다음 스테이지에서 initialization으로 주어집니다. 기존 3D Gaussian Splatting에서는 Image Plane으로 Projection하게 되는데, 여기선 triangle으로 projection한다고 생각하면 좋을 것 같습니다.
이렇게 생성된 texture image는 다음단계에서 fine-tuning되어 집니다.</p>
<h4 id="uv-space-texture-refinement">UV-Space Texture Refinement</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/45852583-cfba-45f9-b34a-7973e4b460f9/image.png" alt=""></p>
<p>이 단계에서는 앞선 coarse texture를 refine합니다. 그 과정에서 SDS Loss를 바로 사용하면 위 그림처럼 artifacts가 발생합니다. 이는 rasterize할 때 mipmap(여러 해상도의 이미지들) texture sampling 기법 때문이라고 합니다. mipmap(서로 다른 해상도의 이미지들)으로 전파되는 graident들이 과도한 채도(saturation) block들을 만들기 때문입니다. 그래서 blurry한 texture를 fine-tune하기 위한 방법을 제시하고 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/ff097a8b-b021-40f0-82e2-e69f1ea515aa/image.png" alt=""></p>
<p>초기화된 texture를 가지고 있기에 앞단계에서 만들어진 textured mesh 모델을 토대로, 임의의 camera pose에서 blurry한 이미지를 만듭니다. 이 blurry한 이미지를 2D diffusion prior(=stable diffusion)의 denoising process에 통과시켜 정제된 이미지를 생성합니다. </p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/2a172ac9-1380-4971-9ff9-2d3d8585b479/image.png" alt="">
다음은 refine된 이미지를 만드는 수식입니다.
여기서 $$\epsilon(t_{start})$$는 $$t_{start}$$에서 random noise이고, $$c$$는 image-to-3D에서는 $$\Delta p$$이고 text-to-3D에서는 $$e$$입니다. 시작 timestep $$t_{start}$$는 noise strength를 제한하기 위해 조심스럽게 선택된다고 합니다. 그 결과 original content를 파괴하지 않으면서 detail들을 강화할 수 있다고 합니다. 
이 후 Pixel-wise MSE Loss를 사용해서 texture를 최적화합니다.
<img src="https://velog.velcdn.com/images/holiday_donghun/post/54343f25-8af1-4e69-be0a-2accba0ae07e/image.png" alt=""></p>
<p>정리하자면, coarse한 이미지를 2D diffusion prior의 denoising process를 통해 refine한 이미지로 생성하고, refined된 이미지로 만들 수 있도록 Textured Mesh의 UV Map을 pixel단위로 업데이트 하는 것이러고 할 수 있겠습니다.</p>
<h3 id="4-experiments">4. Experiments</h3>
<h4 id="qualitative-camparisons">Qualitative Camparisons</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/e4904766-6750-45a2-bff0-3e37339a8657/image.png" alt=""></p>
<h4 id="image-to-3d의-경우">Image-to-3D의 경우</h4>
<p>optimization기반 방법(Zero-1-to-3)과 inference-only 방법(One-2-3-45, Shape-E)을 구분했을 때, DreamGaussian은 3D geometry fidelity관점, visual apperance 관점에서 가장 좋은 성능을 가집니다. optimization기반 방법보다는 빠르지만 inference-only 방법보다는 느립니다.</p>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/89d05fe2-240b-405c-8d0b-cb8c69ba94f6/image.png" alt=""></p>
<h4 id="text-to-3d의-경우">Text-to-3D의 경우</h4>
<p>Optimization기반 방법을 적용한 DreamFusion과 비교 했을 때, DreamGaussian은 학습 속도가 10배 이상 개선되었고 퀄리티도 개선되었습니다. </p>
<h4 id="quantitative-comparision">Quantitative Comparision</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/98d24416-af44-42f4-9b4d-26bf14a71203/image.png" alt=""></p>
<p>CLIP similarity(다양한 view에서 얼마나 일관성을 가지는지를 판단)와 generation 속도를 정량적으로 비교하는 실험을 진행되었는데, DreamGaussian이 높은 수치를 가지는 것을 확인할 수 있습니다.</p>
<h4 id="ablation-study">Ablation Study</h4>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/63de2593-f175-42c0-9924-a7f242fc0f28/image.png" alt=""></p>
<ol>
<li>3D Gaussian Splatting의 Densification과정이 없을 경우</li>
<li>SDS loss계산시 Timestep Annealing이 없을 경우</li>
<li>refine이미지를 생성에 사용된 reference view Loss L_Ref가 없을 경우</li>
</ol>
<p>이 3가지 경우에 대하여 시각적으로 평가하였습니다. 한가지라도 빠졌을 경우 블러리한 결과를 만드는 것을 알 수 있습니다.</p>
<h3 id="5-limitations-and-conclusion">5. Limitations and Conclusion</h3>
<p><img src="https://velog.velcdn.com/images/holiday_donghun/post/1db0b340-bfc1-4f62-8548-0b1c027a1413/image.png" alt=""></p>
<p>이전의 Text-to-3D 연구와 동일하게, Janus 문제(야누스 문제: 얼굴이 여러개 생기는 현상)과 baked lighting(빛이 Texture에 포함되는 현상)이 발생했습니다. 최신 multi-view 2D diffusion model연구들과 latent BRDF auto-encoder연구들을 통해 학습을 더 길게 하면 완화될 수 있다고 합니다.</p>
<h3 id="마지막으로">마지막으로</h3>
<p>3D Gaussian으로 Mesh를 만드는 방법이랑, Texture Map을 만드는 것이 매우 신기하였다. 3D Gaussian splatting을 공부한 후 다루는 첫 논문인데, 아직 NeRF, Diffusion Mode에 대한 나의 이해가 완벽하지 않다는 느낌이 들었다. 가능하다면 위 논문들에 대해서도 리뷰 해볼 예정이다.</p>
]]></description>
        </item>
    </channel>
</rss>