<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>tobigs_xai.log</title>
        <link>https://velog.io/</link>
        <description>투빅스 XAI 세미나</description>
        <lastBuildDate>Sat, 17 Jul 2021 13:28:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>tobigs_xai.log</title>
            <url>https://images.velog.io/images/tobigs_xai/profile/d6d86260-2ff6-488d-8c69-586d7edf4f33/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. tobigs_xai.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/tobigs_xai" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[10 주차] 논문 리뷰 - Matching Networks for One-Shot Learning]]></title>
            <link>https://velog.io/@tobigs_xai/10-%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Matching-Networks-for-One-Shot-Learning</link>
            <guid>https://velog.io/@tobigs_xai/10-%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Matching-Networks-for-One-Shot-Learning</guid>
            <pubDate>Sat, 17 Jul 2021 13:28:59 GMT</pubDate>
            <description><![CDATA[<p>작성자: 투빅스 15기 김태희</p>
<blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Introduction</li>
</ol>
</blockquote>
<ol>
<li>Objective</li>
<li>Model Architecture</li>
<li>Training Strategy</li>
</ol>
<p>[9주차] 강의들에서 나온 N-Shot Learning을 할 때 사용하는 Episodic Learning을 제안한 <a href="https://arxiv.org/abs/1606.04080">Matching Networks for One Shot Learning</a> 논문 리뷰이다.</p>
<h1 id="0-introduction">0. Introduction</h1>
<p>딥러닝 모델은 데이터의 양에 비례해 그 성능을 보여주는 경향이 있다. Neural Neet 구조가 깊어질수록 더 많은 파라미터들을 학습해야 하기 때문에 뛰어난 성능을 위해서는 더 큰 규모의, 양질의 데이터와 모델을 훈련시킬 수 있는 컴퓨팅 자원 여부가 필수적이다. 현실에서는 양질의, 균등한, labelled된 데이터를 구축하는 비용이 많이 들기도 하고 또 데이터가 균등하게 분포하는 것이 거의 불가능하기 때문에 데이터가 적은 class들을 잘 구별하지 못하는 overfitting 문제들이 빈번하게 발생하게 된다. </p>
<p>이를 해결하기 위해 다양한 Data Augmentation 방법들과 weight decay 등을 통한 Regularization 방법들이 연구 되었지만, 다량의 데이터를 학습시키는 시간적인 비용이 많이 든다는 점은 변하지 않는다. 해당 논문에서는 수백만개의 파라미터들을 천천히 학습하는 딥러닝 모델의 parametric한 성질을 해결하고자 하며, non-parametric 방법을 응용해 적은 양의 데이터로 빠르게 학습을 진행하는 방법을 모델 구조와 학습 방법의 관점에서 제안한다.</p>
<blockquote>
<p><strong>Non-Parametric Model</strong>
말 그대로 파라미터가 정해져 있지 않은 모델이다. 신경망 모델을 학습한다고 했을 때, 보통의 경우 학습을 진행하며 업데이트 해 나가야 하는 파라미터의 종류와 수는 정해져 있다. 이는 데이터의 적고 많음을 떠 학습해야 하는 파라미터의 수가 정해져 있는 것이다. 
그러나 KNN 과 같은 Non-Parametric Model은 데이터의 분포를 가정하고 시작하지 않기 때문에 모델을 학습할 때 튜닝해야 하는 파라미터들이 정해져있지 않다.</p>
</blockquote>
<p>N-Shot Learning 은 limited data를 가지고 학습을 진행하고자 나온 방법이다. N은 하나의 class 에 대해 학습할 수 있는 데이터가 N 개만 있을 때를 의미한다.</p>
<ul>
<li>Zero-Shot Learning: class에 해당하는 데이터가 존재하지 않을 때</li>
<li>One-Shot Learning: class당 1개의 데이터가 존재할 때</li>
<li>Few-Shot Learning: class 당 2-5개의 데이터가 존재할 때 </li>
</ul>
<p>N-Shot Learning과 같이 메타러닝은 한 사람이 비슷한 그림 몇 개를 통해 그 특징을 파악하고, 유사한 그림들을 분별하는 방식을 기계에 적용하기 위해 연구되고 있는 분야이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/f6771dd7-3bf6-48a2-bf04-73a48625ba7c/image.png" alt="">
해당 논문에서는 적은 수의 데이터, 한 클래스 당 하나의 데이터가 있는 one-shot learning을 설명한다. </p>
<h1 id="1-objective">1. Objective</h1>
<ul>
<li>거리 기반 모델 architecture 제안</li>
<li>대부분 메타러닝에서 학습 방법으로 많이 쓰는 Episodic Training 제시</li>
<li>대량의 큰 ImageNet 데이터셋을 가공하여 miniImageNet 제공</li>
</ul>
<h1 id="2-model-architecture">2. Model Architecture</h1>
<p>다음은 이 논문에서 제시한 Episodic Training을 4-way 1-shot으로 진행하는 모습을 나타낸 그림이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/3f97109b-3cc7-4cf8-9f8e-61d0ce0d92d1/image.png" alt=""></p>
<p>왼쪽의 그림 4가지가 학습시 사용하는 Support Set, 오른쪽 하단의 이미지가 test시 사용하는 Batch set에 해당한다. Batch set이 어떤 label인지 attention값을 통해 가중치를 주며, 가장 높은 가중치에 대해 확률값을 구해 classification 을 진행한다.</p>
<p>위의 모델을 뜯어보면 크개 Matching Networks, Attention Kernel, Full Context Embedding으로 이루어진다. </p>
<p><strong>Matching Networks</strong>: External memory를 추가한 neural network구조이다. </p>
<blockquote>
<p>ex) attention mechanism을 적용한 seq2seq, memory network, pointer network</p>
</blockquote>
<p>$\hat{y} = \sum_{i=1}^k{a(\hat{x}, x_i)y_i}$</p>
<p>위는 Support set과 batch set을 input으로 넣어주었을 시 batch set에 어떤 label을 부여할지 확률 값을 구하는 식이다. 먼저 Support set의 데이터 $x_i$ 와 Batch set의 $\hat{x}$ 에 대해 Kernel Density Estimator로 거리 기반의 값을 계산한다. 그 다음 Support set $y_i$ 에 대해 mapping 함으로써 확률을 구한다.</p>
<p>Kernel Density Estimator는 <strong>Attention Kernel(a)</strong> 을 통해 $x_i$와 $\hat{x}$의 유사도를 구한다. </p>
<p>$a(\hat{x}, x_i) = \dfrac{e^{c(f(\hat{x}), g(x_i))}}{\sum_{j=1}^k{e^{c(f(\hat{x}), g(x_i))}}}$</p>
<p>해당 논문에서 $x_i$와 $\hat{x}$의 유사도를 구한 식은 위와 같다. 임베딩 function들로 $f$, $g$가 각각 batch, support set에 대해 feature를 뽑는다. 이들의 코사인 유사도를 계산한 후, softmax 함수를 통해 kernel density estimator를 구하게 된다. </p>
<p>임베딩 function $f$, $g$</p>
<ul>
<li>동일하게 설정 가능</li>
<li>별도로 학습 진행해도 가능 (from scratch)</li>
<li>Pretrained 모델 이용 가능 (VGG, ResNet, ...)</li>
</ul>
<p><strong>Full Context Embedding</strong>
위와 같이 $f$, $g$로 임베딩을 진행할 시 각각의 support set에 대해 임베딩을 진행한 후 distance를 계산하기 때문에 전체 support set이 고려되지 않는다. 이 문제를 해결하기 위해 $g(x_i)$,$f(\hat{x})$를 $g(x_i, \mathcal{S})$, $f(\hat{x}, \mathcal{S})$로 수정해 전체 support set을 고려하도록 설계하였다. </p>
<p>Support set 내부적으로는 서로 서로 유사한 $x_i$와 $x_j$가 있을 때 이를 고려하며 각각을 임베딩할 수 있으며, batch set을 임베딩하는 $f$가 $\mathcal{S}$를 고려하도록 다음과 같은 LSTM 구조를 사용하였다. </p>
<p>$f(\hat{x}, \mathcal{S}) = \text{attLSTM}(f^\prime(\hat{x}), g(\mathcal{S}), K))$</p>
<h1 id="3-training-strategy">3. Training Strategy</h1>
<p>일반적으로 지도학습에서는 Batch Training을 많이 사용한다. 그러나 적은 데이터로 학습을 진행할 때에는 overfitting이 쉽게 일어나 학습이 잘 일어나지 않게 된다. 이 현상을 해결하기 위해 논문에서는 <strong>Episode Training</strong> 방식을 제시한다.</p>
<ul>
<li>Training시 Test할 때와 유사한 episode를 구성해 overfitting을 방지한다.</li>
<li>Training set: Support Set($S$)와 Batch Set($B$)으로 구성</li>
</ul>
<p>위 그림은 2-way 4-shot learning의 예시이다.
학습 데이터셋 안에서 학습할 Support Set($S$)과 Test로 가정하는 Batch Set으로 구성이 되어 있으며, Support Set($S$)에서는 하나의 class당 4개(4-shot)의 sample들을 가지고 있다. </p>
<p>첫 번째 episode에서 고양이와 새에 대해, 다음 episode에서는 꽃과 새에 대해 학습을 한 후 해당하는 batch가 어떤 class인지 맞추는 식으로 학습을 진행한다. 최종적으로 test할 시 한 번도 보지 못한 개와 수달에 대해 2-way 4-shot task를 진행하게 되고, 학습 중 한 번도 보지 못한 &#39;개&#39;라는 class에 대해 classification을 진행하게 된다. </p>
<p><strong>N-way, k-shot</strong></p>
<ul>
<li>N: class 수</li>
<li>k: sample 수</li>
<li>kN: Episode에서의 데이터 수</li>
<li>Support Set$(\mathcal{S}) = {(x_i, y_i)}_{i=1}^k$</li>
<li>Batch Set$(\mathcal{B}) = {(x_i^{<em>}, y_i^{</em>})}_{i=1}^k$</li>
<li>$L$: Label</li>
<li>$T$: Task</li>
</ul>
<p>$\theta = \arg{\max_\theta{\mathbb{E}<em>{\mathcal{L} \sim T}[\mathbb{E}</em>{S \sim \mathcal{L}, B \sim \mathcal{L}}[\sum_{(x,y) \in B}{\log{P_\theta(y \vert x, S)}}]]}}$</p>
<ol>
<li>Task으로부터 어떤 Label을 할 지 sampling</li>
<li>해당하는 label을 가지는 $\mathcal{S}$ 와 $\mathcal{B}$를 구성</li>
<li>$\mathcal{S}$ 에 있는 데이터를 통해 $\mathcal{B}$에 있는 데이터의 라벨값을 예측</li>
<li>예측한 확률 값으로부터 계산된 loss로 meta learner 업데이트 </li>
</ol>
<p>위 과정으로 학습을 진행할 시 각 episode에서는 test할 때의 환경과 유사한 환경에서 학습을 진행하게 된다. 이 때문에 Meta Learning은 <strong>Learning to Learn</strong>이라고도 불려진다.</p>
<p>참고자료:
<a href="https://arxiv.org/abs/1606.04080">Matching Networks for One Shot Learning</a> 
<a href="http://dsba.korea.ac.kr/seminar/?mod=document&amp;uid=63">고려대학교 DSBA Seminar</a>
<a href="https://github.com/karpathy/paper-notes/blob/master/matching_networks.md">https://github.com/karpathy/paper-notes/blob/master/matching_networks.md</a> </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[10주차] (MAML) Model-agnostic Meta Learning for Fast Adaptation of Deep Networks 논문 리뷰]]></title>
            <link>https://velog.io/@tobigs_xai/10%EC%A3%BC%EC%B0%A8-MAML-Model-agnostic-Meta-Learning-for-Fast-Adaptation-of-Deep-Networks-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@tobigs_xai/10%EC%A3%BC%EC%B0%A8-MAML-Model-agnostic-Meta-Learning-for-Fast-Adaptation-of-Deep-Networks-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Wed, 30 Jun 2021 09:49:41 GMT</pubDate>
            <description><![CDATA[<h1 id="model-agnostic-meta-learning-for-fast-adaptation-of-deep-networks-review">Model Agnostic Meta-Learning for Fast Adaptation of Deep Networks review</h1>
<h2 id="1-introduction">1. Introduction</h2>
<p>MAML의 키워드는 <strong>&#39;Model Agnostic&#39;</strong>과 <strong>&#39;Fast adapation&#39;</strong>입니다.</p>
<p><strong>Model Agnostic</strong>은 모델에 상관없이 적용 가능하다는 의미로, gradient descent방식을 사용하는 모든 모델에 MAML을 적용 가능하다는 의미입니다.
<strong>Fast adaptation</strong>은 새로운 task를 빠르게 (적은 update) 학습할 수 있다는 의미로, 메타러닝의 핵심 개념에 해당합니다.</p>
<p>MAML은 여러 task에 대해서 적합한(broadly suitable for many tasks) 모델을 학습하면 세부 task 에 적용할 때 fine-tuning 과정이 빠를 것이라는 아이디어에 기반합니다.</p>
<p>메타러닝의 3가지 접근 방식 중 Optimization-based 방식에 해당합니다.</p>
<h2 id="2-model-agnostic-meta-learning">2. Model Agnostic Meta-Learning</h2>
<p>자료 출처 : <a href="http://dmqm.korea.ac.kr/activity/seminar/265">DMQA 세미나</a>
MAML 알고리즘은 9주차에서 다루었던 것과 같습니다.</p>
<p><img src="https://images.velog.io/images/yeeun0501/post/e728ceca-d373-4541-8844-e6fd183bb324/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/84b7bda3-2400-4caf-8514-f7090d132a4a/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/1f698a40-269b-479c-ae76-48f775254b98/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/034c51ec-7262-4fb7-a40e-dd093f6548f5/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/121ea2e0-0852-40e3-8574-3cbc1dae579a/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/00a3dbc0-2553-4be0-b16d-efd2028e98f2/image.png" alt=""></p>
<p>MAML의 구체적인 학습 목표는 개별 task에서 계산된 Loss의 합을 최소화하는 것입니다.
<img src="https://images.velog.io/images/yeeun0501/post/246f877f-64bd-45b2-951a-4e2c4973f500/image.png" alt=""></p>
<p>MAML 알고리즘은 어떠한 내재된 representation이 다른 태스크에 더 잘 적응할 수 있는 (transferrable, broadly applicable) 성질을 가질 수도 있지 않을까 라는 생각에서 출발하였습니다. 예를 들면, 어떠한 representation은 각각의 task 측면보다 general한 측면에서 더 적절할 것입니다. (실제로 $\theta$ 파라미터가 이것에 해당합니다.)
논문의 표기법을 따르자면, 모든 task의 분포 &#39;P(t)&#39;의 representation을 찾는다는 것입니다.</p>
<p>그런 representation이 존재한다면, 그것을 어떻게 찾을 수 있을까요?
모델이 gradient 기반 학습 방식으로 fine-tuned 될것이기 때문에 gradient learning 방식이 개별 task에 대해서 크게 변화하는 방식으로 모델을 학습시켰다고 합니다. 즉, 모델 파라미터는 task의 변화에 대해 민감해서 파라미터의 작은 변화가 개별 task의 loss에 큰 향상을 주는 방식입니다. 
파라미터가 task의 변화에 민감하면 새로운 task를 마주했을 때 적은 데이터만으로도 adaptation이 가능할 것입니다.</p>
<p>결국은 파라미터 $\theta$를 최적화하는 것이기 때문에 모델의 최적화는 새로운 task에서 적은 수의 gradient step이 해당 task에 대해 가장 효과적인 향상을 이끌어내도록 하였습니다. (메타러닝의 기본 목적과 같은 맥락)</p>
<h2 id="3-species-of-maml">3. Species of MAML</h2>
<p>3가지 모델 (Regression, Classification, RL)을 다루는데, loss에만 차이가 있습니다. (line 10의 loss 부분)
<img src="https://images.velog.io/images/yeeun0501/post/749da058-62b3-4b85-aaef-7dde9ef46efa/image.png" alt=""></p>
<h3 id="31-supervised-regression-and-classification">3.1 Supervised Regression and Classification</h3>
<p><img src="https://images.velog.io/images/yeeun0501/post/f36da877-aa52-4eea-9764-9e183f320a9c/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>$x^{(i)}, y^{(i)}$ : input, output pair sampled from task $T_i$ (K-shot 에서 pair가 K개)</p>
<blockquote>
</blockquote>
<p>regression의 경우에는 MSE를 다음과 같이 사용하고,
<img src="https://images.velog.io/images/yeeun0501/post/39f82ca4-e04e-4269-a92c-edef99e94246/image.png" alt="">
classification의 경우에는 cross-entropy loss를 다음과 같이 사용합니다.
<img src="https://images.velog.io/images/yeeun0501/post/9a73d726-4ea7-416e-8b2a-3354756194c9/image.png" alt="">
우리가 알고 있는 MSE와 Cross-entropy가 동일하게 각 task의 데이터에 적용된 형태임을 알 수 있습니다.</p>
<h3 id="32-reinforcement-learning">3.2 Reinforcement Learning</h3>
<p><img src="https://images.velog.io/images/yeeun0501/post/c4beccf7-7935-472d-9a8a-29b6828b191d/image.png" alt=""></p>
<p>RL의 loss함수는 다음과 같습니다.
<img src="https://images.velog.io/images/yeeun0501/post/5b172823-8250-48d9-9aab-fd74f7c0ffa3/image.png" alt=""></p>
<h2 id="5-experimental-evaluation">5. Experimental Evaluation</h2>
<p>다음 3가지 질문에 대해 실험을 진행합니다.</p>
<blockquote>
</blockquote>
<ol>
<li>MAML이 새로운 task를 빠르게 학습할 수 있는가?</li>
<li>MAML이 여러 도메인에 적용될 수 있는가? (회귀, 분류, 강화학습)</li>
<li>MAML로 학습한 모델이 gradient update를 계속할때 더 개선되는가?<blockquote>
</blockquote>
</li>
</ol>
<h4 id="regression-task">Regression task</h4>
<ul>
<li>NN 모델, K = 5, 10, sin 함수를 예측</li>
</ul>
<p>성능 평가를 위해 MAML모델과 메타러닝을 사용하지 않은 Pre-trained 모델로 Few-shot adaptation을 실행시킨 결과를 비교하고 있습니다.
<img src="https://images.velog.io/images/yeeun0501/post/9a240de9-1666-4cc6-bfad-2e098ca1b365/image.png" alt="">
왼쪽의 두 그래프는 MAML 모델의 예측을 나타낸 것이고, 오른쪽의 두 그래프는 pre-trained 모델의 예측을 나타낸 것입니다.</p>
<blockquote>
</blockquote>
<p>연두색 : MAML update 이전 
초록색 : MAML update 후 
빨간색 : Ground truth
보라색 ▲ : test에 사용되는 K개의 data points </p>
<blockquote>
</blockquote>
<p>MAML 모델은 모두 update 이전에는 pre-trained와 유사하게 예측하지만, update 이후에는 ground truth 와 상당히 유사하게 예측하는것을 알 수 있습니다. 반면, pre-trained는 step이 늘어나도 비교적 변화가 작고, ground truth와는 상이합니다.
또한, 보라색 ▲ 데이터가 일부 구간에만 몰려있음에도 불구하고 MAML은 데이터가 없는 구간도 잘 예측하고 있음을 알 수 있습니다. MAML 모델이 sin 함수의 주기성을 잘 파악한 것으로 추정됩니다. (1번 질문에 대한 답)</p>
<p><img src="https://images.velog.io/images/yeeun0501/post/75418117-c91d-4c08-8401-3f140c7389c9/image.png" alt=""></p>
<p>MAML의 Learning curve를 보면 gradient step이 늘어나면서 MAML이 $\theta$에 대해 오버피팅되지 않고 계속 향상되고 있음을 알 수 있습니다. (3번 질문에 대한 답)</p>
<h4 id="classification">Classification</h4>
<ul>
<li>9주차에 등장했던 Omniglot dataset과 MiniImagenet 데이터를 활용하여 실험, CNN 사용
<img src="https://images.velog.io/images/yeeun0501/post/178beb5e-0ea2-4e85-a996-7762ee5da2c2/image.png" alt=""></li>
</ul>
<p>실험 결과는 다음과 같습니다.
<img src="https://images.velog.io/images/yeeun0501/post/4e732a1e-e259-4b32-a182-52386023c73c/image.png" alt="">
비교하는 모델로 다른 메타러닝 방법인 Siamese Networks, Matching Networks 등을 이용했습니다. MAML no conv 모델은 CNN이 아닌 단순 4-layer NN 구조를 사용한 MAML로, MAML의 flexibility를 실험하기 위해 비교하였다고 합니다. MAML이 가장 좋은 성능을 보입니다.
MAML이 Matching networks와 meta-learner LSTM보다 더 적은 파라미터를 사용하는데도 더 좋은 성능을 보입니다.</p>
<h4 id="reinforcement-learning">Reinforcement Learning</h4>
<ul>
<li>2D Navigation, Locomotion</li>
</ul>
<p><img src="https://images.velog.io/images/yeeun0501/post/be7b7138-14e3-443e-b6dd-707516d913a7/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/yeeun0501/post/2887b3c8-a7db-40db-8a48-4ad68f18358d/image.png" alt=""></p>
<h2 id="다른-논문에서의-언급-survey">다른 논문에서의 언급 (Survey)</h2>
<p>Meta-Learning in Neural Networks: A Survey 에서는 16번 언급</p>
<ul>
<li><p>유명한 parameter initialization 방법
<img src="https://images.velog.io/images/yeeun0501/post/8d774b8e-704b-476c-9eab-4731b9823bd6/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/94046ed2-cdfb-4908-8d70-9db4607b8c26/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/4887bbd7-5f50-41e3-8a3b-8d2eca05b168/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/6760f074-2a0f-432f-a66c-1d31a105cb07/image.png" alt="">
<img src="https://images.velog.io/images/yeeun0501/post/2784c2d8-0eb9-471a-bdb0-b4ff52acfbf0/image.png" alt=""></p>
</li>
<li><p>전체 task의 분포를 고려하는 방법 (Optimization 방법)
<img src="https://images.velog.io/images/yeeun0501/post/c2a6f47a-8f0a-46b3-af16-69aedc1aa95c/image.png" alt=""></p>
</li>
<li><p>다양한 관련 후속 연구
Bayesian MAML, Online MAML, combined with autoencoders ... </p>
</li>
</ul>
<p>Initialization 관련해서 언급된 것이 가장 많았고, 굉장히 유명한 논문인 것은 틀림 없습니다. MAML을 이용한 후속 연구도 굉장히 많이 이루어졌습니다.</p>
<blockquote>
</blockquote>
<p>참고자료
<a href="https://chioni.github.io/posts/maml/">https://chioni.github.io/posts/maml/</a>
<a href="http://dmqm.korea.ac.kr/activity/seminar/265">http://dmqm.korea.ac.kr/activity/seminar/265</a></p>
<blockquote>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[9주차] Optimization-Based Meta Learning]]></title>
            <link>https://velog.io/@tobigs_xai/9%EC%A3%BC%EC%B0%A8-Optimization-Based-Meta-Learning</link>
            <guid>https://velog.io/@tobigs_xai/9%EC%A3%BC%EC%B0%A8-Optimization-Based-Meta-Learning</guid>
            <pubDate>Sat, 26 Jun 2021 12:21:08 GMT</pubDate>
            <description><![CDATA[<h2 id="meta-learning">Meta-Learning</h2>
<h3 id="problem">Problem</h3>
<p><img src="https://images.velog.io/images/leejongj/post/4d02331c-e744-4de2-82d5-aef80c2b4b80/image.png" alt="">
mnist dataset같은 경우, 적은 class에 다수의 데이터가 존재하기 때문에 각각의 class에 대하여 충분히 학습을 진행할 수 있었습니다. 하지만, omniglot dataset의 경우, 1623 cahracter(class)에 각각 20개의 instances밖에 존재하지 않습니다. 이러한 문제는 현실세계에서 다수 존재하며, <strong>few-shot discriminative &amp; few-shot generative problems</strong>을 야기하였습니다.</p>
<h4 id="few-shot-learning">Few-Shot Learning</h4>
<p><img src="https://images.velog.io/images/leejongj/post/d826bbd1-c874-407c-8f17-293703c33cda/image.png" alt="">
<img src="https://images.velog.io/images/leejongj/post/ec1b4d03-f9e1-4981-8932-63358c75d1ab/image.png" alt=""></p>
<p>여기서 <strong>5-way</strong>는 <strong>5 class</strong>를 의미하며, <strong>1-shot</strong>은 각 <strong>class별 1개의 data</strong>를 의미합니다. 가지고 있는 데이터를 sampling을 진행하여 각각의 task에 할당하고, trainset, testset으로 나눠 학습시키는 구조입니다.</p>
<h3 id="meta-learning-1">Meta Learning?</h3>
<blockquote>
<p>배우는 것을 위해 배우는 것으로, 학습 자체를 학습할 수 있는 능력을 키우는 것을 의미한다. 여기서 학습이란 <strong>여러 개의 경험</strong>이고, <strong>경험들을 통해 학습의 Performance를 빠르게 향상</strong> 시킬 수 있게 된다.</p>
</blockquote>
<p>인간의 경우, 강아지와 고양이를 구별하는데 많은 데이터가 요구되지 않으며, 이러한 특징들을 다양한 task에 대해서 AI모델에서도 반영하고자 하는 것이 meta learning의 학습방법이라고 말할 수 있습니다.</p>
<h4 id="supervised-learning-vs-meta-learning">Supervised learning VS Meta learning</h4>
<p><img src="https://images.velog.io/images/leejongj/post/96bf53de-56e4-402e-b638-6c284135cbc5/image.png" alt="">
확률 관점에서 supervised learning과 meta learning의 차이점을 파악해보면 다음과 같습니다. supervised learning는 data $x$를 통해 output $y$를 도출하는 함수 $f$를 찾는 것이 목표이며, 이는 곧 데이터가 주어졌을 때, 확률을 높이는 $\displaystyle\theta$를 찾는 것과 동일하다고 말할 수 있습니다. 이에 반해 meta learning의 경우, 모든 task들의 확률을 높이는 meta parameter $\displaystyle\theta$를 찾는 것이라고 말할 수 있습니다. 직관적으로 봤을 대, task가 다르다하더라도, 모든 task들에 대해 모델을 적용했을 때, 가장 잘 설명할 수 있는 값을 찾는 것이라고 이해할 수 있을 것입니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/cac388c9-f60f-4954-ad53-187ab2d52dba/image.png" alt="">
결국, meta learning의 학습 방법은 앞에서의 확률을 적용하는 것이라고 말할 수 있으며, 그러한 확률을 높이는 meta parameter $\displaystyle\theta$를 찾는 것이라고 말할 수 있습니다.</p>
<h3 id="recap-black-box-meta-learning">Recap:: Black-box meta learning</h3>
<h4 id="black-box-meta-learning-adaption">Black-box meta learning adaption</h4>
<p>Black-box meta learning의 알고리즘을 간단히 살펴보면 다음과 같습니다.
<img src="https://images.velog.io/images/leejongj/post/68c14d64-a991-4018-a45b-8fd2d2c4e314/image.png" alt=""></p>
<ol>
<li>여러개의 task들을 생성하고, sample dataset를 구축한다.</li>
<li>구축된 task들에서 train set과 test set으로 나눈다.</li>
<li>주어진 i번째 train set을 통해 $\displaystyle\pi$를 계산한다.</li>
<li>계산을 통해 구해진 $\displaystyle\pi$를 통해 test set에서의 Loss를 연산하면서 $\displaystyle\theta$를 update한다. </li>
</ol>
<p>주목해야할 점은 $\displaystyle\pi$는 연산 과정에서 update되지 않으며, 오직 <strong>meta learning의 parameter인 $\displaystyle\theta$가 학습을 통해 update</strong>된다는 것입니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/38a5361f-8dd2-4548-be5d-b292606518ba/image.png" alt="">
모든 parameter들을 저장하는 것보다, 충분한 정보만을 기억해두는 것이 좀 더 효과적이라고 말할 수 있을 것입니다. 기존의 파라미터 $\displaystyle\pi$를 output으로 도출하는 것보다 task의 정보들을 응축한 저차원의 $h_i$ vector를 output으로 도출합니다. 이는 이전 강의에서 다뤘던, multi task에서 task에 따라 다른 task information을 summmation하는 방법과 유사하다고 볼 수 있습니다.</p>
<p>이러한 black-box meta learning의 경우, <strong>expressive</strong> (다양한 function 적용가능) &amp; <strong>easy to combine with variety of learning problems</strong> (e.g. SL, RL)한 장점을 가지고 있습니다. </p>
<p>하지만, 다양한 데이터를 훈련하고, 다양한 테스트 셋에 대한 예측을 진행한다는 측면에서 <strong>complex model &amp; complex task</strong>의 문제가 발생할 수 있습니다. 직관적으로, meta task들에 대한 학습을 진행하는데 optimization procedure이 무척이나 힘들 것으로 예상됩니다.이러한 이유들 때문에 데이터의 불충분한 현상이 발생하여 model이 잘 학습하지 못하는 경우가 때때로 발생하기도 합니다.</p>
<h3 id="optimization-based-inference">Optimization-Based Inference</h3>
<p><img src="https://images.velog.io/images/leejongj/post/371c3d1e-6306-4f3f-af17-4dbebb398298/image.png" alt="">
<img src="https://images.velog.io/images/leejongj/post/bf8f3e5d-0f0d-4c4d-bce0-978d325e5f07/image.png" alt="">
기본적인 아이디어는 기존의 meta-parameter를 사전정보로 활용하는 것입니다. 쉽게 설명하자면, meta-parameter $\displaystyle\theta$를 fine-tunin의 initialization으로 사용하겠다는 것입니다.</p>
<p>기존의 task parameter를 업데이트 하는 과정에서 pre-tranined parameter를 가져와서 <strong>각각의 task에 맞게 fine-tuning을 하여 optimization하는 것으로 이해</strong>할 수 있습니다. 해당 방식에서의 목적은 <strong>적은 update만으로 $\displaystyle\pi$를 구할 수 있는 $\displaystyle\theta$를 찾겠다</strong>는 것입니다.</p>
<p>pretrained parameter는 vision분야에서는 imageNet classification에서의 parameter, NLP분야에서는 bert의 parameter 등 다양한 공개된 parameter들이 많기 때문에, 이를 가져와서 사용하면 된다고 말합니다.</p>
<h4 id="optimization-based-meta-learning-algorithm">Optimization-Based Meta Learning Algorithm</h4>
<p><em>본 자료는 DMQA seminar의 발표자료를 활용했음을 미리 알려드립니다.</em>
<img src="https://images.velog.io/images/leejongj/post/efbd5704-1c31-48e8-b08f-ce5f0b58c3e7/image.png" alt="">
먼저, pretrained된 parameter $\displaystyle\theta$를 사용하여 trainset를 활용하여 학습한 후에, 그에 맞는 $\displaystyle\pi$를 찾습니다. 그런 다음 testset를 활용하여, 각각의 task의 정보들을 종합하여, 최적의 meta parameter $\displaystyle\theta$를 도출하는 것입니다. 
<img src="https://images.velog.io/images/leejongj/post/03d4689f-78ad-4c97-b81d-d98d2a98a1d6/image.png" alt="">
이러한 방식을 반복하면서 meta-learning의 학습이 진행된다고 생각하시면 됩니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/153ab9ff-1822-4806-8944-d54f930e7616/image.png" alt=""> 앞에서의 black-box adaption 방식과의 진행방식의 차이를 보면 다음과 같습니다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/37a4b9c9-943f-4ed7-abaf-a755be898d47/image.png" alt="">
위의 가정들을 만족할 때,  black-box 접근방식을 통해 얻을 수 있는 representation의 특징을 optimization-based meta learning인 MAML에서도 찾아볼 수 있다고 말하고 있습니다.</p>
<h4 id="results">Results</h4>
<p><img src="https://images.velog.io/images/leejongj/post/bbe8bffd-41bc-40d1-b9fe-1419c67fcf5c/image.png" alt="">
Omniglot dataset의 경우, 1623개의 chracters(class)가 있지만, class의 example은 20개의 데이터만을 가지고 있습니다. 해당 데이터를 5way-1shot 개념을 활용하여 글자의 돌려진 정도, scale한 정도에도 변함없이 다른 모델들에 비해 좋은 성능을 보이는 것을 볼 수 있습니다.</p>
<p><em>참고자료</em>
<a href="http://cs330.stanford.edu/fall2019">http://cs330.stanford.edu/fall2019</a>
<a href="http://dmqm.korea.ac.kr/activity/seminar/265">http://dmqm.korea.ac.kr/activity/seminar/265</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[9주차] Non-Parametric Meta-Learners]]></title>
            <link>https://velog.io/@tobigs_xai/9%EC%A3%BC%EC%B0%A8-Non-Parametric-Meta-Learners</link>
            <guid>https://velog.io/@tobigs_xai/9%EC%A3%BC%EC%B0%A8-Non-Parametric-Meta-Learners</guid>
            <pubDate>Wed, 23 Jun 2021 09:41:54 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/cryingjin">이예진</a></p>
<p>이번 시간에는 <strong>Few-shot learning</strong> 중에서도 Non-Parametric 방법에 대해서 공부해보겠습니다. stanford 대학의 cs330(Multi-Task and Meta-Learning) 강의 중에 <strong>Lecture4.Non-Parametric Meta-Learners</strong> 에 해당합니다.</p>
<blockquote>
<h2 id="학습목표">학습목표</h2>
</blockquote>
<ul>
<li>많은 방법들의 흐름을 파악하고 비교를 할 수 있다.</li>
<li>해다 용어는 알고 있어서 추후에 구글링 해 볼 수 있다.</li>
<li>관련된 용어는 알고 있어서 추후에 논문 읽기에 도움이 될 수 있다. </li>
</ul>
<blockquote>
<h2 id="contents">Contents</h2>
</blockquote>
<h3 id="0-intro">0. Intro</h3>
<ul>
<li>Transfer learning, Multi-task learning, Meta-learning, Few-shot Learning (,Semi-supervised learning)<h3 id="1-non-parametric-methods">1. Non-parametric methods</h3>
</li>
<li>Siamese networks, matching networks, prototypical networks Embed, then nearest neighbors<h3 id="2-case-studynon-parametric-methods">2. Case Study(Non-parametric methods)</h3>
<h3 id="3-properties-of-meta-learning-algorithms">3. Properties of Meta-Learning Algorithms</h3>
</li>
<li>각 접근법 비교</li>
</ul>
<h1 id="0-intro-1">0. Intro</h1>
<p><strong>~ learning</strong>에 대한 개념이 끊임 없이 나오고 few-shot, meta-learning에 대한 다양한 관점을 보고 있기 때문에 각 학습법의 개념에 대해서 짚고 넘어가겠습니다. 
<img src="https://images.velog.io/images/tobigs_xai/post/a4e0be0f-ee8d-4485-808d-0e2a35774d8d/image.png" alt=""></p>
<h2 id="machine-learning-with-limited-data">Machine Learning with Limited Data!</h2>
<ul>
<li>Data augmentation<ul>
<li>Generative models, self-supervised learning</li>
</ul>
</li>
<li>Unsupervised learning</li>
<li><strong>Transfer Learning</strong></li>
<li><strong>Meta Learning</strong> (Learn to learn)<ul>
<li><strong><em>Metric-based approach</em></strong><ul>
<li>Model-based approach(black-box,parameter generation based)</li>
<li>Optimization-based approach</li>
<li>Graph Neural network-based approach</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/c97521ab-bcc8-4d58-8f03-45d9151b8820/image.png" alt=""></p>
<h2 id="transfer-learning">Transfer Learning</h2>
<p><strong>Transfer Learning(전이학습)</strong> : 사전작업(source task)에 대해 학습된 정보를 목표(target task)에 활용하는 방법</p>
<ul>
<li>목표 작업에 대한 수렴속도와 성능 향상</li>
<li>사전 작업 데이터가 충분히 많다면 목표 작업 데이터는 조금 적어도 됨</li>
<li>최근 few-shot classification은 transfer learning의 특별한 경우로 볼 수 있음</li>
<li>-&gt; We transfer knowledge from data set to novel dataset</li>
</ul>
<p><strong>이용하는 법</strong></p>
<ul>
<li><strong>Weight initialization</strong> : 사전 작업에 사용된 구조를 목표 작업 모델에 적용, 사전학습한 모델의 가중치로 초기화 (fine-tuning 할 수도 있고 안할 수도 있음)</li>
<li><strong>Feature Extraction</strong> : 사전 작업에 사용된 구조를 목표 작업을 위한 모델에 적용, 재사용된 구조에 대한 <em>Fine-tuning 하지 않음</em></li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/703f4446-f41f-4793-914e-d4283c13a7cf/image.png" alt=""></p>
<p><strong>분류</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/6c39dab4-89d8-44b8-9262-e0c17fea69b3/image.png" alt=""></p>
<h2 id="multi-task-learning">Multi-task learning</h2>
<p><strong><code>Inductive transfer learning</code> 중에 task 에 대해서 한번에 학습 시키는 방법이 <code>Multi-task learning</code></strong></p>
<ul>
<li>사용이유 : 특정 작업 하나에만 학습하게 될 경우, 해당 작업에만 초점이 맞춰져 있기 때문에 유용하게 사용될 수 있는 정보임에도 놓치는 위험성이 존재함 <code>-&gt; 그냥 한번에 학습시켜서 공유시키자!</code></li>
<li>관련있는 작업들의 표현을 공유함으로써 모델의 일반화 능력 향상 시키는 접근방식</li>
<li>일반적으로 최적화 문제가 <code>하나 이상의 손실함수</code>를 갖는 경우</li>
<li><strong>Meata-learning</strong>은 모든 task가 동일한 task 분포에서 샘플링되는 multi-task learning의 특별한 경우로 볼 수 있음 (모든 task가 동일한 통계 공유)</li>
</ul>
<table>
<thead>
<tr>
<th>Hard parameter sharing</th>
<th>Soft parameter sharing</th>
</tr>
</thead>
<tbody><tr>
<td>작업별 출력레이어를 유지하면서 히든 레이어 공유</td>
<td>각 작업에 대응하는 매개변수를 갖는 고유한 모델 존재</td>
</tr>
<tr>
<td>동시에 학습하는 작업이 많을 수록 과적화될 가능성 낮아짐</td>
<td>각 모델 매개변수 사이의 거리를 정규화하여 각 매개변수가 유사하도록 유도</td>
</tr>
<tr>
<td></td>
<td>Constrained layer들 사용, &quot;공유하는 부분만 공유하자&quot;</td>
</tr>
<tr>
<td>(나머지 내용은 8주차 참고)</td>
<td></td>
</tr>
</tbody></table>
<p><strong><code>Inductive transfer learning</code> 중에 task 에 대해서 순차적으로 학습 시키는 방법이 <code>Sequential Transfer Learning</code></strong></p>
<ul>
<li>Bert pre-trained model을 사용했다~ 의 그 transfer learning임.</li>
<li>자세한 설명 생략</li>
</ul>
<h2 id="few-shot-learning">Few-shot Learning</h2>
<p><strong>Few-shot Learning</strong> : 사전 지식을 활용하여 일반화된 정보를 학습하고, 적은 수의 새로운 테스크 데이터에 적용하는 방법</p>
<ul>
<li><em><strong>N-way K-shot learning</strong></em></li>
<li>일반적으로 성능은 N에 반비례, K에 비례 -&gt; 보통 N은 10이하로, K는 1이나 5로 설정</li>
<li>one-shot learning은 few-shot learning으로 연구되지만 zero-shot learning은 few-shot learning으로 연구되지 않음</li>
<li>few-shot classification은 transfer learning의 특별한 경우로 볼 수 있음</li>
<li>Few-shot과 semi-supervised learning은 교차점(interaction)이 있음</li>
</ul>
<h2 id="-semi-supervised-learning">(+ Semi-supervised Learning)</h2>
<ul>
<li>Few-shot과 semi-supervised learning은 교차점(interaction)이 있음</li>
<li>labeled data와 unlabeled data 모두 사용 (few-shot은 labeled data가 더 제한적)</li>
<li>semi-supervised learning이 사용할 수 있는 labeled data와 unlabeled data가 few-shot 보다 더 많음</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/23edc4d0-d03b-4800-a293-db2b543efece/image.png" alt=""></p>
<hr>
<h1 id="1-non-parametric-methods-1">1. Non-parametric methods</h1>
<h2 id="why">Why</h2>
<p><img src="https://images.velog.io/images/tobigs_xai/post/f050e54f-a2bd-474f-bcd0-a3b551d625e0/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/863817f3-6ae4-4abc-bf2b-7047d6f7f1dc/image.png" alt=""></p>
<h3 id="non-parametric-methods--metric-based-approach">Non-parametric methods == Metric-Based Approach</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/a29ac3ce-01f5-479b-81cf-f5d8f8ffef06/image.png" alt=""></p>
<ul>
<li>근본적이 개념은 nearst neighbors algorithm과 유사함</li>
<li>data가 단순하고 저차원일수록 non-parametric 방법이 잘됨</li>
<li>meta-test time : few-shot learning &lt;-&gt; low data regime</li>
<li>meta-training : still want to be parametric</li>
<li>*<em>효율적인 비모수 학습기를 생성하기 위해서 모수적 메타 학습기를 사용하자 *</em></li>
</ul>
<h2 id="basic">Basic</h2>
<ul>
<li><strong>Key Idea : Use non-parametric learner</strong></li>
<li>test datapoint($x^{ts}$)를 training data($D_{i}^{tr}$)과 비교해서 가장 가까운 training data point의 label을 가져온다.</li>
<li>metric으로 pixel space, l2 distance를 계산하는 방식 대신 <strong>meta-training data</strong>를 이용한다.
<img src="https://images.velog.io/images/tobigs_xai/post/b1c809c7-3cd0-4a69-8bc7-838758658be1/image.png" alt=""></li>
</ul>
<h2 id="algorithms">Algorithms</h2>
<h3 id="siamese-network">Siamese network</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/d4e8e355-c189-43f3-9a91-1a7b4996fd2b/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/56e9801e-00bb-49b3-8acd-43a2fa3e0aa6/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/898f834c-1bdc-4dca-afda-cd3c6ce129f0/image.png" alt=""></p>
<ul>
<li>두 이미지가 동일한 것인지 예측하는 task</li>
<li>이미지쌍을 비교하는 법 배우는 메타러닝 -&gt; 확장해서 두 이미지 사이의 거리를 배울 수 있음</li>
<li>Meta-training : 메타훈련으로는 이진 분류를 배움</li>
<li>Meta-test : 메타 테스트에서 N-way classificationㅇ 이뤄짐</li>
<li>샴네트워크 두개를 사용하고, 네트워크끼리 가중치와 네트워크 파라미터를 공유함
<img src="https://images.velog.io/images/tobigs_xai/post/30e69d69-c266-4302-934d-2eb2c5c3644c/image.png" alt=""></li>
</ul>
<h3 id="matching-networks">Matching Networks</h3>
<ul>
<li>적은 양의 support set(k-shot classification)을 가지고 classifer를 학습시키는 방법</li>
<li>$x^ts$가 들어오면 ouput label y에 대한 probability distribution을 정의한다.</li>
<li>이 때 g(LSTM) 사용으로 context를 반영한 임베딩 값을 사용하고, f는 다시 LSTM을 통해서 test sample x를 encoding한다. (<strong>Full Contextual Embeddings(FCE)</strong>)
<img src="https://images.velog.io/images/tobigs_xai/post/8eda5fcf-d7a3-4f31-a35f-398cb52f0add/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/30772fda-9f2d-4b71-9d58-2b788369ae9a/image.png" alt=""><h3 id="prototypical-networks">Prototypical Networks</h3>
</li>
<li>각 클래스에 대한 데이터(example)이 한 개 이상인 경우, 각 클래스에 대한 정보를 집계(aggregation)하여 사용한다.</li>
<li>$x^{ts}$데이터를 같은 임베딩 공간에 삽입, 각 prototypical class까지 거리 계산</li>
<li>평균이용해서 집계한 후에 거리(d)측정해서 softmax 사용
<img src="https://images.velog.io/images/tobigs_xai/post/6f8a6325-d8b7-4177-a7c5-cc54b2e8c858/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/c914ae9f-aea1-4534-85ea-242a0f1374fd/image.png" alt=""><h3 id="더-복잡한-관계의-데이터들의-임베딩을-위해서는">더 복잡한 관계의 데이터들의 임베딩을 위해서는..</h3>
<img src="https://images.velog.io/images/tobigs_xai/post/f47c06b2-bb4d-4cef-bcf7-3f6585554081/image.png" alt=""></li>
</ul>
<h1 id="2-case-studynon-parametric-few-shot-learning">2. Case Study(Non-parametric few-shot learning)</h1>
<p><strong>cs330 2020 슬라이드 참고</strong></p>
<p><a href="h%5Eps://arxiv.org/abs/1811.03066">Prototypical Clustering Networks for Dermatological Image Classification</a>
<img src="https://images.velog.io/images/tobigs_xai/post/b8476138-b253-4868-9769-249b88c32a2c/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/81d29b19-5679-4ac6-ac59-3554246e52b1/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/f98c54ce-5c10-465f-b79f-c5f50c8e0d56/image.png" alt=""></p>
<hr>
<h1 id="3-properties-of-meta-learning-algorithms-1">3. Properties of Meta-Learning Algorithms</h1>
<p><img src="https://images.velog.io/images/tobigs_xai/post/50bf0e2a-56f9-4972-b84a-1f51025d555a/image.png" alt=""></p>
<h2 id="black-boxmodel-based-vs-optimization-based-vs-non-parametricmetric-based">Black-box(Model-based) vs Optimization-based vs Non-parametric(metric-based)</h2>
<h3 id="computation-graph-관점">Computation graph 관점</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/b71f62d4-2f94-4dd2-8528-ca63619e9800/image.png" alt=""></p>
<h3 id="이외의-네트워크">이외의 네트워크</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/38467cce-674e-4376-b78f-fd82c337a2af/image.png" alt=""></p>
<h3 id="algorithmic-properties-관점">Algorithmic properties 관점</h3>
<p><strong>&#39;표현력&#39;</strong>과 <strong>&#39;일관성&#39;</strong>이 중요</p>
<ul>
<li>확장성, 다른 도메인들로의 활용을 위해서 표현력이 중요</li>
<li>메타러닝이 학습된 절차를 생성해놓으면 OOD(Out-of-distribution) task에도 잘 작용</li>
</ul>
<h3 id="장단점-비교">장단점 비교</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/b47d0914-5729-4d82-a86c-a76cb2b0e15c/image.png" alt=""></p>
<ul>
<li>Uncertainty awareness를 잘 하는 것 -&gt; Basian-based meta-learning</li>
</ul>
<hr>
<h1 id="references">References</h1>
<ul>
<li><a href="https://www.youtube.com/watch?v=bc-6tzTyYcM&amp;list=PLoROMvodv4rMC6zfYmnD7UG3LVvwaITY5&amp;index=4">cs330(Multi-Task and Meta-Learning), Lecture4.Non-Parametric Meta-Learners</a></li>
<li>건국대학교 컴퓨터공학부 인공지능 수업</li>
<li>meta-learning 분류, 
Meta-Learning in Neural Networks: A Survey
Timothy Hospedales, Antreas Antoniou, Paul Micaelli, Amos Storkey</li>
<li>전이학습 그림, <a href="https://www.researchgate.net/figure/Difference-between-Traditional-Machine-Learning-process-and-Transfer-Learning_fig7_326649052">https://www.researchgate.net/figure/Difference-between-Traditional-Machine-Learning-process-and-Transfer-Learning_fig7_326649052</a></li>
<li>전이학습 분류, <a href="https://ruder.io/thesis/index.html">https://ruder.io/thesis/index.html</a></li>
<li>Machine learning with limited data  F Yao ,2021</li>
<li><strong>Meta learning의 광대한 survey 보고 싶다면 Youtube</strong>
<a href="https://www.youtube.com/watch?v=c-ZgGEJ_M8M&amp;list=WL&amp;index=1">https://www.youtube.com/watch?v=c-ZgGEJ_M8M&amp;list=WL&amp;index=1</a></li>
<li><strong>한국어로 현존하는 최고의 정리글</strong>, <a href="https://talkingaboutme.tistory.com/entry/DL-Meta-Learning-Learning-to-Learn-Fast">https://talkingaboutme.tistory.com/entry/DL-Meta-Learning-Learning-to-Learn-Fast</a></li>
</ul>
<hr>
<h1 id="appendix">Appendix</h1>
<h2 id="추가적인-용어-정리">[추가적인 용어 정리]</h2>
<h3 id="휴리스틱"><a href="https://hajunsoo.org/posts/2016-11-14/">휴리스틱</a></h3>
<p>휴리스틱(Heuristic)이란 시간이나 정보가 불충분하여 합리적인 판단을 할 수 없는 경우, 신속하게 사용하는 어림짐작의 기술을 일컫는다. 휴리스틱은 시험과 같은 추정뿐만 아니라 의사결정 문제에서도 자주 사용되는데, 그 중 가장 대표적인 것이 오컴의 면도날 (Occam&#39;s Razor)이다.</p>
<h3 id="오컴의-면도날"><a href="https://hajunsoo.org/posts/2016-11-14/">오컴의 면도날</a></h3>
<p>Frustra fit per plura quod potest fieri per pauciora
같은 현상을 설명하는 두 개의 주장이 있다면, 간단한 쪽을 선택하라</p>
<h3 id="inductive-bias"><a href="https://mino-park7.github.io/nlp/2019/03/18/emnlp-2018-%EC%A3%BC%EC%9A%94-%EB%85%BC%EB%AC%B8-%EC%A0%95%EB%A6%AC/">Inductive bias</a></h3>
<p>bias란 편견이나 offset과 비슷한 의미
여기서 inductive, 즉 <strong>귀납적</strong>이라는 말을 붙여서 기계학습에서의 inductive bias는, 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 추가적인 가정을 의미합니다. (Wikipedia)</p>
<p>기계학습에서는 특정 목표 출력(target output)을 예측하기 위해 학습 가능한 알고리즘 구축을 목표로 하고, 학습 모델에는 제한된 수의 입력과 출력에 대한 data가 주어짐</p>
<p>학습이 성공적으로 끝난 후에, 학습 모델은 훈련동안에는 보이지 않았던 예들 까지도 정확한 출력에 가까워지도록 추측해야하기 때문에 이럴 때 추가적인 가정이 없이는 불가능한데, 이 <strong>Target function의 성질에 대해 필요한 가정</strong>과 같은 것이 Inductive bias라고 볼 수 있음</p>
<p>inductive bias의 예시로 오컴의 면도날이 있음</p>
<h3 id="model-agnostic"><a href="https://elapser.github.io/machine-learning/2019/03/08/Model-Agnostic-Interpretation.html">Model-Agnostic</a></h3>
<p>model-agnostic 하다는 것은 학습에 사용된 model이 무엇인지에 구애받지 않고 독립적으로 모델을 해석할 수 있다는 의미입니다. 즉, 학습에 사용되는 모델과 설명에 사용되는 모델을 분리하겠다는 것입니다. 학습 모델과 설명 모델을 분리하는 것의 가장 큰 장점은 자율성입니다.분석가들은 기존에 자신들이 사용하던 모델들을 그대로 사용할 수 있으며, 어떤 모델을 사용했더라도 동일한 방식으로 해석할 수 있습니다.특히 비슷한 성능을 가지는 여러 모델 중 하나를 선택해야하는 상황이 발생했을 때, 모델을 해석한 결과를 동일한 기준으로 비교하여 객관적으로 더 나은 모델을 택할 수 있게 합니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/f80bc834-8220-4e1a-8edc-d7b53088b70c/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/909324b9-9fc5-436d-9853-eccb42dc06c8/2021.%206.%2023.%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%204_31_19%E1%84%8B%E1%85%B4%20Scannable%20%E1%84%86%E1%85%AE%E1%86%AB%E1%84%89%E1%85%A5.PNG" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[8주차] Meta-learning problem statement, black-box meta-learning]]></title>
            <link>https://velog.io/@tobigs_xai/8%EC%A3%BC%EC%B0%A8-Meta-learning-problem-statement-black-box-meta-learning</link>
            <guid>https://velog.io/@tobigs_xai/8%EC%A3%BC%EC%B0%A8-Meta-learning-problem-statement-black-box-meta-learning</guid>
            <pubDate>Wed, 16 Jun 2021 08:59:15 GMT</pubDate>
            <description><![CDATA[<p>본 파일은 동명의 <a href="https://cs330.stanford.edu/">CS330</a> 의 2주차 강의의 필기 내용입니다.</p>
<p>출처가 적혀 있지 않은 이미지는 모두 강의 PPT에서 발췌하였습니다.</p>
<h2 id="정리">정리</h2>
<p>이 강의는 메타 러닝의 기본적인 내용을 전반적으로 정리하는 강의입니다.</p>
<h2 id="용어-정리">용어 정리</h2>
<p>본격적인 메타 러닝 내용에 들어가기 전에 기본적인 용어와 수식을 정리해 보도록 하겠습니다.</p>
<h3 id="single-task-learning">Single-task Learning</h3>
<p>먼저 우리가 지금 까지 알고 있는 일반적인 학습 방법인 Single-Task Learning (단일 태스크 학습) 입니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/single-task.png" alt="single-task"></p>
<p>Single-Task Learning 은 주어진 데이터 분포 $D$ 가 존재할 때, 이 분포에서 손실 함수 $L$을 최소화 할 수 있는 파라미터 값 $\theta$ 를 찾는 것입니다.</p>
<p> 이때 손실 함수는 우리가 알고 있는 함수 (크로스 엔토로피 등등) 을 포함합니다.</p>
<h3 id="task">Task</h3>
<p>Single-Task, Multi-Task 등등 태스크 라는 말을 많이 사용했는데 Task란 구체적으로 무엇일까요?</p>
<p>본 강의에서 Task는 다음과 같이 정의되어 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/task.png" alt="task"></p>
<p>Task $T$ 는 입력 값 $X$ 에 대해서 입력값의 분포, 입력에 대한 출력값의 분포, 손실 함수 등을 사용하는 과정으로 생각할 수 있습니다.</p>
<p>본 문서에서 Task는 작성 및 의미 파악의 용이성을 위해 &#39;과제&#39; 또는 &#39;태스크&#39;로 병기하겠습니다.</p>
<h2 id="multi-task">Multi Task</h2>
<p>Single Task와 Multi Task의 차이점이 무엇일까요</p>
<p>Single Task의 경우에는 하나의 목표를 수행하는 일반적인 과제입니다.</p>
<p>우리가 지금까지 공부했던 손글씨 인식(MNIST 등등)이나, 주어진 메일이 스팸인지 아닌지 분류하는 기술 등이 있었죠.</p>
<p>여기서 Multi-Task로 넘어가게 되면 분류를 수행하는 영역이 증가한다고 생각할 수 있을 것 같습니다.</p>
<p>앞 예시를 다중 과제로 변경하면 다국어 손글씨 탐지, 개인에게 특화된 스팸메일 탐지입니다.</p>
<p>두 과제 모두 손글씨가 무엇인지, 스팸메일인지 분류하는 것을 넘어서 비슷한 도메인 (국가별 차이, 개인별 차이)가 있는 모든 영역에서 작동하는 특징이 있습니다.</p>
<h3 id="손실-함수">손실 함수</h3>
<p>Multi-Task의 경우 손실함수는 기본적으로 모든 Task에 대해서 동일한 함수가 적용됩니다.</p>
<p>그럼 손실함수가 다른 경우가 있는 것일까요? 아래 두 상황일 때 해당됩니다.</p>
<ul>
<li>분포가 달라서 하나의 손실을 적용하기 어려운 경우</li>
<li>하나의 Task를 다른 것 보다 더 중요하게 생각할 때</li>
</ul>
<h3 id="task-descriptor">Task Descriptor</h3>
<p>Multi-Task 학습의 경우에서는 다양한 과제별로 인공지능을 학습시켜야 하기 때문에 Task descriptor  $z_i$ 를 사용합니다.</p>
<p>task descriptor의 상태에 따라 신경망이 다르게 작동한다고 생각될 수 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/task-flow.png" alt="task-flow"></p>
<p>Task descriptor 는 각각의 과제를 구분하는 데 사용하기 때문에 과제별 특징을 명확하게 구분하는 데이터여야 합니다.</p>
<p>강의에서는 특징을 명확하게 구분하는 데이터를 세 가지로 제시했습니다.</p>
<ul>
<li>task번호의 원-핫 인코딩</li>
<li>task의 메타 데이터</li>
<li>task의 공식적 특징(formal specification)</li>
</ul>
<h3 id="손실-함수-1">손실 함수</h3>
<p>task가 여러 가지가 있는 경우는, 목적함수는 Task들의 손실 함수의 합이 됩니다.</p>
<p>따라서 메타 러닝 문제에서 손실 함수는 다음과 같은 형태를 띄게 됩니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/loss_func.png" alt="loss_func"></p>
<h3 id="메타-러닝의-문제점">메타 러닝의 문제점</h3>
<p>이 경우 두 가지 문제가 발생하는데</p>
<ul>
<li>Z의 조건을 어떻게 설정 (Task Conditioning)?</li>
<li>목적 함수를 어떻게 최적화 할까</li>
</ul>
<h2 id="태스크의-관리-task-conditioning">태스크의 관리 (Task Conditioning)</h2>
<p>태스크 관리는 각각의 과제에서 다루는 내용이 최소한으로 겹치게 구성하는 것을 핵심 내용으로 설정합니다.</p>
<p>이 방법에는 여러 가지가 있는데, 가장 먼저 생각나는 것은 네트워크를 피쳐별로 분할하는 것입니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/task-conditioning.png" alt="task-conditioning"></p>
<p>이 경우 각각의 네트워크는 <strong>파라미터를 공유하지 않은 채</strong> 여러 태스크로 관리되게 됩니다.</p>
<p>이로서 <code>multiplicative gating</code>이라는 효과를 얻을 수 있습니다.</p>
<p>또다른 방법으로로는 각각의 과제별로 입력값이나 활성화 값을 연결하여 하나의 네트워크로 취급하고 학습할 수 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/task-conditioning2.png" alt="task-conditioning2"></p>
<p>이 방법에서는 각각의 과제별로 <strong>공유하는 파라미터와 공유하지 않는 파라미터</strong>가 나뉘어집니다.</p>
<p>따라서 이 방법을 사용할 때의 목적 함수는 다음 식으로 나타낼 수 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/multi-task.png" alt="multi-task"></p>
<p>각각의 $\theta$는 과제별로 쪼개져 $\theta^1 ... \theta^i$ 가 되며 $\theta^{sh}$의 경우는 과제끼리 공유하는 공유 파라미터 입니다.</p>
<p>이 시각으로 볼 때 $z_i$를 설정하는 것은 과제 간 파라미터 공유를 어떻게 할 것인지를 결정하는 문제가 됩니다.</p>
<p>파라미터를 공유하는 Multi-task 문제의 구체적인 방법을 몇개 더 알아보겠습니다.</p>
<h3 id="덧셈-구조">덧셈 구조</h3>
<p>먼저 입력 값에 각 Task Descriminator를 연결 하거나 더해 주는 방법이 있을 수 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/conditioning-choice1.png" alt="conditioning-choice1"></p>
<p>이 둘은 두 개의 기법처럼 보이지만 사실 같은 방법입니다. linear 층을 통과하는 과정에서 값이 하나로 합쳐져 계산되기 때문입니다.</p>
<h3 id="멀티헤드-구조">멀티헤드 구조</h3>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/conditioning-choice2.png" alt="conditioning-choice2"></p>
<p>태스크가 각각 어떻게 공유되는지 특별히 지정된 것이 없는 경우 다음과 같은 방법을 사용할 수 있다고 합니다.</p>
<p>모델을 쪼개서 다양한 Head로 만들어 각각의 층을 통과하고 Shared Layers에 입력합니다.</p>
<h3 id="곱셈적multiplicative-구조">곱셈적(Multiplicative) 구조</h3>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/conditioning-choice3.png" alt="conditioning-choice3"></p>
<p>가장 흔한 방법 중 하나입니다. 덧셈적 구조에서 덧셈을 곱셈으로만 바꾼 구조입니다.</p>
<p>하지만 이 구조는 몇개의 이점을 가집니다.</p>
<ul>
<li>덧셈적 구조보다 더 표현력이 있습니다.(Expressive)</li>
<li>multiplicative gating의 특징을 얻을 수 있습니다. (각각의 특징을 모듈화하여 나눠서 계산할 수 있습니다.)</li>
</ul>
<h3 id="기타">기타</h3>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/conditioning-choice4.png" alt="conditioning-choice4"></p>
<p> 이 외에도 수많은 복잡한 알고리즘이 있지만, 시간 문제상 다루지 않았습니다.</p>
<h3 id="선택법">선택법</h3>
<p>그럼 이 구조들 중 어떤 구조를 선택하는게 좋을까요?</p>
<p>이 선택은 다음 특징을 가집니다</p>
<ul>
<li>문제에 의해 결정</li>
<li>문제에 대해서 가진 직관과 배경지식</li>
<li>개인의 직관</li>
</ul>
<h2 id="목적-함수-최적화">목적 함수 최적화</h2>
<p>목적 함수를 최적화 하는 것은 Single Task일 때와 별 차이가 없습니다.</p>
<ul>
<li>과제의 미니배치를 구합니다.</li>
<li>미니배치에서 학습에 사용될 데이터를 샘플링합니다.</li>
<li>미니배치 별 손실값을 구합니다.</li>
<li>역전파를 통해 그래디언트를 구합니다.</li>
<li>구해진 그래디언트를 optimizer 알고리즘을 통해 학습시킵니다.</li>
</ul>
<p>이 과정을 통해 미니배치를 구하고, 샘플링을 할 경우 데이터 양에 관계 없이 동등한 비율로 샘플링된다는 특징이 있습니다.</p>
<p>따라서 데이터의 양이 다른 경우 공정하게 샘플링될 수 있도록 조정해야 합니다.</p>
<h2 id="어려운-점">어려운 점</h2>
<p>Multi-task 학습을 진행할 때는 두 가지 어려운 점이 있습니다.</p>
<p>부정적 전이와, 오버피팅 문제입니다.</p>
<h3 id="부정적-전이negative-transfer">부정적 전이(Negative transfer)</h3>
<p>다중 과제 방식으로 학습을 했음에도 불구하고 단일 모델이 성능이 더 좋은 경우를 이야기합니다.</p>
<p>하나의 태스크의 데이터가 다른 태스크에 영향을 주는 상황입니다.</p>
<p>CIFAR-100 데이터셋의 데이터로 확인해 본 결과 단일 모델이 성능이 가장 좋았습니다..</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/negative-transfer.png" alt="negative-transfer"></p>
<p>이 문제가 발생하는 원인이 무엇일까요?</p>
<p>첫 번째로 Optimization과정의 문제입니다. 각각의 과제 간 cross-task interference가 일어났거나, 과제가 다른 비율로 학습된 경우를 이야기합니다.</p>
<p>두 번째로는 파라미터나 Output이 모델의 표현 범위보다 부족한 경우 발생합니다.</p>
<p>Negative transfer를 해결하기 위해서는 태스크 간 공유되는 것을 줄여야 합니다.</p>
<h3 id="overfitting">Overfitting</h3>
<p>앞 문제와 반대되는 내용으로 오버피팅을 들 수 있습니다.</p>
<p>각각의 과제를 아예 별개로 놓고 학습한 것으로 생각할 수 있습니다.</p>
<p>태스크 간 파라미터를 더 많이 공유하는 것으로 해결할 수 있습니다.</p>
<hr>
<h2 id="meta-learning-basics">Meta-Learning Basics</h2>
<p>본격적으로 메타 러닝에 대해서 알아보도록 하겠습니다.</p>
<p>메타 러닝 알고리즘은 크게 기계적 관점, 확률적 관점 두 가지로 나뉩니다.</p>
<table>
<thead>
<tr>
<th align="center">기계적 알고리즘</th>
<th align="center"><strong>확률적 알고리즘</strong></th>
</tr>
</thead>
<tbody><tr>
<td align="center">- 알고리즘이 어떻게 실행되는지 알기 쉽다.<br />- 데이터셋을 기반으로 새로운 데이터를 예측한다.<br />- 메타 러닝 알고리즘을 적용하기 쉽다.</td>
<td align="center">- 알고리즘이 무엇을 하고 있는지 알기 어렵다.<br />- Prior information을 추출해서 효율적인 학습을 위해 조율한다.<br />- 적은 양의 데이터에도 적용할 수 있습니다.</td>
</tr>
</tbody></table>
<p>본 강의에서는 기계적 알고리즘은 다음 강의에서 설명한다고 하며, 확률적 알고리즘을 먼저 설명합니다.</p>
<h2 id="확률적-알고리즘">확률적 알고리즘</h2>
<p>확률적 알고리즘은 우리가 알고 있는 베이지안 알고리즘과 비슷합니다.</p>
<p>하지만 베이지안 알고리즘을 Multi-Task에 맞게 변형해 줄 필요가 있습니다.</p>
<h3 id="기본적-지도학습">기본적 지도학습</h3>
<p>일반적인 지도학습 영역에서 출발합니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/mata-learning1.png" alt="mata-learning1"></p>
<p>이 식에서 주로 확인해야 하는 것은 마지막 줄입니다.</p>
<p>$logp(y_i|x_i, \phi)$ 는 주어진 데이터 $x_i$와 파라미터 $\phi$ 에서 $y_i$ 가 나올 확률을 의미합니다. 이 확률을 최대화하는 작업이죠</p>
<p>하지만 이 방법은 데이터가 너무 적은 경우 오버피팅 문제가 생길 수 있습니다.</p>
<h3 id="메타-학습-데이터">메타 학습 데이터</h3>
<p>메타 러닝에서는 새로운 데이터를 효율적으로 반영하기 위해 &#39;메타 학습 데이터&#39;를 만들었습니다.  </p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/mata-learning2.png" alt="mata-learning2"></p>
<p>각각의 작업 별로 데이터를 따로 분할하여 이 전체의 집합을 메타 학습 데이터로 취급합니다.</p>
<p>만약 과거의 경험 $D_{meta-train}$을 남겨 놓지 않고 새로운 작업에 적용할 수 있는 능력만 배운다고 한다면, 메타-파라미터를 학습시켜야 합니다.</p>
<p>메타 파라미터는 $\theta : p(\theta|D_{meta-train})$로 정의되며, 주어진 태스크를 빠르게 해결하기 위해 $D_{meta-train}$에서 배워야 할 것을 의미합니다.</p>
<p>메타 학습 데이터를 활용한 Output의 분포는 다음 수식으로 나타낼 수 있습니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/meta-learning3.png" alt="meta-learning3"></p>
<p>가장 마지막 수식을 주목해서 확인해야 합니다.</p>
<p>두 개의 항 중 왼쪽 항은 태크스 단일에서 학습되어야 할 파라미터이며, 오른쪽 항은 메타 러닝 과정에서 공통적으로 학습되는 파라미터입니다.</p>
<h2 id="메타러닝-학습-과정">메타러닝 학습 과정</h2>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/learning_cycle.png" alt="learning_cycle"></p>
<p>주어진 데이터셋 $D$에 대해서 메타 러닝 파라미터 $\theta\star$ 를 학습합니다. 이 과정을 메타 학습이라고 부릅니다.</p>
<p>이렇게 학습된 메타 러닝 파라미터를 가지고 테스트용 입력에서 출력이 나올 확률을 최대화 하는 $\phi\star$를 찾는 과정을 &#39;meta testing&#39; 이라고 부릅니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/learning_data.png" alt="learning_data"></p>
<p>메타 트레인에 사용되는 데이터셋 $D_{meta-train}$의 경우는 $D^{tr}_i$ 와, $D^{ts}_i$ 로 구성됩니다. 전자는 $i$ 번째 태스크의 학습용 데이터, 후자는 테스트 데이터입니다.</p>
<p>즉 메타 학습은 $ \phi\star = f_{\theta\star}(D^{tr})$ 을 $D^{ts}_i$ 에 적합하게 만드는 과정이라고 볼 수 있습니다.</p>
<h2 id="정리-1">정리</h2>
<p>위 내용을 한 번에 정리한 이미지가 강의 중에 나와서 소개해 보고자 합니다.</p>
<p><img src="https://raw.githubusercontent.com/YMGYM/ML_paper_study/main/cs330/images/overall.png" alt="overall"></p>
<h2 id="다른-적용-예시">다른 적용 예시</h2>
<p>이 구조는 Auto-ML이나 Architecture search에도 적용됩니다.</p>
<p>Auto-ML의 경우에서 $\theta$는 하이퍼 파라미터이고, 이를 통해 네트워크 가중치를 빠르게 학습시키는 것이므로 $\phi$ 는 네트워크 가중치입니다.</p>
<p>아키텍처 검색의 경우는 $\theta$ 는 네트워크 구조입니다. 적절한 $\theta$를 통해 빠르게 학습되는 네트워크 가중치를 찾는 것이므로 $\phi$는 네트워크 가중치입니다.</p>
<p>이 부분에 대한 연구도 매우 활발하게 이루어지고 있지만, 수업의 과정 이외 범위이기 때문에 다루지 않습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[7주차] Introduction to Bayesian Statistics]]></title>
            <link>https://velog.io/@tobigs_xai/7%EC%A3%BC%EC%B0%A8-Introduction-to-Bayesian-Statistics</link>
            <guid>https://velog.io/@tobigs_xai/7%EC%A3%BC%EC%B0%A8-Introduction-to-Bayesian-Statistics</guid>
            <pubDate>Wed, 02 Jun 2021 15:50:32 GMT</pubDate>
            <description><![CDATA[<h2 id="0-introduction">0. Introduction</h2>
<p>   베이지안 통계(Bayesian Statistics)는 확률이 사건에 대해 특정한 정도의 ‘신뢰’를 제공하는 확률의 베이지안적 해석(Bayesian interpretation)을 기반으로 하는 통계 분야이다. 베이지안적 해석은 고전적인 통계와 관련된 빈도론자(Frequentist)의 해석과는 다른데, 빈도론적 해석은 수많은 시행 끝에 발생하는 상대적인 ‘빈도’를 토대로 확률을 해석하는 반면 베이지안적 해석은 현재 발생한 시행과 사전분포를 이용해 사후분포를 추정하는 등 관점의 차이가 존재한다. 
   이렇듯 ‘확률’에 대한 베이지안적 해석을 토대로 하는 베이지안 통계는 마르코프 체인 몬테 카를로, 근사적 베이지안 연산, 베이지안 회귀 등의 기법과 베이지안 딥러닝, 베이지안 메타러닝 등의 분야에 널리 쓰이고 있다. 특히, 전 세계에 인공지능의 부흥을 불러 일으킨 구글 딥 마인드의 바둑 인공지능 ‘AlphaGo’ 또한 딥러닝 모델과 함께 베이지안 기반 기법 중 Monte Carlo Tree Search를 사용해 인공지능의 괄목할 만한 성능 향상을 보여주기도 했다.  </p>
<h2 id="1-basic-of-probability">1. Basic of Probability</h2>
<h3 id="11-확률변수란">1.1 확률변수란?</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/74786bf5-1af8-4482-896e-259e4ecf02ae/image.png" alt=""></p>
<p>  쉽게 말하면, 일반적으로 자주 쓰이는 확률변수(X)는 사건이 존재하는 표본공간(S)에서 실수(R)로 대응하는 함수로 정의된다.
<img src="https://images.velog.io/images/tobigs_xai/post/5d04e7e6-9b02-4808-a6e1-4a166989b95d/image.png" alt=""></p>
<p>  이 때, 확률(P)은 사건이 존재하는 표본공간(S; sample space)에서만 정의되기 때문에 아래와 같은 식으로 확률변수에 대한 확률을 정의할 수 있다.</p>
<p>$𝐴⊂ℝ<del>인 ~</del>𝐴에~~ 대해,$
$𝑃(𝑋∈𝐴)=𝑃(𝑋^{−1}(𝐴))=𝑃({𝑠∈𝑆:𝑋(𝑠)∈𝐴})$</p>
<p>  즉, 확률변수는 정의역이 표본공간이고 공역이 실수인 함수이며, 공역의 종류에 따라 이산확률변수 또는 연속확률변수로 나뉜다.</p>
<h4 id="이산확률변수">이산확률변수</h4>
<ul>
<li>확률변수에서 공역이 셀 수 있는(countable) 집합인 경우
Ex) 동전의 앞/뒤, 교통사고 건수, 성공 횟수 등</li>
</ul>
<p>  예를 들어, 확률변수 $X$가 서울 시내에서 발생하는 하루에 교통사고 건수를 나타낸다고 가정해보자. 이 때 $X$는 이산형 분포인 포아송 분포를 따른다고 가정할 수 있다.</p>
<p>  $X$ ~ $Poi(5),$ 
  $X∈{0,1,2,3,…,∞}$</p>
<h4 id="연속확률변수">연속확률변수</h4>
<ul>
<li>확률변수에서 공역이 (실수에서) 일정 구간의 모든 값을 가질 수 있는 경우
Ex) A공장에서 생산한 전구의 사용 기간, 키, 몸무게 등</li>
</ul>
<p>   예를 들어, 확률변수 X가 한국 남자의 키를 나타낸다고 가정해보자. 이 때는 X가 정규분포를 따른다고 가정할 수 있다. </p>
<p>  $X$ ~ $N(μ=174,σ^2=5^2),$ 
   $X∈{159.2,163.4,168,172.5,173,174.5,176.8,183,224}$</p>
<h3 id="12-베이즈-정리">1.2 베이즈 정리</h3>
<h4 id="조건부-확률">조건부 확률</h4>
<p>   두 사건 A,B에 대해 사건 B가 이미 일어났을 경우, 사건 A가 일어날 조건부 확률은 아래와 같이 정의된다.</p>
<p>  $P(A│B)=$ $P(A∩B)\over P(B)$ </p>
<h4 id="확률의-곱법칙">확률의 곱법칙</h4>
<p>   조건부 확률의 정의를 이용하면 아래와 같이 성립함을 쉽게 확인할 수 있다.</p>
<p>  $P(A∩B)=P(B)P(A│B)=P(A)P(B|A)$</p>
<h4 id="표본공간의-분할">표본공간의 분할</h4>
<p>   k개의 사건들의 집합인 ${A_1,…,A_k}$가 다음의 두 성질을 만족할 때 ${A_1,…,A_k}$가 표본공간 $S$의 분할(partition)이라 한다.</p>
<ol>
<li>$A_1,…,A_k$가 서로 배반<ol start="2">
<li>$P(\cup_{i=1}^k A_i )=1$</li>
</ol>
</li>
</ol>
<h4 id="베이즈-정리">베이즈 정리</h4>
<p>   기본적으로 가능한 사건들({A_1,…,A_k})가 분할일 때, 조건부 확률의 정의와 확률의 곱법칙을 이용하면 베이즈 정리가 성립함을 알 수 있다.
<img src="https://images.velog.io/images/tobigs_xai/post/e1f7ce6b-4a85-4377-97a8-63dd525085f9/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/ecf701f8-c909-466f-afac-b20a045e3dfa/image.png" alt=""></p>
<p>(베이즈 정리를 한 눈에 나타낸 그림)</p>
<p>   베이즈 정리의 예로, 고등학교 수학 과정인 확률과 통계에서 자주 나오는 문제를 들 수 있을 것 같다.</p>
<p>  <em>문제</em>
<img src="https://images.velog.io/images/tobigs_xai/post/7ad080c0-8416-4430-b39f-526869ea1a16/image.png" alt="">
  <em>풀이</em>
<img src="https://images.velog.io/images/tobigs_xai/post/30ef4838-ba91-4951-91a4-c5eb40e8e618/image.png" alt=""></p>
<p>   위의 베이즈 정리는 기본적으로 사건의 관점에서 서술된 식이다. 이 때, 매개변수 θ를 추론하는 데 데이터 X를 이용하는 통계적 추론을 생각해보자. 그러면 위 식을 아래의 식으로 간단하게 나타낼 수 있다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/73ab9352-f79d-454f-88a4-3415e03492a9/image.png" alt=""> </p>
<p>즉, ‘데이터 X가 주어졌을 때 매개변수 θ를 추정하는 문제(P(θ|X))’와 같은 어려운 task를 ‘매개변수 θ가 주어졌을 때 데이터 X의 분포를 활용(P(X|θ))’하는 상대적으로 쉬운 task를 통해 해결할 수 있는 것이다. 
   이 때, P(θ|X)는 데이터가 주어진 이후의 θ의 분포를 뜻하는 사후 분포, P(θ)는 데이터가 주어지기 이전의 θ의 분포를 뜻하는 사전분포로 정의한다.</p>
<h2 id="2-classical-statistics-vs-bayesian-statistics">2. Classical Statistics vs Bayesian Statistics</h2>
<p>   베이지안 통계(Bayesian Statistics)는 기존의 고전적인 통계(Classical Statistics)의 몇 몇 문제(?)를 해결하기 위해서, 또는 통계적 추론에 있어서 고전적인 통계를 사용하는 빈도 확률론자(frequentist)의 관점에서 벗어나 다른 태도를 취하기 위해 생겨난 철학으로 여길 수 있을 것 같다. 고전적인 통계는 물론이고 베이지안 통계 또한 베이지안 통계추론, 베이지안 딥러닝, 베이지안 메타러닝, 베이지안 최적화 등 수 많은 세부 분야들이 존재하기에 고전 통계와 베이지안 통계를 명확히 구분 지을 수는 없지만, 본 글에서는 아래와 같은 특성들을 기반으로 둘을 나눠보려 한다.</p>
<p>  <strong>고전적 통계</strong>: 결정적, 상수, 확실성, 많은 데이터, 이론적, 전수조사
  <strong>베이지안 통계</strong>: 비결정적, 변수, 불확실성, 적은 데이터, 근사적, 샘플링, 신뢰도</p>
<p>  위와 같은 특성들을 기반으로 베이지안 통계(Bayesian Statistics)가 기존의 고전적인 통계(Classical Statistics)와 어떤 차이점이 있는 지 다양한 예시를 들어 살펴보도록 하자.  </p>
<h3 id="21-고전적-추론-vs-베이지안-추론">2.1 고전적 추론 vs 베이지안 추론</h3>
<p>   통계추론의 핵심 중 하나는 주어진 데이터($X$: 확률변수, $x$: 관측치)를 이용하여 미지의 관심 모수 $θ$를 추정하는 것이다. $f(X|θ)$를 미지의 관심 모수 $θ$에 의존하는 확률변수 $X$의 분포의 밀도 함수라 가정하자. </p>
<h4 id="고전적-추론--mle">고전적 추론 – MLE</h4>
<p>   고전적 추정의 대표적인 방법 중에는 최대 우도 추정(Maximum Likelihood Estimation; MLE)가 있다. 데이터($x$)가 주어진 경우 매개변수($θ$)의 가능도를 나타낸 가능도 함수 $L(θ|x)$는 아래와 같이 정의된다. 가능도 함수는 일종의 사후분포라 할 수 있다.</p>
<p>  $L(θ│x)$=$f(x|θ)$</p>
<p>   즉, 데이터 $X$가 $θ$에 대한 정보를 가지고 있을 것이기에, 데이터 $X$를 통해 매개변수 $θ$를 추측하는 것이다. 단, 이 때 $θ$가 $X$의 분포를 결정하지, $X$가 $θ$의 분포를 결정하는 것은 아니다. 이 때 최적의 매개변수를 뜻하는 최대 우도 추정량($\hat\theta$)은 아래와 같이 정의한다.
 <img src="https://images.velog.io/images/tobigs_xai/post/df1678e4-6ad2-48d0-b520-a6ed9a6d3737/image.png" alt=""></p>
<h4 id="베이지안-추론--prior-distribution">베이지안 추론 – prior distribution</h4>
<p>   이에 대응하는 베이지안 추론은 큰 틀은 비슷하지만, 베이즈 정리를 이용한다는 점에서 큰 차이가 있다.
<img src="https://images.velog.io/images/tobigs_xai/post/c27aebf8-a02c-45ea-846d-bcd1685c4d3e/image.png" alt="">
  즉, 관측치 $x$가 주어진 이후 매개변수 $θ$의 확률 분포인 $p(θ|x)$, 즉 사후분포를 얻기 위해 사전분포인 $p(θ)$와 데이터 $p(x|θ)$를 모두 활용하는 것이다.<br><img src="https://images.velog.io/images/tobigs_xai/post/88cb05c6-a2f5-42d7-ab81-9da3d699659e/image.png" alt="">
  (베이지안 추론의 개념도)</p>
<h3 id="22-신뢰-구간-vs-신용-구간">2.2 신뢰 구간 vs 신용 구간</h3>
<h4 id="고전적-추론--신뢰구간confidence-interval">고전적 추론 – 신뢰구간(Confidence Interval)</h4>
<p>  고등학교 확률과 통계에 나온 신뢰구간이 여기서의 Confidence Interval에 해당한다. 추론하고자 하는 $θ$의 $100(1-α)%$ 신뢰도를 갖는 신뢰구간은 아래와 같은 방식으로 정의된다. </p>
<p>  $P[L(X)&lt;θ&lt;U(X)│  θ]=1-α$</p>
<p>  즉, 특정 $θ$를 추정하기 위해, $θ$를 상수로 가정한 후 신뢰도 $100(1-α)%$를 갖는 신뢰 구간을 정의한다. 그 후, 데이터가 $x$로 관측됐을 때 위 식에 ‘대입’하여 관측 값에 대한 신뢰구간을 사용한다. 예를 들어, 95%의 신뢰도로 매개변수 $θ$(여기서는 모평균 $μ$)를 추정한다고 가정해보자. 이 때 신뢰구간은 아래 그림과 같은 의미를 가진다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/71013db9-c6f3-441d-981a-795b8af73f61/image.png" alt=""></p>
<p>   위의 그림은 95%의 신뢰도로 $θ$를 추정한다는 것은 $θ$가 해당 신뢰구간에 포함될 확률이 95%라는 것이 아니라, $θ$를 포함하는 신뢰구간이 약 100개 중 95개에 해당할 것이라는 사실을 보여준다. 즉, 신뢰 구간은 데이터가 $X=x$로 관측될 때, $θ$가 해당 신뢰구간에 포함될 확률은 아래와 같이 이산적으로 나타난다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/c161d655-ad9b-4adc-9fd0-46ee505730ae/image.png" alt=""></p>
<p>  고전적 추론의 관점에서는 $θ$를 추정하는 데 $θ$를 이미 상수로 가정하고 신뢰구간을 구한 다음, 관측치 $x$를 대입함으로써 신뢰구간을 구하기 때문에 $θ$ 추론에 있어서 직관적이지 못한 것을 알 수 있다.</p>
<h4 id="베이지안-추론--신용구간credible-interval">베이지안 추론 – 신용구간(Credible Interval)</h4>
<p>   베이지안 추론에서의 신용구간은 위와 같이 추정하고자 할 $θ$를 상수로 가정하지 않고 확률변수로 가정한다. 이를 토대로 데이터 $X=x$가 관측됐을 때, $100(1-α)%$ 신뢰구간은 아래와 같이 정의된다.  </p>
<p>  $P(L(x)&lt;θ&lt;U(x)|  x)=1-α$</p>
<p>   이를 통해, θ가 구간 (L(x),U(x))에 놓일 확률은 정확히 1-α가 된다.</p>
<p>  다시 신뢰구간과 신용구간을 비교하면 아래와 같다.</p>
<p>  <em>신뢰구간</em>
<img src="https://images.velog.io/images/tobigs_xai/post/2374f4b1-50f9-4a5d-974d-4dc3cfae1fad/image.png" alt=""></p>
<p>  <em>신용구간</em>
  <img src="https://images.velog.io/images/tobigs_xai/post/d2b323a2-353d-4ef5-8546-f0aa0673bba1/image.png" alt=""></p>
<p>  즉, 고전적 추론에서 편이, 분산, 신뢰구간, 가설검정 등의 오차확률은 모든 가능한 X값에 대하여 적분, 합 등의 형식을 취한다. 그렇기 때문에 위의 신뢰구간도 현재 주어진 관측치가 아닌 표본조사를 무한히 반복했을 때 발생할 모든 관측치들을 고려해서 얻어진 것이다. 베이지안 통계추론은 단순히 현재 주어진 관측치에만 의존하기 때문에 빈도론자들의 통계추론(고전적 통계추론)과는 관점이 다른 것을 알 수 있다.</p>
<h3 id="23-simulated-annealing-vs-markov-chain-monte-carlo">2.3 Simulated Annealing vs Markov Chain Monte Carlo</h3>
<p>   담금질 기법(SA; Simulated Annealing Method)과 마르코프 체인 몬테 카를로(MCMC; Markov Chain Monte Carlo Method)은 특정 model의 매개변수 벡터 θ를 추정하기 위한 최적화(Optimization) 기법들이다. 이를 고전적 추론과 베이지안 추론을 구분 짓는 잣대를 위한 예시로 사용한 이유는 담금질 기법은 매개변수 θ를 결정적으로 추정하고 몬테 카를로 마르코프 체인은 매개변수 θ를 비결정적으로 추정하는 데에 있다.
   이를 위해 담금질 기법을 사용해 매개변수를 추정했던 본인의 연구를 예시로 들어보자.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/925cb0e1-4933-4e19-89d6-850118e59b77/image.png" alt=""></p>
<p>  해당 연구에서는 한국 내의 코로나19 감염병의 전파를 기술하기 위해 아래와 같은 모델을 정의한 후, 2020년의 보건 복지부 데이터(신규 확진자, 격리자, 회복자, 격리 기간, 무증상 확진율 등)을 이용해 매개변수를 추정(최적화)하는 과정이 포함되어 있다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/5c4ae03d-d184-4a5f-929d-726e462c2718/image.png" alt=""></p>
<p>  (감염병 전파를 위한 모델)
   위 그림에 나타나 있는 매개변수들은 예측 확진자와 실제 확진자의 차이(MSE)를 줄이는 방향으로 최적화된다.</p>
<h4 id="231-담금질-기법simulated-annealing을-이용한-최적화">2.3.1 담금질 기법(Simulated Annealing)을 이용한 최적화</h4>
<p><img src="https://images.velog.io/images/tobigs_xai/post/3583f6ec-5364-48b0-86ba-8c3ff4ce2135/image.png" alt=""></p>
<p>  담금질 기법은 실제 금속공학에서 쓰이는 담금질에서 모티브를 얻어 최적화 문제에 적용된 기법이며, 실제로는 아래와 같이 매우 어려운 조합 문제인 Travelling salesman problem을 해결하기 위해 도입된 것으로 알려졌다.
<img src="https://images.velog.io/images/tobigs_xai/post/048dc8ca-874b-46f8-9aa3-204c101e4393/image.png" alt=""></p>
<p><a href="https://en.wikipedia.org/wiki/File:Travelling_salesman_problem_solved_with_simulated_annealing.gif">https://en.wikipedia.org/wiki/File:Travelling_salesman_problem_solved_with_simulated_annealing.gif</a></p>
<p>  이런 조합에 관한 문제 외에도 연속적인 매개변수를 추정하기 위해 쓰이기도 한다.<img src="https://images.velog.io/images/tobigs_xai/post/396f99b3-a309-4e64-b543-0a332499d4bd/image.png" alt=""></p>
<p>  <a href="https://en.wikipedia.org/wiki/File:Hill_Climbing_with_Simulated_Annealing.gif">https://en.wikipedia.org/wiki/File:Hill_Climbing_with_Simulated_Annealing.gif</a></p>
<p>   한 마디로, 온도가 높을 때에는 매개변수 공간(parameter space)를 넓은 보폭으로 전역적으로 탐색해 전역 최적점을 근사적으로 살펴본 다음, 온도가 낮아짐에 따라 좁은 보폭으로 지역적인 최적점을 향해 나아가는 방법이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/ec636f72-39ec-4903-b82b-01562944319f/image.png" alt=""><img src="https://images.velog.io/images/tobigs_xai/post/3acf56e7-7aa8-4f1c-8544-1fd8286235c3/image.png" alt=""></p>
<p>(코로나19 연구에 사용된 담금질 기법 기반 알고리즘)</p>
<p><strong>Parameter 추정 결과</strong>
   이 기법을 통해서 추정된 모든 매개변수들은 결정적으로(즉, 상수로) 정해진다.
<img src="https://images.velog.io/images/tobigs_xai/post/70c3b740-40de-4199-95ca-a0c94669565a/image.png" alt=""></p>
<p>즉, 담금질 기법은 어느 정도 주어진 problem에 대해 매개변수 벡터인 θ에 대한 근사적인 전역 최적 값(Global optim)을 제공한다. 하지만 이 방법 또한 근사적인 방법이기 때문에 전역 최적 값이라는 보장은 없으며, 매개변수가 많아짐에 따라 전역 최적 값에 근사하는 매개변수 조합이 많아 지기 때문에 추정된 매개변수가 진정 옳은 지에 대한 통찰은 주지 못한다. 즉, 추정된 매개변수의 신뢰도와 관련해서는 어떠한 정보도 주지 못하는 것이다. 그렇기에 다른 방법을 활용해 매개변수의 신뢰도를 제고할 필요성이 있다.</p>
<h4 id="232-마르코프-체인-몬테-카를로mcmc를-이용한-최적화">2.3.2 마르코프 체인 몬테 카를로(MCMC)를 이용한 최적화</h4>
<p>   기본적으로 매개변수 추정과 관련해 현존하는 연구들은 상당히 많은 수가 (베이지안적 관점의) MCMC 기법을 사용하며, 쓰이는 알고리즘이 변형되더라도 기존의 큰 틀은 벗어나지 않는다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/f3a12538-a916-4f8d-97f6-31e16ea8893e/image.png" alt=""></p>
<p>(상당히 많은 수의 연구가 MCMC 기반 기법들을 사용한다.)</p>
<p>   몬테 카를로와 관련해서는 후술하기로 하고, MCMC 기법의 결과에 대해서만 간단히 알아보자.
<img src="https://images.velog.io/images/tobigs_xai/post/6bf92e42-e32d-4b10-b2cd-8dd22c1e0faf/image.png" alt=""></p>
<p>(위키디피아에서의 MCMC)</p>
<p>  MCMC는 간단히 말하면 샘플링을 통해 구하고자 하는 매개변수의 분포를 모사하는 기법이다.
<img src="https://images.velog.io/images/tobigs_xai/post/4bd530ed-0f9a-40da-ac75-f0157413acb0/image.png" alt=""></p>
<p>  (샘플이 많아짐에 따라 목표 매개변수(파란 선)의 분포를 모사하는 모습)</p>
<p>   MCMC기법을 활용해서 매개변수 θ의 분포를 추정한다면 해당 매개변수가 비결정적으로 정해지며, 신용구간 또한 구할 수 있는 장점이 존재한다. 이 장점으로 인해 매개변수를 추정(최적화)하는 대부분의 연구에서는 매개변수의 최적 값 외에도 95% C.I(Credible Interval)을 포함하는 것으로 보인다. 
<img src="https://images.velog.io/images/tobigs_xai/post/63685d0f-c8fb-4762-8f64-a3a5ba7b1dda/image.png" alt=""></p>
<p>  (MCMC 알고리즘 중 대표격인 MH(Metropolis-Hastings) 알고리즘)</p>
<p>  <strong>Parameter 추정 결과</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/199f831b-b4bb-43af-9062-0b3c48fd54e0/image.png" alt="">(MCMC기법은 최적 값 뿐만 아니라 95%의 신용구간 또한 구할 수 있다.)</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/10604c75-b91d-4e69-a2ee-274da8be97aa/image.png" alt="">
  (MCMC기법이 아니여도 보통 특정한 수치를 추정할 때에는 95% CI를 포함한다.)</p>
<h4 id="233-문제-예측---결정적-최적화-vs-비결정적-최적화">2.3.3 문제 예측 - 결정적 최적화 vs 비결정적 최적화</h4>
<p><img src="https://images.velog.io/images/tobigs_xai/post/bf388e5e-89d8-4adb-b099-5839568b1197/image.png" alt=""></p>
<p>  (담금질 기법의 결정적인 매개변수의 경우)
<img src="https://images.velog.io/images/tobigs_xai/post/0dbc239d-5bf7-4b23-a131-baeb7cfbc433/image.png" alt=""></p>
<p>  (MCMC 관련 기법의 비결정적인 매개변수의 경우)
   위 그림의 차이와 같이, 매개변수가 결정적으로 정해진다면(즉, 상수로 여겨진다면) 목표 통계량(여기서는 신규 확진자)에 대해 (다양한 상황을 가정하지 않는 한) 하나의 결과만을 나타낼 수 있지만 매개변수 비결정적으로 정해진다면(즉, 분포로 여겨진다면) 같은 통계량에 대해서 95% 신용 ‘구간’을 나타낼 수 있게 된다. 이처럼 베이지안 기반 통계는 매개변수나 통계량 자체에 ‘신뢰도’, 혹은 ‘오차’ 등에 대한 정보를 제공함으로써 보다 풍부한 추론을 가능케 한다.</p>
<h2 id="3-베이지안-딥러닝--강화학습--alphago">3. 베이지안+ 딥러닝 + 강화학습 = AlphaGo</h2>
<h3 id="31-몬테카를로">3.1 몬테카를로</h3>
<p>   몬테카를로(Monte-Carlo)는 도시국가인 모나코 북부에 있는 지역으로 카지노, 도박으로 유명한 곳이다. 수학의 확률이론 자체가 도박에서 비롯되었기에 도박 도시의 대명사였던 몬테카를로 역시 확률론과 밀접한 관계가 있는 방법론을 지칭하기도 한다.
   즉, 몬테카를로 방법이란 무작위 추출된 난수를 이용해 함수의 값을 계산하는 통계학적 방법으로, 수치적분이나 최적화 등에 널리 쓰인다. 
<img src="https://images.velog.io/images/tobigs_xai/post/6f66517f-4b39-42de-a7de-7fe3e05f0106/image.png" alt=""></p>
<p>  적분 문제 중 면적 계산을 예로 들어보자. 위 그림에서 검은 실선에 의해 구분되는 파란색 영역의 넓이를 구하고자 할 때, 함수로 표현하기 힘들거나 이론적인 적분 값을 구하기 힘든 경우 몬테카를로 기법을 사용할 수 있다. 이 때, 정사각형으로 이루어진 영역의 상태 공간에서 임의로 샘플(데이터)을 뽑는다. 정사각형의 넓이는 알고 있기 때문에 정사각형 내부의 총 샘플 수와 파란색 영역에 속하는 샘플 수의 비율을 이용하면 파란색 영역의 넓이 또한 근사적으로 알 수 있게 된다.
   오늘날 인터넷 상에는 적분 계산기(Wolfram Alpha 등)가 많이 존재하므로 특정 방정식에 대해 이론적인 면적을 계산하지 못하는 경우가 많지는 않다. 하지만 특정 영역에서는 이론적인 적분을 하지 못하는 경우가 존재하며, 가능하더라도 실행의 용이성 및 연산의 효율성 등의 이유로 몬테카를로 샘플링을 주로 이용하곤 한다.<br>   베이지안 통계 추론에서는 가령 데이터가 주어졌을 때 사후 분포를 구하고, 이로부터 사후 평균이나 분산 등을 구하고자 할 수 있다. 이 경우 평균, 분산과 같은 통계량을 수리적으로 구하기는 어렵지만 사후 분포로부터 표본을 생성할 수 있는 경우가 종종 발생한다.
  즉, 아래와 같은 적분 값
  $I=∫_a^bg(x)f(x)dx$ 을 구하기 힘들 때,
  $f(x)$ 라는 밀도 함수로부터 여러 개의 샘플($x$)을 얻을 수 있다고 가정해보자
  이 때 확률에서 기댓값의 정의에 따라 $I=E(g(x))$ 로 나타낼 수 있다.
  즉, $f(x)$로 부터 샘플 $x$를 많이 얻을 수 있다면, 위의 적분 값(또는 이론적 기댓값)은 아래와 같이 n개의 샘플 $x_1,x_2,….x_n$을 통해 근사적으로 구할 수 있게 된다.
<img src="https://images.velog.io/images/tobigs_xai/post/06b4ae7d-0846-4dee-8908-85de8f4dbe29/image.png" alt=""></p>
<p>   이처럼 샘플(난수)의 개수를 더욱 많이 발생시킬수록 더욱 정확한 값을 얻을 수 있겠지만, 확률적인 방법론이기 때문에 어느 정도 오차가 발생할 수밖에 없다. 
  다양한 컴퓨터 시뮬레이션, 예측 등에 쓰이지만 역사적으로 가장 중요한 사례로 미국의 원자폭탄 개발 계획인 ‘맨해튼 프로젝트’를 들 수 있다.<br><img src="https://images.velog.io/images/tobigs_xai/post/8263f540-275c-4016-ad77-6c50e604339c/image.png" alt=""></p>
<p>   폴란드 출신의 수학자 스태니슬로 울람은 그 유명한 폰 노이만과 함께 맨해튼 프로젝트에 참가하였다. 울람은 새로운 수학적 방법론을 도박의 도시 이름을 따서 몬테카를로 방법이라 명명하였고, 이 방법은 중성자가 원자핵과 충돌하는 과정을 이해하고 묘사하는 데 결정적 역할을 하였다.
   즉, 핵분열의 과정에서 우라늄 원자핵과 충돌한 중성자 1개가 다시 중성자 3개를 방출하는데, 이 연쇄반응에서 중성자들은 마치 분기하는 나뭇가지들처럼 복잡한 경로를 보인다. 몬테카를로 방법을 적용한 확률적 시뮬레이션을 통해 이 경로를 파악하고 결과를 ‘추정’할 수 있는 것이다. </p>
<h3 id="32-알파고">3.2 알파고</h3>
<p>   알파고를 개발한 구글의 딥마인드는 &lt;딥러닝 신경망과 트리 검색으로 바둑 마스터하기(Mastering the game of Go with deep neural networks and tree search)&gt;라는 제목으로 네이처 논문에 알파고의 기반 기술과 알고리즘을 자세히 설명해 놓았다. CPU 1,202개, GPU 176개 등 분산 컴퓨터, 정책망 및 가치망으로 이루어진 신경망, 과적합 방지를 위한 지도학습과 강화학습의 결합, 고속 시뮬레이션, 롤아웃 등 중요한 요소 또한 존재하지만 여기서는 핵심적인 알고리즘인 몬테카를로 트리 서치의 기본 구조만을 나타내었다. </p>
<h4 id="몬테카를로-트리-서치">몬테카를로 트리 서치</h4>
<p>   바둑은 가로세로 19줄로 이루어진 바둑판 위에 흑돌과 백돌이 서로의 집을 만들고 세력 다툼을 하는 개념의 게임이다. 숫자로 계산해보면 바둑에서 착수가 가능한 모든 패턴은 약 10^171 가지로, 우주의 모든 원자 개수인 약 10^81보다도 훨씬 많다. 그렇기에 컴퓨터의 연산 능력이 아무리 좋아져도 바둑은 절대 인간을 이길 수 없다는 의견이 지배적이었는데, 알파고 기반 인공지능은 어떻게 인간을 압도하는 성능을 가지게 됐을까?<br><img src="https://images.velog.io/images/tobigs_xai/post/3675533c-d1b0-405e-813b-f94fedb4db26/image.png" alt=""></p>
<p>   몬테카를로 트리 서치는 Min-max 알고리즘의 성능을 개선한 알고리즘으로, 모든 경로를 탐색하기 불가능한 상황에서 효율적이다. 간단히 말해 ‘경우의 수가 너무나도 많을 때 순차적으로 시도하는 것이 아닌 랜덤하게 시도하는 것’ 이다.
<img src="https://images.velog.io/images/tobigs_xai/post/e2856d48-f18e-4c52-8e85-b45e9c43b9fb/image.png" alt=""></p>
<p>  바둑은 착수 후 상대방이 어디에 둘 것인지, 또 그 다음 수는 어디에 둬야할 지 계속해서 선택과 경우의 수가 굉장히 많이 발생한다. 그렇기 때문에 무작위로 일정 횟수만큼 착수를 한 다음, 그 중 가장 승률이 높은 수를 두게 되는 것이다. 이를 위해 고속 시뮬레이션, 롤아웃, 분산 컴퓨팅 등 다양한 보조 기법들이 사용되었다. </p>
<h2 id="4-베이지안-딥러닝--메타러닝">4. 베이지안 딥러닝 / 메타러닝</h2>
<h3 id="41-베이지안-뉴럴-네트워크bnn">4.1 베이지안 뉴럴 네트워크(BNN)</h3>
<p>   기존의 뉴럴 네트워크는 뉴런들 사이에 존재하는 layer들의 parameter가 상수로 부여되는 반면, 베이지안 뉴럴 네트워크는 그 parameter 자체를 하나의 분포로 생각한다. 즉,학습을 할 때에는 parameter의 확률 분포에 해당하는 모수(예를 들어 정규분포에서는 평균과 분산)를 학습하고, 예측을 할 때에는 그 분포로부터 샘플링을 통해 얻음으로써 95% 신뢰도를 부여한 불확실한 예측을 하는 것이 베이지안 뉴럴 네트워크의 특징이다. 
   즉, 불확실성(Uncertaintiy)를 다루기 위해 ‘모르는 건 모른다고 하는 모델’을 만드는 것이다. 가령, 이미지 분류 모델에서 개와 고양이를 대상으로 학습을 시킨 다음, 자동차를 분류 예측에 사용한다면 자동차 이미지는 개 또는 고양이에 해당하는 결과를 낼 것이다. 베이지안 뉴럴 네트워크는 이처럼 어떻게든 결과를 내는 것이 아니라, 만약 자동차 이미지의 분류 결과가 고양이일 확률 40%, 강아지일 확률 60%의 분포를 갖는다면, 모델로 하여금 ‘모르겠다’ 라는 반환 값을 내놓게끔 설계된 것이다. 
   이러한 불확실성은 신뢰도가 필요한 분야(의학, 자율주행) 등에서 활용될 수 있다. 예를 들어 운전을 할 경우에는 언제 어떤 사고가 일어날 지 모르기 때문에 초록 불이라 해서 그냥 속도를 계속 내서는 안 된다. 차가 갑자기 들어올 수도, 갑자기 빨간 불이 될 수도 있기 때문에 항상 불확실성을 염두에 두고 판단을 내려야 하는 것이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/0ea79009-83d3-4f90-aa40-97a7ab2709bc/image.png" alt=""></p>
<p>   이러한 BNN과 유사한 역할을 수행할 수 있는 것이 흔히 알려진 Dropout이다. 가령, Dropout을 학습 때만 적용하고 Evaluation 단계에서는 사용하지 않는 것이 보통이지만, Evaluation 때에도 dropout을 사용한다면 시행마다 결과가 조금씩 다를 것이고, 이로부터 불확실성(Uncertainty)를 추정할 수 있게 된다(Monte Carlo Dropout 등). 
   베이지안 딥러닝(베이지안 뉴럴 네트워크)가 보여준 것처럼 인공지능 모델의 블랙박스 특성에 대해 고찰하고, 신뢰도 등을 제고하려는 노력은 이 네트워크가 큰 그림에서 볼 때 XAI(eXplainable AI, 설명가능한 인공지능)에 속할 수 있다는 것을 암시한다. 
   국내 인공지능 솔루션 스타트업 중 하나인 에이아이트릭스(AITRICS) 또한 인공지능의 해석 가능성을 높이기 위해 ‘해석 모듈(Interpretation module)’과 결과에 대한 불확실성을 계산하여 신뢰도를 제공하는 ‘베이지안 뉴럴 워크(Bayesian neural networks)’ 기술을 도입했다고 한다. 
<img src="https://images.velog.io/images/tobigs_xai/post/5913fb99-f68f-46af-b763-d0ee84866e47/image.png" alt=""></p>
<p>  (에이아이트릭스 메타트랜스퍼(AITRICS metatransfer) 방법, 메타 네트워크 f와 g는 채널의 중요도에 따라 두 네트워크의 레이어 사이에 전달할 지식의 양을 결정한다.)
   이에 추가로 베이지안 뉴럴 네트워크와 시계열 모델(attention)을 결합해 시계열 데이터에서 불확실성을 고려한 의사 결정을 할 수 있는 ‘Uncertainty-awre attention mechasim’, 전이 학습(transfer learning)의 전이 방식이 해석하기 까다롭다는 문제를 해결하기 위해 ‘meta learning method’ 등을 제안하였다. 메타러닝 방법론을 이용해 특정 task를 해결하기 위해 어떠한 task에서 얼마만큼의 지식을 끌어와야 하는지, 또 그런 지식들이 현재 문제를 풀기위한 딥 네트워크의 어떠한 파라미터를 최적화하는 데 주로 사용되어야 하는지를 학습하는 방법론으로, 결과의 근거를 유추하여 해석을 가능하게 하며 전이 학습의 효율성을 증대시켜, 예측 성능을 큰 폭으로 향상시킬 수 있다고 한다.</p>
<h3 id="42-meta-learning-is-all-you-need">4.2 Meta-Learning is All You Need</h3>
<p>   메타러닝의 전반적인 지식과 블랙박스 메타러닝, 최적화 기반 메타러닝, 비모수(Non-parametric) 메타러닝 등을 살펴본 논문으로, 여기서도 베이지안 기반 메타러닝에 관한 내용이 소개되었다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/82bb503e-4215-4297-a359-5737fb292c9b/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/98cc2fd8-c6e4-43ce-a115-f36bc866c83c/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/747af1c3-82b7-413b-9020-58530a8887cf/image.png" alt="">
  (메타러닝 문제는 대략적으로 결정적 관점과 확률적 관점 두 가지로 나뉜다.)
<img src="https://images.velog.io/images/tobigs_xai/post/ad4080fe-910b-4d95-8610-cbebb0f2626f/image.png" alt=""></p>
<p>  (베이지안 선형 회귀를 사용한 ALPaCA 알고리즘)</p>
<p>   특히, 저자는 글의 마지막에도 메타러닝에는 베이지안 메타러닝과 메타 강화학습 등과 같은 흥미로운 분야가 많다고 얘기하며, 메타러닝을 사용해 헬스케어나 제조업 등 다양한 실생활 분야에 적용하기를 기대한다며 논문을 끝마치기도 한다. </p>
<p>   이처럼 베이지안 관련 통계 기법들은 반 세기 전 원자폭탄부터, 최근 인공지능 분야까지 폭 넓게 쓰이고 있다. 앞으로 더욱 완벽한 인간 중심 인공지능을 개발하기 위해 설명 가능 인공지능, 강화 학습 등이 끊임 없이 발전하고 있는 상황에서 베이지안-식 관점을 가지고 문제를 바라본다면 이전 보다 흥미로운 접근이 가능할 것이라고 생각한다.</p>
<h2 id="5-ref">5. Ref</h2>
<p><a href="https://medium.com/@thomasvergote/predictability-of-case-evolution-of-covid-19-using-mcmc-7e8476e5e56f">Predictability of case evolution of COVID-19 using MCMC | by Thomas Vergote | Medium</a>
<a href="https://arxiv.org/pdf/2102.11022.pdf">What is the probability that a vaccinated person is
shielded from Covid-19?</a>
<a href="https://en.wikipedia.org/wiki/Simulated_annealing">Simulated annealing - Wikipedia</a>
<a href="https://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo">Markov chain Monte Carlo - Wikipedia</a>
<a href="https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;blogId=antifatekr&amp;logNo=221058921652">모평균의 구간추정 예시 : 네이버 블로그 </a>
<a href="https://honeyjamtech.tistory.com/56">최근 머신 러닝 핫한 연구 분야 (1/3) :: 취미생활하는 공대생 (tistory.com) </a>
<a href="https://sfex.tistory.com/24">머신러닝 메타러닝(Learning To Learn) (tistory.com) </a>
<a href="https://ichi.pro/ko/beijian-meta-hagseub-man-iss-eumyeondoebnida-30580011469308">베이지안 메타 학습 만 있으면됩니다 (ichi.pro)</a>
<a href="https://drbak.tistory.com/8">닥터박 :: 알파고, 몬테카를로 트리탐색 (tistory.com)</a>
<a href="https://www.sciencetimes.co.kr/news/%EB%AA%AC%ED%85%8C%EC%B9%B4%EB%A5%BC%EB%A1%9C-%EB%B0%A9%EB%B2%95%EA%B3%BC-%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/">몬테카를로 방법과 인공지능 – Sciencetimes</a>
일부 이론 : 베이지안 통계학, 2021년 서울시립대학교 통계학과 전공 수업</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[6주차] Introduction to Meta Learning ]]></title>
            <link>https://velog.io/@tobigs_xai/6%EC%A3%BC%EC%B0%A8-Introduction-to-Meta-Learning</link>
            <guid>https://velog.io/@tobigs_xai/6%EC%A3%BC%EC%B0%A8-Introduction-to-Meta-Learning</guid>
            <pubDate>Wed, 26 May 2021 09:57:18 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/jbeen2">이재빈</a></p>
<blockquote>
<h2 id="contents">Contents</h2>
</blockquote>
<ol>
<li>Introduction </li>
<li>Meta-Learning &amp; Few-shot Scenario</li>
<li>Approaches </li>
</ol>
<p><strong>Summary</strong> : <code>Learning to learn</code> </p>
<h1 id="1-introduction">1. Introduction</h1>
<h2 id="limitations">Limitations</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/85205681-001d-4f67-b906-9047a4879032/image.png" alt=""></p>
<p>기존 ML/DL 방법론에는 한계가 존재합니다. </p>
<ol>
<li><code>Large dataset</code> (+Large model) 을 통해 학습을 진행해야만 좋은 성능이 보장됩니다.  </li>
<li><code>one task</code> 에만 적용 가능합니다. (= 학습한 것만 수행할 수 있습니다.) 
 ex. 개와 고양이 분류 학습 → 개와 고양이로만 구별 가능 </li>
</ol>
<br>

<p>Problem </p>
<ol>
<li>What if you don&#39;t have a <strong><code>large dataset</code></strong> ? </li>
<li>What if you want a <strong><code>general-purpose</code></strong> AI system in the real world?</li>
<li>What if your data has a <strong><code>long tail</code></strong>? 
<img src="https://images.velog.io/images/jbeen2/post/f09f5e8b-95c2-46ad-ba59-0824790ad803/image.png" alt=""></li>
</ol>
<h2 id="meta-learning">Meta Learning</h2>
<p><strong>적은 데이터</strong>만을 가지고도, <strong>새로운 개념과 기술</strong>을 <strong>빠르게 학습</strong>하고자 합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/84239e46-3664-470d-8d8a-49c8204c888a/image.png" alt=""></p>
<p>우리는 Braque 와 Cezanne 를 잘 알지 못해도, 몇 개의 그림만으로 그림 간의 유사성을 파악하여, 새로운 그림을 봤을 때 판단을 내릴 수 있습니다. 
이처럼 사람은 <strong>기존의 경험</strong>을 기반으로, 몇 번의 학습만으로 구분하는 <strong>방법을 배워</strong>, 여러 개의 개념을 빠르게 학습할 수 있습니다. </p>
<p><strong>Goal</strong> : <strong><code>Learning to learn</code></strong> 학습을 위한 학습
적은 데이터로도 일반화가 가능하도록 학습시키는 것이 목표입니다. </p>
<p><code>Like Human Brain!</code> 
적은 데이터를 통해, 이미 알고 있는 것 처럼, 
기존의 경험 (experience) 을 기반으로 새로운 다양한 (+ 관련 있는!) Task 를 처리하고자 합니다. 
ex. 개와 고양이를 보고 코끼리로 분류하기 </p>
<h2 id="learning-algorithms">Learning Algorithms</h2>
<h3 id="1-supervised-learning">1. Supervised Learning</h3>
<p>관측치마다 정답 label이 달려 있는 데이터셋을 이용하여 학습
ex. Regression, Classification, Neural Network, ...</p>
<p><img src="https://images.velog.io/images/jbeen2/post/494162d2-1c84-46b4-98f7-060d9df03e37/image.png" alt=""></p>
<p><code>train</code> : task data 를 learning algorithm 으로 학습시켜, predictor 를 만들고, 
<code>test</code> : 새로운 test data 를 predictor 를 통해 예측하여 prediction 값을 도출합니다. </p>
<h3 id="2-transfer-learning">2. Transfer Learning</h3>
<p>높은 정확도를 비교적 짧은 시간 내에 달성하고자, 
pre-trained 되어 있는 모델을 가져와서, 주어진 목적에 맞게 fine-tuning 시키는 것 </p>
<p><img src="https://images.velog.io/images/jbeen2/post/9a769eb1-8ce2-4f23-91dd-24b66f5b4e6a/image.png" alt=""></p>
<p><code>pre-trained</code> : 대규모 말뭉치 &amp; 컴퓨팅 파워를 통해 만들어진 embedding 값을 가져옵니다. 해당 embedding 에는 말뭉치의 의미적, 문법적 맥락이 모두 포함되어 있습니다.
<code>fine-tuning</code> : 이후 embedding을 입력으로 하는 새로운 딥러닝 모델을 만듭니다. 우리가 풀고 싶은 구체적인 task와, 가지고 있는 소규모 데이터에 맞추어, embedding을 포함한 모델 전체를 update 합니다.</p>
<h3 id="3-meta-learning">3. Meta Learning</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/f368e1a1-9cf8-4a14-9091-b65848f8bb17/image.png" alt=""></p>
<h3 id="4-auto-ml">4. Auto ML</h3>
<p>머신러닝 모델 개발 시간이 많이 걸리는 반복적인 작업을 자동화 하는 프로세스
[Data Prep → Feature Engineering → Modeling → HyperParameter Tuning] </p>
<p><img src="https://images.velog.io/images/jbeen2/post/edc1a785-9f79-493e-8c8b-b9b09c734c31/image.png" alt=""></p>
<h3 id="etc">etc.</h3>
<p>🎞 Facebook Research - <a href="https://youtu.be/ByeRnmHJ-uk">Learning to learn: An Introduction to Meta Learning</a>  </p>
<ol>
<li>Transfer Learning / 2. Multi-task Learning / 3. Semi-supervised Learning <blockquote>
<ol start="2">
<li>Multi-task Learning<br>서로 연관 있는 과제들을 동시에 학습
<img src="https://images.velog.io/images/jbeen2/post/c7cfe7ef-a569-4d94-b2b0-b8ad989c15eb/image.png" alt=""><br></li>
<li>Semi-supervised Learning<br>label 이 달려있는 데이터와 label 이 달려있지 않은 데이터를 동시에 학습
<img src="https://images.velog.io/images/jbeen2/post/0798a0c9-4408-4cfd-9b82-8f613a7f36de/image.png" alt=""></li>
</ol>
</blockquote>
</li>
</ol>
<p>위의 세 개의 Learning Algorithm 과 Meta-Learning 은,</p>
<ol>
<li>현재 task 와 어느 정도 연관 있는 데이터를 추가적으로 학습하여, 현재 task 의 성능 향상에 도움이 되는 모델을 만든다는 데에서 공통점이 있습니다. </li>
<li>그렇지만 Meta-Learning 은, training tasks 를 통해 학습하여 new task 를 풀어 냄으로써, new task 에 adaptation 하는 것을 목표로 한다는 점에서 차이점이 있습니다. </li>
</ol>
<h2 id="meta-learning-tasks">Meta Learning tasks</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/ce09ae32-1a50-4634-813c-49a34451887c/image.png" alt=""></p>
<ul>
<li>고양이가 없는 이미지를 학습시킨 classifier 도 몇 개의 고양이 사진을 본 이후에는 test image 상에 고양이가 있는지 확인할 수 있습니다. </li>
<li>평평한 지면 환경에서만 학습해온 미니 로봇이 경사진 환경에서도 task 를 수행할 수 있습니다. </li>
</ul>
<br>

<h1 id="2-meta-learning--few-shot-scenario">2. Meta-Learning &amp; Few-shot Scenario</h1>
<h2 id="parameters">Parameters</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/d11a3da6-05d1-4e33-a58c-c67cd03c5f83/image.png" alt=""></p>
<p>Supervised Learning 에서는, 
input $x$ 를 통해 output $y$ 를 가장 잘 설명해 주는 함수 $f$ 를 찾는 것을 목표로 하며, 
학습 Dataset $\mathcal D$ 가 주어졌을 때 이에 최적화 된 weight $\theta$ 를 찾는 것을 목표로 합니다. </p>
<p>Meta Learning 에서는, 
$\mathcal D^{train}_i$ 와 $\theta$ 를 함께 이용하여, $\phi_i$ 를 찾아 감으로써 new task 에 빠르게 적용하고자 합니다. </p>
<h2 id="few-shot-learning">Few-shot Learning</h2>
<h3 id="definition">Definition</h3>
<ol>
<li><strong>N-way, K-shot</strong> <ul>
<li><code>N</code> : class 수, <code>K</code> : example 수 </li>
</ul>
</li>
<li><strong>Support set</strong> : 새로운 class 에 대한 Train Dataset </li>
<li><strong>Query set</strong> : 새로운 class 에 대한 Test Dataset </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/b5d14e0a-f001-49c6-ad4e-6f93d3942cc7/image.png" alt=""></p>
<ol start="4">
<li><strong>Episode Training</strong> : N class, K example 단위를 만들어서 학습 
Few-shot Learning 에서는, Episode Training 방식으로 Meta Learning 을 시도합니다. 
<img src="https://images.velog.io/images/jbeen2/post/bc400dfd-a648-47b3-9444-b0c214eaea72/image.png" alt="">
Episode Traning 에서는 각 Task 를 구성하는 범주가 완전히 달라지게끔 데이터가 구성됩니다. 
대용량 Train 데이터로부터 <code>N-way K-shot</code> Training Set 을 여러 개 sampling 합니다. 모델은 다양한 범주로부터 훈련된 Task 를 통해 최적의 성능을 낼 수 있도록 Training 됩니다. Training 을 마치게 되면, novel data 로 구성된 Task 로 Test 를 진행합니다. 
<img src="https://images.velog.io/images/jbeen2/post/0f81ccad-c7b7-4b84-8f65-8af33e00970e/image.png" alt="">
PROCESS
<img src="https://images.velog.io/images/jbeen2/post/1bd9031b-408c-4a65-ba79-c83354a31fc5/image.png" alt=""><ol>
<li><code>Task Sampling</code> : $E_{L \in \mathcal L}$
→ 모든 class 중 학습시킬 N 개를 sampling 합니다. </li>
<li><code>Support Set Sampling</code> : $E_{S^L \in \mathcal D}$ 
→ example k 개를 sampling 합니다. </li>
<li><code>Query Set Sampling</code> : $E_{B^L \in \mathcal D}$ 
→ Support Set 에서 sampling 되지 않은 example 중에서, sampling 합니다. </li>
<li>Query Set 의 class를 가장 잘 맞추는 parameter $\theta$ 를 학습합니다. </li>
</ol>
</li>
</ol>
<br>

<h1 id="3-approaches">3. Approaches</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/44062ce6-74da-44d9-8ea5-028332e12e22/image.png" alt=""></p>
<p>Meta-Learning 의 범위는 매우 다양합니다.<br>📑 <a href="https://arxiv.org/pdf/2004.05439.pdf">Meta-Learning in Neural Networks: A Survey</a> (2020, T Hospedales)</p>
<p><img src="https://images.velog.io/images/jbeen2/post/7b9a61e8-918a-41c7-b370-68b0303ddb8f/image.png" alt=""></p>
<p>Meta-Learning 에는 크게 세 가지의 접근 방식이 존재합니다. 
🗣 Meta-Learning Symposium Talk (NIPS 2018, Oriol Vinyals)</p>
<h2 id="metric-based">Metric-based</h2>
<p>✔︎ <strong>Learning the Metric Space</strong></p>
<ol>
<li>$\mathcal D^{tr}$ 을 이용하여, 저차원으로 embedding 시키는 $f_{\theta}$ 를 학습합니다. </li>
<li>새로운 데이터 $\mathcal D$ 가 들어오면, embedding 공간에서의 <strong>거리</strong>를 이용하여 가장 가까운 class 로 할당합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/e8bb489f-2318-47a0-850e-81995a496497/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/jbeen2/post/54783e4a-e3c4-4f93-b634-baa89cba4424/image.png" alt=""></p>
<ul>
<li><a href="https://www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf">Siamese Neural Networks for One-shot Image Recognition</a> (2015, G Koch)
<img src="https://images.velog.io/images/jbeen2/post/21304d7a-0b10-49e8-a722-49b973de055a/image.png" alt=""></li>
<li><strong><a href="https://arxiv.org/pdf/1606.04080.pdf">Matching Networks for One Shot Learning</a></strong> (2016, O Vinyals) 
<img src="https://images.velog.io/images/jbeen2/post/3ba7e006-7e5f-4830-9d02-94507b677660/image.png" alt=""></li>
<li><strong><a href="https://arxiv.org/pdf/1703.05175.pdf">Prototypical Networks for Few-shot Learning</a></strong> (2017, J Snell)
<img src="https://images.velog.io/images/jbeen2/post/d2286343-7c81-4e41-8e4a-fa4c94c4c470/image.png" alt=""></li>
<li><a href="https://arxiv.org/pdf/1711.06025.pdf">Learning to Compare: Relation Network for Few-Shot Learning</a> (2017, F Sung)
<img src="https://images.velog.io/images/jbeen2/post/0eb1bbcc-31bb-4681-a852-01223ae7bae6/image.png" alt=""></li>
</ul>
<h2 id="model-based">Model-based</h2>
<p>Train Neural Networks trying to Ingest Datasets 
모델의 내부나 외부에 기억장치(memory)를 별도로 둠으로써, 모델 학습속도를 조절할 수 있게끔 합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/602240b7-a498-4872-9b24-427bf767cb89/image.png" alt=""></p>
<ul>
<li><a href="http://proceedings.mlr.press/v48/santoro16.pdf">Meta-Learning with Memory-Augmented Neural Networks</a> (2016, A Santoro)</li>
<li><a href="https://arxiv.org/pdf/1703.00837.pdf">Meta Networks</a> (2017, T Munkhdalai)</li>
</ul>
<h2 id="optimization-based">Optimization-based</h2>
<p>✔︎ <strong>Learning the Initializations</strong></p>
<ol>
<li>$\mathcal D^{tr}$ 를 이용하여 효율적인 update 방법 $\theta$ 을 구하고  </li>
<li>새로운 데이터 $\mathcal D$ 와 $\theta$ 를 이용하여, 새로운 Task 의 $\phi$ 를 빠르게 학습 (adaptation) 합니다. </li>
</ol>
<p><img src="https://images.velog.io/images/jbeen2/post/14f02a51-94ec-4dda-aac3-6d806da4e99c/image.png" alt=""></p>
<ul>
<li><a href="https://openreview.net/pdf?id=rJY0-Kcll">Optimization as a model for Few-Shot Learning</a> (2016, S Ravi)</li>
<li><strong><a href="https://arxiv.org/pdf/1703.03400.pdf">Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks</a></strong> (2017, C Finn)</li>
</ul>
<br>


<h1 id="reference">Reference</h1>
<h3 id="lecture">Lecture</h3>
<ol>
<li>AAAI 2021 Meta Learning : <a href="https://docs.google.com/presentation/d/1bcjbqt7Hj_985AX9Hl13dbTEJ8LH3Iti-LMI6C172ZQ/edit#slide=id.p36">Introduction</a> </li>
<li>Stanford CS330 : <a href="https://cs330.stanford.edu/slides/cs330_intro.pdf">Course introduction</a></li>
</ol>
<hr>
<h3 id="seminar">Seminar</h3>
<ol>
<li>DMQA Seminar : <a href="http://dmqm.korea.ac.kr/activity/seminar/301">Metric-based approaches to meta-learning</a></li>
<li><a href="https://youtu.be/Izqod36syY8">KAIST NeuroAI JC_#1 Meta Learning</a></li>
<li>2020 투빅스 생성모델 세미나 : <a href="https://velog.io/@tobigs-gm1/Few-shot-Learning-Survey">Few-shot Learning Survey</a></li>
</ol>
<hr>
<h3 id="posts">Posts</h3>
<ol>
<li><a href="https://lilianweng.github.io/lil-log/2018/11/30/meta-learning.html#define-the-meta-learning-problem">Meta-Learning: Learning to Learn Fast</a> (2018. Lilian Weng)</li>
<li>생각많은 소심남님 Post : <a href="https://talkingaboutme.tistory.com/entry/DL-Meta-Learning-Learning-to-Learn-Fast">[DL] Meta-Learning: Learning to Learn Fast</a></li>
<li>rhcsky님 Post : <a href="https://rhcsky.tistory.com/5">Meta Learning</a></li>
<li>kakaobrain : <a href="https://www.kakaobrain.com/blog/106">퓨샷 러닝(few-shot learning) 연구 동향을 소개합니다.</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[6주차] 논문리뷰: CAM, Grad-CAM, Grad-CAM++]]></title>
            <link>https://velog.io/@tobigs_xai/CAM-Grad-CAM-Grad-CAMpp</link>
            <guid>https://velog.io/@tobigs_xai/CAM-Grad-CAM-Grad-CAMpp</guid>
            <pubDate>Wed, 26 May 2021 06:35:51 GMT</pubDate>
            <description><![CDATA[<p>출처 표기가 없는 그림의 각 섹션의 원 논문을 참고하였다.</p>
<h2 id="1-learning-deep-features-for-discriminative-localization-2016-paper">1. <strong>Learning Deep Features for Discriminative Localization, 2016</strong> <a href="https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Zhou_Learning_Deep_Features_CVPR_2016_paper.pdf">[paper]</a></h2>
<h3 id="1-1-abstract">1-1. Abstract</h3>
<p>본 연구에서는 Global Average Pooling(이하 GAP) 레이어를 다시 살펴보고, image level label를 이용한 학습 없이도 CNN이 Localization 능력을 가질 수 있도록 명시적으로 지원하는 방법을 조명한다. GAP는 이전에 regularization 용도로 제안되었지만, 우리는 CNN의 암묵적인 attention을 드러내는 generic localizable deep representation을 구축한다는 것을 발견했다. GAP의 단순함에도 불구하고, bounding box annotation 없이 학습한 결과 ILSVRC 2014에서 37.1%의 top-5 object localization error를 달성하였다. 우리는 다양한 실험을 통해 classification task를 해결하기 위해 학습된 네트워크가 localization 능력이 있음을 검증했다.</p>
<h3 id="1-2-gap란">1-2. <strong>GAP란?</strong></h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/c8d9d562-a38c-4c59-8619-8c9b5066789e/Untitled.png" alt="">
그림 출처: <a href="https://you359.github.io/cnn%20visualization/CAM/">https://you359.github.io/cnn visualization/CAM/</a></p>
<p>GAP layer는 각각의 feature map의 값들을 평균을 취한 것이다. 즉, feature map의 크기와 관계없이 channel이 k개라면 k개의 평균 값을 얻을 수 있다.(그림에서는 논문과 일관성을 갖기 위해 그림에서 평균을 취하지 않고 합으로 표현했다.) 이러한 GAP는 Fully Connected(이하 FC) Layer와 달리 연산이 필요한 파라미터 수를 크게 줄일 수 있으며, 결과적으로 regulariztion과 유사한 동작을 통해 overfitting을 방지할 수 있다. 또한 FC layer는 Convolution layer에서 유지하던 위치정보가 손실되는 반면에, GAP layer는 위치정보를 담고 있기 때문에 localization에 유리하다.</p>
<h3 id="1-3-class-activation-map이하-cam">1-3. <strong>Class Activation Map(이하 CAM)</strong></h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/f50f3485-5b96-4225-8de0-a30c7f9a0db5/Untitled%201.png" alt="">
그림 출처: <a href="https://you359.github.io/cnn%20visualization/CAM/">https://you359.github.io/cnn visualization/CAM/</a></p>
<p>GAP layer를 사용하여 classification을 진행하는 모델의 구조는 위와 같다. 즉, CNN layer를 거쳐 마지막에 k개의 feature map을 얻는다면, GAP를 적용하여 총 k개의 output을 얻을 수 있다. 이 값을 선형결합한 후 여기에 softmax를 적용하면 최종 output probability가 출력된다. 이를 수식으로 표현하면 다음과 같다.</p>
<p>$F_k = \underset{x,y}\Sigma f_k(x,y)$: k번째 Feature map의 GAP</p>
<p>$S_c = \underset{k}\Sigma w_k^cF_k$: softmax의 input</p>
<p>$w_k^c$: class c에 대한 $F_k$의 중요도</p>
<p>$P_c = {\exp(S_c)\over \sum_c \exp(S_c)}$: class cc에 대한 softmax output</p>
<p>이 때, 바이어스는 classification 성능에 영향을 미치지 않는다고 가정하고 bias는 0으로 설정한다.</p>
<p>$S_c = \underset{k}\Sigma w_k^cF_k=\underset{k}\Sigma w_k\underset{x,y}\Sigma f_k(x,y)=\underset{x,y}\Sigma\underset{k}\Sigma w_k^cf_k(x,y)$</p>
<p>이때, class c에 대한 activation map을 다음과 같이 $M_c$로 정의한다.</p>
<p>$M_c(x,y)=\underset{k}\Sigma w_k^cf_k(x,y)$</p>
<p>즉, $S_c=\sum_{x,y}M_c(x,y)$로 쓸 수 있고, $M_c(x,y)$는 class c에 $(x,y)$지점이 미치는 영향을 나타낸다. 이를 그림으로 표현하면 아래와 같다.
<img src="https://images.velog.io/images/tobigs_xai/post/321bc396-cbd8-4b62-a989-d36bd4b4068b/Screen_Shot_2021-05-09_at_1.36.54_PM.png" alt="">
이제 class activation map을 input image의 사이즈로 upsampling하면 특정 class c와 관련된 부분을 찾을 수 있다. 결과는 아래와 같다. 관련 실험 내용과 코드 리뷰는 <a href="https://joungheekim.github.io/2020/09/29/paper-review/">여기</a>를 참고하길 바란다.
<img src="https://images.velog.io/images/tobigs_xai/post/f11cb239-a569-4b11-8c3d-268b84f0e861/Screen_Shot_2021-05-09_at_1.39.30_PM.png" alt=""></p>
<h2 id="2-grad-cam-visual-explanations-from-deep-networks-via-gradient-based-localization-2017-paper">2. Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization, 2017 <a href="https://arxiv.org/abs/1610.02391">[paper]</a></h2>
<h3 id="2-1-abstract">2-1. Abstract</h3>
<p>우리는 대규모 CNN-based mode에서 의사결정을 위한 &#39;visual explanation&#39;을 생성하여 투명성을 증가하는 기술을 제안한다. 우리의 접근법인 Gradient-weighted Class Activation Mapping(이하 Grad-CAM)은 어떤 target concept일지라도 final convolutional layer로 흐르는 gradient를 사용하여 이미지의 중요한 영역을 강조하는 localization map을 만든다. </p>
<p>이전의 접근법과 달리 Grad-CAM은 모델의 구조 변화나 재학습 없이 다양한 CNN 모델군에 사용할 수 있다: ①FC layer가 있는 CNN 모델(e.g. VGG) ② structured output을 가진 CNN 모델(e.g. captioning) ③ multi-modal input을 가지는 태스크에 사용되는 CNN (e.g. visual question answering(이하 VQA)) 혹은 강화학습. 우리는 Grad-CAM과 기존의 세분화된 시각화 기법과 결합하여 고해상도 class-discriminative visualization인 Guided Grad-CAM을 만들고, 이것을 이미지 분류, 이미지 캡셔닝, VQA 모델, ResNet 기반 모델에 적용하였다.</p>
<p>이미지 분류 모델에서 우리의 시각화 기법은 ⓐ 이 모델들의 실패에 대한 인사이트를 제공한다(비합리적인 예측은 합리적인 설명을 가지고 있음을 보인다) ⓑ ILSCRC-15 weakly-supervisied localization task에서 기존의 방법들보다 뛰어난 성능을 보여준다 ⓒ 기본 모델에 더 충실하다ⓓ 데이터셋의 바이어스를 통해 모델 일반화를 돕는다. 이미지 캡셔닝과 VQA에서 우리의 시각화는 non-attention based models일지라도 input을 localize하는 것이 가능함을 보여준다. 마지막으로, human study를 실시하여 사용자가 딥러닝 모델의 예측에 대해 적절한 신뢰를 얻는 데 도움이 되고, 같은 결과를 내는 모델일지라도 Grad-CAM은 강한 모델과 약한 모델을 식별할 수 있도록 도와주는 것을 보여준다. 코드는 <a href="https://github.com/ramprs/grad-cam/">여기</a>, 그리고 데모비디오는 <a href="https://www.youtube.com/watch?v=COjUB9Izk6E">여기</a>에서 확인할 수 있다.</p>
<h3 id="2-2-grad-cam">2-2. Grad-CAM</h3>
<p>이전 연구들을 통해 CNN의 deeper representation은 higer-level visual construct를 포착한다. 게다가, Convolutional Feature가 지니는 공간적 정보는 FC layer에서 손실되기 때문에 세밀한 공간적 정보와 high-level semantic의 절충안을 찾고자 마지막 Convolutional Layer를 사용했다. 이 레이어의 뉴런들은 object와 같이 이미지에서 클래스의 의미와 관련된 정보들을 포함하고 있다. Grad-CAM은 마지막 CNN layer로 흐르는 gradient 정보를 이용하여 의사결정과 관련된 각 뉴런의 중요도를 이해하고자 하였다.
<img src="https://images.velog.io/images/tobigs_xai/post/b21cae32-0e8a-4818-b401-97b597c66ea5/Screen_Shot_2021-05-09_at_3.04.24_PM.png" alt="">
CAM은 GAP가 있어야만 사용할 수 있다. 따라서 GAP가 없는 경우 FC layer를 GAP로 대체한 후 재학습을 시켜준 후 visualzation을 진행하였다. 반면, Grad-CAM은 범용적으로 CAM을 사용하기 위해 CAM의 가중치 w를 다른 값으로 대체한다. 이를 위해 다음과 같이 notation을 정의한다.</p>
<p>$L^c_{Grad-CAM} \in \mathbb{R}^{u \times v}$: 클래스 c에 대한 $u \times v$ 사이즈의 class-discriminative localiztion map</p>
<p>$y_c$: softmax 이전의 class c에 대한 score. 이 값을 일반화하여 classification외에 caption이나 question의 answer의 word가 될 수도 있다.</p>
<p>$A^k\in \mathbb{R}^{u \times v}$: 마지막 CNN layer의 k번째 채널의 feature map</p>
<p>$\alpha_k^c={1\over Z}\underset{i}\Sigma \underset{j}\Sigma {\partial y^c\over \partial A^k_{ij}}$: deep network의 <em>partial linerarization</em>을 의미하며, 타겟 클래스 c에 대한 k채널의 feature map의 중요도를 나타낸다. 이 때, ${\partial y^c\over \partial A^k_{ij}}$는 backpropagation을 통해 계산할 수 있고, ${1\over Z}\underset{i}\Sigma \underset{j}\Sigma$는 GAP를 의미한다.</p>
<p>$Z$: feature map의 픽셀 수$(=u\times v)$</p>
<p>이제, Activation map을 위에서 구한 가중치로 선형결합한 후 ReLU를 적용하면 된다. </p>
<p>$L^c_{Grad-CAM}=ReLU\left(\Sigma_k\alpha^c_kA^k\right)$</p>
<p>ReLU는 class c에 긍정적인 영향을 미치는 feature만을 확인하기 위해 사용한다. 즉, 부정적인 영향을 끼치는 픽셀을 알아보기 위해서는 Counterfactual explanation$L^c_{Grad-CAM}=ReLU\left(-\Sigma_k\alpha^c_kA^k\right)$를 사용하면 된다. ReLU가 없는 경우 localization map는 가끔 우리가 원하는 클래스 외의 지역을 하이라이트하고, localization 성능이 떨어진다. 
<img src="https://images.velog.io/images/tobigs_xai/post/38dc6859-137c-4ea8-b084-25739b0e3f84/Screen_Shot_2021-05-09_at_5.08.25_PM.png" alt=""></p>
<h3 id="2-3-grad-cam이-cam의-일반화인-이유">2-3. Grad-CAM이 CAM의 일반화인 이유</h3>
<p>CAM의 수식은 다음과 같다. </p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/a7994b74-8697-48e9-b3aa-d82aa5346ced/Screen_Shot_2021-05-09_at_4.37.45_PM.png" alt="">
GAP output $F^k$을 다음과 같이 정의할 수 있다.</p>
<p>$F^k = {1 \over Z}\sum_i\sum_jA^k_{ij}$</p>
<p>즉, $F^k$를 식(3)에 대입하면 CAM은 최종 스코어를 다음과 같이 계산한다.</p>
<p>$Y^c=\sum_kw^c_kF^k$</p>
<p>이때, $w^c_k$는 k번째 feature map과 class c를 잇는 가중치를 의미한다. 클래스 스코어$Y^c$에 대한 feature map $F^k$의 gradient를 계산하면 다음과 같다.</p>
<p>${\partial Y^c\over \partial F^k}={{\partial Y^c\over \partial A^k_{ij}}\over{\partial F^k\over \partial A^k_{ij}}}$</p>
<p>이때, ${\partial F^k\over \partial A^k_{ij}} = {\partial\over\partial A^k_{ij}}{1 \over Z}\sum_i\sum_jA^k_{ij}={1\over Z}$이므로 다음과 같은 식을 얻을 수 있다.</p>
<p>${\partial Y^c\over \partial F^k}={\partial Y^c\over \partial A^k_{ij}}Z$</p>
<p>또한, ${\partial Y^c\over \partial F^k}={\partial\over\partial F^k}\sum_kw^c_kF^k=w^c_k$이므로 다음과 같이 정리할 수 있다.</p>
<p>$w^c_k=Z{\partial Y^c\over \partial A^k_{ij}}$</p>
<p>모든 픽셀 (i,j)에 대해 양변에 시그마를 적용한다.</p>
<p>$\sum_i\sum_jw^c_k=\sum_i\sum_jZ{\partial Y^c\over \partial A^k_{ij}}$</p>
<p>이때, $Z, w_k^c$는 (i,j)에 무관하고, $Z=\sum_i\sum_j1$이므로 다음과 같이 $w^c_k$를 얻을 수 있다.</p>
<p>$w_k^c=\sum_i\sum_j{\partial Y^c\over \partial A^k_{ij}}$</p>
<p>${1\over Z}$는 normalization term이므로 Grad-CAM에서는 $\alpha_k^c=w_k^c$임을 알 수 있다. <strong>따라서 Grad-CAM은 CAM의 일반화 버전이다.</strong></p>
<h3 id="2-4-guided-grad-cam">2-4. Guided Grad-CAM</h3>
<p>Grad-CAM은 이미지 픽셀 단위의 세밀한 요소들 다루지 못한다는 단점이 있다. Guided backpropagation visualization은 ReLu layer를 거쳐 backpropagating할 대, 음의 gradient를 없애며 시각화한다. 이것은 직관적으로 뉴런에 의해 탐지되는 픽셀을 알아보기 위함이다. Grad-CAM은 쉽게 물체를 localize할 수 있지만 조잡한 heatmap을 통해 왜 네트워크가 특정 물체를 해당 클래스로 분류하였는지 알기 어렵다. 두 방법론의 장점을 결합하여 Guided backpropagation과 Grad-CAM을 element-wise 곱하여 시각화를 진행한다.($L^c_{Grad-CAM}$은 먼저 2차원 선형 보간법을 이용하여 인풋 이미지와 같은 사이즈로 upscaling한다.)
<img src="https://images.velog.io/images/tobigs_xai/post/0fb4f1a5-f52c-443f-8461-04315dd2f18d/Screen_Shot_2021-05-09_at_5.06.00_PM.png" alt=""></p>
<p>결과는 위와 같다. <strong>시각화 결과는 고해상도인 동시에 class-discriminative한 것을 볼 수 있다. Guided backpropagation with Decovolution과 비슷한 결과이지만 훨씬 노이즈가 적다.</strong></p>
<h3 id="2-5-evaluating-localization-ability-of-grad-cam">2-5. Evaluating Localization Ability of Grad-CAM</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/e2adf99a-0b79-429e-a709-4285c20c6b02/Screen_Shot_2021-05-09_at_5.18.40_PM.png" alt=""></p>
<ul>
<li><p>Weakly-Supervised Localization</p>
<p>  Weakly-Supervised Localization은 bounding box에 대한 정보 없이 학습하는 모델을 의미한다. 이미지가 주어지면, 먼저 네트워크로부터 class prediction을 진행하고, 예측한 클래스에 대한 Grad-CAM map을 생성한다. 최대 강도의 15%를 threshold로 사용하여 각각의 픽셀을 이분화한다. 가장 큰 하나의 segment 주위에 bounding box를 그린다. <strong>GRAD-CCAM은 모델의 구조에 변화를 가하지 않기 때문에 classification 성능의 손실 없이 높은 localization 성능을 자랑한다.</strong></p>
</li>
<li><p>Weakly-Supervised Segmentation</p>
<p>  Semantic Segmentation은 각각의 픽셀들에 대해 classification을 진행한다. Weakly-Supervised Segmentation은 imagle-level에 대한 정보가 없이 학습이 이뤄지기 때문에 image classification dataset으로부터 데이터를 쉽게 구할 수 있다. 기존의 알고리즘은 weak localization seed에 따라 성능이 민감하게 차이난다는 단점이 있다. 결과는 아래와 같다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/8b043f17-596b-443a-b039-656cff29950e/Screen_Shot_2021-05-09_at_5.28.07_PM.png" alt=""></p>
<ul>
<li><p>Pointing Game
<img src="https://images.velog.io/images/tobigs_xai/post/b249c49e-35aa-4f31-979f-001aeea2b7e7/Screen_Shot_2021-05-09_at_6.47.42_PM.png" alt="">
  그림 출처: <a href="https://www.youtube.com/watch?v=faGsrPX1yFM">https://www.youtube.com/watch?v=faGsrPX1yFM</a></p>
<p> pointing game experiment는 이미지에서 타겟 물체를 localizing하는 시각화 방법들의 discriminativeness를 평가한다. 히트맵에서 가장 크게 activate된 지점을 추출하고 실제 물체의 라벨과 비교하여 $Acc={Hits\over Hits+Misses}$를 구한다. 그러나 이 방법론은 정확도만을 측정하기 때문에 우리는 recall을 고려하기 위해 top-5 class prediction에 대한 localization map을 계산하고 만약 ground-truth가 아닌 부분을 아니라고 정확히 예측했다면 hit으로 분류하였다. <strong>그 결과 Grad-CAM은 70.58%의 성능으로 c-MWP의 60.30%를 상회하였다. 또한, Grad-CAM의 경우 이미지에서 해당 클래스가 나타나지 않으면 c-MWP와 달리 heatmap이 그려지지 않는 것을 확인할 수 있다.</strong></p>
</li>
</ul>
<h3 id="2-6-evaluating-visualizations">2-6. Evaluating Visualizations</h3>
<ul>
<li><p>Class Discrimination</p>
<p> Grad-CAM이 클래스들을 구별하는 데 도움이 되는지를 측정하기 위해 2개의 카테고리가 들어간 이미지셋인 PASCAL VOC 2007 val set에 대해 하나의 클래스를 시각화하였다. VGG-16과 AlexNet CNN에 대해 다음 네가지 방법론1) Deconvolution 2) Guided Backpropagation 3) Deconvolution Grad-CAM 4) Guided Grad-CAM을 사용하였다.
<img src="https://images.velog.io/images/tobigs_xai/post/8b712935-4483-483a-bd5a-358ca2657d3d/Screen_Shot_2021-05-09_at_7.02.48_PM.png" alt="">
  43명의 Amazone Mechanical Turk(이하 AMT)에게 Fig.5 (b)를 보여주고, 두개의 카테고리 중 어느 것이 보이는지에 대해 질문을 하였다. 직관적으로 보면, 좋은 설명은 클래스를 쉽게 알아보는 것을 의미한다. 그리고 결과는 아래와 같다. </p>
</li>
</ul>
<blockquote>
<p>Deconv (53.33%)
Guided Backprop (44.44%)
Guided Grad-CAM: 61.23%
Deconv Grad-CAM: 60.37%</p>
</blockquote>
<p>   재미있는 점은 Guided backpropagation이 미적으로 아름다워 보이지만 Deconvolution이 더 class-dicriminative라는 점이다.</p>
<ul>
<li><p>Trust worthiness</p>
<p>  Guided Backpropagation과 Guided Grad-CCAM의 visualization을 비교하기 위해 AlexNet과 VGG-16을 사용하였다. 우리는 이미 AlexNet보다 VGG의 성능이 더 좋다는 것을 알고 있다. 54명의 AMT 작업자들에게 Fig.5 (c)와 같이 제시하고 어떤 설명이 더 믿을만한지에 대해 상대적 수치(+2/+1/0/-1/-2)로 물어보았다. 바이어스를 제거하기 위해 VGG-16과 AlexNet이 비슷한 확률로 output을 내는 경우에 대해 실험을 진행하였다. 피험자들은 VGG-16이 더 정확한 모델로 판단하였다. 그리고 Guided Backpropagation은 평균적으로 1(VGG가 AlexNet보다 살짝 더 믿을 만하다)의 점수를 받은 것에 반해, Grad-CAM은 평균적으로 1.27(VGG가 확실히 더 믿을 만 하다)의 점수를 받았다.</p>
</li>
</ul>
<h3 id="2-7-diagnosing-image-classification-cnns-with-grad-cam">2-7. Diagnosing Image Classification CNNs with Grad-CAM</h3>
<ul>
<li><p>Analyzing Failure Modes for VGG-16</p>
<p>  VGG-16이 분류를 실패한 케이스들에 대해 실제 라벨과 예측된 라벨의 Guided Grad-CAM을 그려보았다.
 <img src="https://images.velog.io/images/tobigs_xai/post/8a12e847-bf88-44bc-ac51-7f13f907179e/Screen_Shot_2021-05-09_at_7.29.29_PM.png" alt="">
  위의 그림을 통해 알 수 있듯이 잘못된 예측에는 그럴만한 이유가 있음을 알 수 있다. <strong>즉, Guided Grad-CAM의 장점 중 하나는 고해상도이고, class-discriminative하므로 이러한 분석을 쉽게 할 수 있다.</strong></p>
</li>
<li><p>Effect of Adversarial Noise on VGG-16</p>
<p>  Adversarial attack은 현재의 deep network가 가지는 취약점이다. 입력 이미지에 인지할 수 없는 노이즈를 넣으면 높은 확률로 잘못 분류를 한다. VGG-16모델에 대해 실제로 존재하는 카테고리의 확률은 낮고, 존재하지 않는 카테고리의 확률이 높은 adversarial image를 생성하여 Grad-CAM visualization을 실행하였다. <strong>그 결과 아래와 같이 Grad-CAM이 adversarial noise에 대해 상당히 robust함을 알 수 있다.</strong></p>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/edc18fd6-eee4-4aeb-b63b-a77a69bb6296/Screen_Shot_2021-05-09_at_7.35.10_PM.png" alt=""></p>
<ul>
<li><p>Identifying Bias in Dataset</p>
<p>  Grad-CAM의 또다른 사용법은 training dataset에 있는 bias를 탖고 줄이는 것이다. bias가 포함된 데이터셋으로 학습된 모델을 실제 세계를 일반화하지 못한다. 이미지 검색 엔진을 통해 의사와 간호사에 대한 데이터250개씩을 구하고 VGG-16모델을 binary classification task를 수행하도록 학습시켰다. 이 모델은 validation accuracy는 좋았지만 82% test acc로 generalize는 잘 되지 않았다. 중간 열을 보면, 모델은 의사와 간호사를 구분할 때 얼굴이나 머리 스타일을 본 것을 확인할 수 있다. 따라서 여자 의사를 간호사로, 남자 간호사를 의사로 잘못 분류하였다. 실제로 의사에 대한 이미지 검색 결과 78%가 남자였고, 간호사 검색 결과 93%가 여자였다. 따라서 이러한 Grad-CAM의 결과를 바탕으로 바이어스를 줄이기 위해 남자 간호사와 여자 의사에 대한 이미지를 학습 데이터에 추가해야 함을 알 수 있다. 새로 학습한 결과는 오른쪽 열과 같다. 이 실험을 통해 Grad-CAM은 데이터셋에 존재하는 bias를 찾고 줄이는 것을 도와줄 수 있다. 이는 generalization 성능을 높이는 것 뿐만 아니라 사회에서 의사결정을 할 때에는 공정하고 윤리적인 결과를 나타내야 하기 때문에 매우 중요하다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/dcd769a5-a9e4-4538-aeb3-a1eec448f199/Screen_Shot_2021-05-10_at_12.56.38_AM.png" alt=""></p>
<h3 id="2-8-grad-cam-for-image-captioning-and-vqa">2-8. Grad-CAM for Image Captioning and VQA</h3>
<ul>
<li><p>Image Captioning</p>
<p>  이미지 캡션에 대한 위치를 시각화하기 위해 Grad-CAM을 사용할 수 있다. 본 연구에서는 finetuned VGG-16 모델과 LSTM-based language model을 사용한 neuraltalk2를 이용하였다. 캡션이 주어지면 log probability에 대한 마지막 CNN layer의 gradient를 계산하고 Grad-CAM visualization을 생성하였다.</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/798b9477-976c-446d-b4dc-dd72a460abf0/Screen_Shot_2021-05-09_at_7.51.06_PM.png" alt="">
    왼쪽 그림은 Grad-CAM이 생성한 것이고, 오른쪽 그림은 Fully Convolutional Localization Newtwork가 single forward pass로 language model이 만든 캡션에 대해 Region of interest를 bounding box로 표시한 것이다. 오른쪽의 bounding box를 기준으로 Grad-CAM의 박스 내부와 외부의 평균 activation 값의 비율을 계산하였다. 모든 이미지를 균일하게 highlight한 경우를 baseline인 1로 설정했을 때, Grad-CAM은 $3.27\pm 0.18$을 달성했고, Guided Backpropagation은 $2.32\pm0.08$을, Guided Grad-CAM은 $6.38 \pm 0.99$를 달성했다. <strong>따라서 Grad-CAM은 bounding box로 학습시키지 않고 DenseCap 모델의 image region을 잘 localize함을 알 수 있다.</strong></p>
<ul>
<li><p>Visual Question Answering</p>
<p> 일반적인 VQA pipeline은 이미지를 처리하기 위한 CNN과 question을 위한 RNN language model로 이뤄져 있다. 이미지와 질문은 일반적으로 answer를 예측하는 것이다. 즉, answer space가 1000개라면, 1000-way classification 문제이다. 따라서 answer를 하나 뽑아서 Grad-CAM visualization을 통해 answer를 설명하고자 한다. task가 복잡함에도 불구하고 아래 그림에 나타난 explanation은 상당히 직관적이고 정보적이다.
<img src="https://images.velog.io/images/tobigs_xai/post/e208dbe2-7914-4794-9f19-645f9fbbdf34/Screen_Shot_2021-05-09_at_8.23.28_PM.png" alt=""></p>
<p> 정량적으로 Grad-CAM을 평가하기 위해 occlusion map과의 correlation을 구하였다. occlusion map에 대한 rank correlation은 Guided Backpropagation의 경우 $0.42\pm0.038$이고, Grad-CAM의 경우 $0.60\pm0.038$이다. 즉, Grad-CAM이 더 높은 faithfulness를 보여준다.</p>
</li>
</ul>
<h3 id="2-9-code-review">2-9. <a href="https://colab.research.google.com/drive/1ScaedEzxY-ZH2V34Sve8wZkT6GryFEIc?usp=sharing">Code Review</a></h3>
<pre><code class="language-python">def generate_gradcam(img_tensor, model, class_index, activation_layer):
    model_input = model.input

    # y_c : class_index에 해당하는 CNN 마지막 layer op(softmax, linear, ...)의 입력
    y_c = model.output[0, class_index]

    # A_k: activation conv layer의 출력 feature map
    A_k = model.get_layer(activation_layer).output

    # model의 입력에 대해서,
    # activation conv layer의 출력(A_k)과
    # 최종 layer activation 입력(y_c)의 A_k에 대한 gradient,
    # 모델의 최종 출력(prediction) 계산
    get_output = K.function([model_input], [A_k, K.gradients(y_c, A_k)[0]])
    [conv_output, grad_val] = get_output([img_tensor])

    # batch size가 포함되어 shape가 (1, width, height, k)이므로
    # (width, height, k)로 shape 변경
    # 여기서 width, height는 activation conv layer인 A_k feature map의 width와 height를 의미함
    conv_output = conv_output[0]
    grad_val = grad_val[0]

    # global average pooling 연산
    # gradient의 width, height에 대해 평균을 구해서(1/Z) weights(a^c_k) 계산
    weights = np.mean(grad_val, axis=(0, 1))

    # activation conv layer의 출력 feature map(conv_output)과
    # class_index에 해당하는 weights(a^c_k)를 k에 대응해서 weighted combination 계산

    # feature map(conv_output)의 (width, height)로 초기화
    grad_cam = np.zeros(dtype=np.float32, shape=conv_output.shape[0:2])
    for k, w in enumerate(weights):
        grad_cam += w * conv_output[:, :, k]

    # 계산된 weighted combination 에 ReLU 적용
    grad_cam = np.maximum(grad_cam, 0)

    return grad_cam, weights</code></pre>
<p>파이토치 코드는 <a href="https://www.secmem.org/blog/2020/01/17/gradcam/">여기</a>를 참고하길 바란다.</p>
<h2 id="3-grad-cam-improved-visual-explanations-for-deep-convolutional-networks">3. Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks</h2>
<h3 id="3-1-abstract">3-1. Abstract</h3>
<p>지난 10여 년간 CNN 모델은 복잡한 비젼 문제들을 해결하는 데 큰 성공을 거두었다. 그런난, 이러한 deep model들은 &quot;black box&quot;로 여겨지며 내부의 작동원리를 파악하는 데 어려움을 겪었다. 최근에 설명 가능한 딥러닝 모델에 대한 중요한 연구들이 있었고, 본 논문은 이 방향성을 위해 노력하였다. 최근에 발표된 방법인 Grad-CAM을 발전하여, 우리는 SOTA와 비교하여 하나의 이미지에 여러 종류의 object가 발생한 경우 설명하고 localization하기 위해 CNN 모델 예측에 대해 더 나은 visual explanation을 제공하는 일반화된 방법인 Grad-CAM++을 제안한다. 우리는 특정 클래스에 대한 visual explanation을 만들기 위해 해당 클래스 스코어에 대한 마지막 convolutional layer의 feature map의 양의 편미분 값에 대한 가중 합을 사용하는 방법을 제안하며, 이에 대한 수학적 유도를 제공한다. standard dataser에 대한 Grad-CAM++의 classification, image caption generation, 3D action recognition, knowledge distillation 등의 다양한 태스크에서 진행된 실험과 평가는 주관적, 객관적 측면에서 더 나은 성능을 보여준다.</p>
<h3 id="3-2-grad-cam의-한계">3-2. Grad-CAM의 한계</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/0c9ea693-28c5-49f4-98f1-df08786a6a59/Screen_Shot_2021-05-10_at_12.16.06_AM.png" alt="">
Grad-CAM++는 Grad-CAM의 두가지 문제를 해결했다. 첫번째는 하나의 이미지에서 같은 클래스의 물체가 여러번 발생하는 경우이다. 위 그림의 1번 행에는 강아지가 총 여섯마리이지만, Grad-CAM의 heat map에서는 세마리 정도밖에 구별하지 못한다. 2번행도 마찬가지로 세마리의 강아지가 있지만 heat map에 나타난 것은 두마리 뿐이다. 두번째 문제는 Grad-CAM은 object의 전체 영역을 커버하지 못한다는 점이다. 3번 행을 보면 뱀의 전체 영역을 커버하지 못하고 중간에 끊기는 점이 생긴다. 4번 그림도 새의 몸통에 집중되어 있고, 다리나 부리에는 heat map이 그려지지 않은 것을 확인할 수 있다. 반면 마지막 열을 보면 Grad-CAM++는 이러한 문제를 해결하였다.</p>
<h3 id="3-3-grad-cam의-방법론">3-3. Grad-CAM++의 방법론</h3>
<p>Grad-CAM의 GAP는 주요한 gradient를 하나의 값으로 합치기 때문에 visualization에서 뭉개지는 현상이 나타난다. 따라서 Grad-CAM++에서는 이를 weighted sum으로 대체하였다.</p>
<p>$Y^c =\sum_kw^c_k\sum_i\sum_jA^k_{ij}$</p>
<p>$w^c_k=\sum_i\sum_j\alpha^{kc}<em>{ij}\cdot ReLU\left({\partial Y^c\over\partial A^k</em>{ij}}\right)$: class c에 대한 k번째 feature map의 중요도</p>
<p>Grad-CAM에서 사용한 $w_k^c=\sum_i\sum_j{\partial Y^c\over \partial A^k_{ij}}$와 비교하면 pixel-level에서 ReLU가 적용되고, $\alpha^{kc}<em>{ij}$가 추가된 것을 확인할 수 있다. $\alpha^{kc}</em>{ij}$는 class c에 대한 convolutional feature map $A^k$의 gradient에 대한 가중 co-efficient이다. ReLU는 이전과 마찬가지로 class score에 긍정적 영향을 미치는 양의 gradient만 사용하기 위함이다. 새로 정의한 w를 대입하면 아래와 같이 쓸 수 있다.</p>
<p>$Y^c =\sum_k\sum_a\sum_b\alpha^{kc}<em>{ab}\cdot ReLU\left({\partial Y^c\over\partial A^k</em>{ab}}\right)\sum_i\sum_jA^k_{ij}=\sum_k\left[\sum_{i,j}\left(\sum_{a,b}\alpha^{kc}<em>{ab}\cdot ReLU\left({\partial Y^c\over \partial A^k</em>{ab}}\right)\right)A^k_{ij}\right]$</p>
<p>ReLU는 threshold를 넘는지 판단하는 함수이므로 미분할 때는 잠시 제거한다. 양변을 $A^k_{ij}$에 대해 편미분 하면 다음과 같다.</p>
<p>${\partial Y^c \over \partial A^k_{ij}}=\sum_{a,b}\alpha^{kc}<em>{ab}\cdot {\partial Y^c\over \partial A^k</em>{ab}}+\sum_{a,b}A^k_{a,b}\left(\alpha^{kc}<em>{ab}\cdot{\partial^2Y^c\over\left(\partial A^k</em>{ij}\right)^2}\right)$</p>
<p>한번 더 양변을 $A^k_{ij}$에 대해 편미분 하면 다음과 같다.</p>
<p>${\partial^2 Y^c \over \left(\partial A^k_{ij}\right)^2}=2\alpha^{kc}<em>{ij}\cdot {\partial^2Y^c\over\left(\partial A^k</em>{ij}\right)^2}+\sum_{a,b}A^k_{a,b}\left(\alpha^{kc}<em>{ab}\cdot{\partial^3Y^c\over\left(\partial A^k</em>{ij}\right)^3}\right)$</p>
<p>위 식을 $\alpha^{kc}_{ij}$에 대해 정리하면 다음과 같다.</p>
<p>$\alpha^{kc}<em>{ij}={{\partial^2Y^c\over\left(\partial A^k</em>{ij}\right)^2}\over2\alpha^{kc}<em>{ij}\cdot {\partial^2Y^c\over\left(\partial A^k</em>{ij}\right)^2}+\sum_{a,b}A^k_{a,b}{\partial^3Y^c\over\left(\partial A^k_{ij}\right)^3}}$</p>
<p>만약, 모든 i,j에 대해 $\alpha^{kc}_{ij}={1\over Z}$인 경우 Grad-CAM의 식이 된다. 즉, Grad-CAM++는 이름을 통해 알 수 있듯이 Grad-CAM의 일반화된 버전이다. <strong>단 하나의 제한 사항은 $Y^c$가 미분가능한 smooth function이어야 한다.</strong> 따라서 Grad-CAM과 달리 무한번 미분 가능한 softmax 레이어를 사용한다.(Grad-CAM은 softmax 이전 레이어를 사용했다) 이를 이용하면 계산 복잡도를 줄일 수 있다. 자세한 내용은 원 논문을 참고하길 바란다.</p>
<h3 id="3-4-grad-cam의-결과">3-4. Grad-CAM++의 결과</h3>
<p>정성적인 결과는 아래와 같다. 위에서 언급한 Grad-CAM의 한계를 극복한 것을 확인할 수 있다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/3770e5fc-4f69-44bb-806c-01d7c9e76603/Screen_Shot_2021-05-10_at_12.54.57_AM.png" alt=""></p>
<blockquote>
<p>Average Drop %: 중요한 부분을 occlusion했을 때 성능 저하.
% increase in confidence: 중요하지 않은 부분을 occlusion 했을 때 성능 향상
win%: 주어진 데이터셋에서 explanation map의 confidence가 높은 방법론이 이긴 것이다. 전체 이미지 중 이긴 비율을 나타낸다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/tobigs_xai/post/ad135da1-8e96-4ed7-bd5b-b1cd2ffd6dd3/Screen_Shot_2021-05-10_at_12.56.38_AM.png" alt="">
또한, 딥러닝과 관련된 지식이 없는 13명의 실험 참가자들에게 어떤 explanation algorithm이 더 믿을만한지에 대해 질문하였다. Grad-CAM을 baseline으로 사용하였다. 가장 많은 투표를 받은 알고리즘은 VGG-16을 사용한 모델이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/66b78f0b-47f9-4ffe-a100-f48afd22a4f5/Screen_Shot_2021-05-10_at_1.07.04_AM.png" alt=""></p>
<p>또한, 위와 같이 Grad-CAM과 Grad-CAM++로 생성한 explanation map들을 제시하고, 어떤 것이 더 나은지에 대해 물어보았다. 총점 250점 중 109.69점이 Grad-CAM++이 낫다고 대답했고, 84.23이 같다고 대답했으며, 56.08이 Grad-CAM이 낫다고 대답하였다. </p>
<h2 id="4-summary">4. Summary</h2>
<p><img src="https://images.velog.io/images/tobigs_xai/post/1a0820a2-5aae-458c-a147-f83f234fc3bc/Screen_Shot_2021-05-10_at_12.52.31_AM.png" alt="">
작성자: 투빅스 15기 황보진경</p>
<h3 id="참고문헌"><strong>참고문헌</strong></h3>
<blockquote>
<ol>
<li>CAM<ul>
<li>Bolei Zhou, Khosla, Aditya, Lapedriza, Agata, Oliva, Aude, &amp; Torralba, Antonio. (2016). Learning Deep Features for Discriminative Localization. 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2921-2929.</li>
<li>you359. <em>Paper Review - Class Activation Map.</em> (2018.8.21.). <a href="https://you359.github.io/cnn%20visualization/CAM/">https://you359.github.io/cnn visualization/CAM/</a>. 검색일: 2021.05.09.</li>
</ul>
</li>
<li>Grad-CAM<ul>
<li>Selvaraju, Ramprasaath R, Cogswell, Michael, Das, Abhishek, Vedantam, Ramakrishna, Parikh, Devi, &amp; Batra, Dhruv. (2020). <em>Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization</em>. International Journal of Computer Vision, 128(2), 336-359.</li>
<li>Taesu Kim. <em>PR-053: Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization.</em> (2017.12.10.).<a href="https://www.youtube.com/watch?v=faGsrPX1yFM">https://www.youtube.com/watch?v=faGsrPX1yFM</a>. 검색일: 2021.05.09.</li>
<li>you359. <em>Paper Review - Grad-CAM.</em> (2018.8.22.). <a href="https://you359.github.io/cnn%20visualization/GradCAM/">https://you359.github.io/cnn visualization/GradCAM/</a>. 검색일: 2021.05.09.</li>
</ul>
</li>
<li>Grad-CAM++<ul>
<li>A. Chattopadhay, A. Sarkar, P. Howlader and V. N. Balasubramanian. <em>Grad-CAM++: Generalized Gradient-Based Visual Explanations for Deep Convolutional Networks</em>. (2018). IEEE Winter Conference on Applications of Computer Vision (WACV). pp. 839-847</li>
<li>Wonju Seo. <em>Grad-CAM++ 내용 정리 [XAI-3]</em>. (2021.4.9.). <a href="https://wewinserv.tistory.com/144">https://wewinserv.tistory.com/144</a>. 검색일: 2021.05.10.</li>
</ul>
</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[4주차] 논문리뷰]]></title>
            <link>https://velog.io/@tobigs_xai/4%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@tobigs_xai/4%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 25 May 2021 13:10:03 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[[5주차] 논문리뷰 - GNNExplainer: Generating Explanations for Graph Neural Networks]]></title>
            <link>https://velog.io/@tobigs_xai/5%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-GNNExplainer-Generating-Explanations-for-Graph-Neural-Networks</link>
            <guid>https://velog.io/@tobigs_xai/5%EC%A3%BC%EC%B0%A8-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-GNNExplainer-Generating-Explanations-for-Graph-Neural-Networks</guid>
            <pubDate>Wed, 19 May 2021 08:38:57 GMT</pubDate>
            <description><![CDATA[<p>작성자 : <a href="https://github.com/cryingjin">이예진</a></p>
<p>** 이번 시간에는 <a href="https://arxiv.org/pdf/1903.03894.pdf">GNNExplainer: Generating Explanations for Graph Neural Networks</a> 를 리뷰해보겠습니다. Graph Neural Networks를 설명할 수 있는 방법을 소개한 대표적인 논문입니다. (논문 흐름대로 리뷰되었으며 Graph에 대해서 공부한적이 없는 초심자를 위해서 작성되었습니다.)**</p>
<blockquote>
<h2 id="contents">Contents</h2>
</blockquote>
<h4 id="0-intro-machine-learning-with-graph">0. Intro: Machine Learning with Graph</h4>
<h4 id="1-gnnexplainer의-이유">1. GNNExplainer의 이유</h4>
<h4 id="2-gnnexplainer-overview">2. GNNExplainer Overview</h4>
<h4 id="3-gnnexplainer-explanations">3. GNNEXplainer explanations</h4>
<h4 id="4-experiments--conclusion">4. Experiments &amp; Conclusion</h4>
<h1 id="0-intro--machine-learning-with-graph">0. Intro : Machine Learning with Graph</h1>
<p>그래프를 설명하는 법을 배우기 전에, 기본적으로 machine learning with graph에 대해서 간단히 알아보겠습니다. </p>
<h3 id="ways-to-analyze-networks">Ways to Analyze Networks</h3>
<p>Networks 분석은 크게 4가지로 나뉘어집니다.</p>
<ul>
<li>Node classification -&gt; 주어진 노드 종류 분류</li>
<li>Link Prediction -&gt; 노드간의 연결 여부 예측</li>
<li>Community detection -&gt; 군집 감지</li>
<li>Network Similarity -&gt; (네트워크나 노드간의) 유사도 축정</li>
</ul>
<h3 id="application">Application</h3>
<p>Network 분석이 사용되는 예시로는 Social Circle Detection, Infrastructure, Knowledge, Link Prediction(reccomendation system), Embedding Nodes, Online Media, Polarization on Twitter, Misinformation, Predicting Virality, Product Adoption, Biomedicine, Side Effect 등이 있었습니다</p>
<h4 id="recommendation">Recommendation</h4>
<p>추천시스템에서 콘텐츠 추천에 graph를 이용한 link prediction이 사용됩니다.
<img src="https://images.velog.io/images/jinjin/post/ab2560fb-e4f9-4440-b34c-6e17edb34bcf/image.png" alt="">
<img src="https://images.velog.io/images/jinjin/post/441d89ca-b215-41e7-856c-4c7b61aa29ed/image.png" alt=""></p>
<h4 id="side-effect">Side Effect</h4>
<p>부작용 탐색에 네트워크(그래프)가 사용됩니다. 많은 약을 한꺼번에 섭취했을 때 나타나는 부작용에 대한 예측은 실제로 많은 실험을 해보는 것이 불가능하기 때문에 서로다른 graph를 만들고 link를 예측하는 방법으로 side effect를 탐색합니다.
<img src="https://images.velog.io/images/jinjin/post/a7c7f4ca-5f74-4364-8e68-280cb00c0a09/image.png" alt=""></p>
<h3 id="structure-of-graphs">Structure of Graphs</h3>
<p><img src="https://images.velog.io/images/jinjin/post/d1bcb396-8108-4a60-959a-d6be09c57763/image.png" alt=""></p>
<h3 id="motifs">Motifs</h3>
<p><img src="https://images.velog.io/images/jinjin/post/62c401a0-f154-4084-ba84-e20e8f7506f6/image.png" alt=""></p>
<h3 id="adjacency-matrix">Adjacency Matrix</h3>
<p><img src="https://images.velog.io/images/jinjin/post/587dccc7-a622-4b0c-9e6e-3c65b678e2e7/image.png" alt=""></p>
<h3 id="gnn-overview">GNN Overview</h3>
<p><img src="https://blog.kakaocdn.net/dn/cKv4QR/btq3KQ7nVuB/qy85gmwr15eYVuBDf0Fsb0/img.png" alt="">
<img src="https://blog.kakaocdn.net/dn/lJQwX/btq3JTjLwx4/VPdEPfb7IBjDon6oP4SDg0/img.png" alt=""></p>
<h1 id="1-gnnexplainer의-이유-1">1. GNNExplainer의 이유</h1>
<p>기존의 XAI 방법론들은 그래프에 적용될 수 없습니다. 기존의 방법들은 그래프 특성상 그래프 구조와 노드 정보를 동시에 고려하지 못하기 때문입니다.</p>
<p>그래프 모델의 예측을 이해할 수 있게 하는 것은 3가지 관점에서 의의가 있습니다.</p>
<ul>
<li><strong>Trust</strong>
  GNN모델의 신뢰성을 향상시킵니다.</li>
<li><strong>Transparency</strong>
  투명성있게 GNN모델을 만들 수 있기 때문에 의사결정이나 프라이버시문제, 보안성 등에 좋습니다.</li>
<li><strong>Understanding</strong>
  네트워크의 특징을 이해하는데에 도움을 주고 모델에 있는 문제를 식별하게 해줍니다. </li>
</ul>
<h1 id="2-gnnexplainer-overview-1">2. GNNExplainer Overview</h1>
<h3 id="subgraph">Subgraph</h3>
<p><img src="https://images.velog.io/images/jinjin/post/b8c8b1be-dcf1-43ba-9d25-79e3ca45047f/image.png" alt=""></p>
<ul>
<li>그래프 G가 있고 GNN model($\Phi$) 이 학습 및 예측을 통해서 노드 $v_{i}$ 와 $v_{j}$ 에 대해서 node classification을 진행했습니다. </li>
<li>GNNExplainer를 사용해서 GNN의 예측을 설명합니다. <ul>
<li>$v_{i}$ 의 class 를 basketball로 분류할 때 영향을 준 subgraph를 보여줍니다.</li>
<li>$v_{j}$ 의 class 를 sailing으로 분류할 때 영향을 준 subgraph를 보여줍니다.</li>
<li>subgraph가 곧 graph의 <strong>explanation</strong>이 됩니다. </li>
</ul>
</li>
<li><strong>single-instance &amp; multi-instance explanations</strong><ul>
<li>single : 특정 인스턴스를 예측 -&gt; node label, new link, graph-level label</li>
<li>multi : 인스턴스 집합을 예측 -&gt; 주어진 class들의 node들을 예측</li>
</ul>
</li>
</ul>
<h3 id="gnnexplainer">GNNExplainer</h3>
<p><img src="https://images.velog.io/images/jinjin/post/1d691d94-54f5-442a-9e1a-4edd7b487a22/image.png" alt="">
노드 v의 클래스($\widehat{y}$)를 예측할 때, GNNExplainer의 목적은 다음과 같습니다.<br>(A) v노드 예측에 필요한 features set이나 pathway set을 찾는 것 (필요한 잉이웃 찾기)
(B) v노드 예측에 필요한 node feature 찾기 (d-dimension vector 중 필요한 정보만 사용하기)</p>
<p><img src="https://miro.medium.com/max/934/0*YynR2i43V5vpr5v4" alt=""></p>
<h1 id="3-gnnexplainer-explanations-1">3. GNNEXplainer explanations</h1>
<p><img src="https://images.velog.io/images/jinjin/post/60e16aab-a43d-4bb1-8081-8d60f460f4ae/image.png" alt="">
처음부터 끝까지의 과정은 위와 같이 진행됩니다.</p>
<h2 id="3-1-single-instance-explanations">3-1. Single-instance explanations</h2>
<h3 id="optimization-framework">Optimization framework</h3>
<p>$\underset{G_{s}}{max} MI(Y,(G_{s},X_{s})) = H(Y) - H(Y|G=G_{s}, X=X_{s})$    (1)</p>
<p>Gs의 <strong>MI</strong>(mutual information)을 최대화시키는 방법은 위와 같은 엔트로피간의 차이를 이용해서 구합니다. 
예를 들어서 그래프에서 노드 i에 대한 node classification을 수행중인데 근처 이웃 노드 j를 제거하면 예측값 y (노드i의) 을 예측 확률을 감소시키는 경우, 노드 j는 노드 i의 node classification을 위해서 중요한 노드라고 판단됩니다. 따라서 이러한 차이를 극대화하는 Gs를 구할 수록 전체 그래프에서 중요한 <strong>Gs</strong>를 구할 수 있게 됩니다. </p>
<p>$H(Y|G=G_{s}, X=X_{s}) = -E_{Y|G_{s},X_{s}}[\log P_{\Phi }(Y|G=G_{s}, X=X_{s}) ]$     (2)</p>
<p>그리고 결국 MI를 극대화 시키는 식은 조건부 엔트로피 $H(Y|G=G_{s}, X=X_{s})$ 부분을 최소화하는 문제로 바꿀 수 있습니다.</p>
<p><img src="https://images.velog.io/images/jinjin/post/2aafdbad-4083-4caf-87b0-ed76a38660b8/image.png" alt="">
그런데 이때, 그래프 $G_{c}$가 수많은 서브그래프를 가지기 때문에 모든 서브그래프에 대해서 구해보는 것은 불가능하고, $G_{c}$에 대한 <strong>variational approximation</strong> of distribution of subgraphs를 사용합니다. </p>
<p>그리고 개별적 $G_{s}$의 Entropy 기댓값 대신에 $G_{s}$에 대한 기댓값을 사용합니다.</p>
<p>또한 완벽하게 수렴시킬 수는 없고 실험적으로 minimizing 합니다.</p>
<p><img src="https://images.velog.io/images/jinjin/post/8fdf3e86-83f9-4b96-833c-85459b91bed6/image.png" alt="">
결과적으로 trained model이 특정 클래스를 예측을 왜 했는지, 어떻게 했는지 구하기 위해서는 수식 (5)와 같은 cross entropy를 구하게됩니다. </p>
<h2 id="3-2-joint-learning">3-2. Joint Learning</h2>
<p><img src="https://images.velog.io/images/jinjin/post/1f71ad1e-1d23-4351-a569-7ebe901508ae/image.png" alt="">
<strong>Graph structure</strong> 와 <strong>node feature information</strong>의 joint learning을 보겠습니다.
 3-1 에서 Single-instance explanations에서는 node feature의 선택에 대해서는 논하지 않았습니다. 따라서 이번에는 <strong>feature selector F</strong>가 선택한 정보에 대해서만 subgraph의 node feature을 사용하는 과정에 대해서 설명합니다. </p>
<p><img src="https://images.velog.io/images/jinjin/post/11395e3f-dc46-445f-8e42-43ad14d2fe74/image.png" alt=""></p>
<p>수식 (1) -&gt; 수식 (7)</p>
<ul>
<li>앞서 봤던 (1) 을 (7) 과 같이 고쳐서, F를 같이 학습시킵니다.</li>
<li>중요하지 않은 정보에 대한 weight -&gt; 0 으로 수렴하게 됩니다.</li>
<li>모든 feature에 대한 marginalize</li>
<li>Monte Carlo estimate sampling</li>
<li>reparametrization trick </li>
</ul>
<h3 id="overview">Overview</h3>
<p><img src="https://images.velog.io/images/jinjin/post/9c92b925-a73c-4acc-8f56-d405b1441982/image.png" alt="">
<img src="https://images.velog.io/images/jinjin/post/5248627f-fb34-4be8-9533-af3252c49a65/image.png" alt=""></p>
<h1 id="4-experiments--conclusion-1">4. Experiments &amp; Conclusion</h1>
<h2 id="4-1-setting">4-1. Setting</h2>
<p>GNN을 사용한 <strong>node classification</strong> 및 <strong>graph classification task</strong>에 대해서 실험했고, 두 가지 부류의 데이터셋을 사용했습니다. 
<img src="https://images.velog.io/images/jinjin/post/5d91dc41-108f-4f83-bddb-d39fc915216e/image.png" alt=""></p>
<ul>
<li><p><strong>node classification</strong></p>
<ul>
<li><strong>Synthetic datasets</strong> : 총 4가지 종류의 인위적인 네트워크를 구성해서 실험
(1) BA-Shapes
(2) BA-Community
(3) Tree-Cycles
(4) Tree-Grid</li>
<li><strong>ground truth</strong> : Motif</li>
</ul>
</li>
<li><p><strong>graph classification</strong></p>
<ul>
<li><strong>Real-world datasets</strong> : 실제 네트워크 데이터
(1) Mutag : 분자그래프
(2) Reddit-Binary : Reddit 에 있는 QA 데이터</li>
<li><strong>ground truth</strong> : 미리지정</li>
</ul>
</li>
</ul>
<h2 id="4-2-base">4-2. Base</h2>
<p><strong>GNNExplainer</strong>와 성능을  비교한 base 모델은 <strong>Grad</strong> 와 <strong>ATT</strong>입니다.</p>
<h3 id="grad">Grad</h3>
<p><img src="https://images.velog.io/images/jinjin/post/c2544ed3-c1e2-4476-a478-3f9525d04849/image.png" alt=""></p>
<h3 id="att">Att</h3>
<p><img src="https://images.velog.io/images/jinjin/post/ec7e633e-f746-477f-ba27-605a3e94c76d/image.png" alt=""></p>
<h2 id="4-3-analyses">4-3. Analyses</h2>
<p><strong>evaluation</strong> 에서 주목해서 봐야하는 것은 다음과 같이 정리됩니다.</p>
<ul>
<li>합리적인 설명인가?</li>
<li>결과를 ground truth 값과 어떻게 비교하나?</li>
<li>다양한 그래프에 적용이 가능한가?</li>
<li>다른 GNN 모델의 예측에도 적용이 가능한가?</li>
</ul>
<h3 id="quantitative-analyses">Quantitative analyses</h3>
<p><img src="https://images.velog.io/images/jinjin/post/9381a9b0-76e2-49d9-8f95-ee1038c152af/image.png" alt=""></p>
<h3 id="qualitative-analyses">Qualitative analyses</h3>
<p><img src="https://images.velog.io/images/jinjin/post/95e32858-93a5-4ab8-9718-894e2945e386/image.png" alt="">
<img src="https://images.velog.io/images/jinjin/post/0c58a685-0a1b-4632-91b0-6a4592742666/image.png" alt="">
<img src="https://images.velog.io/images/jinjin/post/0a66a6ca-9044-43e6-b5cd-e43d449bd0d0/image.png" alt=""></p>
<h2 id="4-4-conclusion">4-4. Conclusion</h2>
<ul>
<li>reletional structures (rich node)에 적용가능</li>
<li>GNN 예측의 인터페이스 제공</li>
<li>GNN 모델 디버깅에 도움</li>
<li>모델의 실수에 대한 패턴을 식별</li>
<li>model-agnostic 방법</li>
</ul>
<h1 id="references">References</h1>
<p>GNNExplainer: Generating Explanations for Graph Neural Networks
(Rex Ying, Dylan Bourgeois, Jiaxuan You, Marinka Zitnik, Jure Leskovec)</p>
<p>Explainability in Graph Neural Networks: A Taxonomic Survey
(Hao Yuan, Haiyang Yu, Shurui Gui, Shuiwang Ji)</p>
<p>Graph Attention Networks
(Petar Veličković, Guillem Cucurull, Arantxa Casanova, Adriana Romero, Pietro Liò, Yoshua Bengio)</p>
<p><a href="https://velog.io/@tobigs-gnn1213">Stanford CS224W 2019 리뷰</a>
<a href="https://www.youtube.com/watch?v=PrNwfNOge8o">[Paper Review] GNNExplainer: Generating Explanations for Graph Neural Networks</a>
<a href="https://cinnamonai.medium.com/digging-for-trusts-revolutionary-trustable-information-extraction-system-4a376d7b86e1">https://cinnamonai.medium.com/digging-for-trusts-revolutionary-trustable-information-extraction-system-4a376d7b86e1</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[5주차] 논문 리뷰 - Attention is not explanation]]></title>
            <link>https://velog.io/@tobigs_xai/5%EC%A3%BC%EC%B0%A8-Attention-is-not-explanation</link>
            <guid>https://velog.io/@tobigs_xai/5%EC%A3%BC%EC%B0%A8-Attention-is-not-explanation</guid>
            <pubDate>Wed, 19 May 2021 02:36:27 GMT</pubDate>
            <description><![CDATA[<h3 id="attention-구조">Attention 구조</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/4252d1f7-5fcb-4113-9408-00aef0949f42/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/f894cc72-3eea-4453-9253-5cb21cefa453/image.png" alt=""></p>
<blockquote>
<p><strong>[용어 정리]</strong>
<strong>Attention Score</strong>: 현재 디코더의 시점 t에서 단어를 예측하기 위해, 인코더의 모든 은닉 상태 값들이 디코더의 현 시점의 은닉 상태 s_t 와 얼마나 유사한지를 판단하는 스코어 값
<strong>Attention Weight</strong>: Attention Score에 softmax 를 적용한 값. hidden state vector와 곱해지는 비중 담당.
<strong>Attention Distribution</strong>: Attention Score에 softmax 를 적용한 값(Attention Weight)의 모임. 모든 값을 합하면 1이 되는 확률 분포</p>
</blockquote>
<p>그림 출처, 참고 링크 : <a href="https://catsirup.github.io/ai/2020/03/27/attention.html">https://catsirup.github.io/ai/2020/03/27/attention.html</a></p>
<h1 id="attention-is-not-explanation">Attention is not explanation</h1>
<h2 id="이-논문이-다른-논문에-인용된-맥락">이 논문이 다른 논문에 인용된 맥락</h2>
<p>Jain and Wallace 2019 = Attention is not explainable
Wiegreffe and Pinter 2019 = Attention is not not explainable</p>
<p>NLP 관련 XAI 트렌드 서베이 논문: <a href="https://arxiv.org/pdf/2010.00711.pdf">https://arxiv.org/pdf/2010.00711.pdf</a></p>
<p><strong>[A Survey of the State of Explainable AI for Natural Language Processing]</strong></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/48fd14f4-283d-4c07-8d8c-a770470525b9/image.png" alt=""></p>
<p><strong>[An attentive survey of Attention Models]</strong></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/21a6270f-dbb1-4142-b367-13ccd5480cbb/image.png" alt=""></p>
<p><strong>[Explainable recommendation models]</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/2b1591c6-76ab-4b31-80b6-31b78db0a6cf/image.png" alt=""></p>
<p><strong>[Is Attention Interpretable?]</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/28a9d220-a4f8-4a41-95bb-d334e73aa01d/image.png" alt=""></p>
<p><strong>[Analyzing the Structure of Attention in a Transformer Language Model]</strong></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/a6b9b6fd-2e10-4b6f-8329-bf1e72150a3a/image.png" alt=""></p>
<p>&quot;이 논문에 대한 반박도 이어지지만, 충분히 고려해야 하고, Attention의 설명력에 대한 의구심을 던진 중요한 관점의 논문&quot; 정도의 포지션인 것 같습니다.
인용 논문 목록을 보면 XAI 논문이 아닌 Attention 관련 논문에서도 등장하고 있음을 보아 NLP XAI 분야 뿐 아니라 Attention 분야에서도 중요한 관점인 것으로 보입니다.</p>
<h2 id="논문-내용">논문 내용</h2>
<p>이 논문에서는 attention weight와 model output(prediction) 간의 관계가 &quot;explainable&quot;하지 않다고 주장합니다. 즉, 높은 값의 attention weight를 가지는 input unit이 output에 대해 설명력을 가진다는 전제가 잘못되었다는 것입니다. 논문에서는 이것을 증명하기 위해 attention weight, input, output간의 관계를 살펴보는 실험을 진행하였습니다. </p>
<p>논문에서 주장하는 &#39;Attention이 explainable 하기 위해서 만족해야 하는 두 가지 가정&#39;은 다음과 같습니다.</p>
<blockquote>
<ol>
<li>Attention weight는 feature importance를 측정하는 다양한 방법들과 상관관계가 있다. </li>
<li>Alternative(adversarial) attention weight는 예측 결과의 변화를 야기할 것이다.</li>
</ol>
</blockquote>
<p>이 논문에서는 이 두 가지 가정이 Attention을 주로 활용하는 많은 NLP 태스크에서 거의 관찰되지 않았다고 말합니다. 논문에서는 Binary text classification, Question Answering, Natural Language Inference task에 대해 실험하였습니다.</p>
<p>하나의 예시를 들어 설명합니다.
<img src="https://images.velog.io/images/tobigs_xai/post/2796b4bb-aa75-4466-b420-457b5f027544/image.png" alt=""></p>
<p>텍스트 감정 분류 예시입니다. 양쪽 모두 분류 결과는 &#39;negative&#39;입니다. 왼쪽은 original attention distribution, 오른쪽은 advarsarial(alternative) attention distribution에 해당합니다. 왼쪽에서는 &#39;waste&#39; 토큰이 결과와 연관성이 높고, 오른쪽에서는 &#39;was&#39; 토큰이 결과와 연관성이 높습니다. 집중하고 있는 토큰이 전혀 다르지만, 같은 결과를 예측하고 있습니다. 따라서, 이러한 방식은 &#39;explanation&#39;에 적합하지 않다고 주장합니다.</p>
<h3 id="실험">실험</h3>
<p>논문에서 사용한 데이터셋은 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs_xai/post/be44b42c-6d0d-46a4-bf61-6aecda40c026/image.png" alt=""></p>
<p>output distributions 간의 차이를 측정하기 위해서는 Total Variation Distance (TVD) 를 사용하였고, attention distributions 간의 차이를 측정하기 위해서는 Jensen-Shannon Divergence (JSD) 를 사용하였습니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/e2f44388-1612-4691-98ca-3b39ccb56429/image.png" alt=""></p>
<ul>
<li>Attention과 Feature importance 방법 간의 상관관계 실험
Attention과 1)<em>Gradient based feature importance 방법(τ_g)</em>, 2)<em>feature들을 하나씩 제거할 때, model output의 변화(τ_loo)</em> 간의 상관관계를 실험하였습니다.</li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/806bf82c-125b-490c-80a8-c4657dc665c4/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/66612d05-ea64-4f76-ba96-84d643114ea5/image.png" alt=""></p>
<p>(τ_g의 histogram인데 τ_loo와 상당히 유사해서 논문에는 이 것만 실었다고 합니다.) </p>
<p>주황색: positive로 예측된 경우들 
보라색: negative로 예측된 경우들</p>
<p>SNLI 데이터의 경우에는 보라색:contradiction, 주황색: entailment, 초록색: netural (예측 라벨)</p>
<p>히스토그램을 보면 BiLSTM 인코더 모델의 경우에 대체로 0 주위에 몰려있는 분포임을 알 수 있습니다. 즉, 상관관계가 거의 다 0과 가까워 약한 수준이라는 것입니다.</p>
<p>반면, Average(non-recurrent/convolutional 모델) 인코더 모델의 경우에는 상관관계가 높습니다. 이 실험 결과를 통해 알 수 있는 점은 Attention weights는 contextualized embedding이 있는 모델에서 Feature importance와 일치도가 낮다는 점입니다.</p>
<ul>
<li>Adversarial(=counterfactual) Attention Distribution 생성</li>
</ul>
<p>논문에서는 두 가지 방법으로 adversarial distribution을 생성합니다.</p>
<p>1) 원래의 attention weight를 단순히 섞어 재배치합니다.
2) 원래의 distribution과 가장 다르지만 같은 결과를 도출하는 adversarial distribution을 직접 생성합니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/64119666-f2df-4b3b-8ef5-f8d3f24ae888/image.png" alt=""></p>
<p>1) 원래의 attention weight를 단순히 섞어 재배치
Figure 3 에서는 원래의 attention value의 max 값과 적대적 조절에 의한 변화량의 중앙값을 시각화합니다. attention weight 값이 큼에도 불구하고 변화량이 작은 경우는 attention weight가 작은 사이즈의 feature들로 output을 설명 가능할지도 모르지만, weight 부분을 무작위로 재배치했을 때 결국 결과의 변화가 적은 경우입니다. </p>
<p>(c)의 diabetes 데이터셋의 경우에는 positive 클래스(주황색)은 weight가 설명의 역할을 할 수 있음을 알 수 있습니다. 이 경우 조금만 attention weight를 바꿔도 결과에 큰 차이가 있습니다. 하지만, 이 경우는 positive 클래스에 대해 높은 precision을 가지는 몇몇 토큰이 없어질 경우 결과에 큰 영향을 미치기 때문이고, 이것은 어떤 규칙이라기보다는 데이터셋의 특성에 따른 예외에 가깝다고 주장합니다. (electronic health records를 다루어 diabetes 여부를 판별하는 데이터셋입니다)</p>
<p>2) 원래의 distribution과 가장 다르지만 같은 결과를 도출하는 adversarial distribution을 직접 생성</p>
<p>이전에 다루었던 논문에서 나온 판다의 사진에 노이즈를 더한 결과 모델이 사진을 긴팔원숭이로 분류하게 되는 경우와 유사하다고 이해하시면 수월할 것 같습니다. </p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/7095fba9-59ab-4bb5-bc89-e98e86b42229/image.png" alt=""></p>
<p>이 히스토그램은 모델별 JSD(distribution간의 차이를 나타내는 단위) 최댓값의 분포를 나타냅니다. JSD값이 큰 경우가 많은 것으로 보아, 모델의 output을 바꾸지 않지만 원래의 distribution과는 차이가 큰 경우를 자주 볼 수 있음을 알 수 있습니다.</p>
<p>1)에서와 유사하게, 여기서도 diabetes 데이터의 경우에 positive 클래스에 대한 JSD가 낮고 negative의 경우 높은 경향을 볼 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/3acb18d1-6e41-4cf8-8e33-12508f7fdd2a/image.png" alt=""></p>
<p>plot을 통해 attention weight값이 높은 경우에도 divergence가 높은 경우가 많음을 알 수 있습니다.</p>
<h1 id="attention-is-not-not-explanation">Attention is not not explanation</h1>
<p>논문 저자의 presentation 영상이 공개되어 있으니 참고하셔도 도움될 것 같습니다. <a href="https://www.youtube.com/watch?v=KokBC8zBEWE">https://www.youtube.com/watch?v=KokBC8zBEWE</a></p>
<p>앞선 논문의 많은 &#39;가정&#39;들에 의문을 제기하는 논문입니다. &#39;explanation&#39;의 정의에 따라 충분히 달라질 수 있다고 주장하며 4개의 실험을 진행합니다.</p>
<h2 id="논문-내용-1">논문 내용</h2>
<p>진행한 4가지의 실험은 다음과 같습니다.</p>
<blockquote>
</blockquote>
<ol>
<li>simple frozen uniform weights baseline (3.2)</li>
<li>a variance calibration based on multiple random seeds (3.3)</li>
<li>diagnostic framework using frozen weights from pretrained models (3.4)</li>
<li>end-to-end adversarial attention training protocol (4)<blockquote>
</blockquote>
<img src="https://images.velog.io/images/tobigs_xai/post/6175559a-7338-4af8-9b8d-9dac910c1ba5/image.png" alt=""></li>
</ol>
<h4 id="1-simple-frozen-uniform-weights-baseline">1. simple frozen uniform weights baseline</h4>
<p>Attention weights들이 uniform distribution으로 고정되어있는 실험입니다.</p>
<p>실험 결과, 적어도 어떤 데이터셋에서는 uniform weight 모델도 trained 모델처럼 좋은 성능이 나왔습니다. 따라서, Jain and Wallace 논문의 &#39;랜덤하게 weight를 바꾸어 변화량을 관찰하는 시도&#39;가 설명력이 없다고 판단하는 근거가 될수 없다고 반박합니다.</p>
<h4 id="2-a-variance-calibration-based-on-multiple-random-seeds">2. a variance calibration based on multiple random seeds</h4>
<p>여러 개의 학습 시퀀스를 각각 다른 random seed로 초기화하여 attention weight의 expected variance를 측정하는 실험입니다. 이렇게 variation을 고려하면서 적대적 모델과 원래 모델을 비교하면 적대적 모델의 결과를 더 잘 해석할 수 있다고 합니다. 
adversarial distribution의 결과가 해석 불가능하다고 가정했던 이전의 논문을 반박하는 포인트로 보입니다.</p>
<h4 id="3-diagnostic-framework-using-frozen-weights-from-pretrained-models">3. diagnostic framework using frozen weights from pretrained models</h4>
<p>위의 그림에서 보이는것과 같이 LSTM과 임베딩 부분을 MLP로 대체하여 맥락을 반영하지 못하도록 한 pre-trained 모델입니다. 이를 통해 Attention이 model에 구애받지 않고 (model-agnostic) 토큰에 대해 의미있는 해석을 보여줄 수 있습니다. 모델의 pre trained score 가 잘 작동한다면, 설명력이 있다고 판단합니다. 
실험 결과, LSTM pre trained 모델이 (3.2)에서의 baseline 보다 더 좋은 성능을 보였습니다. 이를 통해 데이터셋의 word level 구조보다 attention 모듈이 더 중요함을 알 수 있습니다. 따라서, attention weights가 중요하지 않고 임의적이라는 Jain and Wallace의 주장은 틀리다고 주장합니다.</p>
<h4 id="4-end-to-end-adversarial-attention-training-protocol">4. end-to-end adversarial attention training protocol</h4>
<p>원래의 학습된 base model의 attention score를 반영하도록 loss함수를 수정하여 adversarial distribution의 파라미터를 학습하는 방법입니다. Jain and Wallace 논문에서 adversarial distribution을 생성하는 방법에 대한 대안입니다. 이 방법으로 생성한 adversarial 모델은 원래 모델보다 분류 정확도가 낮습니다.(adversarial distribution이 모델 분류 결과를 바꾸지 못한다는 Jain and Wallace의 주장 반박)</p>
<h4 id="explanation의-정의의-문제이다">&quot;Explanation&quot;의 정의의 문제이다.</h4>
<p>Explanation이라는 정의는 적어도 transparency, explainability, interpretability 라는 3개의 개념을 포함합니다. Attention 매커니즘의 weight는 hidden state의 비중을 쉽게 이해할 수 있는 방향으로 보여주기 때문에 모델에 대한 통찰을 제공한다고 주장합니다(provide a look). 
또한, Explanation에 대해 더 넓게 보는 시각도 있다. 이러한 시각에 따르면, Jain and Wallace가 보여준 Attention의 &#39;not explainable&#39; 한 점도 넓은 정의에 의하면 explainable 할 수 있다고 주장합니다.</p>
<h4 id="결론">결론</h4>
<ul>
<li>이전의 Attention의 설명력에 관한 연구들이 Jain and Wallace에 의해 틀린 말이 되어버린 것이 아니다.</li>
<li>Jain and Wallace의 주장처럼 특히 분류 문제에서 adversarial distribution이 존재하므로, 무조건적으로 attention weight로 설명하는 접근은 위험하다.</li>
<li>그러나 우리의 말에 따라 Jain and Wallece의 논문은 반박의 여지가 있다.</li>
<li>&quot;Attention MIGHT BE Explanation&quot;</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[4주차] GAN DISSECTION 논문리뷰]]></title>
            <link>https://velog.io/@tobigs_xai/GAN-DISSECTION-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</link>
            <guid>https://velog.io/@tobigs_xai/GAN-DISSECTION-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0</guid>
            <pubDate>Tue, 11 May 2021 15:46:55 GMT</pubDate>
            <description><![CDATA[<h3 id="0-요약">0. 요약</h3>
<p>visualized and understand GANs at the unit-, objet-, and scene-level</p>
<h3 id="1-introduction">1. Introduction</h3>
<p>Generative Adversarial Networks (GAN)을 활용하여 성공적으로 다양한 Task들을 수행하고 있지만, 정작 GAN이 어떤 지식들을 학습할 필요가 있는지와 잘못된 결과들의 원인을 탐색하는데는 여전히 의문이다. 이는 직접적으로, 다양한 GAN의 학습 효과를 증진시키는 것과 관련있다. 따라서, GAN이 어떻게 구조들을 represent하게 되는지 이해할 필요가 있다.</p>
<p><img src="https://images.velog.io/images/leejongj/post/e791e25c-c591-46e5-8b93-26b52ee39de4/image.png" alt=""></p>
<ol>
<li><p>Object concepts과 관련있는, 해석가능한 unit의 그룹들을 식별한다. unit들의 featuremap들이 semantic segmentation과 match되게 된다.</p>
<blockquote>
<p><strong>Semantic segmentation?</strong>
: featuremap과 semantic segmentation과 어떠한 관계가 나타나는지 확인해보자.</p>
</blockquote>
</li>
<li><p>Network 내에서, object들을 나타나게 하고 사라지게 할 수 있는 set of units들을 식별한다. 이들을 효과를 정량화한다.</p>
<blockquote>
<p><strong>Causal Effect?</strong>
: 그림 (c)에서와 같이 unit을 ablating하면 tree가 제거되고, unit을 activating하면 tree가 생성되는지 인과관계를 밝혀보자.</p>
</blockquote>
</li>
<li><p>Causal object들과 background간의 관계를 점검한다. 새로운 이미지에 물체를 대입했을 때 다른 object들과 어떻게 상호작용하는지 파악한다.</p>
<blockquote>
<p>GAN의 경우, building에 door를 생성하지, tree에 door를 생성하지 않는다.</p>
</blockquote>
</li>
</ol>
<h3 id="2-method">2. Method</h3>
<p>&quot;Our goal is to analyze how objects such as trees are encoded by the internal representations of a GAN generator G: $z → x$&quot;</p>
<p>GAN의 generator는 $x$의 확률분포를 학습하는 과정을 통해서 $z$ (latent vector or random vector)을 통해 $x$ 에 근사시킨다. (논문의 경우, low dimension인 latent vector를 통해 image을 생성한다.) </p>
<p>따라서 GAN의 수식은 다음과 같이 간단히 나타낼 수 있다.</p>
<blockquote>
<p>$x = G(z) = f(h(z)) = f(r)$</p>
</blockquote>
<p>여기서 $r$은 $x$를 생성하기 위한 정보들을 모두 가지고 있기 때문에, image에서의 임의의 $class$ $c$의 존재를 추론해 볼 수 있다. 단순히 그 정보의 존재 유무만을 파악하고자 함이 아니라, <strong>어떻게 encoded되었는지 파악</strong>하는 것이 핵심이다.</p>
<p>직관적으로, featuremap들 중 $class$ $c$가 P에 위치한다고 했을 때, 도움이 되는 featuremap의 집합들이 있을 것이고, 그다지 도움이 되지 않은 featuremap의 집합들이 있음을 알 수 있다.</p>
<h4 id="주요개념">주요개념</h4>
<blockquote>
<p><strong>Dissection</strong>: identify the classes that have an explicit representation in $r$ by measuring the agreement between individual units of $r$ and every $class$ $c$.</p>
</blockquote>
<blockquote>
<p><strong>Intervention</strong>: for the represented classes identified through dissection, we identify causal sets of units and measure causal effects between units and object classes by forcing sets of units on and off.</p>
</blockquote>
<h3 id="21-characterizing-units-by-dissection">2.1 CHARACTERIZING UNITS BY DISSECTION</h3>
<p><img src="https://images.velog.io/images/leejongj/post/18a339dc-551b-457d-b77a-231bb39200ce/image.png" alt=""></p>
<p>앞서, $r$은 $x$의 정보들을 담고 있다고 말하였다. 따라서, convolution generator를 사용하여 생성된 $r$중 single unit $u$ (featuremap의 one channel)를 추출하여 사용해보자. </p>
<p>당연히, $r$은 기존의 이미지의 크기보다 작기 때문에, 이를 upsample한 후의 결과와 실제 segmentation 모델을 통해 학습한 결과와 픽셀 단위에서 얼마나 일치하는지 확인한다. (두 결과값 모두 binary masked 형태로 나타난다)</p>
<blockquote>
<p><strong>IoU (Intersection over Union)</strong>
두 영역의 교차영역의 넓이를 합영역의 값으로 나눈 값을 뜻합니다. 객체 검출에서 예측된 경계 상자의 정확도를 평가하는 지표 중 하나로 사용되며, 예측된 경계 상자와 실제 참값(ground truth) 경계 상자의 IOU를 해당 경계 상자의 ‘정확도’로 간주합니다.</p>
</blockquote>
<p>하지만, 우리의 목표는 output과 강하게 연관관계를 나타내는 unit을 찾는 것이 아니라, object를 발생시키는 representation의 일부분을 찾는 것이 목표이며, 이들의 조합을 찾는 것이 베스트이다.</p>
<h3 id="22-measuring-causal-relationships-using-intervention">2.2 MEASURING CAUSAL RELATIONSHIPS USING INTERVENTION</h3>
<p>&quot;We test whether a set of units U in r cause the generation of c by forcing the units of U on and off&quot;</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/dd667623-400b-4f60-a810-4b5b4cc41799/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/leejongj/post/c8648c3f-fb33-405b-a120-8cbca0ed3fd2/image.png" alt=""></p>
<p>앞에서 언급했듯이, 임의의 $class$ $c$을 예측하는데 도움이 되는 featuremap과 도움이 되지 않은 featuremap이 있음을 언급하였다. 따라서 $r$은 다음과 같이 둘로 나눠 표기할 수 있다. 해당 논문에서는 forced component와 unforced component로 나눠 설명하고 있다. 이를 직관적으로 이해한다면 원본 Image에서 도움이 되는 featuremap의 픽셀들을 0으로 치환함으로써, Image에서 해당 $class$ $c$를 지울 수 있으며, k (a per-class constant)로 치환함으로써 Image에 해당 $class$ $c$를 주입할 수 있다. </p>
<p>예를 들어, $class$ $c$가 tree를 나타낸다고 가정해보자. 그렇다면, 해당 featuremap을 0으로 치환한다는 것은 그 특징들을 없앤다는 의미가 같을 것이다. 반대로 그 특징을 추가한다면 Image에는 그 특징이 더욱 강하게 나타날 것이다. </p>
<p>위의 그림에서 볼 때, inserted image부분에서는 tree가 추가된 양상이 나타나고 있으며, ablated image에서는 tree가 지워진 양상이 나타나고 있다.</p>
<blockquote>
<p><strong>per-class constant</strong>
For interventions for class c, we set k to be <strong>mean featuremap</strong> activation conditioned on the presence of class c at that location in the output</p>
</blockquote>
<p><img src="https://images.velog.io/images/leejongj/post/c5c09e50-880d-4202-bd99-3b3acd4fa1fe/image.png" alt=""></p>
<p>수식은 다음과같고, $class$ $c$를 생성한 $xi$와 $class$ $c$를 제거한 $xa$의 차이를 최대화하는 a set of units U를 찾는 것이다. </p>
<p><img src="https://images.velog.io/images/leejongj/post/16471516-df13-44c2-abd2-4e35833fae1f/image.png" alt=""></p>
<p>해당 논문에서는 d개의 units으로 고정시켜서 조합을 구하는 방법을 사용하지 않고, $a$를 정의하여 objective function을 변형하였다. 이후에 $a$에 대해 L2 Loss를 취해줌으로써 minimal set of casual units을 얻었다.</p>
<h3 id="result">Result</h3>
<p><img src="https://images.velog.io/images/leejongj/post/35d27092-9de1-4643-9bcd-7198a24d3c9f/image.png" alt=""></p>
<p>Classifier network에서 나타나는 특징과 같이 GAN에서 역시 비슷한 현상을 찾아볼 수 있었다. 초기 layer에서는 어떠한 object에 대응되지 못했지만, 중반에는 4-7개의 object들과 매칭되는 unit들을 볼 수 있었다. </p>
<h4 id="diagnosing-and-improving-gans">DIAGNOSING AND IMPROVING GANS</h4>
<p><img src="https://images.velog.io/images/leejongj/post/95b799e4-7714-4d89-b976-bdbff8f41151/image.png" alt=""></p>
<p>GAN으로 이미지를 생성한 결과 artifact의 영향을 미치는 unit들이 있음을 확인할 수 있었으며, 해당 unit들을 제거한 결과 결과의 visual quality를 향상시킬 수 있었다. </p>
<h3 id="discussion">Discussion</h3>
<p>결과적으로, GAN에서의 representation들을 해석할 수 있었으며, object들과 관련된 signal들을 확인할 수 있었을 뿐만 아니라, object들의 나타내는 variable들의 effect도 확인할 수 있었다. 이를 통해서 GAN을 결과들을 비교할 수 있었으며, debug할 수 있었다.</p>
<p>discriminator는 단지 real or fake를 구분하는 역할을 하기 때문에 해당 논문에서는 GAN의 generator 부분에 대해서 파악하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[3주차]LRP(Layer-wise Relevance Propagation)]]></title>
            <link>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8LRPLayer-wise-Relevance-Propagation</link>
            <guid>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8LRPLayer-wise-Relevance-Propagation</guid>
            <pubDate>Wed, 05 May 2021 09:51:41 GMT</pubDate>
            <description><![CDATA[<p>작성자: 투빅스 15기 김태희</p>
<blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
</ol>
</blockquote>
<ol>
<li>Intuition</li>
<li>Decomposition</li>
<li>Relevence Propagation</li>
<li>Application</li>
</ol>
<p>[2주차]CNN 필터시각화에서는 피처 맵을 시각화해 이미지로부터 모델의 성능을 미치는 부분에 대해 알아보았다. 하지만 이러한 방법은 output에 가까운 레이어일수록 추상화 수준이 높아 해석이 어렵다는 단점이 있다. 본 게시글에서는 신경망 모델에의 결과를 역추적해 각 입력에 대한 기여도를 계산하는 LRP(Layer-wise Relevance Propagation)에 대해 알아보고자 한다. </p>
<h1 id="0-intro">0. Intro</h1>
<p><img src="https://images.velog.io/images/tobigs_xai/post/43e95a42-4b0e-4091-b263-17952a6f4a61/image.png" alt="">
기본적으로 인공지능 모델은 블랙박스이기 때문에 어떠한 결정에 대해 그 이유를 알 수 없다. 이를 사람이 이해할 수 있는 형태로 설명하고자 다양한 AI 기술이 나오고 있으며, 이를 XAI(Explainable AI)라고 한다. </p>
<p>위와 같이 어떠한 사진이 있고 학습된 신경망 모델이 이를 &#39;수탉&#39;이라고 분류했을 때, LRP 알고리즘은 모델이 데이터의 어떤 부분을 보고 해당 결과를 도출해 내었는지 히트맵 형식으로 알려주는 방법이다. 위 사진에 LRP를 적용한 결과를 보았을 때 모델이 우측 상단의 데이터를 기반으로 수탉이라 분류했다는 것을 알 수 있다. 이처럼 히트맵 형식으로 각 데이터의 기여도를 계산할 시 앞의 피처맵 기법보다 해석을 오인할 가능성이 적다. </p>
<h1 id="1-intuition">1. Intuition</h1>
<h2 id="1-1-relevance-propagation--decomposition">1-1. Relevance Propagation &amp; Decomposition</h2>
<p>LRP는 <strong>타당성 전파(Relevance Propagation)</strong>와 <strong>분해(Decomposition)</strong> 방법을 사용해 모델을 해부한다. 출력값에서부터 시작해 타당성 점수 또는 기여도라 불리는 relevance score를 입력단 방향으로 계산해 나가며 그 비중을 분배하는 방법이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/44853f81-3350-4321-b376-7713228ba184/image.png" alt=""></p>
<ul>
<li>각 layer마다 분해(decompose)</li>
<li>기여도(relevance)를 output layer부터 top-down 형식으로 재분배</li>
<li>재분배하는 과정에서 기여도(relevance) 값은 보존되어야 한다
  -&gt; 각 layer에서의 기여도 값의 합은 모두 동일해야 한다</li>
</ul>
<h2 id="1-2-mathematically">1-2. Mathematically</h2>
<p>임의의 $d$ 차원의 입력 값 $x = (x_1, x_2, ... x_i, ... x_d)$ 에 대해 모델이 $f(x)$라는 값을 도출해 내었을 때,  $x$ 의 각 차원에 대해 relevance score를 계산해보자! </p>
<p>$f(x) = \sum_{i=1}^{d}R_i$</p>
<ul>
<li>$R_i$: relevance score,  출력 $f(x)$ 를 얻기 위해 입력 이미지의 각 pixel들이 기여하는 바</li>
<li>예측값 $f(x)$는 각각의 입력에 대한 기여도(relevance score)로 분해(decompose)<h2 id="1-3-neural-net">1-3. Neural Net</h2>
<img src="https://images.velog.io/images/tobigs_xai/post/0b31eb61-83d0-49fa-b6e8-cac12c922cf8/image.png" alt="">
궁극적으로 신경망 모델에 LRP를 적용하고자 했을 때, 한 뉴런에서 출력값을 입력층들에게 어떻게 분해해서 배분할지를 결정해야 한다. </li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/8c825dbc-d287-4c77-a6f7-a18295d95770/image.png" alt="">
하나의 출력값을 가지는 노드에 대해서 먼저 살펴보자. 위의 노드는 두 개의 입력값과 하나의 bias로부터 하나의 출력값을 가진다. 출력값 $f(x)$는 입력값 $(x_1, x_2)$로부터 얻어지므로 $y = f(x) = f(x_1, x_2)$ 로 나타낼 수 있다. </p>
<p><strong>Relevance Score</strong> $x$ 가 출력에 얼마나 영향을 주는가는 $x$의 값이 변화했을 때 $f(x)$값의 변화량을 통해 예측 가능</p>
<p>변화량? -&gt; <em>미분</em></p>
<p>따라서 출력값 $f(x)$에 대해 각 입력 $(x_1, x_2)$의 기여도는 다음과 같이 편미분을 사용하여 나타낼 수 있다.
<strong>$\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}$</strong></p>
<p>출력값을 기여도로 분해($f(x)$ -&gt; $\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}$)하기 위해 함수를 미분계수들의 급수로 나타내는 <strong>Taylor Series</strong>를 사용한다. </p>
<h1 id="2-decomposition">2. Decomposition</h1>
<p><img src="https://images.velog.io/images/tobigs_xai/post/def301e2-abe5-4869-ab8a-60fe6bfbcc53/image.png" alt="">
분해(Decomposition)은 입력된 각 피처가 결과에 얼마나 영향을 미치는지 해체하는 방법이다. 분해 과정을 거친 후 이미지의 특정 픽셀이 결과값을 도출하는데 긍정적인 영향이 있는지 또는 부정적인 영향이 있는 지를 알 수 있다. </p>
<p>위의 이미지에서는 이미지를 &#39;고양이&#39;로 분류를 하는데 각 hidden layer에서 계산한 기여도를 토대로 해당 이미지의 피처들을 모델이 어떻게 받아들였는지를 히트맵으로 도식화한 것이다. 결정에 도움이 된 영역은 빨간색으로, 도움이 되지 않은 부분은 파란 색으로 표시된 것을 통해 얼굴 부분의 이마, 코, 입 주변의 픽셀들이 결과에 영향을 많이 주었다는 것을 확인할 수 있다. </p>
<h1 id="3-relevance-propagation">3. Relevance Propagation</h1>
<h2 id="3-1-taylor-series">3-1. Taylor Series</h2>
<p>타당성 전파(Relevance Propagation)과정에서 기여도를 계산할 때 Taylor Series 사용
임의의 매끄러운 함수 $f(x)$ 및 실수 $a$에 대해 $f(x)$의 Taylor Series 는 다음과 같이 나타낼 수 있다.</p>
<p>$f(x) = \sum_{n=0}^{\infty}\frac{f^{(n)}(a)}{n!}(x-a)^n$</p>
<p>$=f(a) + \frac{f&#39;(a)}{1!}(x-a) + \frac{f&#39;&#39;(a)}{2!}(x-a)^2 + \frac{f&#39;&#39;&#39;(a)}{3!}(x-a)^3 + \cdots$</p>
<p>1차 Taylor Series: $f(x) = f(a) + \frac{d}{dx}f(x)\big|_{x=a}(x-a) + \epsilon$</p>
<ul>
<li>$\epsilon$ : 2차 이상의 항들</li>
<li>$\frac{d}{dx}f(x)\big|_{x=a}(x-a)$ : relevance score 결정
  x가 변할 때 $f(x)$ 가 얼마나 변하는지 알 수 있음</li>
<li>$f(a)=0$, $\epsilon=0$일 때 relevance를 계산할 수 있음 </li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/8c825dbc-d287-4c77-a6f7-a18295d95770/image.png" alt="">
Taylor Series를 앞서 나온 입력값이 2개이고 출력이 1개인 Neural Net에 적용해 보자. 여기서 입력값이 여러 개이므로 multivariate function에 대한 taylor series를 활용해야 한다. 
<img src="https://images.velog.io/images/tobigs_xai/post/1096617f-bf74-41ed-9320-085e5a0f5ec6/image.png" alt="">
$d$차원의 입력 값들에 대한 1st order Taylor Series: 
$f(\pmb{x}) = f(\pmb{a}) + \sum_{p = 1}^{d}\frac{\partial \pmb{f}}{\partial x_p}\big|_{\pmb{x}=\pmb{a}}(\pmb{x} - \pmb{a}) + \epsilon$</p>
<p>앞서 1차원의 1st order Taylor Series에서 전미분이 편미분으로, $d$차원에 대해 summation을 해준 것 이외 동일한 형태를 가진다는 것을 알 수 있다. </p>
<blockquote>
<p>$\sum_{p = 1}^{d}\frac{\partial \pmb{f}}{\partial x_p}\big|_{\pmb{x}=\pmb{a}}(\pmb{x} - \pmb{a})$
$x_p$가 변했을 때, $f(x)$가 얼마나 변하는지 나타내주는 항</p>
</blockquote>
<h2 id="3-2-deep-taylor-decomposition">3-2. Deep Taylor Decomposition</h2>
<blockquote>
<p>$f(\pmb{x}) = f(\pmb{a}) + \sum_{p = 1}^{d}\frac{\partial \pmb{f}}{\partial x_p}\big|_{\pmb{x}=\pmb{a}}(\pmb{x} - \pmb{a}) + \epsilon$</p>
</blockquote>
<p>$f(a)=0$, $\epsilon=0$일 때 relevance를 계산할 수 있다.  </p>
<blockquote>
<p>$f(x) = f(a) + \sum_{i=1}^{d}\frac{\partial f}{\partial x_i}\big|<em>{x_i = a_i}(x_i-a_i) + \epsilon$
$= \sum</em>{i=1}^{d}\frac{\partial f}{\partial x_i}\big|<em>{x_i = a_i}(x_i-a_i)$
$= \sum</em>{i=1}^{d}R_i$</p>
</blockquote>
<p>출력을 Relevance Score로만으로 분해하자! </p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/8c825dbc-d287-4c77-a6f7-a18295d95770/image.png" alt="">
Neural Net에서 $f(x)$의 출력값이 나오기 전에 activation funciton ReLU를 사용한다고 가정했을 때,
$f(x) = \max\left(0, \sum_{i=1}^{2}w_i x_i + b\right)$
의 형식으로 나타낼 수 있다. ReLU함수의 특성상 0보다 작은 경우에는 $f(x) = 0$을 가지기에 0보다 큰 경우일 때에 대해서 계산을 해야 한다.</p>
<p>$f(x) = \sum_{i=1}^{2}w_ix_i + b = f(a) + \sum_{i=1}^{d}\frac{\partial f}{\partial x_i}\big|_{x_i=a_i}(x_i-a_i) + \epsilon$
위의 식은 $f(x)$에 대해 Taylor Decomposition을 해준 것이다.</p>
<p>$f(x) = w_1x_1+w_2x_2+b$ </p>
<p>$f(x)$를 각 입력 원소별로 편미분해주면 $\frac{\partial f(x)}{\partial x_1}= w_1, \frac{\partial f(x)}{\partial x_2} = w_2$ 이 나오고, 이 이상의 더 높은 항들에 대해서는 $\frac{\partial ^2 f(x)}{\partial x_1 ^2} = 0, \space \frac{\partial^2 f(x)}{\partial x_1 \partial x_2} = 0, \space \cdots$ 편미분 값이 0인 것을 알 수 있다. 따라서 $\epsilon = 0$</p>
<p>$f(x) = \sum_{i=1}^{2}w_ix_i+b = f(a) + \sum_{i=1}^{2}w_i(x_i-a_i)$</p>
<p>a는 Taylor Series를 활용해 함수를 근사할 때, 그 시작점 $x = a$을 뜻한다. $f(a) = 0$의 제약조건을 만족해야 하기 때문에 조건을 만족시키는 $a$ 값을 찾아 대입을 하면 된다. </p>
<h1 id="4-application">4. Application</h1>
<p><img src="https://images.velog.io/images/tobigs_xai/post/b1470f8f-ffa6-4a78-bf1c-5a5813c8be69/image.png" alt="">
앞서 예시들과 같이 이미지 Classification시 LRP로 각 원소의 기여도를구하고, 이 값을 통해 벡터값을 추정한 다음 히트맵을 활용해서 모델의 결정을 파헤쳐 볼 수 있다. 이는 Text에서도 가능한데 아래 이미지는 네이버 영화 리뷰 데이터셋에서의 긍정/부정 Classification 결과를  LRP로 해석해 시각화 한 자료이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/67aefac4-ab33-476a-994d-1a5d6267ee39/image.png" alt=""></p>
<blockquote>
<p>참고자료</p>
<ul>
<li>안재현. (2020). XAI 설명 가능한 인공지능, 인공지능을 해부하다 / 안재현 지음.</li>
<li><a href="https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html">https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html</a></li>
<li><a href="https://itkmj.blogspot.com/2019/08/blog-post.html">https://itkmj.blogspot.com/2019/08/blog-post.html</a></li>
<li><a href="https://lrpserver.hhi.fraunhofer.de/handwriting-classification">https://lrpserver.hhi.fraunhofer.de/handwriting-classification</a></li>
<li>Deep Learning: Theory, Algorithms, and Applications. Berlin, June 2017 - <a href="https://www.youtube.com/watch?v=xkN3WyNeuU0">06. Explaining Decisons of Neural Networks by LRP. Alexander Binder</a></li>
<li><a href="https://doi.org/10.1371/journal.pone.0130140">Bach S, Binder A, Montavon G, Klauschen F, Müller K-R, Samek W (2015) On Pixel-Wise Explanations for Non-Linear Classifier Decisions by Layer-Wise Relevance Propagation. PLoS ONE 10(7): e0130140.</a></li>
<li><a href="https://arxiv.org/abs/1512.02479">Grégoire Montavon, Sebastian Bach, Alexander Binder, Wojciech Samek, Klaus-Robert Müller (2015) Explaining NonLinear Classification Decisions with Deep Taylor Decomposition</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[3주차] XAI survey paper review (2)]]></title>
            <link>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8-XAI-survey-paper-review-2</link>
            <guid>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8-XAI-survey-paper-review-2</guid>
            <pubDate>Wed, 05 May 2021 09:49:11 GMT</pubDate>
            <description><![CDATA[<h1 id="differences-in-the-methodology">Differences in the methodology</h1>
<p> 앞서 설명했던 XAI 방법론(explainable algorithm)들 간의 차이점에 대해 살펴보는 섹션입니다. XAI 방법론은 1) 모델에 사용되는 <strong>데이터</strong>에 주는 변화 등에 초점을 맞춘 방법론과 <strong>모델 구조와 파라미터</strong>에 초점을 맞춰 모델을 설명하는 방법론으로 크게 구분지을 수 있습니다.
 1)의 경우에는 <strong><em>perturbation-based</em></strong>, 2)의 경우에는 <strong><em>backpropagation-based</em></strong> 방법론이라고 할 수 있습니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/abc9a2eb-6581-43c1-8774-f5601e6b8666/xai_cat_methodology.png" alt="fig1"></p>
<p><br></br></p>
<h2 id="perturbation-based">Perturbation-based</h2>
<p> Perturbation based methodology은 모델에 주어지는 <strong>입력 데이터 값에 다양한 변화</strong>를 주며 <strong>학습 모델을 반복적으로 조사</strong>함으로써 모델을 설명하고자 하는 것입니다. 
해당 방법론의 예시로는,</p>
<ul>
<li>입력 데이터 변수 중 특정 변수를 0, 혹은 random한 다른 값(논문의 표현을 빌리자면     random conterfactual instances)들로 대체</li>
<li>하나 혹은 여러 개의 픽셀 (superpixels) 을 선택</li>
<li>blurring</li>
<li>shifting</li>
<li>masking</li>
</ul>
<p>앞서 배웠던 SHAP과 LIME의 경우에 각각 game theoretic framework 하에서 변수를 제거하며 변수의 correlation을 탐구한다는 점, 그리고 입력 패치를 반복적으로 제공하며 각각의 superpixels에 대한 시각적 설명이 생성된다는 점에서 perturbation-based에 해당합니다.</p>
<p><br></br></p>
<h3 id="deconvolution-nets-for-convolution-visualizations">DeConvolution nets for Convolution Visualizations</h3>
<p>  DeConvolution nets (a.k.a. <strong>DeConvNets</strong>)은 기존 CNN의 neural activations를 시각화하기 위해 <a href="https://arxiv.org/pdf/1311.2901.pdf">Zeiler et al. (2013)</a> 에 의해 고안된 CNN 네트워크입니다. 기존 CNN과 정반대의 결과를 리턴하기 위해 unpooling layer와 deconv layer를 포함하고 있다는 것이 특징입니다. 기존의 CNN이 feature dimension을 줄이며 이미지 내의 특징들을 추출해냈다면, 반대로 DeConvNets는 신경망의 activity를 시각화하기 위해 <strong>입력 픽셀 공간으로 다시 매핑</strong>하는 activation map을 만들어냅니다. 이로써 딥러닝 모델 내의 각 레이어들이 무엇을 어떻게 학습하는지에 대해 이해하는 데 도움을 줍니다.
<br></br>  </p>
<p> <strong><center>[DeConvNets vs ConvNets]<img src="https://images.velog.io/images/tobigs_xai/post/50102c61-364b-48ae-ad11-97e484dd1fb7/image.png" alt="deconvnet 구조"></center></strong></p>
<p> <strong><center>[Unpooling / Deconvolution layer] <img src="https://images.velog.io/images/tobigs_xai/post/b7652a78-de9a-4178-81e1-6e9c37a87ebf/image.png" alt="unpooling과 deconv"></center></strong></p>
<h3 id="prediction-difference-analysis-zintgraf-et-al">Prediction Difference Analysis (<a href="https://arxiv.org/pdf/1702.04595.pdf">Zintgraf et al.</a>)</h3>
<p> Prediction Difference Analysis는 변수가 여러 개 존재할 경우, conditional sampling을 통해 CNN의 이미지 분류 작업에 대한 설명을 하는 방법입니다. 예측된 클래스 c에 대한 각 입력 변수들의 relevance score를 계산함으로써, 모델의 결정에 대해 각 변수가 어떠한 상관관계를 갖는지에 대해 분석할 수 있습니다. 해당 relevance는 $p(y=c|X)$와 $p(y=c|x_\i)$ 간의 차이에 의해 계산됩니다. 이때 $x_\i$ 표현은 $x$를 제외한 모든 변수들로 구성된 입력 셋을 의미합니다.</p>
<h3 id="randomized-input-sampling-for-explanation-rise">Randomized Input Sampling for Explanation (RISE)</h3>
<p>  <a href="https://arxiv.org/pdf/1806.07421.pdf">Petsiuk et al. (2017)</a>에 의해 RISE는 randomized masks (i.e. 랜덤하게 값이 assign된 이진 행렬) 를 입력 이미지에 원소별로 곱해줌으로써 입력 이미지를 교란(perturb)시킵니다. 아래의 그림을 참고하면, 마스킹을 함으로써 해당 부분이 지워진 것처럼 표현이 되었음을 알 수 있습니다. 이후 마스킹된 이미지는 black box prediction 함수인 f를 거쳐 classification에 대한 confidence score를 리턴하게 됩니다. 이후 이를 각 마스크와 weighted sum을 통해 saliency map을 리턴하는 데 사용하게 됩니다.  </p>
<p>  <strong><center>[RISE architecture]<img src="https://images.velog.io/images/tobigs_xai/post/7e2662a7-5b06-4b0a-9bb2-a61e5ef2c052/image.png" alt=""></center></strong></p>
<h3 id="randomization-and-feature-testing">Randomization and Feature Testing</h3>
<p> <a href="https://arxiv.org/pdf/1904.00045.pdf">Burns et al. (2019)</a>는 변수를 전혀 관련없는 값들로 채워넣음으로써 중요 변수들을 가려내는 방법인 Interpretability Randomization Test (IRT)와 One-Shot Feature Test (OSFT)을 소개했습니다.</p>
<p> 그러나 하나 이상의 변수를 입력 값으로부터 제외하는 것은 입력 차원에 대한 변화를 주기 힘든 딥러닝에서는 활용이 어렵습니다. 이는 인공신경망을 활용한 학습은 사전학습된 모델을 바탕으로 학습을 이어나가는 경우가 많기 때문입니다. 또한 값을 0으로 만들어버리거나 혹은 conterfactual한 변수값들로 넣어주는 경우는 변수 간 correlation때문에 제대로된 퍼포먼스를 기대할 수 없게됩니다.</p>
<h3 id="summary-table-for-perturbation-based-methods">Summary Table for perturbation-based methods</h3>
<p> 논문에서 제공한 perturbation 기반 방법론을 정리한 테이블입니다.
<img src="https://images.velog.io/images/tobigs_xai/post/c0d2810d-eee4-4d68-8988-0e0b88bb0df2/image.png" alt=""></p>
<p><br></br> </p>
<h2 id="backpropagation-based-or-gradient-based">BackPropagation-based (or Gradient-based)</h2>
<p>  입력 변수 공간에 변화를 줌으로써 각 변수의 기여도 등을 측정하고자 했던 perturbation 기반의 방법론과는 달리 backprob 기반 방법론은 신경망 결과에 입력 x가 어떻게 영향을 미치는가를 설명하기 위해 신경망 내에서 정보 흐름의 <strong><em>backward pass</em></strong>에 주목합니다.  </p>
<h3 id="saliency-maps">Saliency Maps</h3>
<p> <img src="https://images.velog.io/images/tobigs_xai/post/77998f1a-104d-41d4-aedc-44ea70b0c494/image.png" alt="">Saliency maps는 <a href="https://arxiv.org/pdf/1312.6034.pdf,">Simonyan et al. (2013)</a> 이 처음 소개한 것으로, 모델이 예측한 결과에 각 픽셀이 미치는 영향을 시각화한 것입니다. 앞서 언급한 Zeiler et al. (2013)의 DeConvNets에서도 saliency maps를 시각화하기 위해 역전파를 활용합니다. 이때 정확한 시각화를 위해서 Negative Gradient가 0으로 clipping되지 않는다는 점에서 주목을 받기도 했습니다. Guided backpropagation 방법 또한 Simonyan et al.을 개선한 방법으로 gradient-based method 중 하나입니다.</p>
<h3 id="gradient-class-activation-mapping-cam">Gradient class activation mapping (CAM)</h3>
<p> 대부분의 saliency 방법론은 <strong>pooling layer에서</strong> max pooling 대신 global average pooling을 활용합니다. Zhou et al. (2016)은 global average pooling 대신 <strong>class activation mapping (CAM) 을 활용함</strong>으로써 한 번의 forward-pass만으로 입력 이미지에서 class-specific image region을 잡아내고자 했습니다. Grad-CAM과 Grad-CAM++은 CNN을 깊게 쌓고, 시각화를 좀 더 향상시켜 CAM 방법을 개선한 방법입니다.
 GradCAM은 입력 이미지에서 <strong>class-specific한 영역</strong>을 잡아낼 뿐 아니라, 반대로 모델 결과에 부정적인 영향을 미치는 영역 또한 찾아냄으로써 <strong>counterfactual한 부분</strong>까지 찾아낼 수 있다는 장점이 있습니다. 이를 통해 classification, image segmentation, visual question answering (VQA) 등의 영역까지 널리 활용되고 있습니다. 아래의 그림은 GradCAM을 활용해 segmentation 알고리즘의 성능을 향상시킬 수 있음을 보여주고 있습니다.</p>
<p> <img src="https://images.velog.io/images/tobigs_xai/post/412a418b-d3f0-42ff-b4a1-0f3983ddc774/image.png" alt=""></p>
<h3 id="salient-relevance-sr-maps">Salient Relevance (SR) Maps</h3>
<p>  <a href="https://arxiv.org/pdf/1712.08268.pdf">Li et al. (2019)</a>에 의해 고안된 Salient Relevance (SR) map은 입력 이미지의 LRP를 기반으로 하여 <strong>context까지 인지할 수 있는 salience map</strong>입니다. SR map에서는 LRP relevance map을 찾아낸 뒤, 해당 map에서 각 픽셀에 해당하는 saliency value를 찾는 과정을 수행합니다. 알고리즘을 정리하면 다음과 같습니다.
  <img src="https://images.velog.io/images/tobigs_xai/post/64b1d7e3-519f-48b5-8e50-b9ed9d44757a/image.png" alt=""></p>
<h3 id="attribution-maps">Attribution Maps</h3>
<p>  한편 ICML 2017에서 M.Sundararajan이 발표한 <a href="http://proceedings.mlr.press/v70/sundararajan17a/sundararajan17a.pdf">&quot;Aiomatic attribution for deep networks&quot;</a>에서는 기존의 Gradient 기반 방법론이 완벽히 모델에 대한 설명력을 갖추지 못했다면서 <strong><em>Integrated Gradients (IG)</em></strong>를 제안합니다. 기존의 gradient 방법론이 output의 gradient에 해당 output에 대응되는 input의 값을 곱하는 방식을 활용했다면, Sundararajan et al. (2017)은 baseline x&#39;으로부터 관심있는 input인 x까지의 직선거리 상의 모든 점들의 gradients를 적분하는 방식 (Integrated Gradients; IG)를 고안해냈습니다.</p>
<p>  수식은 다음과 같습니다.</p>
<p>  <img src="https://images.velog.io/images/tobigs_xai/post/067cf3f4-b601-46d9-9ba7-e453ca61cb6e/image.png" alt=""></p>
<p>  이때 $j$는 gradient가 계산되는 차원을 의미하며, 대부분의 경우 베이스라인 $x_i&#39;$는 영행렬 혹은 영벡터를 선택합니다. 이미지의 경우라면 검은 배경 이미지가 될 것이고, 텍스트 분류라면 0으로 초기화된 벡터값이 될 것입니다. 하지만 모든 경우에 위와 같은 베이스라인이 채택되는 것은 아니며 간혹 오히려 성능을 저하시키는 현상이 발생할 수 있으니 태스크에 맞게 선택해야 합니다.</p>
<p>  한편, <strong><em>Expected Gradients(EG)</em></strong>는 Instead Gradient를 개선하여 나온 것으로 모델 설명력을 높이기 위해 <strong>도메인 지식을 모델 내에 인코딩시키는 방식을 제안</strong>합니다. 수식은 다음과 같으며, 이때 $D$는 unerlying data 도메인의 분포를 의미합니다.</p>
<p>  <img src="https://images.velog.io/images/tobigs_xai/post/a373af70-0ed6-4c24-b6e7-89731a2ccb1d/image.png" alt=""></p>
<h3 id="things-desired-in-backprob-based-methods-한계-및-개선사항">Things desired in backprob-based Methods (한계 및 개선사항)</h3>
<p> 위에서 언급한 것과 같이 다양한 gradient 기반 방법론이 제안되었지만, 여전히 한계는 존재합니다. Sundararajan et al.은 다음과 같은 특성들을 충족한다면 더 나은 XAI 기술이 될 것이라고 주장합니다.</p>
<ul>
<li><p><strong>Sensitivity</strong>: 하나의 특성만 다른 두 가지의 인풋이 있다고 했을 때 그 다른 특성은 non-zero attribution을 가져야 한다.</p>
</li>
<li><p><strong>Implementation invariance</strong>: 두 네트워크의 결과가 모든 입력에 대해 동일하다면, 다른 implementations를 가진다고 하여도 이 두 네트워크는 functionally equivalent해야 한다.</p>
</li>
<li><p><strong>Completeness</strong>: Attribution을 모두 더 하면 입력 x와 baseline 입력 x&#39;에 대한 모델 f의 output의 차이와 동일해야 한다.</p>
</li>
<li><p><strong>Linearity</strong>: 네트워크 A와 네트워크 B의 선형결합으로 이루어진 네트워크 C (=aXA + bXB)가 있다고 할 때, C의 attribution은 a X attr(A) + b X attr(B) 이어야 한다.</p>
<p><br></br></p>
<h1 id="model-usage-or-implementation-level">Model Usage or implementation level</h1>
<p><img src="https://images.velog.io/images/tobigs_xai/post/9ad3b4cf-14c9-48a0-90c7-e8ac092a4378/xai_cat_usage.png" alt="">
쉽게 말하면, XAI 방법론이 각 모델마다 달라져야 하는지 혹은 모델 간에 일반화되어 사용될 수 있는지를 논합니다.</p>
</li>
</ul>
<h2 id="model-intrinsic">Model Intrinsic</h2>
<p><img src="https://images.velog.io/images/tobigs_xai/post/d9668843-a191-4560-ad27-51dc5fd7755e/image.png" alt="">
  <strong>Intrinsic methods of explanations</strong>은 Explainer는 모델마다 다르며 다른 모델에 다시 사용되는 것이 불가능하다는 것을 의미합니다.</p>
<h3 id="trees-and-rule-based-models">Trees and Rule-based Models</h3>
<p>  결정트리와 같은 Shallow rule-based 모델은 inherent interpretable 모델입니다. SHAP이나 LIME을 포함한 많은 설명 가능한 알고리즘은 선형 혹은 tree 기반 모델을 활용하기 때문에 이와 같은 알고리즘들도 inherent interpretable하다고 할 수 있습니다.</p>
<h3 id="generalized-additive-models-gams">Generalized additive models (GAMs)</h3>
<p>  GAM 계열의 모델들 또한 inherent interpretable 모델입니다. GAM은 GLM(Generalized Linear Model)의 확장으로 기존 glm에서 정의되었던 종속변수와 독립변수와의 선형관계를 비모수적 함수를 이용하여 비선형적으로 표현 가능한 모델입니다.</p>
<h3 id="sparse-lda-and-discriminant-analysis">Sparse LDA and Discriminant Analysis</h3>
<p>  베이지안 비모수 모델인 Graph-Sparse LDA와 Sparse Penalized Discriminant Analysis(SPDA) 또한 inherent interpretable하다고 할 수 있습니다. 전자의 경우 설명 가능하고 예측의 방식으로 topic summary를 할 수 있도록 고안된 방식입니다. (기존에 주어진 카테고리로 예측하는 방식으로 추정)
 SPDA는 spatio-temporal interpretability를 향상시키고 Functional Magnetic Resonance imaging 데이터에 있어서 classification accuracy를 높이기 위해 고안되었습니다.</p>
<p> 이러한 모델에 내재되어 있는 설명력을 갖춘 경우에는 확장성이 좋지 못합니다. 해당 모델을 사용할 수 있는 환경을 제대로 세팅을 하지 않는 경우 모델 사용 자체가 어렵기 때문에 그 한계를 가지는 단점이 있습니다.</p>
<h2 id="post-hoc">Post-Hoc</h2>
<p> <img src="https://images.velog.io/images/tobigs_xai/post/f37755f9-0581-4c77-a174-49f096d96eb2/image.png" alt=""></p>
<p> Post-Hoc 방식의 XAI 알고리즘은 모델 외부에서 모델에 대해 설명할 수 있는 알고리즘입니다. 모델의 성능을 해치지 않고 설명력을 더해준다는 점에서 매우 유용합니다. DeConvNets, Saliency maps, LRP 등이 이에 속합니다.</p>
<p> <br></br></p>
<h1 id="evaluation-methodologies-issues-and-future-directions">Evaluation Methodologies, Issues, and Future Directions</h1>
<h2 id="evaluation-schemes">Evaluation Schemes</h2>
<p>  아직 Interpretability를 정량적으로 측정하는 데에 있어서 많이 미흡하지만 현재에 존재하는 evaluation scheme을 정리해보자면 다음과 같습니다.</p>
<h3 id="system-causability-scale">System Causability Scale</h3>
<p> user facing human-AI machine-interface에 대한 설명을 위해 고안.</p>
<h3 id="benchmarking-attribution-methods"><a href="https://github.com/google-research-datasets/bam">Benchmarking Attribution Methods</a></h3>
<p> feature attributions와 relative importance가 어느 정도 정확한지를 측정하기 위함.
BAM은 <strong>모델별로(model contrast)</strong> , <strong>같은 모델 내에서 입력별로(input dependence)</strong>, <strong>functionally equivalent inputs에 따라(input independence)</strong> explainer가 얼마나 성능을 보여주는지 측정합니다.</p>
<p> <a href="https://images.velog.io/images/tobigs_xai/post/23d4427b-1084-43ae-a0c6-626ace053112/image.png"></a></p>
<ul>
<li><p><strong>Model constrast scores</strong>
: object로 학습된 모델 $f_o$와 $f_s$가 리턴한 attribution에 대한 차이
 <img src="https://images.velog.io/images/tobigs_xai/post/7aec8714-3894-4fb2-a426-eac017da094c/image.png" alt=""></p>
</li>
<li><p><strong>Input dependence rate</strong>
: scene-only 이미지로 학습된 경우, input dependence는 추가된 물체가 less important라고 attributed된 region을 리턴하는 비율을 측정
 <img src="https://images.velog.io/images/tobigs_xai/post/e2ec9db6-4b77-4496-adaf-5086104b97dd/image.png" alt=""></p>
</li>
<li><p><strong>Input independence rate</strong>
: scene-only 이미지로 학습한 모델이 주어졌을 때 input independence는 기능적으로 크게 중요하지 않은 패치가 붙어있는 이미지가 크게 explanation에 영향을 미치지 않는 비율을 측정
 <img src="https://images.velog.io/images/tobigs_xai/post/bfae24ef-f58f-4806-9a6d-95cb98267d2b/image.png" alt=""></p>
</li>
</ul>
<h3 id="faithfulness-and-monotonicity">Faithfulness and Monotonicity</h3>
<ul>
<li><p>faithfulness: evaluate the correlation between importance scores of features to the performance effect of each feature towards a correct prediction</p>
</li>
<li><p>monotonicity: 피처 중요도에 따라 모델에 피처를 점진적으로 더해나가며 각 데이터 피처의 성능에의 기여도를 측정하는 방법</p>
</li>
</ul>
<h3 id="human-grounded-evaluation-benchmark">Human-grounded Evaluation Benchmark</h3>
<p><strong>사람의 평가를 벤치마크 삼아</strong> 설명 모델을 평가합니다. 다양한 의견을 수집함으로써 최대한 human bias를 제거하고자 합니다.</p>
<h2 id="a-case-study-on-understanding-explanation-maps">A Case-study on Understanding Explanation Maps</h2>
<p> <img src="https://images.velog.io/images/tobigs_xai/post/c8d76fb5-7e4e-4510-9930-97335ebfdae3/image.png" alt=""></p>
<p> survey 논문에서 저자들이 직접 Saliency maps, gradient X input, integrated gradients (IG), LRP, DeepLIFT, Grad-CAM, LIME, SHAP의 방법을 4가지 이미지에 적용한 결과입니다. 참고로, 각 이미지의 경우 위에서부터 모델의 정확도는 94.5 (코알라), 38 (sanbar), 17.4 (말), 95.5 (무당벌레) 를 보여주었습니다.</p>
<p> GRAD-CAM value는 0~1의 범위를 갖고, 0은 no influence &amp; 1은 highest influence of individual pixels (모델의 결정 내에서) 를 의미합니다. SHAP value의 경우에는 -0.3부터 0.3의 범위로 음수의 값은 모델이 해당 결정을 내리는 데에 부정적으로 기여한 부분 (decrease output class probability), 반대로 양수의 값은 해당 결정을 내리는 데에 긍정적으로 기여한 부분 (increase output class probability) 입니다.</p>
<h2 id="limitations">Limitations</h2>
<p> 앞서 살펴본 것처럼 XAI 또한 여러 한계점을 가지고 있습니다. </p>
<ul>
<li>사람이 XAI의 explanation maps을 추론하기가 힘들다는 점 </li>
<li>XAI 알고리즘에 대한 정량적인 평가가 어렵다는 점</li>
</ul>
<p>입니다. 또한 알고리즘 자체가 더 개선되어야 하는 부분도 분명히 존재합니다. 일례로, explanation map visualization의 경우 Ghorbani et al. (2019)은 input image을 아주 조금 교란시켜도 (adding small perturbations) 잘 알려진 XAI 방법들이 리턴하는 결과가 매우 달라지는 걸 발견했습니다.
  <img src="https://images.velog.io/images/tobigs_xai/post/6190ab10-440b-4dde-8f1b-897ea8c5e08e/image.png" alt=""></p>
<h1 id="conclusion">Conclusion</h1>
<p> 지금까지 XAI란 무엇인지, 왜 필요한지, 어떠한 모델이 있는지, 어떤 식으로 분류되는지에 대해 알아보았습니다.</p>
<p> XAI 알고리즘은 scope, methodology, usage의 기준으로 분류할 수 있었으며, scope의 경우 local과 global, methodology의 경우 perturbation과 gradient, usage의 경우 intrinsic, post-hoc으로 구분할 수 있었습니다. 이에 맞추어 LIME, SHAP, LRP, DeconvNets, Saliency Map, CAM 등의 다양한 알고리즘을 알아보았습니다.</p>
<p> 정량적인 평가 방법의 부재와 같은 한계가 분명히 존재하지만 black-box 모델을 설명함으로써 모델의 신뢰성을 높이고, 현재 신뢰성의 부재로 인해 AI의 사용이 제한된 분야로까지의 확장을 꾀하기 위해 XAI에 대한 지속적인 연구가 이루어지고 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[3주차] XAI 트렌드 리뷰논문-앞부분]]></title>
            <link>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8-XAI-%ED%8A%B8%EB%A0%8C%EB%93%9C-%EB%A6%AC%EB%B7%B0%EB%85%BC%EB%AC%B8-%EC%95%9E%EB%B6%80%EB%B6%84</link>
            <guid>https://velog.io/@tobigs_xai/3%EC%A3%BC%EC%B0%A8-XAI-%ED%8A%B8%EB%A0%8C%EB%93%9C-%EB%A6%AC%EB%B7%B0%EB%85%BC%EB%AC%B8-%EC%95%9E%EB%B6%80%EB%B6%84</guid>
            <pubDate>Tue, 04 May 2021 17:54:50 GMT</pubDate>
            <description><![CDATA[<h1 id="opportunities-and-challenges-in-expainable-artificial-intelligence-xai-a-survey">Opportunities and Challenges in Expainable Artificial Intelligence (XAI): A survey</h1>
<p>by Arun Das and Paul Rad</p>
<p>본 게시글은 <code>Opportunities and Challenges in Explainable
Artificial Intelligence (XAI): A Survey</code> 논문의 내용을 정리하고, XAI 연구의 전반적인 동향을 이해하는 것을 목표로 합니다. </p>
<p>논문는 <a href="https://arxiv.org/abs/2006.11371">https://arxiv.org/abs/2006.11371</a> 에서 확인하실 수 있습니다.</p>
<p>본 게시글의 이미지는 출처가 적혀 있으며, 출처가 적혀있지 않은 이미지는 원 논문의 이미지입니다.</p>
<h2 id="abstract">Abstract</h2>
<ul>
<li>인공 신경망 기술은 다양한 분야에 사용되고 있습니다.</li>
<li>하지만 인공 신경망의 블랙박스 특징 때문에 사용이 제한되는 분야가 발생합니다.</li>
<li>설명가능 인공지능(XAI) 기술은 인공지능의 결정에 대해 해석적이고, 직관적이며, 이해가능한 설명을 제공합니다.</li>
<li>본 논문은 XAI를 scope, methodology, explanation level에 따라 정리하며 설명했습니다.</li>
<li>또한 XAI 연구분야에서 2007년 부터 2020년까지 역사적 타임라인을 보여 주며, 연구를 정리했습니다.</li>
<li>추가적으로 8개의 XAI알고리즘의 explanation maps 를 평가하며, 한계점과 미래 발전 방향에 대해 논할 것입니다.</li>
</ul>
<h2 id="introduction">Introduction</h2>
<p><strong>인공지능</strong></p>
<ul>
<li>DNNs(Deep Neural Networks) 은 많은 파라미터들을 가지고 있기 때문에 점점 이해하기 어려워지고 있습니다.</li>
<li>이에 더해서 심층 신경망의 결정을 해석하는 것은 관련 지식을 필요로 합니다.</li>
<li>이런 지식들은 AI 비전문가나, 최종사용자와 같이 정확한 결과가 더 중요한 사람들에게는 필요가 없는 지식일 수 있습니다.</li>
</ul>
<p><strong>XAI 연구의 이유</strong></p>
<p>지난 연구들에 의하면 우리가 XAI를 필요로 하는 이유는 다음 키워드로 정리될 수 있을 것입니다.</p>
<ul>
<li>인간의 호기심</li>
<li>더 좋은 학습을 유도하기 위해</li>
<li>결정에 대한 투명성, 신뢰성, 공정성 확보를 위해</li>
</ul>
<p><strong>논문의 목표</strong></p>
<ol>
<li>XAI를 시간 순서대로 파악하고, 세가지 카테고리로 분류해 명확성과 접근성을 올립니다.</li>
<li>XAI 연구의 핵심 수학적 모델을 요약하고 분류하며 한계와 발전 방향을 평가할 것입니다.</li>
<li>8개의 XAI알고리즘의 explanation maps를 생성하고 분석해 볼 것입니다.</li>
</ol>
<p><strong>기타</strong></p>
<ul>
<li><p>본 논문은 2007년부터 2020년까지 출판된 연구를 기반으로 했습니다.</p>
</li>
<li><p>연구는 Google Scholar, ACM Digital Library, IEEEXplore, ScienceDirect, Spinger, arXiv 등에서 참고하여 정리했습니다.</p>
</li>
</ul>
<h2 id="taxonomies-and-organization">Taxonomies and Organization</h2>
<h3 id="taxonomies">Taxonomies</h3>
<p>본 논문은 XAI를 <code>Scope</code>, <code>Methodology</code>, <code>Useage</code> 의 세 가지 관점에서 분류했습니다.</p>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_1.png?raw=true" alt="survey_1.png"></p>
<ol>
<li><p>Scope</p>
<ul>
<li><p>데이터에 대한 설명 범위를 말합니다.</p>
</li>
<li><p>Local : 전체 데이터 X 안의 단일 데이터 x에 대해서만 설명이 가능하도록 설계된 방법</p>
</li>
<li><p>Global : 모델 전체에 대해서 인사이트를 제공하며, 입력 전체의 배열에 대해 설명을 제공하는 방법</p>
</li>
</ul>
</li>
<li><p>Methodology </p>
<ul>
<li>설명가능 모델 내부에 존재하는 핵심 알고리즘의 방향성을 말합니다.</li>
<li>Backpropagation-based  : 역전파 과정중, 편미분을 활용하여 설명력을 얻습니다.</li>
<li>Perturbation-based : occlusion, 부분적으로 제거된 피쳐, 마스킹, 조건부 샘플링 등의 방법을 사용합니다. 역전파가 필요 없다는 장점이 있습니다.</li>
</ul>
</li>
<li><p>Usage</p>
<ul>
<li>특정 모델에만 적용될 수 있는지, 외부 알고리즘에도 적용될 수 있는지를 말합니다.</li>
<li>Model-intrinsic : 솔루션이 특정 모델 구조에 종속되어 있는 기법입니다.</li>
<li>Post-hoc(model-agnostic) : 이미 잘 예측중인 인공지능 모델에 대입될 수 있는 방법입니다. 다양한 형태의 데이터에도 적용이 가능하게 됩니다.</li>
</ul>
</li>
</ol>
<h3 id="평가방법의-제공">평가방법의 제공</h3>
<ul>
<li><p>Section 7에서, XAI알고리즘의 정량적, 정성적 평가를 위해 몇가지 평가 알고리즘을 제안했습니다.</p>
</li>
<li><p><code>투명성</code>, <code>신뢰성</code>, <code>편향</code> 이해</p>
</li>
<li><p>이 평가방법은 아직 완벽하지는 않지만, 미래에 많은 발전가능성을 가지고 있습니다.</p>
</li>
</ul>
<h3 id="오픈-소스">오픈 소스</h3>
<ul>
<li><p>깃허브 플랫폼의 오픈소스 패키지를 제공합니다.</p>
</li>
<li><p>많은 사용자가 기여한 알고리즘이 포함된 패키지들을 선택했습니다.</p>
</li>
</ul>
<h3 id="수식-표기">수식 표기</h3>
<p>본 논문에서 제안된 모든 수식은 다음 표현 방법을 따릅니다.</p>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_2.png?raw=true" alt="survey_2.png"></p>
<h2 id="definitions-and-preliminaries">Definitions and Preliminaries</h2>
<p>본 논문에서는 XAI의 정의를 다음과 같이 설정했습니다.</p>
<blockquote>
<p>AI 시스템의 신뢰성과 투명성을 향상시키기 위해 설계된 일련의 기술과 알고리즘</p>
</blockquote>
<p><strong>DNN과 XAI</strong></p>
<ul>
<li>신경망을 설명하기 위한 접근이 많은 연구에서 제안된 바 있습니다.</li>
<li>신경망에 적용된 설명가능 인공지능의 목표는 다양한 방법으로 모델의 예측값을 설명하는 것에 집중하게 됩니다.</li>
</ul>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_3.png?raw=true" alt="survey_3"></p>
<ul>
<li><p>논문에서 DNNs를 설명하기 위해 설명한 그림입니다.</p>
</li>
<li><p>딥러닝 모델은 하나의 $x$ 가 딥러닝 모델 $f$를 통과하여 $\bar{y}$ 라는 결과를 산출합니다.</p>
</li>
<li><p>이때 $x$는 전체 데이터 안의 단일 데이터이며, 다른 메타데이터가 포함되어있지 않은 데이터입니다.</p>
</li>
<li><p>$x$가 딥러닝 모델을 통과하여 $\bar y$를 반환하는데, 이는 특정 클래스 $C$에 포함된 결과입니다.</p>
</li>
<li><p>이 신경망 모델을 $\bar y = f(\theta, x)$ 로 표현합니다.</p>
</li>
</ul>
<p><strong>용어 정리</strong></p>
<h3 id="interpretability">Interpretability</h3>
<blockquote>
<p>해석가능성(Interpretability)이란 특정 알고리즘이 어떻게 동작하는지 이해할 수 있게, 충분한 표현을 제공하는 알고리즘의 기능이나 특징이다.</p>
</blockquote>
<ul>
<li>해석가능한 도메인은 이미지나 텍스트 등 사람이 이해할 수 있는 영역을 포함합니다.</li>
</ul>
<h3 id="interpretation">Interpretation</h3>
<blockquote>
<p>해석(Interpretation)이란 복잡한 도메인의 단순화된 표현이다. 예를 들어 ML모델의 결과물이나, 사람이 이해가능/합리적인 의미있는 콘셉트이다.</p>
</blockquote>
<ul>
<li><p>rule-based 모델의 예측 결과물은  rule-set을 통해 쉽게 해석될 수 있습니다.</p>
</li>
<li><p>CNN 네트워크 등은 의사 결정에 영향을 미친 부분을 추론할 수 있습니다.</p>
</li>
</ul>
<h3 id="explanation">Explanation</h3>
<blockquote>
<p>설명(Explanation) 이란 ML모델이나 외부 알고리즘에 의해 생성된 추가적인 메타 정보이다. 이는 피처 중요도나, 입력 데이터와 출력 데이터의 관련성을 묘사한다.</p>
</blockquote>
<ul>
<li><p>예를 들어 이미지에 대해서는 입력 이미지와 같은 크기의 픽셀 맵인 explanation map이 생성될 수 있습니다.</p>
</li>
<li><p>텍스트에 대해서는 word-by-word influence scores가 있습니다.</p>
</li>
</ul>
<h3 id="white-box">White-box</h3>
<blockquote>
<p>딥러닝 모델 $f$에 대해서, 모델 파라미터 $\theta$ 와 모델 구조가 알려져 있는 경우, 이 모델을 화이트박스(White-box)라 여긴다.</p>
</blockquote>
<ul>
<li><p>화이트 박스 모델은 모델 디버깅을 용이하게 하고, 신뢰도를 향상시킵니다.</p>
</li>
<li><p>하지만 단순히 모델 구조와 파라미터에 대해서 아는 것은 모델을 설명 가능하게 하지는 않습니다.</p>
</li>
</ul>
<h3 id="black-box">Black-box</h3>
<blockquote>
<p>모델 파라미터나 네트워크 구조가 최종 사용자에게 숨겨져 있으면 이를 블랙박스(Black-box)라고 여긴다.</p>
</blockquote>
<ul>
<li>웹 기반 딥러닝 모엘 서비스나, 제한된 비즈니스 플랫폼에서의 API식 모델은 입력 데이터를 받아 단순히 결과물만 반환하는 블랙박스적 구성을 띄고 있습니다.</li>
</ul>
<p>논문에서는 4개의 용어를 더 설명하는데, XAI가 중요한 이유와 함께 설명합니다.</p>
<p>이것들은 의료, 신용등급 측정 등에서 인공지능이 사용되기 위해 필요한 윤리성, 사법성, 안전성을 가지기 위해 필요한 것들이라고 말합니다.</p>
<h3 id="transparent">Transparent</h3>
<blockquote>
<p>딥러닝 모델의 표현이 사람이 알아듣기 충분한 경우, 모델을 투명하다(Transparent)고 여긴다.</p>
</blockquote>
<p><strong>1) XAI는 투명성을 증가시킵니다.</strong></p>
<p>XAI는 결과물을 사람이 인식할 수 있게 해석하므로 투명성과 공정성이 증가합니다.</p>
<p>투명성이 높으면 결과물의 질이 상승하고,  외부 공격을 차단할 수 있게 됩니다.</p>
<p>본 논문은 투명성이 필요한 이유를 잘 나타내는 예시로 두 개를 제시합니다.</p>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_4.png?raw=true" alt="survey_4"></p>
<p>첫 번째 예시로 적대적 공격을 이야기하며 다음 사진을 보여 주었습니다.  원본 이미지에 약간의 적대적 노이즈를 더해 주니 판다를 긴팔원숭이로 이해하게 되는 문제가 있었다고 합니다.</p>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_5.png?raw=true" alt="survey_5"></p>
<p>두 번째 예시로 이미지를 분류할 때 워터마크에 집중하여 분류하는 모습을 보였던 사진입니다. 이미지에서 텍스트를 제거하니 정상적인 분류가 아닌 값을 반환합니다. 인공지능 모델이 텍스트에 대해 학습된 것으로 볼 수 있을 것입니다.</p>
<p>논문은 우리가 자동화된 알고리즘에 의존할 수록 AI알고리즘이 공격을 방어하고 투명한 결과를 제공하는 것은 매우 중요해져야 할 것이라고 말합니다.</p>
<h3 id="trustbility">Trustbility</h3>
<blockquote>
<p>딥러닝 모델의 신뢰가능성(Trustbility)은 최종 사용자인 인간으로서, 현실 환경에서에서 모델의 의도한 동작에 대해서 측정된 확신의 정도이다.</p>
</blockquote>
<p><strong>2) XAI는 모델의 신뢰성을 높입니다.</strong></p>
<p>인간은 사회적 동물로서 특정 상황에 대한 지식과 사실에 의해 결정을 내립니다.</p>
<p>자연스럽게 아무 설명이 없는 최적의 결정보다 덜 합리적인 결정에 대해 과학적 설명/논증이 있는 것이 더 낫다고 여기게 될 것입니다.</p>
<p>따라서 &#39;특정 결정이 왜 내려졌는가&#39; 는 최종 사용자가 인공지능에 대해 신뢰감을 가지는 데 매우 중요한 요소가 됩니다.</p>
<h3 id="bias">Bias</h3>
<blockquote>
<p>딥 러닝 알고리즘의 편향(Bias)은 편향된 가중치, 편견, 선호, 인간의 데이터 수집이나 학습 알고리즘 부족에 의해 유발된 학습된 모델의 경향성이다.</p>
</blockquote>
<p><strong>3) XAI는 모델의 편향을 이해하고 공정성을 증가시킵니다.</strong></p>
<p>XAI 기술을 통해 모델의 행동을 이해하는 것은 모델의 편향과 왜도에 대한 이해를 증가시킬 수 있습니다.</p>
<p>입력 공간(input space)에 대한 이해는 편향이 줄어든 모델이나, 더 빠른 모델에 대한 연구가 가능하게 할 것입니다.</p>
<p><strong>정리</strong></p>
<p>XAI 기법은 인공지능을 사용하고 제작하는 데 많은 이점을 가져다 줄 것입니다. 하지만 설명을 위해 적합한 방법을 선택하는 것은 많은 주의와 노력이 필요합니다.</p>
<p>이후 본 논문은 다양한 기법을 제시해 보며 논의합니다.</p>
<h2 id="scope-of-explanation">Scope of Explanation</h2>
<p>앞서 이야기했던 세 가지 분류 중 설명 범위에 대해 분류한 예시들입니다.</p>
<h3 id="local-explanations">Local Explanations</h3>
<ul>
<li><p>첫 번째 분류는 &#39;로컬 설명&#39; 입니다.</p>
</li>
<li><p>의사가 분류 모형의 결과를 가지고 진단을 내린다고 가정하면, 의사는 인공지능의 예측에 대해 깊은 예측과 &#39;왜 그렇게 생각했는지&#39; 명확한  설명이 필요합니다.</p>
</li>
<li><p>위 사례와 같은 유형의 문제가 Locally explainable한 방법의 한 예입니다.</p>
</li>
</ul>
<p>로컬 설명은 모형 $f$와 단일 데이터 $x$를 통해 설명 내용인 $g$를 만드는 것입니다.</p>
<p>논문에서는 그림으로 다음과 같이 표현합니다.</p>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_6.png?raw=true" alt="survey_6"></p>
<ul>
<li>초기 연구는 히트맵, rule-based한 방법, 베이지안, 피처 중요도, 등을 사용했습니다.</li>
<li>이 결과들은 항상 양수인 real-valued metrics/vectors였다는 문제점이 있습니다.</li>
<li>최근 연구는 attribution maps나 그래프 기반, 게임이론 기반 등을 사용해 양수와 음수의 결과를 모두 사용합니다.</li>
<li>주로 양의 분포값은 특정 피처가 결과가 나오는데 긍정적 영향을 미친 것이고, 음의 분포값은 결과의 부정적인 영향을 미치는 것입니다.</li>
</ul>
<h4 id="activation-maximization">Activation Maximization</h4>
<p>참고 : <a href="https://m.blog.naver.com/vyoyo/221552750022">https://m.blog.naver.com/vyoyo/221552750022</a></p>
<ul>
<li>CNN에서 Layer-wise 한 피처의 중요도를 파악하는 방법입니다.</li>
<li>특정 채널의 activation을 최대화 하는 패턴$x$가 있다면, 그 $x$가 채널이 학습한 피처의 패턴이라고 볼 수 있다는 아이디어에서 시작합니다.</li>
<li>실행 알고리즘은 다음과 같습니다.</li>
</ul>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_7.png?raw=true.png" alt="survey_7"></p>
<p>출처 : <a href="https://arxiv.org/pdf/1804.11191.pdf">HOW CONVOLUTIONAL NEURAL NETWORKS SEE THE WORLD — A SURVEY OF CONVOLUTIONAL NEURAL NETWORK VISUALIZATION METHODS (Zhuwei Qin, 2018)</a></p>
<blockquote>
<ol>
<li>랜덤한 픽셀로 구성된 이미지 $x_0$ 을 구한다.</li>
<li>이미지를 파라미터가 고정된 학습 모델에 넣고 그래디언트를 구한다.</li>
<li>정해진 학습률만큼 activation값이 최대화하는 방향으로 움직인다.</li>
<li>학습이 완료되면 $x^*$ 는 특정 패턴의 이미지가 나타날 것이다.</li>
</ol>
</blockquote>
<ul>
<li>학습이 완료되면 다음과 같은 결과가 나오게 됩니다.</li>
</ul>
<p><img src="https://blog.keras.io/img/conv5_2_stitched_filters_8x3.png" alt="Some convnet filters"></p>
<p>출처 : <a href="https://blog.keras.io/how-convolutional-neural-networks-see-the-world.html">How convolutional neural networks see the world</a></p>
<h4 id="saliency-map-visualization">Saliency Map Visualization</h4>
<p>참고 자료 : <a href="https://yeoulcoding.tistory.com/76">https://yeoulcoding.tistory.com/76</a></p>
<ul>
<li>샐리언시 맵은 사람이 물체를 볼 때 관심 영역에 시선을 먼저 집중하는 데서 아이디어를 얻습니다.</li>
<li>샐리언시 맵은 출력 카테고리에 대한 모델의 그래디언트를 계산합니다. 이 그래디언트를 시각화하면 픽셀에 대한 중요도를 볼 수 있을 것입니다.</li>
<li>이 때 <strong>양의 그래디언트를 가지면 출력 결과에 더 큰 영향을 줄 것이라는 가정</strong>을 합니다.</li>
<li>저자는 1) 클래스 모델 시각화, 2) image-specific 시각화의 두 가지 시각화 방법을 제안했지만, 1) 클래스 모델 시각화는 글로벌 기법이므로 후에 설명합니다.</li>
</ul>
<p><img src="https://blog.kakaocdn.net/dn/c2kTzL/btqCKA4EceF/WS9aUqI0zy5RUlJ2zjUmMk/img.png" alt="image"></p>
<ul>
<li>샐리언시 맵의 추출은 다음 과정을 통해 이루어집니다.</li>
</ul>
<blockquote>
<ol>
<li>명확하게 라벨링된 이미지와 잘 훈련된 모델을 준비한다.</li>
<li>이미지를 모델에 넣어 출력 벡터를 구한다.</li>
<li>구한 벡터를 input 이미지에 대해 편미분하여 기울기를 구한다.</li>
<li>3)의 결과의 3개의 값(R, G, B) 중 최댓값을 취한 뒤에 절댓값을 취한다.</li>
<li>결과를 반환한다.</li>
</ol>
</blockquote>
<h4 id="layer-wise-relevance-backpropagation-lrp">Layer-wise Relevance BackPropagation (LRP)</h4>
<p>참고 : <a href="https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html">https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html</a></p>
<ul>
<li>LRP 기술은 DNN의 출력값을 분해(Decompose)하여 각각의 피처에 대한 타당성 점수(relevance scores)를 구합니다.</li>
<li>CNN에서는 타당성이 레이어간 전파되며, RNN 에서는 타당성이 은닉 상태와, 메모리 셀에 전파되는 등 모든 모델에 적용이 가능합니다.</li>
</ul>
<p><img src="https://raw.githubusercontent.com/angeloyeo/angeloyeo.github.io/master/pics/2019-08-17_LRP/pic7.png" alt="img"></p>
<p>출처 : <a href="https://angeloyeo.github.io/2019/08/17/Layerwise_Relevance_Propagation.html"><strong>Layer-wise Relevance Propagation</strong> - 공돌이의 수학정리노트</a></p>
<ul>
<li><p>각 층에서 역순으로 출발하여 각 층의 타당성 점수를 전파합니다.</p>
</li>
<li><p>하나의 뉴런의 출력은 그 노드에 대한 타당성 점수의 합으로 나타내어집니다. $f(x) = \Sigma_jR_{i\leftarrow j}$</p>
</li>
<li><p>타당성 점수의 전파는 다음 그림과 같이 표현됩니다.</p>
<p><img src="https://2.bp.blogspot.com/-nwa2Y3ZW2Cw/XV-UOUCTuxI/AAAAAAAAsXc/zRTQgHVb39w_JMBRv_xqM3nSbez3BkwyQCK4BGAYYCw/s640/LRP.PNG" alt="img"></p>
</li>
</ul>
<p>출처 : <a href="https://itkmj.blogspot.com/2019/08/blog-post.html">딥러닝 안에서 일어나는 과정을 해석하는 설명가능 인공지능 기술</a></p>
<ul>
<li>한 계층의 타당성 점수의 합은  이전 계층의 모든 타당성 점수의 합으로 나타내어집니다. (보존 공식)</li>
<li>이렇게 얻은 마지막 계층의 타당성 점수를 시각화하면 중요도를 시각적으로 표현할 수 있을 것입니다.</li>
<li>LRP 방법은 모델의 정확도 손실 없이 연산량이나 저장 비용 등을 절감하는 network pruning으로도 사용될 수 있습니다.</li>
</ul>
<h4 id="local-interpretable-model-agnostic-explanations-lime">Local Interpretable Model-Agnostic Explanations (LIME)</h4>
<p>참고 : <a href="https://yjjo.tistory.com/3">https://yjjo.tistory.com/3</a></p>
<ul>
<li><p>LIME은 &#39;중요한 부분일 수록 변형되었을 때 예측값이 크게 변한다&#39;는 아이디어에서 출발해, 입력을 변형시키면서 예측값을 크게 변화시키는 값을 찾는 방법입니다.</p>
</li>
<li><p>이미지에서 LIME은 연속적인 &#39;슈퍼픽셀&#39;을 통해 중요성을 찾으려 하는 방법입니다..</p>
</li>
<li><p>0 (목표값이 없다) 또는 1(목표값이 있다) 을 예측하는 방법 대리 모델을 생성하는 방법으로 문제를 단순화 하게 됩니다.</p>
</li>
<li><p>이미지 형태 데이터에 대해서는 다음 방식으로 이미지를 변형합니다.</p>
</li>
</ul>
<p><img src="https://miro.medium.com/max/3634/1*wHLeYXmhK7h34yKb4Iq56A.png" alt="img"></p>
<p>출처 : <a href="https://towardsdatascience.com/interpretable-machine-learning-for-image-classification-with-lime-ea947e82ca13">Interpretable Machine Learning for Image Classification with LIME</a></p>
<ul>
<li>$\xi(x) = argmin_{g \in G}\mathcal{L}(f,g,\pi_x) + \Omega(g)$ 식으로 최적화 문제를 나타낼 수 있습니다.</li>
<li>LIME는 위 식 (  $\xi(x)$  )을 최소화하는 방향으로 학습을 진행합니다.</li>
<li>$\mathcal{L}(f,g,\pi_x)$ 는 $f(x)$ 와 $g(x)$ 의 차이이며, 이를 최소화해야 합니다. (예측 값이 비슷할수록 중요한 데이터가 포함되어 예측 오차가 작아질 것입니다.)</li>
</ul>
<img src="https://miro.medium.com/max/2524/1*K4HCitQxRrjcFekIsSZDSg.png" alt="img" style="zoom:67%;" />

<p>출처 : <a href="https://towardsdatascience.com/interpretable-machine-learning-for-image-classification-with-lime-ea947e82ca13">Interpretable Machine Learning for Image Classification with LIME</a></p>
<ul>
<li>LIME 분석을 텍스트 데이터에 대해 출력하면 다음과 같은 결과물이 나타납니다.</li>
</ul>
<p><img src="https://d3ansictanv2wj.cloudfront.net/figure5-cd7d3c5128549df1e957bf8f9f93bb2b.jpg" alt="20 newsgroups 데이터셋 중 한 예측에 대한 설명."></p>
<p>출처 : <a href="https://dreamgonfly.github.io/blog/lime/">머신러닝 모델의 블랙박스 속을 들여다보기 : LIME</a></p>
<p><strong>후속 연구</strong></p>
<p>최근에는 LIME을 발전시키는 많은 후속연구들이 나타났습니다. 본 논문은 그 사례를 몇 가지 보여줍니다</p>
<ul>
<li><p><a href="https://www.semanticscholar.org/paper/Local-Interpretable-Model-Agnostic-Explanations-for-Mishra-Sturm/8b0a16b2475798ed1b5f5cffed62a47e1ef30c7d"><strong>Sound-LIME(SLIME)</strong></a> : LIME을 활용해 목소리 탐지 시스템을 설명하고자 했습니다.</p>
<img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_8.png?raw=true" alt="survey_8" style="zoom:50%;" />

<p>출처 : <a href="http://www.eecs.qmul.ac.uk/~simond/pub/2017/MishraSturmDixon-ISMIR2017.pdf">Local Interpretable Model-Agnostic Explanations for Music Content Analysis</a></p>
</li>
<li><p><a href="https://arxiv.org/abs/1810.02678"><strong>KL-LIME</strong></a> : 베이지안 모델을 설명하기 위한 LIME 모델로, KL-divergence (두 확률분포 간 차이)를 최소화하는 모형을 발견했습니다.</p>
</li>
<li><p><a href="https://arxiv.org/abs/1906.10263"><strong>DLIME</strong></a> : 무작위 변형이 아닌 계층적 클러스터링이나 KNN기법을 사용한 방법입니다. 기존 방법에 비해 더 안정적으로 분석이 가능해졌다고 합니다.</p>
</li>
<li><p><a href="https://scholar.smu.edu/cgi/viewcontent.cgi?article=1138&amp;context=datasciencereview"><strong>Quadratic-LIME(QLIME)</strong> </a>: 대리 모델을 비선형으로 설정해도 LIME을 적용할 수 있게 했습니다.</p>
</li>
<li><p><a href="https://arxiv.org/abs/2002.07434"><strong>Modified Perturbed Sampling operation for LIME(MPS-LIME)</strong></a> : 슈퍼픽셀 선택 방법을 변경했습니다. (그래프적 방법 도입)</p>
<img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_9.png?raw=true" alt="survey_9" style="zoom:50%;" />

<p>출처 : <a href="https://arxiv.org/abs/2002.07434">A Modified Perturbed Sampling Method for Local Interpretable Model-agnostic Explanation</a></p>
</li>
</ul>
<h4 id="shapley-addictive-explanations-shap">SHapley Addictive exPlanations (SHAP)</h4>
<p>참고 : <a href="https://datanetworkanalysis.github.io/2019/12/23/shap1">https://datanetworkanalysis.github.io/2019/12/23/shap1</a>, <a href="https://eair.tistory.com/30">https://eair.tistory.com/30</a></p>
<ul>
<li>SHAP는 input $x$가 예측값에 미친 피처별 기여도를 설명합니다.</li>
<li>섀플리값은 &#39;연합 게임이론&#39;에서 플레이어의 기여도에 따라 보상을 배분하는 방법에 대한 표현입니다.</li>
<li>기여도를 분석하는 피처는 테이블 형태에서는 각각의 행이, 이미지에서는 슈퍼픽셀이 될 수 있습니다.</li>
<li>이 방법은 $g(z′)=ϕ<em>0+∑</em>{j=1}^{M}ϕ_jz′_j$ 의 식으로 설명됩니다.</li>
<li>$z$는 특성 벡터로서 특정 피처가 있으면 1, 없으면 0으로 계산하고, $\phi$는 섀플리 값 (기여도)를 의미합니다.</li>
<li>$g(z&#39;)$는 존재하는 피처들의 섀플리 값의 합으로 설명됩니다.</li>
</ul>
<p>기본적인 SHAP 방법은 이후 다양한 방법에 적용되었습니다.</p>
<p><strong>KernelSHAP</strong></p>
<ul>
<li>LIME 모형에 SHAP커널을 사용하여 값을 추정합니다.</li>
<li>대량의 데이터에서 필요한 계산량을 감소시켰습니다.</li>
<li>모든 머신러닝 알고리즘에 적용될 수 있습니다. (피처를 랜덤 샘플링해서 제거하는 방식 사용)</li>
</ul>
<p>*<em>LinearSHAP *</em></p>
<ul>
<li>최대 연합의 크기 $M$이 작은 경우에서 효율적인 방법입니다.</li>
</ul>
<p><strong>DeapSHAP</strong></p>
<ul>
<li><p>DeepLIFT 방법을 적용했습니다.</p>
</li>
<li><p>DeepLIFT는 역전파 시 기울기 변화량을 사용해서 영향력을 계산하는 방법입니다.</p>
<img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_10.png?raw=true" alt="survey_10" style="zoom:50%;" />

<p>출처 : <a href="https://docs.google.com/file/d/0B15F_QN41VQXSXRFMzgtS01UOU0/edit?filetype=mspresentation">Learning Important Features Through Propagating Activation Differences</a>(논문 발표)</p>
</li>
</ul>
<p><strong>후속 연구</strong></p>
<p>SHAP 방법은 의료 분야에서 의사결정을 설명하기 위해 종종 사용되어졌습니다.</p>
<p>본 논문은 의료 분야에서 SHAP의 추가적인 적용에 대해서 설명합니다.</p>
<ul>
<li><p><a href="https://arxiv.org/abs/1903.02407"><strong>extendedSHAP</strong></a> : 이상 탐지를 위해 사용되던 오토인코더를 설명합니다. 오토인코더가 재구성(reconstruction)할 때의 오차를 사용해 확인하게 됩니다.</p>
</li>
<li><p><a href="https://arxiv.org/abs/1908.08474"><strong>Baseline Shapley(BShap)</strong></a> : 특정 피처가 상대적으로 덜 중요할 때 비직관적인 설명을 내는 문제를 해결했습니다.</p>
</li>
<li><p><a href="https://arxiv.org/abs/1903.10464"><strong>KernelSHAP 의 확장</strong></a> : 상관관계가 있는 피처들을 해석하기 위해 개발되었습니다.</p>
</li>
<li><p><a href="https://arxiv.org/abs/1905.04610"><strong>TreeExplainer</strong></a> : SHAP을 트리 모델에 대해 확장했다. 트리 모델의 로컬 설명이 다항시간 안에 계산될 수 있음을 밝습니다.</p>
</li>
<li><p><a href="https://www.sciencedirect.com/science/article/abs/pii/S1574954119303498"><strong>LSTM에 대해 확장</strong></a> : DeepSHAP 알고리즘을 사용해 LSTM에 확장했습니다.</p>
</li>
</ul>
<h3 id="global-explanations">Global Explanations</h3>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_11.png?raw=true" alt=""></p>
<ul>
<li>글로벌하게 설명하는 방법은 딥러닝 모델을 더 해석하기 쉬운 선형 모델로 추론하는 방법이라고 볼 수 있습니다.</li>
<li>Rule-based나 트리 모형, 선형 모델은 그 자체로도 글로벌하게 해석가능한 모델이라 추가적인 방법이 필요하지 않습니다.</li>
<li>일반적으로 입력들의 배열에 대해서 블랙박스 모형의 전반적인 경향을 보여주게 됩니다.</li>
</ul>
<h4 id="global-surrogate-models">Global Surrogate Models</h4>
<p>참고 : <a href="https://christophm.github.io/interpretable-ml-book/global.html">https://christophm.github.io/interpretable-ml-book/global.html</a></p>
<ul>
<li>Global Surrogate Model은 비선형적 모델을 설명이 가능한 선형 모델이나 트리 모델로 근사시키는 방법입니다.</li>
<li>본 모델을 설명하기에는 너무 복잡하기 때문에 훨씬 단순한 모형으로 표현하고자 하는 것입니다.</li>
<li>&quot;어떻게 내 AI 모델이 일반화될 수 있는지&quot;, &quot;어떻게 내 AI모델의 변형이 작동하는지&quot;에 대한 질문에 대답합니다.</li>
<li>Surrogate Model의 대표적인 예시는 feature-rich layer embeddings 가 있습니다.</li>
<li>SHAP, LIME등을 대리자로 사용해서도 예측할 수 있습니다.</li>
</ul>
<p>모델의 진행은 다음과 같습니다.</p>
<blockquote>
<ol>
<li>데이터셋 $X$ 를 선정한다.</li>
<li>블랙박스 모델 $f$에 $X$를 넣어 예측값을 생성한다.</li>
<li>해석가능한 모델의 타입을 설명한다.(선형 모델, 의사결정트리...) 이를 대리 모델로 선정한다</li>
<li>$X$ 와 $f(X)$(예측값)에 대해 대리 모델을 학습시킨다.</li>
<li>대리 모델을 해석한다.</li>
</ol>
</blockquote>
<h4 id="class-model-visualization">Class Model Visualization</h4>
<p>참고 : <a href="https://glassboxmedicine.com/2019/07/13/class-model-visualization-for-cnns/">https://glassboxmedicine.com/2019/07/13/class-model-visualization-for-cnns/</a></p>
<ul>
<li><p>Activation Maximization을 Class Model을 사용하여 글로벌하게 확장한 방법입니다.</p>
</li>
<li><p>이미지 클래스를 분류하는 모델$f$ 는 $c$ 클래스 이미지 $I$에 대해 예측값을 반환합니다.</p>
</li>
<li><p>이 클래스 이미지의 확률 $S_c(I)$ 를 최대화하는 방향으로 학습되게 됩니다. </p>
</li>
<li><p>설명 이미지는 $I&#39; = argmax S_c(I) - \lambda ||I||^2_2$ 으로 표현됩니다.</p>
</li>
<li><p>L2 Norm부분은 이미지가 너무 극단적인 값으로 뛰는 것을 막아주게 됩니다.</p>
</li>
<li><p>이렇게 생성된 이미지는 블랙박스 모델이 특정 클래스에 대해 어떤 특징을 학습했는지를 나타낼 수 있습니다.</p>
</li>
<li><p>몽환적이고, 알록달록한 색 때문에 생성된 이미지를 &#39;Deep Dream&#39; 이라고 부르기도 한다고 합니다.</p>
</li>
</ul>
<img src="https://www.researchgate.net/profile/Talley-Lambert/publication/312620507/figure/fig3/AS:453895710351363@1485228578818/Class-Model-Visualization-We-estimated-class-models-from-either-the-healthy-top-row-or.png" alt="Class Model Visualization. We estimated class models from either the healthy (top row) or sick (bottom row) classes. Initializing the model image I to a zero image (left panels) produced structures weakly reminiscent of nucleoli for the healthy class (upper left panel) and more disorganized images for the sick class (lower left panel). Initializing I to an image from the opposing class (right panels) added nucleoli to sick cells and removed vacuoles (upper right panel) but again produced more chaotic alterations when modeling the sick class (lower right panel). We interpret these changes cautiously, as some aspects of these alterations may be due to regularization.  " style="zoom:50%;" />

<p>출처 : <a href="https://www.researchgate.net/figure/Class-Model-Visualization-We-estimated-class-models-from-either-the-healthy-top-row-or_fig3_312620507">DeadNet: Identifying Phototoxicity from Label-free Microscopy Images of Cells using Deep ConvNets</a></p>
<h4 id="lime-algorithm-for-global-explanations">LIME Algorithm for Global Explanations</h4>
<p>참고 : <a href="https://yjjo.tistory.com/3">https://yjjo.tistory.com/3</a></p>
<ul>
<li>서브모듈러 선택 알고리즘(SP-LIME으로 불린다) 을 사용해 전역 중요도를 생성합니다.</li>
<li>동작원리가 surrogate model과 비슷하다고 볼 수 있습니다.</li>
</ul>
<p><strong>방법</strong></p>
<blockquote>
<ol>
<li>블랙박스 모델 $f$와 데이터 $X$을 정의해 LIME을 수행한다</li>
<li>B는 우리가 선택한 데이터의 집합(Budget)이다.</li>
<li>$f$를 최대한 많이 설명하는 가장 적은 데이터 입력을 수행하는 경우를 $B$ 에서 찾는다.</li>
<li>이때 탐욕 알고리즘 (전체를 모두 수행하는 방법) 이 사용된다.</li>
</ol>
</blockquote>
<h4 id="concept-activation-vectors-cavs">Concept Activation Vectors (CAVs)</h4>
<ul>
<li>신경망의 내부 상태를 인간이 이해할 수 있는 영역으로 변환합니다.</li>
<li>해석가능한 글로벌 모델을 $g$라 할 때, $g : E_m \rightarrow E_h$ 로 표현가능하게 하는 방법입니다.</li>
<li>$E_m$은 블랙박스 모델 $f$ 의 벡터 표현, $E_h$는 인간이 이해할 수 있는 벡터 공간입니다.</li>
</ul>
<p><img src="https://communedeart.files.wordpress.com/2019/09/image-11.png?w=942" alt="img"></p>
<p>출처 : <a href="https://communedeart.wordpress.com/2019/09/16/tcav%EB%A5%BC-%EB%B0%9B%EC%95%84%EB%93%A4%EC%9D%B4%EA%B8%B0-%EC%9C%84%ED%95%9C-%EB%85%B8%EB%A0%A5/">https://communedeart.wordpress.com/2019/09/16/tcav%EB%A5%BC-%EB%B0%9B%EC%95%84%EB%93%A4%EC%9D%B4%EA%B8%B0-%EC%9C%84%ED%95%9C-%EB%85%B8%EB%A0%A5/</a></p>
<ul>
<li>얼룩말을 가지고 긍정적(positive) concept인 $P_c$ (줄무늬 등)과 부정적(Negative) concept인 $N$ 으로 분리했습니다.</li>
<li>특정 데이터 $x$ 가 $P_c$ 와 $N$ 을 구분할 수 있는 이진 분류 모델을 학습시킵니다.</li>
</ul>
<p><strong>Testing with CAVs</strong></p>
<ul>
<li><p>CAV의 방법 중 하나로 TCAV가 있습니다.</p>
</li>
<li><p>그래디언트 기반 방법처럼 방향도함수(directional derivatives)를 사용하는 방법입니다.</p>
</li>
<li><p>특정 입력에 대한 $f$의 예측값의 민감도를 평가합니다.</p>
</li>
<li><p>TCAV 점수는 입력값 변화에 따른 특정 레이어 출력($h(j,k)$)의 변화량으로 설정합니다.</p>
</li>
</ul>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_12.png?raw=true.png" alt="survey_12"></p>
<ul>
<li>TCAV는 입력 특징이 적절하게 선택되지 못하면 좋은 결과를 얻지 못한다는 단점이 있습니다.</li>
<li>서로 관련성이 높은 특징 또한 성능을 감소시킬 수 있습니다.</li>
</ul>
<p><strong>후속 연구</strong></p>
<p>CAV 방법은 이후에 다양한 발전이 있었습니다.</p>
<ul>
<li><a href="https://arxiv.org/abs/1902.03129">*<em>Automatic Concept-based Explanations (ACE) *</em></a>: 다중 해상도(multi-resolution) 세그먼테이션을 수행할 수 있게 한 연구입니다.</li>
</ul>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_13.png?raw=true.png" alt="survey_13"></p>
<p>출처 : <a href="https://arxiv.org/abs/1902.03129">Towards Automatic Concept-based Explanations</a></p>
<ul>
<li><a href="https://arxiv.org/abs/1907.07165"><strong>Casual Concept Effect(CaCE)</strong></a> : 딥러닝 모델에 대한 high-level concepts의 있고 없음에 따른 <strong>인과관계에 집중하는 방법</strong>이라고 합니다.</li>
<li><a href="https://arxiv.org/abs/1910.07969"><strong>ConceptSHAP</strong></a> : 각각 발견된 콘셉트의 중요성과 완전성(completeness) 점수를 계산합니다. 특정 지역에 대해 콘셉트를 유지하는 클러스터링을 수행하게 됩니다.</li>
</ul>
<h4 id="spectral-relevance-analysisspray">Spectral Relevance Analysis(SpRAy)</h4>
<ul>
<li><p>SpRAy는 LAP설명법을 기반으로 한 로컬 인스턴스의 최상단 부분을 설명하는 기법입니다.</p>
</li>
<li><p>LRP 모델에서 자주 나오는 특징을 파악하고 분석하게 합니다.</p>
</li>
<li><p>자세한 설명은 알고리즘을 참고해서 보면 이해하는 데 도움이 될 것 같습니다.</p>
<img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_14.png?raw=true" alt="survey_14" style="zoom:67%;" />
</li>
<li><p>LRP를 통과한 결과값에 대해 Specral Cluster Analysis(SC) 와 EigenMapAnalysis를 수행하게 됩니다.</p>
</li>
<li><p>이렇게 나온 결과물로 importrance cluster가 반환되는데, 이걸 t-SNE 등으로 시각화할 수 있습니다.</p>
</li>
</ul>
<p><img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_15.png?raw=true" alt="survey_15"></p>
<h4 id="global-attribution-mapping">Global Attribution Mapping</h4>
<ul>
<li><p>GAM은 각각의 피처들의 conjoined rankings를 랭크 벡터 $\sigma$ 로 나타냅니다.</p>
</li>
<li><p>로컬 분석을 먼저 한 뒤에, pair-wise rank distance matrix/cluster을 찾는 방향으로 진행됩니다.</p>
<img src="https://github.com/YMGYM/ML_paper_study/blob/main/XAI/Images/survey_16.png?raw=true.png" alt="survey_16" style="zoom: 50%;" />

</li>
</ul>
<p>출처 : <a href="https://arxiv.org/abs/1902.02384">Global Explanations of Neural Networks: Mapping the Landscape of Predictions</a></p>
<h4 id="neural-additive-model-nams">Neural Additive Model (NAMs)</h4>
<img src="https://paperswithcode.com/media/methods/nam_xnCYK9q.jpeg" alt="img" style="zoom: 25%;" />

<ul>
<li><p>한 피처에 주목하는 하나의 인공 신경망을 각각 만들어서 합치는 방법으로 모델을 설명합니다.</p>
</li>
<li><p>generalized additive models (GAM)을 구성하여 분석합니다.</p>
<p>$g(E[y]) = \beta + f_1(x_1) + f_2(x_2) + ... + f_K(x_K)$</p>
</li>
<li><p>논문의 저자는 ReLU를 개선한 exp-centered (ExU) $ h(x) = f(e^w * (x-b))$ 을 도입했고, 가중치 초기화로 $N(x, 0.5)$ with $x \in (3, 4)$ 를 사용했다고 합니다.</p>
</li>
<li><p>음수 값은 클래스 예측 확률을 낮추고, 양수 값은 클래스 예측 확률을 증가시킨다고 볼 수 있습니다.</p>
</li>
<li><p>NAM을 사용하면 출력값과 상관 없이 각각의 피처에 대한 정확한 설명이 가능하다는 장점이 있습니다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2주차] SHAP (SHapley Additive exPlanation) ]]></title>
            <link>https://velog.io/@tobigs_xai/2%EC%A3%BC%EC%B0%A8-SHAP-SHapley-Additive-exPlanation</link>
            <guid>https://velog.io/@tobigs_xai/2%EC%A3%BC%EC%B0%A8-SHAP-SHapley-Additive-exPlanation</guid>
            <pubDate>Wed, 28 Apr 2021 08:57:35 GMT</pubDate>
            <description><![CDATA[<p>작성자 : 투빅스 13기 <a href="https://github.com/jbeen2">이재빈</a> </p>
<blockquote>
<h2 id="contents">Contents</h2>
<ol start="0">
<li>Intro</li>
</ol>
</blockquote>
<ol>
<li>Shapley Value </li>
<li>Additive Feature Attribution Method </li>
<li>SHAP </li>
<li>Code </li>
</ol>
<hr>
<p><strong>Summary</strong> : <code>SHAP</code> 을 통해 <code>Feature Attribution</code> 을 파악할 수 있습니다. </p>
<h1 id="0-intro">0. Intro</h1>
<p><img src="https://images.velog.io/images/jbeen2/post/b7362b3e-e585-4544-93fc-d0738d4fda06/image.png" alt=""></p>
<p>좋은 집을 찾고 있는 두빅스씨 ... 
어떤 집 하나가 유난히 가격이 낮은데, 그 집이 숲 속에 있기 때문인지, 평수가 작기 때문인지, 혹은 평수가 작아 고양이를 기를 수 없어서 그렇기 때문인지 정확한 이유를 알 수 없습니다. </p>
<p>결과만 보고 해석하지 않고, 각 요소들이 결과값에 얼마나 영향을 미치는 지에 대해 파악하고자 합니다. </p>
<h2 id="limitations">Limitations</h2>
<p>기존의 Feature Attribution 파악 방법론에는 한계가 존재합니다. </p>
<h3 id="1-feature-importance">1. Feature Importance</h3>
<ul>
<li><strong>Random Permutation</strong> 에 대해 Importance 를 측정하기 때문에, <strong>Inconsistent</strong> 합니다. </li>
<li><strong>Feature 간의 의존성</strong> 을 간과합니다. 
  설명변수 간 다중공선성이 존재하는 경우, 결과가 왜곡될 수 있습니다.</li>
<li><strong>음의 영향력 (-)</strong> 을 계산하지 않습니다. 
모델이 negative feature 에 대한 학습을 의도적으로 무시하기 때문에, 에러가 높아지는 변인은 결과에 포함하지 않습니다. </li>
</ul>
<h3 id="2-pdp-plot">2. PDP Plot</h3>
<ul>
<li><strong>최대 3차원</strong> 까지만 표현 가능합니다. 
비교하고자 하는 Feature 가 많아지면 시각화 할 수 없고, Feature 영향력이 과대 평가될 위험이 있습니다. </li>
</ul>
<h3 id="3-lime">3. LIME</h3>
<blockquote>
<h4 id="global-vs-local-대리-분석">Global vs Local 대리 분석</h4>
</blockquote>
<ol>
<li>Global Surrogate Analysis 
학습 데이터(일부 또는 <strong>전체</strong>)를 사용해 대리 분석 모델을 구축하는 것 </li>
<li>Local Surrogate Analysis 
학습 데이터 <strong>하나</strong>를 해석하는 과정 </li>
</ol>
<ul>
<li><strong>Local</strong> Interpretable Model-agnostic Explanation 
single prediction explanation 에 적합합니다. </li>
<li><strong>Visualization</strong> 을 통한 결과 해석이 어렵습니다. 
<img src="https://images.velog.io/images/jbeen2/post/11fc48ae-5abe-4e5b-8f75-1c1423192920/image.png" alt=""></li>
</ul>
<br> 

<h1 id="1-shapley-value">1. Shapley Value</h1>
<p><code>Shapley Value</code> 는 <strong>게임이론</strong>을 바탕으로, Game 에서 <strong>각 Player 의 기여분</strong>을 계산하는 방법입니다. </p>
<blockquote>
<p>✔︎ <a href="https://ko.wikipedia.org/wiki/%EA%B2%8C%EC%9E%84_%EC%9D%B4%EB%A1%A0"><strong>Game Theory</strong></a> 
개인 또는 기업이 어떠한 행위를 했을 때, 그 결과가 게임에서와 같이 자신뿐만 아니라 다른 참가자의 행동에 의해서도 결정되는 상황에서, 자신의 최대 이익에 부합하는 행동을 추구한다는 수학적 이론 </p>
</blockquote>
<p>✔︎ <strong>협력적 게임 이론</strong> (Cooperative Game Theory) 
비협력적으로 게임을 했을 때 각 개인이 취하는 이득보다, 협력적으로 게임을 했을 때의 각 개인이 취하는 이득이 더 크다면, 긍정적인 협동이 가장 최선의 선택지</p>
<blockquote>
</blockquote>
<p>대표적인 예시 : <a href="https://ko.wikipedia.org/wiki/%EC%A3%84%EC%88%98%EC%9D%98_%EB%94%9C%EB%A0%88%EB%A7%88">죄수의 딜레마</a> </p>
<blockquote>
</blockquote>
<p><img src="https://images.velog.io/images/jbeen2/post/dc273edd-d344-43ff-bcd3-e7f1b9dc7acb/image.png" alt=""></p>
<p><strong>하나의 특성</strong>에 대한 <strong>중요도</strong>를 알기 위해 → 여러 특성들의 <strong>조합</strong>을 구성하고 → 해당 특성의 <strong>유무</strong>에 따른 <strong>평균적인 변화</strong>를 통해 값을 계산합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/65a87a8a-f225-400c-9f0b-40f34ef68eea/image.png" alt=""> </p>
<ul>
<li>$\phi_i$ : $i$ 데이터에 대한 Shapley Value </li>
<li>$F$ : 전체 집합 </li>
<li>$S$ : 전체 집합에서, $i$ 번째 데이터가 빠진 나머지의, 모든 부분 집합 </li>
<li>$f_{S \cup i}(x_{S \cup i})$ : $i$ 번째 데이터를 포함한 (=전체) 기여도 </li>
<li>$f_S(x_S)$ : $i$ 번째 데이터가 빠진, 나머지 부분 집합의 기여도 </li>
</ul>
<hr>
<h2 id="example">Example</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/d435712f-b4ca-4d8d-bd06-dbae7e299680/image.png" alt=""></p>
<p>집값을 결정짓는 요인으로, [숲세권, 면적, 층, 고양이 양육 가능 여부] 등의 Feature 가 존재합니다. 
&#39;고양이 양육 가능 여부&#39; 의 집값에 대한 기여분은, 그 외 모든 Feature 가 동일하다는 가정 하에, 
310,000 (고양이 함께 살기 불가능) - 320,000 (고양이 함께 사는 것 가능) = -10,000 으로 계산됩니다. 
이러한 과정을 <strong>모든 가능한 조합에 대해 반복</strong>합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/375e57c0-f237-4d71-a33f-5852c3407fdd/image.png" alt=""></p>
<p>[숲세권, 면적, 층, 고양이 양육 가능 여부] : 4개 
$2^{(4-1)}$ = 8 개의 조합이 존재하며, 8개의 조합에 각각에 대해 
{f(조합1 $\cup$ 😺) - f(조합1)} + ... +  {f(조합8 $\cup$ 😺) - f(조합8)} 값을 산출하고, 이를 가중평균 하여 $\phi$(😺) 를 구합니다. </p>
<h2 id="classic-shapley-value-estimation">Classic Shapley Value Estimation</h2>
<ol>
<li>consistency : 매 회 계산할 때 마다 같은 결과를 출력합니다. </li>
<li>multicollinearity : 서로 영향을 미칠 가능성을 고려합니다. </li>
<li>Feature Importance 가 고려하지 못하는, 음의 영향력을 고려할 수 있습니다. </li>
</ol>
<br> 

<h1 id="2-additive-feature-attribution-method">2. Additive Feature Attribution Method</h1>
<h2 id="definition">Definition</h2>
<p><code>Additive Feature Attribution Methods</code> have <strong>an explanation model</strong> that is a linear function of <strong>binary variables</strong> : </p>
<p><img src="https://images.velog.io/images/jbeen2/post/03aa8ac9-6859-4394-b141-43279eeb8c18/image.png" alt=""></p>
<ul>
<li>$g$ : explanation model , $g(z&#39;) \approx f(h_x(z&#39;))$</li>
<li>$f$ : original prediction model </li>
<li>$z&#39;$ : simplified input , $z&#39; \approx x&#39;$ </li>
<li>$h_x$ : mapping function , $x = h_x(x&#39;)$ </li>
<li>$\phi_i$ : attribution value </li>
</ul>
<p>ex. LIME, DeepLIFT, Layer-Wise Relevance Propagation, Shapley Value </p>
<hr>
<p><img src="https://images.velog.io/images/jbeen2/post/40be461b-d423-4e05-aeb4-d2424cfc1606/image.png" alt=""></p>
<p>복잡한 모델 $f(x)$ 대신, 해석이 간단한 모델 $g(x&#39;)$ 로 해석하고자 합니다.
$x$ 는 복잡한 모델에 특화되어 있는, 복잡한 데이터입니다. 
따라서 $x$ 의 해석 용이성을 위해 간단화 된 변수 $x&#39;$ 를 사용하고자 하며, 
Simplified input $x&#39;$ 는 $x = h_x(x&#39;)$ 라는 mapping function 으로 정의됩니다. 
$z&#39; \approx x&#39;$ 라는 가정을 통해, $z&#39; \in {0,1}^M$ 으로 표현되며, 
(1 : input is included in the model / 0 : excluded)
$g(z&#39;) \approx f(h_x(z&#39;))$ 가 되도록 Surrogate Model 은 학습됩니다. </p>
<p>✔︎ <strong>Additive Feature Attrbution</strong> 
원래의 input $x$ 가 아닌, Simplified input $z&#39;$ 를 통해, 
$g(z&#39;) \approx f(h_x(z&#39;))$ 를 만족하는 <strong>Explanation Model</strong> $g$ 를 만드는 방법입니다. </p>
<h2 id="properties">Properties</h2>
<p>✔︎ <strong>Desirable Properties</strong>
Feature Attribution 은 <strong>1. <code>Local Accuracy</code></strong>, <strong>2. <code>Missingness</code></strong>, <strong>3. <code>Consistency</code></strong> 특성 모두를 만족하기를 원합니다. </p>
<h3 id="1-local-accuracy">1. Local Accuracy</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/1704581f-db1e-4627-b37e-33cb0974ba10/image.png" alt=""></p>
<p>simplified input $x&#39;$ 를 explanation model 에 넣었을 때의 output $g(x&#39;)$ 는, original input $x$ 에 대한 $f(x)$ 와 match 가 잘 되어야 합니다. </p>
<p>✓ (Efficiency) 각 팀원 점수를 합치면, 전체 점수가 되어야 합니다.</p>
<h3 id="2-missingness">2. Missingness</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/b901c1a6-ef2e-4b95-b41f-e9e0425dec3c/image.png" alt=""></p>
<p>Feature 값이 없다면, Attribution 값도 0이 되어야 합니다. </p>
<p>✓ 팀플에 참여하지 않았다면, 개인 점수는 0점이 되어야 합니다. </p>
<h3 id="3-consistency">3. Consistency</h3>
<p><img src="https://images.velog.io/images/jbeen2/post/f94afbe1-0f25-4833-a392-5fbf1ab3c558/image.png" alt=""></p>
<p>모델이 변경되어 Feature 의 Marginal Contribution 이 (다른 특성에 관계없이) 증가하거나 동일하게 된다면, Attribution 도 증가하거나 동일하게 유지되어야 하며, 감소할 수 없습니다. </p>
<p>✓ 매번 똑같은 방식으로 play 했다면, 결과 점수가 똑같아야 합니다. </p>
<h2 id="theorem">Theorem</h2>
<p><img src="https://images.velog.io/images/jbeen2/post/cefc3603-823e-4009-85fc-085af638c2bb/image.png" alt=""> </p>
<p><code>Additive Feature Attribution</code> 의 정의와 3가지 <code>Desired Properties</code> 를 만족하는 유일한 방법은, Theorem1 수식입니다. </p>
<p>$\therefore$ <strong><code>SHAP</code></strong> = Shapley Value 를 사용하여, Additive Method 를 만족시키는 Explanation Model   </p>
<br> 

<h1 id="3-shap">3. SHAP</h1>
<p><code>SHAP</code> : Shapley Value 의 <strong>Conditional Expectation</strong><br>Simplified Input을 정의하기 위해 정확한 $f$ 값이 아닌, $f$ 의 Conditional Expectation을 계산합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/7f972c8e-1a8e-4982-a79d-033e7a18167e/image.png" alt=""></p>
<p>$f_x(z&#39;) = f(h_x(z&#39;)) = E[f(z) | z_S]$ </p>
<p>오른쪽 화살표 ($\phi_{0,1,2,3}$) 는 원점으로부터 $f(x)$ 가 <strong>높은 예측 결과</strong>를 낼 수 있게 도움을 주는 요소이고, 왼쪽 화살표 ($\phi_4$) 는 $f(x)$ 예측에 <strong>방해</strong>가 되는 요소입니다. </p>
<ol>
<li>SHAP은 Shapley Value (Local Explanation) 기반으로 하여, 데이터 셋의 <strong>전체적인 영역</strong>을 해석이 가능합니다. (Global Surrogate) </li>
<li>모델 $f$ 의 <strong>특징</strong>에 따라, 계산법을 달리하여 빠르게 처리합니다. <ul>
<li>Kernel SHAP : Linear LIME + Shapley Value</li>
<li>Tree SHAP : Tree based Model </li>
<li>Deep SHAP : DeepLearning based Model </li>
</ul>
</li>
</ol>
<h2 id="kernel-shap">Kernel SHAP</h2>
<p>instance $x_i$ 에 대한 explanation 을 구합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/fc44963b-7dba-4ccc-be25-1f17c75347b6/image.png" alt=""></p>
<ol>
<li>$x_i$ Feature value 에서, 조합을 생성합니다. 
단, $x_i$ 를 그대로 사용하지 않고, $z_i = {0,1}^M$ 로 사용하는, Random Feature Coalition 을 생성합니다. </li>
<li>${z_i}&#39; = 1$ 인 경우 actual feature value 에 mapping 되고, 
${z_i}&#39; = 0$ 인 경우 random sample value 로 mapping 됩니다. 
<img src="https://images.velog.io/images/jbeen2/post/932d1b25-8ca1-4d6c-958e-843c71444ae7/image.png" alt=""></li>
<li>${z_i}&#39;$ 를 본래의 feature space 로 mapping 시킨 다음, 모델 $f(h_x(z_i&#39;))$ 에 적용함으로써, 예측값을 얻습니다. 
즉, Local Surrogate Model 에 대한 설명변수는 0과 1로 이루어진 값이 되며, 반응변수는 이에 대한 예측값이 됩니다. </li>
<li>각 Feature 조합마다 SHAP Kernel $\pi_x(z&#39;)$ 을 적용하여, Weight 를 계산해 Linear Model $g(z&#39;) = \phi_0 + \sum_{i=1}^{M} \phi_i {z_i}&#39;$ 를 적합시킵니다. </li>
<li>Linear Model 로 부터 계수값인 $\phi_i$ = Shapley Value 를 반환합니다.  </li>
</ol>
<h2 id="tree-shap">Tree SHAP</h2>
<p>Tree Ensemble Model 의 Feature Importance 는 모델(or 트리)마다 산출값이 달라지기 때문에, <code>Inconsistent</code> 하다는 한계점이 존재합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/8c5e1528-ae58-4634-ae87-acc890b05790/image.png" alt=""></p>
<p>Tree Model A 와 B 의 Feature 는 <code>Fever</code>, <code>Cough</code> 로 동일하지만, split 순서가 다릅니다. Split 순서에 기반하여 계산되는 Gain, Split Count 등의 산출값이 달라지는 것을 확인할 수 있습니다. 
즉, 같은 데이터로부터 학습이 된 모델이지만, 모델마다 Feature Importance 가 달라지게 됩니다. </p>
<p><strong>SHAP</strong> 은 Split 순서와 무관하게, <strong>Consistent</strong> 한 Feature Importance 를 계산할 수 있습니다.</p>
<p>$E[f(x) | x_S]$ = $x_S$ 가 속하는 Leaf node의 score 값 $\times$ 해당 node에 속하는 Training 데이터의 비중<br>각 Tree 마다 Conditional Expectation $E[f(x) | x_S]$ 를 구해, 다 더하여 최종 값을 산출합니다. </p>
<p>시간복잡도 : $O(TLD^2)$
T : 트리의 개수, L : 모든 트리의 최대 leaf 수, D : 모든 트리의 최대 깊이 
Kernel SHAP 에 비해 속도가 빠릅니다. </p>
<br> 

<h1 id="4-code">4. Code</h1>
<h3 id="1-tree-shap">1. Tree SHAP</h3>
<pre><code class="language-python"># import packages 
import pandas as pd 
import numpy as np 

from xgboost import XGBRegressor, plot_importance 
from sklearn.model_selection import train_test_split

import shap 

# load data 
X, y = shap.datasets.boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=1)

# modeling 
model = XGBRegressor()
model.fit(X_train, y_train)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/901287e1-004a-4166-b8be-72484331aae8/image.png" alt=""></p>
<p>보스턴 주택 가격 데이터를 통해, 집값을 결정짓는 요인에 대해 알아봅니다. 
<code>XGBoost Regressor</code> 로 집값을 예측하는 모델을 만들고, <code>SHAP value</code> 를 통해 Feature Attribution 을 파악합니다. </p>
<h3 id="0-load-shap">0. Load SHAP</h3>
<pre><code class="language-python"># load js 
shap.initjs()

&#39;&#39;&#39;
KernelExplainer() : KNN, SVM, RandomForest, GBM, H2O 
TreeExplainer() : tree-based machine learning model (faster) 
DeepExplainer() : deep learning model 
&#39;&#39;&#39;

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_train)</code></pre>
<h3 id="1-force_plot">1. force_plot</h3>
<p>특정 데이터 하나 &amp; 전체 데이터에 대해, Shapley Value 를 1차원 평면에 정렬해서 보여줍니다.  </p>
<pre><code class="language-python"># 첫 번째 데이터에 대한 SHAP 시각화
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0,:], X_train.iloc[0,:])</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/4d909ce2-2c32-4656-88f1-b3a725b45be6/image.png" alt=""></p>
<p>특정 데이터 (궁금한 어떤 주택)에 대한 Shapley value 를 분해하고 시각화합니다. 
집값 상승에 긍정적인 영향을 준 요인은 LSTAT (동네의 하위 계층 비율) 이며, 부정적인 영향을 준 요인은 RM (방의 수) 입니다. 
비슷한 조건의 다른 주택에 비해 방의 수 요인이 집값 형성에 부정적인 영향을 미쳤다고 해석할 수 있습니다. </p>
<pre><code class="language-python"># Outlier 에 대한 SHAP 시각화 
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[259,:], X_train.iloc[259,:])</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/7b33ad0f-5037-478a-b44b-4f71e2ed56aa/image.png" alt=""></p>
<p>주요 업무지까지 거리가 가깝고 (DIS), 주변 지역에 하위 계층 사람들이 적게 살면서 (LSTAT), 범죄율이 극도로 낮으므로 (CRIM), 주택 자체의 상태보다 주변 환경에 의해 좋은 집값이 형성되었음을 알 수 있습니다. </p>
<pre><code class="language-python"># 전체 데이터에 대한 SHAP 시각화 
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values, X_train)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/21d5414d-5d5d-4f02-9cd6-f574ab73dd84/image.png" alt=""></p>
<p>전체 데이터에 대해 Shapley Value를 누적하여 시각화 할 수 있으며, 이를 기반으로 <code>Supervised Clustering</code> 또한 진행할 수 있다고 합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/8f08ccb4-f9e1-4fcf-ad44-54a85e1e9774/image.png" alt=""></p>
<p>Feature 하나에 대한 전체 누적 Shapley Value 를 구할 수 있습니다. </p>
<h3 id="2-dependence_plot">2. dependence_plot</h3>
<p>Feature 하나에 대한 SHAP 영향력을 보여줍니다. </p>
<pre><code class="language-python">shap.initjs()
top_inds = np.argsort(-np.sum(np.abs(shap_values), 0))  # (13, ) : 각각의 Feature 에 대해 shap value 다 더한 것 

# make SHAP plots of the three most important features
for i in range(2):
    shap.dependence_plot(top_inds[i], shap_values, X_train)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/f8026be4-cc41-4d35-b18c-289e18f91735/image.png" alt=""></p>
<p>위의 코드는 영향력이 큰 변수들 순서대로 출력하는 방법이며, <code>top_inds[i]</code> 에 특정 Feature 를 넣어 영향력을 파악할 수 있습니다.  </p>
<h3 id="3-summary_plot">3. summary_plot</h3>
<pre><code class="language-python">shap.summary_plot(shap_values, X_train)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/0a269d1d-955c-49eb-899a-954228a33f9a/image.png" alt=""></p>
<p>전체 Feature 들이 Shapley Value 분포에 어떤 영향을 미치는지 시각화 할 수 있습니다. </p>
<pre><code class="language-python">shap.summary_plot(shap_values, X_train, plot_type=&#39;bar&#39;)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/b82742d1-6320-4891-a317-5de97cd71864/image.png" alt=""></p>
<p>각 Feature 가 모델에 미치는 절대 영향도를 파악할 수 있습니다. </p>
<h3 id="4-interaction-plot">4. interaction plot</h3>
<pre><code class="language-python">shap_interaction_values = shap.TreeExplainer(model).shap_interaction_values(X_train)

# main effect on the diagonal 
# interact effect off the diagonal 
shap.summary_plot(shap_interaction_values, X_train)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/91a0c455-a9e6-4596-a3d6-bf84b1c51de8/image.png" alt=""></p>
<p>Feature 사이의 interaction 또한 파악할 수 있습니다. </p>
<pre><code class="language-python">shap.dependence_plot(
    (&quot;RM&quot;, &quot;LSTAT&quot;),
    shap_interaction_values, X_train,
    display_features=X_train
)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/67e8cfec-5f10-47df-a26e-702edf1e5ecd/image.png" alt=""></p>
<p><code>dependency_plot</code> 을 통해 두 개 변수 사이의 영향력 시각화 가능합니다. </p>
<p><img src="https://images.velog.io/images/jbeen2/post/e30ff7be-e29f-4599-bce4-5ccf910ebfb8/image.png" alt=""></p>
<p>영향력 분해 또한 가능하다고 합니다. 
(출처 : <a href="https://arxiv.org/pdf/1905.04610.pdf">Explainable AI for Trees: From Local Explanations to Global Understanding</a>)</p>
<h2 id="2-deep-shap">2. Deep SHAP</h2>
<h3 id="1-nlp">1. NLP</h3>
<pre><code class="language-python">import transformers
transformer = transformers.pipeline(&#39;sentiment-analysis&#39;, return_all_scores=True)

explainer2 = shap.Explainer(transformer) 
shap_values2 = explainer2([&quot;What a great movie! ...if you have no taste.&quot;])

shap.plots.text(shap_values2[0, :, &quot;POSITIVE&quot;]) </code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/85d8e2d1-a4de-43e2-975d-226b2516f8f0/image.png" alt=""></p>
<h3 id="2-deepshap">2. DeepSHAP</h3>
<pre><code class="language-python">import tensorflow as tf

# 1. dataset 불러오기  
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0  # image scaling : (0,1) 범위로 바꿔주기 

# 2. model 구성하기 
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation=&#39;relu&#39;),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=&#39;softmax&#39;)
])

# 3. model 학습과정 설정하기 
model.compile(optimizer=&#39;adam&#39;,
              loss=&#39;sparse_categorical_crossentropy&#39;,
              metrics=[&#39;accuracy&#39;])

# 4. model 학습
model.fit(x_train, y_train, epochs=3)</code></pre>
<pre><code class="language-python"># select a set of background examples to take an expectation over
background = x_train[np.random.choice(x_train.shape[0], 100, replace=False)]

# explain predictions of the model on four images
e = shap.DeepExplainer(model, background)
# ...or pass tensors directly
# e = shap.DeepExplainer((model.layers[0].input, model.layers[-1].output), background)
shap_values = e.shap_values(x_test[:5])

# plot the feature attributions
shap.image_plot(shap_values, -x_test[:5])</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/4dc2a6c7-217d-4a3a-93d3-0c87b5f6f20d/image.png" alt=""> </p>
<p>mnist classification 에 대한 SHAP 시각화 결과입니다. 
<code>4</code> 와 <code>9</code> 를 예측함에 있어서 - 부분이 핵심적인 역할을 한다고 해석할 수 있습니다. </p>
<h3 id="3-gradientexplainer">3. GradientExplainer</h3>
<pre><code class="language-python">from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import tensorflow.python.keras.backend as K
import json

# load pre-trained model and choose two images to explain
model = VGG16(weights=&#39;imagenet&#39;, include_top=True)
X,y = shap.datasets.imagenet50()
to_explain = X[[39,41]]

# load the ImageNet class names
url = &quot;https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json&quot;
fname = shap.datasets.cache(url)
with open(fname) as f:
    class_names = json.load(f)

# explain how the input to the 7th layer of the model explains the top two classes
def map2layer(x, layer):
    feed_dict = dict(zip([model.layers[0].input], [preprocess_input(x.copy())]))
    return K.get_session().run(model.layers[layer].input, feed_dict)
e = shap.GradientExplainer(
    (model.layers[7].input, model.layers[-1].output),
    map2layer(X, 7),
    local_smoothing=0 # std dev of smoothing noise
)
shap_values,indexes = e.shap_values(map2layer(to_explain, 7), ranked_outputs=2)

# get the names for the classes
index_names = np.vectorize(lambda x: class_names[str(x)][1])(indexes)

# plot the explanations
shap.image_plot(shap_values, to_explain, index_names)</code></pre>
<p><img src="https://images.velog.io/images/jbeen2/post/ad37f635-0452-489b-80da-9eaee3b5cd42/image.png" alt=""></p>
<p>각 Class 를 예측함에 있어서, 어떤 부분이 중요한 역할을 했는지 볼 수 있습니다.  </p>
<br>

<h1 id="reference">Reference</h1>
<ol>
<li>XAI, 설명 가능한 인공지능, 인공지능을 해부하다 (안재현. 2020)</li>
<li>고려대학교 DMQA Seminar : <a href="http://dmqm.korea.ac.kr/activity/seminar/297">An Overview of Model-Agnostic Interpretation Methods</a> </li>
<li>Interpretable Machine Learning : A Guide for Making Black Box Models Explainable (Christoph Molnar. 2021) <ul>
<li>5.9 <a href="https://christophm.github.io/interpretable-ml-book/shapley.html">Shapley Values</a></li>
<li>5.10 <a href="https://christophm.github.io/interpretable-ml-book/shap.html">SHAP (SHapley Additive exPlanations)</a></li>
</ul>
</li>
</ol>
<hr>
<h3 id="code--papers">Code &amp; Papers</h3>
<ol>
<li><code>SHAP</code> : <a href="https://github.com/slundberg/shap">https://github.com/slundberg/shap</a> </li>
<li>SHAP documentation : <a href="https://shap.readthedocs.io/en/latest/index.html">https://shap.readthedocs.io/en/latest/index.html</a></li>
<li>Scott Lundberg et al. (2017). <a href="https://papers.nips.cc/paper/2017/file/8a20a8621978632d76c43dfd28b67767-Paper.pdf">A Unified Approach to Interpreting Model Predictions</a></li>
<li>Scott Lundberg et al. (2018). <a href="https://arxiv.org/pdf/1802.03888.pdf">Consistent Individualized Feature Attribution for Tree Ensembles</a></li>
</ol>
<hr>
<ol>
<li>허재혁님 Review : SHAP에 대한 모든 것 <ul>
<li><a href="https://datanetworkanalysis.github.io/2019/12/23/shap1">part 1 : Shapley Values 알아보기</a></li>
<li><a href="https://datanetworkanalysis.github.io/2019/12/24/shap2">part 2 : SHAP 소개</a></li>
<li><a href="https://datanetworkanalysis.github.io/2019/12/24/shap3">part 3 : SHAP을 통한 시각화해석</a> </li>
</ul>
</li>
<li>daehani님 Review : <a href="https://daehani.tistory.com/entry/Shapley-value-SHAP-Tree-SHAP">Shapley value, SHAP, Tree SHAP</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2주차] CNN 필터 시각화 (CNN Filter Visualization]]></title>
            <link>https://velog.io/@tobigs_xai/2-CNN-Filter-Visualization</link>
            <guid>https://velog.io/@tobigs_xai/2-CNN-Filter-Visualization</guid>
            <pubDate>Mon, 26 Apr 2021 17:21:47 GMT</pubDate>
            <description><![CDATA[<p>본 게시글은 CNN 모델에 적용할 수 있는 XAI 기법 중 하나인 시각화 기법들에 대해 알아보고자 한다. 이제까지 딥러닝은 &quot;왜 이렇게 학습됐는지 모르겠지만 그냥 잘 된다.&quot;라며 블랙박스 모델로 여겨져 왔다. 딥러닝 모델을 이해하기 위해 CNN의 필터들이 어떻게 생겼는지, 인풋 이미지에서 모델의 성능에 미치는 부분, 특정 클래스의 activation을 최대화하는 이미지 생성에 대해 알아보고자 한다.</p>
<hr>
<h2 id="0-vision">0. Vision</h2>
<p>먼저, 진화의 중요한 키포인트인 시각에 대해 짚고 넘어갈 것이다. 사람의 두뇌 겉부분을 가리키는 대뇌피질은 모든 인지와 판단을 담당하는 것으로 알려져 있다.그리고 대뇌피질의 30%가 넘는 부분이 모두 시각을 처리한다는 점이 주목할 점이다. 촉각을 담당하는 부분이 8%가량, 청각을 담당하는 부분이 2%라는 점과 비교하면 괄목할 만한 수치이다. 진화가 폭발적으로 시작된 것이 빛에 반응하는 시신경 세포의 등장이라는 점을 고려하면 어느정도 이해가 되기도 한다. 시각은 생물의 진화에 큰 역할을 하였다. 포식자들이 피식자를 찾을 때 주로 시각에 의존한다. 이는 피식자도 마찬가지이다. 즉, 물체를 인식하는 것은 생존에 직결되는 문제이다.</p>
<h3 id="0-1-topographical-mapping--hierarchical-organization">0-1. Topographical Mapping &amp; Hierarchical Organization</h3>
<p>Hubel과 Wiesel이라는 과학자는 시각과 두뇌의 관계를 알기 위해 고양이의 뇌에 전극을 꼽은 후 다양한 자극을 주어 실험을 진행하였다. 
<img src="https://images.velog.io/images/tobigs_xai/post/6fdd6f6e-0459-440a-a780-dd3671b9f806/Screen%20Shot%202021-04-26%20at%208.56.18%20PM.png" alt=""></p>
<p>그 결과, 두뇌 피질에서 가까운 영역은 가까운 물체를 인식한다는 것이었다. 이를 Topographical Mapping이라 한다. 예를 들어 눈과 코가 가까이 있다면, 눈을 인식하는 뉴런과 코를 인식하는 뉴런이 대뇌피질 위에 공간적으로 비슷한 위치에 존재한다는 것이다. 
더 나아가 Hubel과 Wisel은 시각에서의 Abstraction 기능을 밝혀냈다. 예를 들어, 어떤 물체가 얼굴임을 인식하기 위해서는 얼굴의 구성요소인 눈, 코, 입 등을 인식하는 뉴런이 있고, 인식한 눈코입이 정해진 위치에 있는 인식하는 뉴런이 있다는 것이다.
<img src="https://images.velog.io/images/tobigs_xai/post/7a5bb626-cc56-47d1-b330-166a2c74b7b6/image.png" alt=""></p>
<blockquote>
<ol>
<li>대뇌피질에서 가까운 세포들은 가까운 물체를 처리한다. 즉, Spatial Information을 유지한다.</li>
<li>Feature들을 Abstract하여 계층적으로 처리한다.</li>
</ol>
</blockquote>
<p>이러한 특징을 반영한 것이 CNN이다.</p>
<h3 id="0-2-neuricognitron">0-2. Neuricognitron</h3>
<p>CNN의 기원은 1980년에 일본의 딥러닝 연구자인 Fukushima가 제안한 Neurocognitron이다. 앞서 설명한 두가지 특징을 바탕으로 시신경의 구조를 모방한 계층적 구조를 가지는 모델을 제안하였다. 
<img src="https://images.velog.io/images/tobigs_xai/post/6ff233dd-4ada-4ed0-ab3b-623fc427d1d8/Screen%20Shot%202021-04-26%20at%209.18.48%20PM.png" alt=""></p>
<hr>
<h2 id="1-filter">1. Filter</h2>
<p>간단히 CNN에 대해 알아보았으니 이제 CNN에서 필터의 역할을 알아보고자 한다.</p>
<h3 id="1-1-edge-detection">1-1. Edge Detection</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/4e0c4261-4f10-4798-86ee-8de9d8abc147/image.png" alt="">
합성곱 필터는 위와 같이 주파수 필터의 역할을 한다. 다섯번째 그림은 low-pass filter로 저주파만 통과하기 때문에 블러리한 이미지를 결과로 얻는다. 세번째 그림인 Laplace Filter는 Edge를 Detect하는 역할을 한다. 네번째 그림인 high-pass filter는 이미지가 선명해지는 결과를 얻을 수 있다. <strong>즉, 학습된 CNN 필터들은 이런 식으로 경계선을 찾거나 블러리한 면을 찾는 등 다양한 주파수 필터의 기능을 한다.</strong></p>
<h3 id="1-2-gabor-like-learned-filters">1-2. Gabor-like Learned Filters</h3>
<p>전통적으로 영상처리에 사용되는 기법으로 Gabor Filter가 있다. 수학자 Dennis Gabor가 만든 것으로 Edge를 검출하는 필터로 사용되어 왔다. 
<img src="https://images.velog.io/images/tobigs_xai/post/ac1b766c-fac4-4d00-85e5-d667bf4dd532/Screen%20Shot%202021-04-26%20at%209.57.32%20PM.png" alt="">
총 8개의 파라미터가 존재하며 이를 변화시키면 아래와 같은 Gabor Filter들을 얻을 수 있다.
<img src="https://images.velog.io/images/tobigs_xai/post/9da65d44-cb30-4382-8fa9-d63da131d773/Screen%20Shot%202021-04-26%20at%209.58.48%20PM.png" alt="">
아래 사진은 학습된 CNN의 필터들이다. 놀랍게도 이전의 Gabor Filter와 매우 유사한 모습들을 확인할 수 있다.
<img src="https://images.velog.io/images/tobigs_xai/post/fdeba6dd-3832-4b6c-bf0d-a581190adb21/Screen%20Shot%202021-04-26%20at%209.59.42%20PM.png" alt=""></p>
<p>CNN은 Gabor Filter와 무관하게 학습되었음에도 불구하고 그 결과는 매우 유사하다. 아래와 같은 필터는 45도 기울어진 모양의 high-pas filter로 45도 방향의 경계선이 있는지 체크하는 역할을 한다. <strong>Gabor Filter와 CNN Filter는 무관한 개념임에도 불구하고 경계선을 검출하겠다는 목적이 일치하기 때문에 유사한 필터를 가지게 된다고 해석할 수 있다.</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/65caa244-0376-4ff7-8816-680a5ea6c6b7/Picture2.png" alt=""></p>
<h3 id="1-3-activation">1-3. Activation</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/df2bc75e-f177-47c2-97f7-00f9f3283227/image.png" alt="">
위 그림은 왼쪽의 자동차 이미지가 CNN 모델의 각 레이어를 거쳐서 나온 결과를 시각화한 것이다.** input에 가까운 레이어를 통과한 결과는 원본 이미지에서 크게 변형되지 않았지만 필터별로 관심을 두는 부분이 조금씩 다른 것을 확인할 수 있다. 그리고 output에 가까운 레이어일 수록 추상화 수준이 높아 해석이 어렵다.** 이러한 레이어별 추상화 정도가 차이난다는 점을 활용한 연구가 Neural Style이다. 
<img src="https://images.velog.io/images/tobigs_xai/post/75e61545-b32e-412a-ab90-faf6c66d74a2/Screen%20Shot%202021-04-26%20at%2010.17.23%20PM.png" alt="">
Content의 역할을 하는 마을 사진을 보면, input layer에 가까울수록 원본 이미지와 유사하고, output layer와 가까울수록 추상화 수준이 높아짐을 확인할 수 있다. Neural Style에서는 content로 사용할 원본 이미지의 세세한 부분이 아니라 큼직한 추상화된 feature가 필요하므로 깊은 레이어의 activation 결과를 사용한다.</p>
<hr>
<h2 id="2-visualization-at-input-image">2. Visualization at Input Image</h2>
<p>Input Image를 모델이 어떻게 분류했는지 알기 위해 visualization하는 방법론으로는 크게 네가지가 있다.</p>
<h3 id="2-1-occlusion-experimentzeiler--fergus-2013">2-1. Occlusion Experiment[Zeiler &amp; Fergus 2013]</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/666b5a14-e163-4666-8686-69a17ea136d6/Screen%20Shot%202021-04-27%20at%201.12.02%20AM.png" alt="">
위 그림은 image의 어떤 부분이 이미지 분류에 큰 영향을 미치는지 알아본 결과이다. (a)와 같은 input image가 있을 때, 작은 회색 상자를 그린다. 그리고 모델에 통과시켜서 나온 결과를 기록한다. 이 회색상자를 조금씩 이동시키면서 위 과정을 반복한다. 그 결과를 heatmap으로 시각화한 것이 (d), (e)이다. (d)는 회색상자로 일부가 지워진 그림이 포메라니안일 확률이 높으면 빨간색이고, 낮으면 파란색이다. <strong>즉, 파란색으로 부분이 지워지면 포메라니안으로 분류될 확률이 낮으므로 이 부분이 분류 결과를 결정하는 중요한 부분임을 암시한다.</strong> Input image에서 파란 부분은 강아지의 얼굴임을 알 수 있다. 즉, 본 실험은 CNN이 사람이 물체를 인식하는 과정과 유사하다는 것을 검증하였다.</p>
<h3 id="2-2-deconvnetzeiler--fergus-2013--guided-backpropagationdosovitskiy-et-al-2015">2-2. Deconvnet[Zeiler &amp; Fergus 2013] &amp; Guided-Backpropagation[Dosovitskiy et al., 2015]</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/1eff2ae6-c83d-4162-bde2-9e8423d650db/Screen%20Shot%202021-04-27%20at%2012.45.38%20AM.png" alt="">
위 사진은 Deconvnet의 결과물로, image를 모델에 집어 넣었을 때, 각각의 layer에서 activation을 크게 만드는 feature map을 시각화할 수 있다. 즉, input image의 어떤 부분이 레이어를 Activate시켰는지 알아보기 위해서 <strong>Activation 값을 input에 mapping시키는 것이다. 이를 위해서는 CNN을 거꾸로 거슬러 올라가는 과정이 필요하다.</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/b44cccc7-f1dc-4063-b543-42f8074f7814/Screen%20Shot%202021-04-27%20at%2012.54.22%20AM.png" alt="">
Deconvolution은 convolution의 역연산으로, 레이어를 활성화하는 부분을 input image에 mapping하기 위해서  진행한다. CNN은 필터와의 <code>Convolution -&gt; Activation Function -&gt; Pooling</code>으로 이뤄져있다. Deconvolution은 이 과정을 거꾸로 진행한다.
<img src="https://images.velog.io/images/tobigs_xai/post/6ae73f82-dcc3-4068-b4e1-879c070f3e05/image.png" alt=""></p>
<ol>
<li><code>Unpooling</code>
Forward Pass에서 Max Pooling을 할 때 max의 위치를 저장한다. Backward Pass에서 이전 레이어에서 넘어온 값을 미리 저장해둔 위치에 삽입한다.</li>
<li><code>Rectification</code>
CNN은 feature map의 값이 항상 양수가 되도록 non-linear 함수인 ReLU를 사용한다. 이와 마찬가지로 backward pass에서도 non-linear ReLU를 사용한다.</li>
<li><code>Filtering</code>
Convolution 연산을 할 때 사용했던 Filter 정보를 갖고 있기 때문에, 역연산이 가능하다. 이 과정이 잘 이해되지 않으면 <a href="https://zzsza.github.io/data/2018/06/25/upsampling-with-transposed-convolution/">여기</a>를 참고하길 바란다.</li>
</ol>
<ul>
<li>Guided Backpropagation
Guided Backpropagation는 Deconvnet의 개량된 방법론이다.
<img src="https://images.velog.io/images/tobigs_xai/post/9a46c321-50f4-45bd-9cb8-8cfb5641787f/Screen%20Shot%202021-04-27%20at%2012.40.16%20AM.png" alt="">
a) Deconvnet과 마찬가지로, Forward Pass는 일반적인 CNN처럼 계산하고, Backward Pass에서 Activation을 만드는 input 값을 찾는다.
b) Forward Pass에서 음수인 값(핑크색)은 다음 레이어로 전달되지 않는다. 그러나 기존의 Deconvnet은 Forward Pass에서 ReLU를 통과했는지 아닌지와 무관하게 Backward Pass에서 계산된 값(노란색)만을 가지고 Rectification을 한다. 이를 보완하기 위해 Guided Backpropagation에서는 Forward Pass에서 음수이거나 Backward Pass에서 음수인 부분들, 즉 핑크색이거나 노란색인 부분들을 모두 0으로 반환한다.
c) 위의 내용을 수식으로 나타낸 것이다.</li>
</ul>
<h3 id="2-3-saliency-mapsimonyan-vedaldi-zisserman-2014">2-3. Saliency Map[Simonyan, Vedaldi, Zisserman 2014]</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/c74e4063-17d5-4f5a-8c41-a06e2c6e0f68/Screen%20Shot%202021-04-27%20at%201.22.01%20AM.png" alt="">
Saliency map은 Input Image의 각각의 픽셀이 top-1 predicted 클래스에 미치는 영향을 시각화한 것이다. 예를 들어, 첫번째 사진을 input으로 넣었더니 모델이 요트로 분류했다고 하자. 이는 output vector에서 요트를 나타내는 element가 가장 크다는 것을 의미한다. 
${\partial L_{yacht}\over\partial I_{i,j}}, L_{yacht}:$요트의 Loss, $I_{i, j}:$ Input Image의 (i,j) 픽셀
<strong>Backpropagation을 통해 각각의 픽셀에 대한 편미분값을 구하고, RGB채널 중 가장 큰 값을 시각화에 사용한다.</strong>
<code>Saliency map을 이용하여 Segmentaion도 가능하다.</code></p>
<hr>
<h2 id="3-visualization-at-the-network-for-each-class">3. Visualization at the Network for each Class</h2>
<p>이제까지는 Input Image가 주어진 경우, 모델의 성능에 영향을 미치는 부분을 시각화하는 방법에 대해 알아보았다. Optimization method는 Input Image 없이 특정 클래스를 최대화하는 Input Image를 찾는 것이다.</p>
<h3 id="3-1-optimization-methodsimonyan-vedaldi-zisserman-2014">3-1. Optimization Method[Simonyan, Vedaldi, Zisserman 2014]</h3>
<p><img src="https://images.velog.io/images/tobigs_xai/post/0c9ef7f4-f46c-4e99-82d1-2848527e9815/Screen%20Shot%202021-04-27%20at%201.53.44%20AM.png" alt=""></p>
<ol>
<li>Zero Image를 모델에 넣고, Forward Pass를 계산한다. </li>
<li>output vector에서 원하는 클래스의 값은 1로, 나머지 클래스의 값은 0으로 만든다.</li>
<li>이 vector를 이용하여 Gradient Ascent를 한다.</li>
<li>Backward Pass를 통해 도착한 값을 Input Image에 더한다.</li>
<li>1로 돌아가 반복한다.
위 과정을 통해 특정 클래스를 Activation하는 이미지를 만들 수 있다. 
$arg\underset{I}max\ S_c(I)-\lambda\begin{Vmatrix}I\end{Vmatrix}^2_2$
이 때, 성능 향상을 위해 다음과 같이 Regulrization term을 추가하고, 노이즈를 제거하기 위해 Low-pass filter(Gaussian Blur)를 통과시킨 후 threshold보다 작은 값은 0으로 만든다. 결과는 다음과 같다.
<img src="https://images.velog.io/images/tobigs_xai/post/d636b05e-c9d0-4080-8f0d-b7170ae72a64/Screen%20Shot%202021-04-27%20at%202.00.19%20AM.png" alt="">
생성된 이미지에서 클래스에 속한 물체들이 보인다. 이를 통해 추측할 수 있는 사실은 두가지이다.</li>
<li><code>Overfitting</code>
모델이 training data에 overfitting되었음을 확인할 수 있다. 예를 들어, 좌측 하단의 거위 이미지를 보자. 거위들이 특정 위치에 특정 자세로 서있는 것을 볼 수 있다. 즉, training data에 있던 거위의 흔적이 강하게 남아서 위와 같이 visualize된 것이다. 만약 모든 가능한 위치에 모든 자세의 거위가 학습되었다면 이미지 전체에 거위의 이미지가 퍼져있을 것이다.</li>
<li><code>보안 이슈</code>
위의 결과는 optimization을 통해 training data를 일부 시각화할 수 있음을 의미한다. 즉, 모델의 Gradient값을 알아낼 수 있다면 training data를 역추적할 수도 있음을 나타낸다. 보안성이 취약하기 때문에 신용평가 등 개인정보를 다루는 모델에서 주의를 요한다.</li>
</ol>
<p>작성자: 투빅스 15기 황보진경</p>
<blockquote>
<p>참고자료
본 내용은 <a href="https://www.youtube.com/playlist?list=PLKs7xpqpX1bd-UDMAe_vl2vZFQ05bzizQ">이정우 교수님의 딥러닝의 기초(2020) </a>CNN 강의를 기반으로 작성되었으며, 아래의 자료들을 참고하였다.</p>
<ul>
<li><a href="https://peterkim95.github.io/jekyll/update/2017/08/29/introspectiveness-of-nn/">https://peterkim95.github.io/jekyll/update/2017/08/29/introspectiveness-of-nn/</a></li>
<li>안재현. (2020). XAI 설명 가능한 인공지능, 인공지능을 해부하다 / 안재현 지음.</li>
<li><a href="https://cs231n.github.io/convolutional-networks/">https://cs231n.github.io/convolutional-networks/</a></li>
<li><a href="https://www.popit.kr/neural-style-transfer-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0/">https://www.popit.kr/neural-style-transfer-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0/</a></li>
<li><a href="https://arxiv.org/pdf/1311.2901.pdf">M. D. Zeiler and R. Fergus, “Visualizing and understanding
convolutional neural networks,” in European Conference on
Computer Vision (ECCV), 2014.</a></li>
<li><a href="https://arxiv.org/pdf/1312.6034.pdf,">K. Simonyan, A. Vedaldi, and A. Zisserman. Deep inside convolutional networks: Visualising image classification models and saliency
maps. CoRR, abs/1312.6034, 2014. </a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1주차] LIME 논문 리뷰  
: “Why Should I Trust You? 
Explaining the Predictions of Any Classifier"]]></title>
            <link>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-LIME-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Why-Should-I-Trust-You-Explaining-the-Predictions-of-Any-Classifier</link>
            <guid>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-LIME-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-Why-Should-I-Trust-You-Explaining-the-Predictions-of-Any-Classifier</guid>
            <pubDate>Tue, 20 Apr 2021 09:11:24 GMT</pubDate>
            <description><![CDATA[<p> 본 글은 <a href="%22https://arxiv.org/abs/1602.04938%22">LIME 논문(&quot;Why Should I Trust You?&quot;: Explaining the Predictions of Any Classifier</a> 을 참고해 작성하였습니다.  </p>
<ul>
<li>해당 글에 첨부된 그림은 모두 위의 논문에서 발췌하였습니다. </li>
<li>LIME에 관한 개념을 위주로 다루었습니다. </li>
</ul>
<h2 id="abstract">Abstract</h2>
<ul>
<li>현재 머신러닝 모델들은 대부분 블랙박스 모델입니다. 신뢰(trust)를 위해 모델 예측의 근거를 이해하는 것은 매우 중요하고, 이는 전체적인 모델의 신뢰도를 판단하는 데에도 사용될 수 있습니다. 해당 논문은 이를 해결하기 위해 모든 classfier의 예측에 대해 적용될 수 있는 LIME 기법을 제안합니다. LIME 기법의 유연성을 보여주기 위해 텍스트 분류와, 이미지 분류를 예시로 제공합니다.   </li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>&nbsp;여러 의사 결정을 하기 위해 다양한 분야에서 머신 러닝 기법이 활용되기 시작했습니다. 하지만 대부분의 머신러닝 모델은 블랙박스(black box) 모형이기 때문에 모델이 내린 결정에 대해 해석이 어렵다는 치명적인 단점이 존재합니다. 이런 블랙박스 모델에 대해 믿지(trust) 못하는 사용자(user)들은 해당 모델을 사용하지 않을 것입니다. 우선, trust의 두 가지 정의에 대해 구별할 필요가 있을 것 같습니다. </p>
<ol>
<li><p>Trusting a prediction: 사용자(user)가 모델의 예측을 참고하여 행동으로 옮길 만큼 충분히 신뢰하는지.</p>
<ul>
<li>예를 들어, 만약 머신러닝 모델이 의학적인 진단이나 테러 감지에 대해서 판단을 내릴 때, blind faith를 기반해 판단이 내려져선 안된다. </li>
</ul>
</li>
<li><p>Trusting a model: 모델이 배포될 경우 모델이 합리적인 방식으로 작동하는 지에 대해 신뢰하는지.</p>
<ul>
<li>모델이 real-world data에 대해서도 정상적으로 작동할 지에 대해서 사용자가 충분히 납득할 수 있어야 합니다.   </li>
<li>보통 머신러닝 모델은 검증 데이터의 accuracy를 참고해 학습이 진행되는데, real-world data는 이와 괴리가 존재할 수도 있을뿐더러 accuracy를 정하는 방식이 우리의 목표랑 맞지 않을 수도 있습니다. </li>
</ul>
</li>
</ol>
<p> &nbsp;위의 두 신뢰도는 인간이 모델의 행동(예측)방식에 대해 얼마나 이해하는 지에 따라 영향을 받습니다.<br> 해당 논문에서는 모델의 개별적인 예측에 대한 설명을 제공해 예측을 신뢰할 수 있게 하고(trusting a prediction), 이런 개별적인 예측(또는 설명)을 여러 개 선택해 전체 모델에 대해서도 신뢰할 수 있는(trusting the model) 방법을 제안합니다. </p>
<ul>
<li><p>LIME : 어떤 분류기(classifier)나, 회귀기(regressor)의 예측에 대해 해석가능한 모델로 (지역적으로) 근사함으로써 설명할 수 있는 알고리즘(trusting a prediction).</p>
</li>
<li><p>SP-LIME: 서브모듈러 최적화(submodular optimization)를 통해 설명 가능한 대표적인 예시들을 뽑아 모델을 신뢰할 수 있게끔 하는 방법(trusting the model).</p>
</li>
</ul>
<p>&nbsp;예측에 대해 설명하는 것(‘Explaining a prediction’) 이란 문장 내 단어들 또는 이미지 내 패치 같은 구성요소들과 모델의 예측 사이의 관계를 이해할 수 있는 양질의 시각 정보를 제공하는 것으로 볼 수 있습니다. 예측에 대해 설명하는 것은 인공지능 모델을 신뢰함은 물론, 의사 선생님이 질병 예측에 대해 환자에게 설명을 덧붙이는 것과 같이 효과적으로 머신러닝 모델을 사용할 수 있습니다. 또한 인공지능 모델을 사용하는 사람은 해당 분야에 대해 사전 지식을 가지고 있기 때문에, 인공지능 모델로부터 설명을 받으면 그 설명이 타당한 지, 타당하지 않은 지 판단할 수 있습니다. </p>
<p><img src="https://images.velog.io/images/sjinu/post/b237edfc-7148-42e5-ad8d-dc74ad995c46/image.png" alt=""></p>
<p>&nbsp;&amp;nbsp<code>모델은 해당 환자가 감기에 걸렸다고 판단하였고, LIME은 그 판단의 근거가 되는 증상을 하이라이트하는 모습을 보여줍니다.</code></p>
<p>&nbsp;하지만 현재 머신러닝 모델의 성능을 판단하는 데 쓰이는 기준은 보통 검증 데이터를 이용하곤 하는데, 이는 실제 상황의 데이터에서는 제 성능을 발휘하지 못할 수도 있습니다. 또한, accuracy에 의존해서 신뢰도를 결정하는 것 또한 위험합니다. 아래 그림에서 “Atheism”을 판단하는 근거로 Posting, Host, Re와 같이 전혀 관련이 없는 단어들을 제공한 예시와 같이 단순히 정확성에 의존하는 모델은 신뢰할 수 없다는 것을 알 수 있습니다. </p>
<p><img src="https://images.velog.io/images/sjinu/post/755dc27b-3ce1-4ba8-ad56-52bb87fba16f/image.png" alt="">
&nbsp;&amp;nbsp<code>특정 문서가 기독교에 관한 것인지, 무신론에 관한것인지 예측하는 두 개의 분류기. 막대 차트는 그 판단에 가장 관련이 깊은 단어의 중요도를 보여줍니다.</code></p>
<h4 id="설명자explainer의-바람직한-특성">설명자(Explainer)의 바람직한 특성</h4>
<ol>
<li>Interpretable : 입력과 결과에 대한 질 좋은 설명이 제공되어야 합니다. 사용자의 수준에 맞게 설명이 제공되어야 하며, 비전문가 또한 예측에 대해 쉽게 이해할 수 있어야 합니다.</li>
<li>Local fidelity :     예측에 대한 설명은 적어도 지역적으로(locally) 신뢰(faithful)되어야 합니다. 즉, 모델이 하나의 데이터에 내린 판단에 대해 설명할 수 있어야 합니다. </li>
<li>Model-agnostic : 어떠한 모델을 사용하든 설명 가능해야 합니다.</li>
<li>Global-perspective : 정확도만으로는 모델을 정확하게 평가할 수 없기 때문에, 어느 정도 전체적인 모델에 대한 설명 또한 제공되어야 합니다.</li>
</ol>
<h2 id="local-interpretable-model-agnostic-explanationslime">Local Interpretable Model-Agnostic Explanations(LIME)</h2>
<p> &nbsp;저희는 위와 같은 ‘설명’을 제공하기 위해 Local Interpretable Model-agnostic Explanations(LIME) 방법을 제안합니다. LIME의 전반적인 목표는 기존의 분류기에 대해 지역적으로 신뢰(locally faithful)를 보이는 해석 가능한 표현(interpretable representation)들을 통해 해석가능한 모델을 정의(식별)하는 것입니다.</p>
<h3 id="해석가능한-데이터-표현">해석가능한 데이터 표현</h3>
<p> &nbsp;모델을 설명하기 앞서서, 특성(features)과 해석 가능한 표현(interpretable data representations)의 차이를 구별하는 것은 중요합니다. 해석가능한 설명은 보통 모델에 쓰이는 feature와는 관계없이 사람이 이해할 만한 표현을 사용해야 합니다. 예를 들면, 텍스트 모델의 경우 모델은 word embeddings과 같은 복잡한 feature를 사용하지만 인간에게는 ‘단어의 존재 또는 부재’와 같은 간단한 이진 벡터가 제공될 수 있습니다. 이미지 모델에서도 모델은 픽셀 당 RGB 값을 이용한 tensor를 이용하는 반면, 우리는 이미지의 특정 부분(슈퍼 픽셀)과 같은 요소의 ‘존재 또는 부재’를 제공받을 수 있습니다.     </p>
<h4 id="식-정의">식 정의</h4>
<p>$$x\in R^d$$ : 설명되는 데이터에 대한 기존의 표현
$$x&#39;\in{0,1}^{d&#39;}$$ : 해석가능한 표현을 위한 이진 벡터
$f(x)$ : 평가하려고 하는 모델 $f$가 $x$를 넣었을 때 원하는 $label$에 대한 확률 값
$g∈G$ :</p>
<ul>
<li>$G$ : 해석가능한 모델들의 클래스, ex) linear model,decision tree..</li>
<li>$g$ : 사용자에게 visual or textual 요소를 제공하는 설명 모델. $d&#39; dimension$의 {0,1} 벡터를 정의역으로 하며, 어떤 ‘해석 가능한 요소들’에 대한 ‘존재 또는 부재’로 표현됩니다. </li>
</ul>
<p> &nbsp;모든 설명 모델 $g$가 해석가능 할 만큼 간단하지는 않기 때문에, $Ω(g)$를 설명 모델 $g$의 복잡성 측정(measure of complexity)라 하고, 해석가능성(interpretability)와 반대되는 개념으로 정의합니다. 예를 들어, 결정 트리에서 트리의 깊이나, 선형 모델에서 가중치의 개수가 될 수 있습니다. </p>
<p> &nbsp;설명의 대상이 되는 모델을 $f:R^d→R$이라 합시다. 즉, 분류에서는 $f(x)$ : ’특정 class에 속할 확률’ 이 됩니다. 또한, 예시(instance) $z$와 $x$사이의 유사성 척도로 $π_x(z)$를 사용합니다. 결론적으로, $L(f,g,π_x)$를 $π_x$로 정의되는 지역성(locality) 하에서 ‘$g$가 $f$로 근사하는 데 있어서 얼마나 믿음직스럽지 못한가’를 측정하는 척도로 사용할 수 있습니다.</p>
<p> &nbsp;우리는 해석가능성(interpretability)과 지역적 신뢰도(local fidelity) 두 가지를 보장하기 위해 복잡성인 $Ω(g)$를 인간이 해석가능 할 정도로 최대한 낮추면서, $L(f,g,π_x)$를 최소화 해야 합니다.
 결국, LIME이 생성하는 설명은 아래와 같은 식으로 얻어집니다.</p>
<p><img src="https://images.velog.io/images/sjinu/post/a9654e23-e4ce-430e-964d-6b0cb778f497/image.png" alt=""> 위에 사용되는 $L,G,Ω$는 각각 모두 다른 신뢰 함수(fidelity function), 설명족(explanation family) 그리고 복잡성 척도(complexity measures)가 쓰일 수 있습니다. 우리는 본 논문에서 간섭(perturbation)을 사용한 탐색과, 설명 모델로서 희소 선형 모델(sparse linear model)을 중점으로 설명하겠습니다.</p>
<h3 id="지역-탐색을-위한-샘플링">지역 탐색을 위한 샘플링.</h3>
<p> &nbsp;우리는 모델-애그노스틱 한 설명 모델을 원하기 때문에, f에 대한 어떠한 가정도 하지 않고 지역인식 손실(locality-aware loss)인 $L(f,g,π_x)$를 최소화하고 싶습니다. 따라서 입력 데이터가 변하는 와중에 $f$의 지역적(부분적)인 행동을 학습하기 위해서 가중치 $π_x$를 사용, 샘플들을 뽑고 싶습니다. </p>
<p> &nbsp;그를 위해 $x&#39;$의 원소 중 $0$이 아닌 원소들을 무작위로 뽑아서 $x&#39;$주변의 값을 샘플링합니다. $x&#39;$의 원소들 내 무작위 적인 조합을 포함하는 간섭 샘플 $z&#39;∈{0,1}^{d&#39;}$ 로부터, 기존의 표현인 $z∈{0,1}^d$ 샘플을 복원해 $f(z)$를 얻습니다. 여기서 얻어진 $f(z)$는 설명 모델 $g$를 위한 $label$로 쓰입니다. $label$을 가지고 있는 이러한 간섭 샘플 데이터 세트 $Z$가 주어질 때, 우리는 $Explantion(x)$을 얻기 위해 방정식 (1)을 최소화해야 합니다.</p>
<p>&nbsp;$LIME$ 뒤에 있는 주된 직관은 아래의 그림으로 나타납니다. 아래 그림에서 우리는 데이터들을 $x$ 근처($π_x$때문에 가중치가 높은)에서도 뽑고, $x$와 먼 곳(가중치가 낮은)에서도 뽑습니다. LIME은 입력 데이터 $x$(red cross) 주변의 데이터를 샘플링하고, 샘플링 데이터를 $f$를 사용해 예측한 뒤 유사도에 따라 가중치를 부여합니다(틀리게 예측한다면 그만큼 가중치는 적게 주기 때문에 loss에 영향을 덜 끼친다). 아래의 푸른색 원의 크기가 가중치의 크기입니다.
<img src="https://images.velog.io/images/tobigs_xai/post/520a43fa-da7e-460a-9260-f61661211ec7/image.png" alt=""></p>
<p> &nbsp;기존의 분류 모델이 전역적으로 설명하기에 너무 복잡할지라도, LIME은 지역적으로(즉, 한 데이터에 한해서) 신뢰가 가는 설명을 제공합니다. 그런 지역성은 $π_x$로 나타납니다. 우리의 샘플들은 $π_x$에 의해 가중치가 부여되기 때문에 노이즈(여기서 $z&#39;$)를 샘플링하기에 꽤나 robust하다고 할 수 있습니다. </p>
<h3 id="sparse-linaer-explanations">Sparse Linaer Explanations</h3>
<p> &amp;nbsp본 논문의 나머지 파트에서는 G를 linear model들로 가정합니다. 즉, $g∈G$에서, $g(z&#39;)=w_gz&#39;$를 만족하는 집합입니다. 우리는 아래와 같은 locally weighted square loss를 $L$로 사용합니다. 
<img src="https://images.velog.io/images/sjinu/post/9bec561a-1712-4b09-a41a-9f4f9b81af7a/image.png" alt="">
&amp;nbsp이 때, $π_x (z)=exp⁡(-(D(x,z)^2)/σ^2)$ 인 width가 $σ$인 exponential kernel을 사용하고, $D$는 특정한 거리 함수(distance function,텍스트에는 코사인 거리,이미지에는 L2거리 등)이 됩니다. 위에서 $z$는 샘플링 된 값들이라고 볼 수 있습니다. </p>
<h4 id="참고--kernel이란">참고 : Kernel이란?</h4>
<p>&amp;nbsp&amp;nbsp_보통 비선형 문제를 풀기 위해 비선형을 선형 문제로 변환시켜야 되는 상황이 많습니다. 하지만 적당한 변환 함수를 찾기는 쉽지 않기 때문에 변환하지 않고 비선형 문제를 해결하는 방법이 필요합니다. 이러한 방법들 중 하나로,  (선형)Z 공간에서 특정 가설 G를 구하기 위해서는 선형식 z를 직접 구하지 않고 z간의 내적만 뽑아내 사용하는 방법이 있습니다. 이런 내적을 구하는 식(즉, 커널함수)은 다항 커널, 가우시안 커널, 지수형 커널 등이 있습니다. 위에서 쓰인 지수형 커널(exponential kernel)은 가우시안 커널에서 제곱만 빠진 형태로,  서로간의 방향은 상관 없는 완전 거리 기반 방사형 커널입니다. sigma가 높아지면 결과가 데이터 간의 거리에 상관 없이 1에 가까워질 것이고, 고차원의 정사영은 비선형의 힘을 잃을 것입니다. 만약 sigma가 작아진다면 값이 지수적으로 커져버리기 때문에 regularization를 잃어버릴 것이고, 결정 경계는 학습 데이터의 노이즈에 너무 민감해질 것입니다._</p>
<br>

<p>&amp;nbsp텍스트 분류에서는 해석가능한 표현(interpretable representation)으로 단어 가방(A bag of words, 순서를 고려하지 않은 단어 묶음)으로 설정함으로써 설명 가능할 것입니다. 이 때 단어 가방에 몇 개의 단어를 담을 지는 사용자의 몫이며, 많은 단어를 담는다면 필연적으로 모델은 복잡해질 것입니다($Ω(g)\uparrow$). </p>
<p> &nbsp;이미지 분류에서는 해석가능한 표현으로 픽셀 간 비슷한 정보를 담고 있는 슈퍼 픽셀(Super-pixel)을 사용할 것입니다. 그로부터 이미지의 해석가능한 표현은 슈퍼 픽셀이 켜지거나, 꺼지는 이진 분류로서 나타날 것입니다. </p>
<p> &nbsp;우리는 $K-LASSO$로 불리는 과정(Lasso를 이용해 K feature를 선택하고, 제곱합을 통해 가중치를 학습하는)을 사용하기 때문에 Loss 방정식(1)을 근사적으로 풀 것입니다. 직접적으로는 거의 풀 수가 없습니다.</p>
<p> &nbsp;아래와 같은 K-LASSO 알고리즘은 한 데이터에 대한 설명을 내포하기 때문에 데이터세트가 얼마나 크든지 복잡도에 영향을 받지 않으며, 그렇기 때문에 비교적 간단하다고 할 수 있습니다. 대신 $f(x)$를 계산하고, $sample$ 개수인 N에는 복잡도가 영향을 받을 것입니다.
 일반적으로, 1000 tree, N=5000인 결정 트리에서는 3초 미만, Inception network에서의 이미지 분류는 10분정도 걸렸습니다.
 <img src="https://images.velog.io/images/sjinu/post/8d4a7104-78bf-4c31-b200-7cf5d6f6cc76/image.png" alt=""></p>
<p> 어떤 방식으로 해석 가능한 표현과 해석 모델 G를 고르든, 단점은 분명히 존재할 것입니다.</p>
<ol>
<li>기존의 분류 모델이 블랙박스 모델일지라도 특정한 해석 가능한 표현은 어떤 행동을 설명할 정도로 강하지 못할 수도 있습니다.</li>
</ol>
<ul>
<li>예를 들면, sepia-toned의 이미지를 retro-toned로 오판하는 것은 슈퍼 픽셀의 부재로 설명될 수가 없습니다(색조의 문제).</li>
</ul>
<ol start="2">
<li>우리가 $G$로 선택한 Sparse linear model은, 만약 기존의 분류 모델이 지역적으로도 ‘매우 비선형’적이라면 지역적인 선형을 가정한 linear model로는 신뢰도 높은 설명을 할 수 없을 것입니다.</li>
</ol>
<p> &nbsp;하지만, LIME 모델은 예측을 잘 설명하는 최고의 간섭 샘플만 사용할 수 있는 게 아니라, 특정 데이터 $x$ 근처의 다양한 샘플들($z&#39;∈Z$)에 대해서도 설명을 제공할 수 있습니다. 그렇기 때문에 적절한 설명 집합($Z$)을 선택할 수 있고, 주어진 데이터 세트와 분류기에도 맞출 수 있게 됩니다. 해석가능 모델을 선형모델로 택했을 때에도 여러 블랙박스 모델에 잘 작동하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1주차] 대리분석(LIME)]]></title>
            <link>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-%EB%8C%80%EB%A6%AC%EB%B6%84%EC%84%9DLIME</link>
            <guid>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-%EB%8C%80%EB%A6%AC%EB%B6%84%EC%84%9DLIME</guid>
            <pubDate>Tue, 13 Apr 2021 20:07:28 GMT</pubDate>
            <description><![CDATA[<p>본 글의 내용은 안재현 님의 저서 &#39;XAI 설명 가능한 인공지능, 인공지능을 해부하다.&#39; 를 주로 참고하여 작성하였음을 알려드립니다.</p>
<h1 id="대리분석이란">대리분석이란?</h1>
<p>&amp;nbsp대리 분석은 이름에서 예상할 수 있듯이 본래 기능을 흉내내는 대체재를 만들어 프로토타입이 동작하는지 판단하는 분석 방법이다. XAI에서 대리분석 또한 본래 인공지능 모델이 너무 복잡해서 분석하는 것이 연산적인 제약으로 인해 불가능할 때 유사한 기능을 흉내내는 인공지능 모델 여러 개를 만들어 본래 모델을 분석하는 기법을 말한다. 
<img src="https://images.velog.io/images/sjinu/post/f07a10f7-ea4f-4448-9c80-c669d2bba3bf/image.png" alt=""><code>출처: XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp본래 분석해야 할 모델을 f라고 할 때, 이를 흉내 내는 모델인 g를 만드는 것이 대리 분석의 목표이다. 이 때, 모델 g는 모델 f와 학습 방식이 같을 수도 있고, 다를 수도 있다. 모델 g를 결정하는 핵심 조건은 아래와 같다.</p>
<ol>
<li>모델 f보다 학습하기 쉽다.</li>
<li>설명 가능하다.</li>
<li>모델 f를 유사하게 흉내 낼 수 있으면 된다.</li>
</ol>
<p>또한, 모델 g의 학습 과정은 다음 두 가지로 나뉜다.</p>
<ol>
<li>학습 데이터 전부를 사용한다.</li>
<li>데이터의 라벨 별로, 또는 데이터의 일부만 사용한다.</li>
</ol>
<p>&amp;nbsp학습하는 과정이 끝나면, 모델 g는 모델 f를 조금이나마 흉내 낼 것이고, g는 설명 가능하기 때문에 원래의 모델 f가 어떻게 학습됐을 지 간단하게 나마 설명할 수 있다. 즉, 모델 g는 모델 f보다 정확도가 떨어지지만, 모델 f를 대변할 수 있다. </p>
<p>&amp;nbsp이 때, 학습 데이터(일부 또는 전체)를 사용해 대리 분석 모델을 구축하는 것을 글로벌 대리분석(Global Surrogate Analysis)이라 하고, 학습 데이터 하나를 해석하는 과정을 로컬 대리 분석(Local Surrogate Analysis)라고 부른다.</p>
<p>대리 분석법의 장점은 아래와 같다.</p>
<ol>
<li>모델 애그노스틱(model-agnostic technology, 모델에 대한 지식 없이도 학습할 수 있음)하다.</li>
<li>적은 학습 데이터로도 설명 가능한 모델을 만들 수 있다.</li>
<li>중간에 모델 f가 바뀌더라도 피처만 같다면 대리 분석을 수행할 수 있다.</li>
</ol>
<p>&amp;nbsp대리 분석 모델은 블랙박스 모델과 완전히 분리돼(decoupled)있고, 이러한 특성은 XAI 분야 내에서도 중요한 관심사이기 때문에 기억해두는 것이 좋다. </p>
<h2 id="글로벌-대리-분석global-surrogate">글로벌 대리 분석(Global surrogate)</h2>
<p> 본 글에서는 글로벌 대리 분석을 다루지 않고, 로컬 대리 분석에 대해서만 기술하겠다.</p>
<h2 id="로컬-대리-분석local-surrogate">로컬 대리 분석(Local Surrogate)</h2>
<p> &amp;nbsp로컬 대리 분석은 데이터 하나에 대해 블랙박스 모델이 해석하는 과정을 분석하는 기법으로, 주로 LIME(Local Interpretable Model-agnostic Explanations)으로 더 잘 알려져 있다. 
 <img src="https://images.velog.io/images/sjinu/post/ff3299fe-407a-478b-8360-4852f3570613/image.png" alt="">
<code>🔺일렉기타를 치는 있는 리트리버’ 사진을 LIME을 사용해 분석한 결과. 해당 사진을 예측할 때 블랙박스가 집중한 영역을 확인할 수 있다. 출처:Ribeiro et al(2015). &quot; Why should i trust you?&quot; Explaining the predictions of any classifier</code></p>
<p> 다음으로, LIME(Local Intcrprctablc Modcl-agnostic Explanations) 기법에 대해서 자세히 다뤄보자.  </p>
<h3 id="lime을-다루기-이전-참고">LIME을 다루기 이전, 참고</h3>
<p>&amp;nbspXAI 모델이 어디에 중점을 두는지에 대한 개념인 로컬과 글로벌은 비단 대리 분석뿐만 아니라 다른 XAI 기법들에서도 중요한 요소라 할 수 있다.
<img src="https://images.velog.io/images/sjinu/post/ec6dfcf1-4cf3-414e-8e9b-2283cd0217d0/image.png" alt="">
<code>출처: Das, A., &amp; Rad, P. (2020). Opportunities and challenges in explainable artificial intelligence (xai): A survey</code></p>
<h4 id="로컬-기반-분석local-based-analysis">로컬 기반 분석(Local-Based Analysis)</h4>
<p> <img src="https://images.velog.io/images/sjinu/post/d4763467-77a2-41c6-9e98-b334f8869d64/image.png" alt="">🔺Gradient-based Saliency Maps.
 <code>출처: K. Simonyan, A. Vedaldi, and A. Zisserman, “Deep Inside Convolutional
Networks: Visualising Image Classification Models and Saliency Maps,”
2nd International Conference on Learning Representations, ICLR 2014- Workshop Track Proceedings, Dec 2013.</code></p>
<h4 id="글로벌-기반-분석global-based-analysis">글로벌 기반 분석(Global-Based Analysis)</h4>
<p><img src="https://images.velog.io/images/sjinu/post/f12145d4-00d5-486b-b93a-201c2bb0e76d/image.png" alt=""> 
🔺Class model-visualization method.
<code>출처: K. Simonyan, A. Vedaldi, and A. Zisserman, “Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps,” 2nd International Conference on Learning Representations, ICLR 2014 - Workshop Track Proceedings, Dec 2013.</code></p>
<p> <img src="https://images.velog.io/images/sjinu/post/a5a96966-a78e-4ba5-9dec-f4273b80240f/image.png" alt="">
🔺많은 XAI 알고리즘들은 모델의 범위(global or local), 방법(back prop or perturbation or others), 의존성(model-agnostic or model-specific)에 따라 분류할 수 있다.
<code>출처: Das, A., &amp; Rad, P. (2020). Opportunities and challenges in explainable artificial intelligence (xai): A survey. arXiv preprint arXiv:2006.11371.</code></p>
<p> 아래에서 기술할 LIME 기법은 글로벌 및 로컬 특성을 모두 가지고 있으며, 변형(perturbation) 기반 방법을 사용하고, 모델 애그노스틱(Model-Agnostic)한 특성을 가진다는 것을 확인할 수 있다. </p>
<h1 id="lime">LIME</h1>
<p>&amp;nbsp기존 딥러닝 모델의 신뢰도는 주로 테스트 데이터셋을 이용한 정확도로 검증하나, 현실 데이터와 테스트 데이터 사이의 괴리, 비전문가의 인공지능 모델 활용 제한 등으로 인해 해석에 어려움을 겪을 수 있다. 
&amp;nbspLIME은 모델이 현재 데이터의 어떤 영역에 집중했고, 어떤 영역을 분류의 근거로 사용했는지 알려주는 XAI 기법이다. 위에서 말했듯 LIME은 모델 학습 방법과 관계없이 사용 가능하므로 기존에 사용했던 학습 모델에 LIME을 적용하여 설명 가능하게끔 변환할 수 있다.</p>
<h2 id="lime-알고리즘-직관적으로-이해하기">LIME 알고리즘, 직관적으로 이해하기</h2>
<p>&amp;nbsp만약 우리가 지식인 사이트의 직원이고, 끊임 없이 올라오는 질문에 대해 이 질문이 진정성 있는지(sincere), 진정성 없는지(insincere) 판단해야 한다고 가정해보자. 데이터의 양이 너무 많기 때문에 우리는 머신러닝 모델을 만들어 분류를 하려 한다. 즉, 입력 데이터는 “글, 언어”이다. 이 경우 LIME을 적용하면 머신러닝 모델의 분류 근거에 대해 다음과 같이 시각화 할 수 있다.</p>
<h4 id="입력-데이터가-인간의-언어일-때nlp">입력 데이터가 인간의 언어일 때(NLP)</h4>
<p> <img src="https://images.velog.io/images/sjinu/post/6bdae825-e093-480a-b5b1-d3a7374ceb7a/image.png" alt="">
 <code>출처 : Explaining Text classifier outcomes using LIME | by Maha Amami | Towards Data Science</code>
이 때 insincere란 중립적이지 않거나, 누군가를 폄하하거나 비방하거나, 선동적이거나, 거짓에 기반한 내용인 내용을 포함하는 것으로 정의된다. 위의 글 처럼 stupid, earth, insist 등의 단어로부터 해당 질문이 굉장히 감정적이고, 선동적인 특성을 띤다고 볼 수 있다(75%의 정확도로 옳게 판별).</p>
<h4 id="입력-데이터가-이미지일-때image-classification">입력 데이터가 이미지일 때(Image classification)</h4>
<p><img src="https://images.velog.io/images/sjinu/post/ae292a7f-62b2-46db-802f-721b960b7ffe/image.png" alt="">
위처럼 귀여운(?) 개구리 이미지를 개구리로 판단한 근거(또는 당구대, 열기구로 판단한근거)들을 이미지 형식으로 설명해주고 있다.
<code>출처:Marco Tulio Ribeiro, Pixaby</code></p>
<p>&amp;nbsp그렇다면, LIME은 어떤 원리로 이미지 분류 및 텍스트 분류에 대한 근거를 설명해주는 것일까? 
   LIME은 입력 데이터에 대해 부분적으로 변화를 주는데, 이것을 변형(perturbation) 또는 샘플 퍼뮤테이션(sample permutation)이라 한다. 즉, 어떤 이미지가 모델의 입력값으로 들어온다면 해석이 가능하게끔 ‘인식 단위’를 쪼개고 이미지를 해석한다.
<img src="https://images.velog.io/images/sjinu/post/e135434d-d25c-4696-a74f-078d79212228/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>이렇게 쪼개진 이미지를 노란색 실선으로 이해 단위를 구분하고, 이렇게 나뉜 영역을 조합해 원본 모델이 대상을 가장 잘 분류할 수 있는 ‘대표 이미지’를 구성한다.
<img src="https://images.velog.io/images/sjinu/post/1ca4edb2-f89b-46ea-a5fc-8ea04395f893/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp어떤 이미지가 입력 값으로 주어졌을 때, 이미지 내 특정 관심 영역을 $x$라 하고, 초점 주변으로 관심 영역을 키워갈 때 기준 $$x$$로부터 동일한 정보를 가지고 있다고 간주할 수 있을 때, 이 영역을 $π_x$이라 하고 이를 슈퍼 픽셀(super pixel)이라 한다. </p>
<p> <img src="https://images.velog.io/images/sjinu/post/63d8e763-6241-4215-8f13-f6f5f7524d80/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp이런 슈퍼 픽셀에 대해서는 sklearn-image의 Segmentation 모듈을 참고하자.
이제 앞으로 사용할 $f, g, m_x$를 아래와 같이 정의하자.</p>
<p>$f$: 이미지 전체를 입력으로 받고, 특정 사람일 확률을 결과로 반환하는 블랙박스 모델
$m_x$: 슈퍼 픽셀 $π_x$의 마스킹 정보 
$g$: 슈퍼 픽셀 $π_x$의 마스킹 정보인 $m_x$를 입력으로 받고, $f(π_x)$와 동일한 값을 결과로 반환하게끔 학습된 해석 가능한 모델 </p>
<p>이 때, LIME으로부터 얻어지는 설명(explanation)은 아래와 같은 식으로부터 얻어진다
<img src="https://images.velog.io/images/sjinu/post/e89e8236-62c3-408f-b098-691d11b6514d/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>$g$는 각 $m_x$를 입력으로 받아, 각 $π_x$가 블랙박스 모델 $f$의 예측에 얼마나 영향을 미치는 지를 예측한다. 
LIME 논문에서는 $g$를 단순한 선형결합 모델인</p>
<p> $g(m_1,m_2,…,)=w_1 m_1+w_2 m_2+⋯$</p>
<p>을 사용했고, 마스크 $m_x$로 대표되는 각 슈퍼 픽셀 $π_x$의 영향의 정도를 $w_x$로 파악할 수 있게끔 설계했다. 
$L$은 손실함수로 슈퍼 픽셀 $π_x$에 대한 분류 모델 $f$의 예측 결과와 마스킹 데이터 $m_x$에 대한 회귀 모델 $g$의 검증 결과를 비교해 유사성을 계산한다</p>
<p><img src="https://images.velog.io/images/sjinu/post/d009e8d8-b893-4ec4-856d-402f26b4f4e1/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp즉, LIME은 손실함수가 최저가 되게 하는 슈퍼 픽셀 조합을 찾는다. 즉, 슈퍼 픽셀 $π_x$   의 모든 조합에 대한 $f$의 분류 결과와 $π_x$에 대응하는 마스킹 데이터 $m_x$에 대한 $g$의 결과값의 차이가 적게끔 학습한다. 이를 통해 모델 f가 가장 영향을 많이 받는 슈퍼 픽셀 π_x을 찾는다.
&amp;nbsp그렇게 찾은 슈퍼 픽셀의 조합(위 그림에서는 $π_1,π_3$)에 대해 해석 가능 모델 g를 학습시키게 된다. 그렇게 찾은 슈퍼 픽셀에 대응하는 마스킹 데이터 $m_1,m_3$을 사용하여 $g(m_1,m_3 )=w_1 m_1+w_3 m_3$의 선형 모델을 구성하고, $w_1,w_3$을 통해 $π_1,π_3$이 얼마만큼의 중요도를 갖는지 간접적으로 알 수 있게 된다.
위와 같은 과정으로부터 LIME은 복잡한 분류 모델인 $f$의 결정경계를 찾아야 한다는 것을 알 수 있다.
<img src="https://images.velog.io/images/sjinu/post/67a42254-f044-4579-8611-7f0e38d56c73/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp그림 5.10은 블랙박스 분류 모델 f과 유사한 결정을 내리는 설명 가능 모델 g를 구현하는 초기 과정이다. 흰색 영역은 ‘긍정’으로 분류되는 영역이고, 흑색 영역은 ‘부정’으로 분류되는 영역이다. 이 때 위 그림의 빨간색 원으로 나타나는 지점 x는 입력 이미지를 뜻한다. 설명 가능 모델 g는 위 그림에 나타나 있는 결정 경계를 흉내내야 한다.
&amp;nbsp이 때, 이전에 정의한 입력 이미지 x의 일부인 슈퍼 픽셀 π_x들을 적절히 조합한 슈퍼 픽셀 집합을 샘플링해서 입력 이미지와 유사한 주변 샘플들을 효과적으로 구할 수 있다. LIME은 이 주변 샘플들을 이용해 입력 이미지 x 근처를 조사해(f의 분류 결과를 살핌으로써) 결정경계를 구하는 것이다(논문에서는 샘플링 한 뒤 K-Lasso를 통해 근사적으로 결정 경계를 구한다). 
만약 샘플링하지 않고 영역 내 모든 샘플들을 조사함으로써 결정경계를 구하려 한다면 선형 모델로는 복잡한 결정 경계를 표현하지 못 할 뿐더러, 복잡한 결정 경계를 표현하기 위해 복잡한 모델을 택하는 것은 설명 가능성을 보장하지 못한다.
<img src="https://images.velog.io/images/sjinu/post/fa974626-fe11-42b4-b3b9-b2c9c624fd73/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp그림 5.12처럼 LIME은 입력 이미지 $x$ 근방을 샘플링한 뒤 얻은 $f(x)$와 주변 이미지 $z$를 입력으로 받은 $f(z)$의 출력과 비슷한 지, 그렇다면 얼마나 유사한지 (유사성 가중치를 사용해) 구한다. 주변 이미지들의 일부는 기존 입력 이미지 $x$와 같은 ‘긍정’으로 분류될 것이고, 나머지는 기존 입력 이미지 $x$와 반대되는 ‘부정’으로 분류될 것이다. 이로부터 다음과 같은 통찰을 얻을 수 있다(입력 이미지 $x$는 흰색 영역에 위치하기에 블랙박스 모델 $f$에 의해 ‘긍정’으로 분류된다는 것을 기억하자).
    주변 이미지가 ‘긍정’으로 분류되는 경우: 해당 주변 이미지는 예측에 도움이 되는 부분(슈퍼 픽셀, $π_x$)을 가지고 있다.
    주변 이미지가 ‘부정’으로 분류되는 경우: 해당 주변 이미지는 예측에 도움이 되지 않은 부분(슈퍼 픽셀, $π_x$)을 가지고 있다.
이렇게 입력 이미지와 샘플링된 주변 이미지를 사용하면 아래와 같이 $f$의 결정 경계를 (근사적으로) 찾아낼 수 있다.
<img src="https://images.velog.io/images/sjinu/post/66209f66-4442-47d6-b363-2bd13cbf1286/image.png" alt=""><code>출처 : XAI 설명 가능한 인공지능, 인공지능을 해부하다.</code></p>
<p>&amp;nbsp즉, LIME은 결정 경계를 탐색하기 위해 입력 이미지와 샘플링 된 주변 이미지를 사용하기 때문에 비교적 간단한 선형 함수를 설명 가능 모델 $g$로 택하더라도 결정 경계를 충분히 표현할 수 있다는 가정을 사용한다. 
$g(m_1,m_2,…,m_x )=w_1 m_1+w_2 m_2+⋯+w_x m_x$
(위의 식에서 $w_x$ 는 $m_x$ 의 중요도,즉 $π_x$ 의 중요도를 나타낸다.)</p>
<h4 id="lime의-장점">LIME의 장점</h4>
<ol>
<li>LIME은 분류에 사용한 블랙박스 모델 f가 무엇이든 적용할 수 있다(model-agnostic)</li>
<li>LIME은 딥 러닝이나 GPU 등을 사용하지 않고도 적용할 수 있는, 가벼운 XAI 기법이다. </li>
<li>LIME은 행렬로 표현 가능한 데이터(텍스트, 이미지)에 작동하는 XAI 기법이다. 서브모듈러를 찾고, 이를 이용해 설명하기 때문에 결과를 직관적으로 만들 수 있다.</li>
</ol>
<h4 id="lime의-단점">LIME의 단점</h4>
<ol>
<li><p>슈퍼 픽셀을 구하는 알고리즘과 모델 $g$의 결정 경계를 확정 짓는 방식이 비결정적(non-deterministic)이다. </p>
<ul>
<li>LIME은 슈퍼 픽셀 알고리즘에 따라 마스킹 데이터가 달라지며, 모델 g는 샘플링 위치에 따라 랜덤한 결과를 보일 수 있다.</li>
<li>이러한 비결정 문제는 ‘샘플링’을 사용하는 대부분의 문제에서 발생할 수 있다.</li>
</ul>
</li>
<li><p>LIME은 데이터 하나에 대한 설명이기 때문에 모델 전체에 대한 일관성을 보전하지 못한다.</p>
<ul>
<li>서브모듈러 픽(Submodular pick) 알고리즘을 사용한 SP-LIME으로 데이터세트 전체를 활용해 서브모듈러를 선정할 수 있게끔 보완하였다.</li>
</ul>
</li>
</ol>
<h1 id="lime-실습">LIME 실습</h1>
<h2 id="텍스트-데이터에-대한-설명explanation">텍스트 데이터에 대한 설명(Explanation)</h2>
<h3 id="데이터">데이터</h3>
<pre><code class="language-python">from sklearn.datasets import fetch_20newsgroups
# 뉴스 그룹에 대한 20가지 카테고리를 포함하는 dataset
newsgroups_train=fetch_20newsgroups(subset=&#39;train&#39;)
newsgroups_test=fetch_20newsgroups(subset=&#39;test&#39;)</code></pre>
<p>데이터는 뉴스 기사에 대해 20가지의 카테고리를 포함하는 sklearn의 dataset을 사용해보자.</p>
<p><code>데이터 요약</code>
<img src="https://images.velog.io/images/sjinu/post/a038db4f-f196-4465-a5a7-6ec6049be49b/image.png" alt="">
<code>데이터 개수</code>
<img src="https://images.velog.io/images/sjinu/post/66563149-0cfa-48ad-8d37-f7f637f30868/image.png" alt="">
텍스트를 분류하기 위해 단어의 빈도를 예측에 사용하는 나이브 베이즈 모델을 사용하도록 하자. </p>
<pre><code class="language-python">import sklearn
import sklearn.metrics
from sklearn.naive_bayes import MultinomialNB 

# TF-IDF를 사용한 전처리과정 : 문서(글)--&gt;벡터(숫자) 
vectorizer=sklearn.feature_extraction.text.TfidfVectorizer(lowercase=False) # 소문자 변환 x
train_vectors=vectorizer.fit_transform(newsgroups_train.data) # (데이터 샘플) x (단어 개수)의 matrix 
test_vectors=vectorizer.transform(newsgroups_test.data) # (데이터 샘플) x (단어 개수)의 matrix

# 학습 (나이브 베이즈)
nb=MultinomialNB(alpha=0.01)
nb.fit(train_vectors, newsgroups_train.target)

# 테스트
pred=nb.predict(test_vectors)
sklearn.metrics.f1_score(newsgroups_test.target, pred, average=&#39;weighted&#39;)</code></pre>
<blockquote>
<p>약 83.5%의 f1 score를 보인다.</p>
</blockquote>
<p>이제 위에 적용한 벡터화와 나이브 베이즈의 예측을 한 번에 진행하는 파이프라인을 만들고, 첫 번째 데이터에 대한 확률 예측 값을 출력하자.  </p>
<pre><code class="language-python">from sklearn.pipeline import make_pipeline
pipe=make_pipeline(vectorizer, nb) # 벡터화 + 나이브베이즈 모델

# 파이프라인을 이용해 데이터 하나에 대한 (벡터화+예측확률)을 반환하자. (fit, transform 과정이 불필요)
predict_classes=pipe.predict_proba([newsgroups_test.data[0]]).round(3)[0]

print(predict_classes)</code></pre>
<p><code>결과</code>
<img src="https://images.velog.io/images/sjinu/post/8e9c2386-35f3-4f4f-be9d-c87ac209093e/image.png" alt=""></p>
<blockquote>
<p>출력으로 특정 클래스에 속할 확률을 반환해야한다</p>
</blockquote>
<pre><code class="language-python">rank=sorted(range(len(predict_classes)), key=lambdda x:predict_classes[x], 
           reverse=True)
for rank_index in rank:
    print(&#39;[{:&gt;3}위]\t{:&lt;4}class ({:.1%})&#39;.format(rank.index(rank_index)+1,
                                                  rank_index, predict_classes[rank_index]))</code></pre>
<p><code>결과</code>
<img src="https://images.velog.io/images/sjinu/post/8f9582f2-175b-43e4-996a-23238405e87c/image.png" alt=""></p>
<p>&amp;nbsp위에 적용한 벡터화와 나이브 베이즈의 예측을 한 번에 진행하는 파이프라인을 만들고, 첫 번째 데이터에 대한 확률 예측 값을 출력하자. 여기까지가 일반적인 분류 모델이 (하나의 데이터에 대해) 할 수 있는 역할이다. 이제 해당 예측에 대해 LIME을 적용해보도록 하자.
LIME library는 기본적으로 텍스트 모듈, 이미지 모듈, 테이블 분류, 선형 공간 분류와 같은 모듈을 제공하고, 사용자가 직접 수정할 수 있는 이산 모듈과 설명 모듈을 제공한다. 텍스트 데이터이기 때문에 텍스트 모듈을 사용해 예측에 대한 설명을 진행하자.</p>
<pre><code class="language-python"># !pip install lime
from lime.lime_text import LimeTextExplainer
explainer=LimeTextExplainer(class_names=class_names)</code></pre>
<p>위의 explainer 객체는 LIME의 텍스트 하이라이트 알고리즘 객체이며, 매개변수로 피처 선택 방식, BOW(Bag of Words) 수행 방식, 커널 크기 등을 수동으로 지정할 수 있다. </p>
<pre><code class="language-python"># LIME 객체는 해석하고 싶은 데이터와 흉내내고 싶은 모델을 객체로 받는다.
exp=explainer.explain_instance(newsgroups_test.data[0], # 첫 번째 텍스트 데이터.
                              pipe.predict_proba,# 텍스트를 입력으로 받고,(벡터화를 거쳐) 카테고리 별 확률을 반환한다.
                              top_labels=1) # 가장 확률이 높은 클래스만 보여준다. </code></pre>
<p>&amp;nbsp이전의 개념에서는 이미지 데이터의 일부분인 슈퍼 픽셀 개념을 도입해 LIME의 작동방식을 설명하였으나, 텍스트에서는 (벡터화가 진행된) 텍스트 데이터의 부분 벡터(A bag of word)를 사용해 기존의 분류 모델(나이브 베이즈)을 모사하는 선형 모델을 학습한다. 
해당 선형 모델의 카테고리 분류 기준이 결정경계로 모사되며, 결정 경계에 걸리는 0번 데이터의 단어 집합이 서브 모듈로 출력된다. 즉, 결정경계 근처의 모듈이 ‘긍정,부정’을 가르는 ‘중요 요소’이다.</p>
<pre><code class="language-python"># LIME의 설명을 곧바로 확인하기.
exp.show_in_notebook(text=newsgroups_test.data[0])</code></pre>
<p><code>결과</code>
<img src="https://images.velog.io/images/sjinu/post/5081f790-0dbd-427b-8f22-3a408dd6f694/image.png" alt="">
<img src="https://images.velog.io/images/sjinu/post/704ec325-7aa3-4be3-b124-9d42d40380bc/image.png" alt=""><img src="https://images.velog.io/images/sjinu/post/640fdfd5-f67f-4fb6-b419-8a8f460ce27c/image.png" alt="">
&amp;nbsp이 때, submodular는 텍스트 하이라이트로 나타나있다. 즉, LIME이 기존의 분류 모델을 모사했을 경우 위에 나타난 서브 모듈러 조합(여기서는 단어 벡터의 조합)이 결정경계를 가장 잘 모사한다고 판단했고, 가중치는 선형 모델에서의 가중치와 동일할 것.
 이러한 가중치들을 바탕으로 자동차에 대한 사전지식이 없음에도 불구하고 분류 모델이 해당 데이터를 ‘자동차’로 분류했는지 파악할 수 있게 된다.
 <img src="https://images.velog.io/images/sjinu/post/83ed87db-cf76-4cbf-b58c-788052392b4f/image.png" alt=""><code>그림: 가중치가 높게 나온 88-89를 포함한 88-89 Bonneville을 검색한 결과</code>
 LIME의 단점에서 언급했듯이, LIME은 샘플링을 통해 결정 경계를 확정 짓기 때문에 코드를 실행할 때 마다 다른 결과를 보일 수 있다.
 <img src="https://images.velog.io/images/sjinu/post/b0a6a7f5-db2c-4d30-8bad-cf0e6179b85f/image.png" alt=""><img src="https://images.velog.io/images/sjinu/post/05e04126-947a-4517-970d-32111b0a0495/image.png" alt=""><img src="https://images.velog.io/images/sjinu/post/06cd8ce7-a600-4602-b055-c056c83a5623/image.png" alt=""></p>
<h2 id="이미지-데이터에-대한-설명explanation">이미지 데이터에 대한 설명(Explanation)</h2>
<h3 id="데이터-1">데이터</h3>
<p> 마찬가지로 sklearn의 내장된 데이터를 사용하도록 하자.</p>
<pre><code class="language-python">import numpy as np
import matplotlib.pyplot as plt
from skimage.color import gray2rgb, rgb2gray # sklearn-image
from skimage.util import montage # 일렬로 배열된 이미지를 커다란 사각형으로 재배열.
from sklearn.datasets import fetch_olivetti_faces</code></pre>
<p><code>입력</code></p>
<pre><code class="language-python">faces=fetch_olivetti_faces()

print(np.array(faces.images).shape) # 400개의 64x64 이미지이다.</code></pre>
<p><code>결과</code></p>
<pre><code class="language-python">(400,64,64)</code></pre>
<p>데이터는 아래와 같다.
<img src="https://images.velog.io/images/sjinu/post/252253a4-2dfa-4c7c-b892-7f2e981bb837/image.png" alt="">
LIME은 기본적으로 RGB 채널을 가지는 이미지에 대해서 사용가능하기 때문에 흑백 이미지를 RGB 이미지로 바꿔주어야 한다.</p>
<pre><code class="language-python">X_vec=np.stack([gray2rgb(iimg) for iimg in faces.images], 0) # 이미지를 컬러로 변환해 아래로 쌓는다.
y_vec=faces.target#.astype(np.uint8)

print(&#39;shape of X: &#39;, X_vec.shape,&#39;\n&#39;+&#39;shape of y: &#39;, y_vec.shape)</code></pre>
<p><code>결과</code>
shape of X:  (400, 64, 64, 1) 
shape of y:  (400,)</p>
<h3 id="이미지-분류-모델cnn">이미지 분류 모델(CNN)</h3>
<p>이미지 분류 모델로 간단한 CNN을 사용하도록 하자. 데이터의 규모가 작기 때문에 어떤 모델을 사용해도 괜찮다. 데이터세트를 학습 세트와 검증 세트로 나누도록 하자. </p>
<pre><code class="language-python">from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
X_train, X_test, y_train, y_test=train_test_split(X_vec,
                                                 y_vec,
                                                 train_size=0.8)
y_train=to_categorical(y_train)
y_test=to_categorical(y_test)
y_train_num=np.argmax(y_train, axis=1)
y_test_num=np.argmax(y_test, axis=1)</code></pre>
<p>모델을 아래와 같이 정의하자.</p>
<pre><code class="language-python">from keras.models import Sequential
from keras.layers import MaxPooling2D
from keras.layers import Conv2D
from keras.layers import Activation, Dropout, Flatten, Dense

num_classes=40

# 모델 구조 정의 
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=[64,64,3], padding=&#39;same&#39;)) #64,64,3
model.add(Activation(&#39;relu&#39;))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding=&#39;same&#39;))
model.add(Activation(&#39;relu&#39;))

model.add(Conv2D(64, (3, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

# 전결합층
model.add(Flatten())    # 벡터형태로 reshape
model.add(Dense(512))   # 출력
model.add(Activation(&#39;relu&#39;))
model.add(Dropout(0.5))
model.add(Dense(num_classes)) # 40개
model.add(Activation(&#39;softmax&#39;))

# 모델 구축하기
model.compile(loss=&#39;categorical_crossentropy&#39;,   # 최적화 함수 지정
    optimizer=&#39;rmsprop&#39;,
    metrics=[&#39;accuracy&#39;])
# 모델 확인
model.summary()</code></pre>
<p><img src="https://images.velog.io/images/sjinu/post/508b1d92-1f7a-4547-8f3f-93df1f33af40/image.png" alt="">
 모델이 클래스에 대한 예측 확률을 잘 반환하는지 확인하기 위해 학습되지 않은 모델에 테스트 데이터를 입력시켜 보자.</p>
<pre><code class="language-python">model.predict(X_train[0].reshape(-1,1))</code></pre>
<p><code>결과</code>
<img src="https://images.velog.io/images/sjinu/post/a6486e11-5b7d-4bb1-a487-ab59e5497411/image.png" alt="">
정상적으로 모델이 정의되었으므로, 모델을 학습시킨 후 테스트 세트를 이용해 정확도를 출력해보자.</p>
<pre><code class="language-python">from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
mc = ModelCheckpoint(&#39;best_model.h5&#39;, monitor=&#39;val_accuracy&#39;, save_best_only=True)
es = EarlyStopping(monitor=&#39;val_accuracy&#39;, verbose=1, patience=50)
model.fit(X_train, y_train, epochs=500,validation_split=0.2,callbacks=[es,mc])

# 모델 평가하기 
score = model.evaluate(X_test, y_test)
print(&#39;accuracy=&#39;, score[1])    # acc</code></pre>
<p><img src="https://images.velog.io/images/sjinu/post/39205171-1dda-4fea-8e0e-ac97be414138/image.png" alt=""></p>
<blockquote>
<p>92.5%의 정확도를 보인다.</p>
</blockquote>
<p>이러한 CNN 예측 모델을 대상으로 LIME을 적용하기 위해, LIME의 이미지 모듈을 불러오고 설명 객체를 할당하도록 하자.</p>
<h3 id="이미지에-lime-적용">이미지에 LIME 적용</h3>
<pre><code class="language-python">from lime import lime_image # 이미지 모듈
from lime.wrappers.scikit_image import SegmentationAlgorithm # LIME이 사용할 수 있게. 

explainer=lime_image.LimeImageExplainer()</code></pre>
<p>이 때 이미지를 슈퍼 픽셀로 분할하는 알고리즘을 직접 설정할 수 있다. quickshift, slic, felzenswalb 등이 존재한다. </p>
<pre><code class="language-python">segmenter=SegmentationAlgorithm(&#39;slic&#39;, 
                               n_segments=100, #이미지 분할 조각 개수
                               compactness=1, # 유사한 파트를 합치는 함수, log scale, default : 10
                               sigma=1) # 스무딩 역할, 0과 1 사이의 float</code></pre>
<p>이를 토대로 LIME 설명 객체를 이용해 데이터 하나에 대해 예측을 진행해보자. LIME 설명 객체의 매개변수로는 기본적으로 (1) 설명이 필요한 데이터 1개 (2) 해당 데이터에 대해 분류를 진행 할 분류 모델 을 필요로 한다. 이번에는 추가로 정교한 분석을 위해 확률 기준 상위 5개의 후보를 반환하고(top_labels), 샘플링 개수를 설정하고(num_samples), 위에서 정의했던 설정대로 이미지를 분할하도록 하자(segmentation_fn).   </p>
<pre><code class="language-python">olivetti_test_index=0

exp=explainer.explain_instance(X_test[olivetti_test_index], #데이터하나
                              classifier_fn=model.predict,# 40 class의 확률 반환 (softmax)
                              top_labels=5, # 확률 기준 1-5위 분석
                               num_samples=1000,# 샘플링 공간
                              segmentation_fn=segmenter) # 이전에 lime의 형식에 맞게 래핑된 분할 알고리즘</code></pre>
<p>이 때, sklearn의 regressor가 기본 설명 모델로 쓰인다. classifier_fn 매개변수에는 ‘카테고리에 속할 확률’을 반환하는 분류 모델을 전달해야 한다. 위에서 정의한 CNN 모델은 마지막에 softmax 활성화 함수를 거치기 때문에 각 클래스에 속할 확률을 정상적으로 반환한다. sklearn의 분류기에서는 classifier.predict_proba로 전달할 수 있다.
 LIME 설명기, 데이터, 그리고 예측 모델을 이용해 설명 값을 반환했으므로 이를 아래와 같은 코드로 시각화하도록 하자. </p>
<pre><code class="language-python">from skimage.color import label2rgb # 

# 캔버스
fig, ((ax1, ax2), (ax3, ax4))=plt.subplots(2,2,figsize=(8,8))
ax=[ax1,ax2,ax3,ax4]
for i in ax:
    i.grid(False)
# 예측에 가장 도움되는 세그먼트만 출력
temp, mask=exp.get_image_and_mask(y_test_num[0],
                                 positive_only=True, # 설명 모델이 결과값을 가장 잘 설명하는 이미지 영역만 출력
                                 num_features=8, # 분할 영역의 크기
                                 hide_rest=False) # 이미지를 분류하는 데 도움이 되는 서브모듈 외의 모듈도 출력
# label2rgb : 형광색 마스킹
ax1.imshow(label2rgb(mask, temp, bg_label=0), interpolation=&#39;nearest&#39;)
ax1.set_title(&#39;Positive Regions for {}&#39;.format(y_test_num[0]))

# 모든 세그먼트 출력
temp, mask=exp.get_image_and_mask(y_test_num[0],
                                 positive_only=False, # 설명 모델이 결과값을 가장 잘 설명하는 이미지 영역만 출력
                                 num_features=8, # 분할 영역의 크기
                                 hide_rest=False) # 이미지를 분류하는 데 도움이 되는 서브모듈 외의 모듈도 출력

ax2.imshow(label2rgb(4-mask, temp, bg_label=0), interpolation=&#39;nearest&#39;) # 역변환
ax2.set_title(&#39;Positive/Negative Regions for {}&#39;.format(y_test_num[0]))

# 이미지만 출력
ax3.imshow(temp, interpolation=&#39;nearest&#39;)
ax3.set_title(&#39;Show output image only&#39;)

# 마스크만 출력
ax4.imshow(mask, interpolation=&#39;nearest&#39;) # 정수형 array.
ax4.set_title(&#39;Show mask only&#39;) # 정수형
</code></pre>
<p><img src="https://images.velog.io/images/sjinu/post/68319ede-5909-439e-84fd-4d43ef10e774/image.png" alt=""></p>
<p>추가로, CNN의 이미지 분류 모델은 93%의 정확도를 보였었다. </p>
<pre><code class="language-python">from sklearn.metrics import classification_report
y_pred=model.predict(X_test)
y_pred_num=np.argmax(y_pred, axis=1)
print(classification_report(y_true=y_test_num, y_pred=y_pred_num))</code></pre>
<p><img src="https://images.velog.io/images/sjinu/post/51cdc37a-fdca-4a11-b8a7-0df93554cb35/image.png" alt=""><img src="https://images.velog.io/images/sjinu/post/42604c2c-307e-40cf-8edf-5c28d78476f1/image.png" alt="">
이 중 잘 분류한 1번, 38번을 대상으로 LIME을 시행할 경우 아래와 같다
<img src="https://images.velog.io/images/sjinu/post/5f5ec259-e4e1-4e27-8191-ee647124db5b/image.png" alt="">
 그 외에, 실질적으로 기존 데이터의 target을 잘 못 예측한 클래스는 3, 6, 11, 14, 16, 28 등이 있다. 이 중 28번째 클래스, 즉 28번째 사람에 대해 예측한 데이터를 분석하도록 하자.</p>
<pre><code class="language-python">np.where(y_test_num==28)</code></pre>
<p><code>결과: array([37,52,73])</code>
 test data의 37번째 data를 이용해 자세한 분석을 시행하자.</p>
<pre><code class="language-python">%matplotlib inline
## 조금 더 자세히 출력하자. (기존의 )
test_idx=37
exp=explainer.explain_instance(X_test[test_idx], #데이터하나
                              classifier_fn=model.predict,# 40 class의 확률 반환 (softmax)
                              top_labels=5, # 확률 기준 1-5위 분석
                               num_samples=1000,# 샘플링 공간
                              segmentation_fn=segmenter) # 이전에 lime의 형식에 맞게 래핑된 분할 알고리즘

fig,m_axs=plt.subplots(2,5, figsize=(10,4))

for i, (c_ax, gt_ax) in zip(exp.top_labels, m_axs.T):
    temp, mask=exp.get_image_and_mask(i,
                                         positive_only=True, # 설명 모델이 결과값을 가장 잘 설명하는 이미지 영역만 출력
                                         num_features=12, # 분할 영역의 크기
                                         hide_rest=False, # 이미지를 분류하는 데 도움이 되지 않는 세그먼트는 출력 x
                                         min_weight=0.001) 
    c_ax.imshow(label2rgb(mask, temp, bg_label=0),
               interpolation=&#39;nearest&#39;)
    c_ax.set_title(&#39;Positive for {}\nScore:{:2.2f}%&#39;.format(i,
                                                           100*y_pred[test_idx, i]))
    c_ax.axis(&#39;off&#39;)

    face_id=np.random.choice(np.where(y_train_num==i)[0])

    gt_ax.imshow(X_train[face_id])
    gt_ax.set_title(&#39;Example of {}&#39;.format(i))
    gt_ax.axis(&#39;off&#39;)</code></pre>
<p>이 코드는 왜 CNN 모델이 28번째 사람을 36번째의 사람으로 오해했는지, 어떤 영역을 보고 잘 못 판단했는지 세그먼트를 출력해준다.
<img src="https://images.velog.io/images/sjinu/post/170e9915-ded2-4a43-a329-74e57044884b/image.png" alt="">
잘 못 판단한 첫 번째 사진의 경우 입 주변, 코, 그리고 눈을 위주로 살펴보았다. 아무래도 수염이 있는 걸로 인식이 된걸까? 그 외에 제대로 판단한 두 번째 사진의 경우 눈을 판단 근거로 삼지 않고 주로 볼과 광대 위주로 보고 판단한 것을 알 수 있다.
예시로 사용된 얼굴 이미지의 경우 풍경 사진, 동물 사진 등과 같이 구분 영역이 뚜렷하지는 않기 때문에 여전히 사용자가 보기에 이해가 힘든 부분이 있을 수 있고, 이미지 분할 알고리즘과 하이퍼 파라미터 설정, 설명 모델 선택, 샘플링 개수 등에 따라서 설명 방식 또한 달라질 수 있다. 그렇기 때문에 얼굴 이미지와 같이 비교적 판단하기 어려운 데이터들은 설정 값을 다양하게 변경하면서 설명 모델의 분석을 관찰 할 필요가 있다고 생각한다.</p>
<h4 id="여담">여담</h4>
<p><img src="https://images.velog.io/images/sjinu/post/3b47ce87-edf1-413d-bdee-af42213574de/image.png" alt="">
개인적으로 생각하기에 36번님의 특징은 수염인 것 같은데, 생각보다 수염에 집중하지는 않는다. 이러한 사실은 이미지 분류 모델에 LIME을 적용하기 이전에 이미지 분할(Segmentation) 알고리즘에 대해서도 충분히 살펴보고, 작동 방식에 대해 어느정도 이해해야 할 필요성을 내포한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[1주차] XAI 기본개념 + xgboost]]></title>
            <link>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-XAI-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90-xgboost</link>
            <guid>https://velog.io/@tobigs_xai/1%EC%A3%BC%EC%B0%A8-XAI-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90-xgboost</guid>
            <pubDate>Sat, 10 Apr 2021 14:18:17 GMT</pubDate>
            <description><![CDATA[<p>Xai는 기존 인공지능 위에 설명성을 부여하는 기법입니다. 따라서 전통적인 머신러닝 모델 혹은 딥러닝 모델에만 적용할수 있는 xai 기법도 있고, 모델의 제약 없이 적용 가능한 방법도 있습니다.</p>
<p>4단원에서는 전통적인 머신러닝에 적용가능한 xai기법을 배울 것입니다.</p>
<h3 id="feature-importance-피쳐-중요도--permutation-importance">Feature Importance (피쳐 중요도, = permutation importance)</h3>
<h4 id="--개념">- 개념</h4>
<ul>
<li>데이터의 피쳐가 알고리즘의 정확한 분류에 얼마나 큰 영향을 미치는지 분석하는 기법</li>
<li>특정 피쳐의 값을 임의의 값으로 치환했을 때 원래 데이터보다 예측 에러가 얼마나 더 커지는지를 측정하는 것</li>
<li>특정 피쳐를 변형했을 때 모델의 예측 결과가 크게 달라졌다면, 모델은 이 피쳐에 대한 의존도가 높고, 이 피쳐는 중요도가 높다</li>
<li>피쳐 간 의존성이 낮을 때 적합</li>
</ul>
<h4 id="--계산-방법">- 계산 방법</h4>
<ol>
<li>주어진 모델의 에러를 측정한다 (e_original)</li>
<li>피쳐 매트릭스 X의 피쳐 k개에 대하여
a. 피쳐 k를 매트릭스 X에서 임의의 값으로 변경하여 피쳐 매트릭스 X_permutation을 만든다
b.  바꾼 X로 모델 에러 측정 (e_permutation)
c. 피쳐 중요도 산정 (e_permutation/e_original 또는 에러의 차이)</li>
<li>피쳐 중요도를 구한다</li>
</ol>
<h3 id="부분-의존성-플롯-pdp">부분 의존성 플롯 (PDP)</h3>
<h4 id="--개념-1">- 개념</h4>
<ul>
<li>영향력을 알고싶은 피쳐의 수치를 선형적으로 변형하면서 목표값(y) 얼마나 증감하는지를 시각화</li>
<li>피쳐 자체를 변형했던 피쳐 중요도 방법과 달리 피쳐의 수치를 변형</li>
<li>피쳐의 값이 변할 때 모델에 미치는 영향을 가시적으로 이해 가능 (직관적)</li>
<li>pdpbox 패키지로 구현</li>
<li>부분의존성이 계산되는 피쳐는 다른 피쳐들과 상관관계가 없다고(독립성) 가정</li>
<li>최대 3차원까지만 표현이 가능하기 때문에 1개 또는 2개의 피쳐에 대해서만 시각화 가능</li>
</ul>
<p>다음은 PDP의 예시입니다. 
<img src="https://images.velog.io/images/tobigs_xai/post/ae289b7a-504f-495f-8273-cec7459f9319/image.png" alt="">
주어진 기간에 대여될 자전거의 수를 예측하는 문제에서 부분의존성을 그린 플롯입니다. 너무 춥거나 덥지 않을 때에 자전거 대여량이 많고, 습도가 너무 높아지면 자전거 대여량이 적어집니다. 
여기서 염두에 둘 부분은 데이터의 분포입니다. 풍속이 높은 경우에는 대여량이 낮은 상태에서 변화하지 않는 것처럼 보이는데, 그래프 하단의 데이터 분포를 보면 이것은 데이터가 없어서 나타난 현상입니다.
<img src="https://images.velog.io/images/tobigs_xai/post/48450167-9b45-4e99-a46b-adf15fbc9e95/image.png" alt="">
영향력을 알고 싶은 피쳐 &#39;Glucose&#39; 값을 고정했을 때 다른 피쳐들의 조합으로 나타난 결과가 하늘색 음영에 해당하는 부분입니다. 이 값들을 평균하여 부분의존성을 구합니다.
**Y축 : 영향력을 알고싶은 결과값. ex)자전거 대여 수, 집값 등</p>
<h4 id="--계산-방법-1">- 계산 방법</h4>
<p>출처 - <a href="https://www.youtube.com/watch?v=hV6FsDBMtx0">https://www.youtube.com/watch?v=hV6FsDBMtx0</a>
(PDP에 대해 설명이 잘 되어있는 영상이니 참고하시면 좋을것 같습니다 :) )
<img src="https://images.velog.io/images/tobigs_xai/post/f973efeb-14ad-4f52-a649-aac0a0a85564/PDP%20function.png" alt="">
부분 의존성 함수는 다음과 같이 정의됩니다
<img src="https://images.velog.io/images/tobigs_xai/post/7f392940-c641-4be4-bd97-4d93baeaf70a/image.png" alt="">
몬테카를로 방법을 이용하여 부분함수는 다음과 같이 추정됩니다
<img src="https://images.velog.io/images/tobigs_xai/post/ec2c4fdb-b86f-4362-9796-c5531bbfdebb/image.png" alt="">
x_s는 부분 의존성 함수가 시각화할 피쳐, x_c는 해당 피쳐를 제외한 나머지 피쳐들로 타겟변수(y)의 변화 예측 시에 사용됩니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/1f7be519-0a29-4f4c-a170-827e0b7fa87a/PD%20Function.png" alt=""></p>
<h3 id="xgboost">XGBoost</h3>
<h4 id="--개념-2">- 개념</h4>
<p>XGBoost는 기본적으로 부스팅 기법을 사용합니다. 부스팅의 원리는 정규세션 Ensemble 강의에서 설명했었습니다
<img src="https://images.velog.io/images/tobigs_xai/post/227207d5-214e-4cd8-86d8-a2f818cb2db3/image.png" alt=""></p>
<p>XGBoost는 GBM의 구조와 아주 유사한 구조를 가지고 있습니다.
출처 - <a href="https://www.youtube.com/watch?v=OtD8wVaFm6E">https://www.youtube.com/watch?v=OtD8wVaFm6E</a>
이 영상 또한 XGBoost의 계산 과정을 자세히 설명하고 있으니 참고하세요~</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/b2c8842a-7b48-4102-ad1d-cd682f6f9f18/image.png" alt="">
XGBoost는 Greedy Algorithm을 통해 약분류기 트리 M(X), G(X), H(X)를 생성하고, 분산처리를 통해 각 트리의 가중치를 빠르게 찾아냅니다.
$$
Y = \alpha M(X)+ \beta G(X) +\gamma H(X) +error
$$
우리가 예측하고자 하는 타겟 Y는 위와 같이 예측됩니다.</p>
<p>XGBoost의 과정을 정리하자면 다음과 같습니다.
<img src="https://images.velog.io/images/tobigs_xai/post/3762a472-6d43-48fd-9678-88a64edb7262/image.png" alt="">
<img src="https://images.velog.io/images/tobigs_xai/post/6783b4e1-b0d0-488a-b035-e60347946318/image.png" alt="">
먼저, split을 한 후, 각 child 노드의 Similarity와 Information Gain을 계산합니다.
<img src="https://images.velog.io/images/tobigs_xai/post/0826ce4a-699a-48e6-b1dd-6938a73797a8/image.png" alt="">
gamma는 사용자가 지정한 트리 복잡도 파라미터입니다. Gain에서 gamma를 뺀 값이 음수이면 해당 branch를 prune합니다.
<img src="https://images.velog.io/images/tobigs_xai/post/1bb5f7bb-3f96-4279-9f8d-cf5448334dfd/image.png" alt="">
Pruning 결정 후, 트리가 완성되면 각 leaf node의 output values를 계산합니다.
<img src="https://images.velog.io/images/tobigs_xai/post/3a3c534d-f4f0-4d2e-bbce-4c9836bb0d04/image.png" alt="">
lambda는 오버피팅을 방지하는 역할을 하며, output value와 similarity score의 분모에 더해줍니다. </p>
<h4 id="--특징">- 특징</h4>
<p>XGBoost는 다음과 같은 6가지 특징을 가지고 있습니다. 이 중, 과정 설명 부분에서 다루어지지 않은 Parallelized tree building과 Efficient handling of missing data에 대해 더 자세히 살펴보겠습니다. Cache awareness and out-of -core computing부분은 기술적인 부분에 속해 다루지 않겠습니다. 더 궁금하신 분은 논문이나 자료를 참고해주세요~</p>
<p>참고자료 - <a href="https://www.youtube.com/watch?v=VHky3d_qZ_E">https://www.youtube.com/watch?v=VHky3d_qZ_E</a> (논문 내용 설명 강의- 강필성교수님)
논문 - <a href="https://arxiv.org/pdf/1603.02754.pdf">https://arxiv.org/pdf/1603.02754.pdf</a>
<img src="https://images.velog.io/images/tobigs_xai/post/5b96f79c-3bd4-4e79-9d9b-818f51a7c59a/image.png" alt=""></p>
<p>*<em>1. Parallelized tree builing *</em></p>
<ul>
<li><strong>Split Finding</strong>
<img src="https://images.velog.io/images/tobigs_xai/post/47315b1e-bc38-43f6-af81-eb4d4072c2eb/image.png" alt=""></li>
</ul>
<p><img src="https://images.velog.io/images/tobigs_xai/post/72d8615f-3621-4491-aff9-0a193dd5b79f/image.png" alt="">
여러개의 bucket으로 데이터를 split하여 각 분기점의 gradient를 계산합니다. 이 때, 전체 데이터를 이용하는 것이 아니라 한 bucket 내의 데이터만을 이용합니다. 기존의 greedy algorithm을 사용하였다면 40개의 데이터가 있을 때, 39번 계산을 해야하지만, 이 방법(Approximation)을 사용하면 30번만 연산하면 됩니다. 가장 중요한 점은 각 bucket을 병렬처리 할 수 있다는 점입니다. 첫번째 bucket은 Thread1에서, 두번째는 Thread 2에서 ... 등으로 동시에 처리가 가능합니다.</p>
<ul>
<li><strong>Global variant vs Local variant</strong>
child node의 bucket을 나누는 두가지 방법이 존재합니다.
먼저, Global variant 방식은 다음과 같이 전체 child에서 bucket의 수를 유지하는 방법입니다.
<img src="https://images.velog.io/images/tobigs_xai/post/625c150d-ac48-4066-b24f-9085d00a8161/image.png" alt="">
반면, Local variant 방식은 child node 하나에서 bucket의 수를 유지하는 방법입니다.
<img src="https://images.velog.io/images/tobigs_xai/post/31b50882-f554-4ba2-ba30-4df701e6a96e/image.png" alt=""></li>
</ul>
<p>두 방법에 따른 AUC 성능 결과는 다음과 같습니다. 
<img src="https://images.velog.io/images/tobigs_xai/post/be49c4f6-5992-4a70-85c2-bd3b0b5963c6/image.png" alt="">
둘 중 어떤 방법이 절대적으로 더 우세한 것은 아닙니다. 다만, global variant 방식을 사용할 때에는 eps 를 좀 더 크게 두어야 한다는 것을 보여줍니다.</p>
<p><strong>2. Efficient handling of missing data - sparsity aware algorithm</strong></p>
<p>XGBoost에서는 결측치를 다룰 때, 학습 과정에서 각 split별로 default direction을 정의한 후, test data에서 결측치가 발견되면 default direction대로 split하는 방식을 사용합니다.
<img src="https://images.velog.io/images/tobigs_xai/post/e37f4bab-ffb4-4082-9155-219928072978/image.png" alt="">
오른쪽으로 missing value를 보낸 결과와 왼쪽으로 보낸 결과를 비교해보면 왼쪽으로 보낸 결과가 이 split에서는 더 결과가 좋습니다. 따라서 이 split에서의 default direction은 왼쪽입니다.</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/16151a89-d21e-47c6-ad99-3414169e943c/image.png" alt="">
예시를 통해 보겠습니다. 첫번째 split에서는 default direction이 왼쪽이고, 두번째 split에서는 오른쪽입니다. 이 경우에, X1,X2,X3를 분류하면 위 그림과 같이 분류됨을 알 수 있습니다. 오른쪽 그래프를 보면, 이러한 sparsity aware algoritmn을 통해 tree를 만드는 시간을 단축했음을 알 수 있습니다.</p>
<p>뿐만 아니라 XGBoost는 이러한 특징들도 가지고 있습니다.</p>
<ul>
<li>xgboost 분류기 아래에 다른 알고리즘을 붙여서 앙상블 학습이 가능 (이미지 Transfer Learning처럼)</li>
<li>평가함수,목적함수 등 옵션을 자유롭게 선택 가능해서 유연성이 좋다</li>
<li>Cross validation 기반</li>
</ul>
<h4 id="--수식">- 수식</h4>
<p>책에 나와있는 Objective function과 Loss를 수식 표현에 관심이 있으신 분들은
<a href="https://www.youtube.com/watch?v=ZVFeW798-2I">https://www.youtube.com/watch?v=ZVFeW798-2I</a> 을 참고하시면 도움이 될 것입니다 :)</p>
<h4 id="--parameters">- Parameters</h4>
<p>XGBoost의 파라미터는 크게 일반, 부스터, 학습과정으로 나뉩니다.</p>
<p>&lt;파라미터&gt; 일반, 부스터, 학습과정
① 일반 파라미터 
    booster : 어떤 부스터 구조를 쓸지 결정 – gbtree, gblinear, dart
    nthread : 몇 개의 쓰레드를 동시에 처리할지 – 디폴트 : 가능한 많이
    num_feature : feature 차원의 숫자를 정하는 옵션 – 디폴트 : 가능한 많이</p>
<p>② 부스팅 파라미터
    eta : learning rate 
    gamma : 트리 복잡도 파라미터. 커지면 트리 깊이가 줄어들어서 보수적인 모델이 된다. – 디폴트 : 0
    max_depth : 한 트리당 깊이 – 디폴트 : 6, 키울수록 과적합 위험 ↑
    lambda : L2 Regularization Form에 달리는 weights이다. 숫자가 클 수록 보수적인 모델이 된다.
    alpha : L1 Regularization Form weights. 숫자가 클수록 보수적인 모델이 된다.</p>
<p>③ 학습 과정 파라미터 
    object : 목적함수. reg-linear(linear-regression), binary-logistic(binary-logistic classification), 
            count-poission(count data poison regression) 등 다양하다.
    eval_metric : 모델의 평가 함수를 조정하는 함수다.  Rmse(root mean square error), log loss(log-likelihood), 
            MAP(mean average precision) 등, 해당 데이터의 특성에 맞게 평가 함수를 조정한다.</p>
<p>④ 커맨드 라인 파라미터
    num_rounds : boosting 라운드를 결정. 적당히 큰 것이 좋고 epoch 옵션과 동일하다.</p>
<h2 id="실습코드">실습코드</h2>
<ul>
<li>XGBoost 시각화<pre><code class="language-python"># plot decision tree
from numpy import loadtxt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
from xgboost import plot_tree      #xgboost 시각화 함수
import matplotlib.pyplot as plt
</code></pre>
</li>
</ul>
<p>from matplotlib.pylab import rcParams
##set up the parameters
rcParams[&#39;figure.figsize&#39;] = 100,200</p>
<h1 id="load-data">load data</h1>
<p>dataset = pd.read_csv(&#39;diabetes.csv&#39;, delimiter=&quot;,&quot;)</p>
<h1 id="split-data-into-x-and-y">split data into X and y</h1>
<p>X = dataset.iloc[:, 0:8]
y = dataset.iloc[:, 8]</p>
<p>x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=7)
print(len(y_train), len(y_test))</p>
<h1 id="fit-model-no-training-data">fit model no training data</h1>
<p>model = XGBClassifier(
    booster=&#39;gbtree&#39;,
    objective=&#39;binary:logistic&#39;,
    learning_rate=0.03,
    n_estimators=150,
    reg_alpha =0.15,
    reg_lambda=0.7,
    max_depth=4,
    subsample=1
)</p>
<p>model.fit(x_train, y_train)</p>
<h1 id="plot-single-tree">plot single tree</h1>
<p>plot_tree(model)
plt.show()</p>
<h1 id="make-predictions-for-test-data">make predictions for test data</h1>
<p>y_pred = model.predict(x_test)
predictions = [round(value) for value in y_pred]</p>
<h1 id="evaluate-predictions">evaluate predictions</h1>
<p>accuracy = accuracy_score(y_test, predictions)
print(&quot;Accuracy: %.2f%%&quot; % (accuracy * 100.0))</p>
<pre><code>![](https://images.velog.io/images/tobigs_xai/post/527e8599-38db-4862-983e-2a0e46db010a/image.png)
XGBoost 모델이 생성한 최종 Tree를 시각화한 모습입니다.

* Feature Importance
```python
from xgboost import plot_importance
rcParams[&#39;figure.figsize&#39;] = 10, 10
plot_importance(model)
plt.yticks(fontsize=15)
plt.show()</code></pre><p><img src="https://images.velog.io/images/tobigs_xai/post/6ce88e7b-c0e3-4ff8-b813-e38c8418ca7a/image.png" alt="">
Tree depth가 3일때, 피마 인디언의 당뇨병을 진단하는 데 가장 중요한 요소는 Glucose입니다. 
다만, 피쳐 중요도의 순서가 Decision Tree의 split 기준 변수의 순서는 아닙니다. DT는 Information gain을 기준으로 노드와 split 기준을 선정하지만, Feature Importance는 분류에러가 기준이기 때문입니다.
일반적으로는 순서가 대부분 일치하지만, 기준이 다르기에 항상 같지는 않습니다.</p>
<p>Tree의 depth가 달라지면 Tree와 그 정확도와 그 정확도도 달라지기 때문에 Feature importance도 달라질 수 있습니다.</p>
<ul>
<li>PDP Plot - pdpbox 모듈을 이용</li>
<li>target plot<pre><code class="language-python">from pdpbox import pdp, info_plots, get_dataset
pima_data = dataset
pima_features = dataset.columns[:8]
pima_target = dataset.columns[8]
</code></pre>
</li>
</ul>
<p>fig, axes, summary_df = info_plots.target_plot(
    df=pima_data, feature=&#39;BloodPressure&#39;, feature_name=&#39;BloodPressure&#39;, target=pima_target
)</p>
<pre><code>![](https://images.velog.io/images/tobigs_xai/post/b4cef29e-1893-41fc-a30b-811655ea2887/image.png)
x축은 혈압, 왼쪽 Y축(막대그래프)은 각 수치 구간별 데이터 개수(count), 오른쪽 Y축은 당뇨병 진단비율, 각 막대는 구간별 데이터를 의미한다.
특이한 점은, target plot을 만들 때에는 모델을 함수 input으로 받지 않는다. 이것은 학습 데이터를 철저하게 분석할 수 있으면 모델을 예측할 수 있는 믿음을 바탕으로 하기 때문이라고 한다. 실제로 plot을 보면 모델의 예측값이 필요하지 않음을 알 수 있다. (EDA 시각화 느낌)

-pdp plot
```python
pdp_gc = pdp.pdp_isolate(
    model=model, 
    dataset=pima_data, 
    model_features=pima_features,
    feature=&#39;Glucose&#39;
)

#  plot information
fig, axes = pdp.pdp_plot(
    pdp_gc, 
    &#39;Glucose&#39;, 
    plot_lines=False, 
    frac_to_plot=0.5, 
    plot_pts_dist=True
)</code></pre><p><img src="https://images.velog.io/images/tobigs_xai/post/f55a0a00-af0b-4b4e-b137-5e6c0948dccd/image.png" alt=""></p>
<p>plot lines 옵션을 True로 두면 이러한 plot을 그릴 수 있습니다.
<img src="https://images.velog.io/images/tobigs_xai/post/81424d7e-9a24-4967-a5cd-d341809bb828/image.png" alt=""></p>
<p>-target plot interact
데이터 전체에 대한 당뇨변 진단 결과를 그리고, feature간 관계를 표시</p>
<pre><code>fig, axes, summary_df = info_plots.target_plot_interact(
    df=pima_data, 
    features=[&#39;BloodPressure&#39;, &#39;Glucose&#39;], 
    feature_names=[&#39;BloodPressure&#39;, &#39;Glucose&#39;], 
    target=pima_target
)</code></pre><p><img src="https://images.velog.io/images/tobigs_xai/post/10054820-6446-43d7-8bce-0d0448cbef8a/image.png" alt="">
데이터 수 = 원의 크기 , 색이 진할수록 당뇨병 확률이 높음</p>
<ul>
<li>pdp interact<pre><code class="language-python">pdp_intertatcion = pdp.pdp_interact(
  model=model, 
  dataset=pima_data, 
  model_features=pima_features, 
  features=[&#39;BloodPressure&#39;, &#39;Glucose&#39;]
)
</code></pre>
</li>
</ul>
<p>fig, axes = pdp.pdp_interact_plot(
    pdp_interact_out=pdp_intertatcion, 
    feature_names=[&#39;BloodPressure&#39;, &#39;Glucose&#39;], 
    plot_type=&#39;contour&#39;, 
    x_quantile=True, 
    plot_pdp=True
)</p>
<p>```
<img src="https://images.velog.io/images/tobigs_xai/post/153c9ba1-1981-4266-a3ab-79f118bbe179/image.png" alt="">
x축과 평행한 부분 : Glucose에 더 의존적
y축평행/종모양 부분: BloodPressure에 더 의존적 
<img src="https://images.velog.io/images/tobigs_xai/post/5a330a5d-8a57-447a-9859-9c1af693dc17/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>참고자료</p>
<ul>
<li>PDP
<a href="https://eair.tistory.com/20">https://eair.tistory.com/20</a></li>
<li>XGBoost
<a href="https://zzsza.github.io/data/2018/07/03/xgboost/">https://zzsza.github.io/data/2018/07/03/xgboost/</a>
<a href="https://www.youtube.com/watch?v=VHky3d_qZ_E">https://www.youtube.com/watch?v=VHky3d_qZ_E</a>
<a href="https://www.youtube.com/watch?v=OtD8wVaFm6E">https://www.youtube.com/watch?v=OtD8wVaFm6E</a>
15기 정규세션 Ensemble 강의자료</li>
</ul>
<h2 id="추가-질문-답변">추가 질문 답변</h2>
<p>Q1) PDP 플롯 
PDP 원본 논문 : <a href="https://statweb.stanford.edu/~jhf/ftp/trebst.pdf">https://statweb.stanford.edu/~jhf/ftp/trebst.pdf</a> (40페이지 정도로 꽤나 방대한 분량입니다...)</p>
<p><img src="https://images.velog.io/images/tobigs_xai/post/4ff10a62-c3af-4505-8dda-d6191b32aa37/image.png" alt="">
X축: 변화시킬 변수, Y축: 변화를 알고싶은 값.
위 그래프에서는 변수 중요도와 sqft(넓이) , 화장실 수, 침실 수(X축들)에 따른 가격 변화(Y축)를 나타내었다. 평균값을 plot한 것.</p>
<p>결국, 이 plot을 예시로 들면,
<img src="https://images.velog.io/images/tobigs_xai/post/051118af-5019-418b-a5f6-11b67d925062/image.png" alt="">
 sqft_above, bathrooms, bedrooms, sqft_basement, sqft_lot, yr_built 변수 6개를 통해 집값을 예측하는데
관심이 있는 변수 x_1: bathrooms(화장실 수), 나머지 변수: x_1을 제외한 모든 변수(5개)
Y축 : 집값을 나타냄. 나머지 변수 5개를 변화시킨 평균. </p>
<p>이 때, 평균을 구하는 법: 주변분포처럼. (주변화)
<img src="https://images.velog.io/images/tobigs_xai/post/fd21f08d-d68f-4a25-9d00-00d83d972c97/image.png" alt="">
출처: <a href="https://blog.naver.com/mykepzzang/220837645914">https://blog.naver.com/mykepzzang/220837645914</a></p>
<p>PDP는 주변분포의 개념을 적용한 것입니다. 주변 분포를 구하듯 나머지 변수를 변화시키는 방법을 이용하는 것 같습니다.</p>
<blockquote>
<p>참고링크
<a href="https://blogsaskorea.com/116">https://blogsaskorea.com/116</a>
<a href="http://ds.sumeun.org/?p=1954">http://ds.sumeun.org/?p=1954</a>
<a href="https://blog.naver.com/mykepzzang/220837645914">https://blog.naver.com/mykepzzang/220837645914</a>
<a href="https://m.blog.naver.com/tjdrud1323/221740255370">https://m.blog.naver.com/tjdrud1323/221740255370</a>   =&gt; 가장 자세히 설명되어있습니다.</p>
</blockquote>
<p>Q2) XGBoost 병렬 처리 어떻게 하는지</p>
<p>답변 1) <a href="https://medium.com/blablacar/thinking-before-building-xgboost-parallelization-f1a3f37b6e68">https://medium.com/blablacar/thinking-before-building-xgboost-parallelization-f1a3f37b6e68</a>
Branch level: 각각의 tree branch가 따로따로 train 된다. =&gt; 이 방법이 앞에서 설명한 bucket 나누는 방식으로 추정.
2가지 병렬처리 방법
<img src="https://images.velog.io/images/tobigs_xai/post/ab8ea081-3f56-43e9-95ea-8ca0963fc40b/image.png" alt=""></p>
<p>답변 2) <a href="https://m.blog.naver.com/nicolechae0627/221811579005">https://m.blog.naver.com/nicolechae0627/221811579005</a>, <a href="http://machinelearningkorea.com/2019/07/25/xgboost-%EC%9D%98-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C/">http://machinelearningkorea.com/2019/07/25/xgboost-%EC%9D%98-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C/</a></p>
<p>3가지 방법</p>
<p>방식1. Parallelize Node Building at Each Level 분기 나뉜것을 각각 병렬처리</p>
<p>트리 레벨마다 노드의 생성을 병렬처리 방식으로 생성한다.Split된 노드들에 각각 cpu코어를 할당해 병렬처리한다.(병렬처리의 기준은 트리의 레벨) decision tree는 노드마다 high prediction accuracy 를 얻기 위해 과도하게 split하기 때문에 workload imbalanced problem 을 초래한다. (노드마다 인스턴스 숫자가 달라서 트리의 균형이 깨자는 현상) 그리고 속도의 개선이 별로 없는 방식이다. (일을 하는 쪽만 계속 하는 구조)</p>
<p>방식2. Parallelize Split Finding on Each Node 분기가 나뉘는 지점 계산을 병렬처리</p>
<p>한 노드로부터 자식노드를 생성하기 위해서는 feature마다 enumerate 하여 split을 찾아야 한다. 위의 아이디어는  노드의 split finding을 병렬처리하는 것으로 노드별로 feature를 sorting 한 담에 가장 엔트로피가 낮아지는 지점을 계산을 해야하는데 이 sorting을 병렬처리 한다. 각기 다른 feature들을 split 하는 방식이다. 노드생성을 병렬처리하는 위의 방식보다 훨씬 빠른 방법이다. 그러나 small node에 too much overhead를 초래한다.</p>
<p>방식3. Parallelize Split Finding at Each Level by features 처음부터 feature별로 정렬
<img src="https://images.velog.io/images/tobigs_xai/post/c499152f-e4f0-4de9-9d83-3830be2c2e55/image.png" alt=""></p>
<p>위의 두 방식에는 두 개의 루프가 존재한다. outer loop로는 트리의 레벨마다 leaf nodes들을 돌고 있고, inner loop으로는 feature들을 돈다. 방식 3은 outer loop와 inner loop의 순서를 바꾸는 것에서 착안했다. 이를 통해 같은 레벨에서 다른 feature 의 split을 병렬처리할 수 있다. 즉 split 한 노드에서 sorting 하는게 아니라 처음부터 feature를 sorting을 대충한 다음에 추후 필요할때마다 leaf 노드에서 sorting을 진행한다</p>
<blockquote>
<p>참고링크
<a href="http://machinelearningkorea.com/2019/07/25/xgboost-%EC%9D%98-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C/">http://machinelearningkorea.com/2019/07/25/xgboost-%EC%9D%98-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC%EA%B0%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C/</a>
<a href="https://m.blog.naver.com/nicolechae0627/221811579005">https://m.blog.naver.com/nicolechae0627/221811579005</a>
<a href="https://stackoverflow.com/questions/34151051/how-does-xgboost-do-parallel-computation">https://stackoverflow.com/questions/34151051/how-does-xgboost-do-parallel-computation</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>