<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>simba-pumba</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 11 Jun 2023 09:15:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>simba-pumba</title>
            <url>https://images.velog.io/images/simba-pumba/profile/11bdaa2a-5aaa-4257-adb8-225538f21560/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. simba-pumba. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/simba-pumba" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[How to ensemble]]></title>
            <link>https://velog.io/@simba-pumba/How-to-ensemble</link>
            <guid>https://velog.io/@simba-pumba/How-to-ensemble</guid>
            <pubDate>Sun, 11 Jun 2023 09:15:44 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[How to Handle Imbalanced Dataset]]></title>
            <link>https://velog.io/@simba-pumba/How-to-Handle-Imbalanced-Dataset</link>
            <guid>https://velog.io/@simba-pumba/How-to-Handle-Imbalanced-Dataset</guid>
            <pubDate>Sun, 11 Jun 2023 09:15:32 GMT</pubDate>
            <description><![CDATA[<p>TBU</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[How to Improve Performance without Domain knowledge or Prior information]]></title>
            <link>https://velog.io/@simba-pumba/How-to-Improve-Performance-without-Domain-knowledge-or-Information</link>
            <guid>https://velog.io/@simba-pumba/How-to-Improve-Performance-without-Domain-knowledge-or-Information</guid>
            <pubDate>Sun, 11 Jun 2023 09:15:10 GMT</pubDate>
            <description><![CDATA[<p>TBU</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CODE] Augmentation is all you need]]></title>
            <link>https://velog.io/@simba-pumba/CODE-Augmentation-is-all-you-need</link>
            <guid>https://velog.io/@simba-pumba/CODE-Augmentation-is-all-you-need</guid>
            <pubDate>Sun, 11 Jun 2023 09:14:58 GMT</pubDate>
            <description><![CDATA[<p>tbu</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Time Series Anomaly Detection Survey]]></title>
            <link>https://velog.io/@simba-pumba/Time-Series-Anomaly-Detection-Survey</link>
            <guid>https://velog.io/@simba-pumba/Time-Series-Anomaly-Detection-Survey</guid>
            <pubDate>Sun, 11 Jun 2023 09:14:45 GMT</pubDate>
            <description><![CDATA[<p>TBU</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[k8s 명령어 정리]]></title>
            <link>https://velog.io/@simba-pumba/k8s-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@simba-pumba/k8s-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 11 Jun 2023 09:14:13 GMT</pubDate>
            <description><![CDATA[<p>TBU</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Graph Convolutional Neural Networks for Web-Scale Recommender System]]></title>
            <link>https://velog.io/@simba-pumba/Graph-Convolutional-Neural-Networks-for-Web-Scale-Recommender-System</link>
            <guid>https://velog.io/@simba-pumba/Graph-Convolutional-Neural-Networks-for-Web-Scale-Recommender-System</guid>
            <pubDate>Mon, 24 May 2021 08:28:15 GMT</pubDate>
            <description><![CDATA[<p>Pinterest + GraphSage = PinSage</p>
<p>Ying, Rex, et al. Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery &amp; Data Mining. 2018. 907 citations.</p>
<p>Hamilton, William L., Rex Ying, and Jure Leskovec. &quot;Inductive representation learning on large graphs.&quot; 31st Conference on Neural Information Processing Systems (NIPS 2017). 3378 citations.</p>
<p>해당 논문에서 제안한 모델인 PinSage에 대해 알아봅시다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/60d2efcc-5053-4e54-94e1-c69c83f60664/image.png" alt="text" width="number"/><span style = "color : gray">Chapter 19, CS224W</span>
</p>



<h2 id="overview">Overview</h2>
<p>PinSage는 실제 서비스 되고 있는 핀터레스트(Pinterest)에 적용된 추천알고리즘으로, 학습에 쓰인 데이터는 pin과 board로 구성된 3 bililon 노드와 18 bilion 엣지를 가지고 있습니다.</p>
<p>PinSage는 GCN 모델로, 그래프 데이터에 랜덤 워크(randowm walks)와 graph convolution을 적용한 방법론입니다. </p>
<p>추천시스템에 적용하기 위해서는 효율적인 연산이 중요하기 때문에, GCN 모델을 서빙하기 위한 여러가지 방법을 제안하였습니다.</p>
<h2 id="introduction">Introduction</h2>
<p>당시에 GCNs(Graph Convolutional Networks)은  추천시스템을 포함한 다양한 분야에 적용되면서 많은 발전이 되었습니다. GCN의 핵심은 이웃들(neighbohoods)로부터 특징 정보를 반복적으로 모으는(aggregate) 방법을 학습하는 것입니다. 이때, convolution이라고 불리는 연산을 사용하여 one-hop 이웃들의 정보를 변형하고(transform) 모으게(aggregate) 됩니다. 이 one-hop convolution layer를 여러 개 쌓음으로써 이웃의 정보를 계속적으로 변형하고 모으기 때문에, 멀리 떨어진 이웃들의 정보까지 닿을 수 있습니다. 기존의 content based RNN 모델과는 다르게, GCN은 contents 뿐만 아니라 그래프 구조까지 활용합니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/643d6a2a-54da-4ece-bdeb-9ff545704daa/image.png" alt=""></p>
<p>그러나, GCN-based 모델은 scailability가 떨어지기 때문에, 수십억 개의 노드와 엣지를 가지며 시간에 따라 변하는 추천 데이터에 적용하는 것이 매우 어렵습니다.</p>
<p>해당 논문에서는 높은  scailability를 가지고 있는 random walk기반 GCN 모델을 제안하였습니다.</p>
<p>PinSage를 요약하자면 다음과 같습니다.</p>
<p><strong>Scailability</strong></p>
<ul>
<li><p><strong>On-the-fly convolution</strong> (Transductive vs. Inductive)
기존 GCN은 full-graph에서 연산을 진행한 반면, PinSage는 target node를 선정한 뒤 이웃을 sampling하는 방식(computation graph를 생성)으로 진행합니다. 따라서 전체 그래프에 해당하는 연산을 필요로 하는 GCN의 단점을 완화시켰습니다.</p>
</li>
<li><p><strong>Producer-consumer minibatch construction</strong>
Producer와 consumer의 역할을 CPU와 GPU로 나누어 진행하였습니다. CPU를 computation graph 생성을 위한 sampling을 진행하고, GPU는 생성된 computation graph로 모델 학습을 진행합니다.</p>
</li>
<li><p><strong>Efficient MapReduce inference</strong>
MapReduce와 같은 파이프라인을 설계하여 반복적인 연산을 최소화하면서 빠르게 임베딩 벡터를 생성할 수 있습니다.</p>
</li>
</ul>
<p><strong>New techniques</strong></p>
<ul>
<li><p><strong>Constructing convolutions via random walks</strong>
효율적인 연산을 위해 computation graph를 미리 생성한다고 하였습니다. 이때, 무작위하기 이웃을 생성하는 것은 비효율적이기 때문에, short random walk를 사용합니다.</p>
</li>
<li><p><strong>Importance pooling</strong>
Random walk를 활용해 노드들끼리 유사성(similarity)을 구할 수 있습니다. 해당 논문에서는 이 유사성을 importance score로 정의하였으며, 이를 aggretation과 pooling 단계에 사용하여 가중(weighted)연산을 하였고, 46% 성능 증가를 가져왔습니다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/simba-pumba/post/46326703-12fb-4394-905a-b4b9d0899765/image.png" alt=""></p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/95757373-34ac-445f-82e6-bfd021f0f42c/image.png" alt="text" width="number"/><span style = "color : gray">Figure 1: Overview of our model architecture using depth-2 convolutions</span>
</p>

<ul>
<li><strong>Curriculum training</strong>
학습을 진행할 때마다 좀 더 어려운 예시를 모델에 보여줌(curriculum traning)으로써, 12%의 성능 증가를 가져왔습니다.</li>
</ul>
<h2 id="method">Method</h2>
<p>PinSage의 구조, 학습 방식, MapRudece pipleline에 대해 살펴보겠습니다.</p>
<ul>
<li>Node: item (pin and board)</li>
<li>Feature: visual, textual feature</li>
</ul>
<h3 id="problem-setup">Problem setup</h3>
<p>Pinterest의 contents인 pin은 유저의 주 관심사이며, board는 pin의 collections입니다. 해당 추천시스템은 이러한 pins를 잘 임베딩하고자 하는 것입니다. 임베딩을 위해 그래프를 정의해야 하는데, 여기서는 pin의 집합 $I$ 와 board의 집합 $C$을 이분 그래프(bipartite graph)로 생성하였습니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/99c20c36-d5a7-40fb-9217-6f22fa136987/image.png" alt="text" width="number"/><span style = "color : gray">Bipartite graph, Chapter 19, CS224W</span>
</p>

<p><strong>Notations</strong>
$I$: set of items
$C$: user-defined contexts
$u \in I$: pin/item
$x_u \in \mathbb{R}^d$: real-valued attributes (content information, i.e., text and image feature)</p>
<p><strong>Goal</strong>
bipartite graph와 node feature $x_u$를 활용하여 node embedding을 수행함.</p>
<h3 id="model-architecture">Model Architecture</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/d6b054ce-c044-4806-843c-449b7e778ce8/image.png" alt="text" width="number"/><span style = "color : gray">Localized convolution</span>
</p>

<p>Step 1: $z_v, \forall v \in \mathcal{N}(u)$를 linear layer로 변형함.
Step 2: aggregation/pooling $\gamma$ 적용하여 $n_u$ 벡터 생성함.
Step 3: 노드의 벡터 $z_u$와 aggregation된 이웃 벡터 $n_u$를 concatenate, linear layer로 변형함.
Step 4: nomalization</p>
<p><strong>Inportance-based neighborhoods</strong>(Importance pooling)
PinSage에서 핵심인 inportance score에 대해 살펴봅시다. 기존의 GCN과 다르게, PinSage는 타겟 노드에게 상대적으로 많은 영향을 주는 노드들을 선별하여 aggregate/pooling을 진행하였습니다.</p>
<p>Step 1: 타겟 노드 $u$에서 random walk를 시작함.
Step 2: random walk로 방문한 노드들의 방문 횟수를 계산함.
Step 3: 타겟 노드 $u$의 이웃들 중에서 이전 스텝에서 계산한 값 상위 T개를 선출함.</p>
<p>해당 밥법은 두 가지 관점에서 이점을 가져옵니다.</p>
<ul>
<li>메모리를 줄일 수 있다.</li>
<li>중요한 이웃들만 고려하여 노드를 업데이트 시킬 수 있다.</li>
</ul>
<p>또한 Step 2에서 계산한 값을 $L_1$ normarlization을 하여 aggregate/pooling의 weight으로 사용하였습니다.</p>
<p><strong>Stacking convolutions</strong>
<img src="https://images.velog.io/images/simba-pumba/post/4507a75c-8b1e-4b70-8505-13550cff5cb1/image.png" alt="">
하나의 Convolution layer 파라미터는 $Q, q, W, w$가 있으며, node들끼리 공유하게 됩니다. Algorithm2는 minibatch에 어떻게 convolution layers를 적용하는 지 보여줍니다.</p>
<p>Convolution이 끝난 후 생성된 target node의 representation은 linear layers를 한 번 더 거치게 되고, 최종 output embedding이 만들어지게 됩니다.</p>
<p>모델 파라미터 정리:
각 convolution layer의 weight과 bias: $Q, q, W, w$
마지막 linear layer: $G_1,G_2, g$  </p>
<h3 id="model-training">Model Training</h3>
<p>PinSage는 max-margin ranking loss를 학습에 사용하며, item pair인 $(q,i)\in \mathcal{L}$을 가깝도록 임베딩하게 됩니다. </p>
<p>수십억 개의 embedding을 학습하기 위해 어떻게 효율적으로 연산을 했는지 살펴보도록 하겠습니다.</p>
<p><strong>Loss function</strong>
Basic idea: postive pair의 내적을 최대로 만들고, negative pair의 내적값을 미리 정의한 margin $\Delta$만큼 거리를 유지하게 만들자.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/f763c2e4-3c15-4add-8c36-150bca7aedd4/image.png" alt="">, where $P_n(q)$은 negative sample의 분포입니다.</p>
<p><strong>Multi-GPU training with large minibatches</strong>
<strong>Producer-consumer minibatch constructions</strong></p>
<p><strong>Sampling negative items</strong>
PinSage는 학습의 효율을 개선하기 위해 500개의 negative sample을 minibatch마다 공유할 수 있도록 하였습니다.
해당 논문에서는 두 가지의 sampling 방법을 제안하였습니다.</p>
<ul>
<li>무작위 샘플링 (unifonly sample)
전체 아이템세트에서 무작위로 negative item을 뽑는 것으로, postive와 negative를 구분하기 매우 쉽다.</li>
<li>Hard negative sampling
&quot;hard&quot; negative item을 negative sample로 정하여 학습시키 방법으로, positive sample은 아니지만, 상대적으로 가까운 negative sample을 뽑는 방법이다. Personalized PageRank score(C. Eksombatchai, et al.(2018))를 활용하여 item의 score를 결정하게 되고, 2000-5000위 사이의 ranked item을 뽑게 된다. </li>
</ul>
<p>논문에서는 hard negative sample을 학습에 사용하면, 수렴을 위해 2배의 epoch이 요구된다고 하였습니다. 이를 해결하기 위해, 처음부터 har sample을 사용하는 것이 아닌, 학습을 진행할수록 hard negative sample을 하나씩 추가하는 curriculum training을 적용하였습니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/8ca9b08b-2c83-462d-9cd9-6ac1f9a692a8/image.png" alt="text" width="number"/><span style = "color : gray">Figure 2: Random negative examples and hard negative examples</span>
</p>

<h3 id="node-embeddings-vis-mapreduce">Node Embeddings vis MapReduce</h3>
<p>모델 학습이 끝난 후에, 학습 데이터의 모든 아이템과 그 외의 아이템을 임베딩하는 것은 계산적으로 매우 어려운 일입니다. 따라서 해당 논문에서는 MapReduce approach를 개발하였으며, 반복적인 계산을 줄여 효율적인 연산이 가능하도록 하였습니다. </p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/485b94cc-41b9-4062-b637-ca99e1013114/image.png" alt="text" width="number"/><span style = "color : gray">Figure 3: Node embedding data flow to compute the first layer representation using MapReduce</span>
</p>



<h2 id="experiments">Experiments</h2>
<p>평가를 위해 두 가지 태스크를 진행하였습니다.</p>
<ul>
<li><p>Recommending related pins
Related pin을 추천하기 위해 임베딩 공간에서 k nearest neighbor를 선택합니다.</p>
</li>
<li><p>Recommending pins in a user&#39;s home/news feed
Pin을 추천하기 위해, 유저가 가장 최근에 추가한 아이템과 임베딩 공간에서 가장 가까운 아이템을 추천합니다.</p>
</li>
</ul>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/60d2efcc-5053-4e54-94e1-c69c83f60664/image.png" alt="text" width="number"/><span style = "color : gray">Chapter 19, CS224W</span>
</p>


<p><strong>Feature used for learning</strong>
각각의 pin은 text(title)과 image 데이터와 관련되어 있습니다. 따라서 visual embedding(VGG-16, $d=4096$), textual embedding (Word2Vec, $d=256$)를 concatenate하여 node feature를 생성합니다.</p>
<p><strong>Baselines for comparison</strong></p>
<ul>
<li>Visual embedding: 이미지 임베딩 공간에서 nearest neighbor 사용</li>
<li>Annotation embedding: annotation 임베딩 공간에서 nearest neighbor 사용</li>
<li>Combined embedding: visual + annotation 벡터에 2-layer multi-layer 모델을 사용</li>
<li>Graph-based method: random-walk-based 방법을 사용하여 타겟 pin의 top K 이웃을 추천</li>
</ul>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/db455c7d-a542-49d7-b265-7c40f5fb16b5/image.png" alt="text" width="number"/><span style = "color : gray">Table 1: Hit-rate and MRR for PinSage and content-based deep learning baselines</span>
</p>

<h2 id="conclusion">Conclusion</h2>
<ul>
<li>해당 논문은 random-walk graph convolutional network를 활용한 PinSage라는 모델을 제안하였습니다.</li>
<li>PinSage는 기존의 GCN 모델이 가지고 있던 scailability의 한계를 극복하기 위해 inductive setting과 MapReduce와 같은 알고리즘을 활용하였습니다.</li>
<li>실제 성능과 효율성을 측정하기 위해 A/B test를 진행하였고, 좋은 결과를 보여주었습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SASRec: Self-Attentive Sequential Recommendation 리뷰]]></title>
            <link>https://velog.io/@simba-pumba/SASRec-Self-Attentive-Sequential-Recommendation-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@simba-pumba/SASRec-Self-Attentive-Sequential-Recommendation-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 04 May 2021 11:32:50 GMT</pubDate>
            <description><![CDATA[<p>작성자: 이예지
<img src="https://images.velog.io/images/simba-pumba/post/acb4ea26-4e89-46be-9236-a0be1613bde0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B32.JPG" alt=""></p>
<h2 id="overview">Overview</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/a13af886-2d2e-4b1e-83da-880142367bbd/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B33.JPG" alt=""></p>
<ul>
<li>해당 논문은 기존의 sequential recommender인 Markov Chains(MC)과 RNN 계열의 단점을 동시에 보완하고자 하였습니다.</li>
<li>이를 위해 당시 NLP task에서 sota인 Transformer 모델을 추천 시스템에 도입하였습니다.
(Sequential data 특성 상, NL model에 적용하는 것은 어렵지 않기 때문에 해당 논문에서도 모델에 큰 변형을 가하지는 않았습니다.)</li>
<li>제안된 모델은 기존의 추천시스템에서 좋은 성능을 보여주던 MC/CNN/RNN based model을 뛰어넘는 실험 결과를 보여주었습니다.</li>
</ul>
<p>이번 리뷰에서는 Transformer의 핵심만을 간단히 살펴보고, 기존 Transformer와의 차이를 위주로 진행하겠습니다.</p>
<h2 id="introduction">Introduction</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/915a61a8-c77d-4381-bbb9-7b53eacf625f/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B34.JPG" alt=""></p>
<ul>
<li>Sequential recommender system은 유저의 최근 행동의 context를 기반으로 한 추천을 목표로 하고 있습니다.</li>
<li>이런 sequential recommender model을 개발하기 힘든 점은 입력 공간의 크기가 매우 크다는  것입니다. 
Context로 사용되는 유저의 행동에 따라 지수적으로 입력 공간이 증가하게 됩니다.</li>
</ul>
<p><img src="https://images.velog.io/images/simba-pumba/post/eb8a40aa-4e9c-445a-b8f5-6c7655d9def4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B35.JPG" alt=""></p>
<p>기존의 sequential recommender를 간략하게 살펴봅시다.</p>
<ul>
<li><p>Markov Chains (MCs)
유저의 다음 행동이 바로 이전의 과거 혹은 몇 개 이전의 행동에 영향을 받을 것이라는 가정을 합니다.
이러한 가정은 너무 over-simplfy하고 매우 희소한(sparse) 데이터에만 잘 작동한다는 단점을 가지고 있습니다. 따라서, 복잡한 관계를 학습하는 것은 힘듭니다.</p>
</li>
<li><p>Recurrent Neural Networks (RNN)
RNN 기반의 모델, 대표적으로 GRU recommender 같은 경우는, 과거의 모든 행동을 모델의 입력값으로 넣어, 이를 요약한 정보를 가지고 다음 행동을 예측합니다.
상대적으로 복잡한 모델을 학습하기 위해 많은 양의 데이터를 요구하기 때문에, 희소한 데이터에서는 좋은 성능을 보여주기 힘들다고 합니다.</p>
</li>
</ul>
<p>저자는 이 둘의 단점을 보완하고자 새로운 모델을 추천 시스템에 적용하게 됩니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/43594d7a-cb35-4348-9d45-a1d41ffe5904/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B36.JPG" alt="text" width="number"/><span style = "color : gray">이미지: (left) Factorizing personalized Markov chains for next-basket recommendation / (center, right) BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer</span>
</p>


<p>기존의 딥러닝에서 빈번하게 사용되는 CNN, RNN 계열 모델과는 다르게 Transformer는 self-attention이라는 새로운 메커니즘을 사용합니다. Self-attention은 문장을 구성하는 단어들 간 의미적, 구조적 패턴을 기존의 모델들보다 더 잘 파악하는 결과를 보여주었고, 이에 따라 기계 번역과 같은 어려운 태스크에서 매우 좋은 성능을 보여주었습니다. 
저자는 self attention을 사용하는 Transformer로 MCs, RNN 모델의 한계를 극복하고자 하였습니다.</p>
<p>위의 이미지(page 6)에서 그림을 보시면 MCs, RNN, Transformer의 접근 방식의 차이를 확인할 수 있습니다. 앞서 설명했듯 MCs, RNN 계열 모델의 가정이 그림에서 드러나며, Transformer(Self-attention)와 어떤 차이가 있는지 확인할 수 있습니다. (Parallelization 관점에서도 생각해볼 필요가 있습니다.)</p>
<h2 id="transformer">Transformer</h2>
<p>2017년, Vaswari, et al. 의 &quot;Attention is all you need&quot;에서 발표된 Transformer에 대해 간략하게 살펴보겠습니다.
Transformer의 설명에 사용된 이미지는 Jay Alarmmar의 블로그에서 가져왔으며, <a href="http://jalammar.github.io/illustrated-transformer/">이곳</a>에 Transformer의 자세한 설명이 있으니 참고하시면 좋을 것 같습니다.</p>
<h3 id="overview-1">Overview</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/c1d11d8e-dbb1-4a13-bbca-ff8f4827fb6e/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B37.JPG" alt=""></p>
<ul>
<li>Transformer는 크게 encoder blocks(stacking)과 decoder blocks(stacking)으로 구성되어 있습니다.</li>
<li>Encoder block은 Multi-head attention, decoder block은 Masked Multi-head attention, encoder-decoder attention을 사용합니다. </li>
</ul>
<p>이 3가지 self-attention과 positional encoding을 간단하게 살펴보겠습니다! </p>
<h3 id="encoder-block-vs-decoder-block">Encoder block vs. Decoder block</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/58de6450-4309-4b95-b819-eaccb3d54713/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B38.JPG" alt=""></p>
<ul>
<li>Encoder, decoder block의 가장 큰 차이는 unmasked attention을 사용하였는지, masked attention을 사용하였는지 입니다.
위 그림의 입력 벡터를 보시면 좋을 것 같습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/simba-pumba/post/b3c88a6d-2f9d-4cf0-8e26-81c70bd40ae8/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B39.JPG" alt="">
(참고로, encoder, decoder block의 입력 벡터와 이를 통과한 벡터의 사이즈는 동일하게 유지됩니다. 그림에서도 사이즈가 4로 유지되는 것을 확인할 수 있습니다. 이러한 사이즈를 유지하기 위해, multi-head attention의 파라미터 사이즈 설정에 주의해야 합니다.)</p>
<h3 id="encoder-block">Encoder block</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/ee586b73-4824-40e4-991f-0507014b3394/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B310.JPG" alt=""></p>
<ul>
<li>Encoder block은 크게 두 개의 레이어(Multi-headed attention, Feed Forward Neural Network)로 구성됩니다.</li>
<li>MH attention과 FFNN에서 중요하게 살펴볼 차이점은 input들의 dependency의 유무입니다.
(이 부분을 잘 기억해주세요.)</li>
</ul>
<h4 id="multi-headed-attention">Multi-headed attention</h4>
<p> &quot;The animal didn&#39;t cross the street because it was too tired.&quot;</p>
<ul>
<li>이 문장에서 it의 가리키는 혹은 내포하는 의미가 무엇일까요? 아마 &#39;because&#39;, &#39;was&#39;처럼 바로 주변 단어들은 아닐 것입니다. 여기서 중요한 것은 &#39;it&#39;이 의미하는 단어는 충분히 멀리 떨어져있을 수 있으며, 가리키는 혹은 내포한다라는 의미는 가장 유사한 단어(연관성이 높은)를 찾는 문제일 수 있습니다. 이를 모델에 반영하고자 self-attention이 등장합니다. </li>
<li>Self-attention을 계산하는 것은 복잡하지 않습니다. Step1, step2 그림을 참고하시면 됩니다. 여기서 중요한 것은 Q,K,V 각각의 의미를 이해하는 것입니다. (Q,K,V는 마치 파이썬의 dictionary 객체와 같은 역할을 하고 있는데, Q: 내가 찾고하는 key value, K: dict에 저장된 keys, V: 각 key에 해당하는 value 라고 이해할 수 있습니다. 내가 어떤 key의 값을 찾기 위해, dict에서 key를 기준으로 찾아, 값을 가져오는 느낌입니다.)</li>
<li>만약 사람들에게 문장 안에서 &#39;it&#39;이 가리키는 단어를 고르라고 한다면, 모두가 같은 답변을 하지 않을 수 있습니다. 특히 더 복잡한 문장에서는 더더욱 그럴 것입니다. 이를 모델에 반영하고자 multi-headed attention을 사용합니다. (여기서 &quot;multi-headed&quot;는 서로 다른 사람의 시선을 앙상블하는 느낌으로 볼 수 있을 것 같습니다.)</li>
</ul>
<p><img src="https://images.velog.io/images/simba-pumba/post/158fef65-1c6e-45fa-9ce0-ecaa58032b38/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B311.JPG" alt="">
Multi-headed attention 연산도 그림처럼 간단합니다. 여기서 주목할 만한 것은 출력 벡터의 사이즈입니다. 
(위에서 잠깐 언급했듯이, 사이즈를 유지하기 위해 head의 개수 등을 고려해줘야 합니다.)</p>
<h4 id="feed-forward-neural-network">Feed Forward Neural Network</h4>
<p><img src="https://images.velog.io/images/simba-pumba/post/3a7e3789-af37-47cd-bb28-25be6ef4d3f2/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B312.JPG" alt=""></p>
<p>(위에서 말했듯이 MH attention과 FFNN에서 중요하게 살펴볼 차이점은 input들의 dependency의 유무입니다.) 
같이 논의해봅시다 :)</p>
<h3 id="decoder-block">Decoder block</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/bfc62865-6cce-48bc-afff-328cb37c99a0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B313.JPG" alt=""></p>
<ul>
<li>Decoder block은 살펴볼 두 가지는 masked multi-head attention과 encoder-decoder attention 입니다. </li>
</ul>
<h4 id="masked-multi-headed-attention">Masked Multi-headed attention</h4>
<ul>
<li>Decoder 부분부터는 실제 태스크를 풀기 위한 역할을 수행하기 위해서 masking을 해줍니다. </li>
<li>예를 들어, &quot;아버지/가/방/에/들어가다&quot;라는 문장이 있고, 순차적으로 다음에 올 단어 예측을 위해 &quot;아버지/&quot;, &quot;아버지/가&quot;, &quot;아버지/가/방&quot;, ... 이런식으로 모델에 입력을 해줘야합니다. </li>
<li>Transformer에서는 masking을 위해 매우 간단하게 -inf라는 값을 주었는데, 이는 sigmoid 혹은 softmax를 만났을 때 0의 값을 가지기 때문입니다.</li>
</ul>
<h4 id="encoder-decoder-attention">Encoder decoder attention</h4>
<ul>
<li>해당 attention이 multi-head attention과 다른 점은 K,V를 encoder block에서 가져오는 것입니다.</li>
<li>즉 내가 찾고 싶어하는 Query는 decoder에서 생성하고 dictionary는 encoder에서 생성된 것을 쓰는 것입니다.</li>
</ul>
<h3 id="positional-encoding">Positional encoding</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/e3ba037c-a98b-4557-bc52-6a1c75089131/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B314.JPG" alt=""></p>
<ul>
<li>Self-attention을 살펴보았을 때, 내가 알고싶은 Q값과 유사한 쌍을 찾기 위해 모든 key-value를 살펴본 것을 확인할 수 있습니다. 즉, 나랑 얼마나 떨어져있는지에 대한 위치 좌표는 무시됩니다. 하지만 문장에서는 locality가 어느 정도 중요할 수 있고, 이를 입력 벡터에 어느 정도 반영하고자 positional encoding을 해주게 됩니다. </li>
<li>모델의 입력 시퀀스를 그대로 넣어주고 self-attention을 진행하는 것 대신, 간단하게 입력 시퀀스에 positional 값을 더해주면 됩니다.</li>
</ul>
<h3 id="summary">Summary</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/64fd0e89-e392-4f49-adeb-234659e09d2b/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B315.JPG" alt=""></p>
<p><a href="http://jalammar.github.io/illustrated-transformer/">Transformer GIF</a> </p>
<h2 id="methodology">Methodology</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/2bd1890b-90f0-4bb2-bc8b-95c10d1d640d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B316.JPG" alt="">
SASRec이 Transformer를 어떻게 추천 시스템에 적용하였는지 살펴보겠습니다. 
__Transformer와 일치하는 부분은 생략하였습니다. __</p>
<h3 id="a-embedding-layer">A. Embedding Layer</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/2ddebad4-f2f9-4e45-8473-b71b9cc91ab3/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B317.JPG" alt=""></p>
<ul>
<li>학습을 위해 action set의 사이즈는 $n$으로 고정하였습니다.</li>
<li>따라서 전체 아이템 임베딩 행렬의 사이즈는 $|I|\times d$, 입력 임베딩 행렬의 크기는 $n\times d$ 입니다.</li>
<li>앞서 언급한 positional encoding은 입력 벡터에 더해주는 형태이기 때문에 사이즈는 입력 임베딩 행렬과 동일합니다.</li>
<li>기존 Transformer와 차이가 있다면, 여기서는 Positional encoding을 고정된 값이 아닌, 학습 파라미터로 설정했다는 점입니다. 
(고정 positional encoding은 성능이 안 좋았다고 합니다.)</li>
</ul>
<h3 id="b-self-attention-blockc-stacking-self-attention-blockd-prediction-layer">B. Self-Attention Block/C. Stacking Self-Attention Block/D. Prediction Layer</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/27d1148b-4f83-4f39-a0e0-b7a06b7f1ae4/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B318.JPG" alt=""></p>
<p><strong>B.Self-Attention Block</strong></p>
<ul>
<li>Encoder, Decoder block을 따로 구분하는 것 대신, 새로운 self-attention block을 제안함.</li>
<li>실험을 위해 2개의 self-attention block을 쌓았음.</li>
<li>Causality) 실제 추천 알고리즘이 작동할 때는 미래의 유저 행동을 볼 수 없기 때문에, 저자는 미래의 유저 행동을 사용하는 것은 모순적이라고 생각하였습니다. 따라서, self-attention block에서 현재 이후 시점에 대해서는 masking을 진행했습니다.</li>
<li>즉, $Q_i$ and $K_j$, where $j&gt;i$에 해당하는 연산을 masking 했습니다.</li>
</ul>
<p><strong>D.Prediction Layer</strong></p>
<ul>
<li>다음에 올 유저 행동을 예측하기 위해 적절한 item의 score를 최종적으로 예측하게 됩니다. </li>
<li>따라서 block의 출력 값 $F$에 사이즈가 $|I|\times d$ 인 $N$과 연산해줍니다.
(임베딩 사이즈가 모두 $d$, 입력 임베딩 벡터 사이즈와 동일) </li>
<li><strong>Shared Item Embedding)</strong> 이때, 저자들은 $N$을 새로운 학습 파라미터 임베딩 값 대신, 모델 입력값으로 사용되었던 $M$을 재활용하게 됩니다. 
(학습할 파라미터가 줄어, overfitting을 방지했다고 함 -&gt; 실제 실험 결과가 개선됨.)</li>
</ul>
<h3 id="e-network-training">E. Network Training</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/0fa6d6f9-067b-462f-852d-0e8fa702d7c8/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B319.JPG" alt=""></p>
<h3 id="f-complexity-anlysis">F. Complexity Anlysis</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/df38e989-2b66-40e7-9b51-7eb42f71fa25/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B320.JPG" alt=""></p>
<p><strong>공간복잡도</strong></p>
<ul>
<li>논문에서는 SASRec과 FPMC 모델을 비교하였습니다.
(다른 기존의 모델들의 공간복잡도가 FPMC와 비슷하다고 합니다.)</li>
<li>여기서 SASRec은 $|U|$ 텀이 없는데, 실제로는 $|U|$이 매우 크기 때문에  SASRec이 비교적 효율적임을 알 수 있습니다.</li>
<li>$d$는 임베딩 사이즈로 $d&lt;&lt;|U|$ and $$d&lt;&lt;|I|$$이기 때문에 $d^2$ 무시함.
($|I|d$ : Item embedding matrix, $nd$: Positional encoding params)</li>
</ul>
<p><strong>시간복잡도</strong></p>
<ul>
<li>SASRec: Self-attention layer와 FFNN layer의 시간복잡도는 $n^2d+nd^2$</li>
<li>RNN-based: $n$</li>
<li>따라서, SASRec이 비교적 효율적이지 않을 수 있지만, 실제로 Transformer의 self attention과 ff layer는 병렬적으로 연산이 가능합니다. (발표자료 6페이지 그림을 살펴봅시다.)</li>
<li>반면, RNN-based는 순차적으로 진행할 수 밖에 없습니다.
(<a href="http://jalammar.github.io/illustrated-transformer/">참고자료</a>)</li>
</ul>
<h2 id="experiment">Experiment</h2>
<h3 id="datasetsevaluation-metrics">Datasets/Evaluation Metrics</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/9e0687b2-d8b2-4823-9236-7a04fd63ef9d/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B321.JPG" alt=""></p>
<ul>
<li>실험 데이터셋은 총 4개이며 각각의 통계량은 발표자료를 참고해주세요.</li>
<li>평가 메트릭은 지금까지 다룬 페이퍼들과 같습니다.</li>
<li>저자들은 4가지의 질문을 던지며, 이에 대한 답을 실험결과로 보여주었습니다.</li>
</ul>
<h3 id="rq1">RQ1</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/67e7db70-cf94-4a16-9501-e358fb5f8bc0/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B322.JPG" alt=""></p>
<h3 id="rq2">RQ2</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/f0af9eed-09e8-4c32-965f-f87e0eaf247c/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B323.JPG" alt=""></p>
<h3 id="rq3rq4">RQ3/RQ4</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/e907bb9f-4f7d-4141-a09b-20ac91d89760/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B324.JPG" alt=""></p>
<h2 id="summary-1">Summary</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/6d017fc6-831d-486e-bfd4-76444c602261/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B325.JPG" alt=""></p>
<p><img src="https://images.velog.io/images/simba-pumba/post/0d303921-4ad4-4507-9e01-aa93a23ca5e2/%E1%84%89%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A1%E1%84%8B%E1%85%B5%E1%84%83%E1%85%B326.JPG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Introduction to Causal Inference: Lecture 4 Backdoor Adjustment &
Structural Causal Models]]></title>
            <link>https://velog.io/@simba-pumba/Introduction-to-Causal-Inference-Lecture-3-Backdoor-Adjustment-Structural-Causal-Models</link>
            <guid>https://velog.io/@simba-pumba/Introduction-to-Causal-Inference-Lecture-3-Backdoor-Adjustment-Structural-Causal-Models</guid>
            <pubDate>Thu, 24 Dec 2020 06:34:59 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Brady Neal의 <em>introduction to causal inference</em> 리뷰입니다.
youtube: <a href="https://www.youtube.com/watch?v=dB8r4Afmobo&amp;list=PLoazKTcS0Rzb6bb9L508cyJ1z-U9iWkA0&amp;index=27">https://www.youtube.com/watch?v=dB8r4Afmobo&amp;list=PLoazKTcS0Rzb6bb9L508cyJ1z-U9iWkA0&amp;index=27</a>
material: <a href="https://www.bradyneal.com/causal-inference-course">https://www.bradyneal.com/causal-inference-course</a>
My article will be uploaded to <a href="https://www.notion.so/GNN_YYK-0303f11d4fa0433792562333dea173a3">https://www.notion.so/GNN_YYK-0303f11d4fa0433792562333dea173a3</a>.</p>
</blockquote>
<p><img src="https://images.velog.io/images/simba-pumba/post/608aabd9-00e8-4290-8067-afdc19c57d5f/image.png" alt=""></p>
<p>Identification: the process of moving from a causal estimand to a statistical estimand (Lectrue 2 참고)</p>
<p>Identification을 위해서는 causal model이 필요합니다.</p>
<p>지난 3강에서 causal models을 위한 graphical models에 대해 공부했습니다. 이번 강의에서는 how to identify causal quantities와 how to formalize causal models을 다룹니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/8ed045f9-f8ee-48c8-b88a-a2ebf68975c7/image.png" alt="text" width="number"/>
  <span style = "color : gray">Sub-project on causal inference (Yong-min shin, GNN-YYK, Lecture 2)</span>
</p>

<h2 id="the-do-operator">The <em>do</em>-operator</h2>
<p>강의에서 두 가지 텀, conditioning과 intervening이 등장합니다.</p>
<ul>
<li>Conditioning $$T=t$$
모집단에서 treatment $$t$$를 시행한 부분집합으로 범위를 제한하는 것과 같음.</li>
<li>intervention
모집단을 취하고 모두에게 treatment $$t$$를 시행한 것</li>
</ul>
<p>이를 도식화 하면 다음과 같습니다.
<img src="https://images.velog.io/images/simba-pumba/post/93f9b5c8-515c-451d-84ec-62826a74dffe/image.png" alt=""></p>
<p>Interventional distribution $$P(Y|do(T=t))$$는 obsevational distribution $$P(Y)$$와 다릅니다. 
$$P(Y)$$ 혹은 $$P(Y,T,X)$$와 같은 obsevational distribution은 <em>do</em> operator를 갖지 않기 때문에, 어떤 실험을 수행하지 않고도 데이터를 관찰할 수 있습니다. 따라서 $$P(Y,T,X)$$에서 데이터를 obsevational data라고 부릅니다.</p>
<p>위에서 identification 정의를 이해하셨다면, <em>do</em> operator를 가진 표현 $$Q$$에서 <em>do</em> 를 제거할 수 있다면 $$Q$$는 <em>identifiable</em> 되었다!는 것을 이해할 수 있을 것입니다.</p>
<p>그렇다면, <em>do</em> operator는 무엇을 의미할까요? 일반적으로 <em>do</em> 는 확률 $P$에서 conditioning bar 뒤에 나타납니다. 이때는 intervention <em>do($$t$$)</em> 가 발생한 다음을 의미하는 것으로, 즉 <em>post-intervention</em> 을 의미합니다.</p>
<p>예를 들어, $$E[Y|do(t), Z=z]$$에서 $$Z=z$$인 subpopulation에서<strong>(conditioning)</strong>, 모두에게 treatment $$t$$를 시행한 후<strong>(intervening)</strong>의 기대되는 값을 의미합니다. 
그렇다면 $$E[Y|Z=z]$$는? 단순히 개인이 일반적으로 treatment $$T$$를 받은 (pre-intervention) 집단에서 기대되는 값을 의미합니다.</p>
<h2 id="main-assumption-modularity">Main assumption: modularity</h2>
<p>Modularity를 이해하기 위해서는 <em>causal mechanism</em> 에 대해 이해해야 합니다. Causal mechnism을 아주 간단히 표현한다면, conditional distribution $$P(x_i | pa_i)$$ 입니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/559adbe0-fb57-49fe-b3ab-67d939f93f87/image.png" alt=""></p>
<p>Causal identification 결과를 얻기 위해서 중요한 가정은 &quot;interventions are local&quot; 입니다. 좀 더 자세하게 말하자면, 변수 $$X_i$$에 intervening하면, 오직 $$X_i$$의 causal mechanism만 변하게 됩니다. 즉 다른 변수들을 만드는 causal mechanisms은 변하지 않게 됩니다. 이런 의미로 causal mechnisms은 modular입니다.</p>
<p>일반적으로 modular property를 independent mechnisms, autonomy 혹은 invariance라고도 부릅니다. </p>
<blockquote>
<p><strong>Assumption 4.1</strong> (Modularity  Independent Mechnisms) If we intervene on a set of nodes $$S \subseteq [n]$$, setting them to constants, then for all $$i$$, we have the following:</p>
</blockquote>
<ol>
<li>if $$i \notin S$$, then $$P(x_i|pa_i)$$ remains unchanged.</li>
<li>if $$i \in S$$, then $$P(x_i|pa_i)=1 ; if x_i$$ is the value that $$X_i$$ was set to by the intervention; otherwise, $$P(x_i|pa_i)=0$$.</li>
</ol>
<p>Modularity assumption은 하나의 그래프에서 서로 다른 interventional distribution을 만들 수 있게 해줍니다. 예를 들어 $$P(Y), P(Y|do(T=t)), P(Y|do(T=t&#39;)), P(Y|do(T_2=t_2))$$는 서로 연관되지 않은 완전히 다른 분포입니다. 즉 intervention을 통해 각 분포가 자기 자신만의 그래프를 만든 것입니다. </p>
<p>interventional distributions의 causal graph는 obsevational joint distribution(original graph)에서 사용된 것과 같지만, intervened node(s)의 엣지가 제거된 형태입니다. 이는 intervened factor의 확률이 1이기 때문에, 관련 factor들을 무시한다고 보면 됩니다. 또 다른 관점으로는 intervened node가 constant로 설정되었기 때문에 더이상 다른 변수에 의존하지 않는다라고 볼 수 있습니다. </p>
<p>엣지가 제거된 그래프를 <em>manipulated graph</em> 라고 합니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/83f4256b-b335-4dbf-b8af-c6a197649dbc/image.png" alt=""></p>
<p>Modularity assumption이 위반된다라는 것은 어떤 것을 의미할까요?</p>
<p>$$X_i$$를 intervene 했을 때, 이것이 다른 노드 $$X_j$$를 변하게 하는 경우입니다. 즉 intervention on $$X_i$$가 $$P(x_j|pa_j)$$를 변화시키는 것입니다. (intervention is not local to the node you intervene on; the causal mechnisms are not modular)</p>
<h2 id="backdoor-adjustment">Backdoor adjustment</h2>
<p>Backdoor path란 노드 $T$에서 노드 $Y$까지 nondirected unblocked path(즉 $T$로 가는 <em>backdoor</em> edge가 존재함)를 의미합니다. 그리고 conditioning을 통해 이것을 block할 수 있다면 causal quntity를 구할 수 있을 것입니다.</p>
<p>만약 $T$에 intervene을 해준 manipulated graph가 있다면 해당 그래프에는 T의 backdoor edge가 존재하지 않을 것이고, 이는 $T$에서 $Y$까지 흐르는 모든 association은 purely causal일 것입니다.</p>
<blockquote>
<p><strong>Definition 4.1</strong> (Backdoor Criterion) A set of variables $W$ satisfies the backddor criterion relative to $T$ and $Y$ if the following are true:</p>
</blockquote>
<ol>
<li>$W$ blocks all backdoor paths from $T$ to $Y$.</li>
<li>$W$ does not contain any descendants of $T$.</li>
</ol>
<p>Backdoor criterion을 만족한다는 것은 $W$를 sufficient adjustment set으로 만드는 것입니다. $W$는 앞의 예제에서 등장했던 $X$라고 생각하면 됩니다. 이 예에서는 오직 하나의 path만 존재했기 때문에 단순히 $X$만으로도 충분히 block할 수 있었습니다. </p>
<p>proof에 $W$를 도입하기 위해 변수를 conditioning해주고 marginalizing을 해주게 됩니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/da4685c4-5585-4d23-9ea8-94da6b6dfd2a/image.png" alt=""></p>
<p>주어진 $W$가 Backdoor criterion을 만족한다면, modularity 가정을 통해 아래가 가능합니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/c942887e-215c-4781-a841-4d9a21128faf/image.png" alt=""></p>
<p>위의 식을 보면, 여전히 식에 <em>do</em> 가 존재합니다. 그러나 여기서 $$P(w|do(t))=P(w)$$가 됩니다. Manipulated graph에서 $T$로 들어오는 엣지가 없기 때문에 어떠한 $W$와 $T$사이의 path도 존재하지 않습니다.
따라서 위의 식은 아래와 같이 정리됩니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/a29fa4e5-cc3f-49fa-8df1-d561b1666e10/image.png" alt="">
이것이 <em>backdoor adjustment</em> 입니다.</p>
<blockquote>
<p>Theorem 4.2 (Backdoor Adjustment) Given the modulrarity assumption, that $W$ satifies the backdoor criterion, and positivity(Assumption 2.3), we can idenify the causal effect of $T$ on $Y$:
$P(y|do(t))=\sum_w P(y|t,w)P(w)$</p>
</blockquote>
<p><strong>Relation to d-separation</strong> $W$가 manipulated graph $T$와 $Y$를 d-separated 하는 경우 backdoor adjustment를 쓸 수 있습니다. 또한 $W$를 conditioning 함으로써 pure causal association 할 수 있습니다.</p>
<p><strong>Q) How does this backdoor adjustment relate to the adjustment formula we saw in the potential outcomes lecture?</strong> </p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/f66c1d9e-d639-4289-ab95-1db3b975cfad/image.png" alt="text" width="number"/>
  <span style = "color : gray">Adjustment formula</span>
</p>

<p>위는 아래의 backdoor adjusment로 유도됩니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/ee0d97c5-98c8-4533-912c-dd30b2f8452d/image.png" alt="">
<img src="https://images.velog.io/images/simba-pumba/post/11104b63-6481-4ec0-8c2a-4c27e7795bb8/image.png" alt="">
($w$가 discrete이 아닌 경우, integral)
<img src="https://images.velog.io/images/simba-pumba/post/6cdf2cd7-0a7b-4482-b3f6-44e1dfa9772e/image.png" alt=""></p>
<p>$$\because(Y(1), Y(0)) \perp !!! \perp T | W$$</p>
<h2 id="structural-causal-models">Structural causal models</h2>
<h4 id="structural-equations">Structural Equations</h4>
<p>수학에서 쓰는 equals sign(=)과는 다르게, causation에서는 symmetric 성질이 성립하지 않습니다. 즉 A가 B의 cause라고 한다면 A의 변화는 B의 변화를 초래하지만, B의 변화가 A의 변화를 초래하지는 않습니다.
<em>structural equation</em> $B:=f(A)$ 
(=가 아닌 :=를 쓴 것을 유의!)</p>
<p>그러나, 여기서 $A$와 $B$의 mapping이 deterministic하기 때문에, 이를 probabilistic으로 만들기 위한 B의 unknown causes에 대한 여지를 남기게 됩니다.
$B:=f(A,U)$ 
<img src="https://images.velog.io/images/simba-pumba/post/d2d15a80-d673-49b1-ba3b-2983bbae9e32/image.png" alt=""></p>
<p><em>endogenous</em> variables: 우리가 모델링을 하려는 structural equation의 variable. 즉 causal graph에서 부모 노드를 갖고 있음.
<em>exogenous</em> variables: causal graph에서 부모 노드가 없는 변수. 즉 이 노드의 causes를 모델링할 필요가 없음.</p>
<blockquote>
<p><strong>Definition 4.2</strong> (Structural Causal Model (SCM)) A structural causal model is a tuple of the following sets:</p>
</blockquote>
<ol>
<li>A set of endogenous variables V</li>
<li>A set of expgenous variables U</li>
<li>A set of functions f, one to generate each endogenous variable as a function of other variables</li>
</ol>
<h4 id="markovian-vs-semi-markovian-vs-non-markovian">Markovian vs. semi-Markovian vs. non-Markovian</h4>
<p>Markovian: causal graph에 사이클이 없고(DAG), noise variables $U$가 독립인 경우
semi-Markovian: causal graph에 사이클이 없고(DAG), noise variables $U$가 독립이 아닌 경우
non-Markovian: 사이클이 있는 경우</p>
<h4 id="interventions">Interventions</h4>
<p>SCM에서는 intervention이 매우 간단합니다. $T$를 $T:=t$로 대체해주면 됩니다.
<img src="https://images.velog.io/images/simba-pumba/post/657df10e-08bb-40be-8af4-285a51406759/image.png" alt="">
(여기서 $M$은 a single model의 모든 structural equation의 collection)
<img src="https://images.velog.io/images/simba-pumba/post/ab5dacd8-5900-4ed3-bca4-17a7a1e02971/image.png" alt="">
($M_t$임을 유의)</p>
<blockquote>
<p><strong>Definition 4.3</strong> (The Law of Counterfactuals (and Interventions))
$Y_t(u)=Y_{M_t}(u)$</p>
</blockquote>
<p>이는 SCM이 디테일하게 주어진다면 couterfactuals을 모두 계산할 수 있다는 것을 의미합니다. 그러나 이것은 불가능하기 때문에 큰 문제가 됩니다. 이 문제를 해결하기 위한 conterfactuals은 14장에서 다루고 있습니다.</p>
<h2 id="a-complete-example-with-estimation">A complete example with estimation</h2>
<p>association quantity($E[Y|t]$)와 causal quantity($E[Y|do(t)]$)의 비교를 통해 association quantity의 bias를 알아보기 위해 toy example을 살펴봅시다. </p>
<p>$$T:=\alpha_1 X$$
$$Y:=\beta T + \alpha_2 X$$
<img src="https://images.velog.io/images/simba-pumba/post/f49f6d7f-2b32-422b-857a-262c0a4b4d99/image.png" alt=""></p>
<h4 id="causal-quantityey-dot">causal quantity($E[Y |do(t)]$)</h4>
<p>그림에서 볼 수 있듯이, $X$가 sufficient adjustment set이므로, $$E[Y|do(t)]=E_xE[U|t,X]$$ 입니다.</p>
<p>따라서,
$$E_xE[U|t,X]=E_x[E[\beta T+\alpha_2 X | T=t, X]]=E_x[\beta t + \alpha_2 X]=\beta t + \alpha_2 E[X]$$</p>
<p>causal effect를 얻기 위해 미분을 해주면, 
<img src="https://images.velog.io/images/simba-pumba/post/1e56b53c-5439-4ca4-844f-a20dcbfc6b44/image.png" alt=""></p>
<h4 id="association-quantity-eyt">association quantity ($E[Y|t]$)</h4>
<p>$$E[Y|T=t]=E[\beta T + \alpha_2 X|T=t]= \beta t +\alpha_2 E[X|T=t]=\beta T + {\alpha_2 \over \alpha_1}t$$
<img src="https://images.velog.io/images/simba-pumba/post/f23059c8-e80a-410b-9b74-40c3769fc85c/image.png" alt="">
위 그림과 같이, confounding bias가 존재합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Introduction to Causal Inference: Lecture 3 Graphical Models]]></title>
            <link>https://velog.io/@simba-pumba/Introduction-to-Causal-Inference-Lecture-3</link>
            <guid>https://velog.io/@simba-pumba/Introduction-to-Causal-Inference-Lecture-3</guid>
            <pubDate>Tue, 24 Nov 2020 17:37:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Brady Neal의 <em>introduction to causal inference</em> 리뷰입니다.
youtube: <a href="https://www.youtube.com/watch?v=Go4EkHN_PcA&amp;list=PLoazKTcS0Rzb6bb9L508cyJ1z-U9iWkA0&amp;index=19">https://www.youtube.com/watch?v=Go4EkHN_PcA&amp;list=PLoazKTcS0Rzb6bb9L508cyJ1z-U9iWkA0&amp;index=19</a>
material: <a href="https://www.bradyneal.com/causal-inference-course">https://www.bradyneal.com/causal-inference-course</a>
My article will be uploaded to <a href="https://www.notion.so/GNN_YYK-0303f11d4fa0433792562333dea173a3">https://www.notion.so/GNN_YYK-0303f11d4fa0433792562333dea173a3</a>.</p>
</blockquote>
<h2 id="31-graph-terminology">3.1 Graph Terminology</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/2cc92002-9952-446a-b00f-8fade203febc/image.png" alt=""></p>
<p>그래프라는 단어를 들었을 때, 흔히 scatter plot이나 bar plot과 같은 시각적인 그림을 떠올리는 경우가 많습니다. 그러나 앞으로 강의에서 말하는 그래프는 node와 edge들의 set을 의미합니다.</p>
<p>그래프에서 사용되는 몇 가지 용어들을 짧게 살펴봅시다. (path와 cycle은 생략함.)
방향성이 없는 edge로 이루어진 그래프를 undirected graph, 방향성이 있는 edge로 이루어진 그래프를 directed graph라고 합니다. 이 때 cycle이 없는 directed graph를 directed acyclic graph라고 하는데, 줄여서 DAG(강의에서는 대-그라고 읽음.)라고 표현합니다.</p>
<p>앞으로 설명할 bayesian networks에서 그래프(혹은 네트워크)는 DAG를 기본으로 합니다.</p>
<hr>
<h2 id="32-bayesian-networks">3.2 Bayesian Networks</h2>
<p><img src="https://images.velog.io/images/simba-pumba/post/b53332c5-0585-452d-af4a-b031d2b9095f/image.png" alt=""></p>
<p>Causal graphical models은 probabilistic graphical models(pgm) 분야 중 하나입니다. Bayesian network는 pgm 중에 하나로, causal graphical models(causal bayesian network)의 특성을 가지고 있습니다. Bayesian network가 무엇이고, 어떻게 쓰이는지에 대해 알아보겠습니다.</p>
<p>우리는 일반적으로 data의 분포 $P(x_1, x_2, ..., x_n)$을 알고자 합니다. 일반적으로 chain rule을 적용하여 표현하면 다음과 같습니다.</p>
<p>$P(x_1, x_2, ..., x_n)=P(x_1) \prod_i P(x_i|x_i-1, ..., x_1)$</p>
<p>그러나, parameter가 증가할수록 계산해야 하는 양이 exponential하게 증가하기 때문에, 모든 경우를 구하는 것은 intractable할 수 있습니다. 위 그림의 예시에서 $x_i$가 binary case라고 했을 경우, $p(x=1)=1-p(x=0)$ 구할 수 있기 때문에 $2^{n-1}$의 계산이 요구 됩니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/68623681-7c10-477f-8ee0-d4c71de3495a/image.png" alt=""></p>
<p>joint distribution을 좀 더 효율적으로 구하는 방법 중 한가지는 <strong>가정</strong>을 하는 것입니다. 여기서 <strong>Local Markov Assumption</strong>이 등장하게 됩니다.</p>
<blockquote>
<p><strong>Assumption 3.1</strong> (Local Markov Assumption) Given its parents in the DAG, a node $X$ is independent of all its non-descendants.</p>
</blockquote>
<p><strong>Local Markov Assumption</strong>은 DAG에서 parents가 주어지면 모든 non-descendants와 독립을 가정하는 것입니다.
즉, 위의 이미지에서와 같이 $P(x_4|x_3,x_2,x_1)$가 $P(x_4|x_3)$로 대체될 수 있습니다.</p>
<p>즉 DAG에서 Local Markov Assumption을 통해 bayesian network가 등장하게 됩니다. 이때 각각의 그래프 G에 각각의 node들은 P에 각각의 random variable이 one-to-one mapping 되는 것입니다. </p>
<p>Bayesian network에 등장하는 <strong>Bayesian Network Factorization</strong>를 살펴봅시다.</p>
<blockquote>
<p><strong>Definition 3.1</strong> (Bayesian Network Factorization) Given aprobability distribution $P$ and a DAG $G$, P fatorizes according to $G$ if
$P(x_1,...,x_n)=\prod_i P(x_i|\mathsf{pa}_i)$</p>
</blockquote>
<p><strong>Bayesian Network Factorization</strong>은 <em>bayesian network의 chain rule</em> 혹은 <em>Markov compatibility</em>로도 불립니다. 
만약 $P$가 위 그림의 graph에 대하여 Markor라면, <strong>Bayesian Network Factorization</strong>를 사용하여 $P$의 joint distribution이 아래와 같이 표현됩니다.</p>
<p>$P(x_1, x_2, ..., x_n)=P(x_1)P(x_2)P(x_3|x_2, x_1)P(x_4|x_3)$ </p>
<p>(<em>$P$ is Markov with respect to the graph in Figure</em> 라고 표현합니다.)
만약 그림에서 그래프가 더 sparse하다면, joint distribution이 더욱 simple해질 것입니다.</p>
<p>우리는 <strong>Bayesian Network Factorization</strong>가 결국 <strong>Local Markov Assumption</strong>와 equivalent임을 알 수 있습니다.
자세한 증명은 Koller and Friedman(2009)에서 확인할 수 있습니다. 저는 넘어가도록 하겠습니다 : )</p>
<p>Bayesian network에서 causal network로 가기 위해 매우 중요한 assumption에 대해 살펴보겠습니다.</p>
<p>조금 혼란스러울수도 있지만, <strong>Local Markov Assumption</strong>에서는 만약 노드 $X$와 $Y$가 인접(adjacent)했을 때, $X$와 $Y$가 dependent한 것을 의미하지 않습니다. 반면 causal inference에서는 $X\rightarrow Y$의 경우 인과관계가 있다고 하죠. 따라서 Bayesian network에서 추가적인 assumption이 필요한 것을 알 수 있습니다.</p>
<p>인접한 노드 사이의 dependence를 보장하기 위해, local Markov assumption보다 더 강력한 assumption이 필요합니다.</p>
<blockquote>
<p><strong>Assumption 3.2</strong> (Minimality Assumption) </p>
</blockquote>
<ol>
<li>Given its parents in the DAG, a node $X$ is independent of all its non-descendants (<em>Assumption 3.1</em>)</li>
<li>Adjacent nodes in the DAG are dependent.</li>
</ol>
<p>예를 들어, $X\rightarrow Y$가 있다고 해봅시다. local Markov assumption을 통해 우리는 $P(x,y)=P(x)P(y|x)$이라고 할 수 있습니다. 그러나 이때 역시 $P(x,y)=P(x)P(y)$을 정의할 수 있습니다. 즉 인접한 두 노드 $X, Y$가 독립이라고 할 수 있습니다. 반면에 minimality assumption을 통해 $P(x,y)=P(x)P(y|x)$로 factorize 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/6a103efc-0bcb-41af-b99d-aa8e9ad0957f/image.png" alt=""></p>
<h2 id="33-causal-graphs">3.3 Causal Graphs</h2>
<p>Causal 관계를 보장하기 위한 한 가지의 가정이 추가적으로 등장합니다.</p>
<blockquote>
<p><strong>Assumption 3.3</strong> ((Strict) Causal Edges Assumption) 
In a directed graph, every parent is a direct cause of all its children.</p>
</blockquote>
<p>Assumption 3.3을 통해 부모 노드와 자식 노드 간의 종속성을 가정했기 때문에 Assumption 3.3이 Assumption 3.2(minimality)를 반영하고 있다고 할 수 있습니다.</p>
<p>반면에 non-strict causal edges assumption이 존재하는데, 이는 몇몇의 부모 노드들이 자식 노드에 영향을 미치지 않는 것을 의미합니다. 실제로 Causal graph에서 항상 부모가 자식에게 영향을 미치는 것은 아닙니다. 확실히 하기위해, 앞으로 언급하게 될 Causal graph는 strict causal edges assumption을 만족하는 DAG라고 하겠습니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/961afae6-6007-451b-b443-a0361f7a1464/image.png" alt=""></p>
<h2 id="34-two-node-graphs-and-graphical-building-blocks--35-chains-and-forks">3.4 Two-Node Graphs and Graphical Building Blocks ~ 3.5 Chains and Forks</h2>
<p>Basic assumption과 definition을 봤으니, 이제부터 3장의 핵심인 the flow of association과 causation in DAGs에 대해 살펴보겠습니다. </p>
<p>Flow of association은 그래프 안의 두 노드가 연결되었는지, 아닌지를 의미합니다. 즉 statistically 독립인지 종속인지를 의미합니다.</p>
<p>그래프의 minimal building block을 이해하면 DAG에서 발생하는 flow에 대해 이해할 수 있습니다. Minimal building block은 크게 3가지입니다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/b2954929-cbdd-4632-bb3a-8636db8bda9c/image.png" alt=""></p>
<p>그림의 (a) Chain과 (b) fork는 동일한 set of dependencies를 가지고 있습니다. 둘 모두 $$X_1$$과 $$X_2$$가 dependent하고 $$X_2$$와 $$X_3$$가 dependent합니다. </p>
<p>그렇다면 $$X_1$$과 $$X_3$$는 어떨까요? 두 케이스 (a), (b) 모두 dependent합니다. 즉 association이 $$X_2$$로 인해 flow한다고 볼 수 있습니다. (a)의 경우는 직관적입니다. $$X_1$$이 $$X_2$$에 영향을 주고, $$X_2$$가 $$X_3$$에 영향을 주기 때문에 $$X_1$$과 $$X_3$$가 dependent함을 알 수 있습니다. (b)에서는, 두 노드의 공통 노드인 $$X_2$$의 값을 $$X_1$$과 $$X_3$$에 모두 영향을 주기 때문입니다. 즉 $$X_1$$과 $$X_3$$가 common cause를 갖고 있기 때문입니다.</p>
<p>또한 (a)와 (b)는 동일한 set of independencies를 갖고 있습니다. 만약 $$X_2$$을 condition으로 걸어주면 두 경우 모두  $$X_1$$과 $$X_3$$의 the flow of association이 막혀버립니다(ㅠ(block). 이 경우는 local Markov assumption 때문입니다.
<img src="https://images.velog.io/images/simba-pumba/post/c699542f-cacd-4f2e-a2f8-30b0d716a7e6/image.png" alt=""></p>
<h2 id="36-coliders-and-their-descendants">3.6 Coliders and their Descendants</h2>
<p>Immorality($$X_1$$→ $$X_2$$ ← $$X_3$$)에서 $$X_1$$, $$X_3$$는 chain과 fork와는 다르게 독립입니다. 이 때 common child($$X_2$$)는 보통 collider라고 불립니다. 여기서는 특이하게 collider를 condition으로 걸어주는 순간, 두 변수 $$X_1$$, $$X_3$$가 종속이 됩니다. 이것을 이해하기 위해 한 가지 예시를 살펴봅시다.</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/19bbec32-4d42-46b2-a6a7-55854ddaa749/image.png" alt=""></p>
<p><strong>Good-Looking Men are Jerks</strong>
$$X_1$$: &quot;looks&quot;, $$X_2$$: &quot;availability&quot;, $$X_3$$: &quot;kindness&quot;
<img src="https://images.velog.io/images/simba-pumba/post/96285f1f-0f32-4276-89e8-adb8adda8401/image.png" alt="">
그림(c)의 상황은 _Berkson’s paradox_라고도 불립니다.</p>
<h2 id="37-d-separation">3.7 d-separation</h2>
<p>d-separation을 정의하기 전에, &quot;blocked path&quot;라는 것을 다시 한 번 살펴보자면 다음과 같습니다.</p>
<blockquote>
<p><strong>Definition 3.3</strong> (blocked path) A path between nodes $$X$$ and $$Y$$ is blocked by a (potentially empty) conditioning set $$Z$$ if either of the following is true:</p>
</blockquote>
<ol>
<li>Along the path, there is a chain · · · → $$W$$ → · · · or a fork · · · ← $$W$$ → · · ·, where $$W$$ is conditioned on ($$W$$ ∈ $$Z$$).</li>
<li>There is a collider $$W$$ on the path that is not conditioned on ($$W$$ ∉ $$Z$$) and none of its descendants are conditioned on (de($$W$$) $$\nsubseteq$$ $$Z$$).</li>
</ol>
<p>unblocked path는 단순히 not blocked path입니다. </p>
<blockquote>
<p><strong>Definition 3.4</strong> (d-separation) Two (sets of) nodes $$X$$ and $$Y$$ are d-separated by a set of nodes $$Z$$ if all of the paths between (any node in) $$X$$ and (any node in) $$Y$$ are blocked by $$Z$$.</p>
</blockquote>
<p>만약 어떤 두 노드 $$X$$와 $$Y$$ 사이의 모든 path가 막혔다면(block), $$X$$와 $$Y$$가 d-separated 되었다고 합니다. 비슷하게, 만약 어떤 두 노드 $$X$$와 $$Y$$ 사이에 block되지 않은 적어도 하나의 path가 존재한다면, $$X$$와 $$Y$$가 d-connected 되었다고 합니다.</p>
<p>d-separation을 conditional independence로도 볼 수 있는데, 이 때 다음과 같은 notation을 사용합니다.
<img src="https://images.velog.io/images/simba-pumba/post/0e444418-7878-4117-ad8d-b7af32584ee3/image.png" alt="">
즉, $$X$$와 $$Y$$가 그래프 $$G$$에서 $$Z$$를 conditioning 해줬을 때 d-separated 되어있다.</p>
<h2 id="38-flow-of-association-and-causation">3.8 Flow of Association and Causation</h2>
<p>directed path를 따르는 flow association이 causal association입니다. 인과관계가 아닌 association을 만드는 대표적인 non-causal association에는 confounding association이 있습니다. </p>
<p><img src="https://images.velog.io/images/simba-pumba/post/98b32d4e-7600-4f53-99d0-a0538d26be2e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GAN loss 정리(언제 다 하지...)]]></title>
            <link>https://velog.io/@simba-pumba/GAN-loss-%EC%B4%9D%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@simba-pumba/GAN-loss-%EC%B4%9D%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 15 Nov 2020 12:48:03 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/hindupuravinash/the-gan-zoo">https://github.com/hindupuravinash/the-gan-zoo</a></p>
<h2 id="vanila">Vanila</h2>
<h3 id="bce-loss-binary-cross-entropy-또는-adversarial-loss">BCE loss (Binary Cross Entropy) 또는 Adversarial loss</h3>
<p>$\min <em>G \max _D V(D,G)=\mathbb{E}</em>{x\sim p_{data(x)}} [\log D(x)]+\mathbb{E}<em>{z\sim p</em>{z}(z)}[\log (1-D(G(z))],$</p>
<p>where $x\sim P_{data}(x)$: 실제 데이터의 분포, $z\sim P_{x}(x)$: 분포가정(ex. 정규분포)에서 온 latent code의 분포</p>
<p>GAN의 판별자 D는 real or fake를 판단하기 때문에, Binary Cross Entropy(이하BCE)를 사용함. real일 때 y = 1, fake일 때 y = 0 임.</p>
<p>$BCE=-{1\over n}\sum_{i=1}^n  (y_i log(p_i)+(1-y_i) log(1-p_i))$를 사용한 loss임. </p>
<h3 id="wasserstein-objective-function">Wasserstein Objective function</h3>
<p>$\min <em>G \max _D V(D,G)=\mathbb{E}</em>{x\sim p_{data(x)}} [D(x)]+\mathbb{E}<em>{z\sim p</em>{z}(z)}[D(G(z))],$</p>
<p>where $D$는 Lipschitz 조건을 만족하는 함수
<img src="https://images.velog.io/images/simba-pumba/post/a2102e74-4b23-47bc-94a0-225d7353d078/image.png" alt=""></p>
<p>BCE loss의 mode collapse와 vanishing gradient 해결을 위해 등장한 loss임. real일 때 y = 1, fake일 때 y = -1 임.</p>
<h3 id="conditional-gan-loss">Conditional GAN loss</h3>
<p>$\min <em>G \max _D V(D,G)=\mathbb{E}</em>{x\sim p_{data(x)}} [\log D(x|y)]+\mathbb{E}<em>{z\sim p</em>{z}(z)}[\log (1-D(G(z|y))].$</p>
<p>BCE loss에 condition으로 label $y$를 걸어주었음. 실제 코드에서는 $x$, $z$에 $y$를 더해주는 식으로 계산함.</p>
<hr>
<h2 id="style-transfer">Style transfer</h2>
<h3 id="l1-distance-manhattan-distance">L1 distance (Manhattan distance)</h3>
<p>$\min <em>G \max _D V(D,G) = \mathcal{L}</em>{cGAN}+ \lambda \mathcal{L}_{L1}(G).$</p>
<p>$\mathcal{L}<em>{cGAN}=\mathbb{E}</em>{y} [\log D(y)]+\mathbb{E}_{x,z}[\log (1-D(G(x,z))].$</p>
<p>$\mathcal{L}<em>{L1}(G)=\mathbb{E}</em>{x,y,z}[||y-G(x,z)||_1 ],$</p>
<p>where $y$: real output(ground truth image), $x$: real input</p>
<p>pix2pix에 등장한 loss로, BCE loss(Adversarial loss)만을 사용할 경우 흐린 경우가 발생했음. 이를 해결하기 위해 L1 텀을 추가함.</p>
<p>생성된 이미지와 실제 이미지 사이의 픽셀 간 거리를 구해 이를 최소화하여, 최대한 원본과 가깝게 이미지를 만들어내기 위해 노력함.</p>
<h3 id="cycle-consistency-loss">Cycle Consistency loss</h3>
<p>$\mathcal{L}<em>{cyc}(G,F)=\mathbb{E}</em>{x\sim p_{data}(x)} [||F(G(x))-x||<em>1 ] + \mathbb{E}</em>{y\sim p_{data}(y)} [||G(F(x))-y||_1 ],$</p>
<p>where $G: X \to Y$, $F: Y \to X$, 이 때 $X\in D_X$, $Y\in D_Y$</p>
<p>unpaired dataset의 경우, paired dataset과는 다르게 좌표가 mapping되는 것이 아님. 따라서 올바른 pair 이미지 생성을 위해 $x$-&gt;$y$-&gt;$x$와 $y$-&gt;$x$-&gt;$y$ 를 고려해준 것임. 즉 다른 도메인을 거쳐 원래 도메인으로 돌아왔을 때 최대한 원본의 값을 유지할 수 있도록 함. (아래의 이미지 참고)</p>
<p><img src="https://images.velog.io/images/simba-pumba/post/3eb88fe2-a7ee-4aad-908e-3235d2447385/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/simba-pumba/post/dc94b79c-8f9e-4668-8a86-b52e3a49b3f9/image.png" alt=""></p>
<h3 id="least-squares-loss-adversarial-loss">Least Squares loss (Adversarial loss)</h3>
<p>$\min <em>G \max _D V(D,G)</em>{lsl} = \mathbb{E}_x [(D(x)-1)^2]+\mathbb{E}_z [(D(G(z)))^2]$</p>
<p>BCE loss의 텀에 각각 square를 해준 형태임.
기존의 BCE loss에 비해, 좀 더 안정적으로 학습을 하고 높은 퀄리티의 이미지를 생성할 수 있다고 함.</p>
<h3 id="identity-loss">Identity loss</h3>
<p>$\mathcal{L}<em>{identity}(G,F)=\mathbb{E}</em>{y\sim p_{data}(y)}[||G(y)-y||<em>1 ] + \mathbb{E}</em>{x_{p_{data}}(x)} [||F(x)-x||_1 ],$</p>
<p>where $G: X \to Y$, $F: Y \to X$, 이 때 $X\in D_X$, $Y\in D_Y$</p>
<p>input의 texture는 바꾸되, 분위기나 색상을 유지하기 위해 사용됨. 즉, target domain의 sample이 input으로 들어왔을 때 target domain의 sample을 그대로 내뱉도록 Generator $G$를 regularize 함.</p>
<p>$\it{e.g}$) 오전 그림을 넣었을 때 모델이 해질녘 사진으로 바꾸는 문제가 있었음. 이를 해결하기 위해 사용함.</p>
<h3 id="face-id-loss">FACE ID loss</h3>
<p>$\mathcal{L}<em>{face}=\mathbb{E}</em>{x \sim X_s}[1-\cos(F(x),F(T^i_{s\rightarrow t}(x)))]+[1-\cos(F(x),F(T^i_{t\rightarrow s}(x)))]$</p>
<p>real image와 target domain 사이의 constraints를 더 강화시키기위하여 cosine distance를 이용함.</p>
<h3 id="group-classification-loss">Group classification loss</h3>
<p>$\mathcal{L}<em>{cls}^{real}=\mathbb{E}</em>{x \sim \mathcal{Y}_i}[-\log D_t^{cls}(i|x)],$</p>
<p>$\mathcal{L}<em>{cls}^{fake}=\mathbb{E}</em>{x \sim \mathcal{Y}<em>i}[-\log D_t^{cls}(i|T^i</em>{s\rightarrow t}(x))]$</p>
<p>where $D_t^{cls}(i|x)$는 $D_t$에 의해 계산된 group label 확률분포임</p>
<hr>
<h3 id="업데이트-예정">업데이트 예정</h3>
<p>(SGAN, ACGAN, PGGAN, Style GAN1, Style GAN2, Cycle gan)</p>
<p>Cross-domain Correspondence Learning for Exemplar-based Image Translation</p>
<p>Tell, Draw, and Repeat: Generating and Modifying Images
Based on Continual Linguistic Instruction </p>
<hr>
<h2 id="multi-domain">Multi domain</h2>
<h3 id="multi-domain-adversarial-loss">Multi domain adversarial loss</h3>
<p>$\mathcal{L}<em>{adv} = \mathbb{E}</em>{x} [\log D_{src}(x)]+\mathbb{E}<em>{x,c}[\log (1-D</em>{src}(G(x,c))],$</p>
<p>where $c$ is target domain label</p>
<p>$x$와 target domain label $c$를 이용하여 이미지를 생성함.</p>
<h3 id="domain-classification-adversarial-loss">Domain classification adversarial loss</h3>
<p>$\min <em>D \mathcal{L}=\mathbb{E}</em>{x, c&#39;} [-\log D_{cls}(c&#39;|x)].$ </p>
<p>real image $x$가 들어왔을 때, original domain label $c&#39;$로 분류를 위한 loss임.</p>
<p>$\min <em>G \mathcal{L}=\mathbb{E}</em>{x, c&#39;} [-\log D_{cls}(c|G(x,c))].$ </p>
<p>target domain으로 바뀌어 생성된 이미지가 target domain $c$로 분류되기 위한 loss임.</p>
<h3 id="cycle-consistency를-이용한-reconstruction-loss">Cycle consistency를 이용한 Reconstruction loss</h3>
<p>$\mathcal{L}<em>{rec} = \mathbb{E}</em>{x,c,c&#39;}[||x-G(G(x,c),c&#39;)||_1 ]$.</p>
<p>Generater $G$가 생성해낸 이미지와 original doamin label $c&#39;$를 input으로 받아, target domain 부분은 변화시키되 input image $x$의 형태를 유지하게끔 복원해내기 위해서 cycle consistence loss를 이용함.</p>
<h3 id="diversity-sensitive-loss">Diversity sensitive loss</h3>
<p>$\mathcal{L}<em>{ds}=\mathbb{E}</em>{x, Y, z_1, z_2}[||G(x, c_1)-G(x,c_2)||_1 ],$</p>
<p>where Y is target domain</p>
<p>다양한 style을 생성하기 위한 loss임. $c_1$과 $c_2$는 latent vector $z_i \sim Y$에서 생성된 target domain vector를 의미함. </p>
<h3 id="style-reconstruction-loss">Style reconstruction loss</h3>
<p>$\mathcal{L}<em>{sty}=\mathbb{E}</em>{x, Y, z}[||c-E_Y G(x,c)||_1 ],$</p>
<p>Generater $G$가 이미지를 생성할 때, c를 이용하도록 함. 단일 Encoder를 통해 여러 도메인에 대해 다양한 출력을 뽑아낼 수 있음. 즉, 얼마나 우리가 원하는 style $c$에 가깝게 이미지를 생성했는가를 판단함. </p>
<h3 id="conditional-adversarial-loss">Conditional Adversarial loss</h3>
<p>$\min <em>G \max _D \mathcal{L}=\mathbb{E}</em>{x, v, x&#39;} [\log D(x,v,x&#39;)]+\mathbb{E}_{x,v}[\log (1-D(x,v,G(x,v)))],$</p>
<p>where $v$ is relative attribute
Conditional GAN의 conditional adversarial loss의 개념을 가져와, 생성 이미지 $G(x,v)$가 realistic하게 보일 뿐만 아니라 $x$와 $G(x, v)$의 차이가 $v$ 일치하도록 함.</p>
<h3 id="cycle-reconstruction-loss">Cycle-reconstruction loss</h3>
<p>$\min_G \mathcal{L}<em>{Cycle}=\mathbb{E}</em>{x,v}[||G(G(x,v),0v)-x||_1 ]$</p>
<p>where $v$ is relative attribute</p>
<p>생성 이미지가 특정 속성을 제외한 모든 측면을 보존하는 것을 보장하기 위함.</p>
<h3 id="self-reconstruction-loss">Self-reconstruction loss</h3>
<p>$\min_G \mathcal{L}<em>{Self}=\mathbb{E}</em>{x}[||G(x,0)-x||_1 ]$</p>
<p>where $v$ is relative attribute</p>
<p>v가 0일 경우 생성 이미지가 원본 이미지를 만들어낼 수 있도록 보장함. </p>
<h3 id="interpolation-loss">Interpolation loss</h3>
<p>high-quality interpolation을 위해 보간된 이미지를 realistic하게 보이도록 함.</p>
<hr>
<h2 id="reenactment">Reenactment</h2>
<h3 id="domain-specific-perceptual-loss">Domain specific perceptual loss</h3>
<p>$\mathcal{L}<em>{perc}(x,y)=\sum</em>{i=1}^{n}{1\over C_iH_iW_i}||F_i(x)-F_i(y)||_1$</p>
<p>where $F_i \in\mathbb{R}^{C_i \times H_i \times W_i }$</p>
<p>얼굴의 fine details을 살리기위해 사용함. Perceptual loss는 일반적으로 VGG network(target domain에 알맞게 pretrained model로 설정)의 feature map을 사용함.</p>
<h3 id="reconstruction-loss">Reconstruction loss</h3>
<p>$\mathcal{L}_{pixcel}(x,y)=||x-y||_1$</p>
<p>perceptual loss만 사용할 경우, 종종 실제와 다른 색을 지닌 이미지를 생성할 경우가 존재함. 이를 방지하기 위해 pixelwise $L_1$ loss를 사용함.</p>
<h2 id="cross-domain">Cross-domain</h2>
<h3 id="feature-matching-loss">Feature matching loss</h3>
<p>$\mathcal{L}<em>{feat}=\sum</em>{l}\lambda_l ||\phi_l(\mathcal{G}(x_A,x&#39;_B))-\phi_l(x_B)||_1$</p>
<h3 id="domain-alignment-loss">Domain alignment loss</h3>
<p>$\mathcal{L}<em>{domain}^{l_1}=||\mathcal{F}</em>{A\rightarrow S}(x_A)-\mathcal{F}_{B\rightarrow S}(x_B)||_1$</p>
<h3 id="exemplar-translation-loss">Exemplar translation loss</h3>
<p>$\mathcal{L}<em>{perc}-||\phi_l(\hat{x}_B)-\phi_l(x_B) ||_1,$ 
$\mathcal{L}</em>{context}=\sum_l \omega_l [-\log ({1 \over n_l} \sum_i \max_j A^l (\phi_i^l (\hat{x}_B), \phi_j^l(y_B)))]$</p>
<h3 id="correspondence-regularization">Correspondence regularization</h3>
<p>$\mathcal{L}<em>{reg}=||r</em>{y \rightarrow x \rightarrow y}-y_B||_1$</p>
<hr>
<h2 id="paper">Paper</h2>
<h3 id="cyclegan-loss-논문-출처">CycleGAN loss (논문 출처)</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/e57aec49-700e-464a-bbff-cd49ea969646/image.png" alt=""></p>
<h3 id="stargan-loss">StarGAN loss</h3>
<p>$\mathcal{L}<em>D = -\mathcal{L}</em>{adv}+\lambda_{cls} \mathcal{L}^{r}<em>{cls}$
$\mathcal{L}_G = \mathcal{L}</em>{adv}+\lambda_{cls} \mathcal{L}^{f}<em>{cls} + \lambda</em>{rec}\mathcal{L}_{rec}.$</p>
<p>$\mathcal{L}<em>{adv} = \mathbb{E}</em>{x} [\log D_{src}(x)]+\mathbb{E}<em>{x,c}[\log (1-D</em>{src}(G(x,c))],$</p>
<p>where $c$ is target domain label</p>
<h3 id="stargan2-loss">StarGAN2 loss</h3>
<p><img src="https://images.velog.io/images/simba-pumba/post/d54ebb65-b767-4d1f-b1d4-c8b04d6fd703/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/simba-pumba/post/e234b651-1d05-40d6-8bc5-caef3631604f/image.png" alt=""></p>
<h3 id="relgan-loss">RelGAN loss</h3>
<p>: loss functoin이 G 1개와 D 3개 {$D_{Real}, D_{Match}, D_{Interp}$} 로 구성됨.</p>
<h4 id="사전-지식">사전 지식</h4>
<ul>
<li>n차원 속성 벡터 $a$ = $[a^{(1)}, a^{(2)}, . . . ,a^{(n)}]^{T}$  </li>
<li>각 특징 $a^{(i)}$는 의미있는 특성 (ex&gt; 얼굴 이미지의 나이, 성별, 머리색 등)</li>
<li>RelGAN의 목적 : input 이미지 x를 target 특징을 가지면서 real같아 보이는 output 이미지 y로 출력 (몇 개의 user가 지정한 특성은 원래 이미지와 다르게, 그 외는 특성이 유지되도록 출력)</li>
<li>mapping function $(x, v) → y$를 학습할 것을 제안<ul>
<li>$v$ : 속성의 변화를 원하는 <strong>상대 속성</strong> 벡터  </li>
</ul>
</li>
</ul>
<h5 id="상대-속성">상대 속성?</h5>
<ul>
<li><p>이미지 x의<br>특징 벡터 $a$ = 원래 도메인,<br>target 특징 벡터 $\hat{a}$ =  target 도메인  </p>
</li>
<li><p>$a$, $\hat{a}$는 둘 다 n차원 벡터임.</p>
</li>
<li><p><strong>$a$와 $\hat{a}$ 사이의 상대 속성 벡터</strong>
<img src="https://images.velog.io/images/mink555/post/ba7b60c0-fc40-4b77-a566-8be830b12d49/29.PNG" alt="">
<img src="https://images.velog.io/images/mink555/post/918be402-5614-4557-83a1-afe80a846a8e/31.PNG" alt=""></p>
</li>
<li><p>input 이미지 x를 output 이미지 y로 매핑할 때 user가 원하는 속성 변경을 나타냄.  </p>
</li>
</ul>
<p>ex&gt; 이미지 특성이 이진값 (0 or 1)이면 상대 속성은 (−1, 0, 1) 3개의 값으로 표현됨.<br>: 각 값은 이진 속성에 대한 user의 action에 해당  </p>
<table>
<thead>
<tr>
<th align="center"></th>
<th align="center"></th>
</tr>
</thead>
<tbody><tr>
<td align="center">turn on</td>
<td align="center">+1</td>
</tr>
<tr>
<td align="center">turn off</td>
<td align="center">-1</td>
</tr>
<tr>
<td align="center">unchanged</td>
<td align="center">0</td>
</tr>
</tbody></table>
<ul>
<li>즉, 상대 속성은 user의 요구사항을 인코딩 하는 것으로 해석 가능.</li>
</ul>
<ul>
<li><strong>상대 속성</strong>을 통한 얼굴 속성 보간<br>: $x$와 $G (x, v)$ 사이의 보간을 수행하려면 $G (x, \alpha{v})$를 적용하기만하면 됨. ($\alpha ∈ [0, 1]$은 보간 계수)
<img src="https://images.velog.io/images/mink555/post/1b6d1016-ca34-4366-ab53-d2eae73ff665/30.PNG" alt=""></li>
</ul>
<h4 id="1-adversarial-loss">(1) Adversarial Loss</h4>
<ul>
<li>생성된 이미지를 real 이미지와 구별할 수 없도록 standard GAN의 adversarial loss 적용.</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/d508711b-4506-4d58-9920-670860debf31/28.PNG" alt=""></p>
<ul>
<li>x : real 이미지</li>
<li>v : 상대 속성</li>
<li>$D_{real}$ : 실제 이미지와 생성된 이미지 구분, unconditional discriminator</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/679a12fc-a935-4ff4-a699-967a83d3bb42/32.PNG" alt=""></p>
<h4 id="2-conditional-adversarial-loss">(2) Conditional Adversarial Loss</h4>
<ol>
<li>output 이미지 $G(x, {\alpha}v)$가 realistic해 보이길 원함</li>
<li>$x$ 와 $G(x, {\alpha}v)$의 차이가 상대 속성 $v$와 match 되어야 함.</li>
</ol>
<ul>
<li><p>$D_{match}$<br>: cGAN의 컨셉을 도입한 discriminator (conditional discriminator)<br>: <strong>real triplet $(x, v, x&#39;)$</strong> 과 <strong>fake triplet $(x, v, G(x, v))$</strong>을 input으로 함.  </p>
</li>
<li><p>real triplet $(x, v, x&#39;)$<br>: 2개의 <strong>real 이미지 $(x, x&#39;)$</strong>와 <strong>상대 속성 벡터 $v (= a-a&#39;)$</strong>로 구성</p>
</li>
<li><p>$a$와 $a&#39;$<br>: 각각 x와 $x&#39;$의 속성 벡터  </p>
</li>
<li><p>x와 $x&#39;$<br>: 다른 속성을 가진 unpaired한 training data (real 이미지)</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/0b376c42-05ef-4e58-9d4c-745ea7becbc9/33.PNG" alt=""></p>
<hr>
<p><strong><em>(참고)</em></strong>  </p>
<ul>
<li>conditional GAN loss
<img src="https://images.velog.io/images/mink555/post/627ddcd8-d027-49b5-b6b8-2671aa0c3a65/9.PNG" alt=""></li>
</ul>
<p>$ G^* = arg min_G max_D L_{cGAN} (G, D) $</p>
<p>(출처 : Image-to-Image Translation with Conditional Adversarial Networks)</p>
<hr>
<ul>
<li><strong>real triplet</strong><br>: real 이미지 2개 &amp; 잘 matched 상대 속성  </li>
</ul>
<ul>
<li><strong>fake triplet</strong><br>: real 이미지 1개 &amp; fake 이미지 1개 &amp; 잘 matched 상대 속성?????????  </li>
</ul>
<ul>
<li>$(x, x&#39;)$와 mismatched $v$로 구성되는 <strong>wrong triplet</strong>을 추가<br>(input-output 쌍이 상대 속성과 일치하는지 여부를 결정하는 matching aware discriminator에 영감 받음)<ul>
<li><strong>wrong triplet</strong><br>: real 이미지 2개 &amp; 잘못 matched 상대 속성<br>: wrong triplet을 추가함으로써 $D_{match}$는 아래처럼 분류하려고 함.</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th align="center">triplet</th>
<th align="center">분류</th>
</tr>
</thead>
<tbody><tr>
<td align="center">real triplet</td>
<td align="center">+1</td>
</tr>
<tr>
<td align="center">fake triplet</td>
<td align="center">-1</td>
</tr>
<tr>
<td align="center">wrong triplet</td>
<td align="center">-1</td>
</tr>
</tbody></table>
<ul>
<li>wrong triplet 작동 방식<br>$(x, v (= a-a&#39;), x&#39;)$로 표현되는 real triplet이 주어지면,<br>4개의 변수 중 하나를 wrong triplet에 의해 생성되는 것으로 대체함으로써<br>4개의 wrong triplet을 얻는다.
<img src="https://images.velog.io/images/mink555/post/5c257e5d-76b9-47bf-a597-6ac62ff13508/19.PNG" alt=""></li>
</ul>
<h4 id="3-reconstruction-loss">(3) Reconstruction Loss</h4>
<ul>
<li>unconditional loss와 condtional loss를 최소화하면서 G는 output 이미지 $G(x, v)$를 real 이미지처럼 생성하는 것을 학습함.  </li>
<li>그리고 $x$와 $G(x, v)$의 차이는 상대 속성 $v$에 match됨  </li>
<li>그러나, G가 low level (ex&gt; 배경 표현) -&gt; high level (ex&gt; 얼굴 이미지의 identity) 과정에서<br>다른 모든 부분을 유지하면서 <strong>속성과 관련된 contents만 수정한다는 보장</strong>이 없다.  </li>
<li>이 문제를 보완하기 위해 G를 규제하는 <strong>cycle-reconstruction loss</strong>와 <strong>self-reconstruction loss</strong>를 도입함. (둘 다 L1 norm 사용)  </li>
</ul>
<h5 id="1-cycle-reconstruction-loss">1) Cycle-reconstruction loss</h5>
<ul>
<li>cycleGAN의 cycle consistency 개념을 적용</li>
<li>L1 norm 사용
<img src="https://images.velog.io/images/mink555/post/63d80dc1-7873-408f-92a9-b2e84b66bac6/20.PNG" alt=""></li>
</ul>
<p>: $G(:, v)$, $G(: ,−v)$는 서로의 역이 됨.</p>
<hr>
<p><strong><em>(참고)</em></strong></p>
<ul>
<li>cycleGAN의 cycle consistency
<img src="https://images.velog.io/images/mink555/post/c835de3d-6ee9-4b2c-82c3-3f8b32fb0bfd/3.PNG" alt=""></li>
</ul>
<p>출처) Unpaired
image-to-image translation using cycle-consistent adversarial networks</p>
<hr>
<h5 id="2-self-reconstruction-loss">2) Self-reconstruction loss</h5>
<ul>
<li>상대 속성 벡터가 $0$ 벡터인 경우, 아무 속성도 변하지 않았음을 의미</li>
<li>output 이미지 $G(x, 0)$은 가능한 한 $x$에 가깝게 돼야 함.</li>
<li>아래의 loss를 통해 구현 가능</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/2234233e-957c-4d9b-9e74-7bf7457ad117/21.PNG" alt=""></p>
<ul>
<li>G는 auto-encoder로 다시 돌아가서(degenerate) $x$를 재구성함.</li>
<li>L1 norm 사용</li>
</ul>
<h4 id="4-interpolation-loss">(4) Interpolation Loss</h4>
<ul>
<li>G는 $G(x, {\alpha}v)$ ($\alpha ∈ [0, 1]$은 보간 계수) 를 통해<br>이미지 $x$와 변환된 이미지 $G(x, v)$ 사이를 보간함.</li>
<li>보간의 high-quality를 위해 보간된 이미지 $G(x, {\alpha}v)$를 realistic하게 보이기를 원함.<br>  -&gt; &quot;$G(x, {\alpha}v)$&quot;를 보간되지 않은 output 이미지인 &quot;$G (x, 0)$ 및 $G (x, v)$&quot;와 구별할 수 없도록 만드는 규제를 제안<br>  = <strong>interpolation discriminator $D_{Interp}$</strong>  </li>
</ul>
<ul>
<li>$D_{Interp}$의 목적<br>: 생성된 이미지를 input으로 받아 보간 정도 $\hat{\alpha}$를 예측 ($\hat{\alpha} = min(\alpha, 1-\alpha)$)<br>: $\hat{\alpha}$를 예측함으로써 $\alpha$와 $1-\alpha$ 사이의 모호성을 해결  <ul>
<li>$\hat{\alpha}$ = 0 : 보간 x</li>
<li>$\hat{\alpha}$ = 0.5 : 최대 보간</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/5cad3980-8131-490d-8162-7a046d801f23/22.PNG" alt="">    </p>
<ul>
<li>첫번째 term<br>: $G(x, {\alpha}v)$로부터 $\hat{\alpha}$를 복구  </li>
<li>두번째, 세번째 term<br>: $D_{Interp}$이 보간되지 않은 이미지에 대해 0을 출력  </li>
</ul>
<hr>
<ul>
<li>그런데, 실험적으로 아래의 <strong>수정된 $D_{Interp}$ loss</strong>가 학습을 더 안정화 시키는 것을 발견했음.</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/6007da52-6efb-435d-be48-4a2b1facb701/24.PNG" alt=""></p>
<p>(Ⅱ[&#39;] : argument가 참이면 1, 아니면 0인 indicator function)</p>
<hr>
<p><img src="https://images.velog.io/images/mink555/post/19b05318-0d77-4df5-8c56-52361b66a011/34.PNG" alt=""></p>
<ul>
<li>G는 아래의 loss 추가</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/1596a6cd-93f3-4e6f-be1f-a17b6acfbba6/23.PNG" alt=""></p>
<ul>
<li>G는 $G(x, {\alpha}v)$가 보간되지 않았다고 생각하도록 $D_{Interp}$를 속임.</li>
</ul>
<ul>
<li>$L_{Interp}^{D}$와 $L_{Interp}^{G}$ 과정</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/27aa0e90-46ed-472f-aa15-234791dac8a8/26.PNG" alt=""></p>
<h4 id="5-full-loss">(5) Full Loss</h4>
<ul>
<li>훈련을 안정화하기 위해 loss function에 <strong>orthogonal regularization ($L_{Ortho}$)</strong>을 추가했음.</li>
<li>D = {$D_{Real}, D_{Match}, D_{Interp}$} 와 G에 대한 각각의 full loss function</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/0963f27b-18f3-46a5-a61b-f32b8d660541/27.PNG" alt=""></p>
<p>($\lambda_{1}$, $\lambda_{2}$, $\lambda_{3}$, $\lambda_{4}$, $\lambda_{5}$는 hyper-parameters)</p>
<table>
<thead>
<tr>
<th align="center">Loss</th>
<th align="center">Generator L</th>
<th align="center">Discriminator L</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Adversarial Loss</td>
<td align="center">$L_{Real}$</td>
<td align="center">$L_{Real}$</td>
</tr>
<tr>
<td align="center">Conditional Adversarial Loss</td>
<td align="center">$L_{Match}^{G}$</td>
<td align="center">$L_{Match}^{D}$</td>
</tr>
<tr>
<td align="center">Interpolation Loss</td>
<td align="center">$L_{Interp}^{G}$</td>
<td align="center">$L_{Interp}^{D}$</td>
</tr>
<tr>
<td align="center">Reconstruction Loss</td>
<td align="center">$L_{Cycle}$</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">Reconstruction Loss</td>
<td align="center">$L_{Self}$</td>
<td align="center"></td>
</tr>
<tr>
<td align="center">orthogonal regularization</td>
<td align="center">$L_{Ortho}$</td>
<td align="center"></td>
</tr>
</tbody></table>
<p>논문) RelGAN: Multi-Domain Image-to-Image Translation via Relative Attributes</p>
<h3 id="sgan-semi-supervised-learning-gan">SGAN (Semi-Supervised Learning GAN)</h3>
<ul>
<li>DCGAN 기반</li>
</ul>
<h3 id="acgan-auxiliary-classifier-gan">ACGAN (Auxiliary Classifier GAN)</h3>
<h5 id="-standardgan">* standardGAN</h5>
<p><img src="https://images.velog.io/images/mink555/post/127e32ca-640f-41a6-a098-f9207bdf27f6/10.PNG" alt=""></p>
<ul>
<li>D는 $X_{real}$들어갔을 때 Source = real일 확률 + $X_{fake}$들어갔을 때 Source = fake일 확률을 maximize하도록 훈련함.</li>
<li>G는 $X_{fake} = G(z)$를 생성</li>
<li>$P(S | X) = D(X)$</li>
</ul>
<h5 id="-acgan">* ACGAN</h5>
<ul>
<li><p>framework</p>
</li>
<li><p>목적함수는 2개로 구성<br>: 맞춘 source의 log-likelihood $L_S$ / 맞춘 class의 log-likelihood $L_C$</p>
</li>
<li><p>D는 $L_S+L_C$를 maximize하도록, G는 $L_S-L_C$를 maximize하도록 훈련</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/21262dd5-3728-419d-87a8-c3466e20ed73/11.PNG" alt=""></p>
<ul>
<li>모든 생성된 샘플에는 기존의 noise z에 더해 해당 class label $c$~$p_c$가 있음.</li>
<li>G는 $X_{fake} = G(c,z)$를 생성</li>
</ul>
<p><img src="https://images.velog.io/images/mink555/post/9d428f3d-3152-431b-af04-8174bb303a30/12.png" alt=""></p>
<ul>
<li>input : class 임베딩 &amp; noise 벡터</li>
<li>output : 이진 분류기 (real/fake) &amp; multi-class 분류기 (이미지 class)  </li>
</ul>
<p>(출처 : <a href="https://stephan-osterburg.gitbook.io/coding/coding/ml-dl/tensorfow/chapter-4-conditional-generative-adversarial-network/acgan-architectural-design">https://stephan-osterburg.gitbook.io/coding/coding/ml-dl/tensorfow/chapter-4-conditional-generative-adversarial-network/acgan-architectural-design</a>)</p>
<p>논문) Conditional Image Synthesis with Auxiliary Classifier GANs</p>
<h3 id="pggan-progressive-growing-of-gans">PGGAN (Progressive Growing of GANs)</h3>
<ul>
<li>G와 D는 거울구조를 가짐.
<img src="https://images.velog.io/images/mink555/post/0c5f0a84-6f5f-42d9-a2de-c26c33212ba6/16.PNG" alt=""></li>
</ul>
<ul>
<li>WGAN-GP(Gradient Penalty) loss 사용 + 미니배치 당 G와 D의 최적화를 번갈아가면서 함. ($n_{critic}=1$)
<img src="https://images.velog.io/images/mink555/post/5324d94f-015e-47d3-aeef-f8112a8d135c/13.PNG" alt="">
<img src="https://images.velog.io/images/mink555/post/8f092ac8-8110-4170-9c89-5d4dc0609111/14.PNG" alt="">
(이때, gp는 loss function이 수렴하는데 영향을 주지 않음)  </li>
</ul>
<ul>
<li>WGAN의 weight clipping은 Lipschitz 제약을 적용해서 종종 poor samples을 생성하거나 수렴에 실패하는 경우 발생<br>→ weight clipping 대신 critic의 weight에 penalty를 준 것이 WGAN-GP  </li>
</ul>
<ul>
<li>추가적으로 discriminator의 output이 0으로부터 너무 멀리 떨어지는 것을 방지하기 위해 discriminator loss에 4번째 term을 넣음<br><img src="https://images.velog.io/images/mink555/post/87cca21a-bd8a-4407-9bb7-7c159a789ed6/17.PNG" alt=""></li>
</ul>
<p><strong><em>(참고)</em></strong>  </p>
<ul>
<li>WGAN-GP에서 $n_{critic}=1$로 둔다는 것
<img src="https://images.velog.io/images/mink555/post/53c57999-e940-4837-8deb-eef8c3e34b51/15.PNG" alt=""></li>
</ul>
<p>(Critic : GAN의 discriminator와 유사한 역할) </p>
<p>논문) D2PGGAN: TWO DISCRIMINATORS USED IN PROGRESSIVE GROWING OF GANS<br>논문) Wasserstein GAN<br>논문) PROGRESSIVE GROWING OF GANS FOR IMPROVED QUALITY, STABILITY, AND VARIATION<br>참고) <a href="https://study-grow.tistory.com/entry/Deep-learning-%EB%85%BC%EB%AC%B8-%EC%9D%BD%EA%B8%B0-StyleGAN-loss-%EC%9D%B4%ED%95%B4-%EC%96%95%EA%B2%8C-%EC%9D%BD%EB%8A%94-WGAN-WGAN-GP">https://study-grow.tistory.com/entry/Deep-learning-%EB%85%BC%EB%AC%B8-%EC%9D%BD%EA%B8%B0-StyleGAN-loss-%EC%9D%B4%ED%95%B4-%EC%96%95%EA%B2%8C-%EC%9D%BD%EB%8A%94-WGAN-WGAN-GP</a></p>
<h3 id="stylegan1">StyleGAN1</h3>
<ul>
<li>discriminator, loss function을 수정하지 않고 <strong>generator의 architecture만 수정</strong>했음.</li>
<li>Style-based generator architecture
<img src="https://images.velog.io/images/mink555/post/fd32cc2c-8316-4b45-aa82-28c84a1fb14a/18.PNG" alt=""></li>
</ul>
<ul>
<li><p>style-based G는 input latent z를 intermediate latent vector v로 임베딩함으로써 특징들이 선형적으로 잘 분리된 상태가 되게 함.</p>
</li>
<li><p>G에 직접적으로 noise를 넣어줌으로써 생성된 이미지의 stochastic 변형(ex&gt;주근깨, 머리)으로부터 high-level 특징(포즈, identity)을 자동으로 분리할 수 있음.</p>
</li>
<li><p>affine 변환을 통해 w를 styles $y = (y_s, y_b)$로 구체화하고 synthesis network의 각 conv layer 후에 AdaIN 정규화를 수행함.</p>
</li>
<li><p><strong>WGAN-GP loss 사용했음 (그대로)</strong></p>
</li>
</ul>
<p>논문) A Style-Based Generator Architecture for Generative Adversarial Networks</p>
<h3 id="cyclegan">CycleGAN</h3>
<p><img src="https://images.velog.io/images/mink555/post/7613364a-f8f8-4f53-8cd7-9b8f87a254ad/6.png" alt=""></p>
<h5 id="1-adversarial-loss-1">(1) Adversarial loss</h5>
<h5 id="-x-→-y인-경우">* <em>X → Y인 경우</em></h5>
<p>: <img src="https://images.velog.io/images/mink555/post/5e9af6ac-fdbf-4dd2-bed1-5349db761701/2.PNG" alt=""></p>
<h5 id="-반대로-y-→-x인-경우">* <em>반대로 Y → X인 경우</em></h5>
<p>: $L_{GAN}(F,D_X,Y,X)$  </p>
<ul>
<li>X 도메인에서 Y 도메인으로 매핑하고 역매핑도 해야 하므로 2개의 generator를 사용했고 도메인이 2개니까 2개의 discriminator 사용 (도메인의 수만큼 G, D 수 정해짐)</li>
</ul>
<h4 id="2-cycle-consistency-loss">(2) Cycle-consistency loss</h4>
<p><img src="https://images.velog.io/images/mink555/post/5d5540ac-8b16-4105-883b-c297a819e9c8/3.PNG" alt=""></p>
<ul>
<li>x → G(x) → F(G(x)) ≈ x / y → F(y) → G(F(y)) ≈ y</li>
<li>한 도메인이 다른 도메인으로 갔다가(생성) 원래 도메인으로 잘 복원하도록 함.</li>
<li>즉, 이미지의 도메인(스타일)을 바꾸되, 다시 원본으로 복원 가능한 정도로만 바꾸는 것</li>
</ul>
<h4 id="3-full-loss">(3) Full loss</h4>
<p><img src="https://images.velog.io/images/mink555/post/cacf1214-406f-4383-bbbd-f56d926942b5/4.PNG" alt=""></p>
<p><img src="https://images.velog.io/images/mink555/post/b547fe62-2a77-4fc5-9488-e70a8f724418/8.png" alt=""></p>
<h4 id="-4-identity-loss">+ (4) Identity loss</h4>
<p><img src="https://images.velog.io/images/mink555/post/959f192b-bae8-4474-8766-1c44b237782c/7.png" alt=""></p>
<ul>
<li>input과 output의 색감 유지를 위해 도입</li>
<li>target 도메인 Y가 input으로 들어왔을 때, 동일한 Y 도메인으로 매핑하는 경우 차이가 적도록해 도메인 Y의 색감을 유지할 수 있도록 한다.</li>
</ul>
<p>논문) Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Disentanglement(테스트)]]></title>
            <link>https://velog.io/@simba-pumba/Disentanglement</link>
            <guid>https://velog.io/@simba-pumba/Disentanglement</guid>
            <pubDate>Tue, 10 Nov 2020 08:23:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/simba-pumba/post/539934de-e2b4-4d6f-8aa4-babc1c626198/image.png" alt=""></p>
<p><strong>작성자: 고려대학교 산업경영공학과 이예지</strong></p>
<p>이번에는 disentanglement에 대한 내용을 다루고자 합니다.</p>
<p>deeplearning.ai의 <em>Build Basic Generative Adversarial Networks (GANs)</em> 강의에서 짧게 disentanglement에 대해 알려주었는데, 많은 자료를 보여주진 않더라구요. </p>
<p>이번에는 해당 강의를 토대로, disentanglement와 관련된 몇 가지 페이퍼를 짧게 요약해보자 합니다.</p>
<p>이 글이 disentaglement의 완벽한 이해를 드리기는 힘들지만, 어떤 것을 하고자 하는지에 대  큰 그림을 얻어가셨으면 좋겠습니다. 오늘 다루는 페이퍼 이외에, 관련 페이퍼를 추가로 적어놓았으니, 관심있으시면 꼭 읽어보시길 바랍니다. :)</p>
<hr>
<h1 id="lets-recap">Let&#39;s Recap</h1>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/ce9e58dd-6ea8-4b7d-ba51-ced1e3921132/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 1] coursera - Build Basic Generative Adversarial Networks (GANs), 'Challenges with Controllable Generation'</span>
</p>

<p>데이터의 분포를 학습하기 위해 우리는 GAN을 사용했습니다. 어떤 노이즈 벡터를 생성하고 GAN의 입력으로 넣었을 때, 우리가 가진 학습 데이터와 비슷하지만 학습 데이터에는 존재하지 않았던 랜덤한 이미지를 만들어낼 수 있습니다.</p>
<p>그러나 우리가 원하는 특징을 가진 랜덤한 이미지를 만드는 것은 쉽지 않습니다. Figure 1을 살펴봅시다. 갈색머리를 가지고 있는 사람의 이미지를 파란머리를 가진 사진으로 변경한 것입니다. 지금까지 다룬 Vanilla GAN은 이렇게 하나의 피쳐만을 변경하는 것이 불가능합니다. 왜 그럴까요? 다른 예를 살펴보겠습니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/57260e16-df9f-49fb-ab7b-82c1f6ff9bb9/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 2] coursera - Build Basic Generative Adversarial Networks (GANs), 'Challenges with Controllable Generation'</span></p>

<p>Figure 2를 봅시다. 제가 랜덤 벡터($z$)로 생성한 이미지가 왼쪽의 수염이 없는 여성이라고 해봅시다. 저는 여기서 수염을 추가하고 싶고, $z_1$축을 조절하여 수염을 추가할 수 있는 랜덤 벡터($z&#39;$)를 찾았다고 가정해보겠습니다. 이 여성의 그림에 수염을 추가할 수 있을까요?  물론 가능합니다. 그러나, 오랜쪽 아래의 수염을 가진 남성의 사진이 나오게 됩니다. 즉 수염을 추가한 것 뿐만 아니라 다른 피쳐들이 동시에 변한 것입니다. </p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/82a3be34-b8ad-4b8b-8fb0-e215162326ed/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 3] coursera - Build Basic Generative Adversarial Networks (GANs), 'Challenges with Controllable Generation'</span></p>

<p>이러한 결과가 나오는 것은 $z_1$축이 수염에 관련된 특징뿐만 아니라 다른 어떤 특징과도 연관이 되어있기 때문입니다. 이 예시로 볼 때는 머리 길이, 눈매, 그리고 눈썹 정도일 것 같습니다. 다시 말하면, 하나의 축이 하나의 특징을 의미하는 것이 아닙니다. 이를 <em>entanglement</em> (뒤얽힘, 꼬여있음)혹은 축이 <em>entangle 되어있다.</em> 라고 표현합니다. 축이 꼬여있는(entangle) 이유 중 한 가지는 일반적으로 $z$ 의 차수가 충분하지 않을 때 발생하지만, 이외에도 여러 가지 이유가 있습니다.</p>
<p>내가 원하는 피쳐들 외에 나머지는 고정한채로 이미지를 생성하고 싶다면 축을 disentagle되어있게 하면 되겠죠? disentanglement에 대한 해석을 그대로 인용하자면 다음과 같습니다. </p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/0269cfe2-ea41-43af-8a67-291c9b332b82/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 4] Takato Horii, Review "Info GAN"</span>
</p>

<blockquote>
<p>Transforming from an uninterpretable space with entangled features to eigen spaces where features are independent.</p>
</blockquote>
<hr>
<p>자, 이제부터 disentanglement 관련 페이퍼를 다음 순서로 짧게 리뷰해보겠습니다. </p>
<ul>
<li>[1] <em>Kulrarni, Tejas D., et. al. &quot;Deep Convolutional Inverse Graphics Network&quot; NIPS&#39;15. 711 citations.</em></li>
<li>[2] Chen, Xi, et al. &quot;InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets&quot; NIPS&#39;16. 2219 citations.</li>
<li>[3] Higgins, Irina, et al. &quot;beta-VAE: Learning basic visual concepts with a constrained variational framework.&quot; ICLR&#39;17. 1199 citations.</li>
</ul>
<p>다음의 페이퍼는 이번 글에서는 다루지 않지만 읽어보면 큰 도움이 될 거라고 생각합니다. 몇 가지는 <a href="https://s3.us-west-2.amazonaws.com/secure.notion-static.com/d9065a58-9bf6-4c80-b4aa-a43fc67cfd0f/201011_YM_beta-VAEs.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20201110%2Fus-west-2%2Fs3%2Faws4_request&amp;X-Amz-Date=20201110T074741Z&amp;X-Amz-Expires=86400&amp;X-Amz-Signature=b323b00bbb731b0d2f3d850f90e01e522ecd5b89a19f2510fdd96f9d5e14b01e&amp;X-Amz-SignedHeaders=host&amp;response-content-disposition=filename%20%3D%22201011_YM_beta-VAEs.pdf%22">이곳</a>에 짧게 정리되어 있습니다.  지금은 미루고 있지만 ☹️, 저도 나중에 꼭 페이퍼를 읽어보려구요 🙂!</p>
<ul>
<li><em>Alemi, Alexander A., et al. &quot;Deep variational information bottleneck.&quot; ICLR&#39;17, 411. citations.</em></li>
<li><em>Burgress, Christopher P., et al. &quot;Understanding disentangling in beta-VAE.&quot; NIPS&#39;17, 266 citations.</em></li>
<li><em>Chen, Ricky TQ, et al. &quot;Isolating sources of disentanglement in variational autoencoders.&quot;, NIPS&#39;18, 317 citations.</em></li>
<li><em>Stoechr, Niglas, et al. &quot;Disentagling interpretable generative parameters of random and real-world graphs.&quot; NIPS&#39;19. 3 citations</em></li>
<li><em>Hwang, HyeongJoo, et al. &quot;Variational Interaction Information Maximization for Cross-domain Disentanglement.&quot; NIPS&#39;20.</em></li>
</ul>
<hr>
<h1 id="1-deep-convolutional-inverse-graphics-network-dc-ign">[1] Deep Convolutional Inverse Graphics Network (DC-IGN)</h1>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/e9e953a4-af2d-4064-a969-8156162fe3ae/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 4] DC-IGN 요약</span></p>

<h3 id="특징">특징</h3>
<ul>
<li>out-of-plane rotations과 lighting variations과 같은 변형에 관하여 disentanglement를 시도함.</li>
<li>모델은 convoltion과 deconvolution의 몇 개의 레이어들로 구성되어 있음.</li>
<li>Stochastic Gradient Variational Bayes를 옵티마이저로 사용함.</li>
<li>입력 값이 주어지면, 같은 object지만 pose와 lighting에 따라 새로운 이미지를 만들어냄.</li>
</ul>
<h3 id="objective">Objective</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/4fef5a35-3a94-4201-a920-027da0ee653d/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 5]</span></p>

<p>컴퓨터 화상처리(Computer graphics)를 하기 위해서는 개발자들이 프로그래밍 언어를 사용해서 명령을 하겠죠? 그 명령(graphics code; $c$)은 매우 디테일 할 것입니다. 예를 들어 공의 위치는 어디이고, 밝기는 몇이고, 무슨 색깔을 가졌는가? 이렇게요. 이처럼 우리가 원하는 이미지 혹은 그래픽을 생성하기 위해서는 disentangled feature가 필요합니다. </p>
<p>해당 모델(DC-IGN)은  입력 값이 주어졌을 때, 같은 object지만 pose와 lighting에 따라 새로운 이미지를 만들어내는 것을 목표로 합니다.</p>
<h3 id="architecture">Architecture</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/1280fa15-2129-4e00-a002-f31660690ea1/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 6]</span></p>

<p>VAE(<em>D. P. Kingma and M. Welling, 2013</em>)를 변형한 형태의 모델 구조를 가고 있습니다. 따라서 크게 encoder와 decoder로 이루어졌으며, <strong>encoder</strong>는 {convolution layers+max-pooling}, <strong>decoder</strong>는 {convolution laysers+unpooling(upsampling using nearest neighbors)}로 구성됩니다.</p>
<h3 id="training">Training</h3>
<p>Input: data $x$</p>
<p>The posterior approximation: $Q(z_i|x)$, where $Q$~ $\mathcal{N}(\mu_{z_i}, \Sigma_{z_i})$</p>
<p>Graphics code: $Z$</p>
<p>encoder의 output ($encoder(x)$): $y_e$</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/a8c097d6-79ee-49a3-8f2f-b0e7a11650a9/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 7]</span></p>

<p>$Q(z_i|x)$를 만들어내기 위해 데이터 $x$가 encoder를 통과합니다. $Q(z_i|x)$의 모수는 다음과 같이 만들어집니다.</p>
<p>$\mu_{z_i}=W_e*y_e$,</p>
<p>$\Sigma_{z_i}=diag(\exp(W_e*y_e))$</p>
<p>code $Z$가 different view를 가진 이미지를 생성하기 위해 decoder를 통과하고,
$-\log(P(x|z_i))+KL(Q(z_i|x)||P(z_i))$ 를 object function으로 사용하여 학습하면 됩니다. 이 때, code $Z$는 <strong><em>Figure 7</em></strong> 처럼 disentaglement와 entaglement 파트가 섞여있는 벡터입니다. </p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/aa28b6b8-4c78-4da9-9084-5addba0fd9b2/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 8]</span></p>

<p>여기까지는 다른 모델과 크게 다를 것이 없습니다. 그렇다면 어떻게 disentanglement를 할 수 있을까요?  </p>
<p>DC-IGN은 mini-batch 를 이용하는 것입니다.  </p>
<p>현재 우리가 여러 특징(feature)을 가진 학습데이터를 가지고 있다고 가정합시다. feature의 종류는 (방위각, 고도 각, 광원의 방위각, and intrinsic properties (shape, texture, etc)) 입니다. 앞의 3개의 feature를 각각 $z_1, z_2, z_3$라고 인코딩했다고 하겠습니다.</p>
<p>미리 mini-batch가 오직 한 개의 variable만 변하도록 데이터를 구성합니다. 예를 들어 elevation angle만 변할 수 있도록 구성하는 것입니다. 다음과 같은 procedure를 통해 모델은 학습됩니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/e4798800-5dc6-4813-8af6-06e9ca11728c/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 9]</span></p>

<ol>
<li>{방위각, 고도 각, 광원의 방위각, 고유 속성} 중 하나에 해당하는 잠재 변수 $z_{train}$을 무작위로 선택합니다.</li>
<li>$z_{train}$에 해당하는 피쳐만 변하는 mini-batch 중에서 하나를 선택합니다.</li>
<li>mini-batch를 모델의 input으로 사용하여, 각각의 벡터 값을 알아냅니다.</li>
<li>배치 전체에서 벡터들의 평균을 계산합니다.</li>
<li>Decoder로 들어가기 전에, <strong>1번</strong>에서 결정한  $z_{train}$ 차원이 아닌 다른 차원의 값들($z_i\neq z_{train}$)은 <strong>4번</strong>에서 구한 평균값으로 대체합니다. 이것을 &quot;<em>clamped output</em>&quot;이라고 하겠습니다.</li>
<li>reconstruction error값을 계산하고, SGVB에 따라 decoder에 back-propagation 해줍니다.</li>
<li>$z_i\neq z_{train}$ 의 gradient값을 평균값과의 차이로 대체합니다. $z_{train}$의 gradient는 그대로 통과됩니다.</li>
<li>수정된 gradient 값으로 encoder를 학습시킵니다.</li>
</ol>
<p>intrinsic representation의 경우 $z_1, z_2, z_3$와 달리 매우 고차원이므로, 더 많은 학습이 요구됩니다. 따라서 논문의 저자들은 1:1:1:10의 비율로 모델을 학습했다고 합니다.</p>
<p>즉 한 번에 하나의 transfomation만 사용하여 학습함으로써, disentanglement를 시도하였습니다. 또한 하나의 변환을 보장하기 위해 선택된 차원을 제외하고는 평균과의 차이 값으로 하였습니다</p>
<h3 id="results">Results</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/80087c9f-e196-4e2e-9a8d-7846464307e3/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 10] *Kulrarni, Tejas D., et. al. 2015.*</span></p>


<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/3c414688-0818-494f-8556-dcd23fb3ab89/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 11] *Kulrarni, Tejas D., et. al. 2015.*</span></p>
---

<h1 id="2-infogan-interpretable-representation-learning-by-information-maximizing-generative-adversarial-nets">[2] InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets</h1>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/9b0f8f02-5975-4c39-ba55-d16a48214618/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 12] InfoGAN 요약</span></p>

<h3 id="특징-1">특징</h3>
<ul>
<li>Mutual Information을 최대화하도록 학습함.</li>
<li>GAN architecture를 사용함.</li>
</ul>
<h3 id="objective-1">Objective</h3>
<p><em>A disentangled representation should be helpful for the relevant but unknown tasks.</em></p>
<p>이에 따라 InfoGAN은 interpretable하고 meaningful representations을 만들어내기 위해 GAN의 구조를 사용하였습니다. 또한, 상호정보량(mutual information; MI)을 최대화하도록 하여 모델을 학습하였습니다.</p>
<p>InfoGAN 자체는 매우 간단하지만, 다양한 데이터셋에서 매우 효과적인 결과를 보여주었다고 합니다. 결과적으로 disentanglment 학습에 MI cost가 효과적이였음을 보여준 것이죠.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/729467b0-fc60-4337-9e0d-48296aeea0ba/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 13]</span></p>

<p>the generator distribution: $P_G(x)$</p>
<p>the real data distribution: $P_{data}(x)$</p>
<p>a generator: $G$</p>
<p>a discriminator: $D$</p>
<p>a noise variable: $z$</p>
<p>모델에 사용된 GAN을 간단하게 표현하자면 <strong><em>Figure 13</em></strong>과 같이 표현할 수 있습니다. 우리는  $P_G(x)$가 $P_{data}(x)$를 approximate하기를 원합니다. 따라서 $z\sim P_{noise}(z)$를 변형하여 $P_G$로부터 샘플 이미지를 생성할 수 있는 $G$를 학습시키게 됩니다. 이때, $G$는 $D$와 minmax game을 하며 경쟁적으로 모델을 학습하게 되며, $D$는 $P_G$와 $P_{data}$를 구별하기를 원합니다. 이를 수식으로 정리하자면 다음과 같습니다.</p>
<p>$\min_G \max_D V(D,G)=\mathbb{E}<em>{x\sim P</em>{data}}[\log D(x)]+\mathbb{E}_{z\sim noise}[\log(1-D(G(z))]$</p>
<p>위 식에서 볼 수 있듯이, GAN은 $z$에 아무런 제약조건을 주지 않습니다. 따라서 $z$는 entangled vector일 것입니다.</p>
<h3 id="key-idea1">Key idea1</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/6176f3bb-ff5f-4f08-8af8-634c40aaf52f/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 14]</span></p>




<p>기존 GAN과 다르게, InfoGAN은 noise vector $z$ 뿐만 아니라 latent code $c$라는 벡터를 만들었습니다. 따라서 모델의 input은 <strong><em>Figure 14</em></strong>의 오른쪽 그림과 같이 두 개입니다. 이 때, latent codes를 $c_1, c_2, ..., c_L$이라고 표기하는데, 독립 가정을 하여  $P(c_1, c_2, ..., c_L)=\prod_{i=1}^{L}P(c_i)$가 성립합니다. </p>
<p>그러나 기존 GAN의 $c$만 추가한다고 해서 학습이 우리가 원하는 방향으로 이루어지는 것은 아닙니다. 모델이 $P_G(x|c)=P_G(x)$를 만들어 내기 위해 $c$를 무시하고 학습을 할 수 있기 때문입니다. 이를 위해 저자들은 <strong>information-theoretic regularization</strong>을 제안하였습니다. 이것은 latent codes c와 disribution G(z,c)의 상호정보량을 높이는 방식입니다. 즉, $I(c; G(z,c))$ 값을 높게 하는 것이죠.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/769cbd67-ff47-49dc-b547-d663df0ff8ba/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 15] Mutual information From Wikipedia, the free encyclopedia</span></p>

<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/e050fca6-f862-4e12-9789-35e6668299e2/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 16]
</span></p>


<p><strong><em>Figure 16</em></strong>를 보면, 두 개의 변수들이 독립이라면 상호정보량  $I=0$이 됩니다. 따라서 Info GAN은 이 값을 maximize하도록 목적함수를 설계한 것입니다.</p>
<p>이를 정리하면 다음과 같습니다.</p>
<p>$\min_G \max_D V_I (D,G)=V(D,G)-\lambda I(c;G(z,c))$ —— <strong>(1)</strong></p>
<h3 id="training-1">Training</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/1c8e6bcc-a4d8-4d1d-a475-06c30928a01e/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 17] Chen, Xi, et al. 2016.</span></p>
아직, InfoGAN이 끝나지 않았습니다. ☹️

<p>위의 식 (1)을 그대로 사용한다면, 한 가지 문제가 있습니다. 어떤 문제가 있을까요?</p>
<p>상호정보량은 이전 관측 $x$를 통해 새로운 관측 $y$의 불확실성이 얼마나 제거 되는가에 대한 척도라고 할 수 있습니다. 즉 <strong><em>Figure 16</em></strong> 에서 볼 수 있듯이 $P(c|x)$이 필요합니다. 따라서 저자들은 <em>Variational Information Maximization</em> 테크닉을 이용하여 $P(c|x)$를 approximate 하기 위한 lower bound를 구합니다.</p>
<p><strong><em>Figure 17</em></strong> 에서 3번째→ 4번째는 trivial하기 때문에 생략하고, 1번째→2번째에 대해 살펴보겠습니다. 해당 내용은 InfoGAN의 Appendix에 있습니다. 이해를 돕기 위해 외부 자료를 참고하였습니다. 🙂</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/41b5a62a-4c22-4e8c-9ea8-2f6ab8eb6299/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 18] 임성빈 박사님, [학부생의 딥러닝] GANs | InfoGAN : Information maximizing GAN, 하우론 브레인</span></p>

<p>(Wikipedia, *Fubini theorm: 이중 적분은 두 번의 일변수 적분을 통해 구할 수 있고, 이는 두 변수에 대한 적분의 순서와 무관하다는 정리)</p>
<p>따라서 최종 목적함수는 다음과 같습니다.</p>
<p>$\min_{G,Q} \max_D V_{InfoGAN} (D,G,Q)=V(D,G)-\lambda L_1(c;G(z,c))$  </p>
<h3 id="results-1">Results</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/11df4228-4550-4d8c-a21b-2dcbdd17c8b0/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 19] Chen, Xi, et al. 2016.</span></p>

<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/d8e1e3e0-6c8f-40b9-8281-4afa59773947/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 20] Chen, Xi, et al. 2016.</span></p>

<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/1f0aba33-9971-4562-9b1d-ca3dc5bd2965/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 21] Chen, Xi, et al. 2016.</span></p>

<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/4bf9035f-c872-4840-9643-2ace1acb1f54/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 22] Chen, Xi, et al. 2016.</span></p>

<hr>
<h1 id="3-beta-vae-learning-basic-visual-concepts-with-a-constrained-variational-framework-beta-vae">[3] beta-VAE: Learning basic visual concepts with a constrained variational framework ($\beta$-VAE)</h1>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/9ecc3fcb-c5d9-4b0a-ab2d-11d8e2c97330/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 23] Yong-min Shin, GNN-YYK, beta-VAEs</span></p>

<h3 id="특징-2">특징</h3>
<ul>
<li>VAE 구조를 사용함.</li>
<li>Adjustable hyperparameter인 $\beta$를 추가함.</li>
<li>code vector 크기에 제한이 없음.</li>
<li>Disentanglement의 정도를 quantitatively 비교하기 위한 프로토콜을 개발함.</li>
</ul>
<h3 id="objective-2">Objective</h3>
<p>disentanglemet의 대표적인 모델 중 한가지는 infoGAN이라고 할 수 있습니다. 그러나 infoGAN은 여러 한계점이 존재합니다. 저자가 언급한 info GAN의 단점은 (1) 다양하고 큰 데이터셋에는 적용하기 힘들다. (2) noize variables의 수에 민감하다. 등등이 있습니다.</p>
<p>이러한 문제를 해결하기 위해 저자들은 $\beta$-VAE를 제안하였습니다. 모델 하이퍼파라미터인  $\beta$를 조절함으로써 disentanglement의 정도를 조절할 수 있습니다.</p>
<h3 id="key-idea">Key idea</h3>
<p>images: $x \in \mathbb{R}^N$</p>
<p>two sets of ground truth data generative factors: $v; and ;w$</p>
<p>conditionally independent factors: $v \in \mathbb{R}^K, where \log p(v|x)=\sum_k \log p(v_k|x)$</p>
<p>conditionally dependent factors: $w \in \mathbb{R}^H$</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/284d1463-c553-4be7-b59f-7413e0163cf8/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 23] Yong-min Shin, GNN-YYK, beta-VAEs</span></p>

<p>저자는 이미지를 생성하기 위한 모델을 <em>Simulator</em>라는 말로 표현하고 있는 것 같습니다. 따라서 우리는 image $x$가 $\mathbf{Sim}(v,w)$로 부터 생성되었다고 <U>가정합니다</U>.</p>
<p>기존 VAE와 어떻게 달라졌는지 살펴봅시다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/a31e8709-535c-4813-8053-3af78bfc926f/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 24] Higgins, Irina, et al. 2017
</span></p>

<p><strong>(1)</strong> 모델은 data x와 latent factors z의 결합 분포를 학습할 수 있습니다. 이 때 z는 x를 생성할 수 있는 factor겠죠?  즉, $p(x|z) \approx p(x|v,w)=\mathbf{Sim}(v,w)$ 입니다. 따라서 수식(1)을 maximize하길 원합니다.</p>
<p><strong>(2)</strong> VAE에서 공부했듯이, 우리는 $q_\phi (z|x)$로부터 $z$의 분포를 추정합니다. </p>
<p>중요한 것은, $q_\phi (z|x)$가 disentanglement part인 $v$를 잘 capture해야 합니다. v를 제외한 나머지 part가 w라고 생각할 수 있습니다. 이를 보장하기 위해, $q_\phi (z|x)$가 $p(z)$와 match 되게끔 constraint을 걸게 됩니다. </p>
<p>이렇게 제약조건을 걸면, </p>
<ul>
<li><strong>latent information bottleneck의 capacity를 컨트롤할 수 있고</strong>, </li>
<li><strong>independent</strong>(disentaglement factor)를 실현할 수 있습니다.  </li>
<li><del>(v에 대한 직접적인 텀은 없다. 용량 제한을 주다보니, 그 공간 안에서 이미지를 잘 생성해내기 위한 파라미터를 학습하기 위해 disentanglement가 가능한 느낌이다.)</del>*</li>
</ul>
<p>이는 $p(z)\sim \mathcal{N}(0, I)$를 가정하면 조건부 최적화 문제로 풀 수 있습니다.</p>
<p><strong>(3)</strong> 수식 (2)를 KKT 조건 하에 라그랑지안으로 풀면 <strong>(3)</strong>을 얻게 됩니다. (KKT 조건을 만족한다고 가정했기 때문에 (2)의 최적 솔루션이 (3)의 최적 솔루션을 구하는 것과 같음을 알 수 있습니다.)</p>
<p>눈치채셨겠지만, 논문 제목의 beta 파트가 여기서 등장하게 됩니다. 😉</p>
<p>여기서 KKT multiplier $\beta$는 latent information channel $z$를 통제하는 regularization coefficient가 됩니다. </p>
<p><strong>(4)</strong> KKT 조건의 the complementary slackness(KKT 조건 중 하나)에  따라 $\epsilon$ ≥ 0이므로, 최종적으로 lower bound <strong>(4)</strong>가 나오게 됩니다.</p>
<p>beta의 효능 💪:</p>
<ul>
<li>Disentanglementd의 정도를 조절할 수 있음.</li>
<li>beta = 1, Vanila VAE와 동일함.</li>
<li>beta &gt; 1, 더 효율적인 latent representation을 찾기 위해 학습함. (regularize term이 강화됨.)</li>
<li>학습이 비교적 안정적임.</li>
</ul>
<p>최종 목적식 <strong>(4)</strong>에서도 알 수 있듯이, 실제로 v, w는 가정일 뿐 conditionally independent factors $v$, conditionally dependent factors $w$에 관여하는 텀은 없습니다. </p>
<p>결국 제약조건으로 인해 등장한 $\beta$ 텀을 잘 조절하며 학습하면, z가 v, w로 분해가 되는 것입니다. 이러한 이유로 InfoGAN의 한계점을 커버할 수 있다고 말한 것 같습니다. </p>
<p>따라서 전반적인 모델 구조에 대한 코드는 다음과 같이 심플합니다.</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/c153babc-0843-4558-b914-b3125be9d6e5/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 25] 1Konny, "Pytorch implementation of β-VAE", Github.
</span></p>

<p>Disentanglement의 Metric에 관하여 해당 논문의 section 3에서 소개하고 있습니다만, 
생략하도록 하겠습니다. 😂</p>
<h3 id="results-2">Results</h3>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/e79d2c2f-2dab-4e0b-85a7-33c0ee18d02f/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 26] Higgins, Irina, et al. 2017</span></p>

<p>오늘 다룬 모델들을 베이스라인으로 하여 비교하고 있네요!</p>
<p align="center">
  <img src="https://images.velog.io/images/simba-pumba/post/4bf8f2fe-1583-4980-bc6c-0f8b41af4727/image.png" alt="text" width="number" />
  <span style = "color : gray">[Figure 27] Higgins, Irina, et al. 2017</span></p>

<p>1개의 latent 값을 바꿨을 때 1개의 특징만 변하고 있는 것을 볼 수 있습니다.</p>
<h1 id="결론">결론</h1>
<p>최신 논문들을 다루지 않아 조금 아쉽지만, 어느정도 disentanglement와 친해지셨길 바라겠습니다. 🙂</p>
<p>읽어주셔서 감사합니다.</p>
<h1 id="reference">Reference</h1>
<p><span style = "color : gray">해당 글은 연세대학교 <a href="https://www.notion.so/GNN_YYK-0303f11d4fa0433792562333dea173a3">신용민</a>님의 도움을 받아 작성하였습니다.</span></p>
]]></description>
        </item>
    </channel>
</rss>