<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>JinnAHA.log</title>
        <link>https://velog.io/</link>
        <description>Aha!의 순간은 언제나 즐겁다.</description>
        <lastBuildDate>Fri, 28 Feb 2025 09:21:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>JinnAHA.log</title>
            <url>https://velog.velcdn.com/images/jin_a720/profile/816627c9-4ce4-470c-b014-c090894c9fbd/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. JinnAHA.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jin_a720" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[CV/논문리뷰] Reconstruction and Simulation of Elastic Objects with Spring-Mass 3D Gaussians]]></title>
            <link>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Reconstruction-and-Simulation-of-Elastic-Objects-with-Spring-Mass-3D-Gaussians</link>
            <guid>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-Reconstruction-and-Simulation-of-Elastic-Objects-with-Spring-Mass-3D-Gaussians</guid>
            <pubDate>Fri, 28 Feb 2025 09:21:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/2403.09434">SpringGaus</a>는 ECCV 2024에서 발표된 물리 시뮬레이션과 3DGS를 결합한 논문으로, Spring-Mass System을 적용하여 3D 가우시안으로 탄성체를 구현가능하도록 만들었다. Physically-based simulation과 3DGS를 결합한 논문 중에서는 상대적으로 simulation system을 표현한 수식이 복잡하지 않은(?) 편으로, 약간의 배경지식을 통해 논문을 이해하는 것이 가능했다. </p>
<p>이 논문에서 가장 주목할 지점은 physical 파라미터를 학습하는 방식으로 dynamic reconstruction을 수행하기에 신경망 없이도 reconstruction 이후의 상황을 prediction 가능하다는 지점이다. 그 외에도 gravity, turbulence, softness 등 환경 편집의 가능성도 논문에서는 제시하고 있다.</p>
<hr>
<h2 id="background">Background</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/b2c9d0ca-0a9e-48a8-98e0-5fa19a879796/image.png" alt=""></p>
<h3 id="physics-informed-neural-networkspinns"><strong>Physics-Informed Neural Networks(PINNs)</strong></h3>
<p><strong>: PDEs(편미분방정식)이나 물리 법칙을 만족하도록 설계된 신경망</strong>으로, 일반적인 신경망과 달리, <strong>물리 법칙을 Loss function에 포함</strong>하여 학습에 활용하게 된다.</p>
<p><strong>PINNs의 기본 구조</strong>는 다음과 같다:</p>
<ul>
<li><strong>Input &amp; Output:</strong><ul>
<li><strong>Input:</strong> 위치(x, y, z)와 시간(t)</li>
<li><strong>Output:</strong> 물리량, 온도, 속도, 압력 등</li>
</ul>
</li>
<li><strong>Loss function:</strong><ul>
<li><strong>Data Loss:</strong> 실험 또는 시뮬레이션 데이터와의 차이</li>
<li><strong>PDE Residual Loss:</strong> 미분 연산을 통해 PDE를 만족하는지 평가</li>
<li><strong>Boundary Condition Loss:</strong> 초기 및 경계 조건을 반영</li>
</ul>
</li>
</ul>
<h3 id="material-point-methodmpm"><strong>Material Point Method(MPM)</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/47394b6e-8285-4ee6-8d9e-e726489d0187/image.png" alt=""></p>
<p><strong>물리 시뮬레이션 기법.</strong> 1994년에 고체 역학 문제를 해결하기 위한 방법으로 처음 소개되었다. <strong>particle과 grid를 함께</strong> 사용하는 하이브리드 방식을 채택하여 물체의 변형을 더 자연스럽게 표현한다고 한다. 단, <strong>입자격자 간 정보교환이 필요</strong>하고, <strong>고해상도 scene에서는 입자가 많아져 연산량이 매우 큰 단점</strong>이 있다.</p>
<p><strong>Spring-Mass System</strong></p>
<p>: 탄성체의 움직임을 시뮬레이션하는 물리적 모델으로, 스프링과 질량점으로 구성된다. 스프링의 움직임에서 착안한 듯 하다. 스프링을 통해 연결된 질량점들이 <strong>힘을 주고받으며 변형</strong>되는 방식으로 동작한다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e60f1c28-d941-413b-9685-8fe5d51ad4eb/image.png" alt=""></p>
<p>두 주요 구성요소는 다음과 같다:</p>
<ul>
<li><p><strong>질량점</strong></p>
<ul>
<li>실제 물체를 표현하는 <strong>particle</strong> 역할을 한다.</li>
<li>각 질량점은 <strong>질량, 위치, 속도</strong> 등의 물리적 속성을 가지고, 일반적으로 중력을 포함한 힘이 작용 가능하다.</li>
</ul>
</li>
<li><p><strong>스프링</strong></p>
<ul>
<li>질량점들을 서로 연결하는 역할을 한다.</li>
<li>후크의 법칙을 따르며, 탄성 복원력을 생성한다.</li>
<li>스프링은 특정한 rest length를 가지고 변형되면 복원력이 작용하게 된다.</li>
<li><strong>damping factor</strong>를 추가하여 진동 억제를 표현할 수 있다.</li>
</ul>
</li>
<li><p><strong>Hooke’s Law:</strong> 스프링이 변형되었을 때, 원래 길이로 돌아가려는 <strong>복원력</strong>이 작용함을 설명한다. 입자간 거리와 스프링 길이의 차이에 상수 $-k$만큼, $d$ 방향으로 작용한다.</p>
<p>  <img src="https://velog.velcdn.com/images/jin_a720/post/88666691-e509-44ac-94da-90d3a9d15ac9/image.png" alt=""></p>
<ul>
<li><p>$\hat{d}$: direction unit vector</p>
<p>  <img src="https://velog.velcdn.com/images/jin_a720/post/0ca1dccc-7e0a-4051-bbb0-001bf7345312/image.png" alt=""></p>
</li>
</ul>
</li>
<li><p><strong>Damping Force:</strong> 실제 물체에 존재하는 저항을 반영하여 과도한 진동을 억제하기 위한 <strong>감쇠력</strong>을 말한다. 속도 차이가 크면 저항력이 커지고, 진동이 줄어든다.</p>
<p>  <img src="https://velog.velcdn.com/images/jin_a720/post/aa1df6e8-92ce-4fda-91c4-32a94dd640dd/image.png" alt=""></p>
<ul>
<li>$\zeta$: damping coefficient</li>
<li>$ν_i, ν_j$: 연결된 질량점의 속도</li>
</ul>
</li>
<li><p><strong>Newton’s Second Law:</strong> 각 질량점은 <strong>스프링이 주는 힘</strong>과 <strong>외부 힘</strong>을 받아서 운동</p>
<p>  <img src="https://velog.velcdn.com/images/jin_a720/post/05fa5c2d-88c2-446d-af84-905486a72cd8/image.png" alt=""></p>
<p>  <strong>→</strong> 시간이 지남에 따라 <strong>반복적으로 위치와 속도를 업데이트</strong>하면서 탄성체의 움직임을 시뮬레이션하게 된다.</p>
</li>
</ul>
<h2 id="problem-setting">Problem Setting</h2>
<p>Related Works를 통해 논문의 문제의식을 알아보자.</p>
<h3 id="3dgs--its-dynamic-extensions-4dgs-d-3dgs-등"><strong>3DGS &amp; its Dynamic Extensions (4DGS, D-3DGS 등):</strong></h3>
<p><strong>Object의 시간에 따른 변화를 포착</strong>하는 것이 특징이다. 그러나 task가 Reconstruction &amp; view synthesis에 초점이 맞춰져 있고, <strong>Reconstruction된 물체들의 물리적 속성을 파악하지 못하므로 이후의 변화 prediction이 불가능</strong>하다.</p>
<h3 id="integration-of-physics-based-priors-into-3d-reconstructions-pac-nerf-등"><strong>Integration of Physics-based priors into 3D Reconstructions (PAC-NeRF 등):</strong></h3>
<p><strong>MPM 등의 물리 solve을 통해 물리 기반 prior를 통합하려 시도</strong>했지만, <strong>Real-world의 이질적인 object를 다루는 능력이 제한적이다:</strong></p>
<ul>
<li>사전에 정의된 특정한 물질 특성만을 기반으로 모델 구축</li>
<li>전체 object에 대해 하나의 global physical parameter만 할당 가능</li>
</ul>
<h2 id="motivation--contribution">Motivation &amp; Contribution</h2>
<h3 id="what-to-expect-from-physical-dynamics-model"><strong>What to Expect from Physical Dynamics Model:</strong></h3>
<ul>
<li>Effective: <strong>탄성체의 움직임을 충분히 포착하고 구현할 수 있는 표현력</strong></li>
<li>Collisions, Deformations, Bouncing</li>
<li>Efficient: <strong>gradient 기반의 최적화가 가능할 정도의 효율적(Efficient)인 Physical system</strong></li>
</ul>
<h3 id="what-to-expect-from-spring-gaus"><strong>What to Expect from Spring-Gaus:</strong></h3>
<ul>
<li><strong>Expressive 하고 Efficient</strong> 한 3D Spring-Mass model</li>
<li><strong>Static한 Geometry Reconstruction과 Physical Dynamics Reconstruction을 분리하여 수행</strong> 함으로써 효과적인 최적화</li>
<li>효율적인 <strong>Prediction과 Simulation</strong> 능력</li>
</ul>
<h2 id="architecture">Architecture</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/d4e8ecae-6c04-4594-b107-2d8ff49dbe13/image.png" alt=""></p>
<ul>
<li>일반적인 3DGS 방식으로, multi-view video의 첫번째 프레임을 바탕으로  static한 가우시안을 먼저 만든다.<ul>
<li>anistropic했던 3DGS와 달리 가우시안 커널은 등방성의 형태를 띈다.</li>
</ul>
</li>
<li>볼륨샘플링으로 각 가우시안에 대해 앵커포인트를 추출한다.<ul>
<li>아직 스태틱 상태인 가우시안들을 refine하는데, 시뮬레이션 하는 동안 객체의 모습을 더 일관적으로 표현할 수 있도록 한다.</li>
</ul>
</li>
<li>다이나믹 리컨스트럭션을 진행. 시뮬레이션은 ‘앵커포인트’에 적용된다.</li>
<li>이를 바탕으로 가우시안 커널들의 위치를 업데이트한다.</li>
<li>최적화가 끝나면 시뮬레이션 가능한 3D 객체가 생성된다.</li>
</ul>
<h2 id="approach">Approach</h2>
<h3 id="appearance-and-geometry-representation"><strong>Appearance and Geometry Representation</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/2ba3da5b-1974-4495-bf86-23318a73987a/image.png" alt=""></p>
<p>Geometry Reconstruction 과정은 <strong>일반적인 3D Gaussian과 같은</strong> 방식으로 표현된다. 그러나 3DGS와 달리 가우시안 커널 각각이 <strong>isotropic</strong> 하게 만들어 <strong>covariance matrix Σ를 단일 scalar로 컨트롤 가능</strong>하게 하였다. Anisotropic한 경우와 비교한 실험 결과는 없었지만, 퀄리티에 큰 차이가 없어 더 단순한 정방형 가우시안을 사용하는 방식으로 모델 복잡도를 낮춘 듯 하다.</p>
<h3 id="physics-based-dynamics"><strong>Physics-Based Dynamics</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9a33387c-6aba-4f07-9561-d8eb9903ad89/image.png" alt=""></p>
<p><strong>Spring-Gaus</strong>는 객체의 <strong>material type을 처음부터 상정해두지 않</strong>는다는 점에서 이전의 MPM 방식의 접근과 차별점을 두었다. 따라서 Scene에 따라, reconstruction하는 object에 따라 질량점의 질량과 속도, 스프링의 탄성과 Damping factor이 달라지게 된다. 수식으로 표현하면 다음과 같이 $A, L, X$로 각각 질량점, 스프링을 표현한다.</p>
<p><strong>3D Spring-Mass Model 구성요소</strong></p>
<ul>
<li><strong>Anchor points A: 질량점</strong><ul>
<li><strong>Property: mass(질량), velocity(속도)</strong></li>
</ul>
</li>
<li><strong>Springs L:</strong> 각각의 질량점을 이웃 포인트들과 연결하는 스프링<ul>
<li><strong>Property: Stiffness(탄성), Damping factor(감쇠 값)</strong></li>
</ul>
</li>
<li>이웃하는 질량점 간 거리는 <strong>k-NN 방식</strong>으로 $n_k$에 의해 결정된다.</li>
<li>학습 과정에서 가우시안 커널의 중심점을 이동시키기 위해, <strong>k-NN 방식</strong>으로 $n_b$에 의해 각 <strong>가우시안 중심점 – 질량점 거리</strong> 역시 측정한다.</li>
</ul>
<p><strong>Forces</strong></p>
<p>: 두가지 종류가 종합된다. 복원력 + 감쇠력으로 이루어지며, 각각 Background의 후커의 법칙과 감쇠력 공식에서 유도된다.
다시 후커의 법칙과 감쇠력 공식을 생각해보면,</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/0da5627c-db89-4902-b2c5-f25309f81e2a/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/51c7a80c-45db-4e93-9fb5-3403f73fec57/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td>이렇게 생겼었다. 이 공식에 아래에 나오는 수식을 잘 대입해 보면 같은 구조임을 알 수 있다.</td>
<td></td>
</tr>
</tbody></table>
<p><strong>1. 복원력</strong></p>
<p>   기본적으로 후커의 법칙 수식이 적용된다:</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/59054115-2044-4a2c-bdd6-f62f4aa2cb6f/image.png" alt=""></p>
<p><strong>2. 감쇠력</strong></p>
<p>   감쇠력 공식에서 유도된다:</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/15860564-50ee-4975-b603-7a54f6397952/image.png" alt=""></p>
<p>⇒ 최종적으로 각 질량점에 작용하는 힘은 <strong>$n_k$ nearest 질량점 사이의 복원력의 합 + 감쇠력의 합 + 중력</strong>으로 결정된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/89aab1a0-d2ef-4c32-ac29-424540d06ef6/image.png" alt=""></p>
<h2 id="optimization">Optimization</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/ac6c3e92-f0b1-48e8-8535-2860aded63b4/image.png" alt=""></p>
<ul>
<li><strong>Loss는 3DGS와 동일한 방식을 사용</strong>한다.</li>
</ul>
<h3 id="1-static-reconstruction"><strong>1. Static Reconstruction</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/6178ad3e-01de-48e3-92c2-c954b250df4e/image.png" alt=""></p>
<p>3DGS와 거의 동일한 방식으로 각 가우시안 커널의 색상, 투명도, 크기, 위치를 최적화한다.</p>
<h3 id="2-refining-3d-gaussians">2. Refining 3D Gaussians</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/0709835c-b73c-453f-a520-95e91ff309db/image.png" alt=""></p>
<p>이 과정이 처음엔 뭐하는 건지 조금 헷갈렸다. 저자들에 따르면, 이후 dynamic reconstruction 과정에서 질량점의 위치와 속도에 따라 가우시안 중심의 위치를 보정하면 같은 상태여도 static reconstruction의 결과에서 가우시안의 외양이 미세하게 변화하게 된다. 따라서 일관적인 가우시안 모양을 유지하기 위해 static한 상태에서 미리 가우시안의 중심좌표를 제외한 파라미터를 refine 하는 과정이다.</p>
<h3 id="3-dynamic-reconstruction"><strong>3. Dynamic Reconstruction</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/724d25d1-5548-4836-93b8-8c90248a1d1d/image.png" alt=""></p>
<p>뭐가 파라미터고 뭐가 하이퍼파라미터인지를 다시 한번 정리하면:</p>
<ul>
<li><strong>각 질량점의 초기 속도, 스프링 Stiffness, 스프링 연결 개수, 경계 조건 파라미터, 전역 감쇠 계수(전체 스프링이 하나의 감쇠 계수 공유) 가 학습된다.</strong></li>
<li><strong>질량점의 질량, 비선형 스프링 Stiffness 계수, 최소 스프링 연결 개수, 중력 가속도는 고정된 하이퍼파라미터이다.</strong></li>
</ul>
<p>이 때, 각 앵커포인트의 위치, 속도가 먼저 업데이트되고, 업데이트된 위치와 속도에 경계조건이 적용된 뒤에 이를 바탕으로 가우시안의 위치, 속도가 업데이트된다:</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/3fab446f-4059-4fc9-bd7c-16e584db475d/image.png" alt=""></p>
<p>질량점의 위치와 속도는 업데이트된 이후 물체 주변 환경의 경계조건을 적용하여 최종적으로 가우시안의 위치와 속도를 업데이트 하는 데에 쓰인다. 경계 조건은 예를 들어, 바닥이 편평한지 경사졌는지, 바람이 부는지 아닌지 등 환경에 대한 조건이다.</p>
<h2 id="experiments">Experiments</h2>
<h3 id="implementation-details"><strong>Implementation Details</strong></h3>
<ul>
<li><strong>Initial Point Cloud 생성 시, SfM 결과를 사용하면 가우시안이 객체 표면에 집중되므로 정육면체 내에서 균일 샘플링하여 생성</strong></li>
<li><strong>Real-world 데이터셋 구성시 Registration Network를 사용하여 정적 장면에서의 가우시안 – 동적 장면에서의 가우시안 동기화</strong></li>
</ul>
<h3 id="results-reconstruction--prediction-on-synthetic-dataset"><strong>Results: Reconstruction &amp; Prediction on Synthetic Dataset</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/5b81e1ab-3051-455c-a891-711a0f6ed070/image.png" alt=""></p>
<p>Synthetic Dataset에 대한 실험 결과이다. Reconstruction 부분은 아무래도 관련 모델인 4D-Gaus 등이 더 잘 수행하는 것처럼 보인다. 그러나 Future Prediction 결과에 있어서는 PAC-NeRF 보다 물체의 물성을 제대로 표현하는 것이 보인다. 특히 apple의 Future Prediction에 대한 comparison 결과에서 그 차이가 두드러진다.</p>
<h3 id="results-reconstruction--prediction-on-real-world-dataset"><strong>Results: Reconstruction &amp; Prediction on Real-world Dataset</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/dc9b4823-1154-4ad5-a3b2-a54516a52ec3/image.png" alt=""></p>
<p>데이터셋은 저자들이 직접 제작했다고 한다. Prediction 가능한 시간은 아직은 조금 짧은 감이 크다.</p>
<h3 id="results-environment-editing"><strong>Results: Environment Editing</strong></h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/6963e600-bc11-431b-81d0-1cb8ad7a1459/image.png" alt=""></p>
<p>아까 언급한 경계조건 수정을 통해 여러 환경 편집이 가능하다. <a href="https://zlicheng.com/spring_gaus/">Spring-Gaus의 프로젝트 페이지</a>에서 더 재미난 결과 영상들을 볼 수 있다.</p>
<h2 id="limitation">Limitation</h2>
<p>논문 저자들은 한계점으로 <strong>스프링 길이를 고정시켰기 때문에 탄성체 모델링에 한정되어 있다</strong>는 점, <strong>하나의 오브젝트만 시뮬레이션하는 데에 그쳤다</strong>는 점, 그리고 <strong>시공간적 해상도가 높은 더 좋은 Real-world 데이터셋의 부족</strong>을 꼽았다.
추가적으로 논문을 읽으면서 들었던 생각들을 언급해 보자면,</p>
<ul>
<li>implimentation detail에서 언급한 initial point cloud 생성 방식에 대한 ablation study가 있었으면 좋았을 것 같다.</li>
<li>앞서 다른 모델들의 한계로 언급한 부분이 얼마나 해소되었는가? 오히려 실제 응용상황에서 일반화 성능은 앞서 미리 가능한 재질을 정해두는 스타일의 모델이 나을지도 모르겠다는 생각이 든다. (elastic한 오브젝트만 시뮬레이션 가능한 것이 아니므로)</li>
<li>Dynamic Reconstruction을 위해 최대한 효율성을 가져가려다 보니, 렌더링 결과에서 사실적인 느낌이 아직 부족한 감이 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CV/논문리뷰] 3D Gaussian Splatting for Real-Time Radiance Field Rendering]]></title>
            <link>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-3D-Gaussian-Splatting-for-Real-Time-Radiance-Field-Rendering</link>
            <guid>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-3D-Gaussian-Splatting-for-Real-Time-Radiance-Field-Rendering</guid>
            <pubDate>Wed, 29 Jan 2025 14:10:40 GMT</pubDate>
            <description><![CDATA[<p>SIGGRAPH 2023에서 발표된 <a href="https://arxiv.org/abs/2308.04079">3D Gaussian Splatting (3DGS)</a> 은 3D Reconstruction과 Novel View Synthesis(NVS) 분야에서 중요한 전환점을 마련한 연구로 평가받는다. 해당 논문에서는 3D 공간을 연속적인 Gaussian 분포의 집합으로 표현하는 방식을 제안하며, 기존 NeRF 기반 모델들이 가진 느린 최적화 속도와 렌더링 시간 문제를 획기적으로 개선하였다.</p>
<p>3DGS는 NeRF와 3D point-based rendering의 장점을 결합하여 실시간 렌더링이 가능한 효율적인 3D 표현 방식을 제시한다. 이는 고품질의 Novel View Synthesis를 가능하게 하면서도, 기존 기법들보다 훨씬 빠른 학습 및 추론 속도를 제공하는 것이 특징이다. 본 포스팅에서는 해당 논문을 이해하는 데 필요한 핵심 개념과 3DGS가 제안하는 동기 및 접근법을 정리하며, 모델이 기존 방법론과 비교하여 어떤 차별점을 가지는지 분석해 보고자 한다.</p>
<hr>
<h2 id="background--motivation">Background &amp; Motivation</h2>
<ul>
<li>전통적인 Scene Reconstruction과 Rendering에서 SfM, MVS 기반 방법들은 입력에서 가려진 부분 등에 대한 복원에서 성능의 한계가 있었다.</li>
<li>NeRF 기반 방법은 3DGS 이전 가장 주목받는 방법이었지만, 기본적으로 학습 및 추론 속도가 매우 느리다. 또한 implicit한 3D 표현 방식으로 인해 활용을 위해서는 테스크에 따라 추가 작업이 필요했고, 2D로 변환할 때 더 빠른 방식인 rasterization을 사용할 수 없고 오직 ray casting방식만 가능했다.</li>
<li>Point-based 3D 표현방식은 빠르지만, point의 불연속성에 의해 표면에 대한 정보를 알 수 없고, 고해상도 이미지 표현에 한계가 있었다.</li>
</ul>
<h3 id="point-based-graphics">Point-based Graphics</h3>
<p>포인트 클라우드 기반 그래픽스는 3DGS 이전에도 오랫동안 연구되던 주제라고 한다. 그러다 3DGS가 기반삼은 방식은 비교적 최근에 연구된 point-based rendering 방법론으로, 각 point에 표면 속성을 부여한 <strong>Surfel</strong>을 활용한 아이디어이다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e79c0821-e25b-4c57-ae5d-7e6410f015bd/image.png" alt=""></p>
<p>2차원 Surfel은 Surface Splat의 줄임말로, 타원형의 형태를 가지며 위치 정보에 색상 정보를 가질 수 있다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/dbafcece-bb89-4e0d-bd0b-8f3bbbb1f1a4/image.png" alt=""></p>
<p>Vision 분야에선 SIGRAPH Asia 2019에서 발표된 Surfel을 활용한 미분가능한 렌더링 관련 연구가 있었다.
3DGS에서 활용하는 Gaussian은 2차원 Splat대신 3차원 Volume Splat으로, Volume Rendering을 가능하게 한다.</p>
<h3 id="3d-gaussian">3D Gaussian</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/ca5e428e-1343-443d-8c7d-7c5afd192fe9/image.png" alt=""></p>
<p>3D Gaussian의 표현식은 다음과 같이 3차원 공간에서 정규 분포를 정의하는 확률밀도함수(PDF)로 표현된다:</p>
<p>$(2\pi)^{-3/2} \det(\mathbf{\Sigma})^{-1/2} \exp \left( -\frac{1}{2} (\mathbf{x} - \mathbf{\mu})^{\top} \mathbf{\Sigma}^{-1} (\mathbf{x} - \mathbf{\mu}) \right)$</p>
<p>이에 따라 각 3D Gaussian은 파라미터가 업데이트되면서 scene에서 차지하는 영역과 색상이 결정된다.</p>
<h3 id="boldalpha-blending-and-radiance-fields">$\bold{\alpha}$-blending and Radiance Fields</h3>
<p>3DGS는 NeRF와 렌더링 방식에서 차이가 있지만, 그 수식은 NeRF에 등장하는 볼륨 렌더링 수식에서 유도된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/b7ca7a75-9495-4df6-8c1a-2b3b7e389f36/image.png" alt=""></p>
<p>NeRF의 다음 수식에서  $\alpha_i = 1 - \exp(-\sigma_i \delta_i)$로 치환해주면,</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/c479c123-6c24-4174-b569-61d597af27a9/image.png" alt=""></p>
<p>수식이 이렇게 변화한다. 이는 연속적인 함수를 샘플링한 것이었던 NeRF의 수식을 각 포인트(Gaussian) 기반의 계산으로 변환한 것으로 볼 수 있다. Tile Rasterization 단계에서 활용된다.</p>
<h2 id="contribution">Contribution</h2>
<ul>
<li>Point-based의, 3D Gaussian 이라는 elliptical한 volume splat을 활용한 explicit한 3D Representation 활용<ul>
<li>다른 그래픽스 프레임워크로의 융합이 용이하다.</li>
<li>Explicit한 3D 표현 덕에 ray casting 대신 rasterization 기법이 적용가능해졌으며, 덕분에 NeRF에 비해 속도 향상을 이루었다.</li>
</ul>
</li>
<li>미분가능한 Volumetric Representation.</li>
<li>신경망을 전혀 포함하지 않으면서 Gradient Descent 알고리즘을 적용하였다. 신경망이 포함되지 않아 속도 향상을 이루었다.</li>
<li>SfM으로 생성한 point-cloud가 부족하여 가우시안이 적절히 3D Reconstruction을 수행하지 못했을 때 최적화해주는 Adaptive Density Control of Gaussians</li>
<li>입력으로 viewing direction을 주어 view-dependent color을 구현한 NeRF와 달리, Spherical Harmonics를 통한 view-dependent color 구현</li>
</ul>
<h1 id="methods">Methods</h1>
<h2 id="architecture">Architecture</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/8ef447b2-0702-4ae5-895d-985becd51586/image.png" alt=""></p>
<p>전체 모델 구조는 다음과 같다:</p>
<p>(a) SfM으로 생성한 포인트클라우드와 카메라 파라미터를 입력으로 받는다. 이후 각 포인트를 <strong>평균$\mu$</strong>, <strong>공분산 행렬 $\Sigma$</strong>, <strong>색상 $\mathbf{c}$, 그리고 투명도 $\alpha$</strong>를 가진 <strong>3D Gaussian</strong>으로 변환한다.</p>
<p>(b) 카메라 데이터를 바탕으로 3D Gaussian을 2차원으로 projection한다. 그리고 <strong>Differentiable Tile Rasterizer</strong>를 통해 2D로 투영된 Gaussian들을 depth 기준으로 정렬하고 순차적으로 $\alpha$-blending 하여 출력 이미지를 렌더링한다.</p>
<p>(d) GT 이미지와의 비교로 Loss 계산 후 역전파 과정을 통해 Gaussian의 파라미터 업데이트되고, 필요시 <strong>Adaptive Density Control</strong>에 의해 Gaussian의 분할, 제거, 복제가 이루어진다.</p>
<h2 id="fast-differentiable-tile-rasterizer">Fast Differentiable Tile Rasterizer</h2>
<p>타일 기반으로 Gaussian을 정렬, 렌더링한다. GPU 가속 알고리즘으로, 각 타일을 병렬적으로 렌더링한다.</p>
<p>그 과정은 다음과 같다: </p>
<ul>
<li><p>2D Projection</p>
<p>  (a) 화면에 보이는 Gaussian만 선택할 수 있도록 Frustum Culling한다.</p>
<p>  (b) Gaussian을 2D로 projection한다. (좌표계 변환)</p>
</li>
<li><p>Tile Rasterization</p>
<p>  (a) 화면을 16X16 타일로 분할한다.</p>
<p>  (b) 타일들 중 Gaussian이 중첩되는 타일을 계산한다.</p>
<p>  (c) 타일별로 Gaussian을 depth 기준 정렬하여 순서대로 렌더링한다.</p>
<p>  (d) 이 때 하나의 타일 당 Gaussian들을 $\alpha$-blending으로 누적하여서 각 픽셀의 색상을 결정한다.</p>
</li>
</ul>
<h2 id="optimization">Optimization</h2>
<h3 id="adaptive-density-control">Adaptive Density Control</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/7592a02f-e002-49d6-a070-fed2411ac0f0/image.png" alt=""></p>
<p>3D Gaussian의 개수를 동적으로 조정하여 scene을 효율적으로 표현하는 방법이다. Gaussian의 밀도를 Loss를 바탕으로 최적화한다. Clone, Split, Pruning을 활용한다.</p>
<ul>
<li>Clone: Under-reconstruction 상황일 때. scene의 특정 영역의 정보량에 비해 <strong>Gaussian이 부족</strong>할 때, Gaussian을 복제한 이후 학습을 계속하여 최적화</li>
<li>Split: Over-reconstruction 상황일 때. scene의 특정 영역에 대한 <strong>정보가 부족</strong>하여 너무 큰 Gaussian이 넓은 영역을 커버하고 있을 때, 이를 분할하고 크기를 축소시킴.</li>
<li>Pruning: 특정 Gaussian의 $\alpha$값이 너무 작거나, 크기가 과도하게 클 때 제거한다.<ul>
<li>매 3000 iter마다 불필요한 것으로 보이는 Gaussian들의 $\alpha$값을 0으로 초기화한다. 학습이 진행되면서 $\alpha$값이 증가하지 않은 Gaussian은 삭제된다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/ea2d9e2f-830f-4bb7-9da5-dacb7e0aeec2/image.png" alt=""></p>
<p>Ablation Study 결과. Split은 백그라운드 reconstruction에 효과적이었고, Clon은 세밀한 디테일(사진상 바퀴 살)의 reconstruction에 필요했음이 보여졌다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/a69a9beb-cff0-4844-8fa5-3f4d4b9456a3/image.png" alt=""></p>
<p>Loss 는 다음과 같이 L1 + D-SSIM Loss를 합한 방식으로 정의되어 있다.</p>
<h3 id="other-ablation-studies">Other Ablation Studies</h3>
<p>그 외에도, Anisotropic한 Gaussian을 사용한 방식과 초기 Gaussian 생성시 SfM 포인트클라우드 기반으로 생성한 방식에 대한 Ablation Study 결과도 다음과 같이 제시되었다.</p>
<p><strong>Anistropic Covariance.</strong>
<img src="https://velog.velcdn.com/images/jin_a720/post/8f462ac1-cb8c-4d12-b376-9bd35221b3e5/image.png" alt=""></p>
<p><strong>Initialization from SfM.</strong> 배경을 제외하고는 큰 퀄리티 차이가 없다.
<img src="https://velog.velcdn.com/images/jin_a720/post/05d5b589-1d87-4498-b177-ad8ecc1682ce/image.png" alt=""></p>
<h2 id="results">Results</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9bb3ab63-3cd7-405c-92ea-16477cc02c7c/image.png" alt=""></p>
<p>논문의 가장 첫 장에 메인으로 등장하는 결과. 다른 모델들과 비교했을 때, inference 속도가 비교가 안되게 빠르다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e19a31b5-6f8f-4035-aa77-0ea6b764bdf4/image.png" alt=""></p>
<p>백그라운드의 디테일이나 바퀴살 등의 얇고 세밀한 표현에서 좋은 성능을 보이고 있음이 보여진다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/04582e51-dccf-40eb-bf3a-87e13efbe80f/image.png" alt=""></p>
<p>테이블로 살펴보면, 30K iteration 모델의 경우 성능이 상당히 인상깊다. NeRF가 이미지의 고해상도에 집중한 데에 비해 3DGS가 효율적 측면에 집중했다는 사실을 고려하면 시간적 효율성과 결과 퀄리티를 균형있게 잡았다.</p>
<h2 id="limitation">Limitation</h2>
<ul>
<li>Dynamic Scene에서 적용 불가하다.</li>
<li>Generalizable하지 않다.</li>
<li>Regularization이 적용되지 않았다. 몇가지 아티팩트(Gaussian이 너무 늘어지거나 갑자기 튀는 현상(Popping))이 생길 수 있는데, 추후 정규화를 통해 해결할 수 있을 것이라고 제안되어 있다.</li>
<li>explicit한 3차원 표현의 특징으로, 메모리를 많이 먹는다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CV/논문리뷰] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis]]></title>
            <link>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-NeRF-Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis</link>
            <guid>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-NeRF-Representing-Scenes-as-Neural-Radiance-Fields-for-View-Synthesis</guid>
            <pubDate>Wed, 29 Jan 2025 13:40:03 GMT</pubDate>
            <description><![CDATA[<p>ECCV 2020에서 발표된 <a href="https://arxiv.org/abs/2003.08934">NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis</a>는 MLP를 활용하여 복잡한 장면의 Novel View Synthesis(NVS) 테스크를 수행하는 연구이다. NeRF는 MLP를 활용한 이전 모델들이 복잡한 장면의 high frequency detail들을 효과적으로 재현하지 못하는 한계를 극복하며, NVS 테스크에서 큰 성능 향상을 이루었고 현재까지도 3D Reconstruction과 NVS 분야에서 NeRF의 응용 논문이 여럿 나오고 있다.
모델 구조와 아이디어는 꽤 명료한 편이므로 다소 생소한 접근법과 수식에 대한 이해를 중심으로 포스팅을 작성해 보려 한다.</p>
<hr>
<blockquote>
<p><strong>Key Points</strong></p>
</blockquote>
<ul>
<li>View Dependence를 고려하여 입력값으로 좌표 뿐 아니라 View Direction(시점 방향) 추가</li>
<li>MLP 기반의 연속적인 3D representation</li>
<li>미분가능한 Volume Rendering을 활용하여 Backpropagation을 가능하게 함</li>
<li>최적화를 위한 Positional Encoding과 Hierarchical Volume Sampling</li>
</ul>
<p>논문에 대해 이야기하기 전, 먼저 간단한 Background를 살펴보자.</p>
<h2 id="background">Background</h2>
<h3 id="3d-graphics">3D Graphics</h3>
<h4 id="3d-representation">3D Representation</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/d0f2c2f8-5c90-4e05-8bb1-71720e201b4d/image.png" alt=""></p>
<p>그래픽스에서 3D Scene이나 Object를 나타내는 방식에는 여러가지가 있다. 몇가지만 소개하자면 다음과 같다:</p>
<ul>
<li><p>Mesh: 가장 보편적으로 사용되는 방식으로, 모델링부터 렌더링까지 그래픽스의 여러 영역에서 활용이 용이하다. 그러나 NN 기반의 View Synthesis에 mesh로 3D Reconstruction을 구현하는 것은 mesh 구조 자체의 불규칙성 때문에 적절한 토폴로지를 생성해 내는 것이 어려우며 상당히 느리다는 한계가 있다.</p>
</li>
<li><p>Voxel: 2D 픽셀의 3D 버전이라고 생각할 수 있다. 보통 그래픽스에서 빠르게 저해상도로 연기 등의 파티클 시뮬레이션을 렌더링해 보는 상황에서 사용하게 된다. 또한, NN 기반 방식에서 Voxel로 3차원 scene을 표현할 때에는 렌더링 대신 활용하는 Occlusion-aware projection기법이 물리법칙에 위배된다.</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/26f3131b-1817-4769-a65e-14515334c751/image.png" alt="">
후술할 NeRF의 Volume Rendering 수식에서 다시 살펴보겠지만, 우리가 자연스럽게 느끼는 물리적 컨셉과 일치하기 위해서는 ray 위에서 시간 t에 따라 Transparency(투과도)는 감소해야 한다. 앞에 물체가 존재하고 ray와 collision이 발생했다면 그 뒤의 샘플포인트의 transparency가 더 클 수는 없기 때문이다. Voxel 기반 표현은 렌더링 수식을 사용하지 않고 신경망으로 2D 이미지의 feature를 3D Voxel의 latent feature를 인코딩하는 방식으로 3D Reconstruction을 수행하기 때문에 이러한 물리 법칙에 항상 부합하지는 않는다.</p>
</li>
<li><p>Point cloud: 말 그대로 점을 이용해 객체를 표현하고, 표면에 대한 정보를 제공하지 못한다는 단점이 있다. 이러한 표현방식은 이후 3DGS의 아이디어가 된다.</p>
</li>
</ul>
<p>앞서 언급한 세 가지 3D 표현 방식은 <strong>Explicit</strong>한 표현으로,  3D Geometry를 구체적으로 정의된 요소들을 기반으로 명시적으로 표현한다.</p>
<p>반면에 <strong>Implicit</strong>한 3D 표현 방식도 존재한다. 이 방식은 함수나 신경망을 통해 3D Geometry를 표현한다. 대표적으로 Signed Distance Function(SDF)와 같은 함수가 있다. NeRF의 경우 scene을 implicit function으로 학습하는 신경망이므로 Implicit한 표현방식을 활용한다.</p>
<h4 id="ray">Ray</h4>
<p>3D Vision, 그래픽스 분야에서 Ray의 개념은 매우 중요하다. Ray는 카메라로부터 시작되고, 카메라가 바라보는 방향으로 쏘아지는 일종의 광선이다. NeRF에서는 한 픽셀을 렌더링하기 위해 카메라에서 발사된 ray $\mathbf{r}(t)$를 따라 색상을 합산한다. ray는 일종의 직선이므로,</p>
<p>$\mathbf{r}(t) = \mathbf{o} + t\mathbf{d}$ 로 표현된다:</p>
<ul>
<li>$\mathbf{o}$ : 카메라의 원점</li>
<li>$\mathbf{d}$ : 입력으로 받은 ray의 viewing direction</li>
<li>$t$ : 매개변수</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/277bf63e-e43d-4cde-a66e-312139a42f3a/image.png" alt=""></p>
<p>NeRF에서처럼 모델에 주는 입력이 2D &quot;이미지&quot;인 경우, 모델에 이미지 한 장당 카메라의 초점거리와 카메라 중심좌표, 카메라가 바라보는 방향 등을 함께 제공하게 된다.
이 때 제공된 카메라 파라미터를 바탕으로 정해진 $\bold{o}$, $\bold{d}$에 맞추어 이미지 한 장 위의 각 픽셀에서 ray가 방출된다. 이론상으로는 모든 픽셀에서 ray를 방출하지만, 실제로는 계산을 위해 ray를 적절히 샘플링하게 된다.</p>
<h3 id="nn-for-view-synthesis">NN for View Synthesis</h3>
<h4 id="interpretability">Interpretability</h4>
<p>머신러닝, 딥러닝은 대체적으로 &quot;black-box&quot;라는 특징을 가지고 있다. 특히 딥러닝은 깊은 모델 구조 때문에 모델 내부의 판단 기준은 인간이 파악하기 어렵다. 그러나 블랙박스라는 뉴럴네트워크의 특성은 NVS 테스크를 단독으로 수행하기에 다소 문제적이다.</p>
<p>View Synthesis의 보편적인 과정을 살펴보면 2D 이미지를 통해 3D Scene을 재구성하고, 다시 이를 새로운 각도에서 바라본 2D 이미지로 뽑아낸다. 이 때, 학습을 통해 재구성된 3D Scene에서 다시 2D 아웃풋 이미지를 렌더링하는 과정은 해석 가능한 데이터를 요구한다. NeRF는 그래픽스 파이프라인에서 사용하는 렌더링 방정식을 차용해 이 문제를 해결한다. 학습 과정에서 직접 explicit한 3D Geometry를 생성하여 View Synthesis를 하기보다, 입력된 정보를 바탕으로 Ray 위의 한 점에서의 <strong>밀도</strong> 와 <strong>색상</strong> 을 학습하고, 이를 통해 inference 할 때 Novel View의 2D 이미지를 도출하기 때문이다.</p>
<h4 id="input-output-and-objective">Input, Output and Objective</h4>
<p>View Synthesis를 위한 딥러닝의 학습단계에서 입출력과 목적함수를 간단하게 생각해보면 다음과 같다:</p>
<blockquote>
</blockquote>
<ul>
<li>Input: 여러 시점에서의 2D 이미지와 여기서 추출된 정보(camera extrinsic, intrinsic 등)</li>
<li>Output: input view (GT)에 대한 2D 이미지</li>
<li>Loss: output 이미지와 GT 이미지 사이의 Pixel-wise difference의 합</li>
</ul>
<p>학습이 끝나면 Inference 단계에서 새로운 시점에 대한 2D 이미지를 생성해낸다.</p>
<h2 id="motivation-and-contribution">Motivation and Contribution</h2>
<h3 id="motivation">Motivation</h3>
<ul>
<li>View Synthesis 테스크에서 기존의 접근은 <strong>입력 이미지를 엄청나게 많이 필요</strong>로 했다.</li>
<li>혹은 3D 표현방식에 있어서 mesh, voxel 기반의 explicit한 3D 재구성 방식을 사용하였으나, 복잡한 장면에서 <strong>비효율적이거나 고해상도 디테일을 잡아내지 못하였다</strong>.</li>
</ul>
<h3 id="contribution">Contribution</h3>
<ul>
<li><strong>5차원 입력으로 좌표 $(x,y,z)$ 뿐만 아니라 Viewing Direction $(\theta,\phi)$</strong>를 추가하였다. 이에 따라 <strong>view-dependent한 색상 출력</strong>이 가능해진다.</li>
<li><strong>Volume Rendering</strong> 수식 기반으로 <strong>미분가능한 렌더링 기법</strong>을 활용, Rendering Loss를 계산하는 방식으로 최적화. 덕분에 해석가능한 변수를 활용할 수 있게 되어 <strong>물리적 컨셉과 일치</strong>하는 View Synthesis가 가능해진다.</li>
<li>Positional Encoding과 Hierarchical Sampling으로 <strong>high-frequency 정보 학습 능력을 향상</strong>시켰다.</li>
</ul>
<h2 id="architecture">Architecture</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/cf362667-27ee-4a95-b00f-f3a802ffbdcd/image.png" alt=""></p>
<p>NeRF의 전체 구조는 대략적으로 다음과 같다.</p>
<p>(a) 이미지의 각 픽셀에서 Ray를 쏘아 그 위의 점들을 샘플링한다. 그리고 하나의 Ray 위의 각 샘플링 포인트의 위치좌표와 Ray의 방향인 viewing direction을 네트워크에 입력으로 준다. 이 때 입력은 <strong>Positional Encoding</strong>을 통해 고차원으로 매핑된다.</p>
<p>(b) 네트워크는 각 샘플링 포인트에 대해 밀도와 <strong>시점 의존적인</strong> 색상을 출력한다.</p>
<p>(c) 하나의 Ray 위의 모든 샘플링 포인트들의 밀도와 색상을 합하여 <strong>Volume Rendering</strong>한다. 출력된 값은 Ray를 쏘아 준 픽셀 값에 대한 예측값이 된다. 이 때 High frequency 디테일을 표현하기 위해 밀도가 높은 부분에서 추가적인 샘플링을 진행하는 <strong>Hierarchical Volume Sampling</strong>을 통해 학습을 최적화한다.</p>
<p>(d) 한 픽셀의 GT 값과 Volume Rendering된 예측값의 <strong>MSE Loss</strong>를 계산하는 방식으로 역전파를 진행한다.</p>
<h3 id="network-structure">Network Structure</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/248576cf-4a29-4dab-95ab-d4a780280e22/image.png" alt=""></p>
<p>NeRF의 네트워크 $F_{\Theta}$구조만 보면 사실 상단 이미지가 전부로, 상당히 간결하다. 
구성 요소는 다음과 같다:</p>
<ul>
<li><p>$F_{\Theta}: (\bold{x}, \bold{d}) \rightarrow (\bold{c}, \sigma)$</p>
</li>
<li><p><strong>Input</strong>: $(x,y,z,\theta, \phi)$</p>
<ul>
<li>$\bold{x}=(x,y,z)$: 위치 좌표<ul>
<li>$\bold{d}=(\theta, \phi)$: viewing direction</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Output</strong>: density $\bold{\sigma}$, RGB radiance $\bold{c}$</p>
<ul>
<li>$\sigma$: 위치 $\bold{x}$에서의 밀도<ul>
<li>$\bold{c}$: 위치 $\bold{x}$와 viewing direction $\bold{d}$ 에서의 RGB 컬러</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>네트워크는 fully-connected 레이어로만 구성되어 있으며, 입력 5D 좌표를 이에 대응하는 volume density $\sigma$와 시점 의존적인 색상 $\bold{c}$로 매핑하도록 가중치 $\Theta$를 최적화하도록 학습된다. 밀도는 다중 시점에서 항상 일관적이어야 하므로 8개의 fc 레이어에서 $\bold{x}$만으로 학습이 진행된다. 다섯번째 레이어에서 skip connection을 한번 거치고, 밀도 $\sigma$를 출력하는 추가 레이어에서 시점 의존적인 $\bold{c}$를 위해 $\bold{d}$를 입력으로 추가하게 된다. </p>
<p>밀도는 항상 0 이상이 되어야 하므로 앞 8개의 레이어에서는 활성함수로 <strong>ReLU</strong>를 사용해주고, $\bold{c}$를 출력하기 전에는 Sigmoid 함수를 사용하여 색상 값을 정규화해준다.</p>
<blockquote>
<p>cf). 입력에 2D 이미지만 주고 카메라 extrinsic, intrinsic 파라미터 정보가 필요없나 궁금했는데, 코드를 보니 필요했다. point cloud를 만들지 않으니 3DGS처럼 SfM을 사용하지는 않지만, 픽셀 좌표계에서 카메라 좌표계로 변환할 때 카메라 데이터 사용한다.</p>
</blockquote>
<h2 id="methods">Methods</h2>
<h3 id="volume-rendering">Volume Rendering</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/addc48ee-20b3-40e2-8c00-88d56171d88c/image.png" alt=""></p>
<p>NeRF 논문을 처음 읽을 때 가장 당황스러운 부분을 꼽으라면 아마 이 렌더링 방정식을 만났을 때일 것이다. 이 수식은 Ray 하나의 radiance를 구하는 수식이다. 즉, 하나의 &quot;픽셀&quot; 값을 결정하는 수식인 것이다. 우리의 목표는 네트워크에서 출력된 $\bold{c}, \sigma$를 이 방정식에 넣어서, 특정 픽셀 값인 $C(\bold{r})$을 예측하고, 이를 GT 이미지의 해당 픽셀값과의 비교를 통해 Loss를 계산하는 것이었다.</p>
<p>따라서 큰 틀에서, 이 수식은 $t_{near}$ 부터 $t_{far}$까지 특정 ray 위의 지점 $t$에 대한 $\bold{c}, \sigma$ 값을 바탕으로 한 radiance 정보를 차곡차곡 적분해서 전체 ray의 radiance 값을 구해내는 과정이다.</p>
<h4 id="density-sigma">Density $\sigma$</h4>
<p>피적분함수가 무엇을 의미하는지를 알아보기 위해서, 먼저 밀도 $\sigma$의 진짜 의미를 생각해 볼 필요가 있다. </p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/5a079ce1-e94e-4c39-9be0-3060b4218bf5/image.png" alt=""></p>
<p>$\sigma(x)$는 특정 지점에서의 <strong>volume density</strong> 또는 <strong>소멸 계수(extinction coefficient)</strong> 를 나타낸다. 이는 해당 위치에서 ray가 얼마나 흡수되거나 산란되는지를 결정한다.
더 쉽게 생각해 보자면, ray 위의 한 영역을 확대해 생각해 볼 수 있다. 이 영역 내에 물체나 volume이 존재한다면, 그 안의 여러 입자가 ray에 충돌할 것이다. 이 때, $t$ 지점에서 이 입자의 밀도를 $\rho(t)$, 그림의 확대된 ray가 통과하는 면적을 $E$, 입자 하나의 단면적(= 입자의 투영된 면적)을 $A$라 한다면, 밀도는 다음과 같은 개념에서 유도된다:</p>
<ul>
<li>$\rho(t)E\Delta t$: 특정 ray 영역 내 입자의 수</li>
<li>${{A\rho(t)E\Delta t}\over{E}} = A\rho(t)\Delta t$: 직관적으로 입자에 의해 가려진 ray 영역의 비율이므로, <strong>ray가 특정 구간에서 만나는 입자의 비율</strong> </li>
<li>$\sigma(t) = A \rho(t)$: 특정 지점에서의 <strong>소멸 계수(opacity)</strong></li>
</ul>
<p>결론적으로, $\sigma(t)$는 ray가 특정 위치에서 얼마나 흡수될 가능성이 있는지를 나타내는 값으로, <strong>입자의 밀도와 크기</strong>를 모두 반영하게 된다.</p>
<p>이러한 이해를 바탕으로, 위의 volume rendering 수식을 구체적으로 살펴보면 다음과 같다:</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/addc48ee-20b3-40e2-8c00-88d56171d88c/image.png" alt=""></p>
<ul>
<li><p>$T(t)\sigma(\bold{r}(t))$: 지점 $t$에서의 충돌 확률. Ray가 $t$까지 투명도를 유지하였다가 딱 $t$에서 충돌할 확률.</p>
<ul>
<li><p>$T(t)$: 투명도. 광선이 특정 지점 $t$까지 충돌하지 않고 통과할 확률</p>
<p>  <img src="https://velog.velcdn.com/images/jin_a720/post/59e0dc9f-ca46-4529-8103-a256ef29050f/image.png" alt=""></p>
<p>  $t$ 가 커질수록 $T$는 작아지므로, <strong>voxel 표현에서 문제되었던 물리적 컨셉과의 일치가 이루어짐</strong></p>
</li>
<li><p>$\sigma(\bold{r}(t))$: 소멸 계수. $t$ 시점에 충돌할 확률 밀도</p>
</li>
</ul>
</li>
<li><p>$c(\mathbf{r}(t), \mathbf{d})$ : 특정 위치, 시점 방향에서의 색상</p>
</li>
</ul>
<p>그리고 이 방정식은 다시 실제로 코드를 통해 구현되기 위해, 연속적인 적분이 아니라 구간을 샘플링하여 이산적으로 합산하는 방식으로 표현되고 결과적으로는 다음 방정식을 통해 하나의 ray에 대한 radiance 값이 도출된다:</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/6f185da3-bd7f-4fc3-a3e7-b75af2a2c9a9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9d73e578-42af-408d-95ac-bf0c1094bc43/image.png" alt="">
결과적으로, 그림과 같이 방향에 따라 색상이 다르게 나타나는 view-dependent한 radiance가 표현될 수 있다. </p>
<h3 id="optimization">Optimization</h3>
<h4 id="input-positional-encoding">Input: Positional Encoding</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/1a9f01b3-ec67-41b4-b4ea-52d5bf29d2e5/image.png" alt=""></p>
<p>Positional Encoding은 high-frequency 특징 학습을 돕는다.</p>
<p>$\gamma$는  $\mathbb{R}$을  $\mathbb{R}^{2L}$의 고차원으로 매핑시켜주는 함수로, Transformer 모델 아키텍처에서 나타나는 positional encoding과 유사한 형태로 사인,코사인 변환을 통해 차원을 확장하고, 입력값에 적용되어 결과적으로 네트워크는 $(\mathbf{x}, \mathbf{d})$ 대신 $(\gamma(\mathbf{x}), \gamma(\mathbf{d}))$을 입력으로 받게된다.</p>
<p>이 때 $L=10$일 때 가장 실험적으로 성능이 좋았다고 논문은 밝히고 있다.</p>
<h4 id="hieriarchical-volume-sampling">Hieriarchical Volume Sampling</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/f8d447ab-6ac8-447a-96c9-a623f014d44c/image.png" alt=""></p>
<p>마찬가지로 high-frequency 정보를 표현하기 위해, ray를 sampling할 때 균등 간격으로 먼저 큰 특징을 샘플링하고, 밀도가 높은 구간을 다시한번 샘플링한다.</p>
<p>이를 위해 NeRF는 두 개의 네트워크를 사용한다:</p>
<ul>
<li>Coarse Network<ul>
<li>ray를 따라 <strong>$N_c$</strong> 개의 샘플을 뽑아 색상과 밀도를 예측.</li>
<li>균등(Stratified) 샘플링</li>
</ul>
</li>
<li>Fine Network<ul>
<li>Coarse Network의 결과를 활용하여 중요한 영역을 추가 샘플링</li>
<li><strong>$N_f$</strong> 개의 추가 샘플을 Coarse network에서 계산한 밀도 $\sigma$ 값을 기반으로 더 중요한 영역을 집중적으로 샘플링</li>
<li>불균등 샘플링</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9e807655-f6a3-40f9-b45e-e317009986ab/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/357c3b31-1771-4243-b318-f7b30c007b39/image.png" alt=""></p>
<p>ablation study에서 Positional Encoding, Hierarchical Volume Sampling이 효과적으로 모델 성능을 올려주고 있음을 제시하고 있다.</p>
<h4 id="loss-function">Loss Function</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/41970b8d-465e-4897-8431-5b1c87486663/image.png" alt=""></p>
<p>최종적으로, Loss는 모든 ray에 대해 Corse 네트워크 출력의 MSE Loss와 Fine 네트워크 출력의 MSE Loss를 합산하여 구해진다.</p>
<h2 id="limitation">Limitation</h2>
<ul>
<li>Dynamic Scene에서 적용 불가하다.</li>
<li>Generalizable하지 않다.</li>
<li>속도가 느려 real-time inference가 불가능하다.</li>
<li>여러 application에 번거로움이 있다. implicit한 표현 방식은 다른 분야에 접목시키기 위해서는 추가적인 단계를 거쳐야 함을 의미한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CV/논문리뷰] Few-shot Gaussian Splatting]]></title>
            <link>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0Few-shot-Gaussian-Splatting-zjxhhfll</link>
            <guid>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0Few-shot-Gaussian-Splatting-zjxhhfll</guid>
            <pubDate>Tue, 21 Jan 2025 08:30:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><em>이 글은 &quot;인공지능연구개론&quot; 수업 일환으로 작성된 영어 논문리뷰 블로그포스팅을 한글로 재번역한 것입니다.</em></p>
</blockquote>
<p><strong>Few-shot Gaussian Splatting</strong><a href="https://arxiv.org/abs/2312.00451">[1]</a>은 ECCV 2024에서 발표된 최신 논문이다. SIGGRAPH 2023에서 발표된 <strong>3D Gaussian Splatting</strong><a href="https://arxiv.org/abs/2308.04079">[2]</a>은 3D 재구성과 새로운 뷰 합성(Novel View Synthesis) 분야에서 획기적인 연구로 평가받으며 큰 주목을 받았다. 그 이후로 이 모델을 개선하기 위한 다양한 시도가 이루어졌으며, &quot;FSGS: Real-Time Few-shot View Synthesis using Gaussian Splatting&quot;은 그러한 노력 중 하나로, 3DGS의 희소한 입력에서의 성능을 향상시키는 방법을 제안한 연구이다.</p>
<p>이 글에서는 해당 논문을 이해하기 위해 필요한 배경 지식과 FSGS가 제안하는 동기 및 접근법에 대해 다룰 것이다.</p>
<h2 id="background">Background</h2>
<p>FSGS를 이해하기 위해서는 <strong>Novel View Synthesis (NVS)</strong>와 <strong>3D Gaussian Splatting (3DGS)</strong>라는 두 가지 핵심 개념을 이해하는 것이 중요하다.</p>
<h3 id="novel-view-synthesisnvs">Novel View Synthesis(NVS)</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/33ad8e58-0b8f-4ba2-9765-a498328cf739/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 1</b>: Novel View Synthesis  (Source: Image taken from <a href="#ref1" target="_blank">[3]</a> and edited by the author).
  </figcaption>

<p>Novel View Synthesis는 제한된 수의 이미지를 input으로 받아 장면의 새로운 view를 생성하는 3D 비전 분야에서 핵심적인 테스크이다. 접근법은 깊이 추정(Depth Estimation)부터 장면 생성(Scene Generation)까지 다양하지만, 목표는 동일하다. <U>주어진 시점들 사이를 보간하여, 이전에 보지 못한 각도에서 장면이 어떻게 보일지를 예측하는 것</U>이다.</p>
<h3 id="nerf-and-3d-gaussian-splatting">NeRF and 3D Gaussian Splatting</h3>
<p>대부분의 NVS가 주요 과제인 경우, <strong>NeRF</strong><a href="https://arxiv.org/abs/2003.08934">[3]</a>와 <strong>3DGS</strong>가 주요 비교 모델로 사용된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/0cdef4fc-d0ae-4654-89eb-3070bbac5bca/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 2</b>: NeRF vs. Gaussian Splatting  (Source: Image taken from <a href="#ref1" target="_blank">[7]</a>).
  </figcaption>

<p>NeRF는 3D 장면을 <strong>밀도(density)</strong>와 <strong>방사(radiance)</strong>이라는 주요 매개변수를 사용하는 신경망으로 implicit하게 표현한다. 밀도는 투명도를 제어하며, radience는 scene 환경에 영향을 받는 <strong>색상과 lighting</strong>을 제어한다. 이를 통해 NeRF는 객체의 구조와 공간적 배치를 추론할 수 있다.</p>
<p>반면, 3DGS는 <strong>3D Gaussian</strong>이라는 타원형 3D 포인트를 통해 명시적으로 3D 장면을 표현한다. 각 가우시안은 <strong>위치, 크기, 색상, 불투명도, 방향성</strong> 등의 속성을 가진다. 3DGS는 사전에 2D 이미지로부터 생성된 point cloud를 입력으로 받는다. 이 점들은 단순히 표면을 샘플링한 데이터로, 각 점은 고유한 위치와 색상 정보를 포함한다. 각 점을 중심으로 3D 가우시안을 생성하며, 이들의 속성을 입력된 참조 이미지(ground truth)에 맞게 학습시킨다. 3DGS가 인기를 얻는 이유는 거의 실시간으로 3D 재구성과 NVS를 수행할 수 있기 때문이다.</p>
<p>여기서 중요한 질문이 제기된다. 3D Gaussian Splatting은 3D 장면을 적절히 표현하기 위해 충분한 point cloud가 필요하다. <strong>그렇다면, 만약 장면을 완전히 포착하기에는 point cloud가 부족할 경우엔 어떻게 될까? 3DGS가 그러한 sparse한 조건에서도 장면을 충분히 표현할 수 있을까?</strong></p>
<h2 id="few-shot-3dgs">Few-shot 3DGS</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/416da17a-c6ca-4539-84e3-4d62bc2c79ec/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 3</b>: FSGS Pipeline (Source: Image taken from FSGS paper).
  </figcaption>


<h3 id="problem-setting">Problem Setting</h3>
<p>3DGS는 initial 가우시안을 생성하기 위한 정점이 부족할 경우 3D 장면을 정확히 표현하는 데 어려움을 겪는다. sparse한 입력에서 발생하는 문제를 생각해보자. 첫째, input 이미지의 수가 적기 때문에 모델이 <strong>레퍼런스로 삼을 뷰가 부족</strong> 하고, 이는 input 이미지에서는 보이지 않는 가려진 scene 일부에 대한 <strong>perspective 부족</strong>으로 이어진다. 이는 깊이 예측을 어렵게 만든다. 둘째, 다양한 perspective의 부족은 <strong>가우시안의 수가 부족</strong>하게 만들어 장면을 적절히 &quot;그려내는&quot; 데 한계를 준다.</p>
<p>FSGS의 저자들은 few-shot 세팅에서 3DGS를 적용할 때 발생하는 두 가지 주요 문제를 다음과 같이 정의한다.</p>
<h4 id="1-smooth-texture">1. Smooth Texture</h4>
<p>부족한 입력 이미지로 인해 3DGS는 가우시안을 충분히 생성하지 못한다. 이는 너무 크거나 과도하게 늘어난 가우시안을 초래한다. 3DGS에서는 이를 &quot;Adaptive Density Control&quot; 방식으로 접근하여 해결하지만, 입력 이미지가 너무 적을 경우 결과적으로 모델은 scene의 디테일을 표현하지 못하고 지나치게 부드러운 텍스처를 생성하게 된다.</p>
<h4 id="2-overfitting-propensity">2. Overfitting Propensity</h4>
<p>희소한 입력은 또한 모델이 학습된 뷰포인트에 과적합하는 경향을 증가시킨다. 이는 가우시안이 학습된 뷰 방향으로 늘어나는, 부정확한 장면 표현을 초래한다.</p>
<h3 id="approaches">Approaches</h3>
<p>위에서 언급한 문제를 해결하기 위해, FSGS는 두 가지 주요 접근법을 채택하여 부족한 요소들을 &quot;더 많이&quot; 생성하는 것을 목표로 한다. 즉, 더 많은 가우시안과 더 많은 이미지(따라서 더 많은 깊이 정보)를 생성하는 것이다.</p>
<h4 id="1-proximity-guided-gaussian-unpooling">1. Proximity-guided Gaussian Unpooling</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/d3f1fa36-2afd-4f1d-b413-a6254ebfd223/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 4</b>: (a) Gaussian Unpooling(Source: Image taken from FSGS paper). (b) Detailed Gaussian Unpooling Process with K=3. by the author.
  </figcaption>

<p>근접성 기반 가우시안 Unpooling은 <strong>추가 가우시안을 최적의 위치에 생성</strong>하는 기술이다. 이 방법에서 기존 가우시안 중 하나가 <strong>&quot;Source&quot; 가우시안</strong>으로 지정되고, 가장 가까운 $K$개의 가우시안이 <strong>&quot;Destination&quot; 가우시안</strong>으로 지정된다. 구체적으로, Source 가우시안은 다른 세 가우시안과의 유클리드 거리가 가장 작은 가우시안이다. Source와 Destination 가우시안 사이의 유클리드 거리가 특정 임계값을 초과하면, 두 가우시안을 연결하는 선을 따라 새로운 가우시안이 생성된다. 새 가우시안은 Destination 가우시안의 초기 크기와 불투명도를 상속받고, 다른 속성은 0으로 초기화된다.</p>
<h4 id="2-geometry-guidance-for-gaussian-optimization">2. Geometry Guidance for Gaussian Optimization</h4>
<p>이 접근법에서는 <strong>&quot;pseudo view&quot;</strong> 를 생성하여 입력의 희소성을 완화한다. 이 pseudo view는 기존 참조 뷰포인트(GT 뷰포인트) 사이에 위치하며, 이 위치에서 카메라 뷰가 생성된다. 이 위치에서 렌더링된 이미지는 학습 과정에서 사용된다. 그러나 가상 뷰 자체가 &quot;예측된&quot; 이미지이기 때문에, <strong>FSGS는 이를 효과적으로 활용하기 위해 깊이 정보를 활용한다</strong>.</p>
<p><strong>Depth Map Utilization</strong>
<img src="https://velog.velcdn.com/images/jin_a720/post/75dc1666-da0c-46df-95b8-5436c9f836a4/image.gif" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 5</b>: Depth map (Source: Image taken from <a href="#ref1" target="_blank">[4]</a>).
  </figcaption>

<p>깊이 맵은 공간 깊이를 알파 또는 RGB 표현으로 제공하며, 컴퓨터 비전에서 2D 이미지로부터 3D 공간을 재구성하는 데 일반적으로 사용된다. FSGS는 깊이 맵을 활용하여 두 가지 유형의 깊이 데이터 간 상관관계를 계산한다: (1) 래스터화된 이미지의 깊이 (2) 3D 가우시안에서 추출된 깊이. 이 두 깊이를 비교하여 3D 가우시안의 공간적 정확도를 학습시킨다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/8a4dfc4e-a849-467e-830d-d8f5adf799bc/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 6</b>: Depth Correlation Process (Source: Image taken from FSGS paper).
  </figcaption>

<p>** (1) 입력 이미지의 깊이 **
먼저, 가상 뷰와 GT 뷰 모두에 대해, image-depth 쌍으로 사전 학습된 Dense Prediction Transformer(DPT)<a href="https://arxiv.org/abs/2103.13413">[5]</a>를 사용하여 이미지의 깊이를 예측한다.</p>
<p>** (2) 3D 가우시안에서 추출된 깊이 **
반면, 이 깊이 맵은 학습 중에 출력되는 렌더링된 뷰로부터 유도(또는 래스터화)된다. 이는 실제 학습 중인 3D 가우시안에서 렌더링된 장면의 깊이에 기반하여 생성된다.</p>
<h2 id="conclusion">Conclusion</h2>
<p>이 글에서는 FSGS로 이어지는 연구의 발전 과정과 핵심 접근법을 다루었다. Few-shot NVS 과제는 여전히 중요하다. 이는 사용자가 NVS를 수행하기에 충분한 입력 이미지를 확보하지 못하는 Real-world 시나리오를 다루기 때문이다. FSGS에서 제안된 방법들은 이러한 과제에 해결책을 제시하며, 실시간 렌더링 기능과 높은 모델 성능을 포함한 3DGS의 장점을 유지한다.</p>
<p>그러나 FSGS의 접근법에 대해 다음과 같은 두 가지 질문을 던지고 싶다:</p>
<ol>
<li>생성된 가우시안을 초기화하는 데 있어, 일부 속성 값을 0으로 설정하는 것보다 더 나은 방법이 있을까?</li>
<li>첫 번째 깊이 맵은 DPT에 의해 &quot;예측&quot;된 것이고, 두 번째 깊이 맵은 &quot;예측된&quot; 가우시안으로부터 생성된 것이다. 예측된 깊이 맵 간의 상관관계를 사용하여 모델을 학습시키는 것이 stable할까?</li>
</ol>
<p>FSGS의 실험 결과는 이 글에서 다루지 않았지만, FSGS 프로젝트 페이지<a href="https://zehaozhu.github.io/FSGS/">[6]</a>에서 더 많은 세부 정보와 결과를 확인할 수 있다.</p>
<hr>
<h3 id="references">References</h3>
<p>[1]    Zehao Zhu, Zhiwen Fan, Yifan Jiang, and Zhangyang Wang. 2023. FSGS: Real-Time Few-shot View Synthesis using Gaussian Splatting. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2312.00451">http://arxiv.org/abs/2312.00451</a></p>
<p>[2]    Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, and George Drettakis. 2023. 3D Gaussian splatting for real-time radiance Field rendering. arXiv [cs.GR]. Retrieved from <a href="http://arxiv.org/abs/2308.04079">http://arxiv.org/abs/2308.04079</a></p>
<p>[3]    Ben Mildenhall, Pratul P. Srinivasan, Matthew Tancik, Jonathan T. Barron, Ravi Ramamoorthi, and Ren Ng. 2020. NeRF: Representing scenes as neural radiance fields for view synthesis. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2003.08934">http://arxiv.org/abs/2003.08934</a></p>
<p>[4]    Priya Dwivedi. 2019. Depth Estimation on Camera Images using DenseNets. Towards Data Science. Retrieved November 1, 2024 from <a href="https://towardsdatascience.com/depth-estimation-on-camera-images-using-densenets-ac454caa893">https://towardsdatascience.com/depth-estimation-on-camera-images-using-densenets-ac454caa893</a></p>
<p>[5]    Ranftl René, Bochkovskiy Alexey, and Koltun Vladlen. 2021. Vision Transformers for Dense Prediction. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2103.13413">http://arxiv.org/abs/2103.13413</a></p>
<p>[6]    Zhangyang Wang. FSGS. Github.io. Retrieved November 1, 2024 from <a href="https://zehaozhu.github.io/FSGS/">https://zehaozhu.github.io/FSGS/</a></p>
<p>[7]    Researchgate.net. Retrieved November 1, 2024 from <a href="https://www.researchgate.net/figure/Novel-3D-data-representations-3-6_fig3_381142897">https://www.researchgate.net/figure/Novel-3D-data-representations-3-6_fig3_381142897</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CG/개념] Introduction to Computer Graphics with OpenGL ES CH04: Spaces and Transforms]]></title>
            <link>https://velog.io/@jin_a720/CG%EA%B0%9C%EB%85%90-Introduction-to-Computer-Graphics-with-OpenGL-ES-CH04-Spaces-and-Transforms</link>
            <guid>https://velog.io/@jin_a720/CG%EA%B0%9C%EB%85%90-Introduction-to-Computer-Graphics-with-OpenGL-ES-CH04-Spaces-and-Transforms</guid>
            <pubDate>Tue, 21 Jan 2025 07:47:54 GMT</pubDate>
            <description><![CDATA[<p>이 시리즈에서는 <a href="https://youtube.com/playlist?list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&amp;feature=shared">고려대학교 한정현 교수님의 Computer Graphics 강의</a>에서 공부한 내용을 정리해보고자 한다. 강의는 교수님의 저서 Introduction to Computer Graphics with OpenGL ES 를 바탕으로 진행되었다.</p>
<hr>
<h1 id="ch04-spaces-and-transforms">CH04: Spaces and Transforms</h1>
<blockquote>
<p><strong>Key Points</strong></p>
</blockquote>
<ul>
<li>2D, 3D 공간의 오브젝트의 Scaling, Rotation, Translation</li>
<li>세 Transform의 composition과 Affine Transform</li>
<li>World Space - Object Space의 관계와 표현</li>
</ul>
<h2 id="rotation-scaling-and-translation">Rotation, Scaling and Translation</h2>
<p><strong>Rotation(회전), Scaling(확대/축소), Translation(이동)</strong> 은 그래픽스에서 객체의 <strong>Transform(변환)</strong> 을 표현하기 위해 사용된다.</p>
<p>선형 변환인 Rotation, Scaling과 Translation은 행렬을 통해 나타낼 수 있다. 이 때 삼차원 공간의 정점 $(x,y,z)$의 Rotation, Scaling은 3X3 행렬로, Translation은 4X4 행렬로 나타낸다. </p>
<h3 id="scaling">Scaling</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/bd9ccf76-17a3-44c3-9021-1f8fe26a6ea2/image.png" alt=""></p>
<p>물체의 Scaling은 다음과 같이 정사각 대각 행렬로 나타낸다:
$$
S=
\left(\begin{array}{ccc}
s_x &amp; 0 &amp; 0 \
0 &amp; s_y &amp; 0 \
0 &amp; 0 &amp; s_z
\end{array}\right)\left(\begin{array}{l}
x \
y \
z
\end{array}\right)=\left(\begin{array}{l}
s_x x \
s_y y \
s_z z
\end{array}\right)
$$</p>
<p>그림과 같이 특정 방향만으로도 확대/축소가 가능하다.</p>
<h3 id="rotation">Rotation</h3>
<p>Rotation은 $(x,y,z)$처럼 직교좌표계로 표현된 좌표를 극좌표계로 변환하는 과정을 안다면 쉽게 표현할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/39c83c42-c4ab-4278-aded-732a88151a4a/image.png" alt=""></p>
<p>먼저 2차원 공간에서 벡터 $(x,y)$를 원점을 기준으로 $\theta$만큼 회전시킨 $(x&#39;,y&#39;)$를 구하는 과정에서 회전행렬 $R$을 유도할 수 있다. 그 과정은 다음과 같다:</p>
<p>$$
\begin{aligned}
x&amp; =r \cos \phi \
y&amp; =r \sin \phi \\
x^{\prime}&amp; =r \cos (\phi+\theta) \
&amp; =r \cos \phi \cos \theta-r \sin \phi \sin \theta \
&amp; =x \cos \theta-y \sin \theta \
y^{\prime}&amp; =r \sin (\phi+\theta) \
&amp; =r \cos \phi \sin \theta+r \sin \phi \cos \theta \
&amp; =x \sin \theta+y \cos \theta
\end{aligned}
$$</p>
<p>결과적으로 Rotation은 2차원에서 다음과 같이 나타낸다:
$$
R=\left(\begin{array}{cc}
\cos \theta &amp;-\sin \theta \
\sin \theta &amp; \cos \theta
\end{array}\right)
$$</p>
<p>3차원으로 확장될 때는 어떨까? 점을 중심으로 회전이 이뤄지는 2차원과 달리 3차원에서는 <strong>축</strong>을 중심으로 회전이 일어난다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/a33f7d02-d30f-4f50-ae47-84f2869a3f73/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/c7a3628c-c64d-4af9-8373-9022976b5824/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>그러나 생각해보면, 한 축 $z$를 기준으로 회전이 발생할 때, 각 정점의 회전 후의 $z$좌표 $z&#39;$은 변하지 않는다. 이는 회전축이 되는 방향에서는 좌표 변화가 없고, 다른 두 방향에서만 좌표의 변화가 일어난다는 것을 의미한다.</p>
<p>각 회전축을 중심으로 하는 회전을 각각 $R_x, R_y, Rz$라 하자. 하나의 회전에 대한 표현을 구하면, 나머지 두 회전은 각 회전이 반시계 방향(CCW)으로 이루어진다는 점과 축의 상대적인 위치 변화를 바탕으로 유도할 수 있다.</p>
<p>구체적으로, $z$축을 기준으로 90° 회전이 이루어질 경우, $x$축은 $y$축의 위치로 회전한다. 이와 같은 방식으로, $x$축을 기준으로 90° 회전할 경우 $y$축이 $z$축 위치로 이동한다. 마찬가지로, $y$축을 기준으로 90° 회전하면 $z$축이 $x$축 위치로 회전한다. 이러한 관계를 이용하면 $R_x$, $R_y$, $R_z$ 회전 행렬을 모두 유도할 수 있다.</p>
<p>이렇게 구해진 $R_x, R_y, Rz$는 다음과 같다:</p>
<p>$$
R_x=\left(\begin{array}{ccc}
1 &amp; 0 &amp; 0 \
0 &amp; \cos \theta &amp; -\sin \theta\
0 &amp; \sin \theta &amp; \cos \theta
\end{array}\right)<br>R_y=\left(\begin{array}{ccc}
\cos \theta &amp; 0 &amp; \sin \theta\
0 &amp; 1 &amp; 0 \
-\sin \theta &amp; 0 &amp; \cos \theta
\end{array}\right)<br>R_z=\left(\begin{array}{ccc}
\cos \theta &amp; -\sin \theta &amp; 0\
\sin \theta &amp; \cos \theta &amp; 0 \
0 &amp; 0 &amp; 1
\end{array}\right)
$$</p>
<h3 id="translation--homogeneous-coordinates">Translation &amp; Homogeneous Coordinates</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/ed0db1fd-b7c2-4bfa-ba2b-bfa9655c0567/image.png" alt=""></p>
<p>Translation은 물체의 이동을 나타내고, vector addition으로 간단히 표현된다. 그러나 그래픽스에서 물체는 세 가지 transform 중 한가지 변환만을 거치지 않는다. 따라서 transform을 rotation, scaling과의 일관성을 유지하기 위해 matrix multiplication으로 표현해야 한다. 이를 위해서 homogeneous coordinates가 요구된다.</p>
<h4 id="homogeneous-coordinates">Homogeneous Coordinates</h4>
<p>Homogeneous Coordinates(동차 좌표계)는 $N$ 차원의 벡터 혹은 정점을 표현할 때 $N+1$차원의 표현을 사용하는 방식으로, 컴퓨터그래픽스나 컴퓨터 비전에서 흔히 사용된다. 예를 들어, $(x,y)$를 표현할 때 $(x,y,1)$ 처럼 마지막 요소로 1을 추가해 줄 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/be44334f-620c-4672-8940-a6f6c534ace3/image.png" alt=""></p>
<p>그러나 마지막 요소가 항상 1이어야 하는 것은 아니다. 1을 $w$로 바꾸어주면, 하나의 cartesian 좌표는 0과 이 좌표를 이어 $(wx, wy, w)$로 표현되는 직선과 $w=1$의 교점으로 볼 수 있다. 그리고 0이 아닌 weight $w$에 의해 하나의 cartesian 좌표로 무한하게 많은 동차 좌표계의 정점을 만들 수 있다.</p>
<p>Homogeneous Coodinates를 이용하면 vector addition으로 표현된 translation을 다음과 같이 matrix multiplication으로 표현할 수 있다:</p>
<ul>
<li><p>2차원의 경우
$$
T=\left(\begin{array}{cccc}1 &amp; 0 &amp; d_x \ 0 &amp; 1 &amp; d_y \ 0 &amp; 0 &amp; 1  \end{array}\right)\left(\begin{array}{c}x \ y \ 1\end{array}\right)=\left(\begin{array}{c}x+d_x \ y+d_y \ 1\end{array}\right)
$$</p>
</li>
<li><p>3차원의 경우
$$
T=\left(\begin{array}{cccc}1 &amp; 0 &amp; 0 &amp; d_x \ 0 &amp; 1 &amp; 0 &amp; d_y \ 0 &amp; 0 &amp; 1 &amp; d_z \ 0 &amp; 0 &amp; 0 &amp; 1\end{array}\right)\left(\begin{array}{c}x \ y \ z \ 1\end{array}\right)=\left(\begin{array}{c}x+d_x \ y+d_y \ z+d_z \ 1\end{array}\right)
$$</p>
</li>
</ul>
<p>이제 $S$, $R$ 행렬도 마찬가지로 일관성있게 표현해주면 translation, scaling, rotation은 최종적으로 다음과 같이 표현된다:</p>
<p>$$
T=\left(\begin{array}{cccc}1 &amp; 0 &amp; 0 &amp; d_x \ 0 &amp; 1 &amp; 0 &amp; d_y \ 0 &amp; 0 &amp; 1 &amp; d_z \ 0 &amp; 0 &amp; 0 &amp; 1\end{array}\right)\</p>
<p>S=
\left(\begin{array}{cccc}
s_x &amp; 0 &amp; 0 &amp; 0\
0 &amp; s_y &amp; 0 &amp; 0\
0 &amp; 0 &amp; s_z &amp; 0\
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right)
$$</p>
<p>$$
R_x=\left(\begin{array}{cccc}
1 &amp; 0 &amp; 0 &amp; 0\
0 &amp; \cos \theta &amp; -\sin \theta &amp; 0\
0 &amp; \sin \theta &amp; \cos \theta &amp; 0\
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right)\</p>
<p>R_y=\left(\begin{array}{cccc}
\cos \theta &amp; 0 &amp; \sin \theta &amp; 0\
0 &amp; 1 &amp; 0 &amp; 0\
-\sin \theta &amp; 0 &amp; \cos \theta &amp; 0\
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right)\</p>
<p>R_z=\left(\begin{array}{cccc}
\cos \theta &amp; -\sin \theta &amp; 0 &amp; 0\
\sin \theta &amp; \cos \theta &amp; 0  &amp; 0\
0 &amp; 0 &amp; 1 &amp; 0\
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right)
$$</p>
<h2 id="transform-composition-and-affine-transform">Transform Composition and Affine Transform</h2>
<p>Affine Transform은 쉽게 말해 <strong>선형 변환 + Translation</strong>이다. Translation은 선형 변환이기 위한 조건인 <strong>1) closed under addition 2) closed under matrix multiplication</strong> 두 조건을 모두 만족하지 못한다. 따라서 하나의 transform으로 $S, R, T$를 모두 묶어주기 위해서는 Affine 공간에서의 연산이 필요해진다.</p>
<p>앞에서 언급된 Homogeneous Coordinate를 다시 생각해보자. 이를 사용하는 이유가 무엇일까? 우리가 다루는 transform이 벡터공간이 아닌 <strong>Affine 공간에서 일어나는 transform이기 때문</strong>이다. </p>
<p>벡터는 크기와 방향을 가지지만, 위치정보를 가지지 않는다. 그러나 <strong>&#39;이동&#39;을 표현하기 위해서는 우선 위치에 대한 정보가 필요</strong>하다. 이 때 위치를 표현하기 위한 &#39;정점&#39;이 포함된 공간인 Affine Space이며  이 공간에서의 transform이 Affine Transform으로 정의된다.</p>
<p>앞서 $S, R, T$ 행렬의 차원을 맞추어 준 이유는 세 transform 사이의 concat을 용이하게 만들어 연속적인 물체의 변환을 표현하기 위함이었다. 그러나 여전히 반복되는 transform의 계산은 쉬운 편이 아니다. 다음 이미지는 RT, TR, SRT의 concat 결과를 보여준다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e8b8f9c3-5c58-4de1-9487-643f41b3700d/image.png" alt=""></p>
<p>직관적으로 알 수 있는 것 두가지는, 첫째, 계산하기 귀찮아보인다는 것. 둘째, TR과 RT의 결과가 다르다는 것 (이것은 당연하게도, matrix multiplication에서 교환법칙이 성립하지 않기 때문이다). 두 번째 특징은 직관적으로 아래 이미지와 같이 먼저 회전하고 이동하는 것과 먼저 이동하고 회전하는 것이 다르다는 것으로 이해할 수도 있다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/52897413-8119-40be-8d2b-defc5f819047/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/7f130327-5c94-42c2-baa1-55b448cc3e4c/image.png" alt=""></p>
<p>그리고 우리가 더 주의깊게 살펴보아야 할 두가지 특성은 다음과 같다:</p>
<ul>
<li>얼마나 많은 transform이 concat 되던지 <strong>항상 마지막 행은 (0 0 $\cdots$ 0 1)</strong>로 끝난다. 따라서 이 행을 제외하고 계산을 간단하게 만들 수 있다.</li>
<li>마지막 열을 제외하면 앞 행들은 오로지 <strong>선형변환</strong>의 combination으로만 이루어져 있다. 즉, 입력되는 translation의 term을 포함하지 않는다.</li>
</ul>
<p>이 두 특성을 활용해 Affine Transform 계산을 간소화할 수 있다. 계속해서 2차원의 경우로 생각해 보자. 항상 동일한 3행을 제외한 $2\times3$ 요소를 $[L|t]$로 표현할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/7cc8303f-352f-4417-b5f3-edd36a8de2fc/image.png" alt=""></p>
<p>수식에서 빨갛게 표시한 부분이 $L$, 파랗게 표시한 부분이 $t$로, 각각</p>
<ul>
<li>$L$: 선형변환으로만 이뤄진 $2\times2$ combined linear transfrom</li>
<li>$t$: translation과 선형변환의 combination으로 이루어진 combined translation</li>
</ul>
<p>이다.</p>
<p>이렇게 표현했을 때의 장점은, $L$과 $t$를 분리하여 transform의 concat 순서와 관계없이 <strong>&quot;L 먼저, t 나중에&quot;</strong> 계산하는 일관적인 규칙을 따를 수 있다는 것이다. 어짜피 $L$ 부분은 translation과 섞이지 않으므로 linear transform끼리 먼저 계산하고, $t$ 부분은 &#39;선형변환된 객체의 이동&#39;이라는 관점에서 계산해준다. </p>
<p>위의 이미지로 예를 들자면,</p>
<ul>
<li>$RT$: Rotation + rotation된 Translation</li>
<li>$TR$: Rotation + Translation</li>
</ul>
<p>으로 나누어 생각한다면 회전이 먼저이든 이동이 먼저이든 일관적 순서로 계산할 수 있다.
(7,0) 이동과 90° 회전이라는 구체적인 상황을 예로 들면 다음과 같다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/00352360-a7e2-42a0-be35-893cbb8d0e41/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/4ca83da7-3e0f-4e81-949b-1114d56f71e2/image.png" alt=""></th>
</tr>
</thead>
</table>
<h2 id="world-space-and-object-space">World Space and Object Space</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/2fe5ef08-8abf-4a10-bf72-dbb765bbc5c4/image.png" alt=""></p>
<p>물체가 정의될 때 물체 각각에 대한 좌표계는 <strong>Object Space</strong>라고 불린다. Object Space와 물체의 관계는 서로 묶여있다고 생각하면 쉽다. 즉, 물체를 움직이는 것이 곧 Object Space를 움직이는 것이다. 그래픽스에서 삼차원 공간의 물체들은 각각의 독립적인 Object Space를 가진다. 그렇기 때문에 하나의 scene에 여러 물체를 위치시키고 변환시키기 위해서는 하나의 통일된 좌표계가 필요하다. 이것이 <strong>World Space</strong>이다. 물체들은 각자의 world transform을 거쳐 World Space라는 공간상에서 변형된다.</p>
<p>처음 물체가 생성될 때, object space는 world space와 동일한 기저를 가진다. Object Space의 기저를 ${u, v, n}$이라 하고, World Space의 기저를 ${e_1, e_2, e_3}$이라 할 때, 다음 그림처럼 물체를 회전시키면 World Space에 대해 Object Space의 기저는 회전한다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/0e300ee6-3f30-4d25-a31d-cc056078614f/image.png" alt=""></p>
<p>그렇다면 Object Space 기저를 회전시키는 회전 변환 $R$은 어떻게 찾을까? 재미있는 지점은, 결론적으로 $R = (\bold{u}\ \bold{v}\ \bold{n})$ 이라는 점이다. World Space의 기저를 표준기저 ${e_1, e_2, e_3}$로 설정했기 때문에, </p>
<p>$$
R\left(\begin{array}{l}
1 \
0 \
0
\end{array}\right)=\left(\begin{array}{l}
u_x \
u_y \
u_z
\end{array}\right), \quad R\left(\begin{array}{l}
0 \
1 \
0
\end{array}\right)=\left(\begin{array}{c}
v_x \
v_y \
v_z
\end{array}\right), \quad R\left(\begin{array}{l}
0 \
0 \
1
\end{array}\right)=\left(\begin{array}{l}
n_x \
n_y \
n_z
\end{array}\right)
$$</p>
<p>이고, 따라서</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/76709bc5-c9fa-40ba-a45d-3dce4aefbd2d/image.png" alt=""></p>
<p>이 된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/543d5b94-6050-45ed-b4c2-9153ec575eba/image.png" alt=""></p>
<p>이는 회전 축이 기저와 일치하지 않는 상황에서도 동일하게 적용된다.</p>
<h3 id="inverse-transform">Inverse Transform</h3>
<p>수행한 변환에 역행렬을 곱해주면 다시 원래 상태로 변환하는 것이 가능하다. 역행렬은 간단하게 다음과 같이 구한다.</p>
<h4 id="scaling-1">Scaling</h4>
<p>$$
S^{-1}=
\left(\begin{array}{cccc}
\frac{1}{s_x} &amp; 0 &amp; 0 \
0 &amp; \frac{1}{s_y} &amp; 0 \
0 &amp; 0 &amp; \frac{1}{s_z}
\end{array}\right) \Leftrightarrow\left(\begin{array}{cccc}
s_x &amp; 0 &amp; 0 \
0 &amp; s_y &amp; 0 \
0 &amp; 0 &amp; s_z
\end{array}\right)
$$</p>
<h4 id="translation">Translation</h4>
<ul>
<li>Inverse translation
$$
T^{-1}=
\left(\begin{array}{llll}
1 &amp; 0 &amp; 0 &amp; -d_x \
0 &amp; 1 &amp; 0 &amp; -d_y \
0 &amp; 0 &amp; 1 &amp; -d_z \
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right) \Leftrightarrow\left(\begin{array}{llll}
1 &amp; 0 &amp; 0 &amp; d_x \
0 &amp; 1 &amp; 0 &amp; d_y \
0 &amp; 0 &amp; 1 &amp; d_z \
0 &amp; 0 &amp; 0 &amp; 1
\end{array}\right)
$$</li>
</ul>
<h4 id="rotation-1">Rotation</h4>
<p>Rotation 행렬은 앞서 살펴봤듯 $(\bold{u}\ \bold{v}\ \bold{n})$ 이고, 이는 <strong>orthonormal</strong>하다. 따라서 Inverse Rotation은 간단하게 R 행렬의 전치행렬이다:
$$
R^{-1} = R^T
$$
그림으로 살펴보면 다음과 같다.
<img src="https://velog.velcdn.com/images/jin_a720/post/771f7ff3-db40-4a9c-a967-b6ce58705b0c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NLP/논문리뷰] LSTM&GRU: Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling]]></title>
            <link>https://velog.io/@jin_a720/NLP%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-LSTMGRU-Empirical-Evaluation-of-Gated-Recurrent-Neural-Networks-on-Sequence-Modeling</link>
            <guid>https://velog.io/@jin_a720/NLP%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-LSTMGRU-Empirical-Evaluation-of-Gated-Recurrent-Neural-Networks-on-Sequence-Modeling</guid>
            <pubDate>Fri, 10 Jan 2025 17:04:22 GMT</pubDate>
            <description><![CDATA[<h1 id="empirical-evaluation-of-gated-recurrent-neural-networks-on-sequence-modeling">Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling</h1>
<hr>
<h2 id="motivation">Motivation</h2>
<ul>
<li><p>Vanila RNN의 문제점</p>
<p>  : Gradient vanishing이 발생하여 long-term dependencies를 학습하는 것이 어렵다는 문제가 존재한다. 이는 gradient 기반 최적화 방법을 어렵게 만든다.</p>
</li>
<li><p>LSTM이 성공적으로 도입되었으나, 복잡도가 높아 계산 효율이 떨어진다는 문제점이 있어왔다. 이에 따라 GRU라는 더 단순한 구조의 유닛이 제안되었고, 기존 연구들에서 LSTM과 유사한 정도의 성능을 보인다는 결과가 존재했다. LSTM과 GRU의 비교는 단편적인 task에 대해서는 이루어졌지만, 더 일반적인 영역에서 LSTM의LSTM과 GRU의 체계적이고 실증적인 비교 실험은 이뤄지지 않았다.</p>
</li>
</ul>
<h2 id="contribution--limitation">Contribution &amp; Limitation</h2>
<ul>
<li>바닐라 RNN과 LSTM, GRU에 대한 sequencial한 speech &amp; sound에서의 성능 비교가 이루어졌다. 다양한 데이터셋을 활용하여 일반적인 성능 평가를 수행하였다.</li>
<li>그러나 GRU와 LSTM중 어느 것이 더 우수한지는 데이터셋과 수행하는 task에 따라 차이를 보였고, 따라서 결론을 내릴 수 없었다. 또한 게이팅 유닛의 구성 요소가 어떻게 학습에 기여하는지에 대한 추가적인 실험이 앞으로 요구되었다.</li>
</ul>
<h2 id="lstm--gru">LSTM &amp; GRU</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/8f479cf4-f2d8-4f78-aea1-9045b9d49def/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/b373ecab-2471-4a20-8ed2-55418ac9abf4/image.png" alt="">
논문에서 활용된 Figure 1이 더 직관적으로 표현된 이미지</p>
<h3 id="vanila-rnn">Vanila RNN</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/44ce75d0-3eae-4d5b-b2c8-5eded69ca07c/image.png" alt=""></p>
<ul>
<li><p>Gating Unit이 없다.</p>
</li>
<li><p>tanh activation function을 활용.</p>
</li>
<li><p>$h_{t-1}$과 $x_t$를 인풋으로받고, 지금의 시점 t에 대한 새로운 hidden unit $h_t$를 아웃풋으로 배출한다.</p>
</li>
<li><p>기본 구조는 다음과 같다. 이 때 $\phi$는 non-linear한 function이다:</p>
<p>  <img src="image%201.png" alt="image.png"></p>
</li>
<li><p>hidden state의 업데이트가 이뤄지는  $\phi(h_{t-1}, x_t)$ 부분을 더 구체적으로 살펴보자면 다음과 같다:</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/f4362758-c5aa-42b8-a77f-bf310e1b6767/image.png" alt=""></p>
<p>이때 보통 그림과 같은 tanh 함수가 활성화 함수 g로 활용된다.</p>
<h3 id="lstm">LSTM</h3>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/54058f57-33b3-48fc-832b-e18243bd8c6f/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/02ab08dd-3b11-4c80-bd89-2736e7d4edf2/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>LSTM은 기본적으로 세 개의 Gate인 input gate, output gate, 그리고 forget gate와 메모리 셀인 Cell state로 구성된다. </p>
<ol>
<li><p>먼저 인풋으로 $x_t$와 $h_{t-1}$ 를 입력받고, 이는 forget gate를 통과하며 Cell state  $C_{t-1}$의 정보를 얼마나 유지할지가 결정된다.</p>
</li>
<li><p>1) 인풋으로 들어온 $x_t, h_{t-1}$의 정보가 input gate를 통과하며 새로운 정보가 얼마나 메모리에 추가될지 결정된다.</p>
<p> 2) 인풋은 동시에 tanh를 통과하며 새로운 후보(candidate) $\tilde{C}_t$ 가 생성된다.</p>
</li>
<li><p>forget gate를 통과한 값과 input gate를 통과한 값이 더해져 $C_t$가 업데이트된다.</p>
</li>
<li><p>이는 다시 tanh를 거쳐 output gate를 통과하며 $h_t$가 업데이트된다</p>
</li>
</ol>
<ul>
<li>이 때 gate들은 정보를 얼마나 버리고 또 사용할지를 결정하는 역할을 하면서 sigmoid 함수가 활용된다. 각각의 게이트에 대한 수식은 다음과 같다:</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/768d9275-a204-4f88-93ff-3d62e6d4f06b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e5f8c8bf-847a-4bd7-839e-90524d3b1412/image.png" alt=""></p>
<ul>
<li>tanh 함수는 $h_t$가 output으로 나올 때 $c_t$에서 한번, $\tilde{c}_t$를 생성할 때 한번 사용된다:</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/eafed355-b2fc-4214-8d42-119718c1e26e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/e80fd89a-5cdb-4282-8615-62e3a06bff27/image.png" alt=""></p>
<ul>
<li>$c_t$의 수식은 다음과 같다:</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/4a5575c5-d068-45ef-92e6-8cb393bfb1a9/image.png" alt=""></p>
<h3 id="gru">GRU</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/a6901028-b82a-419f-bc7a-cdcc6264bb20/image.png" alt="">|<img src="https://velog.velcdn.com/images/jin_a720/post/9b48ee94-db1b-4631-810c-7798409a2fda/image.png" alt="">
|---|---|</p>
<p>GRU는 더 간소화된 방식으로, reset gate, update gate 두개의 gate를 가진다. reset gate에서는 이전 상태의 무시 정도가 결정된다는 점에서 forget gate와 유사한 역할을 수행한다. update gate는 새로 계산된 h_t와 이전 h_{t-1} 사이에서 얼마나 업데이트를 진행할지를 결정한다.</p>
<ol>
<li>먼저 인풋이 reset gate $r_t$를 통과하며 $h_{t-1}$이 얼마나 무시될지 결정된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/6ec9176b-060e-40f5-bc19-9f6f00831f21/image.png" alt=""></p>
<ol start="2">
<li>reset gate를 통과한 정보는 tanh를 통과하여 인풋과 함께 candidate $\tilde{h}_t$를 생성한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9f0d2881-af41-4001-9615-1e833ea60017/image.png" alt=""></p>
<ol start="3">
<li>인풋이 update gate $z_t$를 통과하하여 $h_t$를 업데이트할 정도를 결정한다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/64c9d816-b77b-49d5-a96a-a3d053b49951/image.png" alt=""></p>
<ol start="4">
<li>위 두 게이트를 통과한 값이 더해져 새로운 $h_t$가 계산된다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/1e5defd4-459e-471a-839e-47df6a5c540e/image.png" alt=""></p>
<h3 id="comparison-between-lstm-and-gru">Comparison between LSTM and GRU</h3>
<ul>
<li><p>유사점</p>
<ul>
<li><p>additive update</p>
<p>  새로운 입력에 따라 $h_{t-1}$을 완전 대체하는 vanila RNN과 달리, LSTM과 GRU는 모두 이전 상태와 새로운 정보를 결합하는 방식으로 update가 이뤄진다.</p>
<p>  ⇒ Gradient vanishing 문제 완화</p>
</li>
</ul>
</li>
<li><p>차이점</p>
<ul>
<li>LSTM은 output gate를 활용해 memory content가 노출되는 정도를 조절할 수 있지만 GRU는 불가능하다. 이는 LSTM에서 현재 state를 더 세밀하게 조정할 수 있도록 해준다.</li>
<li>LSTM의 input gate와 forget gate는 GRU에서 하나의 게이트로 간소화되고, 이는 정보 조절의 효율성을 높이는 효과가 있다.</li>
</ul>
</li>
</ul>
<h2 id="experiments-and-result">Experiments and Result</h2>
<h3 id="experiment-settings">Experiment Settings</h3>
<ul>
<li>LSTM, GRU, tanh 유닛을 비슷한 파라미터 수에서 비교</li>
<li>test set:  4개의 폴리포닉 음악 데이터 셋(Nottingham, JSB Chorales, MuseData, Piano-midi)와 Ubisoft에서 제공한 2개의 음성 신호 데이터 셋 활용</li>
<li>Optimizer은 RMSProp 활용</li>
<li>평가: 각 데이터셋에 대한 average negative log-probabilities를 확인하고 Wall Clock Time과 epoch에 따른 learning curve 확인</li>
</ul>
<h3 id="results">Results</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/c172454f-f4fb-48bc-b703-d0b4d14b945a/image.png" alt=""></p>
<p>Nottingham 데이터셋에 대해서는 tanh유닛이 가장 높은 성능을 보였지만, 모든 모델이 유사한 정도의 성능을 보였음을 감안한다면 Music Dataset에서 GRU가 가장 높은 성능을 보였다. 반면 Ubisoft Dataset에서는 GRU, LSTM이 각각 한번씩 가장 좋은 성능을 보였다.</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/40cb788e-1374-4a1e-9c72-3a500510dedf/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/fdcf8124-61d0-46b9-9392-6936f70c4f37/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>Learning Curve를 보았을 때에도 대체적으로 GRU가 가장 빠른 수렴속도와 성능을 보였다. LSTM도 GRU와 유사한 정도의 성능을 보였지만, tanh 유닛의 경우 Ubisoft 데이터셋에서 확인할 수 있듯 두 게이팅 유닛에 비해 낮은 성능을 보였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CG/개념] Introduction to Computer Graphics with OpenGL ES CH03: Modeling]]></title>
            <link>https://velog.io/@jin_a720/CG%EA%B0%9C%EB%85%90-Introduction-to-Computer-Graphics-with-OpenGL-ES-CH03-Modeling</link>
            <guid>https://velog.io/@jin_a720/CG%EA%B0%9C%EB%85%90-Introduction-to-Computer-Graphics-with-OpenGL-ES-CH03-Modeling</guid>
            <pubDate>Fri, 10 Jan 2025 15:39:14 GMT</pubDate>
            <description><![CDATA[<p>이 시리즈에서는 <a href="https://youtube.com/playlist?list=PLYEC1V9tJOl03WLDoUEKbiYW_Xt4W6LTl&amp;feature=shared">고려대학교 한정현 교수님의 Computer Graphics 강의</a>에서 공부한 내용을 정리해보고자 한다. 강의는 교수님의 저서 <strong><em>Introduction to Computer Graphics with OpenGL ES</em></strong> 를 바탕으로 진행되었다.</p>
<hr>
<h1 id="ch03-modeling">CH03: Modeling</h1>
<h2 id="polygon-mesh">Polygon Mesh</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/58405b59-7ad3-4a14-ac9c-c44419569323/image.png" alt=""></p>
<p>3차원 공간의 object를 표현할 때, 수학적으로 우리에게 익숙한 표현 방식은 implicit representation이다. 예를 들어, 구를 표현한다고 할 때, 중심 좌표가 $(C_x, Cy, Cz)$ 이고 반지름이 $r$인 구는
$$
(x-C_x)^2 + (y-C_y)^2 + (z-C_z)^2 = r^2
$$</p>
<p>처럼 표현할 수 있고, 이것이 우리에게 가장 익숙한 표현 방식이다. 그러나 우리의 GPU는 이러한 implicit representation에 최적화되어있지 않다. 음함수 표현법은 특정 위치에서 값을 계산하기 위한 연산량이 많을 뿐더러, GPU가 병렬로 나누어 처리하기가 쉽지 않기 때문이다. 따라서 그래픽스에서 object를 표현할 때에는 이러한 음함수를 사용하기보다 표면의 sampled points를 활용한 <strong>Polygon Mesh</strong>를 활용한다.</p>
<p>이 Polygon Mesh는 보통 <strong>삼각형</strong> 또는 사각형 면으로 이루어지게 되고, <U>전형적인 closed mesh의 경우 vertex의 개수의 약 두배의 삼각형 면이 만들어지게 된다.</U></p>
<details>
<summary> <b>그럼 사각형 면은 언제 사용할까?</b></summary>

<p><img src="https://velog.velcdn.com/images/jin_a720/post/968df4bb-8573-4b03-8cda-54e58d293cff/image.png" alt=""></p>
<p>위의 사진과 같이, GPU 연산은 triangle mesh에 최적화되어 있지만 실제 CG 작업 파이프라인에서는 quad mesh가 선호된다. 그 이유는 <strong>작업의 편리성</strong>과 <strong>clean mesh 생성</strong>이 가장 큰 이유이다.</p>
<p>quad mesh를 활용할 때 모델링 작업에서 더 topologically clean한 mesh를 생성할 수 있다. 따라서 <U>애니메이션과 리깅 과정에서 모델의 변형을 더 매끄럽게 표현이 가능</U>하다.</p>
<p>또한 모델링 과정에서 <U>면을 쪼개거나(subdivision), edge loop나 ring을 만드는 등의 과정이 더 쉽고 정확</U>하며, <U>UV mapping 과정에서 왜곡이 감소</U>한다.</p>
<p>다만, GPU 연산이 처리될 때에는 quad mesh도 triangle mesh로 변환되어 연산된다고 한다.</p>
<p>그래픽 작업에서 <strong>직접적으로 triangle mesh를 활용하는 경우</strong>는:</p>
<ul>
<li>real-time graphics</li>
<li>불규칙한 표면(ex. terrain) 표현</li>
</ul>
<p>정도가 있을 수 있겠다.</p>
</details>

<h3 id="level-of-detaillod">Level of Detail(LOD)</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/1f1f5b9c-4a97-4583-a8fc-20daf3e815fa/image.png" alt=""></p>
<p><strong>LOD</strong>는 polygon mesh가 정점 몇개로 표현되는지 그 정도를 나타낸다.</p>
<p>여기서 <strong>accuracy</strong> 와 <strong>efficiency</strong> 사이의 트레이드오프가 발생한다. LOD가 높을수록 더 정확한 surface 표현이 가능해지지만 동시에 연산 효율성은 낮아지고, LOD가 낮을수록 surface 표현은 부족해지지만 연산은 더 효율적으로 처리된다.</p>
<h2 id="array-representation">Array Representation</h2>
<image src="https://velog.velcdn.com/images/jin_a720/post/e4e18e26-c1b2-4273-9647-5b4007cec6fd/image.png" height=50% width=50% style="margin-left: auto; margin-right: auto; display: block;"/>

<p>다음과 같은 mesh를 보자. 삼각형 면 $t_1, t_2, t_3$로 이루어져 있는 이 mesh의 정점을 memory space에 array의 형태로 정리한다면 어떤 방식이 좋을까?</p>
<p>여기서 중요한 지점은 세 면들이 서로 만날 때, 두 개의 <U>정점을 공유</U>하게 된다는 사실이다. 즉, 단순히 $t_1, t_2, t_3$ 각 면에 대응하는 세 개의 정점을 각각 나열하는 방식을 취한다면 중복이 발생하게 되고, 이는 효율성이 낮으므로 좋지 않은 표현이 된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/73993d50-4f22-4633-94cb-21c3b6e0bea4/image.png" alt=""></p>
<p>하지만 다음과 같이 array를 <strong>vertex array</strong>와 각 vertex의 index를 면에 따라 나열한 <strong>index array</strong>로 나누어 memory space에 두 가지 array를 저장한다면 효율성 문제를 개선할 수 있다. 먼저 <strong>vertex array</strong>에는 mesh를 구성하는 모든 정점을 중복 없이 나열하고, 인덱스를 붙인다. 그리고 <strong>index array</strong>에는 각 면을 구성하는 vertex의 <strong>index</strong>를 <U>시계 반대방향으로</U> 저장한다.</p>
<p>메모리를 크게 차지하는 vertex array의 value들 대신 index만 중복이 일어나므로 메모리 공간을 효율적으로 사용할 수 있다. 이 때 array를 두 개 사용해야 함에도 이 방식이 효율적인 이유는, vertex array의 각 cell이 위치 좌표 뿐 아니라 각 정점의 attribute를 포함하기 때문에 메모리에서 차지하는 공간이 크기 때문이다.</p>
<p>그런데 왜 index array에 vertex index를 저장할 때 <strong>시계 반대방향</strong>으로 저장해야 할까? 그 이유는 normal과 관련이 있다.</p>
<h2 id="normals">Normals</h2>
<h3 id="surfacetriangle-normals">Surface(Triangle) Normals</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/f2a433dd-deee-4962-88fc-8b2c67c71fdf/image.png" alt=""></p>
<p>Surface Normal은 보편적인 노멀 벡터를 말한다. 3차원 그래픽스에서 노멀은 polygon mesh를 구성하는 면의 방향성을 알려주기 때문에 중요하다.</p>
<p>노멀을 구할 때에는 외적을 사용한다. 평행하지 않은 어떤 벡터 $v_1, v_2$가 있을 때 그 외적 $v_1 \times v_2$의 방향은 $v_1, v_2$ 모두에 수직이고, 따라서 $v_1, v_2$가 이루는 평면에도 수직임을 알 수 있다. 노멀은 항상 크기가 1인 unit vector로 나타내므로, 
$$
\frac{v_1 \times v_2} {\lVert v_1 \times v_2 \rVert}
$$
로 표현될 수 있다.</p>
<p>여기서 중요한 지점은, 노멀이 <strong>벡터</strong>이기 때문에 <strong>방향이 있다</strong>는 점이다. 즉 $v_1, v_2$ 의 순서에 따라 노멀이 &quot;뒤집힐&quot;수 있다는 것이다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/a052e30d-28fc-4f71-8032-750684a0f3b7/image.png" alt=""></p>
<p>그래픽스 소프트웨어에서 면의 노멀이 뒤집히면, 이미지의 검은 면처럼 비정상적으로 면이 표현되고, lighting 이나 texturing이 제대로 처리되지 않는다. (그림은 Maya)</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/a96f3bf8-131b-4e4e-8153-0b8f0a46e63d/image.png" alt=""></p>
<p>그렇기에 vertex index를 저장할 때에 index를 시계 반대방향으로 저장하여 항상 노멀이 올바른 방향을 향하도록 해야한다. 이 때 이 시계 반대방향의 순서를 counter-clockwise를 줄여 <strong>CCW</strong> 순서라고 이야기한다.</p>
<details>
  <summary> <b>노멀벡터 방향 찾기</b></summary>

<p>노멀벡터의 방향은 외적의 방향을 찾는 오른손 법칙으로 쉽게 찾을 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9da24d1e-ae2a-442b-8c7a-814b6aa46444/image.png" alt=""></p>
</details>

<h3 id="vertex-normals">Vertex Normals</h3>
<p>그런데 사실 실제 3D 그래픽스 소프트웨어에서, 항상 이렇게 surface normal을 연산하여 사용하는 것은 무리가 있다. mesh의 세부 구조에 따라 매번 계산하여 surface normal을 실시간으로 처리하는 데에 계산 비용이 많이 들기 때문이다.
대신 Vertex Normal을 활용하여 계산 효율성과 퀄리티를 동시에 적절히 확보하는 방식이 사용된다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/214a5fc6-7c1c-4f49-99c2-78a1bb9ae7a2/image.png" alt=""></p>
<p><strong>Vertex Normal</strong>은 각 정점에서의 법선을 말한다. 정점에서 어떻게 법선이 있지? 라고 생각할 수 있지만, 이는 인접한 면들의 법선을 샘플링하여 평균을 내 계산된다. </p>
<h2 id="obj">.obj</h2>
<p>3D 그래픽스 작업중에는 소프트웨어간 모델 import/export를 해야하는 상황이 많다. 주로 .obj의 포맷으로 모델을 저장하게 되는데, 앞서 다루었던 vertex array, index array, 그리고 vertex normal의 데이터가 obj 형식으로 export되고 다시 소프트웨어에서 import되어 읽어올 때 인식되면서 모델을 재구성하게 된다.</p>
<p>.obj 파일은 그럼 어떻게 생겼을까?</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/5a333c85-6b87-41a0-837c-c17f79cdeec4/image.png" alt=""></p>
<p>obj의 구조를 살펴보면, 크게 v, vn, g, f로 시작하는 부분을 확인할 수 있다. 하나씩 살펴보면 다음과 같은 정보를 포함한다:</p>
<ul>
<li><strong>v</strong>: vertex. 정점의 위치정보</li>
<li><strong>vn</strong>: vertex normal. 정점의 노멀벡터</li>
<li><strong>f</strong>: face. 각 면을 이루는 <strong>정점의 index//vertex normal의 index</strong> 세개로 이루어짐.</li>
<li><strong>g</strong>: group. 위의 데이터들로 이루어진 객체(그룹)의 이름</li>
</ul>
<p>이 정보는 다시 import될 때 position과 normal로 이루어진 vertex array와 index array로 이루어진 데이터로 읽어오게 된다. vertex array의 각 index의 정보는 하나의 cell을 이루고, 다시 소프트웨어에서 texture 등의 attribute가 cell에 추가되기도 한다.
<img src="https://velog.velcdn.com/images/jin_a720/post/e19aca15-1a3c-4bf2-926d-4059a5241500/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CV/논문리뷰] Few-shot Gaussian Splatting (ENG)]]></title>
            <link>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0Few-shot-Gaussian-Splatting</link>
            <guid>https://velog.io/@jin_a720/CV%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0Few-shot-Gaussian-Splatting</guid>
            <pubDate>Fri, 01 Nov 2024 14:51:47 GMT</pubDate>
            <description><![CDATA[<p><strong>Few-shot Gaussian Splatting</strong><a href="https://arxiv.org/abs/2312.00451">[1]</a> is a recent paper introduced at ECCV 2024. Following the publication of <strong>3D Gaussian Splatting</strong><a href="https://arxiv.org/abs/2308.04079">[2]</a> at SIGGRAPH 2023—a groundbreaking work in 3D Reconstruction and Novel View Synthesis—numerous efforts have been made to enhance the model. &quot;FSGS: Real-Time Few-shot View Synthesis using Gaussian Splatting&quot; is one of those efforts, introducing methods to improve the performance of 3DGS on sparse inputs.</p>
<p>In this post, I will cover some of the background knowledge necessary to understand this paper, along with the motivations and approaches that FSGS introduces.</p>
<h2 id="background">Background</h2>
<p>For a deeper understanding of FSGS, it&#39;s essential to grasp two key concepts: <strong>Novel View Synthesis (NVS)</strong> and <strong>3D Gaussian Splatting (3DGS)</strong>.</p>
<h3 id="novel-view-synthesisnvs">Novel View Synthesis(NVS)</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/33ad8e58-0b8f-4ba2-9765-a498328cf739/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 1</b>: Novel View Synthesis  (Source: Image taken from <a href="#ref1" target="_blank">[3]</a> and edited by the author).
  </figcaption>


<p>Novel View Synthesis is the task of generating new views or perspectives of a scene using a limited set of input images. It is a core task in the field of 3D vision. Approaches vary, ranging from depth estimation to scene generation, but the goal remains the same: <U>to extrapolate or interpolate between the given viewpoints and predict what the scene would look like from previously unseen angles.</U></p>
<h3 id="nerf-and-3d-gaussian-splatting">NeRF and 3D Gaussian Splatting</h3>
<p>In most cases where NVS is the main task, <strong>NeRF</strong><a href="https://arxiv.org/abs/2003.08934">[3]</a> and 3DGS become the primary comparison models.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/0cdef4fc-d0ae-4654-89eb-3070bbac5bca/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 2</b>: NeRF vs. Gaussian Splatting  (Source: Image taken from <a href="#ref1" target="_blank">[7]</a>).
  </figcaption>

<p>NeRF represents a 3D scene implicitly using a neural network, which relies on <strong>density</strong> and <strong>radiance</strong> as key parameters in volumetric rendering. Density controls transparency, while radiance captures color and lighting influenced by the scene’s environment. This allows NeRF to infer the structure and spatial arrangement of objects.</p>
<p>In contrast, 3DGS represents the 3D scene explicitly through elliptic 3D points called <strong>3D Gaussians</strong>. Each Gaussian has attributes such as <strong>position, size, color, opacity, and directionality</strong>. 3DGS takes point clouds as input, which are generated by 2D images beforehand. Those points are simply samples of the surface, with each point containing its own position and color information. Using each point as a center, 3D Gaussians are generated, and their attributes are trained to match the ground truth input images. What makes 3DGS so popular is its ability to perform 3D reconstruction and NVS almost in real-time.</p>
<p>Here, an important question arises: 3D Gaussian Splatting requires sufficient points to represent 3D scene adequately, <strong>so what happens if there aren’t enough points to fully capture the scene? Can 3DGS still generate a reasonable representation of the scene under such sparse conditions?</strong></p>
<h2 id="few-shot-3dgs">Few-shot 3DGS</h2>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/416da17a-c6ca-4539-84e3-4d62bc2c79ec/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 3</b>: FSGS Pipeline (Source: Image taken from FSGS paper).
  </figcaption>

<h3 id="problem-setting">Problem Setting</h3>
<p>3DGS alone struggles to accurately represent a 3D scene with only a few points to generate the initial Gaussians. Let’s consider the challenges that arise from sparse input. First, with limited inputs, the model has <U>fewer reference views</U>, resulting in <strong>a lack of perspective</strong> on parts of the scene that aren’t directly visible. This makes depth prediction difficult. Second, the lack of diverse viewpoints means <strong>there aren’t enough Gaussians</strong> to adequately “paint” the scene.</p>
<p>The authors of FSGS identify two key problems that emerge when applying 3DGS with sparse input:</p>
<h4 id="1-smooth-texture">1. Smooth Texture</h4>
<p>With sparse input, 3DGS fails to generate a sufficient number of Gaussians. This results in larger or overly stretched Gaussians (which, under normal conditions, are managed by the &quot;Adaptive Density Control&quot; technique in 3DGS). Consequently, the model fails to capture fine details of the scene, leading to overly smooth textures.</p>
<h4 id="2-overfitting-propensity">2. Overfitting Propensity</h4>
<p>Sparse input also increases the model&#39;s tendency to overfit to the training viewpoints. This causes an inaccurate representation of the scene, with Gaussians stretched in the direction of the training views.</p>
<h3 id="approaches">Approaches</h3>
<p>To address the challenges mentioned above, FSGS adopts two main approaches, essentially aiming to generate &quot;more&quot; of the sparse elements: more Gaussians and more images (and consequently, more depth information).</p>
<h4 id="1-proximity-guided-gaussian-unpooling">1. Proximity-guided Gaussian Unpooling</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/d3f1fa36-2afd-4f1d-b413-a6254ebfd223/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 4</b>: (a) Gaussian Unpooling(Source: Image taken from FSGS paper). (b) Detailed Gaussian Unpooling Process with K=3. by the author.
  </figcaption>

<p>Proximity-guided Gaussian Unpooling is a technique to <U>create additional Gaussians</U> in optimal locations by using a proximity graph. In this method, one of the existing Gaussians is designated as the <strong>&quot;Source&quot; Gaussian</strong>, and its nearest $K$ Gaussians are designated as <strong>&quot;Destination&quot; Gaussians</strong>. Specifically, the Source Gaussian is the one with the smallest Euclidean distance to the other three Gaussians. By computing the Euclidean distance between the Source Gaussian and each Destination Gaussian, if the distance exceeds a certain threshold, a new Gaussian is generated between the two along the connecting line. The new Gaussian inherits the initial scale and opacity of the Destination Gaussian, while other attributes are initialized to zero.</p>
<h4 id="2-geometry-guidance-for-gaussian-optimization">2. Geometry Guidance for Gaussian Optimization</h4>
<p>In this approach, a new view, or <U>&quot;pseudo view,&quot; is generated</U> to mitigate the sparseness of the input. This pseudo view is positioned between existing ground truth (GT) viewpoints, and a camera view is generated from this location. The image rendered from this position is used during training. However, since the pseudo view is itself a &quot;predicted&quot; image, <strong>FSGS relies on depth information to utilize it effectively</strong>.</p>
<p><strong>Depth Map Utilization</strong>
<img src="https://velog.velcdn.com/images/jin_a720/post/75dc1666-da0c-46df-95b8-5436c9f836a4/image.gif" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 5</b>: Depth map (Source: Image taken from <a href="#ref1" target="_blank">[4]</a>).
  </figcaption>

<p>Depth maps provide alpha or RGB representations of spatial depth and are commonly used in computer vision to reconstruct 3D space from 2D images. FSGS leverages depth maps by calculating the correlation between two types of depth data: (1) the depth of rasterized images and (2) the depth derived from 3D Gaussians. These two depths are compared to train the 3D Gaussians in terms of spatial accuracy.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/8a4dfc4e-a849-467e-830d-d8f5adf799bc/image.png" alt=""></p>
<figcaption style="text-align:center; font-size:16px; color:#808080; margin-top:-35px">
    <b>Figure 6</b>: Depth Correlation Process (Source: Image taken from FSGS paper).
  </figcaption>

<p>** (1) Depth of Input Images **
First, for both pseudo view and GT view, Dense Prediction Transformer(DPT)<a href="https://arxiv.org/abs/2103.13413">[5]</a> pre-trained with image-depth pair is used to predicts the depth of the images. </p>
<p>** (2) Depth Extracted from 3D Gaussians **
This depth map, on the other hand, is derived (or rasterized) from the rendered view, which is the output during training. It is generated based on the depth of the scene rendered from the actual 3D Gaussians being trained.</p>
<h2 id="conclusion">Conclusion</h2>
<p>In this post, I covered the development leading to FSGS and its key approaches. The few-shot NVS task remains crucial, as it addresses real-world scenarios where users may not have access to a sufficient number of input images for NVS. The methods proposed by FSGS offer a promising solution to this task while retaining the advantages of 3DGS, including real-time rendering capabilities combined with high model performance.</p>
<p>However, two questions arise with FSGS&#39;s approach:</p>
<p>Could there be a better way to initialize generated Gaussians, rather than zeroing out certain attribute values?
Is it stable to train the model using correlations between predicted depth maps? The first is &quot;predicted&quot; by DPT, while the second is generated from the &quot;predicted&quot; Gaussians.
I haven’t shown the experimental results of FSGS, but those who are interested can find more details and results on the FSGS project page<a href="https://zehaozhu.github.io/FSGS/">[6]</a>.</p>
<hr>
<h3 id="references">References</h3>
<p>[1]    Zehao Zhu, Zhiwen Fan, Yifan Jiang, and Zhangyang Wang. 2023. FSGS: Real-Time Few-shot View Synthesis using Gaussian Splatting. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2312.00451">http://arxiv.org/abs/2312.00451</a></p>
<p>[2]    Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, and George Drettakis. 2023. 3D Gaussian splatting for real-time radiance Field rendering. arXiv [cs.GR]. Retrieved from <a href="http://arxiv.org/abs/2308.04079">http://arxiv.org/abs/2308.04079</a></p>
<p>[3]    Ben Mildenhall, Pratul P. Srinivasan, Matthew Tancik, Jonathan T. Barron, Ravi Ramamoorthi, and Ren Ng. 2020. NeRF: Representing scenes as neural radiance fields for view synthesis. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2003.08934">http://arxiv.org/abs/2003.08934</a></p>
<p>[4]    Priya Dwivedi. 2019. Depth Estimation on Camera Images using DenseNets. Towards Data Science. Retrieved November 1, 2024 from <a href="https://towardsdatascience.com/depth-estimation-on-camera-images-using-densenets-ac454caa893">https://towardsdatascience.com/depth-estimation-on-camera-images-using-densenets-ac454caa893</a></p>
<p>[5]    Ranftl René, Bochkovskiy Alexey, and Koltun Vladlen. 2021. Vision Transformers for Dense Prediction. arXiv [cs.CV]. Retrieved from <a href="http://arxiv.org/abs/2103.13413">http://arxiv.org/abs/2103.13413</a></p>
<p>[6]    Zhangyang Wang. FSGS. Github.io. Retrieved November 1, 2024 from <a href="https://zehaozhu.github.io/FSGS/">https://zehaozhu.github.io/FSGS/</a></p>
<p>[7]    Researchgate.net. Retrieved November 1, 2024 from <a href="https://www.researchgate.net/figure/Novel-3D-data-representations-3-6_fig3_381142897">https://www.researchgate.net/figure/Novel-3D-data-representations-3-6_fig3_381142897</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NLP/논문리뷰] BERT: Bidirectional Encoder Representations from Transformers]]></title>
            <link>https://velog.io/@jin_a720/NLP%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-BERT-Bidirectional-Encoder-Representations-from-Transformers</link>
            <guid>https://velog.io/@jin_a720/NLP%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-BERT-Bidirectional-Encoder-Representations-from-Transformers</guid>
            <pubDate>Mon, 14 Oct 2024 03:44:04 GMT</pubDate>
            <description><![CDATA[<hr>
<h2 id="motivation--proposal">Motivation &amp; Proposal</h2>
<table>
<thead>
<tr>
<th align="center">Motivation</th>
<th align="center">Proposal</th>
</tr>
</thead>
<tbody><tr>
<td align="center">- pre-trained representations의 장점을 다 살리지 못하는 단방향 pre-training</td>
<td align="center">⇒ 양방향 Pre-training<br>: ELMo와 같은 단순 concat 방식의 양방향이 아닌 “deep Bidirectional” 학습 제안<br> - MLM + NSP</td>
</tr>
<tr>
<td align="center">- 특정 테스크들에 있어서 Transformer 구조의 디코더가 정말 필요한가?</td>
<td align="center">⇒ 디코더 없이도 오토인코더 방식과 양방향 학습을 통한 문맥 학습을 통해 충분히 성능을 내는 방식을 제안</td>
</tr>
<tr>
<td align="center">- Task Specific한데다가 크기도 크고 복잡한 구조의 모델들을 대체할 방법은 없는가?</td>
<td align="center">⇒ 일반화된  pre-trained 모델을 바탕으로 간단하게 fine-tuning 가능한 방식을 제안</td>
</tr>
<tr>
<td align="center">---</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">## Model Architecture</td>
<td align="center"></td>
</tr>
</tbody></table>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/d56e8e76-0187-4f3c-85c5-4b874ef10b4f/image.png" alt=""></p>
<ul>
<li>input embedding은 token embedding + segmentation embedding + position embedding의 합이다.</li>
<li>모델 구조는 트랜스포머의 인코더와 동일하되, 인풋의 임베딩이 위 방식으로 커스텀되었으며, 기존 방식과 다르게 position embedding이 학습 가능한 하이퍼파라미터가 되었다.</li>
<li>Special token으로 두가지가 활용된다:<ul>
<li><strong>[CLS]</strong>: sequence의 시작에 오는 토큰으로, 이 토큰에 대응되는 마지막 hidden state는 classification task에서 전체 sequence의 representation으로 해석된다.</li>
<li><strong>[SEP]</strong>: sentence 간의 구분을 위한 토큰으로, 이 토큰을 기준으로 segment embedding을 서로 다르게 적용하여 문장끼리 구분한다.</li>
</ul>
</li>
</ul>
<h2 id="pre-training">Pre-training</h2>
<p>Pre-training 과정은 비지도 학습으로 이루어지는 두 테스크에 의해 이뤄진다:</p>
<ol>
<li><p><strong>Masked Language Model</strong> (MLM)</p>
<p> : 랜덤하게 인풋의 15%를 <strong>[mask]</strong>토큰으로 변경한다. </p>
</li>
<li><p><strong>Next Sentence Prediction</strong> (NSP)</p>
<p> : 여러 다운스트림 테스크들이 두 문장간의 <strong>관계</strong>에 기반한다. 대표적으로 QA, Natural Language Inference 등이 있다. 하나의 sequence 내 <strong>[sep]</strong> 으로 구분된 두 문장이 서로 연속적인 문장인지를 파악하는 task이다.</p>
</li>
</ol>
<h2 id="fine-tuning">Fine-tuning</h2>
<p>Fine-tuning 과정에는 Transformer 기반 아키텍처의 self-attention 메커니즘이 큰 역할을 한다. 한 마디로 말하자면 “인풋과 아웃풋을 적절하게 바꾸는” 방식만으로 fine-tuning이 가능해진다. </p>
<p>텍스트 쌍을 이용한 테스크에서 이전의 fine tuning 방식은 1) 독립적으로 문자 쌍을 인코딩하고 2) 양방향 cross attention을 적용하는 두 단계로 이루어졌다. 그러나 BERT는 self-attention을 활용해 위 두 단계를 통일시킨 접근을 시도한다.</p>
<p>이는 먼저 살펴본 BERT의 인풋 구조가 text pair을 concatenate 해서 하나의 sequence로 받고, 여기에 self-attention이 적용됨으로써 사실상 두 문장 간 양방향 cross attention을 적용하는 것과 마찬가지의 효과를 내기 때문이다.</p>
<p>다운스트림 테스크별로 하나의 쌍으로 묶이는 sentence pair은 다음과 같이 구분된다:</p>
<ol>
<li><p>Paraphrasing (동일한 의미인지 아닌지 파악)</p>
</li>
<li><p>Entailment (가설 - 전제 관계 여부 파악)</p>
</li>
<li><p>QA</p>
</li>
<li><p>단일 문장 (text - $\varnothing$) </p>
<p>또한 논문에서는 네 종류의 다운스트림 테스크에 어떻게 BERT가 fine-tuning 될 수 있는지를 보여준다:</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/f85902ad-24ea-4646-b39c-f5a29a443e5d/image.png" alt=""></p>
<ol>
<li><p>Sentence Pair Classification</p>
<ul>
<li>Entailment Classification Task (3 classes are entailment, contradiction, neutral)</li>
<li>Natural Language Inference Task</li>
<li>Paraphrasing Task</li>
</ul>
</li>
<li><p>Single Sentence Classification</p>
<ul>
<li>언어학적으로 말이 되는 문장인지 아닌지 판별</li>
<li>감정분석</li>
</ul>
</li>
<li><p>Q&amp;A</p>
</li>
<li><p>Sentence Tagging (문장 내 단어들을 분류, e.g., Person, Location,…)</p>
</li>
</ol>
<p>이 네가지 테스크는 다시 Sequence-level task인지, Token-level task인지 아니면 Q&amp;A인지에 따라 입출력 형태가 조금씩 다른데, (a), (b)는 Sequence-level task로 [cls] 토큰의 마지막 hidden state가 classification layer에 입력으로 들어가게 된다.</p>
<p>Token-level task인 (d)의 경우 각 토큰의 마지막 hidden state의 출력값이 해당 토큰에 대한 예측값이 된다는 점에서 앞의 구조와 달라진다.</p>
<p>Q&amp;A task의 경우, 입력에서 질문과 답변이 [sep]으로 구분된 하나의 sequence로 임베딩되고 출력에서 BERT는 sequence 내에서 <strong>답변이 시작하는 위치와 끝나는 위치</strong>를 예측하게 된다. 이 때 예측은 각 토큰마다 답변이 시작하거나 끝날 가능성을 점수화하여 이뤄진다.</p>
<hr>
<h3 id="references">References</h3>
<p><a href="https://happy-obok.tistory.com/23">BERT 개념 정리 (특징/구조/동작 방식/종류/장점/BERT 모델 설명)</a></p>
<p><a href="https://medium.com/@hugmanskj/%EA%B0%80%EC%9E%A5-%EC%84%B1%EA%B3%B5%EC%A0%81%EC%9D%B8-%ED%8A%B8%EB%9E%9C%EC%8A%A4%ED%8F%AC%EB%A8%B8%EC%9D%98-%EB%B3%80%ED%98%95-bert%EC%99%80-gpt-%EC%86%8C%EA%B0%9C-0b18fb7e563b">가장 성공적인 트랜스포머의 변형: BERT와 GPT 소개</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CV/개념]Few-Shot Learning]]></title>
            <link>https://velog.io/@jin_a720/CV%EA%B0%9C%EB%85%90Few-Shot-Learning</link>
            <guid>https://velog.io/@jin_a720/CV%EA%B0%9C%EB%85%90Few-Shot-Learning</guid>
            <pubDate>Thu, 03 Oct 2024 17:51:26 GMT</pubDate>
            <description><![CDATA[<p>이번 포스팅에서는 Few-Shot Learning에 대한 기본적인 개념과 baseline model 구조가 어떻게 되어있는지를 공부한 내용을 정리해보려 한다. <a href="https://youtube.com/playlist?list=PLgtf4d9zHHO8YjSSkkBT55XN8xsIvb-ku&amp;feature=shared">Few-Shot Learning(Shusen Wang)</a> 유튜브 강의를 바탕으로 글을 작성하였다.</p>
<hr>
<h2 id="basic-concepts">Basic Concepts</h2>
<h3 id="few-shot-learning이란">Few-Shot Learning이란?</h3>
<p>Few-Shot learning은 적은 수의 데이터셋만 가지고도 모델을 &quot;잘&quot; 학습시키기 위한 학습 방법으로, 학습의 초점이 <strong>유사점과 차이점</strong>을 찾는 것에 맞춰져 있다.</p>
<h3 id="why-few-shot-learning">Why Few-Shot Learning?</h3>
<p>딥러닝 모델을 학습시키기 위해서는 어마어마한 양의 데이터가 필요하다. 그러나 모든 task에 대해서 이 방대한 양의 데이터를 구축하는 것은 사실상 불가능하다. 예를 들어, 열심히 1000가지 클래스의 이미지 데이터셋을 구축해 두었더니 그 1000가지 밖의 클래스에 대한 분류가 필요한 상황이라면? 그런데 하필 이 클래스의 이미지를 모으기가 너무나 어려운 상황이라면? 이럴 때 Few-Shot Learning은 큰 도움이 될 수 있다.</p>
<p>특히나 Novel View Synthesis 테스크의 경우, 모델은 학습한 view에 없는 다른 새로운 view에서 이미지를 생성해 내야 한다. 이러한 경우에 Few-shot learning은 매우 유용하다.</p>
<h3 id="supervised-learning-vs-few-shot-learning">Supervised Learning vs. Few-Shot Learning</h3>
<h4 id="learn-to-learn">Learn to Learn</h4>
<p>&quot;Learn to learn&quot;은 Few-Shot Learning을 포함한 Meta Learning의 목적이다. 즉, 모델은 학습단계에서 생소한 Query를 을 때 &quot;잘 학습할 수 있는&quot; 준비를 하게 된다. 이를 위해서 Few-Shot Learning에서는 Supervised Learning과 다른 방식으로 데이터셋이 구분된다:</p>
<h4 id="supervised-learning">Supervised Learning</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9efc4203-83d0-475b-bfd7-32bb4e5cefa7/image.png" alt=""></p>
<ul>
<li>구조: Training Set - Test Set</li>
<li>Test Set은 <strong>Training Set에 없는 데이터</strong>여야 하지만, <strong>이미 알고있는 class에 속해야</strong> 함.</li>
</ul>
<h4 id="few-shot-learning">Few-Shot Learning</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/828bac3a-7b26-4f16-ac75-152af4e0048d/image.png" alt=""></p>
<ul>
<li>구조: Training Set - Support Set - Query Sample</li>
<li>Query Sample은 <strong>Training Set에 없는 데이터</strong>여야 하고, 동시에 <strong>한 번도 본 적 없는 class에 속해야</strong> 함.</li>
</ul>
<h3 id="k-way-n-shot"><em>k</em>-Way <em>n</em>-Shot</h3>
<p>Few-Shot Learning은 Support Set의 크기에 따라</p>
<ul>
<li>$k$-way: Support Set의 class 수 $k$</li>
<li>$n$-shot: 각 class에 속한 sample 수 $n$
로 구분된다.</li>
</ul>
<p>예를 들면,
<img src="https://velog.velcdn.com/images/jin_a720/post/25b3cd0a-e786-45c1-8e20-bc542d7f9707/image.png" alt="">
이러한 Support Set 구조를 가진다면 이는 4-way 2-shot learning이다.</p>
<h4 id="prediction-accuracy">Prediction Accuracy</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/778af69a-dfb9-4791-b25c-7b9acb7b3839/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/f184c2e6-54ab-4e31-9d2c-376284482754/image.png" alt=""></th>
</tr>
</thead>
</table>
<p>예측 정확도는 Shot이 많을수록, Way가 적을수록 높아진다.</p>
<h3 id="few-shot-learning-학습-방법">Few-Shot Learning 학습 방법</h3>
<p>학습 과정은 크게 세 단계로 나뉜다.
<img src="https://velog.velcdn.com/images/jin_a720/post/e8d72cfb-04c8-40c9-9e23-99f1d9539e2f/image.png" alt=""></p>
<p><strong>1. 큰 Training Set으로 모델을 학습시킨다.</strong></p>
<ul>
<li><p>이 때 이미지 간의 <strong>유사점과 차이점</strong>이 학습된다.</p>
</li>
<li><p>Training Set은 Query의 class를 포함하지 않아도 된다.</p>
</li>
<li><p>Similarity function을 통해 $[0,1]$ 범위의 similarity score $sim(\bold{x_i}, \bold{x_j})$ 값을 계산하고 학습한다. </p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/b55e4667-da41-4d61-8ce4-b08f54831daf/image.png" alt=""></p>
<p><strong>2. Query 이미지를 받으면 Support Set의 각 샘플과 Query를 비교한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/c1d0f9eb-5c52-4d4c-8833-efd627dcb2b6/image.png" alt=""></p>
<p><strong>3. 이 과정을 통해 Query가 속하는 class를 결정한다.</strong></p>
<ul>
<li>가장 similarity score이 높은 class를 찾는다.</li>
</ul>
<h2 id="siamese-network">Siamese Network</h2>
<h3 id="pairwise-similarity-scores">Pairwise Similarity Scores</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/bd252988-1332-49fb-af18-842d81d9d4ef/image.png" alt=""></p>
<ul>
<li><p>Positive Samples: 랜덤하게 학습데이터에서 하나의 클래스의 이미지를 샘플하고, 같은 클래스의 다른 이미지를 묶어 만든다.</p>
</li>
<li><p>Negative Samples: 마찬가지로 랜덤하게 학습데이터에서 하나의 클래스의 이미지를 샘플하고, 그 클래스를 제외한 클래스의 다른 이미지를 묶어 만든다.</p>
</li>
</ul>
<h3 id="training">Training</h3>
<h4 id="cnn-for-feature-extraction">CNN for Feature Extraction</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/9006bb51-5e6c-478a-b2a8-1dbde7ec0a6f/image.png" alt=""></p>
<h4 id="forward-propagation">Forward Propagation</h4>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/c43add02-f290-4865-8156-1e260544f31a/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/jin_a720/post/cdf8143e-e21a-4547-9e96-42e630397564/image.png" alt=""></th>
</tr>
</thead>
</table>
<ol>
<li><p>Positive Samples에서는 두 이미지의 Target = 0 이다. 이 때 $f$는 CNN이며, $x_1$, $x_2$가 하나의 CNN $f$를 공유한다.</p>
</li>
<li><p>feature vector을 $h_1$, $h_2$로 뽑아낸 후, 둘의 차이를 계산하여 $z$를 구한다.</p>
</li>
<li><p>$z$를 Dense Layers에 통과시키며 하나의 scalar 값을 도출한다.</p>
</li>
<li><p>Sigmoid 활성화 함수를 통과시켜 $[0,1]$ 사이의 similarity score을 구한다.</p>
</li>
<li><p>Target값과 비교하여 Loss를 구하여 업데이트시킨다.</p>
</li>
<li><p>같은 수의 Positive &amp; Negative Sample 쌍을 학습시킨다.</p>
</li>
</ol>
<h4 id="back-propagation">Back Propagation</h4>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/90bc9844-a3af-4f59-bf8a-6277cc0bb0d8/image.png" alt=""></p>
<p>Backpropagation이 진행될 때에는 두 가지 값이 모두 업데이트 된다:</p>
<ul>
<li>CNN $f$의 파라미터</li>
<li>$z$가 통과하는 Dense Layers의 파라미터</li>
</ul>
<h4 id="one-shot-prediction">One-Shot Prediction</h4>
<p>학습된 모델을 바탕으로 Support Set과 Query를 활용하여 similarity score을 계산하여 검증한다.</p>
<h2 id="loss-function">Loss Function</h2>
<p>그렇다면 Siamese Network에서 Objective Function은 어떻게 정의해야 할까? 앞서 살펴본 Siamese Network의 학습과정에서 사용된 Binary Loss와, 세 이미지를 비교하여 loss를 계산하는 Triplet Loss가 대표적이다.</p>
<h3 id="binary-loss">Binary Loss</h3>
<p>앞의 Training 과정에서 Binary Loss는 다음과 같이 정의된다.</p>
<ul>
<li><p>$\bold{z} = |f(\bold{x}_1)-f(\bold{x}_2)|$ 으로, 단순 CNN을 통과한 feature vector 간의 차의 절대값이다.</p>
</li>
<li><p>Binary Loss는 $\bold{z}$에 sigmoid 변환을 해준 후, $BCE(Binary Cross Entropy)$ 로 정의된다.</p>
</li>
</ul>
<h3 id="triplet-loss">Triplet Loss</h3>
<p>Triplet Loss에는 세 가지 입력값이 있다.</p>
<ul>
<li><p>Anchor, $\bold{x}^a$: anchor 역할을 하는 학습 샘플</p>
</li>
<li><p>Positive, $\bold{x}^+$: $\bold{x}^a$와 같은 class의 랜덤한 샘플</p>
</li>
<li><p>Negative, $\bold{x}^-$: $\bold{x}^a$가 속한 class를 제외한 class에서 뽑은 랜덤한 샘플</p>
</li>
</ul>
<p>세 가지 입력 이미지를 바탕으로 다음과 같이 Triplet Loss를 계산한다.
<img src="https://velog.velcdn.com/images/jin_a720/post/ddcca526-6276-4897-90bf-f11d0717a515/image.png" alt=""></p>
<ol>
<li><p>세 이미지를 하나의 CNN을 통과시켜 각각의 feature extraction을 진행한다.</p>
</li>
<li><p>$f(\bold{x}^a)$ 와 $f(\bold{x}^+)$, $f(\bold{x}^a)$ 와 $f(\bold{x}^-)$ 간의 $L_2$ norm인 $d^+$, $d^-$를 각각 계산한다. </p>
<ul>
<li>이 때 같은 class에 있는 관계이므로 <strong>$d^+$는 작은값, 다른 class에 있는 관계이므로 $d^-$는 큰 값이 되도록 학습 시키는 것이 학습의 목표</strong>가 된다!</li>
</ul>
</li>
<li><p>학습 목적에 맞게, Loss $L = max{0, d^+ + \alpha -d^-} 이 된다.</p>
<ul>
<li>$\alpha$ 는 margin 값으로, $d^-$, $d^+$가 매우 가까운 값일 때 두 distance 값 사이를 충분히 벌리기 위해 사용한다.</li>
<li>$d^- \ge d^+ + \alpha$ 라면, loss = 0이 되도록 한다. </li>
</ul>
</li>
</ol>
<blockquote>
<h4 id="d--ge-d--alpha-이기만-하면-loss--0이-되는-거-과연-괜찮을까">$d^- \ge d^+ + \alpha$ 이기만 하면 loss = 0이 되는 거, 과연 괜찮을까?</h4>
<p>단순 무작위 샘플링으로 학습 샘플을 고른다면 loss가 너무 쉽게 0이 되어버리므로 이는 학습을 방해하는 요소가 된다. 따라서 실제 모델 학습시에는 애초에 학습을 &quot;어렵게&quot; 만든다고 한다. 즉, $d^+$와 $d^-$의 차이가 작은 (=구분이 어려운) 이미지끼리 묶어준다는 것!</p>
</blockquote>
<h2 id="few-shot-prediction">Few-Shot Prediction</h2>
<p>지금까지 Few-Shot Learning의 학습 과정을 살펴보았다. 그렇다면 예측 단계는 어떻게 수행될까?</p>
<p>단순하게는, 학습 샘플과 supporting set의 샘플 모두를 CNN으로 인코딩하고, 학습 과정에서 사용한 similarity function을 똑같이 적용해서 Support set의 각 class의 이미지(들의 평균)과 비교할 수 있을 것이다. 그러나 이러한 방식은 Support set의 샘플 수가 매우 적기 때문에 몇가지 다른 방식이 사용된다.</p>
<h3 id="making-prediction">Making Prediction</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/2e6c0963-15e0-4edf-87b8-466acdcef7ef/image.png" alt=""></p>
<ol>
<li><p>먼저 Support Set의 샘플을 동일한 CNN $f$를 통과시켜 feature vector를 구하고, 이를 다시 정규화시켜 $\mu$ 값을 구한다. $\mu_1, \mu_2, \mu_3$를 row로 하는 matrix $M$을 구한다. </p>
<ul>
<li>$M = W$, $q = f(\bold{x}_i)$로 다시 나타낼 수 있다.</li>
</ul>
</li>
<li><p>같은 방식으로 Query Set의 샘플도 벡터로 임베딩한다. ($q$)
<img src="https://velog.velcdn.com/images/jin_a720/post/7723ff71-cdc0-4e68-bf39-193220f6a50f/image.png" alt=""></p>
</li>
<li><p>$M$과 $q$를 곱하여 softmax를 취해 확률 $p$를 구한다.</p>
<ul>
<li>1.에 의해 $p = Softmax(W \cdot f(\bold{x}_i)$ ($bias = 0$)으로 다시쓰면, 우리가 익숙한 확률 함수이다.</li>
</ul>
</li>
</ol>
<h3 id="cosine-similarity">Cosine Similarity</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/659c9b76-624b-4f26-b006-1b3d4e695ef7/image.png" alt=""></p>
<p>여기서 하나의 새로운 similarity function이 소개된다. 단순히 임베딩된 벡터끼리의 비교로 확률을 구하는 것이 아니라, cosine similarity를 활용하는 것이다. 이를 활용하면 벡터의 크기가 중요하지 않기 때문에, &quot;패턴의 차이&quot;(여기에선 방향의 차이)에 집중해야 할 때에 적합하다. 또한 prediction 과정에서 유사도 계산은 정규화 후 이뤄지는데, 이 과정에서 더 안정적인 유사도 비교가 가능하다. 계산은 간단하게 $M \cdot q$를 cosine similarity function으로 바꿔주게 된다.</p>
<h3 id="entropy-regularization">Entropy Regularization</h3>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/4878c566-a08f-4b4b-9b24-d5c4d8236e8a/image.png" alt=""></p>
<p>Entropy Regularization은 앞에서 임베딩 과정에 적용할 수 있는 하나의 방법이다. 확률 $p$에 대해</p>
<p>$$\mathbb{H}(p) = -\sum_ip_i \log p_i$$</p>
<p>로 정의되는 Entropy 함수에서, Query Set의 모든 query에 대해 $\mathbb{H}(p)$의 평균을 구하여 정규화하게 된다. 이 때 엔트로피가 작아지게 만드는 것이 목표가 된다.</p>
<hr>
<h3 id="references">References</h3>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PLgtf4d9zHHO8YjSSkkBT55XN8xsIvb-ku">Few-Shot Learning(Shusen Wang YouTube)</a></li>
<li><a href="https://wooono.tistory.com/239">https://wooono.tistory.com/239</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[NLP/논문리뷰] Word2Vec: Distributed Representations of Words and Phrases and their Compositionality]]></title>
            <link>https://velog.io/@jin_a720/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Word2Vec-Distributed-Representations-of-Words-and-Phrases-and-their-Compositionality</link>
            <guid>https://velog.io/@jin_a720/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Word2Vec-Distributed-Representations-of-Words-and-Phrases-and-their-Compositionality</guid>
            <pubDate>Wed, 02 Oct 2024 04:30:14 GMT</pubDate>
            <description><![CDATA[<p><a href="https://arxiv.org/abs/1310.4546">* Distributed Representations of Words and Phrases and their Compositionality</a></p>
<hr>
<blockquote>
<p><strong>Background Knowledge</strong></p>
<ul>
<li><p>Word Representations 모델</p>
<p>  : 단어를 고차원 벡터 공간에 mapping 하여 수치적으로 표현하는 방법. 단어 간의 유사성과 관계를 표현하는 것을 가능하게 해 주고, 단어의 의미를 정량적으로 다루는 것이 가능하도록 함.</p>
</li>
<li><p>Syntactic relationship과 Semantic relationship:</p>
</li>
<li><p>n-gram: 연속된 n개의 단어 혹은 문자 시퀀스</p>
</li>
</ul>
</blockquote>
<h2 id="abstract">Abstract</h2>
<hr>
<h3 id="motivation">Motivation</h3>
<ul>
<li>기존의 연속적 Skip-gram 모델의 강점은 syntactic, semantic  relationship을 포착하는 높은 수준의 distributed vector representation을 학습하는 효율적인 도구라는 것.<ul>
<li>예를 들어, “king”-”queen”, “man”-”woman” 등의 단어 쌍은 벡터 공간 내에서 비슷한 관계를 갖도록 학습됨</li>
</ul>
</li>
<li>그러나 idiomatic expression 이나 복잡한 phrases를 파악하는 것은 어려움.<ul>
<li>본 논문의 초록에 제시된 예시처럼, “Canada” 와 “Air”이 결합되어 “Air Canada” 라는 새로운 의미를 가지는 단어를 제대로 반영하짐 못하는 경우가 예시가 될 수 있음.</li>
</ul>
</li>
<li>또한 단어의 순서를 파악하는 것이 어려움.</li>
</ul>
<h3 id="proposal">Proposal:</h3>
<ul>
<li>자주 등장하는 words의 subsampling<ul>
<li>학습 속도의 개선 효과</li>
<li>더 정규화된 단어 표현을 학습 가능하게 됨</li>
</ul>
</li>
<li>hierarchical softmax 대신 negative sampling 적용<ul>
<li>학습 속도 개선</li>
<li>자주 등장하는 단어에 대해 더 나은 벡터 표현을 얻을 수 있음</li>
</ul>
</li>
</ul>
<hr>
<h2 id="introduction">Introduction</h2>
<hr>
<h3 id="research-background">Research Background</h3>
<p>NLP task에 있어서 distributed word representations는 유사 단어를 grouping하는 방식으로 성능 향상에 있어 중요한 작업으로 연구되어 왔지만, 초록에서 설명했듯 몇가지 해결해야 할 사항들이 존재했기 때문에 저자들은 이를 skip-gram이라는 word representations  모델을 확장하는 접근으로 개선하고자 하였다.</p>
<p>신경망을 이용한 word representations는 언어학적 규칙과 패턴을 명시적으로 인코딩한다. 저자들은 이런 패턴 중 상당수가 linear translation으로 표현 가능하다고 설명하는데, 예를 들어 vec(“Madrid”) - vec(“Spain”) + vec(“France”)는 다른 word 벡터들보다 vec(“Paris”)에 가깝다. </p>
<details>
  <summary><b>언어학적 규칙과 패턴은 정말 선형 변환으로 '잘' 표현될까?</b></summary>

<ul>
<li>이후의 연구에서 이런 식의 선형 변환이 제대로 작동하려면, 수식을 계산한 결과 벡터와 가장 가까운 벡터를 찾을 때 vec(”Madrid”)를 제외해야 원하는 결과가 나올 수도 있다는 점이 지적되었다.<ul>
<li>왜냐? 위 수식과 같은 단순 선형 변환의 결과는 vec(”Paris”)보다도 vec(”Madrid”)에 더 가까운 경우가 존재한다. 이는 실제 의도한 단어간 관계를 제대로 반영하지 못하는 상황이기 때문이다.</li>
</ul>
</li>
<li>이를 비롯한 단어에서의 이런 선형 벡터 변환이 일관적이지 않고, Train data의 편향된 정보에 의존한 데에서 기인한 것일지도 모른다는 문제가 지적되었다.</li>
<li>또한 word representations에서 단어는 ‘고차원’ 공간으로 매핑되기 때문에, 고차원 공간에서 이러한 방식의 선형 변환만으로 word 벡터간의 관계를 설명하는 것은 지나친 단순화이며 복잡한 의미 표현과 언어 관계를 포착하지 못한다는 문제 역시 지적되었다.</details>

</li>
</ul>
<h3 id="approaches-modification-of-original-skip-gram-model">Approaches: Modification of original Skip-gram model</h3>
<ul>
<li><strong>Sub-sampling</strong> of frequent words</li>
<li><strong>NEG</strong> as a simplified variant of Noise Contrastive Estimation(NCE)</li>
<li>Word based ⇒ <strong>Phrase based</strong> model<ul>
<li>Identify large number of phrases with data-driven approach</li>
<li>One phrase = One token During training</li>
<li>Evaluate with a test set of analogical reasoning tasks containing both words &amp; phrases</li>
</ul>
</li>
</ul>
<hr>
<h2 id="the-skip-gram-model">The Skip-gram Model</h2>
<hr>
<p align="center"><img     src="https://velog.velcdn.com/images/jin_a720/post/0e1edf9c-c456-4e13-a6ac-9c5a2664e954/image.png" width="60%" height="60%"></p>
<center>Skip-gram 모델의 구조</center> 

<h3 id="architecture">Architecture</h3>
<p>1) word: mapped vector 로 이루어진 dictionary를 만든다.</p>
<p>2) input은 center word가, output은 context word가 된다. 이 때 sliding window를 사용하여 window size = $c$일 때, center word 앞 뒤 $c$개, 총 $2c$개의 단어가 context word로 학습, 예측된다.</p>
<p>3) Dataset 구성은</p>
<p> $x = w(t), Y = {w(t-c), \cdots , w(t+c)}$로 구성된다.</p>
<p>4) 각각의 train sample은 classification task가 된다. (한 x에 대해 매우 많은 단어들 중 가까운 단어를 고르는 task가 되기 때문)</p>
<blockquote>
<p>예를 들어 보자. “The cat sat on the mat” 이라는 문장에서 “sat”을 center word라 하고 c=2라 하면 다음과 같은 Train Set을 만들 수 있다:</p>
<table>
<thead>
<tr>
<th>X</th>
<th>Y</th>
</tr>
</thead>
<tbody><tr>
<td>sat</td>
<td>The</td>
</tr>
<tr>
<td>sat</td>
<td>cat</td>
</tr>
<tr>
<td>sat</td>
<td>on</td>
</tr>
<tr>
<td>sat</td>
<td>the</td>
</tr>
</tbody></table>
<p>이 때 위의 모델 구조에서 $w(t)$ = “sat”이고, output에 각 Y의 단어들이 들어가게 된다.</p>
</blockquote>
<h3 id="the-objective-of-the-original-skip-gram">The Objective of the original Skip-gram</h3>
<p>기존 Skip-gram 모델의 Opjective는 “to maximize the average log probability” 이다:</p>
<p>$$
\frac{1}{T} \sum_{t=1}^T \sum_{-c \leq j \leq c, j \neq 0} \log p\left(w_{t+j} \mid w_t\right)
$$</p>
<p>이 때의 c는 window size가 된다</p>
<p>이 때 $p(w_{t+j}|w_t)$ 는 softmax function에 의해 다음과 같이 정의된다:</p>
<p>$$
p\left(w_O \mid w_I\right)=\frac{\exp \left(v_{w_O}^{\prime}{ }^{\top} v_{w_I}\right)}{\sum_{w=1}^W \exp \left(v_w^{\prime}{ }^{\top} v_{w_I}\right)}
$$</p>
<p>$v_w$와 $v’_w$는 각각 $w$에 대한 “input” 과 “output” vector representations 이고, $W$는 단어 vocabulary set 안의 전체 words의 수이다. 이렇게 정의되는 확률값은 매우 큰 $W$에 의해 gradient 계산에 드는 cost가 커진다는 문제가 존재한다. 따라서 저자들은 NCE를 간소화한 <strong>Negative Sampling</strong> 방식을 이용하여 새롭게 objective function을 정의한다.</p>
<h3 id="the-new-objective-of-the-skip-gram">The New Objective of the Skip-gram</h3>
<p>$$
\log \sigma\left(v_{w_O}^{\prime}{ }^{\top} v_{w_I}\right)+\sum_{i=1}^k \mathbb{E}<em>{w_i \sim P_n(w)}\left[\log \sigma\left(-v</em>{w_i}^{\prime}{ }^{\top} v_{w_I}\right)\right]
$$</p>
<p>이 목적 함수는 실제 vocabulary 내의 단어인 positive example과 vocabulary 밖의 연관이 없는 negative example에 대한 두 항으로 분류하여 살펴볼 수 있다.</p>
<p>$$
\log \sigma\left(v_{w_O}^{\prime}{ }^{\top} v_{w_I}\right)
$$</p>
<p>먼저 positive example에 대한 항으로, 벡터 $v’<em>{w_O}$와 $v</em>{w_I}$의 내적에 의해 나타난 두 벡터의 유사성에 $\sigma$를 취하여 확률값으로 변환하고, 이에 로그를 취하였다. </p>
<p>이는  <strong>maximize 해야 하는 값</strong>이 된다.</p>
<p>$$
\sum_{i=1}^k \mathbb{E}<em>{w_i \sim P_n(w)}\left[\log \sigma\left(-v</em>{w_i}^{\prime}{ }^{\top} v_{w_I}\right)\right]
$$</p>
<p>negative example에 대한 항으로, 벡터 $-v’<em>{w_i}$와 $v</em>{w_I}$의 내적에 의해 나타난 두 벡터의 유사성에 $\sigma$를 취하여 확률값으로 변환하여 로그를 취하고, 이의 기대값을 모든 negative sample에 대해 합산하였다.</p>
<ul>
<li>$k$는 샘플링할 negative sample의 수, $w_i ~ P_n(w)$는 noise 분포 $P_n(w)$로부터 샘플링된 $w_i$를 의미한다.</li>
</ul>
<p>이는 <strong>minimize해야 하는 값</strong>이 된다. </p>
<blockquote>
<p>위에서 사용한 예시인 “The cat sat on the mat” 라는 vocabulary를 살펴보자. 첫번째 항에서는 예를 들어 “sat”과 “cat” 단어의 벡터가 서로 근접하게 위치하도록 학습을 진행한다. 반면 두번째 항에서는 “sat”과 무관한 “car”과 같은 단어의 벡터간 거리가 서로 멀어지도록 학습을 진행하게 된다.</p>
</blockquote>
<p>이 때 논문의 저자는 noise 분포 $P_n(w)$를 unigram distribution $U(w)^{3 \over 4}$ 로 맞추었을 때 모델 성능이 가장 뛰어났다고 추가하고 있다.</p>
<blockquote>
<p><strong>Unigram</strong>
: 자연어 처리(NLP)에서 텍스트를 분석할 때 사용하는 기본적인 개념 중 하나로, 단어의 빈도 또는 확률을 개별적으로 계산하는 방법. 문장을 단어들의 시퀀스(sequence)로 보고, 각 단어가 독립적으로 발생한다고 가정</p>
</blockquote>
<ul>
<li><strong>Unigram 분포</strong><br>  : 말뭉치(코퍼스) 내에서 각 단어가 등장하는 빈도를 기반으로 그 단어의 확률을 계산하는 분포. 예를 들어, 코퍼스 내에서 &quot;cat&quot;이라는 단어가 100번 등장하고, 전체 단어 수가 10,000이라면 &quot;cat&quot;의 unigram 확률은<br>  ${100 \over 10000}=0.01$    </li>
<li>Negative sampling, 언어 모델 기본 형태 등에 사용됨</li>
<li>왜 그럼 Word2Vec에서 3/4제곱을 곱할까? 자주 등장하는 단어의 샘플링 확률을 낮추는 것.</li>
</ul>
<h3 id="subsampling-of-frequent-words">Subsampling of Frequent Words</h3>
<ul>
<li>매우 자주 등장하는 관사, be동사, 혹은 전치사 등과 같은 단어는 정보량은 적은데 자주 등장하므로 모델 학습 속도를 저하시킬 수 있다. 또한 중요한데 등장 빈도가 낮은 단어들의 학습을 방해할 수 있다.</li>
<li>이에 Subsampling (일부를 무시함)을 적용하여 문제를 해결하고자 시도하고 있다.</li>
</ul>
<p>$$
P\left(w_i\right)=1-\sqrt{\frac{t}{f\left(w_i\right)}}
$$</p>
<p>$t$는 임계값으로, 다음 수식에서는 단어  $w_i$가 등장할 확률 $f(w_i)$에 따라 그 단어를 subsampling할 확률을 계산한다. </p>
<hr>
<h2 id="empirical-results">Empirical Results</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/f1b05e7c-29b1-441f-a7c1-d0a97aa943b3/image.png" alt=""></p>
<ul>
<li>평가 기준은 학습 시간과 Syntactic, Semantic, 그리고 전체적인 Total Accuracy로 구성되었다.</li>
<li>Table 에서 확인할 수 있듯, NEG가 가장 높은 정확도를 보였고 subsampling과 결합하였을 때 가장 좋은 성능을 보였다.</li>
<li>NEG의 파라미터 $k$는 15일 때 가장 좋은 결과를 보였다.</li>
<li>high frequency 단어에서 subsampling은 training speed를 2~ 10배까지 개선시켰다.</li>
<li>평가방식: 단어 유추(analogical reasoning) 작업을 사용하여 모델 성능을 평가했다.<ul>
<li>e.g., &quot;Germany : Berlin :: France : ?&quot;와 같은 유추 문제를 통해 단어 벡터 간의 관계를 평가</li>
</ul>
</li>
</ul>
<hr>
<h2 id="learning-phrases">Learning Phrases</h2>
<hr>
<p>이 챕터에서는 단어 벡터를 넘어 phrases의 벡터 표현을 학습하는 방법을 설명한다. Phrases는 단순한 단어의 의미 결합 이상으로 새로운 의미를 가지게 되기 때문에 기존의 단어 임베딩 기법만으로는 이러한 phrases를 잘 표현하기 어렵다는 문제가 존재한다. 따라서 저자들은 다음과 같은 과정으로 Phrases의 vector representation을 학습한다:</p>
<ol>
<li><p>Data-driven Approach</p>
<p> : 단어의 unigram 과 bigram 빈도를 활용하여 자주 함께 나타나는 단어 쌍을 구로 인식하고 학습에 포함시키도록 한다. 두 단어가 함께 등장하는 <strong>빈도</strong>를 각 단어가 독립적으로 등장하는 경우(<strong>독립성</strong>)와 비교하여 score을 결정한다.</p>
<p>$$
\operatorname{score}\left(w_i, w_j\right)=\frac{\operatorname{count}\left(w_i w_j\right)-\delta}{\operatorname{count}\left(w_i\right) \times \operatorname{count}\left(w_j\right)}
$$</p>
<ul>
<li><p>$count(w_i w_j)$: 단어 $w_i$와 $w_j$가 연속적으로 나타나는 횟수 (=bigram frequency)</p>
</li>
<li><p>$count(w_i) \times count(w_j)$: 각 단어가 개별적으로 나타나는 빈도의 곱</p>
</li>
<li><p>$\delta$: discounting coefficient. 저빈도로 나타나는 단어 쌍이 구로 형성되는 것을 막는 파라미터</p>
<p>⇒ $score(w_i, w_j)$: 두 단어가 phrase로 형성될지 여부를 결정하는 점수로, 임계값 이상의 score을 얻은 두 단어는 phrase로 인식될 가능성이 커진다.</p>
</li>
</ul>
</li>
<li><p>Training</p>
<p> : 선택된 phrase 들을 각각 하나의 토큰으로 취급하여 Skip-gram 모델에서 학습시킨다.</p>
</li>
</ol>
<p>이러한 과정을 통해서 phrases에 대한 vector representation을 진행하고 나면 다시 analogical reasoning을 통해 모델 성능을 평가한다.</p>
<ul>
<li>e.g., &quot;Montreal&quot; : &quot;Montreal Canadiens&quot; :: &quot;Toronto&quot; : &quot;Toronto Maple Leafs” 와 같은 prediction task를 통해 모델을 평가</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/fd0d4296-f0ce-46e9-82e3-8aa835321385/image.png" alt=""></p>
<ul>
<li>subsampling이 없을 때는 k=15인 NEG가 가장 높은 성능을 보였으나, subsampling을 적용하였을 때 Hierarchical Softmax의 성능이 크게 향상되었다.</li>
<li>이후 dimensionality를 1000으로 높인 33,000,000,000개의 단어로 구성된 데이터셋이서 Hierarchical Softmax를 활용하여 72%까지 accuracy를 높일 수 있었다.</li>
</ul>
<details>
  <summary><b>왜 Hierarchical Softmax가 Phrase를 학습하는 데에 더 효과가 좋았을까?</b></summary>

<ul>
<li><p>NEG: 단어의 출현 확률을 직접 계산한다기 보다 “관계”의 학습에 적합하다. 계산량이 크게 줄어든다는 장점이 있으나 더 간단한 계산에 성능이 좋고 (정밀한 확률 계산을 하지 않기 때문에) 낮은 빈도로 나타나는 단어에 대해서 학습이 잘 이뤄지지 않을 수 있다.</p>
</li>
<li><p>Hierarchical Softmax: 이진트리 구조를 활용한 확률 계산이 이뤄진다. 마찬가지로 계산 효율성을 높일 수 있는 방법으로 제시되면서 동시에 확률 계산이 더 정밀하다.
⇒ Phrase의 경우 등장 빈도가 높지 않은 단어들이 존재하고 (예: Air Canada) 계산의 복잡도가 조금 더 높다. 따라서 일반적인 word representation에서는 NEG가 성능이 더 높게 나오더라도 Phrase 학습에 있어서 HS가 더 높은 성능이 나올 수 있었던 것으로 추측된다.</p>
</details>
<details>
<summary><b>왜 특히 Hierarchical Softmax와 NEG를 비교하는 것일까?</b></summary>

<ul>
<li>원래 Softmax 함수는 대규모 vocabulary를 다룰때는 계산 효율이 낮다. 따라서 Softmax보다 계산 효율성을 높일 수 있는 방법으로 1) NEG 2) HS를 제시한 것.</li>
<li>NEG 와 Hierarchical Softmax는 둘 다 원래 Softmax를 사용하는 것보다 계산 효율성의 측면을 보완해주는 방법이라는 공통점이 존재한다.</details>

</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>Bigram</strong>
: 텍스트에서 두 단어가 연속적으로 나타나는 경우. 일반적으로 두 단어의 조합이 자주 나타나는지, 그리고 의미있는 조합인지 분석을 위해 활용됨</p>
</blockquote>
<ul>
<li>Unigram과 달리 단어 간의 문맥적 관계를 파악 가능 
  ⇒ 더 정교하게 language modeling이 가능</li>
</ul>
<hr>
<h2 id="additive-compositionality">Additive Compositionality</h2>
<hr>
<p>이 챕터에서는 위에서 언급했던 단어와 phrases의 vector representation이 선형적으로 결합이 가능하다는 성질에 대해 설명한다. 저자들은 간단한 벡터 덧셈이 복잡한 의미를 구성하는 것이 가능하다는 점을 보인다.</p>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/8812f7d4-82d3-4faa-8b88-266c4a89af91/image.png" alt=""></p>
<ul>
<li>테이블에서와 같이 Czech + currency를 더했을 때 이 벡터는 같은 행의 네 단어 “koruna”, “Check crown”, “Polish zolty”, “CTK” 와 가장 가장 가까웠다.</li>
</ul>
<p>이러한 연산이 가능한 이유는, 단어 벡터가 softmax 함수의 입력에 선형적으로 연결되어 있기 때문에 벡터 간 합이 두 단어의 context 의 분포의 곱과 유사한 결과를 나타내기 때문이라고 저자들은 설명한다.</p>
<p>이러한 발견은 복잡한 언어의 의미 관계를 간단한 벡터 연산으로 환원할 수 있다는 점에서 의의가 있는데, 긴 텍스트를 벡터화 할 때 유용할 수 있다.</p>
<p><strong>Analogical Reasoning vs. Additive Compositionality</strong></p>
<ul>
<li><strong>Analogical Reasoning</strong>은 ‘유추’ 능력이 핵심. 예를 들어 A → B 라면 C → D 이런 관계에서 벡터의 선형 변환을 통해 vec(”B”) - vec(”A”) + vec(”C”) 가 vec(”D”)에 가까운지를 확인하는 방식. ‘더’ 복잡한 의미 구성을 목적으로 하지는 않음</li>
<li><strong>Additive Compositionality</strong>는 벡터 간 연산을 통해 새로운 의미 구성에 초점을 맞춤. 복잡한 의미 구성이 목적임. 예를 들어 앞선 Table 5.에서처럼 “Czech” + “currency”라는 벡터의 덧셈을 통해 “koruna”를 도출하는 것이 목적</li>
</ul>
<hr>
<h2 id="comparison-to-published-word-representations">Comparison to Published Word Representations</h2>
<hr>
<p><img src="https://velog.velcdn.com/images/jin_a720/post/b57ba4ac-e3b9-4bd3-acca-3bb4045842f4/image.png" alt=""></p>
<ul>
<li>기존의 다른 word representations 모델들과 저자들의 보완된 Skip-gram을 비교.</li>
<li>평가 기준은 analogical reasoning</li>
<li>대규모 모델에서 Skip-gram의 성능이 큰 차이로 가장 우수했음.</li>
<li>드문 단어에 대해서도 비교적 정확한 추론이 이루어짐.</li>
<li>더 큰 데이터셋으로도 기존 모델들보다 Training에서 효율성이 높았음.</li>
</ul>
<hr>
<h2 id="conclusion">Conclusion</h2>
<hr>
<h3 id="contributions">Contributions</h3>
<ul>
<li>Model Accuracy &amp; Training Speed:<ul>
<li>improved model architecture</li>
<li>subsampling of the frequent words</li>
<li>Negative sampling algorithm</li>
</ul>
</li>
<li>Phrase Representation:<ul>
<li>phrase to a single token</li>
</ul>
</li>
</ul>
<h3 id="note">Note</h3>
<ul>
<li>Training algorithm과 하이퍼파라미터의 선택은 task specific 하다.</li>
<li>Crucial decisions that affect the performance of the model:<ul>
<li>the choice of the model architecture</li>
<li>the size of the vectors</li>
<li>the subsampling rate</li>
<li>the size of the training window</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>