<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2025-07-13T15:41:03+03:00</updated><id>/feed.xml</id><title type="html">Mixed Random Variables</title><subtitle>This is the official website and blog of Onur Tunali which covers topics about CS, mathematics and machine learning with in depth review of textbooks.</subtitle><author><name>Onur Tunali</name></author><entry><title type="html">Yazılım Alanında Doküman Çeşitleri</title><link href="/cs/2020/02/01/yazilim-alaninda-dokuman-cesitleri.html" rel="alternate" type="text/html" title="Yazılım Alanında Doküman Çeşitleri" /><published>2020-02-01T22:54:40+03:00</published><updated>2020-02-01T22:54:40+03:00</updated><id>/cs/2020/02/01/yazilim-alaninda-dokuman-cesitleri</id><content type="html" xml:base="/cs/2020/02/01/yazilim-alaninda-dokuman-cesitleri.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#giriş" id="markdown-toc-giriş">Giriş</a></li>
  <li><a href="#rehber" id="markdown-toc-rehber">Rehber</a></li>
  <li><a href="#kılavuz" id="markdown-toc-kılavuz">Kılavuz</a></li>
  <li><a href="#açıklama" id="markdown-toc-açıklama">Açıklama</a></li>
  <li><a href="#referans" id="markdown-toc-referans">Referans</a></li>
</ul>

<h1 id="giriş">Giriş</h1>

<p>Kapsamlı dokümantasyona sahip bir kütüphanenin, modülün veya <em>framework</em>‘un kullanıcı tarafından benimsenmesi daha olasıdır. Ürettiği değer göz önünde bulundurulursa, yazılım geliştirmenin bu önemli ayağı standartlaştırılmalıdır. <a href="https://documentation.divio.com/">Divio dokümantasyon sistemi</a> yazılım sektöründe kullanılmak üzere hazırlanan teknik metinleri tasnif etmek için önerilmiştir. Bu sistem dört temel metin çeşidinden oluşur: rehber, kılavuz, referans ve açıklama. Her dokümanın ne ve nasıl sorularına cevap vermek için yazıldığı varsayımına dayanarak incelenirse, aşağıdaki diyagram kullanılarak doküman çeşidi belirlenebilir.</p>

<figure>
<img src="fig_1.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 1. Doküman çeşitleri özetleyen şema.</figcaption>
</figure>

<p>Yatay eksen dokümanın kullanılacağı bağlamı ayırt ederken, dikey eksen dokümanın doğasını ayırt eden bağlamı belirtir. Burada doğa kelimesi metinin içerik ve üslup yapısını ifade eder. Rehber ve kılavuz metinleri için yalın ve uygulama odaklı bir yaklaşım kullanılır. Açıklama ve referans metinleri için kuru ve teorik bilgi odaklı bir yaklaşım kullanılır.</p>

<p>Bir e-ticaret <em>framework</em>‘u göz önüne alınırsa metin örnekleri şöyledir. Rehber örneği projenin kurulumu ve minimum web sitesi oluşturmayı anlatır. Kılavuz örneği siteye nasıl <em>login</em> sistemi ekleneceğini gösterir ve hedef odaklıdır. Açıklama örneği belirli bir fonksiyonun kullanımı ve nasıl çalıştığının açıklanmasıdır. Referans örneği tüm API’ların listelenmesi ve arayüzlerin açıklanmasıdır. Her metin çeşidinin kısa açıklaması ve örneği aşağıdaki tabloda bulunabilir.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left"> </th>
      <th style="text-align: right"><strong>Rehber</strong> <br /> (Tutorial)</th>
      <th style="text-align: right"><strong>Kılavuz</strong> <br /> (How-to Guide)</th>
      <th style="text-align: right"><strong>Referans</strong> <br /> (Reference)</th>
      <th style="text-align: right"><strong>Açıklama</strong> <br />(Explanation)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>odağı</strong></td>
      <td style="text-align: right">öğrenmedir.</td>
      <td style="text-align: right">belirli bir görevdir.</td>
      <td style="text-align: right">bilgi edinmedir.</td>
      <td style="text-align: right">kavramadır.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>olma şartı</strong></td>
      <td style="text-align: right">acemi dostu anlatıma sahip olmasıdır.</td>
      <td style="text-align: right">spesifik bir sorunu çözmesidir.</td>
      <td style="text-align: right">çalışma mekanizmasını anlatmasıdır.</td>
      <td style="text-align: right">ayrıntılı açıklama içermesidir.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>biçimi</strong></td>
      <td style="text-align: right">derstir.</td>
      <td style="text-align: right">adım adım tariftir.</td>
      <td style="text-align: right">kuru anlatımdır.</td>
      <td style="text-align: right">açıklamalı anlatımdır.</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>örneği</strong></td>
      <td style="text-align: right">çocuğa yemek yapmayı öğretmedir.</td>
      <td style="text-align: right">yemek tarifidir.</td>
      <td style="text-align: right">ansiklopedi maddesidir.</td>
      <td style="text-align: right">Türk mutfağı üzerine makaledir.</td>
    </tr>
  </tbody>
</table>

<p>Tüm bunlara ek olarak metin içerisindeki kod açıklamaları için sandviç yöntemi kullanılır. Önce kodun yerine getirdiği işlem veya işlev belirtilir, daha sonra kod verilir ve en sonunda kod açıklanır. Divio sistemini benimseyen projelerin ve firmaların listesi <a href="https://documentation.divio.com/adoption/">burada</a> bulunabilir.</p>

<h1 id="rehber">Rehber</h1>

<p>Rehber kullanıcının bir projeyle veya yazılımla ilk karşılaşmasıdır. Bu yüzden olabildiğince kullanıcı dostu yazılmalıdır. Temel özellikleri şu şekilde sıralanabilir:</p>

<ul>
  <li>Uygulayarak öğrenme</li>
  <li>Yalın anlatım</li>
  <li>Adım adım ilerleme</li>
  <li>Tekrar edilebilir olma</li>
  <li>Konu dışı ayrıntılardan sakınma</li>
  <li>Soyut anlatım yerine somut adımlar tercih edilmeli</li>
  <li>Sadece gerekli açıklamalar verilmeli</li>
</ul>

<h1 id="kılavuz">Kılavuz</h1>

<p>Kılavuz yazılıma aşina kullanıcının bir işi yerine getirmek için başvurduğu kaynaktır. Kullanıcı kendi projesine bir işlev veya özellik eklemek için bu metin türüne başvurur. Temel özellikleri şu şekilde sıralanabilir:</p>

<ul>
  <li>Bir dizi adımlardan oluşur</li>
  <li>Sonuç odaklıdır</li>
  <li>Belirli bir problemi çözer</li>
  <li>Kavramları açıklamaktan kaçınır</li>
  <li>Adımlar esnektir ve küçük farklılıklar kullanıcı isteklerine göre değişebilir</li>
  <li>Eksiksiz olmaktan çok pratiktir</li>
</ul>

<h1 id="açıklama">Açıklama</h1>

<p>Açıklama yazılım dokümantasyonun kapsamını genişletir ve kavrama odaklıdır. Herhangi bir işlemi yerine getirme veya öğretme aksine metinin konusu ayrıntılı bir şekilde tartışılır, farklı bakış açıları sunulur. Temel özellikleri şu şekilde sıralanabilir:</p>

<ul>
  <li>Bağlamı açıkça belirtir</li>
  <li>Alternatifler ve görüşler sunar</li>
  <li>Teknik referans ve talimat sağlamaz</li>
</ul>

<h1 id="referans">Referans</h1>

<p>Referans çalışma mekanizmasının teknik tasviridir ve bilgi odaklıdır. Temel kavramları açıklamaya çalışmaz. Ansiklopedi girdileri referans metinleri için uygun bir örnektir. Temel özellikleri şu şekilde sıralanabilir:</p>

<ul>
  <li>Kod tabanı ile aynı yapıya sahiptir</li>
  <li>Tutarlıdır</li>
  <li>Sadece en açık şekilde tasvir yapar</li>
  <li>Doğru ve güncel bilgi içerir</li>
</ul>]]></content><author><name>Onur Tunali</name></author><category term="cs" /><category term="writing" /><summary type="html"><![CDATA[Kapsamlı dokümantasyona sahip bir kütüphanenin, modülün veya framework'un kullanıcı tarafından benimsenmesi daha olasıdır. Ürettiği değer göz önünde bulundurulursa, yazılım geliştirmenin bu önemli ayağı standartlaştırılmalıdır. Divio dokümantasyon sistemi yazılım sektöründe kullanılmak üzere hazırlanan teknik metinleri tasnif etmek için önerilmiştir.]]></summary></entry><entry><title type="html">Maximum Mean Discrepancy (MMD) in Machine Learning</title><link href="/ml/2019/03/08/maximum-mean-discrepancy-in-machine-learning.html" rel="alternate" type="text/html" title="Maximum Mean Discrepancy (MMD) in Machine Learning" /><published>2019-03-08T22:54:40+03:00</published><updated>2019-03-08T22:54:40+03:00</updated><id>/ml/2019/03/08/maximum-mean-discrepancy-in-machine-learning</id><content type="html" xml:base="/ml/2019/03/08/maximum-mean-discrepancy-in-machine-learning.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#formal-definition" id="markdown-toc-formal-definition">Formal Definition</a></li>
  <li><a href="#implementation-of-mmd" id="markdown-toc-implementation-of-mmd">Implementation of MMD</a></li>
  <li><a href="#code-practice" id="markdown-toc-code-practice">Code practice</a></li>
  <li><a href="#implementation-of-training-generative-neural-networks-via-maximum-mean-discrepancy-2" id="markdown-toc-implementation-of-training-generative-neural-networks-via-maximum-mean-discrepancy-2">Implementation of “Training Generative Neural Networks via Maximum Mean Discrepancy [2]”</a></li>
  <li><a href="#references" id="markdown-toc-references">References</a></li>
</ul>

<p>Maximum mean discrepancy (MMD)<label for="1" class="margin-toggle sidenote-number"></label><input type="checkbox" id="1" class="margin-toggle" /><span class="sidenote"><a href="https://stats.stackexchange.com/questions/276497/maximum-mean-discrepancy-distance-distribution">Cross Validated</a> includes some formal discussions </span> is a kernel based statistical test used to determine whether given two distribution are the same which is proposed in <a href="#references">[1]</a>. MMD can be used as a loss/cost function in various machine learning algorithms such as density estimation, generative models as shown in <a href="#references">[2]</a>, <a href="#references">[3]</a> and also in invertible neural networks utilized in inverse problems as in <a href="#references">[4]</a>. As opposed to generative adversarial networks (GANs) which require a solution to a complex min-max optimization problem, MMD criteria can be used as simpler discriminator.</p>

<p>Main advantages are easy implementation and rich kernel based theory behind the idea that lends itself to a formal analysis. On the other hand, disadvantages are subjectively “mediocre” sample results compared to GANs as reported in <a href="#references">[2]</a>, <a href="#references">[3]</a> and the same computational cost overheads regarding kernel based methods when the feature size of the data is reasonable large.</p>

<p><strong>Notation:</strong></p>
<ul>
  <li>Random variables are denotes with capital \(X\).</li>
  <li>Vectors are column matrices.</li>
  <li>Vectors are denoted with roman bold type \(\mathbf{x}\).</li>
  <li>Probability distribution of expected values are not shown explicitly unless unclear from context.</li>
</ul>

<p><strong>Note:</strong> Reader who is not interested in formal mathematical derivations can skip to <a href="#implementation-of-mmd">Implementation of MMD</a> section.</p>

<h2 id="formal-definition">Formal Definition</h2>

<p>Maximum mean discrepancy (MMD) can be defined in two different ways which are equivalent to each other:</p>

<ol>
  <li><em>MMD</em> is a distance (difference) between <em>feature means</em>.</li>
  <li><em>MMD</em> is an integral probability metric (which will not be covered in this post. Please refer to <a href="#references">[1]</a>).</li>
</ol>

<p>Let’s start with the concepts used in definition of feature means. Firstly given an \(X\), a feature map \(\phi\) maps \(X\) to an another space \(\mathcal{F}\) such that \(\phi(X) \in \mathcal{F}\). Assuming \(\mathcal{F}\) satisfies the necessary conditions, we can benefit from the kernel trick to compute the inner product in \(\mathcal{F}\):</p>

\[X, Y \text{ such that} ~~ k(X, Y) = \langle \phi(X), \phi(Y) \rangle_{\mathcal{F}}\]

<p><strong>1. Feature means:</strong> Given a probability measure \(P\) on \(\mathcal{X}\), feature means (or mean embedding as sometimes called in the literature) is an another feature map that takes \(\phi(X)\) and maps it to the means of every coordinate of \(\phi(X)\):</p>

\[\mu_{p} ~ (\phi(X)) = \left[ E[\phi(X_{1}], \cdots , E[\phi(X_{m}] \right]^{T} \tag{1}\]

<p>Inner product of feature means of \(X \sim P\) and \(Y \sim Q\) can be written in terms of kernel function such that:</p>

\[\langle \mu_{P}~(\phi(X), \mu_{Q}~(\phi(Y) \rangle_{\mathcal{F}} = E_{P,Q}~ [\langle \phi(X), \phi(Y) \rangle_{\mathcal{F}}] = E_{P,Q}~ [k(X,Y)] \tag{2}\]

<p><strong>2. Maximum mean discrepancy:</strong> Given \(X,Y\) maximum mean discrepancy is the distance between feature means of \(X,Y\):</p>

\[MMD^{2}(P,Q) = \Vert \mu_{P} - \mu_{Q} \Vert^{2} _{\mathcal{F}} \tag{3}\]

<p>For convenience we have left out the \(\phi(\cdot)\) parts. If we use the norm induced by the inner product such that \(\Vert x \Vert = \sqrt{\langle x, x \rangle}\), the equation (3) becomes</p>

\[MMD^{2}(P,Q) = \langle \mu_{P} - \mu_{Q}, ~ \mu_{P} - \mu_{Q} \rangle = \langle \mu_{P}, \mu_{P} \rangle -2 \langle \mu_{P}, \mu_{Q} \rangle + \langle \mu_{Q}, \mu_{Q} \rangle\]

<p>Using the equation (2), finally above expression becomes</p>

\[MMD^{2}(P,Q) = E_{P}~ [k(X,X)] - 2 E_{P,Q}~ [k(X,Y)] + E_{Q}~ [k(Y,Y)] \tag{4}\]

<p>We will use the equation (4) in the derivation of empirical estimate of the MMD.</p>

<ul>
  <li><strong>Remark:</strong> The term maximum in maximum mean discrepancy comes from the second definition of MMD which is an integral probability metric including a supremum. This definition utilize a supremum and a function belonging to a unit ball \(F\) in Reproducing Kernel Hilbert Space. We are only giving the formal definition and remind the reader that both definition are equivalent. For further information please refer to <a href="#references">[1]</a></li>
</ul>

\[MMD(P, Q; \mathcal{F}) = \underset{\Vert f \Vert \leq 1}{sup~} E_{X} [f(X)] - E_{Y} [f(Y)]\]

<p><strong>3. Empirical estimation of MMD:</strong> Even though we are working with distributions so far, in real life settings we don’t have access to the underlying distribution of our data. For this reason, it is possible to use an estimate for the equation (4) with following formula:</p>

\[MMD^{2}(X,Y) = \underbrace{\frac{1}{m (m-1)} \sum_{i} \sum_{j \neq i} k(\mathbf{x_{i}}, \mathbf{x_{j}})}_\text{A} - \underbrace{2 \frac{1}{m.m} \sum_{i} \sum_{j} k(\mathbf{x_{i}}, \mathbf{y_{j}})}_\text{B} + \underbrace{\frac{1}{m (m-1)} \sum_{i} \sum_{j \neq i} k(\mathbf{y_{i}}, \mathbf{y_{j}})}_\text{C} \tag{5}\]

<p>One interpretation of the equation (5) is that \(\mathbf{x_{i}}\)’s are the data points we already have and \(\mathbf{y_{i}}\)’s are the generated examples so that MMD score guides us towards the evaluation of underlying distributions. In the next section, we will demonstrate how to implement the equation (5) in pytorch and use the MMD as a training criteria in generative models such that our distribution model doesn’t diverge from the given data.</p>

<h2 id="implementation-of-mmd">Implementation of MMD</h2>

<p>In this section, we code the equation (5) in pytorch. This implementation benefits greatly from the pytorch forum discussion <label for="2" class="margin-toggle sidenote-number"></label><input type="checkbox" id="2" class="margin-toggle" /><span class="sidenote">In addition to MMD, curious reader can find custom loss function implementations using pytoch in <a href="https://discuss.pytorch.org/t/build-your-own-loss-function-in-pytorch/235">here</a> </span> in <a href="https://discuss.pytorch.org/t/maximum-mean-discrepancy-mmd-and-radial-basis-function-rbf/1875">here</a>. Main idea behind the code is first obtaining the similarity matrices between  \(X\) and \(X\), \(X\) and \(Y\), finally \(Y\) and \(Y\) with given distance metric, then plugging the results to kernel specific function such as exponential.</p>

<p>For example, let’s say kernel in question is gaussian meaning</p>

\[k(\mathbf{x_{i}}, \mathbf{x_{j}}) = \exp \left(\frac{- \Vert \mathbf{x_{i}} - \mathbf{x_{j}} \Vert^{2}}{2\sigma^{2}}\right) = \exp \left(\frac{-1}{\sigma^{2}} [\mathbf{x_{i}}^\intercal \mathbf{x_{i}} - 2 \mathbf{x_{i}}^\intercal \mathbf{x_{j}} + \mathbf{x_{j}}^\intercal \mathbf{x_{j}}]\right)\]

<p>If we can construct a matrix with elements such that for every i and j corresponding element is \([\mathbf{x_{i}}^\intercal \mathbf{x_{i}} - 2 \mathbf{x_{i}}^\intercal \mathbf{x_{j}} + \mathbf{x_{j}}^\intercal \mathbf{x_{j}}]\), then it is possible to just plug that matrix into <code class="language-plaintext highlighter-rouge">pytorch.exp()</code> for the result.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">device</span><span class="p">(</span><span class="sh">"</span><span class="s">cuda</span><span class="sh">"</span> <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="nf">is_available</span><span class="p">()</span> <span class="k">else</span> <span class="sh">"</span><span class="s">cpu</span><span class="sh">"</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">MMD</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">kernel</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Emprical maximum mean discrepancy. The lower the result
       the more evidence that distributions are the same.

    Args:
        x: first sample, distribution P
        y: second sample, distribution Q
        kernel: kernel type such as </span><span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span><span class="s"> or </span><span class="sh">"</span><span class="s">rbf</span><span class="sh">"</span><span class="s">
    </span><span class="sh">"""</span>
    <span class="n">xx</span><span class="p">,</span> <span class="n">yy</span><span class="p">,</span> <span class="n">zz</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="nf">t</span><span class="p">()),</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="nf">t</span><span class="p">()),</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="nf">t</span><span class="p">())</span>
    <span class="n">rx</span> <span class="o">=</span> <span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="nf">diag</span><span class="p">().</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">expand_as</span><span class="p">(</span><span class="n">xx</span><span class="p">))</span>
    <span class="n">ry</span> <span class="o">=</span> <span class="p">(</span><span class="n">yy</span><span class="p">.</span><span class="nf">diag</span><span class="p">().</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">expand_as</span><span class="p">(</span><span class="n">yy</span><span class="p">))</span>

    <span class="n">dxx</span> <span class="o">=</span> <span class="n">rx</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">rx</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">xx</span> <span class="c1"># Used for A in (1)
</span>    <span class="n">dyy</span> <span class="o">=</span> <span class="n">ry</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">ry</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">yy</span> <span class="c1"># Used for B in (1)
</span>    <span class="n">dxy</span> <span class="o">=</span> <span class="n">rx</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">ry</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">zz</span> <span class="c1"># Used for C in (1)
</span>
    <span class="n">XX</span><span class="p">,</span> <span class="n">YY</span><span class="p">,</span> <span class="n">XY</span> <span class="o">=</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">),</span>
                  <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">),</span>
                  <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">))</span>

    <span class="k">if</span> <span class="n">kernel</span> <span class="o">==</span> <span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span><span class="p">:</span>

        <span class="n">bandwidth_range</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.2</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">bandwidth_range</span><span class="p">:</span>
            <span class="n">XX</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dxx</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>
            <span class="n">YY</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dyy</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>
            <span class="n">XY</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dxy</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>

    <span class="k">if</span> <span class="n">kernel</span> <span class="o">==</span> <span class="sh">"</span><span class="s">rbf</span><span class="sh">"</span><span class="p">:</span>

        <span class="n">bandwidth_range</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">50</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">bandwidth_range</span><span class="p">:</span>
            <span class="n">XX</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dxx</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>
            <span class="n">YY</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dyy</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>
            <span class="n">XY</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dxy</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>



    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">XX</span> <span class="o">+</span> <span class="n">YY</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">XY</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="code-practice">Code practice</h2>

<p>In this section, we compare two multivariate gaussian distribution with different mean and covariance <label for="3" class="margin-toggle sidenote-number"></label><input type="checkbox" id="3" class="margin-toggle" /><span class="sidenote">If you get the following error: <br /><code class="language-plaintext highlighter-rouge">ParseException: Expected end of text, found "$"</code>, you need to install Latex. matplotlib uses Latex to parse given text. </span></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">scipy.stats</span> <span class="kn">import</span> <span class="n">multivariate_normal</span>
<span class="kn">from</span> <span class="n">scipy.stats</span> <span class="kn">import</span> <span class="n">dirichlet</span>
<span class="kn">from</span> <span class="n">torch.distributions.multivariate_normal</span> <span class="kn">import</span> <span class="n">MultivariateNormal</span>


<span class="n">m</span> <span class="o">=</span> <span class="mi">20</span> <span class="c1"># sample size
</span><span class="n">x_mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span>
<span class="n">y_mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">x_cov</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">torch</span><span class="p">.</span><span class="nf">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="c1"># IMPORTANT: Covariance matrices must be positive definite
</span><span class="n">y_cov</span> <span class="o">=</span> <span class="mi">3</span><span class="o">*</span><span class="n">torch</span><span class="p">.</span><span class="nf">eye</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>

<span class="n">px</span> <span class="o">=</span> <span class="nc">MultivariateNormal</span><span class="p">(</span><span class="n">x_mean</span><span class="p">,</span> <span class="n">x_cov</span><span class="p">)</span>
<span class="n">qy</span> <span class="o">=</span> <span class="nc">MultivariateNormal</span><span class="p">(</span><span class="n">y_mean</span><span class="p">,</span> <span class="n">y_cov</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">px</span><span class="p">.</span><span class="nf">sample</span><span class="p">([</span><span class="n">m</span><span class="p">]).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">qy</span><span class="p">.</span><span class="nf">sample</span><span class="p">([</span><span class="n">m</span><span class="p">]).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

<span class="n">result</span> <span class="o">=</span> <span class="nc">MMD</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">kernel</span><span class="o">=</span><span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">MMD result of X and Y is </span><span class="si">{</span><span class="n">result</span><span class="p">.</span><span class="nf">item</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># ---- Plotting setup ----
</span>
<span class="n">fig</span><span class="p">,</span> <span class="p">(</span><span class="n">ax1</span><span class="p">,</span><span class="n">ax2</span><span class="p">)</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="c1">#plt.tight_layout()
</span><span class="n">delta</span> <span class="o">=</span> <span class="mf">0.025</span>

<span class="n">x1_val</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">m</span><span class="p">)</span>
<span class="n">x2_val</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">m</span><span class="p">)</span>

<span class="n">x1</span><span class="p">,</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">meshgrid</span><span class="p">(</span><span class="n">x1_val</span><span class="p">,</span> <span class="n">x2_val</span><span class="p">)</span>

<span class="n">px_grid</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">m</span><span class="p">)</span>
<span class="n">qy_grid</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">m</span><span class="p">)</span>


<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
        <span class="n">px_grid</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">multivariate_normal</span><span class="p">.</span><span class="nf">pdf</span><span class="p">([</span><span class="n">x1_val</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">x2_val</span><span class="p">[</span><span class="n">j</span><span class="p">]],</span> <span class="n">x_mean</span><span class="p">,</span> <span class="n">x_cov</span><span class="p">)</span>
        <span class="n">qy_grid</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">multivariate_normal</span><span class="p">.</span><span class="nf">pdf</span><span class="p">([</span><span class="n">x1_val</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="n">x2_val</span><span class="p">[</span><span class="n">j</span><span class="p">]],</span> <span class="n">y_mean</span><span class="p">,</span> <span class="n">y_cov</span><span class="p">)</span>


<span class="n">CS1</span> <span class="o">=</span> <span class="n">ax1</span><span class="p">.</span><span class="nf">contourf</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">px_grid</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">plt</span><span class="p">.</span><span class="n">cm</span><span class="p">.</span><span class="n">YlGnBu</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sh">"</span><span class="s">Distribution of $$X \sim P(X)$$</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">'</span><span class="s">$$x_2$$</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">'</span><span class="s">$$x_1$$</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_aspect</span><span class="p">(</span><span class="sh">'</span><span class="s">equal</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">x</span><span class="p">[:</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">].</span><span class="nf">cpu</span><span class="p">(),</span> <span class="n">x</span><span class="p">[:</span><span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="p">].</span><span class="nf">cpu</span><span class="p">(),</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">$$X$$ Samples</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">legend</span><span class="p">()</span>

<span class="n">CS2</span> <span class="o">=</span> <span class="n">ax2</span><span class="p">.</span><span class="nf">contourf</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">qy_grid</span><span class="p">,</span><span class="mi">100</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">plt</span><span class="p">.</span><span class="n">cm</span><span class="p">.</span><span class="n">YlGnBu</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sh">"</span><span class="s">Distribution of $$Y \sim Q(Y)$$</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">'</span><span class="s">$$y_1$$</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">'</span><span class="s">$$y_2$$</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_aspect</span><span class="p">(</span><span class="sh">'</span><span class="s">equal</span><span class="sh">'</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">y</span><span class="p">[:</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">].</span><span class="nf">cpu</span><span class="p">(),</span> <span class="n">y</span><span class="p">[:</span><span class="mi">10</span><span class="p">,</span><span class="mi">1</span><span class="p">].</span><span class="nf">cpu</span><span class="p">(),</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">$$Y$$ Samples</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">legend</span><span class="p">()</span>
<span class="c1">#ax1.axis([-2.5, 2.5, -2.5, 2.5])
</span>
<span class="c1"># Add colorbar and title
</span><span class="n">fig</span><span class="p">.</span><span class="nf">subplots_adjust</span><span class="p">(</span><span class="n">right</span><span class="o">=</span><span class="mf">0.8</span><span class="p">)</span>
<span class="n">cbar_ax</span> <span class="o">=</span> <span class="n">fig</span><span class="p">.</span><span class="nf">add_axes</span><span class="p">([</span><span class="mf">0.85</span><span class="p">,</span> <span class="mf">0.15</span><span class="p">,</span> <span class="mf">0.02</span><span class="p">,</span> <span class="mf">0.7</span><span class="p">])</span>
<span class="n">cbar</span> <span class="o">=</span> <span class="n">fig</span><span class="p">.</span><span class="nf">colorbar</span><span class="p">(</span><span class="n">CS2</span><span class="p">,</span> <span class="n">cax</span><span class="o">=</span><span class="n">cbar_ax</span><span class="p">)</span>
<span class="n">cbar</span><span class="p">.</span><span class="n">ax</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">'</span><span class="s">Density results</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">suptitle</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">MMD result: </span><span class="si">{</span><span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="nf">item</span><span class="p">(),</span><span class="mi">3</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span><span class="n">y</span><span class="o">=</span><span class="mf">0.95</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>MMD result of X and Y is 0.39560213685035706
</code></pre></div></div>

<figure>
<img src="fig_1.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 1. Comparison of 2 multivariable gaussian distritbutions with different means.</figcaption>
</figure>

<h2 id="implementation-of-training-generative-neural-networks-via-maximum-mean-discrepancy-2">Implementation of “Training Generative Neural Networks via Maximum Mean Discrepancy <a href="#references">[2]</a>”</h2>

<p>Paper specifications of setting and neural network used in the experimental results:</p>

<ul>
  <li>Dataset is MNIST.</li>
  <li>Input size is not specified in the paper, so chosen size in this example is 32. Output size is the same as the dimension of MNIST dateset instances.</li>
  <li>3 fully connected hidden layers with the size of 1000, 600 and 1000. Preferred activation function is RELU.</li>
  <li>Batch size is 500.</li>
  <li>Optimizer is RMSprop.</li>
  <li>Kernel function is radial basis function.</li>
</ul>

<p>Observations:</p>

<ul>
  <li>In the paper, an extensive hyperparameter search is conducted so kernel choice, learning rate etc. in this example is arbitrary and decided purely based on exemplary reasons.</li>
  <li>Since no hyperparameter tunning is performed, multiscale kernel is found to be more successful than gaussian kernel contrary to the paper. In fact, when kernel type is chosen as <code class="language-plaintext highlighter-rouge">"rbf"</code>, a clear mode collapse occurs.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>
<span class="kn">import</span> <span class="n">torch.nn.functional</span> <span class="k">as</span> <span class="n">F</span>
<span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.optim</span> <span class="k">as</span> <span class="n">optim</span>
<span class="kn">from</span> <span class="n">torch.autograd</span> <span class="kn">import</span> <span class="n">Variable</span>
<span class="kn">from</span> <span class="n">torchvision</span> <span class="kn">import</span> <span class="n">datasets</span><span class="p">,</span> <span class="n">transforms</span>

<span class="n">root</span> <span class="o">=</span> <span class="sh">"</span><span class="s">/</span><span class="sh">"</span>
<span class="n">BATCH_SIZE</span> <span class="o">=</span> <span class="mi">500</span>
<span class="n">N_INP</span> <span class="o">=</span> <span class="mi">32</span>
<span class="n">N_OUT</span> <span class="o">=</span> <span class="mi">784</span>
<span class="n">N_GEN_EPOCHS</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">KERNEL_TYPE</span> <span class="o">=</span> <span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span>

<span class="c1"># Class definition Generative with Maximum Mean Discrepancy (GMMD)
</span><span class="k">class</span> <span class="nc">GMMD</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">n_start</span><span class="p">,</span> <span class="n">n_out</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">(</span><span class="n">GMMD</span><span class="p">,</span> <span class="n">self</span><span class="p">).</span><span class="nf">__init__</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">fc1</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="n">n_start</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">fc2</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">600</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">fc3</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">600</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">fc4</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="n">n_out</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">samples</span><span class="p">):</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">fc1</span><span class="p">(</span><span class="n">samples</span><span class="p">))</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">fc2</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">fc3</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nf">fc4</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">x</span>

<span class="c1"># use gpu if available
</span><span class="n">device</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">device</span><span class="p">(</span><span class="sh">"</span><span class="s">cuda</span><span class="sh">"</span> <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="nf">is_available</span><span class="p">()</span> <span class="k">else</span> <span class="sh">"</span><span class="s">cpu</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># dataloader
</span><span class="n">trans</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">.</span><span class="nc">Compose</span><span class="p">([</span><span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()])</span>
<span class="n">train_set</span> <span class="o">=</span> <span class="n">datasets</span><span class="p">.</span><span class="nc">MNIST</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="n">root</span><span class="p">,</span> <span class="n">train</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">trans</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">train_loader</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="nc">DataLoader</span><span class="p">(</span>
        <span class="n">dataset</span><span class="o">=</span><span class="n">train_set</span><span class="p">,</span>
        <span class="n">batch_size</span><span class="o">=</span><span class="n">BATCH_SIZE</span><span class="p">,</span>
        <span class="n">shuffle</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

<span class="c1"># define the GMMD
</span>
<span class="n">gmmd_net</span> <span class="o">=</span> <span class="nc">GMMD</span><span class="p">(</span><span class="n">N_INP</span><span class="p">,</span> <span class="n">N_OUT</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

<span class="k">try</span><span class="p">:</span>
  <span class="n">gmmd_net</span><span class="p">.</span><span class="nf">load_state_dict</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">"</span><span class="s">gmmd.pth</span><span class="sh">"</span><span class="p">))</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Model parameters are loaded</span><span class="sh">"</span><span class="p">)</span>

<span class="k">except</span><span class="p">:</span>
  <span class="k">pass</span>

<span class="n">gmmd_optimizer</span> <span class="o">=</span> <span class="n">optim</span><span class="p">.</span><span class="nc">RMSprop</span><span class="p">(</span><span class="n">gmmd_net</span><span class="p">.</span><span class="nf">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.003</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">train_one_step</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">samples</span><span class="p">):</span>
    <span class="n">samples</span> <span class="o">=</span> <span class="nc">Variable</span><span class="p">(</span><span class="n">samples</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>
    <span class="n">gen_samples</span> <span class="o">=</span> <span class="nf">gmmd_net</span><span class="p">(</span><span class="n">samples</span><span class="p">)</span>

    <span class="n">loss</span> <span class="o">=</span> <span class="nc">MMD</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">gen_samples</span><span class="p">,</span> <span class="n">KERNEL_TYPE</span><span class="p">)</span>
    <span class="n">gmmd_optimizer</span><span class="p">.</span><span class="nf">zero_grad</span><span class="p">()</span>
    <span class="n">loss</span><span class="p">.</span><span class="nf">backward</span><span class="p">()</span>
    <span class="n">gmmd_optimizer</span><span class="p">.</span><span class="nf">step</span><span class="p">()</span>

    <span class="k">return</span> <span class="n">loss</span>

<span class="k">def</span> <span class="nf">MMD</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">kernel</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Emprical maximum mean discrepancy. The lower the result, the more evidence that distributions are the same.

    Args:
        x: first sample, distribution P
        y: second sample, distribution Q
        kernel: kernel type such as </span><span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span><span class="s"> or </span><span class="sh">"</span><span class="s">rbf</span><span class="sh">"</span><span class="s">
    </span><span class="sh">"""</span>
    <span class="n">xx</span><span class="p">,</span> <span class="n">yy</span><span class="p">,</span> <span class="n">zz</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="nf">t</span><span class="p">()),</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="nf">t</span><span class="p">()),</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mm</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="nf">t</span><span class="p">())</span>
    <span class="n">rx</span> <span class="o">=</span> <span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="nf">diag</span><span class="p">().</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">expand_as</span><span class="p">(</span><span class="n">xx</span><span class="p">))</span>
    <span class="n">ry</span> <span class="o">=</span> <span class="p">(</span><span class="n">yy</span><span class="p">.</span><span class="nf">diag</span><span class="p">().</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">expand_as</span><span class="p">(</span><span class="n">yy</span><span class="p">))</span>

    <span class="n">dxx</span> <span class="o">=</span> <span class="n">rx</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">rx</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">xx</span> <span class="c1"># Used for A in (1)
</span>    <span class="n">dyy</span> <span class="o">=</span> <span class="n">ry</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">ry</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">yy</span> <span class="c1"># Used for B in (1)
</span>    <span class="n">dxy</span> <span class="o">=</span> <span class="n">rx</span><span class="p">.</span><span class="nf">t</span><span class="p">()</span> <span class="o">+</span> <span class="n">ry</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">zz</span> <span class="c1"># Used for C in (1)
</span>
    <span class="n">XX</span><span class="p">,</span> <span class="n">YY</span><span class="p">,</span> <span class="n">XY</span> <span class="o">=</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">),</span>
                  <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">),</span>
                  <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">shape</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">))</span>

    <span class="k">if</span> <span class="n">kernel</span> <span class="o">==</span> <span class="sh">"</span><span class="s">multiscale</span><span class="sh">"</span><span class="p">:</span>

        <span class="n">bandwidth_range</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.2</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">bandwidth_range</span><span class="p">:</span>
            <span class="n">XX</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dxx</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>
            <span class="n">YY</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dyy</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>
            <span class="n">XY</span> <span class="o">+=</span> <span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">a</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">dxy</span><span class="p">)</span><span class="o">**-</span><span class="mi">1</span>

    <span class="k">if</span> <span class="n">kernel</span> <span class="o">==</span> <span class="sh">"</span><span class="s">rbf</span><span class="sh">"</span><span class="p">:</span>

        <span class="n">bandwidth_range</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">50</span><span class="p">]</span>
        <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">bandwidth_range</span><span class="p">:</span>
            <span class="n">XX</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dxx</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>
            <span class="n">YY</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dyy</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>
            <span class="n">XY</span> <span class="o">+=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="n">dxy</span><span class="o">/</span><span class="n">a</span><span class="p">)</span>



    <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="nf">mean</span><span class="p">(</span><span class="n">XX</span> <span class="o">+</span> <span class="n">YY</span> <span class="o">-</span> <span class="mf">2.</span> <span class="o">*</span> <span class="n">XY</span><span class="p">)</span>
</code></pre></div></div>

<p>Let’s train the model and save the model.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># training loop
</span><span class="n">iterations</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">Z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randn</span><span class="p">((</span><span class="mi">120</span><span class="p">,</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="n">N_INP</span><span class="p">))</span>
<span class="k">for</span> <span class="n">ep</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">N_GEN_EPOCHS</span><span class="p">):</span>
    <span class="n">avg_loss</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">resampling_limit</span> <span class="o">=</span> <span class="mi">300</span> <span class="c1"># From paper
</span>
    <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">train_loader</span><span class="p">):</span>
        <span class="n">iterations</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nf">view</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">x</span> <span class="o">=</span> <span class="nc">Variable</span><span class="p">(</span><span class="n">x</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

        <span class="c1"># normal random noise between [0, 1]
</span>        <span class="n">random_noise</span> <span class="o">=</span> <span class="n">Z</span><span class="p">[</span><span class="n">idx</span><span class="p">,:,:]</span>

        <span class="n">loss</span> <span class="o">=</span> <span class="nf">train_one_step</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">random_noise</span><span class="p">)</span>
        <span class="n">avg_loss</span> <span class="o">+=</span> <span class="n">loss</span><span class="p">.</span><span class="nf">item</span><span class="p">()</span>

        <span class="k">if</span> <span class="n">iterations</span> <span class="o">%</span> <span class="mi">300</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
           <span class="n">Z</span> <span class="o">=</span> <span class="n">random_noise</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randn</span><span class="p">((</span><span class="mi">120</span><span class="p">,</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="n">N_INP</span><span class="p">))</span>


    <span class="n">avg_loss</span> <span class="o">/=</span> <span class="p">(</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">GMMD Training: </span><span class="si">{</span><span class="n">ep</span><span class="si">}</span><span class="s">. epoch completed, average loss: </span><span class="si">{</span><span class="n">avg_loss</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">torch</span><span class="p">.</span><span class="nf">save</span><span class="p">(</span><span class="n">gmmd_net</span><span class="p">.</span><span class="nf">state_dict</span><span class="p">(),</span> <span class="sh">"</span><span class="s">gmmd.pth</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>After training, we can sample from the model and visualize them so that it is possible to inspect the quality of generated instances. Following code draws 32 sampes.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">Z</span> <span class="o">=</span> <span class="n">random_noise</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randn</span><span class="p">((</span><span class="mi">120</span><span class="p">,</span><span class="n">BATCH_SIZE</span><span class="p">,</span> <span class="n">N_INP</span><span class="p">))</span>
<span class="n">trans</span> <span class="o">=</span> <span class="n">transforms</span><span class="p">.</span><span class="nc">Compose</span><span class="p">([</span><span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()])</span>
<span class="n">test_set</span> <span class="o">=</span> <span class="n">datasets</span><span class="p">.</span><span class="nc">MNIST</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="n">root</span><span class="p">,</span> <span class="n">train</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">trans</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">view_data</span> <span class="o">=</span> <span class="p">[</span><span class="n">test_set</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">4</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)]</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">gray</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Images generated by GMMD</span><span class="sh">"</span><span class="p">)</span>

<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
  <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">8</span><span class="p">):</span>
    <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplot</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="n">r</span> <span class="o">*</span> <span class="mi">8</span> <span class="o">+</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>

    <span class="n">noise</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">randn</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="n">N_INP</span><span class="p">)).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="nf">gmmd_net</span><span class="p">(</span><span class="n">noise</span><span class="p">)</span>
    <span class="n">plt</span><span class="p">.</span><span class="nf">imshow</span><span class="p">(</span><span class="n">y</span><span class="p">.</span><span class="nf">detach</span><span class="p">().</span><span class="nf">squeeze</span><span class="p">().</span><span class="nf">cpu</span><span class="p">().</span><span class="nf">reshape</span><span class="p">(</span><span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">))</span>
    <span class="n">ax</span><span class="p">.</span><span class="nf">get_xaxis</span><span class="p">().</span><span class="nf">set_visible</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">.</span><span class="nf">get_yaxis</span><span class="p">().</span><span class="nf">set_visible</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>

</code></pre></div></div>

<figure>
<img src="fig_2.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 2. Generated pictures by MMD examples for demonstration.</figcaption>
</figure>

<h1 id="references">References</h1>

<p><a href="">[1]</a> Arthur Gretton, Karsten M Borgwardt, Malte J Rasch, Bernhard Schölkopf, and Alexander Smola. A kernel two-sample test. <em>Journal of Machine Learning Research</em>, 13(Mar):723–773, 2012.</p>

<p><a href="">[2]</a> Gintare Karolina Dziugaite, Daniel M Roy, and Zoubin Ghahramani. Training generative neural
networks via maximum mean discrepancy optimization. <em>arXiv preprint arXiv:1505.03906</em>, 2015.</p>

<p><a href="">[3]</a> Yujia Li, Kevin Swersky, and Richard Zemel. Generative moment matching networks. <em>arXiv
preprint arXiv:1502.02761</em>, 2015</p>

<p><a href="">[4]</a> Lynton Ardizzone, Jakob Kruse, Sebastian Wirkert, Daniel Rahner, Eric W Pellegrini, Ralf S
Klessen, Lena Maier-Hein, Carsten Rother, and Ullrich Kothe. Analyzing inverse problems with invertible neural networks. <em>arXiv preprint arXiv:1808.04730</em>, 2018.</p>]]></content><author><name>Onur Tunali</name></author><category term="ML" /><category term="machine-learning" /><category term="statistics" /><category term="paper" /><summary type="html"><![CDATA[Maximum mean discrepancy (MMD) is a kernel based statistical test used to determine whether given two distribution are the same which is proposed in [1]. MMD can be used as a loss/cost function in various machine learning algorithms such as density estimation, generative models as shown in [2], [3] and also in invertible neural networks utilized in inverse problems as in [4].]]></summary></entry><entry><title type="html">NICE: Non Linear Independent Components Estimation</title><link href="/ml/2019/02/08/nice-non-linear-independen-component-estimation.html" rel="alternate" type="text/html" title="NICE: Non Linear Independent Components Estimation" /><published>2019-02-08T22:54:40+03:00</published><updated>2019-02-08T22:54:40+03:00</updated><id>/ml/2019/02/08/nice-non-linear-independen-component-estimation</id><content type="html" xml:base="/ml/2019/02/08/nice-non-linear-independen-component-estimation.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#overview" id="markdown-toc-overview">Overview</a>    <ul>
      <li><a href="#main-points" id="markdown-toc-main-points">Main points</a></li>
      <li><a href="#experimental-results" id="markdown-toc-experimental-results">Experimental results</a></li>
    </ul>
  </li>
  <li><a href="#mathematical-background" id="markdown-toc-mathematical-background">Mathematical background</a>    <ul>
      <li><a href="#jacobians" id="markdown-toc-jacobians">Jacobians</a></li>
      <li><a href="#coupling" id="markdown-toc-coupling">Coupling</a></li>
    </ul>
  </li>
  <li><a href="#whole-library" id="markdown-toc-whole-library">Whole library</a></li>
  <li><a href="#train-example" id="markdown-toc-train-example">Train example</a></li>
</ul>

<p>NICE is a deep learning framework changing high dimensional complex data into non linear independent components. This post summarizes the paper and explains some left out mathematical concepts especially why resulting jacobian of transformation function is unit constant, how to derive it and scaling of output layer. In addition, pytorch implementation of experimental results are given.</p>

<ul>
  <li>Paper is <a href="https://arxiv.org/abs/1410.8516">arXiv:1410.8516</a></li>
  <li>Original code is <a href="https://github.com/fmu2/NICE/">fmu2/NICE/</a></li>
</ul>

<h1 id="overview">Overview</h1>

<p>Given data \(x \in \mathcal{X}^{D}\) is transformed using vector valued function of \(h=f(x)\) which is \(f: \mathcal{X}^{D} \to \mathcal{H}^{D}\) and trivially invertible. Distribution of \(h\) is assumed to be composed of independent components that can be factorized as follows:</p>

\[P_{H}~(h) = \prod_{d \in \mathcal{D}}~P_{H_{d}}~(h_{d})\]

<p>Using change of variables, we obtain the following equation.</p>

\[P_{X}~(x) = \underbrace{P_{H}~(f(x))}_\text{prior distribution} ~ \left \vert \det \frac{\partial f(x)}{\partial x} \right \vert \tag{1}\]

<p>To decide an \(f\) following two conditions should be met to benefit from NICE framework:</p>

<ol>
  <li>Determinant of jacobian of f(x) such that \(J(f(x)) = \partial f(x) / \partial x\) is trivially obtained</li>
  <li>\(f^{-1}(h) = g(h)\) is also trivially obtained</li>
</ol>

<p>As a result, learning criterion of NICE framework is maximizing the following log likelihood:</p>

\[\log( P_{X}~(x)) = \sum_{d=1}^{\mathcal{D}} \log(P_{H_{d}}~(f_{d}(x))) + \log\left(\left \vert \det \frac{\partial f(x)}{\partial x} \right \vert \right) \tag{2}\]

<p>In the paper transformations are chosen to be additive coupling layers such that:</p>

<p>\(x = (x_{1}, x_{2}),~ h = (h_{1}, h{2})\)
\(h_{1} = x_{1}\)
\(h_{2} = x_{1} + m(x_{2}), \text{m is a neural network}\)</p>

<p>In subsequent sections, it will be shown that transformations using additive coupling result in unit constant determinant and hence make the equation (2) also constant if prior distribution is not learned. Therefore, to address the issue top layer is consequently scaled through using multiplicative coupling:</p>

\[h = \exp(s) \odot h\]

<p>\(S\) is a diagonal matrix that scales the final outputs. At the end, learning criterion for settings having predetermined prior distribution and utilizing additive coupling with scaling becomes</p>

\[\log( P_{X}~(x)) = \sum_{d=1}^{\mathcal{D}} \log(P_{H_{d}}~(f_{d}(x))) + \sum_{d=1}^{\mathcal{D}} |S_{ii}|  \tag{3}\]

<h2 id="main-points">Main points</h2>

<ul>
  <li>Every additive layer has unit determinant so top layer is a scaling diagonal \(S_{ii}\) matrix</li>
  <li>Paper uses isomorphic gaussian and logistic distribution so prior is not learned. In this case only thing left to learn is \(S_{ii}\) which indicates the important components</li>
</ul>

<h2 id="experimental-results">Experimental results</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left"><strong>Dataset</strong></th>
      <th style="text-align: left"><strong>Preprocessing</strong></th>
      <th style="text-align: right"><strong>Dimensions</strong></th>
      <th style="text-align: right"><strong>Hidden layers</strong></th>
      <th style="text-align: right"><strong>Hidden units</strong></th>
      <th style="text-align: left"><em>Prior</em></th>
      <th style="text-align: right"><strong>Log-likelihood</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">MNIST</td>
      <td style="text-align: left">None</td>
      <td style="text-align: right">784</td>
      <td style="text-align: right">5</td>
      <td style="text-align: right">1000</td>
      <td style="text-align: left">logistic</td>
      <td style="text-align: right">1980</td>
    </tr>
    <tr>
      <td style="text-align: left">TFD</td>
      <td style="text-align: left">Approx. whitening</td>
      <td style="text-align: right">2304</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">5000</td>
      <td style="text-align: left">gaussian</td>
      <td style="text-align: right">5514</td>
    </tr>
    <tr>
      <td style="text-align: left">SVHN</td>
      <td style="text-align: left">ZCA</td>
      <td style="text-align: right">3072</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">2000</td>
      <td style="text-align: left">logistic</td>
      <td style="text-align: right">11496</td>
    </tr>
    <tr>
      <td style="text-align: left">CIFAR-10</td>
      <td style="text-align: left">ZCA</td>
      <td style="text-align: right">3072</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">2000</td>
      <td style="text-align: left">logistic</td>
      <td style="text-align: right">5371</td>
    </tr>
  </tbody>
</table>

<h1 id="mathematical-background">Mathematical background</h1>

<h2 id="jacobians">Jacobians</h2>

<p>The result of function compositions can be shown as \(h = f(x) = f_{L} ~ \circ \cdots f_{2} \circ f_{1}(x)\) and let’s show that jacobian of function compositions is equal to the matrix multiplication of individual function jacobians which is \(J(h) = \frac{\partial h}{\partial x} = \frac{\partial f_{L}}{\partial f_{L-1}} \cdots \frac{\partial f_{2}}{\partial f_{1}} \frac{\partial f_{1}(x)}{\partial x}\).  we can demonstrate how the procedure works with an example and generalization can be derived building upon it. Functions and their depended variables are as follows:</p>

<p>\(h_{1} = f_{1}(x_{1}, x_{2}), ~~ h_{3} = f_{3}(h_{1}, h_{2})\)
\(h_{2} = f_{2}(x_{1}, x_{2}), ~~ h_{4} = f_{4}(h_{1}, h_{2})\)
\(h = (h_{3}, h_{4})\)</p>

<p>So jacobian of \(h\) is</p>

\[J(h) = \frac{ \partial (h)}{\partial (x_{1}, x_{2})} = \frac{ \partial (h_{3},h_{4})}{\partial (x_{1}, x_{2})} = \begin{bmatrix}  \frac{ \partial h_{3}}{\partial x_{1} } &amp; \frac{ \partial h_{3}}{\partial x_{2} }\\ \frac{ \partial h_{4}}{\partial x_{1} } &amp; \frac{ \partial h_{4}}{\partial x_{2} } \end{bmatrix} \tag{4}\]

<figure>
<img src="fig_1.jpg" />
<figcaption>Fig 1. Graphical description of how chain rule works in multivariable functions.</figcaption>
</figure>

<p>Figure 1 shows how to obtain partial derivative of a multivariable function with dependency graph of each function. If we plug results into (4), we end up with the following equation:</p>

\[= \begin{bmatrix} \frac{ \partial h_{3}}{\partial h_{1}}   \frac{ \partial h_{1}}{\partial x_{1}}  +  \frac{ \partial h_{3}}{\partial h_{2}}   \frac{ \partial h_{2}}{\partial x_{1}} &amp; \frac{ \partial h_{3}}{\partial h_{1}}   \frac{ \partial h_{1}}{\partial x_{2}}  +  \frac{ \partial h_{3}}{\partial h_{2}}   \frac{ \partial h_{2}}{\partial x_{2}} \\ \frac{ \partial h_{4}}{\partial h_{1}}   \frac{ \partial h_{1}}{\partial x_{1}}  +  \frac{ \partial h_{4}}{\partial h_{2}}   \frac{ \partial h_{2}}{\partial x_{1}} &amp; \frac{ \partial h_{4}}{\partial h_{1}}   \frac{ \partial h_{1}}{\partial x_{2}}  +  \frac{ \partial h_{4}}{\partial h_{2}}   \frac{ \partial h_{2}}{\partial x_{2}} \end{bmatrix}\]

<p>We can decompose this expression using matrix multiplication such that</p>

\[J(h) = \begin{bmatrix}  \frac{ \partial h_{3}}{\partial h_{1} } &amp; \frac{ \partial h_{3}}{\partial h_{2} }\\ \frac{ \partial h_{4}}{\partial h_{1} } &amp; \frac{ \partial h_{4}}{\partial h_{2} } \end{bmatrix} ~ \begin{bmatrix}  \frac{ \partial h_{1}}{\partial x_{1} } &amp; \frac{ \partial h_{1}}{\partial x_{2} }\\ \frac{ \partial h_{2}}{\partial x_{1} } &amp; \frac{ \partial h_{2}}{\partial x_{2} } \end{bmatrix}\]

\[J(h) = \frac{ \partial (h_{3},h_{4}) }{\partial (h_{1}, h_{2})} \frac{ \partial (h_{1},h_{2}) }{\partial (x_{1}, x_{2})} \tag{5}\]

<p>and finally since we are using the determinant of jacobian in (1), we can use \(\det(AB) = \det(A) \det(B)\)   identity to find the result.</p>

<h2 id="coupling">Coupling</h2>

<p>Furthermore, we show why additive coupling generates unit constant determinant of jacobian by defining couping layers of transformation function as follows:</p>

<p>\(h_{1} =x_{1}\)
\(h_{2} = x_{2} + m_{1}(x_{1})\)
\(h_{3} = h_{1} + m_{2}(x_{2})\)
\(h_{4} = h_{2}\)
\(h = ( h_{3}, h_{4})\)</p>

\[J(h) = \begin{bmatrix}  \frac{ \partial h_{3}}{\partial h_{1} } &amp; \frac{ \partial h_{3}}{\partial h_{2} }\\ \frac{ \partial h_{4}}{\partial h_{1} } &amp; \frac{ \partial h_{4}}{\partial h_{2} } \end{bmatrix} ~ \begin{bmatrix}  \frac{ \partial h_{1}}{\partial x_{1} } &amp; \frac{ \partial h_{1}}{\partial x_{2} }\\ \frac{ \partial h_{2}}{\partial x_{1} } &amp; \frac{ \partial h_{2}}{\partial x_{2} } \end{bmatrix} = \begin{bmatrix} I_{d} &amp; \frac{\partial m_{2}~(x_{2})}{ \partial h_{2}} \\ 0 &amp; I_{d} \end{bmatrix} \begin{bmatrix} I_{d} &amp; 0 \\ \frac{\partial m_{1}~(x_{1})}{\partial x_{1}}  &amp; I_{d} \end{bmatrix}\]

<p>Another fact is that determinant of a triangular matrix is the multiplication of its diagonal elements and in this case the result is 1 due to identity matrices.</p>

<h1 id="whole-library">Whole library</h1>

<p>Coding of library is pretty self explanatory and is added for exploratory purposes. Otherwise, library can be downloaded and imported as usual.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#Utility classes for NICE.
</span><span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>

<span class="c1">#Additive coupling layer.
</span>
<span class="k">class</span> <span class="nc">Coupling</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">in_out_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">,</span> <span class="n">mask_config</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Initialize a coupling layer.

        Args:
            in_out_dim: input/output dimensions.
            mid_dim: number of units in a hidden layer.
            hidden: number of hidden layers.
            mask_config: 1 if transform odd units, 0 if transform even units.
        </span><span class="sh">"""</span>
        <span class="nf">super</span><span class="p">(</span><span class="n">Coupling</span><span class="p">,</span> <span class="n">self</span><span class="p">).</span><span class="nf">__init__</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">mask_config</span> <span class="o">=</span> <span class="n">mask_config</span>

        <span class="n">self</span><span class="p">.</span><span class="n">in_block</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Sequential</span><span class="p">(</span>
            <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="n">in_out_dim</span><span class="o">//</span><span class="mi">2</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">),</span>
            <span class="n">nn</span><span class="p">.</span><span class="nc">ReLU</span><span class="p">())</span>
        <span class="n">self</span><span class="p">.</span><span class="n">mid_block</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">ModuleList</span><span class="p">([</span>
            <span class="n">nn</span><span class="p">.</span><span class="nc">Sequential</span><span class="p">(</span>
                <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="n">mid_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">),</span>
                <span class="n">nn</span><span class="p">.</span><span class="nc">ReLU</span><span class="p">())</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">hidden</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)])</span>
        <span class="n">self</span><span class="p">.</span><span class="n">out_block</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="n">mid_dim</span><span class="p">,</span> <span class="n">in_out_dim</span><span class="o">//</span><span class="mi">2</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Forward pass.

        Args:
            x: input tensor.
            reverse: True in inference mode, False in sampling mode.
        Returns:
            transformed tensor.
        </span><span class="sh">"""</span>
        <span class="p">[</span><span class="n">B</span><span class="p">,</span> <span class="n">W</span><span class="p">]</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">())</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nf">reshape</span><span class="p">((</span><span class="n">B</span><span class="p">,</span> <span class="n">W</span><span class="o">//</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">mask_config</span><span class="p">:</span>
            <span class="n">on</span><span class="p">,</span> <span class="n">off</span> <span class="o">=</span> <span class="n">x</span><span class="p">[:,</span> <span class="p">:,</span> <span class="mi">0</span><span class="p">],</span> <span class="n">x</span><span class="p">[:,</span> <span class="p">:,</span> <span class="mi">1</span><span class="p">]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">off</span><span class="p">,</span> <span class="n">on</span> <span class="o">=</span> <span class="n">x</span><span class="p">[:,</span> <span class="p">:,</span> <span class="mi">0</span><span class="p">],</span> <span class="n">x</span><span class="p">[:,</span> <span class="p">:,</span> <span class="mi">1</span><span class="p">]</span>

        <span class="n">off_</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">in_block</span><span class="p">(</span><span class="n">off</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">mid_block</span><span class="p">)):</span>
            <span class="n">off_</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">mid_block</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">off_</span><span class="p">)</span>
        <span class="n">shift</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">out_block</span><span class="p">(</span><span class="n">off_</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">reverse</span><span class="p">:</span>
            <span class="n">on</span> <span class="o">=</span> <span class="n">on</span> <span class="o">-</span> <span class="n">shift</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">on</span> <span class="o">=</span> <span class="n">on</span> <span class="o">+</span> <span class="n">shift</span>

        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">mask_config</span><span class="p">:</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">stack</span><span class="p">((</span><span class="n">on</span><span class="p">,</span> <span class="n">off</span><span class="p">),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">stack</span><span class="p">((</span><span class="n">off</span><span class="p">,</span> <span class="n">on</span><span class="p">),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">x</span><span class="p">.</span><span class="nf">reshape</span><span class="p">((</span><span class="n">B</span><span class="p">,</span> <span class="n">W</span><span class="p">))</span>

<span class="c1">#Log-scaling layer.
</span><span class="k">class</span> <span class="nc">Scaling</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">dim</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Initialize a (log-)scaling layer.

        Args:
            dim: input/output dimensions.
        </span><span class="sh">"""</span>
        <span class="nf">super</span><span class="p">(</span><span class="n">Scaling</span><span class="p">,</span> <span class="n">self</span><span class="p">).</span><span class="nf">__init__</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">scale</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Parameter</span><span class="p">(</span>
            <span class="n">torch</span><span class="p">.</span><span class="nf">zeros</span><span class="p">((</span><span class="mi">1</span><span class="p">,</span> <span class="n">dim</span><span class="p">)),</span> <span class="n">requires_grad</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Forward pass.

        Args:
            x: input tensor.
            reverse: True in inference mode, False in sampling mode.
        Returns:
            transformed tensor and log-determinant of Jacobian.
        </span><span class="sh">"""</span>
        <span class="n">log_det_J</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">scale</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">reverse</span><span class="p">:</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="o">-</span><span class="n">self</span><span class="p">.</span><span class="n">scale</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">scale</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">log_det_J</span>

<span class="sh">"""</span><span class="s">NICE main model.
</span><span class="sh">"""</span>
<span class="k">class</span> <span class="nc">NICE</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">prior</span><span class="p">,</span> <span class="n">coupling</span><span class="p">,</span>
        <span class="n">in_out_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">,</span> <span class="n">mask_config</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Initialize a NICE.

        Args:
            prior: prior distribution over latent space Z.
            coupling: number of coupling layers.
            in_out_dim: input/output dimensions.
            mid_dim: number of units in a hidden layer.
            hidden: number of hidden layers.
            mask_config: 1 if transform odd units, 0 if transform even units.
        </span><span class="sh">"""</span>
        <span class="nf">super</span><span class="p">(</span><span class="n">NICE</span><span class="p">,</span> <span class="n">self</span><span class="p">).</span><span class="nf">__init__</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">prior</span> <span class="o">=</span> <span class="n">prior</span>
        <span class="n">self</span><span class="p">.</span><span class="n">in_out_dim</span> <span class="o">=</span> <span class="n">in_out_dim</span>

        <span class="n">self</span><span class="p">.</span><span class="n">coupling</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">ModuleList</span><span class="p">([</span>
            <span class="nc">Coupling</span><span class="p">(</span><span class="n">in_out_dim</span><span class="o">=</span><span class="n">in_out_dim</span><span class="p">,</span>
                     <span class="n">mid_dim</span><span class="o">=</span><span class="n">mid_dim</span><span class="p">,</span>
                     <span class="n">hidden</span><span class="o">=</span><span class="n">hidden</span><span class="p">,</span>
                     <span class="n">mask_config</span><span class="o">=</span><span class="p">(</span><span class="n">mask_config</span><span class="o">+</span><span class="n">i</span><span class="p">)</span><span class="o">%</span><span class="mi">2</span><span class="p">)</span> \
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">coupling</span><span class="p">)])</span>
        <span class="n">self</span><span class="p">.</span><span class="n">scaling</span> <span class="o">=</span> <span class="nc">Scaling</span><span class="p">(</span><span class="n">in_out_dim</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">g</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">z</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Transformation g: Z -&gt; X (inverse of f).

        Args:
            z: tensor in latent space Z.
        Returns:
            transformed tensor in data space X.
        </span><span class="sh">"""</span>
        <span class="n">x</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">scaling</span><span class="p">(</span><span class="n">z</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">reversed</span><span class="p">(</span><span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">coupling</span><span class="p">))):</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">coupling</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">x</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">x</span>

    <span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Transformation f: X -&gt; Z (inverse of g).

        Args:
            x: tensor in data space X.
        Returns:
            transformed tensor in latent space Z.
        </span><span class="sh">"""</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">coupling</span><span class="p">)):</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">coupling</span><span class="p">[</span><span class="n">i</span><span class="p">](</span><span class="n">x</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="nf">scaling</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">log_prob</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Computes data log-likelihood.

        (See Section 3.3 in the NICE paper.)

        Args:
            x: input minibatch.
        Returns:
            log-likelihood of input.
        </span><span class="sh">"""</span>
        <span class="n">z</span><span class="p">,</span> <span class="n">log_det_J</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
        <span class="n">log_ll</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">prior</span><span class="p">.</span><span class="nf">log_prob</span><span class="p">(</span><span class="n">z</span><span class="p">),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">log_ll</span> <span class="o">+</span> <span class="n">log_det_J</span>

    <span class="k">def</span> <span class="nf">sample</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Generates samples.

        Args:
            size: number of samples to generate.
        Returns:
            samples from the data space X.
        </span><span class="sh">"""</span>
        <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="nf">is_available</span><span class="p">():</span>
            <span class="n">z</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">prior</span><span class="p">.</span><span class="nf">sample</span><span class="p">((</span><span class="n">size</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">in_out_dim</span><span class="p">)).</span><span class="nf">cuda</span><span class="p">()</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">z</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">prior</span><span class="p">.</span><span class="nf">sample</span><span class="p">((</span><span class="n">size</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">in_out_dim</span><span class="p">)).</span><span class="nf">cpu</span><span class="p">()</span>

        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="nf">g</span><span class="p">(</span><span class="n">z</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Forward pass.

        Args:
            x: input minibatch.
        Returns:
            log-likelihood of input.
        </span><span class="sh">"""</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="nf">log_prob</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>

<span class="c1">#Utility functions for NICE.
</span>
<span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.nn.functional</span> <span class="k">as</span> <span class="n">F</span>

<span class="k">def</span> <span class="nf">dequantize</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dataset</span><span class="p">):</span>
    <span class="sh">'''</span><span class="s">Dequantize data.

    Add noise sampled from Uniform(0, 1) to each pixel (in [0, 255]).

    Args:
        x: input tensor.
        reverse: True in inference mode, False in training mode.
    Returns:
        dequantized data.
    </span><span class="sh">'''</span>
    <span class="n">noise</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">distributions</span><span class="p">.</span><span class="nc">Uniform</span><span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">).</span><span class="nf">sample</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">())</span>
    <span class="nf">return </span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="mf">255.</span> <span class="o">+</span> <span class="n">noise</span><span class="p">)</span> <span class="o">/</span> <span class="mf">256.</span>

<span class="k">def</span> <span class="nf">prepare_data</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">zca</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">mean</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Prepares data for NICE.

    In training mode, flatten and dequantize the input.
    In inference mode, reshape tensor into image size.

    Args:
        x: input minibatch.
        dataset: name of dataset.
        zca: ZCA whitening transformation matrix.
        mean: center of original dataset.
        reverse: True if in inference mode, False if in training mode.
    Returns:
        transformed data.
    </span><span class="sh">"""</span>
    <span class="k">if</span> <span class="n">reverse</span><span class="p">:</span>
        <span class="k">assert</span> <span class="nf">len</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">()))</span> <span class="o">==</span> <span class="mi">2</span>
        <span class="p">[</span><span class="n">B</span><span class="p">,</span> <span class="n">W</span><span class="p">]</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">())</span>

        <span class="k">if</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">mnist</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">fashion-mnist</span><span class="sh">'</span><span class="p">]:</span>
            <span class="k">assert</span> <span class="n">W</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">*</span> <span class="mi">28</span> <span class="o">*</span> <span class="mi">28</span>
            <span class="n">x</span> <span class="o">+=</span> <span class="n">mean</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nf">reshape</span><span class="p">((</span><span class="n">B</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">))</span>
        <span class="k">elif</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">svhn</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cifar10</span><span class="sh">'</span><span class="p">]:</span>
            <span class="k">assert</span> <span class="n">W</span> <span class="o">==</span> <span class="mi">3</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">*</span> <span class="mi">32</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">zca</span><span class="p">.</span><span class="nf">inverse</span><span class="p">())</span> <span class="o">+</span> <span class="n">mean</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nf">reshape</span><span class="p">((</span><span class="n">B</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">32</span><span class="p">))</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">assert</span> <span class="nf">len</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">()))</span> <span class="o">==</span> <span class="mi">4</span>
        <span class="p">[</span><span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">]</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="nf">size</span><span class="p">())</span>

        <span class="k">if</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">mnist</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">fashion-mnist</span><span class="sh">'</span><span class="p">]:</span>
            <span class="k">assert</span> <span class="p">[</span><span class="n">C</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">]</span> <span class="o">==</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">28</span><span class="p">]</span>
        <span class="k">elif</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">svhn</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cifar10</span><span class="sh">'</span><span class="p">]:</span>
            <span class="k">assert</span> <span class="p">[</span><span class="n">C</span><span class="p">,</span> <span class="n">H</span><span class="p">,</span> <span class="n">W</span><span class="p">]</span> <span class="o">==</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">32</span><span class="p">]</span>

        <span class="n">x</span> <span class="o">=</span> <span class="nf">dequantize</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dataset</span><span class="p">)</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="nf">reshape</span><span class="p">((</span><span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="o">*</span><span class="n">H</span><span class="o">*</span><span class="n">W</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">mnist</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">fashion-mnist</span><span class="sh">'</span><span class="p">]:</span>
            <span class="n">x</span> <span class="o">-=</span> <span class="n">mean</span>
        <span class="k">elif</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">svhn</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cifar10</span><span class="sh">'</span><span class="p">]:</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">matmul</span><span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="n">mean</span><span class="p">),</span> <span class="n">zca</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">x</span>

<span class="c1">#Standard logistic distribution.
</span><span class="k">class</span> <span class="nc">StandardLogistic</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">distributions</span><span class="p">.</span><span class="n">Distribution</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">(</span><span class="n">StandardLogistic</span><span class="p">,</span> <span class="n">self</span><span class="p">).</span><span class="nf">__init__</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">log_prob</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Computes data log-likelihood.

        Args:
            x: input tensor.
        Returns:
            log-likelihood.
        </span><span class="sh">"""</span>
        <span class="k">return</span> <span class="o">-</span><span class="p">(</span><span class="n">F</span><span class="p">.</span><span class="nf">softplus</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">F</span><span class="p">.</span><span class="nf">softplus</span><span class="p">(</span><span class="o">-</span><span class="n">x</span><span class="p">))</span>

    <span class="k">def</span> <span class="nf">sample</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
        <span class="sh">"""</span><span class="s">Samples from the distribution.

        Args:
            size: number of samples to generate.
        Returns:
            samples.
        </span><span class="sh">"""</span>
        <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="nf">is_available</span><span class="p">():</span>
            <span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">distributions</span><span class="p">.</span><span class="nc">Uniform</span><span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">).</span><span class="nf">sample</span><span class="p">(</span><span class="n">size</span><span class="p">).</span><span class="nf">cuda</span><span class="p">()</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">z</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">distributions</span><span class="p">.</span><span class="nc">Uniform</span><span class="p">(</span><span class="mf">0.</span><span class="p">,</span> <span class="mf">1.</span><span class="p">).</span><span class="nf">sample</span><span class="p">(</span><span class="n">size</span><span class="p">).</span><span class="nf">cpu</span><span class="p">()</span>

        <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="n">z</span><span class="p">)</span> <span class="o">-</span> <span class="n">torch</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mf">1.</span> <span class="o">-</span> <span class="n">z</span><span class="p">)</span>
</code></pre></div></div>

<h1 id="train-example">Train example</h1>

<ul>
  <li>4 different data sets are included: <code class="language-plaintext highlighter-rouge">"mnist"</code>,<code class="language-plaintext highlighter-rouge">"fashion-mnist"</code>,<code class="language-plaintext highlighter-rouge">"svhn"</code> and <code class="language-plaintext highlighter-rouge">"cifar10"</code>.</li>
  <li>If <code class="language-plaintext highlighter-rouge">save_model_and_load = True</code>, then next training session starts with previous information of neural network.</li>
  <li>If gpu support is not present, it really takes a long time to train, so colab might be more preferable.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span><span class="p">,</span> <span class="n">torchvision</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">import</span> <span class="n">os</span>

<span class="n">dataset_choice</span> <span class="o">=</span> <span class="sh">"</span><span class="s">mnist</span><span class="sh">"</span> <span class="c1"># Other possible parameters: "fashion-mnist", "svhn", "cifar10".
</span><span class="n">max_iter</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># Around 4000 pictures start to have discernible shapes.
</span><span class="n">save_model_and_load</span> <span class="o">=</span> <span class="bp">True</span> <span class="c1"># If "True" trained model is saved and loades in every run.
</span>

<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">):</span>

    <span class="k">if</span> <span class="n">torch</span><span class="p">.</span><span class="n">cuda</span><span class="p">.</span><span class="nf">is_available</span><span class="p">():</span>
        <span class="n">device</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">device</span><span class="p">(</span><span class="sh">"</span><span class="s">cuda:0</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">device</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">device</span><span class="p">(</span><span class="sh">"</span><span class="s">cpu</span><span class="sh">"</span><span class="p">)</span>

    <span class="c1"># model hyperparameters
</span>    <span class="n">dataset</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">dataset</span>
    <span class="n">batch_size</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">batch_size</span>
    <span class="n">latent</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">latent</span>
    <span class="n">max_iter</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">max_iter</span>
    <span class="n">sample_size</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">sample_size</span>
    <span class="n">coupling</span> <span class="o">=</span> <span class="mi">4</span>
    <span class="n">mask_config</span> <span class="o">=</span> <span class="mf">1.</span>

    <span class="c1"># optimization hyperparameters
</span>    <span class="n">lr</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">lr</span>
    <span class="n">momentum</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">momentum</span>
    <span class="n">decay</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">decay</span>

    <span class="n">zca</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="n">mean</span> <span class="o">=</span> <span class="bp">None</span>

    <span class="k">if</span> <span class="n">dataset</span> <span class="o">==</span> <span class="sh">'</span><span class="s">mnist</span><span class="sh">'</span><span class="p">:</span>

        <span class="n">mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./NICE/statistics/mnist_mean.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="p">(</span><span class="n">full_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">*</span> <span class="mi">28</span> <span class="o">*</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
        <span class="n">transform</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()</span>
        <span class="n">trainset</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">datasets</span><span class="p">.</span><span class="nc">MNIST</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="sh">'</span><span class="s">~/torch/data/MNIST</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">train</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform</span><span class="p">)</span>
        <span class="n">trainloader</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="nc">DataLoader</span><span class="p">(</span><span class="n">trainset</span><span class="p">,</span>
            <span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">num_workers</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

    <span class="k">elif</span> <span class="n">dataset</span> <span class="o">==</span> <span class="sh">'</span><span class="s">fashion-mnist</span><span class="sh">'</span><span class="p">:</span>
        <span class="n">mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./statistics/fashion_mnist_mean.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="p">(</span><span class="n">full_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">*</span> <span class="mi">28</span> <span class="o">*</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
        <span class="n">transform</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()</span>
        <span class="n">trainset</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">datasets</span><span class="p">.</span><span class="nc">FashionMNIST</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="sh">'</span><span class="s">~/torch/data/FashionMNIST</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">train</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform</span><span class="p">)</span>
        <span class="n">trainloader</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="nc">DataLoader</span><span class="p">(</span><span class="n">trainset</span><span class="p">,</span>
            <span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">num_workers</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">dataset</span> <span class="o">==</span> <span class="sh">'</span><span class="s">svhn</span><span class="sh">'</span><span class="p">:</span>
        <span class="n">zca</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./statistics/svhn_zca_3.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./statistics/svhn_mean.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="p">(</span><span class="n">full_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">*</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">2000</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
        <span class="n">transform</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">transforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()</span>
        <span class="n">trainset</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">datasets</span><span class="p">.</span><span class="nc">SVHN</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="sh">'</span><span class="s">~/torch/data/SVHN</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">split</span><span class="o">=</span><span class="sh">'</span><span class="s">train</span><span class="sh">'</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform</span><span class="p">)</span>
        <span class="n">trainloader</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="nc">DataLoader</span><span class="p">(</span><span class="n">trainset</span><span class="p">,</span>
            <span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">num_workers</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">dataset</span> <span class="o">==</span> <span class="sh">'</span><span class="s">cifar10</span><span class="sh">'</span><span class="p">:</span>
        <span class="n">zca</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./statistics/cifar10_zca_3.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">mean</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">'</span><span class="s">./statistics/cifar10_mean.pt</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">transform</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">transforms</span><span class="p">.</span><span class="nc">Compose</span><span class="p">(</span>
        <span class="p">[</span><span class="n">torchvision</span><span class="p">.</span><span class="n">transforms</span><span class="p">.</span><span class="nc">RandomHorizontalFlip</span><span class="p">(</span><span class="n">p</span><span class="o">=</span><span class="mf">0.5</span><span class="p">),</span>
         <span class="n">torchvisitransforms</span><span class="p">.</span><span class="nc">ToTensor</span><span class="p">()])</span>
        <span class="p">(</span><span class="n">full_dim</span><span class="p">,</span> <span class="n">mid_dim</span><span class="p">,</span> <span class="n">hidden</span><span class="p">)</span> <span class="o">=</span> <span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="mi">32</span> <span class="o">*</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">2000</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>
        <span class="n">trainset</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">datasets</span><span class="p">.</span><span class="nc">CIFAR10</span><span class="p">(</span><span class="n">root</span><span class="o">=</span><span class="sh">'</span><span class="s">~/torch/data/CIFAR10</span><span class="sh">'</span><span class="p">,</span>
            <span class="n">train</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">download</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">transform</span><span class="o">=</span><span class="n">transform</span><span class="p">)</span>
        <span class="n">trainloader</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="nc">DataLoader</span><span class="p">(</span><span class="n">trainset</span><span class="p">,</span>
            <span class="n">batch_size</span><span class="o">=</span><span class="n">batch_size</span><span class="p">,</span> <span class="n">shuffle</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">num_workers</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">latent</span> <span class="o">==</span> <span class="sh">'</span><span class="s">normal</span><span class="sh">'</span><span class="p">:</span>
        <span class="n">prior</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">distributions</span><span class="p">.</span><span class="nc">Normal</span><span class="p">(</span>
            <span class="n">torch</span><span class="p">.</span><span class="nf">tensor</span><span class="p">(</span><span class="mf">0.</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">),</span> <span class="n">torch</span><span class="p">.</span><span class="nf">tensor</span><span class="p">(</span><span class="mf">1.</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">))</span>
    <span class="k">elif</span> <span class="n">latent</span> <span class="o">==</span> <span class="sh">'</span><span class="s">logistic</span><span class="sh">'</span><span class="p">:</span>
        <span class="n">prior</span> <span class="o">=</span> <span class="nc">StandardLogistic</span><span class="p">()</span>

    <span class="n">filename</span> <span class="o">=</span> <span class="sh">'</span><span class="s">%s_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">dataset</span> \
             <span class="o">+</span> <span class="sh">'</span><span class="s">bs%d_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">batch_size</span> \
             <span class="o">+</span> <span class="sh">'</span><span class="s">%s_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">latent</span> \
             <span class="o">+</span> <span class="sh">'</span><span class="s">cp%d_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">coupling</span> \
             <span class="o">+</span> <span class="sh">'</span><span class="s">md%d_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">mid_dim</span> \
             <span class="o">+</span> <span class="sh">'</span><span class="s">hd%d_</span><span class="sh">'</span> <span class="o">%</span> <span class="n">hidden</span>

    <span class="n">flow</span> <span class="o">=</span> <span class="nc">NICE</span><span class="p">(</span><span class="n">prior</span><span class="o">=</span><span class="n">prior</span><span class="p">,</span>
                <span class="n">coupling</span><span class="o">=</span><span class="n">coupling</span><span class="p">,</span>
                <span class="n">in_out_dim</span><span class="o">=</span><span class="n">full_dim</span><span class="p">,</span>
                <span class="n">mid_dim</span><span class="o">=</span><span class="n">mid_dim</span><span class="p">,</span>
                <span class="n">hidden</span><span class="o">=</span><span class="n">hidden</span><span class="p">,</span>
                <span class="n">mask_config</span><span class="o">=</span><span class="n">mask_config</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>
    <span class="n">optimizer</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="nc">Adam</span><span class="p">(</span>
        <span class="n">flow</span><span class="p">.</span><span class="nf">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="n">lr</span><span class="p">,</span> <span class="n">betas</span><span class="o">=</span><span class="p">(</span><span class="n">momentum</span><span class="p">,</span> <span class="n">decay</span><span class="p">),</span> <span class="n">eps</span><span class="o">=</span><span class="mf">1e-4</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">save_model_and_load</span><span class="p">:</span>
        <span class="n">PATH</span> <span class="o">=</span> <span class="sh">'</span><span class="s">./models/</span><span class="sh">'</span> <span class="o">+</span> <span class="n">filename</span> <span class="o">+</span> <span class="sh">'</span><span class="s">last.tar</span><span class="sh">'</span>
        <span class="k">if</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">exists</span><span class="p">(</span><span class="sh">'</span><span class="s">./models</span><span class="sh">'</span><span class="p">)</span> <span class="ow">and</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">isfile</span><span class="p">(</span><span class="n">PATH</span><span class="p">):</span>
            <span class="n">checkpoint</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="n">PATH</span><span class="p">)</span>
            <span class="n">flow</span><span class="p">.</span><span class="nf">load_state_dict</span><span class="p">(</span><span class="n">checkpoint</span><span class="p">[</span><span class="sh">'</span><span class="s">model_state_dict</span><span class="sh">'</span><span class="p">])</span>
            <span class="n">optimizer</span><span class="p">.</span><span class="nf">load_state_dict</span><span class="p">(</span><span class="n">checkpoint</span><span class="p">[</span><span class="sh">'</span><span class="s">optimizer_state_dict</span><span class="sh">'</span><span class="p">])</span>


    <span class="n">total_iter</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">train</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">running_loss</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">while</span> <span class="n">train</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">data</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">trainloader</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
            <span class="n">flow</span><span class="p">.</span><span class="nf">train</span><span class="p">()</span>    <span class="c1"># set to training mode
</span>            <span class="k">if</span> <span class="n">total_iter</span> <span class="o">==</span> <span class="n">max_iter</span><span class="p">:</span>
                <span class="n">train</span> <span class="o">=</span> <span class="bp">False</span>
                <span class="k">break</span>

            <span class="n">total_iter</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">optimizer</span><span class="p">.</span><span class="nf">zero_grad</span><span class="p">()</span>    <span class="c1"># clear gradient tensors
</span>
            <span class="n">inputs</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">data</span>
            <span class="n">inputs</span> <span class="o">=</span> <span class="nf">prepare_data</span><span class="p">(</span>
                <span class="n">inputs</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">zca</span><span class="o">=</span><span class="n">zca</span><span class="p">,</span> <span class="n">mean</span><span class="o">=</span><span class="n">mean</span><span class="p">).</span><span class="nf">to</span><span class="p">(</span><span class="n">device</span><span class="p">)</span>

            <span class="c1"># log-likelihood of input minibatch
</span>            <span class="n">loss</span> <span class="o">=</span> <span class="o">-</span><span class="nf">flow</span><span class="p">(</span><span class="n">inputs</span><span class="p">).</span><span class="nf">mean</span><span class="p">()</span>
            <span class="n">running_loss</span> <span class="o">+=</span> <span class="nf">float</span><span class="p">(</span><span class="n">loss</span><span class="p">)</span>

            <span class="c1"># backprop and update parameters
</span>            <span class="n">loss</span><span class="p">.</span><span class="nf">backward</span><span class="p">()</span>
            <span class="n">optimizer</span><span class="p">.</span><span class="nf">step</span><span class="p">()</span>

            <span class="k">if</span> <span class="n">total_iter</span> <span class="o">==</span> <span class="n">max_iter</span> <span class="ow">or</span> <span class="n">total_iter</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span><span class="mi">0</span><span class="p">:</span>
                <span class="n">mean_loss</span> <span class="o">=</span> <span class="n">running_loss</span> <span class="o">/</span> <span class="n">total_iter</span>
                <span class="n">bit_per_dim</span> <span class="o">=</span> <span class="p">(</span><span class="n">mean_loss</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mf">256.</span><span class="p">)</span> <span class="o">*</span> <span class="n">full_dim</span><span class="p">)</span> \
                            <span class="o">/</span> <span class="p">(</span><span class="n">full_dim</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mf">2.</span><span class="p">))</span>
                <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">iter %s:</span><span class="sh">'</span> <span class="o">%</span> <span class="n">total_iter</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">loss = %.3f</span><span class="sh">'</span> <span class="o">%</span> <span class="n">mean_loss</span><span class="p">,</span>
                    <span class="sh">'</span><span class="s">bits/dim = %.3f</span><span class="sh">'</span> <span class="o">%</span> <span class="n">bit_per_dim</span><span class="p">)</span>
                <span class="n">running_loss</span> <span class="o">=</span> <span class="mf">0.0</span>

                <span class="n">flow</span><span class="p">.</span><span class="nf">eval</span><span class="p">()</span>        <span class="c1"># set to inference mode
</span>                <span class="k">with</span> <span class="n">torch</span><span class="p">.</span><span class="nf">no_grad</span><span class="p">():</span>
                    <span class="n">z</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">flow</span><span class="p">.</span><span class="nf">f</span><span class="p">(</span><span class="n">inputs</span><span class="p">)</span>
                    <span class="n">samples</span> <span class="o">=</span> <span class="n">flow</span><span class="p">.</span><span class="nf">sample</span><span class="p">(</span><span class="n">sample_size</span><span class="p">).</span><span class="nf">cpu</span><span class="p">()</span>
                    <span class="n">samples</span> <span class="o">=</span> <span class="nf">prepare_data</span><span class="p">(</span>
                        <span class="n">samples</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">zca</span><span class="o">=</span><span class="n">zca</span><span class="p">,</span> <span class="n">mean</span><span class="o">=</span><span class="n">mean</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>

                    <span class="n">npimg</span> <span class="o">=</span> <span class="n">torchvision</span><span class="p">.</span><span class="n">utils</span><span class="p">.</span><span class="nf">make_grid</span><span class="p">(</span><span class="n">samples</span><span class="p">).</span><span class="nf">numpy</span><span class="p">()</span>
                    <span class="n">plt</span><span class="p">.</span><span class="nf">imshow</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">transpose</span><span class="p">(</span><span class="n">npimg</span><span class="p">,</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">)))</span>


    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Finished training!</span><span class="sh">'</span><span class="p">)</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">exists</span><span class="p">(</span><span class="sh">'</span><span class="s">./models</span><span class="sh">'</span><span class="p">):</span>
        <span class="n">os</span><span class="p">.</span><span class="nf">makedirs</span><span class="p">(</span><span class="sh">'</span><span class="s">./models</span><span class="sh">'</span><span class="p">)</span>

    <span class="n">torch</span><span class="p">.</span><span class="nf">save</span><span class="p">({</span>
        <span class="sh">'</span><span class="s">total_iter</span><span class="sh">'</span><span class="p">:</span> <span class="n">total_iter</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">model_state_dict</span><span class="sh">'</span><span class="p">:</span> <span class="n">flow</span><span class="p">.</span><span class="nf">state_dict</span><span class="p">(),</span>
        <span class="sh">'</span><span class="s">optimizer_state_dict</span><span class="sh">'</span><span class="p">:</span> <span class="n">optimizer</span><span class="p">.</span><span class="nf">state_dict</span><span class="p">(),</span>
        <span class="sh">'</span><span class="s">dataset</span><span class="sh">'</span><span class="p">:</span> <span class="n">dataset</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">batch_size</span><span class="sh">'</span><span class="p">:</span> <span class="n">batch_size</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">latent</span><span class="sh">'</span><span class="p">:</span> <span class="n">latent</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">coupling</span><span class="sh">'</span><span class="p">:</span> <span class="n">coupling</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">mid_dim</span><span class="sh">'</span><span class="p">:</span> <span class="n">mid_dim</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">hidden</span><span class="sh">'</span><span class="p">:</span> <span class="n">hidden</span><span class="p">,</span>
        <span class="sh">'</span><span class="s">mask_config</span><span class="sh">'</span><span class="p">:</span> <span class="n">mask_config</span><span class="p">},</span>
        <span class="sh">'</span><span class="s">./models/</span><span class="sh">'</span> <span class="o">+</span> <span class="n">filename</span> <span class="o">+</span><span class="sh">'</span><span class="s">last.tar</span><span class="sh">'</span><span class="p">)</span>

    <span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Checkpoint Saved</span><span class="sh">'</span><span class="p">)</span>


<span class="k">class</span> <span class="nc">Args</span><span class="p">():</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">batch_size</span><span class="p">,</span> <span class="n">latent</span><span class="p">,</span> <span class="n">max_iter</span><span class="p">,</span> <span class="n">sample_size</span><span class="o">=</span><span class="mi">64</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">,</span> <span class="n">momentum</span><span class="o">=</span><span class="mf">0.9</span><span class="p">,</span> <span class="n">decay</span><span class="o">=</span><span class="mf">0.999</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">dataset</span> <span class="o">=</span> <span class="n">dataset</span>
        <span class="n">self</span><span class="p">.</span><span class="n">batch_size</span><span class="o">=</span> <span class="n">batch_size</span>
        <span class="n">self</span><span class="p">.</span><span class="n">latent</span> <span class="o">=</span> <span class="n">latent</span>
        <span class="n">self</span><span class="p">.</span><span class="n">max_iter</span> <span class="o">=</span> <span class="n">max_iter</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sample_size</span> <span class="o">=</span> <span class="n">sample_size</span> <span class="c1"># number of images to generate
</span>        <span class="n">self</span><span class="p">.</span><span class="n">lr</span> <span class="o">=</span> <span class="n">lr</span> <span class="c1"># learning rate
</span>        <span class="n">self</span><span class="p">.</span><span class="n">momentum</span><span class="o">=</span> <span class="n">momentum</span> <span class="c1"># beta1 in Adam optimizer
</span>        <span class="n">self</span><span class="p">.</span><span class="n">decay</span> <span class="o">=</span> <span class="n">decay</span> <span class="c1"># beta2 in Adam optimizer.
</span>
<span class="k">if</span> <span class="n">dataset_choice</span> <span class="o">==</span> <span class="sh">"</span><span class="s">mnist</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">args</span> <span class="o">=</span> <span class="nc">Args</span><span class="p">(</span><span class="n">dataset</span><span class="o">=</span><span class="sh">"</span><span class="s">mnist</span><span class="sh">"</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">latent</span><span class="o">=</span><span class="sh">"</span><span class="s">logistic</span><span class="sh">"</span><span class="p">,</span><span class="n">max_iter</span><span class="o">=</span><span class="n">max_iter</span><span class="p">)</span>

<span class="k">if</span> <span class="n">dataset_choice</span> <span class="o">==</span> <span class="sh">"</span><span class="s">fashion-mnist</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">args</span> <span class="o">=</span> <span class="nc">Args</span><span class="p">(</span><span class="n">dataset</span><span class="o">=</span><span class="sh">"</span><span class="s">fashion-mnist</span><span class="sh">"</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">latent</span><span class="o">=</span><span class="sh">"</span><span class="s">logistic</span><span class="sh">"</span><span class="p">,</span><span class="n">max_iter</span><span class="o">=</span><span class="n">max_iter</span><span class="p">)</span>

<span class="k">if</span> <span class="n">dataset_choice</span> <span class="o">==</span> <span class="sh">"</span><span class="s">svhn</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">args</span> <span class="o">=</span> <span class="nc">Args</span><span class="p">(</span><span class="n">dataset</span><span class="o">=</span><span class="sh">"</span><span class="s">svhn</span><span class="sh">"</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">latent</span><span class="o">=</span><span class="sh">"</span><span class="s">logistic</span><span class="sh">"</span><span class="p">,</span><span class="n">max_iter</span><span class="o">=</span><span class="n">max_iter</span><span class="p">)</span>

<span class="k">if</span> <span class="n">dataset_choice</span> <span class="o">==</span><span class="sh">"</span><span class="s">cifar10</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">args</span> <span class="o">=</span> <span class="nc">Args</span><span class="p">(</span><span class="n">dataset</span><span class="o">=</span><span class="sh">"</span><span class="s">cifar10</span><span class="sh">"</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">latent</span><span class="o">=</span><span class="sh">"</span><span class="s">logistic</span><span class="sh">"</span><span class="p">,</span><span class="n">max_iter</span><span class="o">=</span><span class="n">max_iter</span><span class="p">)</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>

    <span class="nf">main</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
</code></pre></div></div>

<figure>
<img src="fig_2.png" />
<figcaption>Fig 2. Result of preliminary generated numbers.</figcaption>
</figure>]]></content><author><name>Onur Tunali</name></author><category term="ML" /><category term="machine-learning" /><category term="paper" /><summary type="html"><![CDATA[NICE is a deep learning framework changing high dimensional complex data into non linear independent components. This post summarizes the paper and explains some left out mathematical concepts especially why resulting jacobian of transformation function is unit constant and how to derive it. In addition, pytorch implementation of experimental results are given.]]></summary></entry><entry><title type="html">Empirical Rademacher Complexity and Its Implications to Deep Learning</title><link href="/ml/2019/02/01/empirical-rademacher-complexity-and-its-implications-to-deep-learning.html" rel="alternate" type="text/html" title="Empirical Rademacher Complexity and Its Implications to Deep Learning" /><published>2019-02-01T22:54:40+03:00</published><updated>2019-02-01T22:54:40+03:00</updated><id>/ml/2019/02/01/empirical-rademacher-complexity-and-its-implications-to-deep-learning</id><content type="html" xml:base="/ml/2019/02/01/empirical-rademacher-complexity-and-its-implications-to-deep-learning.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#formal-definition" id="markdown-toc-formal-definition">Formal definition</a></li>
  <li><a href="#combinatorics-proof" id="markdown-toc-combinatorics-proof">Combinatorics proof</a></li>
  <li><a href="#widehatrad_nmathcalh-code-practice" id="markdown-toc-widehatrad_nmathcalh-code-practice">\(\widehat{Rad_{n}}~(\mathcal{H})\) <code class="language-plaintext highlighter-rouge">code practice</code></a></li>
  <li><a href="#implications-to-deep-learning" id="markdown-toc-implications-to-deep-learning">Implications to deep learning</a></li>
  <li><a href="#references" id="markdown-toc-references">References</a></li>
</ul>

<p>In machine learning, Rademacher complexity is used to measure the capacity of a hypothesis class from which utilized algorithm chooses its predictors and probably first proposed in <a href="#references">[1]</a>. In computational learning theory, it is possible to bound generalization loss by way of using data dependent rademacher complexity under certain assumptions. This is helpful in terms of studying  and deciding the <em>learnability</em> of a problem. However, when it comes to deep learning recent findings somewhat challenge the status quo of previous claim <a href="#references">[2]</a> which will be covered in later sections. Before diving into formal treatment, an informal example and explanation is given.</p>

<p>Let’s start with a classification problem. Chosen machine learning algorithm selects its predictor function from a hypothesis class \(h \in \mathcal{H}\) such that \(h : \mathcal{X} \to \mathbb{R}\). Since the task in question is classification, \(h : \mathcal{X} \to \{-1,+1\}\). So provided a training data set \(\mathcal{D} = \{x_{1},..,x_{N}\}\), our ideal predictor should output \(h(x) = -1\) if input \(x\) is not a member of class and \(h(x) = +1\) if it is. Because we are unaware of underlying distribution, at first an \(\mathcal{H}\) consists of \(h\)’s producing \(1\) for every instance of \(x\) is chosen.</p>

<p>Since size of training data is \(N\), total number of data instance assignments is \(2^{N}\). Therefore, our preferred \(\mathcal{H}\) would yield a correct classification at the rate of \(1 / 2^{N}\) since it classifies every instance as \(+1\). Considering this example, Rademacher complexity formally measures the capacity of \(\mathcal{H}\) such that how many of these assignments (of course in reality these assignments follow a distribution) can be classified correctly by \(\mathcal{H}\).</p>

<p><strong>Disclaimer:</strong> Combinatorics proof is rather strained and verbose. Nevertheless, the merit of combinatorics proof underlies its explanation of how an overly complicated hypothesis class is able to memorize (shatter in VC terminology) all instances of given data set.</p>

<h2 id="formal-definition">Formal definition</h2>

<p>Given a class of real-valued functions \(h \in \mathcal{H}\) (hypothesis class)  defined on \(\mathcal{X}\), a data sample of size \(n\), \(\mathcal{D} = \{x_{1},..,x_{n}\}\) distributed with respect to \(P\) over \(\mathcal{X}\) and finally binary values of \(\sigma = \{\sigma_{1},...,\sigma_{n}\}\) drawn independently from rademacher distribution which is \(\sigma_{i} \sim \mathcal{Bern(1/2)}, P(\sigma_{i} = 1) = P(\sigma_{i} = -1) = 1/2\). After giving the basic concepts, we can define the following expression as the correlation:</p>

\[\sup_{h \in H} \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}~ h_{i} \right). \tag{1}\]

<p>In this expression \(h_{i} = h(x_{i})\) and expected value of correlation (1) with respect to \(\sigma\)</p>

\[\widehat{Rad_{n}}~(\mathcal{H}) = E_{\sigma}~\left[\sup_{h \in H} \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}~h_{i} \right) \right]. \tag{2}\]

<p>is defined as <em>empirical rademacher complexity</em>. It will be shown that</p>

\[0 \leq \widehat{Rad_{n}}~(\mathcal{H}) \leq 1 \tag{3}\]

<p>Finally, the rademacher complexity of the class \(\mathcal{H}\) is defined as the expectation
of \(\widehat{Rad_{n}}~(\mathcal{H})\) over samples \(\mathcal{D}\) of size n drawn according to distribution of \(P\)</p>

\[Rad_{n}~(\mathcal{H}) = E_{P} ~ [ \widehat{Rad_{n}}~(\mathcal{H})] \tag{4}\]

<p>Two important points are in \(\widehat{Rad_{n}}~(\mathcal{H})\) given data sample is constant, but \(\sigma\) values are changing. In \(Rad_{n}~(\mathcal{H})\), both \(\sigma\) and data sample is changing. Following proofs are constructed regarding a binary classifier.</p>

<h2 id="combinatorics-proof">Combinatorics proof</h2>

<p><strong>Claim:</strong>  \(0 \leq \widehat{Rad_{n}}~(\mathcal{H}) \leq 1\)</p>

<p><strong>Lower bound:</strong> Firstly, we start with lower bound  and show that it is 0. Let’s decide on an \(\mathcal{H}\) having a single \(h\) in other words \(\vert \mathcal{H} \vert = 1\) . Therefore, correlation (1) doesn’t need supremum since there is only one \(h(\mathcal{D}) = \{h_{1}, ... , h_{N}\}\). So equation (2) becomes</p>

\[\widehat{Rad_{n}}~(\mathcal{H}) = E_{\sigma}~\left[ \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}~h_{i} \right) \right] \tag{5}\]

<p>In total there are \(2^{N}\) different \(\sigma\)’s and the probability of any \(\sigma^{(j)}\) is \(P(\sigma^{(j)}) = 1 / 2^{N}\) due to the fact that \(\sigma = \{\sigma_{1},...,\sigma_{n}\}\) and \(\sigma_{i} \sim \mathcal{Bern(1/2)}\). If we expand the expected value expression</p>

\[\widehat{Rad_{n}}~(\mathcal{H}) = \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}^{(1)}~h_{i} \right) P(\sigma^{(1)}) + ... + \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}^{(2^{N})}~h_{i} \right) P(\sigma^{(2^{N})})\]

\[\widehat{Rad_{n}}~(\mathcal{H}) = \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}^{(1)}~h_{i} \right) \frac{1}{2^{N}} + ... + \left( \frac{1}{N} \sum_{i=1}^{n}~ \sigma_{i}^{(2^{N})}~h_{i} \right) \frac{1}{2^{N}}\]

\[\widehat{Rad_{n}}~(\mathcal{H}) = \frac{1}{2^{N}}~ \frac{1}{N} \left[ \left(  \sum_{i=1}^{n}~ \sigma_{i}^{(1)}~h_{i} \right)  + ... + \left(  \sum_{i=1}^{n}~ \sigma_{i}^{(2^{N})}~h_{i} \right) \right] \tag{6}\]

<p>Now, we need to determine a way to calculate \(\sum_{i=1}^{n}~ \sigma_{i}^{(j)}~h_{i}\) expressions. As the result of \(\vert \mathcal{H} \vert = 1\), correlation \(\sum_{i=1}^{n}~ \sigma_{i}^{(j)}~h_{i}\) changes according to the number of mismatches between \(h_{i}\) and \(\sigma_{i}^{(j)}\). At most it is \(N\) and at least it is \(-N\). So we can generalize the value of \(\sum_{i=1}^{n}~ \sigma_{i}^{(j)}~h_{i}\) in terms of mismatches between given \(\sigma^{(j)}\) and \(h\). If there are \(k\) mismatches, total sum would be \((N-k) \times +1 + k \times -1 = N - 2k\) and there would be \(\binom{N}{k}\) different cases of \(k\) mismatches. Remembering the fact that \(\sigma\)’s contain all possible binary distributions, we can rewrite (6) as the sum of \(0\) mismatches through \(N\) mismatches.</p>

\[= \frac{1}{2^{N}}~ \frac{1}{N} \left[ \binom{N}{0} (N - 2.0) ~ + \binom{N}{1} (N - 2.1) ~ + ... + \binom{N}{N-1)} (N - 2(N-1)) ~ + \binom{N}{N} (N - 2.N) \right]\]

\[= \frac{1}{2^{N}}~ \frac{1}{N} \left[ \binom{N}{0} N ~ + \binom{N}{1} (N - 2) ~ + ... + \binom{N}{N-1)} (-N+2) ~ + \binom{N}{N} (-N) \right]\]

<p>Since \(\binom{N}{k} = \binom{N}{ N-k ~}\), previous expression is modified into</p>

\[\widehat{Rad_{n}}~(\mathcal{H}) = \frac{1}{2^{N}}~ \frac{1}{N} \left[ \binom{N}{0} N ~ + \binom{N}{1} (N - 2) ~ + ... - \binom{N}{1} (N-2) ~ - \binom{N}{0} N \right] = 0\]

<p>This result holds for both when \(N\) is odd and even.</p>

<p><strong>Upper bound:</strong> Secondly, we start with upper bound  and show that it is 1. This part of the proof is straightforward. Let’s decide on an \(\vert \mathcal{H} \vert = 2^{N}\) meaning for a given \(\mathcal{D} = \{x_{1},..,x_{n}\}\) every possible class assignment can be correctly classified by one of the \(h\) in \(\mathcal{H}\). Therefore, correlation (1.1) is 1 because there is always an \(h\) with no mismatches making \(1/N ~\sum_{i=1}^{n}~ \sigma_{i}~h_{i} = (1/N) N\), so supremum is 1. Finally, (5) becomes</p>

\[\widehat{Rad_{n}}~(\mathcal{H}) = \frac{1}{2^{N}} \left[ \underbrace{1 + ... + 1}_{2^{N}} \right]\]

\[\widehat{Rad_{n}}~(\mathcal{H}) = 1\]

\[0 \leq \widehat{Rad_{n}}~(\mathcal{H}) \leq 1 ~~~~ \Box\]

<h2 id="widehatrad_nmathcalh-code-practice">\(\widehat{Rad_{n}}~(\mathcal{H})\) <code class="language-plaintext highlighter-rouge">code practice</code></h2>

<p>Following code calculates \(\widehat{Rad_{n}}~(\mathcal{H})\) of a given hypothesis class with certain capacity. It doesn’t require any external library, so it is possible to run the code with standard python.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">itertools</span>

<span class="n">n</span> <span class="o">=</span> <span class="mi">6</span>  <span class="c1"># Sample size Global variable.
</span><span class="n">test_capacity</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># Capacity of hypothesis class H.
</span>
<span class="n">WHOLE_CAPACITY_TRIAL</span> <span class="o">=</span> <span class="bp">True</span>  <span class="c1"># If True, every capacity is calculated.
</span><span class="n">trial_range</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="o">**</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span>


<span class="k">class</span> <span class="nc">HypothesisClass</span><span class="p">:</span>

    <span class="sh">"""</span><span class="s"> capacity should be between 1 and 2^n </span><span class="sh">"""</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">capacity</span><span class="p">):</span>

        <span class="n">self</span><span class="p">.</span><span class="n">capacity</span> <span class="o">=</span> <span class="n">capacity</span>
        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">capacity</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="o">**</span><span class="n">n</span><span class="p">:</span>
            <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Capacity is greater than 2^n</span><span class="sh">"</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">whole_class</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="nf">islice</span><span class="p">(</span><span class="n">itertools</span><span class="p">.</span><span class="nf">product</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">repeat</span><span class="o">=</span><span class="n">n</span><span class="p">),</span> <span class="n">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">whole_class</span>

    <span class="k">def</span> <span class="nf">__next__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">return</span> <span class="nf">list</span><span class="p">(</span><span class="nf">next</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">whole_class</span><span class="p">))</span>


<span class="k">def</span> <span class="nf">rademacher_distirbution</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="n">distribution</span> <span class="o">=</span> <span class="n">itertools</span><span class="p">.</span><span class="nf">product</span><span class="p">([</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">repeat</span><span class="o">=</span><span class="n">n</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">distribution</span>


<span class="k">def</span> <span class="nf">supremum_finder</span><span class="p">(</span><span class="n">sigma_sample</span><span class="p">,</span> <span class="n">capacity</span><span class="p">):</span>
    <span class="n">H</span> <span class="o">=</span> <span class="nc">HypothesisClass</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
    <span class="n">supremum</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="o">*</span> <span class="nf">float</span><span class="p">(</span><span class="sh">"</span><span class="s">inf</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">correlation</span><span class="p">(</span><span class="n">sigma_sample</span><span class="p">,</span> <span class="n">hypothesis_instance</span><span class="p">):</span>
        <span class="n">result</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">([</span><span class="n">sigma_sample</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">hypothesis_instance</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">n</span><span class="p">)])</span>
        <span class="k">return</span> <span class="n">result</span>

    <span class="k">for</span> <span class="n">hypothesis_instance</span> <span class="ow">in</span> <span class="n">H</span><span class="p">:</span>
        <span class="n">hypothesis_instance</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">hypothesis_instance</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">=</span> <span class="nf">correlation</span><span class="p">(</span><span class="n">sigma_sample</span><span class="p">,</span> <span class="n">hypothesis_instance</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">result</span> <span class="o">&gt;</span> <span class="n">supremum</span><span class="p">:</span>
            <span class="n">supremum</span> <span class="o">=</span> <span class="n">result</span>

    <span class="k">return</span> <span class="n">supremum</span>


<span class="k">def</span> <span class="nf">emprical_rademacher_complexity</span><span class="p">(</span><span class="n">capacity</span><span class="p">):</span>

    <span class="n">result</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">sigma_distribution</span> <span class="o">=</span> <span class="nf">rademacher_distirbution</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Capacity of H is </span><span class="si">{</span><span class="n">capacity</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">sigma_sample</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">sigma_distribution</span><span class="p">):</span>
        <span class="n">sigma_sample</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">sigma_sample</span><span class="p">)</span>
       <span class="c1"># print(f"Sigma {index} is {sigma_sample}")
</span>        <span class="n">current_supremum</span> <span class="o">=</span> <span class="nf">supremum_finder</span><span class="p">(</span><span class="n">sigma_sample</span><span class="p">,</span> <span class="n">capacity</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">+=</span> <span class="n">current_supremum</span>

    <span class="k">return</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span> <span class="o">/</span> <span class="p">(</span><span class="n">n</span> <span class="o">*</span> <span class="mi">2</span><span class="o">**</span><span class="n">n</span><span class="p">),</span> <span class="mi">2</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>

    <span class="n">complexity_results</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">for</span> <span class="n">capacity</span> <span class="ow">in</span> <span class="n">trial_range</span><span class="p">:</span>
        <span class="n">complexity_results</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">emprical_rademacher_complexity</span><span class="p">(</span><span class="n">capacity</span><span class="p">))</span>

    <span class="k">return</span> <span class="n">complexity_results</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>

    <span class="k">if</span> <span class="n">WHOLE_CAPACITY_TRIAL</span><span class="p">:</span>

        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="se">\n</span><span class="s"> </span><span class="se">\t</span><span class="s"> Emprical Rademacher complexity of H with capacities </span><span class="se">\
</span><span class="s">        </span><span class="si">{</span><span class="n">trial_range</span><span class="si">}</span><span class="s">:</span><span class="se">\n</span><span class="s"> </span><span class="se">\t</span><span class="s"> Rad(H) = </span><span class="si">{</span><span class="nf">main</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">else</span><span class="p">:</span>
        <span class="n">rademacher_complexity_of_H</span> <span class="o">=</span> <span class="nf">emprical_rademacher_complexity</span><span class="p">(</span><span class="n">test_capacity</span><span class="p">)</span>

        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="se">\n</span><span class="s"> </span><span class="se">\t</span><span class="s"> Emprical Rademacher complexity of H with capacity </span><span class="se">\
</span><span class="s">        </span><span class="si">{</span><span class="n">test_capacity</span><span class="si">}</span><span class="s">:</span><span class="se">\n</span><span class="s"> </span><span class="se">\t</span><span class="s"> Rad(H) = </span><span class="si">{</span><span class="n">rademacher_complexity_of_H</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

</code></pre></div></div>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Capacity of H is 1
Capacity of H is 2
Capacity of H is 4
Capacity of H is 8
Capacity of H is 16
Capacity of H is 32
Capacity of H is 64

Emprical Rademacher complexity of H with capacities <span class="o">[</span>1, 2, 4, 8, 16, 32, 64]:
Rad<span class="o">(</span>H<span class="o">)</span> <span class="o">=</span> <span class="o">[</span>0.0, 0.17, 0.33, 0.5, 0.67, 0.83, 1.0]
</code></pre></div></div>

<h2 id="implications-to-deep-learning">Implications to deep learning</h2>

<p>In conventional machine learning approaches, results of computational learning theory states that we can bound generalization loss \(\mathcal{L}_{p}~(h)\) with using empirical loss \(\mathcal{L}_{D}~(h)\) (for further detail check <a href="https://onurtunali.github.io/ml/2019/01/08/a-brief-introduction-to-ml_2_i.html">a brief introduction to ML series</a>), empirical rademacher complexity of hypothesis class and some confidence related constant. Using the inequality (13)  in <a href="#references">[3]</a> and without being too strict, we can write</p>

\[\mathcal{L}_{p}~(h) \leq \mathcal{L}_{D}~(h) + \widehat{Rad_{n}}~(\mathcal{H}) + C(\delta,n) \tag{7}\]

<p>which indicates that discrepancy between generalization loss and training loss is constrained by empirical rademacher complexity.</p>

\[\mathcal{L}_{p}~(h) - \mathcal{L}_{D}~(h) \leq \widehat{Rad_{n}}~(\mathcal{H}) + C(\delta,n) \tag{8}\]

<p>That is to say if a hypothesis class with high complexity is used, \(\widehat{Rad_{n}}~(\mathcal{H})\) approaches to 1 and difference between training and generalization loss diverge according to (8) so that overfitting occurs. For this reason it is expected that if a hypothesis class is too complex and able to memorize all the training data (\(\mathcal{L}_{D}~(h) \to 0\)), then it generalizes poorly in case the amount of training data is insufficient. However, it is known that deep neural networks generalize well despite the fact that they are shown to be able to even memorize random data in <a href="#references">[2]</a>. This indicates that our customary understanding of generalization doesn’t exactly holds for deep neural networks and a new point of view is due.</p>

<h2 id="references">References</h2>

<p><a href="#references">[1]</a> Peter L. Bartlett and Shahar Mendelson, “<em>Rademacher and Gaussian complexities: Risk bounds and structural results</em>”, Journal of Machine Learning Research, 2002.</p>

<p><a href="#references">[2]</a> Chiyuan Zhang, Samy Bengio, Moritz Hardt, Benjamin Recht, Oriol Vinyals, “<em>Understanding Deep Learning Requires Rethinking Generalization</em>”, ICLR, <a href="https://arxiv.org/abs/1611.03530">arXiv:1611.03530</a>, 2017.</p>

<p><a href="#references">[3]</a> Pirmin Lemberger, “<em>On Generalization and Regularization in Deep Learning</em>”, <a href="https://arxiv.org/abs/1704.01312">arXiv:1704.01312</a>, 2017.</p>]]></content><author><name>Onur Tunali</name></author><category term="ML" /><category term="machine-learning" /><category term="paper" /><summary type="html"><![CDATA[In machine learning, Rademacher complexity is used to measure the capacity of a hypothesis class from which utilized algorithm chooses its predictors and probably first proposed in [1]. In computational learning theory, it is possible to bound generalization loss by way of using data dependent rademacher complexity under certain assumptions.]]></summary></entry><entry><title type="html">A Brief Introduction to Machine Learning for Engineers</title><link href="/ml/2019/01/01/a-brief-introduction-to-ml.html" rel="alternate" type="text/html" title="A Brief Introduction to Machine Learning for Engineers" /><published>2019-01-01T22:54:40+03:00</published><updated>2019-01-01T22:54:40+03:00</updated><id>/ml/2019/01/01/a-brief-introduction-to-ml</id><content type="html" xml:base="/ml/2019/01/01/a-brief-introduction-to-ml.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#1-introduction" id="markdown-toc-1-introduction">1. Introduction</a>    <ul>
      <li><a href="#11-machine-learning-subfields" id="markdown-toc-11-machine-learning-subfields">1.1 Machine Learning Subfields</a></li>
    </ul>
  </li>
  <li><a href="#2-a-gentle-introduction-through-linear-regression" id="markdown-toc-2-a-gentle-introduction-through-linear-regression">2. A “Gentle” Introduction Through Linear Regression</a>    <ul>
      <li><a href="#22-inference" id="markdown-toc-22-inference">2.2 Inference</a></li>
      <li><a href="#23-frequentist-framework" id="markdown-toc-23-frequentist-framework">2.3 Frequentist framework:</a>        <ul>
          <li><a href="#discriminative-vs-generative-probabilistic-models" id="markdown-toc-discriminative-vs-generative-probabilistic-models">Discriminative vs generative probabilistic models</a></li>
          <li><a href="#model-order-and-model-parameters" id="markdown-toc-model-order-and-model-parameters">Model order and model parameters</a></li>
          <li><a href="#maximum-likelihood-ml-learning" id="markdown-toc-maximum-likelihood-ml-learning">Maximum likelihood (ML) learning</a></li>
          <li><a href="#overfitting-and-underfitting" id="markdown-toc-overfitting-and-underfitting">Overfitting and underfitting</a></li>
          <li><a href="#validation-and-testing" id="markdown-toc-validation-and-testing">Validation and testing</a></li>
          <li><a href="#maximum-likelihood-code-practice" id="markdown-toc-maximum-likelihood-code-practice">Maximum likelihood <code class="language-plaintext highlighter-rouge">code practice</code></a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#2-a-gentle-introduction-through-linear-regression-1" id="markdown-toc-2-a-gentle-introduction-through-linear-regression-1">2. A “Gentle” Introduction Through Linear Regression</a>    <ul>
      <li><a href="#23-frequentist-framework-1" id="markdown-toc-23-frequentist-framework-1">2.3 Frequentist framework:</a>        <ul>
          <li><a href="#maximum-a-posteriori-map-learning" id="markdown-toc-maximum-a-posteriori-map-learning">Maximum a posteriori (MAP) learning</a></li>
          <li><a href="#regularization" id="markdown-toc-regularization">Regularization</a></li>
          <li><a href="#maximum-a-priori-code-practice" id="markdown-toc-maximum-a-priori-code-practice">Maximum a priori <code class="language-plaintext highlighter-rouge">code practice</code></a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#2-a-gentle-introduction-through-linear-regression-2" id="markdown-toc-2-a-gentle-introduction-through-linear-regression-2">2. A “Gentle” Introduction Through Linear Regression</a>    <ul>
      <li><a href="#24-bayesian-framework" id="markdown-toc-24-bayesian-framework">2.4 Bayesian framework:</a>        <ul>
          <li><a href="#ml-and-map-vs-bayesian" id="markdown-toc-ml-and-map-vs-bayesian">ML and MAP vs bayesian</a></li>
          <li><a href="#bayesian-code-practice" id="markdown-toc-bayesian-code-practice">Bayesian <code class="language-plaintext highlighter-rouge">code practice</code></a></li>
          <li><a href="#marginal-likelihood" id="markdown-toc-marginal-likelihood">Marginal likelihood</a></li>
          <li><a href="#marginal-likelihood-code-practice" id="markdown-toc-marginal-likelihood-code-practice">Marginal likelihood <code class="language-plaintext highlighter-rouge">code practice</code></a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<p>This is a rather dense book by <em>Osvaldo Simeone</em> which favors readers with solid background in mathematics as the title suggests. In short, its coverage can be described as a subset of <em>Pattern Recognition and Machine Learning</em> by Christopher Bishop.</p>

<p>However, it has its moments in terms of being terse, so be prepared to comb through <a href="https://stats.stackexchange.com/">stack exchange</a> for certain derivations. In this series of posts, brief chapter notes and specific derivation of equations, formulas etc left out for the reader in the book will be explained. Main references are listed below:</p>

<ul>
  <li><em>A Brief Introduction to ML for Engineers</em> by Osvaldo Simeone</li>
  <li><em>Pattern Recognition and Machine Learning</em> by Chrisopher Bisho</li>
  <li><em>Mathematics for Machine Learning</em> by Marc Peter Deisenroth, A Aldo Faisal, and Cheng Soon Ong (This is a fantastic book for strengthening math background and freely available at <a href="https://mml-book.github.io/">here</a></li>
</ul>

<p><strong>Note:</strong> Numbering of chapter titles and subtitles is chosen according to the book for making referencing easy.</p>

<p><strong>Quick Notation:</strong> The most common symbols are shown and the rest will be clarified as introduced.</p>

<ul>
  <li>Random variables are denoted with roman typeface \({\rm x}\) and their value regular font \(x\)</li>
  <li>Matrices are denoted with upper case \(X\) and random matrices with roman typeface \({\rm X}\)</li>
  <li>Vectors are in column form</li>
  <li>\(\log\) is base 2 and \(\ln\) is natural logarithm</li>
</ul>

<h1 id="1-introduction">1. Introduction</h1>

<p>Definition of machine learning given by <a href="http://jwmi.github.io/index.html">mahtematicalmonk</a> such that “algorithms for inferring unknowns from knowns” captures the essence of the field. As the saying goes “thinking is comparing”, we can cement our understanding of machine learning by contrasting it with classical engineering:</p>

<p>Classical engineering approach: Domain knowledge and in-depth analysis \(\rightarrow\) math model \(\rightarrow\) hand crafted solutions.</p>

<p>ML approach: Train a generic model with substantial amount of data \(\rightarrow\) predict result.</p>

<h2 id="11-machine-learning-subfields">1.1 Machine Learning Subfields</h2>

<p>Machine learning as a field generally is divided under three topics:</p>

<p><strong>Supervised Learning:</strong> We have labeled data and main tasks are:</p>

<ul>
  <li>Classification</li>
  <li>Regression</li>
</ul>

<p><strong>Unsupervised Learning:</strong> We have unlabeled data and main tasks are:</p>

<ul>
  <li>Clustering</li>
  <li>Dimensionality reduction</li>
</ul>

<p><strong>Reinforcement Learning:</strong> Predicting optimal decision based on positive or negative feedback.</p>

<p>In addition, learning from data is executed according to following settings:</p>
<ul>
  <li><strong>Passive:</strong> Data is given <strong>Active:</strong> Learner can choose the data</li>
  <li><strong>Offline:</strong> Batch of training examples <strong>Online:</strong> Samples are provided in a stream.</li>
</ul>

<p>Algorithms in this book are introduced based on the theoretical arguments based on information theoretic performance metrics.</p>

<p><strong>Note:</strong> I strongly suggest the reader to open up a <a href="https://www.kaggle.com/">kaggle</a> account, because all jupyter notebooks in this site are publicly published there and can be used easily without any hassle of system specific installments or requirements.</p>

<h1 id="2-a-gentle-introduction-through-linear-regression">2. A “Gentle” Introduction Through Linear Regression</h1>

<p>Three main learning frameworks namely frequentist, bayesian and minimum description length (MDL) are studied in this chapter. It is is not possible to make inference or generalization without assumptions. Set of all assumptions made by learning algorithm is called <strong>inductive bias</strong>. How to predict according to frequentist and bayesian. MDL considers parsimonious description of data.</p>

<h2 id="22-inference">2.2 Inference</h2>

<p><strong>Inference problem setup:</strong> predict random variable \({\rm t}\), observation \({\rm x} = x\) known and \(P({\rm t}, {\rm x})\) denotes joint probability distribution.</p>

<p>To define an optimal inference, a loss function is established to curb the deviation between \(t\) and \(\hat{t}\) (predicted). An important loss function family is as follows:</p>

\[\ell_{q}~(t,\hat{t}) =  \vert  t - \hat{t}  \vert ^{q} ~~~~ (2.1)\]

<p>Once a loss function is determined, optimal \(\hat{t}(x)\) is characterized by minimizing \(\ell\).</p>

<p><strong>Generalization Loss:</strong> This loss measures the performance of our predictor for the whole population.</p>

\[\mathcal{L}_{p}~(\hat{t}) = E_{(x,t)\sim P(x,t)}~[\ell_{q}~(t,\hat{t})]~~~~ (2.2)\]

<p>The solution to this problem is given by optimal predictor:</p>

\[t^{*}(x) = \underset{\hat{t}}{argmin} ~ E_{t \vert x \sim P(t \vert x)}~[\ell_{q}~(t,\hat{t})  \vert  x]~~~~ (2.3)\]

<p>This is expression is found using law of iterated expectation: \(E_{(x,t)\sim P(x,t)}~[ Y ]= E_{ x \sim P(x)}~[E_{(t  \vert  x )\sim P(t \vert x)}~[ Y  \vert  x]]\) and if we plug \(\ell_{q}~(t,\hat{t})\) instead of Y, we obtain (2.3) which is called optimum predictor or Bayes prediction (not used in the book because it leads to confusion).</p>

<p><strong>Theorem 1:</strong> <em>If chosen loss function is quadratic loss \(\ell_{2} =  \vert t-\hat{t}(x) \vert ^{2}\), then the best predictor is \(t^{*}(x) = E_{(t  \vert  x )\sim P(t \vert x)}~[ t \vert x]\) which is the mean of the conditional probability \(P(t \vert x)\).</em></p>

<p>Let’s show this for the discrete case:</p>

\[E_{(t  \vert  x )\sim P(t \vert x)}~[ \ell_{2}~(t,\hat{t}(x)) \vert x] = \sum_{t}^{} (t-\hat{t}(x))^{2} P(t \vert x)\]

<p>expanding the quadratic form</p>

\[= \sum_{t}^{} t^{2}(x) P(t \vert x) - 2 \hat{t}(x) \underset{\text{equal to expected value t \vert x}}{\sum_{t}^{} t P(t \vert x)} + \hat{t}^{2}(x) \underset{\text{equal to 1, prob. axioms}}{\sum_{t}^{} P(t \vert x)}\]

<p>and then taking the derivative w.r.t. \(\hat{t}(x)\) and setting it to 0</p>

\[\frac{d E_{(t  \vert  x )\sim P(t \vert x)}~[ \ell_{2}~(t,\hat{t}(x)) \vert x]}{d\hat{t}(x)} =  0 - 2 \hat{t}(x)  E_{(t  \vert  x )\sim P(t \vert x)}~[ t \vert x] + 2 \hat{t}(x) = 0\]

\[\hat{t}(x) = E_{(t  \vert  x )\sim P(t \vert x)}~[ t \vert x] ~ \text{ which is the optimum predictor so } \hat{t}(x) = t^{*}(x)\]

<p>Main goal is to come up with a predictor \(\hat{t}\) yielding a performance \(\mathcal{L}_{p}~(\hat{t})\) as close as possible to \(\mathcal{L}_{p}~(t^{*}(x))\). Nevertheless one should note that \(p(x,t)\) is generally not known and this formulation of the problem applies to frequentist approach.</p>

<h2 id="23-frequentist-framework">2.3 Frequentist framework:</h2>
<p>This framework assumes that parameters exist and are constant. Also data points are drawn from an unknown underlying distribution such as \(P(x,t)\) with independent identically distributed (i.i.d. assumption):</p>

\[({\rm t_{n}}, {\rm x_{n}}) \underset{i.i.d.}{\sim} P(x,t), i=1...N\]

<p>Since \(P(x,t)\) is unknown two different approaches are :</p>

<ul>
  <li><strong>Separate learning and inference:</strong> Learn \(P_{D}~(t \vert x)\) an approximation to \(P(t \vert x)\) from data set \(D\) and then plug this to (2.3).</li>
</ul>

\[\hat{t}_{D}~(x) = \underset{\hat{t}}{argmin}~E_{t \vert x \sim P_{D}~(t \vert x)}~[\ell_{q}~(t,\hat{t})  \vert  x]~~~~ (2.6)\]

<ul>
  <li><strong>Direct inference:</strong> Empirical Risk Minimization (ERM) technique. Learn directly an approximation \(\hat{t}~(x)\) of the optimal decision rule by minimizing an empirical estimate</li>
</ul>

\[\hat{t}_{D} = \underset{\hat{t}}{argmin} \mathcal{L}_{D}~(\hat{t})~ (2.7)\]

<p>Where empirical risk or empirical loss \(\mathcal{L}_{D}~(\hat{t})\) defined as:</p>

\[\mathcal{L}_{D}~(\hat{t}) = \frac{1}{N} \sum_{n=1}^{N} \ell_{q}~(t_{n},\hat{t}(x_{n})\]

<p>First approach is more flexible. If \(P_{D}~(t \vert x)\) is a good approximation, then any loss function can be used (of course producing different performances). Second approach is tied to the specific loss function.</p>

<p><strong>Linear regression example (page 20):</strong></p>

<p><em>For x and t \(P(t,x) = P(t \vert x) P(x)\) is not known but \(P(t \vert x) \sim \mathcal{N}~(\sin{(2\pi x)}, 0.1)\) and \(x \sim \mathcal{U}~(0,1)\)</em></p>

<p>Since \({\rm x}\) has a uniform pdf and \({\rm t} \vert {\rm x}\) has a Gaussian pdf</p>

\[f(x) = 1, ~ f(t \vert x)=\frac{1}{\sqrt{2\pi}0.1} \exp \left(-\frac{1}{2}  \left(\frac{t - \sin{2\pi x}}{0.1}\right)^2 \right)\]

<p>So for a given \({\rm x}=x_{0}\), our best bet for the prediction of \(t\) is setting \(\hat{t}~(x_{0}) = \sin{2\pi x_{0}}\) which is the mean of the pdf. However using (2.3) and \(\ell_{2}\) loss function, we can derive \(\hat{t}(x)\) analytically as follows:</p>

\[E_{t \vert x \sim P(t \vert x)}~[\ell_{q}~(t,\hat{t})  \vert  x] = E_{t \vert x \sim P(t \vert x)}~[(t-\hat{t})^{2}  \vert  x]\]

\[= \int (t-\hat{t})^{2} ~ \frac{1}{\sqrt{2\pi}~0.1} \exp \left(-\frac{1}{2}  \left(\frac{t - \sin{2\pi x}}{0.1} \right)^2 \right) ~ dt\]

\[I = \frac{1}{\sqrt{2\pi}~0.1} \exp \left(-\frac{1}{2}  \left(\frac{t - \sin{2\pi x}}{0.1} \right)^2 \right)\]

\[E_{t \vert x \sim P(t \vert x)}~[(t-\hat{t})^{2}  \vert  x] = \int t^2 I dt - 2 \hat{t} \int t I dt + \hat{t}^2 \int I dt\]

<p>\(\int t I dt\) is equal to mean which is \(\sin{2\pi x}\) and \(\int I dt = 1\), finally expression becomes</p>

\[E_{t \vert x \sim P(t \vert x)}~[(t-\hat{t})^{2}  \vert  x] = \int t^2 I dt - 2 \hat{t} \sin{2\pi x} + \hat{t}^2\]

<p>If we take the derivative of the final expression with respect to \(\hat{t}\) and set to 0, we can find \(\hat{t}\) minimizing the \(E_{t \vert x \sim P(t \vert x)}~[(t-\hat{t})^{2}  \vert  x]\):</p>

\[\frac{d E_{t \vert x \sim P(t \vert x)}~[(t-\hat{t})^{2}  \vert  x]}{d \hat{t}} = 0 - 2 \sin{2\pi x} + 2 \hat{t} = 0\]

\[\hat{t} = \sin{2\pi x}\]

<p>Finally, if evaluate \(E_{t \vert x \sim P(t \vert x)}~[(t-\sin{2\pi x})^{2}  \vert  x]\) with plugging in our prediction function, expression coincides with the definition of variance. So naturally, our generalization loss is the variance of \(P(t \vert x)\) which is 0.1.</p>

<p>Summary of two solution approaches to the inference problem:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left"><strong>Method Components</strong></th>
      <th style="text-align: left"><strong>Direct Inference via ERM</strong></th>
      <th style="text-align: left"><strong>Separate Learning</strong> ( \(P(t \vert x)\) ) <strong>and Inference</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Dataset</td>
      <td style="text-align: left">\(D = \{ (x_{1},t_{1}), ..., (x_{N},t_{N}) \}\)</td>
      <td style="text-align: left">\(D = \{ (x_{1},t_{1}), ..., (x_{N},t_{N}) \}\)</td>
    </tr>
    <tr>
      <td style="text-align: left">Loss function</td>
      <td style="text-align: left">\(\ell_{q}~(t,\hat{t})\)</td>
      <td style="text-align: left">\(\ell_{q}~(t,\hat{t})\)</td>
    </tr>
    <tr>
      <td style="text-align: left">Probability Model</td>
      <td style="text-align: left">-</td>
      <td style="text-align: left">\({\rm t} \vert {\rm x} \sim P(t \vert x; \theta)\)</td>
    </tr>
    <tr>
      <td style="text-align: left">Empirical Loss</td>
      <td style="text-align: left">\(\mathcal{L}_{D}~(\hat{t}) = \frac{1}{N} \sum_{n=1}^{N} \ell_{q}~(t_{n},~\hat{t}(x_{n}))\)</td>
      <td style="text-align: left">-</td>
    </tr>
    <tr>
      <td style="text-align: left">Learning process</td>
      <td style="text-align: left">by minimizing \(\mathcal{L}_{D}~(\hat{t})\)</td>
      <td style="text-align: left">by maximizing model probability</td>
    </tr>
  </tbody>
</table>

<h3 id="discriminative-vs-generative-probabilistic-models">Discriminative vs generative probabilistic models</h3>

<p><strong>Discriminative model:</strong> To learn the approximation of \(P_{D}~(t \vert x)\), we start with a family of parametric distributions which is called hypothesis class. Then using a guiding criteria, predictive function is chosen by evaluation of a metric. In this setting \(\hat{t}\) is predictive function and \(P(t \vert x;\theta)\) is predictive distribution. Let’s model \(\hat{t}\) as a polynomial function with adding Gaussian noise</p>

<p>\(\hat{t} = \mathcal{M}(x,w) = \sum_{j=0}^{M} w_{j} x^{j} = w^{T} \phi(x)\)
\(\phi(x) = [1 ~ x ~ x^{2} ~ ... ~ x^{M}]^{T}\)</p>

<p>Since mean of \(P(t \vert x)\) corresponds to the highest value of pdf in Gaussian distribution</p>

\[t \vert x \sim \mathcal{N}(\mathcal{M}(x,w), \beta^{-1})\]

<p>In here, \(\beta\) is called precision \({1}/{\beta} = \sigma^{2}\), so higher precision means lower variance.</p>

<p><strong>Generative model:</strong> Instead of modeling predictive function, we can directly model the joint distribution \(P(x,t \vert \theta)\) which requires stronger assumptions. Once we have learned the distribution from data, we can calculate our optimum predictor (2.6) for any loss function. Nevertheless, if starting assumptions mismatch with ground truth or real underlying distribution, bias issue would be more grave.</p>

<h3 id="model-order-and-model-parameters">Model order and model parameters</h3>

<p>During the linear regression example two set of parameters are chosen: Degree of polynomial \(M\) which is model order or hyperparameter that adjusts the complexity of hypothesis class, and second set is model parameters \(P(t\vert x;\theta),~ \theta = (w,\beta)\). It should be noted that we have used a semicolon for \(\theta\) which indicates that it is not a random variable and a model parameter. This distinction is required due to frequentist interpretation and will be clear when we study bayesian framework.   Hypreparameters are learned through validation. Model parameters are determined through learning process.</p>

<h3 id="maximum-likelihood-ml-learning">Maximum likelihood (ML) learning</h3>

<p>Assuming \(M\) is fixed, ML chooses the \(\theta\) which maximizes the probability of observing \(D\). We need to write the problem of \(D\) in terms of assumed discriminative model.</p>

\[P(t_{D}  \vert  X_{D}, w, \beta)  = \prod_{j=1}^{N} P(t_{j}  \vert  x_{j}; w, \beta) ~~ ~ \text{ data is i.i.d so product of individual pdf's is justified}\]

<p>Using Gaussian distribution, we need to maximize the following likelihood function</p>

\[= \prod_{j=1}^{N} \mathcal{N}(t_{n}  \vert  \mathcal{M}(x,w), \beta^{-1})\]

<p>Since it is easier to work with logarithms (in this case \(\ln\))</p>

\[\ln P(t_{D}  \vert  X_{D}, w, \beta) = \ln ~ \left( \prod_{j=1}^{N} \mathcal{N}(t_{n}  \vert  \mathcal{M}(x,w), \beta^{-1}) \right)\]

\[\ln P(t_{D}  \vert  X_{D}, w, \beta) = \ln ~ \left( (\frac{\beta}{\sqrt{2\pi}})^{N} \exp \left(-\frac{1}{2}  \frac{\sum_{n=1}^{N}~(t_{n} - \hat{t})^{2}}{\beta^{-1}} \right) \right)\]

\[= \frac{N}{2} \ln( \frac{\beta}{2\pi} ) -\frac{\beta}{2}  \sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2}\]

<p>Finally, multiplying the expression above with -2 and dividing by \(N\) (algebraic operations with constants doesn’t affect an optimization problem), we can turn this problem into a minimization:</p>

\[- \ln P(t_{D}  \vert  X_{D}, w, \beta) = \underset{w, \beta}{min}- \ln( \frac{\beta}{2\pi} ) + \frac{\beta}{N}\sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2} ~~~~ (2.15)\]

<p>This expression is called negative log likelihood. By only focusing on w and discarding \(\beta\)</p>

\[\mathcal{L_{D}} (w) = \underset{w}{min} \frac{1}{N}\sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2} ~~~~ (2.16)\]

<p>Let’s remember that we define \(\hat{t} = \mathcal{M}(x,w) = w^{T} \phi(x)\), so we try to find w minimizing \(\mathcal{L_{D}} (w)\) which is called training loss and the same as empirical loss used in ERM if \(\ell_{q} = \ell_{2}\).</p>

<p>The ERM problem can be solved in closed form if we define</p>

\[t_{D} \in \mathbb{R}^{N} \text{ as a column vector consisting of all t's in } D~ \text{ and } t_{D} = \begin{bmatrix} t_{1} \\ .\\.\\.\\ t_{N} \end{bmatrix}\]

\[X_{D} \in \mathbb{R}^{NxM} ~ \text{ and } ~ X_{D} = \begin{bmatrix} \phi(x_{1}) \\ .\\.\\.\\ \phi(x_{N}) \end{bmatrix} = \begin{bmatrix} \phi_{0}~(x_{1}) &amp; ... &amp; \phi_{M}~(x_{1}) \\ .\\.\\.\\ \phi_{0}~(x_{N}) &amp; ... &amp; \phi_{M}~(x_{N}) \end{bmatrix}\]

<p>and use these in \(\mathcal{L_{D}}~(w)\)</p>

\[\mathcal{L_{D}}~(w) = \frac{1}{N}  \vert  \vert t_{D} - X_{D}~w  \vert  \vert ^{2} = \frac{1}{N} (t_{D} - X_{D}~w)^{T} (t_{D} - X_{D}~w)\]

\[= \frac{1}{N}~(t_{D}^{T}~t_{D} - t_{D}^{T}~X_{D}~w - w^{T}~X_{D}^{T}~t_{D} + w^{T}~X_{D}^{T}~X_{D}~ w)\]

\[= \frac{1}{N}~(t_{D}^{T}~t_{D} - \underset{\text{scalar so transpose is the same}}{(t_{D}^{T}~X_{D}~w)^{T}} - w^{T}~X_{D}^{T}~t_{D} + w^{T}~X_{D}^{T}~X_{D}~ w)\]

\[= \frac{1}{N}~(t_{D}^{T}~t_{D} - 2w^{T}~X_{D}^{T}~t_{D} + w^{T}~X_{D}^{T}~X_{D}~ w)\]

<p>Since our starting expression is convex and has a global extremum, if we take the derivative of the expression above with respect to w and set it to 0:</p>

\[\frac{\partial \mathcal{L_{D}}~(w)}{\partial w} = 0 - 2 X_{D}^{T}~t_{D} +  (X_{D}^{T}~X_{D} + (X_{D}^{T}~X_{D})^{T})~w = 0\]

<p>For a compact treatment (meaning just a list of identities and formulas) of vector and matrix differentiation please check <a href="http://www2.imm.dtu.dk/pubdb/views/edoc_download.php/3274/pdf/imm3274.pdf" target="blank"> Matrix Cookbook</a></p>

\[\text{Since } X_{D}^{T}~X_{D} \text{ is symmetric } = 0 - 2 X_{D}^{T}~t_{D} +  2 X_{D}^{T}~X_{D}~w = 0\]

\[X_{D}^{T}~X_{D}~w = X_{D}^{T}~t_{D}\]

\[(X_{D}^{T}~X_{D})^{-1} (X_{D}^{T}~X_{D})~w = (X_{D}^{T}~X_{D})^{-1} X_{D}^{T}~t_{D}\]

\[w_{ML} = (X_{D}^{T}~X_{D})^{-1} X_{D}^{T}~t_{D}\]

<p>The expression \((X_{D}^{T}~X_{D})^{-1} X_{D}^{T}\) is called Moore-Penrose pseudo inverse and denoted with  \(X^{\dagger}\).</p>

<p>After finding the \(w_{ML}\), we can plug this value into the negative log likelihood (2.15) and try to find \(\beta\) by differentiating w.r.t. \(\beta\) and setting it 0</p>

\[\frac{d (-\ln P(t_{D}  \vert  X_{D}, w, \beta))}{d \beta} = - \frac{1}{\beta}  + \frac{1}{N}\sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2} = 0\]

\[\frac{1}{\beta_{ML}} = \frac{1}{N}\sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2} = \mathcal{L}_{D} (w_{ML})\]

<h3 id="overfitting-and-underfitting">Overfitting and underfitting</h3>

<p>Choosing right model complexity (model order \(M\)) for optimum result. In previous example \(\phi(x) = [1 ~ x ~ x^{2} ~ ... ~ x^{M}]\) and \(w = [w_{0} ~ ... ~ w{M}]\), therefore setting any \(w_{i} = 0\) decreases the model complexity. When \(M = 1\) model is not rich enough to capture the data so underfits and \(M=9\) model is too complex so overfitting occurs in other words training loss \(\mathcal{L}_{D}~(w_{ML})\) is small, however generalization loss \(\mathcal{L}_{P}~(w_{ML})\) is large.</p>

<p>When dataset is large comparing to the model parameters, \(\mathcal{L}_{D}~(w_{ML})\) provides an accurate measurement for \(\mathcal{L}_{P}~(w_{ML})\). If we define \(w^{*}\) as follows:</p>

\[w^{*} = \underset{w}{argmin} ~ \mathcal{L}_{P}~(w) ~~~~ (2.21)\]

<p>assuming N is large enough, \(w_{ML}\) ~ tends to \(w^{*}\). To put it differently, when \(N \to \infty ~~ \mathcal{L}_{D}~(w_{ML}) \approx \mathcal{L}_{P}~(w_{ML}) \approx \mathcal{L}_{P}~(w^{*})\)</p>

<ul>
  <li>N is small, overfitting causing estimation error dominates bias caused by small model order</li>
  <li>N is large, harder to overfit, so estimation error is dominated by bias depending on the choice of model order</li>
</ul>

<p>We can decompose bias and estimation error as follows and let’s remember that \(t^{*}\) (2.3) is the optimum predictor:</p>

\[\mathcal{L}_{p}~(w_{ML}) = \mathcal{L}_{p}~(t^{*}) + \underset{\text{Bias}}{\left[\mathcal{L}_{p}~(w^{*}) - \mathcal{L}_{p}~(t^{*}) \right]} + \underset{\text{Estimation error}}{\left[\mathcal{L}_{p}~(w_{ML}) - \mathcal{L}_{p}~(w^{*}) \right]} ~~~~ (2.22)\]

<ul>
  <li>Increasing N decreases estimation error which means \(\mathcal{L}_{p}~(w_{ML}) \approx \mathcal{L}_{p}~(w^{*})\). To put is differently model reaches its potential.</li>
  <li>It is clear from (2.22) that increasing N has no effect on bias. Because this is inherent to the model type and model order.</li>
</ul>

<h3 id="validation-and-testing">Validation and testing</h3>

<p>Dataset given for a machine learning task is divided into three:</p>
<ul>
  <li><strong>Training set:</strong> Used during learning process for determining model parameters.</li>
  <li><strong>Validation set:</strong> Used to determine hyperparameters of algorithm, so we don’t overfit.</li>
  <li><strong>Test set:</strong> Used to evaluate overall performance of algorithm after model and hyperparameters are finalized.</li>
</ul>

<p>Since \(\mathcal{L}_{p}~(t^{*})\) is not possible to calculate due to the fact that \(P(x,t)\) is unknown, we utilize test set to calculate an approximation to \(\mathcal{L}_{p}~(t^{*})\) by testing values never used before.</p>

<h3 id="maximum-likelihood-code-practice">Maximum likelihood <code class="language-plaintext highlighter-rouge">code practice</code></h3>

<ul>
  <li>N is the sample size</li>
  <li>\(\mathcal{L}_{D}~(\hat{t})\) is training loss</li>
  <li>\(\mathcal{L}_{P}~(\hat{t})\) is generalization loss which is approximated by validation using Root Mean Squared Metric</li>
</ul>

<p>Observations:</p>

<ul>
  <li>Notice the difference between \(\mathcal{L}_{D}~(\hat{t})\) and \(\mathcal{L}_{p}~(\hat{t})\) for M = 9 and <code class="language-plaintext highlighter-rouge">N=15</code>. This is a clear sign of overfitting.</li>
  <li>By increasing <code class="language-plaintext highlighter-rouge">N=1000</code>, it is easy to see that optimum model order \(M\) = 5.</li>
  <li>Even though increasing N helps finding optimum \(M\), we are still sampling from a constrained domain meaning \(0 \leq x \leq 1\) which doesn’t capture the periodic nature of true distribution (\(\sin 2 \pi x\)).</li>
  <li>By increasing <code class="language-plaintext highlighter-rouge">domain_range = 2</code>, we immediately see that our previous optimum \(M\) = 5 doesn’t yield the best result anymore. \(M\) = 7 is the new optimum model order. One interpretation of this phenomenon is that true distribution has more 0 values in the new range, therefore higher degree polynomial is a better fit.</li>
  <li>Takeaway lesson is that in real life situation our sample size is generally constant, so jumping to conclusions just because we are getting good results from validation and test doesn’t always mean our model will perform competently in real life.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">scipy</span> <span class="kn">import</span> <span class="n">stats</span><span class="p">,</span> <span class="n">linalg</span>


<span class="n">N</span> <span class="o">=</span> <span class="mi">15</span>  <span class="c1"># sample size
</span><span class="n">M</span> <span class="o">=</span> <span class="mi">9</span>  <span class="c1"># model order
</span><span class="n">domain_range</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># range of x values
</span>
<span class="k">def</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">M</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="n">x</span><span class="o">**</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>


<span class="k">def</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.3</span><span class="p">):</span>
    <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>  <span class="c1"># To obtain the same result
</span>    <span class="n">train_ratio</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">test_ratio</span>
    <span class="n">limit_index</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="n">train_ratio</span><span class="p">)</span>
    <span class="n">nonoutlier_ratio</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="mf">0.7</span><span class="p">)</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">nonoutlier_index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">nonoutlier_ratio</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">noise</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">stats</span><span class="p">.</span><span class="n">norm</span><span class="p">.</span><span class="nf">rvs</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.35</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">N</span><span class="p">))</span>
    <span class="n">noise</span><span class="p">[</span><span class="n">nonoutlier_index</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">t</span> <span class="o">=</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> <span class="o">+</span> <span class="n">noise</span>

    <span class="c1"># Randomization of dataset
</span>    <span class="n">index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

    <span class="n">X_test</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">X_train</span> <span class="o">=</span> <span class="n">X</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="n">t_test</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">t_train</span> <span class="o">=</span> <span class="n">t</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s"> Training size: </span><span class="si">{</span><span class="n">X_train</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> and test size: </span><span class="si">{</span><span class="n">X_test</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span>



<span class="k">def</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">X</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">Xd</span>


<span class="k">def</span> <span class="nf">fit_ML</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">Xpenrose</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">linalg</span><span class="p">.</span><span class="nf">inv</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">Xd</span><span class="p">)),</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span>
    <span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xpenrose</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">w</span>


<span class="k">def</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">t_predic</span>


<span class="k">def</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_P(t): Generalization loss</span><span class="sh">"""</span>

    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">))</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>

<span class="k">def</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span><span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_D(t): Training loss</span><span class="sh">"""</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>


<span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span> <span class="o">=</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>

<span class="n">fig</span><span class="p">,</span> <span class="p">(</span><span class="n">ax1</span><span class="p">,</span> <span class="n">ax2</span><span class="p">)</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="n">nrows</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">ncols</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span>

<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">9</span><span class="p">]:</span>

    <span class="n">w</span> <span class="o">=</span> <span class="nf">fit_ML</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">RMS</span> <span class="o">=</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">)</span>
    <span class="n">L_dt</span> <span class="o">=</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t_train</span><span class="p">,</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="p">)</span>

    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">ax1</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$L_{D}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">L_dt</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">ax2</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s"> $$L_{P}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">RMS</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax2</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Test Values vs Predicted Values</span><span class="se">\n</span><span class="s">(Validation)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>


<span class="n">ax1</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Predictor Functions</span><span class="se">\n</span><span class="s"> (Sample Size = </span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>

<span class="n">ax2</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">savefig</span><span class="p">(</span><span class="sh">'</span><span class="s">ml_results_1.png</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
<span class="c1"># &gt;&gt; Training size: 12 and test size: 3
</span>
</code></pre></div></div>

<figure>
<img src="fig_1.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 1. Comparison of model capacity  with loss.</figcaption>
</figure>

<h1 id="2-a-gentle-introduction-through-linear-regression-1">2. A “Gentle” Introduction Through Linear Regression</h1>

<h2 id="23-frequentist-framework-1">2.3 Frequentist framework:</h2>

<h3 id="maximum-a-posteriori-map-learning">Maximum a posteriori (MAP) learning</h3>

<p>Model order \(M\) dictates the trade off between low bias (high \(M\)) and low estimation error (low \(M\)). MAP approach enables refined control over 2 metrcis by assigning a distribution to model parameters.</p>

<p>For instance observing high capacity model (larger \(M\)) leads to bigger value model parameters (\(w\)). We can use this information to limit or distribution to \(w\).</p>

\[w \sim \mathcal{N}(0, \alpha^{-1}I), ~~ \alpha \text{ is precision}\]

<p>Rather than maximizing likelihood \(P(t_{D}  \vert  X_{D}, w, \beta)\), we maximize the posteriror distribution:</p>

\[P(t_{D}, w  \vert  X_{D}, \beta)  = P(w) \prod_{j=1}^{N} P(t_{j}  \vert  x_{j}; w, \beta)\]

<p>Following the same line of argument in maximum likelihood, negative \(\ln\) of posterior probability is</p>

\[- \ln P(t_{D}, w  \vert  X_{D}, \beta) = - \ln \left(\prod_{j=1}^{N} P(t_{j}  \vert  x_{j}; w, \beta) \right) - \ln(P(w))\]

\[= - \ln ~ \left( (\frac{\beta}{\sqrt{2\pi}})^{N} \exp \left(-\frac{1}{2}  \frac{\sum_{n=1}^{N}~(t_{n} - \hat{t})^{2}}{\beta^{-1}} \right) \right) - \ln \left( \frac{1}{\sqrt{2\pi} \sqrt{ \vert \alpha^{-1}I} \vert }) \exp \left(-\frac{1}{2} w^{T} (\alpha^{-1} I)^{-1} w \right) \right)\]

<p>First term is the same as in maximum likelihood, so we already know that</p>

\[= - \frac{N}{2} \ln(~ \frac{\beta}{2\pi}~ ) +\frac{\beta}{2}  \sum_{n=1}^{N}~(t_{n} - \hat{t}(x_{n})^{2} - \frac{1}{2} \ln(~ \frac{\alpha^{M}}{2\pi}~) + \frac{\alpha}{2}  \vert  \vert w \vert  \vert ^{2}\]

<p>and let’s unpack derivations in the second term, since w is in fact a multivariate distribution we have to use covariance matrix \(\alpha^{-1} I\), nevertheless since it is a diagonal matrix, determinant of it is just the product of its diagonal elements which are equal to \(\alpha^{-1}\). In addition, \(w^{T} (\alpha^{-1} I)^{-1} w = \alpha w^{T} w = \alpha  \vert  \vert w \vert  \vert ^{2}\) again due to covariance being diagonal with the same \(\alpha^{-1}\) elements.</p>

<p>Finally, disregarding constant terms and dividing the expression by \(\beta N / 2\) we get</p>

\[- \ln P(t_{D}, w  \vert  X_{D}, \beta)  = \underset{w}{min} ~ \mathcal{L_{D}}~(w) + \frac{\lambda}{N}  \vert  \vert w \vert  \vert ^{2}, ~~~~ (2.27)\]

<p>where \(\lambda = \alpha / \beta\) is called regularization constant. An important observation is that when N grows significantly, problem transforms int maximum likelihood. Using the same steps in maximum likelihood, we can also solve this minimization problem analytically.</p>

\[= \frac{1}{N}  \vert  \vert t_{D} - X_{D}~w  \vert  \vert ^{2} + \frac{\lambda}{N}  \vert  \vert w \vert  \vert ^{2}= \frac{1}{N} (t_{D} - X_{D}~w)^{T} (t_{D} - X_{D}~w) + \frac{1}{N} w^{T} \lambda I w\]

\[= \frac{1}{N}~(t_{D}^{T}~t_{D} - t_{D}^{T}~X_{D}~w - w^{T}~X_{D}^{T}~t_{D} + w^{T}~X_{D}^{T}~X_{D}~ w) + \frac{1}{N} w^{T}  \lambda I w\]

\[= \frac{1}{N}~(t_{D}^{T}~t_{D} - \underset{\text{scalar so transpose is the same}}{(t_{D}^{T}~X_{D}~w)^{T}} - w^{T}~X_{D}^{T}~t_{D} + w^{T}~X_{D}^{T}~X_{D}~ w) + \frac{1}{N} w^{T}  \lambda I w\]

\[= \frac{1}{N}~[(t_{D}^{T}~t_{D} - 2w^{T}~X_{D}^{T}~t_{D} + w^{T}(X_{D}^{T}~X_{D}~ w)] + \frac{1}{N} w^{T}  \lambda I w\]

<p>Since our starting expression is convex and has a global extremum, if we take the derivative of the expression above with respect to w and set it to 0:</p>

\[\frac{\partial \mathcal{L_{D}}~(w) + \frac{\lambda}{N}  \vert  \vert w \vert  \vert ^{2}}{\partial w} =\frac{1}{N}[ 0 - 2 X_{D}^{T}~t_{D} +  (X_{D}^{T}~X_{D} + (X_{D}^{T}~X_{D})^{T})~w + \frac{ 2\lambda I }{N}~w]  = 0\]

\[\text{Since } X_{D}^{T}~X_{D} \text{ is symmetric } =\frac{1}{N} [0 - 2 X_{D}^{T}~t_{D} +  2 X_{D}^{T}~X_{D}~w  + \frac{ 2\lambda I }{N}~w] = 0\]

\[X_{D}^{T}~X_{D}~w + \lambda I w = X_{D}^{T}~t_{D}\]

\[(X_{D}^{T}~X_{D} + \lambda I) w = X_{D}^{T}~t_{D}\]

\[(\lambda I + X_{D}^{T}~X_{D})^{-1} (\lambda I + X_{D}^{T}~X_{D})~w = (\lambda I + X_{D}^{T}~X_{D})^{-1} X_{D}^{T}~t_{D}\]

\[w_{MAP} = (\lambda I + X_{D}^{T}~X_{D})^{-1} X_{D}^{T}~t_{D}\]

<h3 id="regularization">Regularization</h3>

<p>Regularization is used to prevent overfitting and find the optimum model capacity meaning model order M. In previous explanation, it is shown that MAP amounts to ML or ERM with regularization. Furthermore, we can introduce \(R(w)\) to ML or ERM independent of probabilistic interpretation. For example we can inspect our training results and conclude that higher \(w\) values induce overfitting and use \(R(w) = \frac{\lambda}{N}  \vert  \vert w \vert  \vert ^{2}\). For instance, if minimization process sets \(w_{m} = w_{m-1} = 0\), then our new model order is \(M-2\) which is a hyperparamter tunning.</p>

<h3 id="maximum-a-priori-code-practice">Maximum a priori <code class="language-plaintext highlighter-rouge">code practice</code></h3>

<ul>
  <li>N is the sample size</li>
  <li>\(\mathcal{L}_{D}~(\hat{t})\) is training loss</li>
  <li>\(\mathcal{L}_{P}~(\hat{t})\) is generalization loss which is approximated by validation using Root Mean Squared Metric</li>
  <li>\(\lambda\) is regularization constant</li>
</ul>

<p>Observations:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">lambd</code> is the regularization constant and dictates how much our predictor \(\hat{t}\) fluctuates. Try <code class="language-plaintext highlighter-rouge">lambd=10**-5</code> and <code class="language-plaintext highlighter-rouge">lambd=10**-1</code> to see how it limits the function even for \(M=9\)</li>
  <li>Even for small sample size <code class="language-plaintext highlighter-rouge">N=15</code>, MAP prevents overfitting of \(M=9\)</li>
  <li>When sample size <code class="language-plaintext highlighter-rouge">N=600</code> and more, ML and MAP start to converge to the same results.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">scipy</span> <span class="kn">import</span> <span class="n">stats</span><span class="p">,</span> <span class="n">linalg</span>


<span class="n">N</span> <span class="o">=</span> <span class="mi">15</span>  <span class="c1"># sample size
</span><span class="n">M</span> <span class="o">=</span> <span class="mi">9</span>  <span class="c1"># model order
</span><span class="n">domain_range</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># range of x values
</span><span class="n">lambd</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**-</span><span class="mi">3</span> <span class="c1"># regularization constant
</span>
<span class="k">def</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">M</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="n">x</span><span class="o">**</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>


<span class="k">def</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.3</span><span class="p">):</span>
    <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>  <span class="c1"># To obtain the same result
</span>    <span class="n">train_ratio</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">test_ratio</span>
    <span class="n">limit_index</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="n">train_ratio</span><span class="p">)</span>
    <span class="n">nonoutlier_ratio</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="mf">0.7</span><span class="p">)</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">nonoutlier_index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">nonoutlier_ratio</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">noise</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">stats</span><span class="p">.</span><span class="n">norm</span><span class="p">.</span><span class="nf">rvs</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.35</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">N</span><span class="p">))</span>
    <span class="n">noise</span><span class="p">[</span><span class="n">nonoutlier_index</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">t</span> <span class="o">=</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> <span class="o">+</span> <span class="n">noise</span>

    <span class="c1"># Randomization of dataset
</span>    <span class="n">index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

    <span class="n">X_test</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">X_train</span> <span class="o">=</span> <span class="n">X</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="n">t_test</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">t_train</span> <span class="o">=</span> <span class="n">t</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s"> Training size: </span><span class="si">{</span><span class="n">X_train</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> and test size: </span><span class="si">{</span><span class="n">X_test</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span>


<span class="k">def</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">X</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">Xd</span>


<span class="k">def</span> <span class="nf">fit_map</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">Xpenrose</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">linalg</span><span class="p">.</span><span class="nf">inv</span><span class="p">(</span><span class="n">lambd</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">identity</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">Xd</span><span class="p">)),</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span>
    <span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xpenrose</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">w</span>

<span class="k">def</span> <span class="nf">fit_ml</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">Xpenrose</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">linalg</span><span class="p">.</span><span class="nf">inv</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">Xd</span><span class="p">)),</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span>
    <span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xpenrose</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">w</span>

<span class="k">def</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">t_predic</span>


<span class="k">def</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_P(t): Generalization loss</span><span class="sh">"""</span>

    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">))</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>


<span class="k">def</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_D(t): Training loss</span><span class="sh">"""</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>


<span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span> <span class="o">=</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>

<span class="n">fig</span><span class="p">,</span> <span class="p">((</span><span class="n">ax1</span><span class="p">,</span> <span class="n">ax2</span><span class="p">),</span> <span class="p">(</span><span class="n">ax3</span><span class="p">,</span> <span class="n">ax4</span><span class="p">))</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="n">nrows</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">ncols</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span>

<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">]:</span>

    <span class="n">w</span> <span class="o">=</span> <span class="nf">fit_ml</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">RMS</span> <span class="o">=</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">)</span>
    <span class="n">L_dt</span> <span class="o">=</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t_train</span><span class="p">,</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">m</span><span class="p">))</span>

    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>

    <span class="n">ax1</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$L_{D}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">L_dt</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax3</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s"> $$L_{P}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">RMS</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">w</span> <span class="o">=</span> <span class="nf">fit_map</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">RMS</span> <span class="o">=</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">)</span>
    <span class="n">L_dt</span> <span class="o">=</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t_train</span><span class="p">,</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">m</span><span class="p">))</span>

    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="mi">50</span><span class="p">)</span>
    <span class="n">y</span> <span class="o">=</span> <span class="nf">predic</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>

    <span class="n">ax2</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$L_{D}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">L_dt</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax4</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s"> $$L_{P}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">RMS</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">ax1</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Predictor Functions</span><span class="se">\n</span><span class="s"> ML (Sample Size = </span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax1</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>

<span class="n">ax3</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Test Values vs Predicted Values</span><span class="se">\n</span><span class="s"> ML (Validation)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">set_xlim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">ax3</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>

<span class="n">ax2</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Predictor Functions</span><span class="se">\n</span><span class="s"> MAP (Sample Size = </span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax2</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>

<span class="n">ax4</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Test Values vs Predicted Values</span><span class="se">\n</span><span class="s"> MAP (Validation)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">none</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">set_xlim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">set_ylim</span><span class="p">(</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax4</span><span class="p">.</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">tight_layout</span><span class="p">()</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">savefig</span><span class="p">(</span><span class="sh">'</span><span class="s">map_results_1.png</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>

<span class="c1">#&gt;&gt; Training size: 12 and test size: 3
</span></code></pre></div></div>

<figure>
<img src="fig_2.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 2. Maximum likelihood vs maximum a priori.</figcaption>
</figure>

<h1 id="2-a-gentle-introduction-through-linear-regression-2">2. A “Gentle” Introduction Through Linear Regression</h1>

<h2 id="24-bayesian-framework">2.4 Bayesian framework:</h2>

<p>In frequentist framework, there are 2 distributions: true distribution approximated by empirical distribution and model distribution. However, in bayesian framework:</p>
<ul>
  <li>All data points are jointly distributed</li>
  <li>Model parameters are also jointly distributed</li>
</ul>

<p>At the end, bayesian framework considers all \(\theta\) values weighted with respect to data dependent belief. In short, everything is a random variable.</p>

<p>As a result, we have \(P(t_{D},w,t \vert X_{D}, x)\) as a posterior distribution. Given data set and a new point \((\mathcal{D},x)\), \(P(t \vert t_{D}, X_{D}, x) = P(t \vert \mathcal{D},x)\) is found using marginalization of \(P(t, w, t_{D} \vert X_{D}, x)\).</p>

<p>Using posterior \(P(t \vert \mathcal{D},x)\), predictor can be evaluated \(\hat{t}\). In a true bayesian framework, we have the explicit formula of the distribution function. By ignoring the domain points, we have</p>

\[P(t, w, t_{D}) = \underset{\text{prior}}{P(w)} ~~ \underset{\text{likelihood}}{P(t_{D}~ \vert w)} ~~~ \underset{\text{distribution of new data}}{P(t \vert x)}\]

<p>As a clarification, this equation holds due to the conditional independence of \({\rm t} ~ \vert {\rm w}\) and \({\rm t_{D}} ~ \vert {\rm w}\) as shown in the Figure 2.7 (book). In words, knowing only parameter w and \(t_{D}\) doesn’t give information about \(t\).</p>

<p>As mentioned our main purpose it to find \(P(t \vert \mathcal{D},x)\) and again dropping data points, we have</p>

\[P(t \vert T_{D}) = \frac{P(t, T_{D})}{P(T_{D})} = \underset{\text{marginalization}}{\frac{\int P(t,w, T_{D})dw}{P(T_{D})}} = \frac{\int P(t, T_{D} \vert w) P(w) dw }{P(T_{D})}\]

\[P(t \vert T_{D}) = \int P(t \vert w) ~ \left( \underset{\text{Bayes' rule}}{ \frac{P(T_{D} \vert w) P(w) }{P(T_{D})}} ~ \right) dw = \int P(t \vert w) P(w \vert T_{D}) dw\]

<p>Finally reintroducing the data points, we obtain the key equation which is bayes prediction function</p>

\[P(t \vert T_{D},x ) = \int P(t \vert x, w) P(w \vert \mathcal{D}) dw\]

<p>Computing the posterior \(P(w \vert \mathcal{D})\) and predictive distribution \(P(t \vert x, w)\) is a difficult task. Especially in higher dimensions integrating out the model parameters becomes easily intractable. Using Gaussian prior \(\mathcal{N}(w \vert 0, \alpha^{-1})\), distribution of new data \(\mathcal{N}(t \vert \mathcal{M}(x,w), \beta^{-1})\) and likelihood \(\prod_{n=1}^{N} \mathcal{N}(t_{n} \vert \mathcal{M}(x,w), \beta^{-1})\), we can find predictive function distribution as</p>

\[{\rm t} \vert {\rm x} \sim \mathcal{N}(t \vert \mathcal{M}(x,w_{MAP}~), S^{2}(x)) ~~~~ (2.36)\]

<p>In this equation, \(S^{2}(x) = \beta^{-1} [ 1 + \phi(x)^{T} ( \lambda I + X_{D}^{T} X_{D})^{-1} \phi(x)]\). However, deriving this equation is an extremely tedious task which also fortifies the claim about the difficulty of integration process. A detailed step by step derivation can be found in mathematicalmonk’s videos <a href="https://www.youtube.com/watch?v=xyuSiKXttxw">here</a> (watching him struggle might also produce a confidence boost).</p>

<h3 id="ml-and-map-vs-bayesian">ML and MAP vs bayesian</h3>

<p>Comparing the returned distribution of each approach, it is easy to see distinction</p>

<ul>
  <li><strong>ML:</strong> \(\mathcal{N}(t \vert \mathcal{M}(x,w_{ML}~), \beta^{-1}(x))\)</li>
  <li><strong>MAP:</strong> \(\mathcal{N}(t \vert \mathcal{M}(x,w_{MAP}~), \beta^{-1}(x))\)</li>
  <li><strong>Bayesian:</strong> \(\mathcal{N}(t \vert \mathcal{M}(x,w_{MAP}~), S^{2}(x))\), variance changes with w.r.t. x</li>
</ul>

<p>In bayesian approach, variance changes with given new data point. In addition, as \(N \to \infty, S^{2}(x) \to 1 / \beta\)</p>

<h3 id="bayesian-code-practice">Bayesian <code class="language-plaintext highlighter-rouge">code practice</code></h3>

<ul>
  <li>N is the sample size</li>
  <li>\(\mathcal{L}_{D}~(\hat{t})\) is training loss</li>
  <li>\(\mathcal{L}_{P}~(\hat{t})\) is generalization loss which is approximated by validation using Root Mean Squared Metric</li>
  <li>\(\lambda\) is regularization constant</li>
</ul>

<p>Observations:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">lambd</code> is the regularization constant and dictates how much our predictor \(\hat{t}\) fluctuates. Try <code class="language-plaintext highlighter-rouge">lambd=10**-5</code> and <code class="language-plaintext highlighter-rouge">lambd=10**-1</code> to see how it limits the function even for \(M=9\)</li>
  <li>Even for small sample size <code class="language-plaintext highlighter-rouge">N=15</code>, MAP prevents overfitting of \(M=9\)</li>
  <li>When sample size <code class="language-plaintext highlighter-rouge">N=600</code> and more, ML and MAP start to converge to the same results.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">scipy</span> <span class="kn">import</span> <span class="n">stats</span><span class="p">,</span> <span class="n">linalg</span>


<span class="n">N</span> <span class="o">=</span> <span class="mi">100</span>  <span class="c1"># sample size
</span><span class="n">M</span> <span class="o">=</span> <span class="mi">9</span>  <span class="c1"># model order
</span><span class="n">domain_range</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># range of x values
</span><span class="n">alpha</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**-</span><span class="mi">2</span>
<span class="n">beta</span> <span class="o">=</span> <span class="mi">10</span>


<span class="k">def</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">M</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="n">x</span><span class="o">**</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>


<span class="k">def</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.3</span><span class="p">):</span>
    <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>  <span class="c1"># To obtain the same result
</span>    <span class="n">train_ratio</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">test_ratio</span>
    <span class="n">limit_index</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="n">train_ratio</span><span class="p">)</span>
    <span class="n">nonoutlier_ratio</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="mf">0.7</span><span class="p">)</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">nonoutlier_index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">nonoutlier_ratio</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">noise</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">stats</span><span class="p">.</span><span class="n">norm</span><span class="p">.</span><span class="nf">rvs</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.35</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">N</span><span class="p">))</span>
    <span class="n">noise</span><span class="p">[</span><span class="n">nonoutlier_index</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">t</span> <span class="o">=</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> <span class="o">+</span> <span class="n">noise</span>

    <span class="c1"># Randomization of dataset
</span>    <span class="n">index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

    <span class="n">X_test</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">X_train</span> <span class="o">=</span> <span class="n">X</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="n">t_test</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">t_train</span> <span class="o">=</span> <span class="n">t</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s"> Training size: </span><span class="si">{</span><span class="n">X_train</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> and test size: </span><span class="si">{</span><span class="n">X_test</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span>


<span class="k">def</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
    <span class="n">Xd</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">X</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">Xd</span>


<span class="k">def</span> <span class="nf">predic_bayesian</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span><span class="n">t_train</span><span class="p">,</span><span class="n">m</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>

    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">Fd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">A</span> <span class="o">=</span> <span class="n">linalg</span><span class="p">.</span><span class="nf">inv</span><span class="p">((</span><span class="n">alpha</span><span class="o">/</span><span class="n">beta</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">identity</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">Xd</span><span class="p">))</span>
    <span class="n">Xpenrose</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span>
    <span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xpenrose</span><span class="p">,</span> <span class="n">t_train</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Fd</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>

    <span class="n">t_variance</span> <span class="o">=</span> <span class="n">beta</span><span class="o">**-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">diagonal</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Fd</span><span class="p">,</span><span class="n">A</span><span class="p">)</span> <span class="p">,</span><span class="n">Fd</span><span class="p">.</span><span class="n">T</span> <span class="p">)))</span>
    <span class="k">return</span> <span class="n">t_predic</span><span class="p">,</span> <span class="n">t_variance</span>


<span class="k">def</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_P(t): Generalization loss</span><span class="sh">"""</span>

    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">))</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>


<span class="k">def</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s"> L_D(t): Training loss</span><span class="sh">"""</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t1</span> <span class="o">-</span> <span class="n">t2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t1</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">result</span>


<span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span> <span class="o">=</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>

<span class="c1"># print(X_train, t_train, X_test, t_test)
</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="n">nrows</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">ncols</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">120</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">ax</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">9</span><span class="p">]:</span>

    <span class="c1">### Bayesian learning
</span>    <span class="n">t_predic</span><span class="p">,</span> <span class="n">t_variance</span> <span class="o">=</span> <span class="nf">predic_bayesian</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span><span class="n">t_train</span><span class="p">,</span><span class="n">m</span><span class="p">,</span><span class="n">X_test</span><span class="p">)</span>

    <span class="n">t_predic_train</span><span class="p">,</span> <span class="n">t_variance_train</span> <span class="o">=</span> <span class="nf">predic_bayesian</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span><span class="n">t_train</span><span class="p">,</span><span class="n">m</span><span class="p">,</span><span class="n">X_train</span><span class="p">)</span>

    <span class="n">L_dt</span> <span class="o">=</span> <span class="nf">training_loss</span><span class="p">(</span><span class="n">t_train</span><span class="p">,</span> <span class="n">t_predic_train</span><span class="p">)</span>
    <span class="n">RMS</span> <span class="o">=</span> <span class="nf">rms_calculator</span><span class="p">(</span><span class="n">t_test</span><span class="p">,</span> <span class="n">t_predic</span><span class="p">)</span>

    <span class="n">order</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">X_train</span><span class="p">)</span>

    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">plot</span><span class="p">(</span><span class="n">X_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span>\
             <span class="sh">'</span><span class="s">-</span><span class="sh">'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="sh">'</span><span class="s">gray</span><span class="sh">'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$L_{D}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">L_dt</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">fill_between</span><span class="p">(</span><span class="n">X_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic_train</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">t_variance_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> \
                     <span class="n">t_predic_train</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">t_variance_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="sh">'</span><span class="s">gray</span><span class="sh">'</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>

    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Predictor Function M = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="se">\n</span><span class="s"> (Sample Size = </span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">order</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">X_train</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_train</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>


    <span class="n">order</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">plot</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="sh">'</span><span class="s">-</span><span class="sh">'</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">m = </span><span class="si">{</span><span class="n">m</span><span class="si">}</span><span class="s">, </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s"> $$L_{P}(\hat{t}) = $$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s"> </span><span class="si">{</span><span class="n">RMS</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">fill_between</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span><span class="o">*</span><span class="n">t_variance</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> \
                     <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">t_variance</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>


    <span class="n">order</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Test Values vs Predicted Values</span><span class="se">\n</span><span class="s"> Bayesian (Validation)</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">True values</span><span class="sh">"</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="sh">"</span><span class="s">o</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_xlabel</span><span class="p">(</span><span class="sh">"</span><span class="s">x</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">ax</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">count</span><span class="p">].</span><span class="nf">set_ylabel</span><span class="p">(</span><span class="sh">"</span><span class="s">t</span><span class="sh">"</span><span class="p">)</span>


    <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>


<span class="c1"># plt.savefig('map_results_1.png')
</span><span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>

</code></pre></div></div>
<figure>
<img src="fig_3.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 3. Results of bayesian approach</figcaption>
</figure>

<h3 id="marginal-likelihood">Marginal likelihood</h3>

<p>Following formula is named marginal log likelihood</p>

\[P(t_{D}~ \vert X_{D}) = \int P(w) \prod_{n=1}{N} P(t_{n}~ \vert x_{n},w) dw\]

<p>and this approach enables model selection without validation by including prior information to likelihood process. Calculating the marginal likelihood of running example:</p>

\[P(t_{D}~ \vert X_{D}) \sim \mathcal{N}(0, \alpha^{-1} X_{D}~X_{D}^{T} + \beta^{-1} I )\]

<p>Since normalization constant of a Gaussian distribution depends on variance which \(\alpha^{-1} X_{D}~X_{D}^{T} + \beta^{-1} I\), peak value of \(P(t_{D}~ \vert X_{D})\) changes with \(\alpha\) and \(\beta\) parameters.</p>

<p>Let’s go through the whole process. At first, we choose \(\alpha, \beta\) and calculate marginal log likelihood \(P(t_{D}~ \vert X_{D})\) and choose the \(M\) yielding peak value. However, if we graph \(P(t_{D}~ \vert X_{D})\) vs. \(M\) with different \(\alpha\) values, it is clear that even though peak \(M\) values are similar we cannot exactly pin down the optimum value with only checking a single \(\alpha\). In short, we again have a hyperparameter to tune. As we mentioned earlier, changing \(\alpha\) affects variance \(alpha^{-1} X_{D}~X_{D}^{T} + \beta^{-1} I\) which changes normalization and consequently peak value of \(P(t_{D}~ \vert X_{D})\).</p>

<p>Finally, assigning priors to \(\alpha\) and \(M\) also leads to hierarchical models that will be covered in post 7.</p>

<h3 id="marginal-likelihood-code-practice">Marginal likelihood <code class="language-plaintext highlighter-rouge">code practice</code></h3>

<ul>
  <li>\(\mathcal{L}_{P}~(\hat{t})\) is generalization loss which is approximated by validation using Root Mean Squared Metric</li>
  <li>\(\alpha\) is precision for w</li>
  <li>\(\beta\) is precision for data points</li>
</ul>

<p>Observations:</p>

<ul>
  <li>Change the <code class="language-plaintext highlighter-rouge">alpha=10**-1, 10**-2, 10**-3</code> and see how optimum model order \(M\) changes.</li>
  <li>Even though optimum model order is the same for constant <code class="language-plaintext highlighter-rouge">alpha</code>, in certain values such as <code class="language-plaintext highlighter-rouge">alpha=10**-1</code> and <code class="language-plaintext highlighter-rouge">N=20</code>, marginal likelihood peaks at different model orders.</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">math</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="n">scipy</span> <span class="kn">import</span> <span class="n">stats</span><span class="p">,</span> <span class="n">linalg</span>


<span class="n">N</span> <span class="o">=</span> <span class="mi">20</span>  <span class="c1"># sample size
</span><span class="n">M</span> <span class="o">=</span> <span class="mi">9</span>  <span class="c1"># model order
</span><span class="n">alpha</span> <span class="o">=</span> <span class="mi">10</span><span class="o">**-</span><span class="mi">1</span>
<span class="n">beta</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">domain_range</span> <span class="o">=</span> <span class="mi">1</span>

<span class="k">def</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">M</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="n">x</span><span class="o">**</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)])</span>


<span class="k">def</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">test_ratio</span><span class="o">=</span><span class="mf">0.3</span><span class="p">):</span>
    <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>  <span class="c1"># To obtain the same result
</span>    <span class="n">train_ratio</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">test_ratio</span>
    <span class="n">limit_index</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="n">train_ratio</span><span class="p">)</span>
    <span class="n">nonoutlier_ratio</span> <span class="o">=</span> <span class="n">math</span><span class="p">.</span><span class="nf">ceil</span><span class="p">(</span><span class="n">N</span> <span class="o">*</span> <span class="mf">0.7</span><span class="p">)</span>

    <span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">domain_range</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">nonoutlier_index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">nonoutlier_ratio</span><span class="p">,</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">noise</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">stats</span><span class="p">.</span><span class="n">norm</span><span class="p">.</span><span class="nf">rvs</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">0.35</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="n">N</span><span class="p">))</span>
    <span class="n">noise</span><span class="p">[</span><span class="n">nonoutlier_index</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">t</span> <span class="o">=</span> <span class="nf">t_true</span><span class="p">(</span><span class="n">X</span><span class="p">)</span> <span class="o">+</span> <span class="n">noise</span>

    <span class="c1"># Randomization of dataset
</span>    <span class="n">index</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">X</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">X</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

    <span class="n">X_test</span> <span class="o">=</span> <span class="n">X</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">X_train</span> <span class="o">=</span> <span class="n">X</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="n">t_test</span> <span class="o">=</span> <span class="n">t</span><span class="p">[</span><span class="n">limit_index</span><span class="p">:</span> <span class="bp">None</span><span class="p">]</span>
    <span class="n">t_train</span> <span class="o">=</span> <span class="n">t</span><span class="p">[:</span> <span class="n">limit_index</span><span class="p">]</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s"> Training size: </span><span class="si">{</span><span class="n">X_train</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s"> and test size: </span><span class="si">{</span><span class="n">X_test</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span>


<span class="k">def</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>

    <span class="n">Xd</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">X</span><span class="p">:</span>
        <span class="n">Xd</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">fi</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">))</span>

    <span class="n">Xd</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">(</span><span class="n">Xd</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">Xd</span>

<span class="k">def</span> <span class="nf">predic_bayesian</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span><span class="n">t_train</span><span class="p">,</span><span class="n">m</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>

    <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">Fd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
    <span class="n">A</span> <span class="o">=</span> <span class="n">linalg</span><span class="p">.</span><span class="nf">inv</span><span class="p">((</span><span class="n">alpha</span><span class="o">/</span><span class="n">beta</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">identity</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">,</span> <span class="n">Xd</span><span class="p">))</span>
    <span class="n">Xpenrose</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">A</span><span class="p">,</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span>
    <span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xpenrose</span><span class="p">,</span> <span class="n">t_train</span><span class="p">)</span>
    <span class="n">t_predic</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Fd</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>

    <span class="n">t_variance</span> <span class="o">=</span> <span class="n">beta</span><span class="o">**-</span><span class="mi">1</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">diagonal</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Fd</span><span class="p">,</span><span class="n">A</span><span class="p">)</span> <span class="p">,</span><span class="n">Fd</span><span class="p">.</span><span class="n">T</span> <span class="p">)))</span>
    <span class="k">return</span> <span class="n">t_predic</span><span class="p">,</span> <span class="n">t_variance</span>



<span class="k">def</span> <span class="nf">marginal_likelihood</span><span class="p">(</span><span class="n">alpha</span><span class="p">,</span> <span class="n">beta</span><span class="p">,</span> <span class="n">X</span><span class="p">):</span>

    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">optimum_M</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">mml</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>

        <span class="n">Xd</span> <span class="o">=</span> <span class="nf">design_matrix</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>

        <span class="n">variance</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">alpha</span><span class="p">)</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">matmul</span><span class="p">(</span><span class="n">Xd</span><span class="p">,</span> <span class="n">Xd</span><span class="p">.</span><span class="n">T</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">beta</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">identity</span><span class="p">(</span><span class="n">Xd</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
        <span class="c1"># variance = np.linalg.inv(variance)
</span>        <span class="n">current_mml</span> <span class="o">=</span> <span class="n">stats</span><span class="p">.</span><span class="n">multivariate_normal</span><span class="p">.</span><span class="nf">pdf</span><span class="p">(</span><span class="n">t_train</span><span class="p">,</span> <span class="n">mean</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">cov</span><span class="o">=</span><span class="n">variance</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">current_mml</span> <span class="o">&gt;</span> <span class="n">mml</span><span class="p">:</span>
            <span class="n">mml</span> <span class="o">=</span> <span class="n">current_mml</span>
            <span class="n">optimum_m</span> <span class="o">=</span> <span class="n">m</span>
        <span class="n">result</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">current_mml</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">result</span><span class="p">,</span> <span class="n">optimum_m</span>


<span class="n">X_train</span><span class="p">,</span> <span class="n">t_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span> <span class="o">=</span> <span class="nf">data_generator</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">)</span>

<span class="n">fig1</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>

<span class="n">fig2</span><span class="p">,</span> <span class="n">bx</span> <span class="o">=</span> <span class="n">plt</span><span class="p">.</span><span class="nf">subplots</span><span class="p">(</span><span class="n">nrows</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">ncols</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>

<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>

<span class="k">for</span> <span class="n">current_ax</span> <span class="ow">in</span> <span class="n">bx</span><span class="p">.</span><span class="nf">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>

    <span class="n">alpha</span> <span class="o">=</span> <span class="n">alpha</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="p">(</span><span class="n">count</span><span class="p">))</span>

    <span class="n">result</span><span class="p">,</span> <span class="n">optimum_m</span> <span class="o">=</span> <span class="nf">marginal_likelihood</span><span class="p">(</span><span class="n">alpha</span><span class="p">,</span> <span class="n">beta</span><span class="p">,</span> <span class="n">X_train</span><span class="p">)</span>

    <span class="n">ax</span><span class="p">.</span><span class="nf">plot</span><span class="p">([</span><span class="n">m</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">M</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)],</span> <span class="n">result</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">r</span><span class="sh">"</span><span class="s">$$\alpha_{0}$$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s">/</span><span class="si">{</span><span class="mi">2</span><span class="o">**</span><span class="n">count</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">t_predic</span><span class="p">,</span> <span class="n">t_variance</span> <span class="o">=</span> <span class="nf">predic_bayesian</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span><span class="n">t_train</span><span class="p">,</span><span class="n">optimum_m</span><span class="p">,</span><span class="n">X_test</span><span class="p">)</span>
    <span class="n">RMS</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sum</span><span class="p">((</span><span class="n">t_test</span> <span class="o">-</span> <span class="n">t_predic</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">t_predic</span><span class="p">)),</span> <span class="mi">3</span><span class="p">)</span>

    <span class="n">order</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">argsort</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>

    <span class="n">current_ax</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="sh">"</span><span class="s">gray</span><span class="sh">"</span><span class="p">,</span><span class="n">label</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">M = </span><span class="si">{</span><span class="n">optimum_m</span><span class="si">}</span><span class="s"> </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$\alpha = \alpha_{0}$$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="s">/</span><span class="si">{</span><span class="mi">2</span><span class="o">**</span><span class="n">count</span><span class="si">}</span><span class="s"> </span><span class="sh">"</span> <span class="o">+</span> <span class="sa">r</span><span class="sh">"</span><span class="s">$$ L_{P}(\hat{t})=$$</span><span class="sh">"</span> <span class="o">+</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">RMS</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">current_ax</span><span class="p">.</span><span class="nf">fill_between</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span><span class="o">*</span><span class="n">t_variance</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> \
                     <span class="n">t_predic</span><span class="p">[</span><span class="n">order</span><span class="p">]</span> <span class="o">+</span> <span class="mi">3</span><span class="o">*</span><span class="n">t_variance</span><span class="p">[</span><span class="n">order</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="sh">"</span><span class="s">gray</span><span class="sh">"</span><span class="p">,</span><span class="n">alpha</span><span class="o">=</span><span class="mf">0.2</span><span class="p">)</span>

    <span class="n">current_ax</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
    <span class="n">current_ax</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sh">"</span><span class="s">True Values vs Predicted Values</span><span class="se">\n</span><span class="s"> Bayesian</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">current_ax</span><span class="p">.</span><span class="nf">scatter</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">t_test</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sh">"</span><span class="s">True distribution</span><span class="sh">"</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">r</span><span class="sh">"</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="sh">"</span><span class="s">k</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">alpha</span> <span class="o">=</span> <span class="n">alpha</span> <span class="o">*</span> <span class="mi">2</span><span class="o">**</span><span class="p">(</span><span class="n">count</span><span class="p">)</span>
    <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>

<span class="n">ax</span><span class="p">.</span><span class="nf">set_title</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Marginal Likelihood vs Model Order (M)</span><span class="se">\n</span><span class="s"> Sample Size = </span><span class="si">{</span><span class="n">N</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="sh">"</span><span class="s">bold</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ax</span><span class="p">.</span><span class="nf">legend</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>

</code></pre></div></div>

<figure>
<img src="fig_4.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 4. Marginal likelihood with model capacity.</figcaption>
</figure>

<figure>
<img src="fig_5.png" alt="installing nginx in ubuntu" />
<figcaption>Fig 5. Bayesian deviation.</figcaption>
</figure>
<hr />]]></content><author><name>Onur Tunali</name></author><category term="ML" /><category term="machine-learning" /><category term="notes" /><summary type="html"><![CDATA[This is a rather dense book by Osvaldo Simeone which favors readers with solid background in mathematics as the title suggests. In short, its coverage can be described as a subset of Pattern Recognition and Machine Learning by Christopher Bishop.]]></summary></entry><entry><title type="html">Genç Araştırmacıya Tavsiyeler (Advice for a Young Investigaor)</title><link href="/etc/2018/11/15/genc-arastirmaciya-tavsiyeler.html" rel="alternate" type="text/html" title="Genç Araştırmacıya Tavsiyeler (Advice for a Young Investigaor)" /><published>2018-11-15T22:54:40+03:00</published><updated>2018-11-15T22:54:40+03:00</updated><id>/etc/2018/11/15/genc-arastirmaciya-tavsiyeler</id><content type="html" xml:base="/etc/2018/11/15/genc-arastirmaciya-tavsiyeler.html"><![CDATA[<ul id="markdown-toc">
  <li><a href="#1-giriş" id="markdown-toc-1-giriş">1. Giriş</a></li>
  <li><a href="#2-acemilerin-düştüğü-yanlışlar" id="markdown-toc-2-acemilerin-düştüğü-yanlışlar">2. Acemilerin Düştüğü Yanlışlar</a></li>
  <li><a href="#3-entelektüel-nitelikler" id="markdown-toc-3-entelektüel-nitelikler">3. Entelektüel Nitelikler</a></li>
  <li><a href="#4-acemi-biyoloji-araştırmacıları-neleri-bilmeli" id="markdown-toc-4-acemi-biyoloji-araştırmacıları-neleri-bilmeli">4. Acemi Biyoloji Araştırmacıları Neleri Bilmeli</a></li>
  <li><a href="#5-i̇radenin-hastalıkları" id="markdown-toc-5-i̇radenin-hastalıkları">5. İradenin Hastalıkları</a></li>
  <li><a href="#6-bilimsel-çalışmaya-faydalı-sosyal-etmenler" id="markdown-toc-6-bilimsel-çalışmaya-faydalı-sosyal-etmenler">6. Bilimsel Çalışmaya Faydalı Sosyal Etmenler</a></li>
  <li><a href="#7-bilimsel-araştırmanın-aşamaları" id="markdown-toc-7-bilimsel-araştırmanın-aşamaları">7. Bilimsel Araştırmanın Aşamaları</a></li>
  <li><a href="#8-bilimsel-makale-yazma-üzerine" id="markdown-toc-8-bilimsel-makale-yazma-üzerine">8. Bilimsel Makale Yazma Üzerine</a></li>
</ul>

<p>Kitap Nörobilimin kurucularından <a href="https://en.wikipedia.org/wiki/Santiago_Ram%C3%B3n_y_Cajal">Santiago Ramon y Cajal</a>‘ın genç araştırmacılara verdiği öğütlerden oluşuyor. Bu girdide genel bir özete ek olarak, ünite ünite ilgimi çeken ve önemli olduğunu düşündüğüm konulara istinaden notlarımı yazıyorum.</p>

<p>Cajal 19. yüzyılda yazdığı için önem verdiği değerler bugünün deyimi ile demode kalıyor. Klasik bir kasaba doktorunun oğlu olarak öne çıkardığı çok çalışmanın, hırsın, tevazunun ve vatan sevgisinin modern zihinlerde karşılığı sınırlı.</p>

<p><em>Expediency</em> kelimesi uygunluk, istenen kriterleri sağlama özelliği anlamına geliyor. “… under the guise of expediency”, uygunluk kılıfı altında kendi tembelliklerinin haklı çıkarıyorlardı, kısmı ile conformizme karşı çıkması açıktır.</p>

<p>Cajal’ın temel iddiası, bilimsel keşiflerin sistematik veya yöntemsel çabanın, çalışmanın sonucu olduğudur. Dehayı yücelten mevcut düşüncenin aksini savunur bu iddia.</p>

<h2 id="1-giriş">1. Giriş</h2>
<p><em>Introduction</em></p>

<p><strong>Genel yöntemler hakkında düşünmek. Soyut yasalar sterildir. Zihnin aydınlatılması ve azmin güçlendirilmesi gereksinimi.</strong></p>

<p>Giriş bölümü genel yöntemler ve soyut kuralların üzerinde duruyor. Temel bilgi edinme eylemleri gözlem, deneyim ve akıl yürütmeden (tümdengelim veya tümevarım) oluşur. Büyük resmi açıklama takıntımızdan vaz geçmeliyiz. Felsefik açıdan tatmin edici olsa da kapsamlı genellemeleri avlamak günlük bilimsel aktivitenin bir parçası olamaz. Bu eğilim sadece yaygın ve hatalı romantik bilim insanı profilini pekiştirir.</p>

<ul>
  <li>Ignoramus et ignorabimus : Bilmiyoruz ve bilmeyeceğiz.</li>
  <li>Wir müssen wissen, wir werden wissen : Bilmeliyiz, bileceğiz, Hilbert</li>
</ul>

<p>Bilimsel yöntem hakkında sıkça tavsiye edilen iki kitap Bacon’un <em>Novum Organum</em> ve Descartes’in <em>Discours de la Method</em> her ne kadar fikir vermede veya uyarıcı olmada yararlı olsa da keşif yapmayı öğretmede yetersiz kalır. Yazarın Joseph de Maistre’den yaptığı alıntı <em>“Muazzam keşifleri yapmış kişiler genelde Novum Organum’u okumamıştır, Bacon’un ise tek bir önemli keşfi yoktur.”</em></p>

<p>Düşünme yetisinin adım adım formel bir şekilde açıklanması, insanın yeteneklerinin biyolojik olarak açıklanmasına benzer. Konuşma, duyma gibi yetilerimizin anatomisini bilmek bize daha zarif bir uslüp veya keskin bir duyma yetisi sağlamaz. Sadece entelektüel bir zemin sağlar. Bahsedilen yetilere ait yetenek tanımlanamaz bir şekilde içseldir. Bu sebepten dolayı yazmak sadece yazmayla öğrenilir, yaratıcı yazarlık veya gramer çalışarak değil.</p>

<blockquote>
  <p><em>“Her neden birden fazla sonuç üretir.”</em> - Herbert Spencer</p>
</blockquote>

<blockquote>
  <p><em>“Mantığı pratik bir şekilde kullanmaya çalışmak yürümeden önce mekanik yasalarına başvurmak gibidir”</em> -Arthur Schopenhauer</p>
</blockquote>

<blockquote>
  <p><em>“Mantık yasaları özgün bir düşünce üretmek için yeterli değildir”</em> -Eucken</p>
</blockquote>

<h2 id="2-acemilerin-düştüğü-yanlışlar">2. Acemilerin Düştüğü Yanlışlar</h2>
<p><em>Beginner’s Traps</em></p>

<p><strong>Otoriteye yersiz hayranlık. En önemli sorunlar çoktan çözüldü. Uygulamalı bilimlerle uğraşmak. Hissedilen yetenek yoksunluğu.</strong></p>

<p>Bu bölüm Feynmann’ın ünlü <em>“bilimsel araştırma boyunca yapılan hatalar nereye gider, neden sadece doğru sonuçların kaydını tutarız?”</em> sorusu ile başlıyor. Öğrencileri yetiştirirken sadece başarılı sonuçları anlatmak yerine araştırma boyunca atılan yanlış adımları da açıklamak onların şevkini artırabilir.</p>

<p><em>“Önemli olan her şey zaten keşfedildi veya ben kimim ki yerleşmiş kanıları kıracağım”</em> serzenişi bazı durumlarda alçakgönüllükten çok tembelliği (<strong>indolence</strong>) işaret eder.</p>

<p>Teorik olana yöneltilen küçümseme ve uygulamanın yüceltilmesinin sakıncalı buluyor yazar. Ortak fayda uğruna soyut düşünceyi hor görmek bilimsel ilerlemenin önünü kesecektir.</p>

<p>Yaygın bir kanı olan odaklanmanın altı çizilmiş. Farklı alanlarda eser vermiş kişilerin katkılarının belirli dönemlerde olması ile bu iddia destekleniyor. Her ne kadar yüzeysel olarak düşündüğümüzde genelden özele (top-down) gitmek mantıklı gözükse de bazen önemsiz ayrıntılara takılabiliyoruz.</p>

<h2 id="3-entelektüel-nitelikler">3. Entelektüel Nitelikler</h2>
<p><em>Intellectual Qualities</em></p>

<p><strong>Bağımsız yargı. Konsantrasyon. Ünlü olma tutkusu. Bilimsel özgünlük zevki.</strong></p>

<p>Bilimsel uğraşı yaratıcılık gerektirir ve sadece yöntemin izlenmesi ile sürdürelemez. Bunun temel sebebi başlangıçta incelenek hipotezin oluşturulması özgün bir gözlem ve sorunun modellenmesi gerektirir.</p>

<p>Uzun uğraşlar sonucu bir sonuca ulaşamamak veya bulguları kağıda dökememek sorun yaratır. Bu açığı kapatmak için çoçuksu ansiklopedik bilgi ile hava atmaya çalışmak (<strong>ostentation</strong>) fayda sağlamaz. Odak eksikliği bahsedilen sorunun en önemli sebebidir.</p>

<p>Sanat her zaman kitlenin onayına bağımlı kalmıştır ve onun tüm duygularını boşaltması gerekir. Bununla birlikte çelişen görüşlerin temellendirilmesi her daim bilimsel uğraşıya göre daha kolay olmuştur. Bu yüzden büyük sanatçı olmak büyük bilim insanı olmaktan her zaman daha zordur. Çünkü doğanın yasaları tarafından yönledirilen bir hakemden çok kitlelerin mütabakatının insafına kalmış bir onay ile büyüklük belirlenir.  <strong>Sanatçı duyguların, bilimci  mantığın kahramanıdır.</strong></p>

<h2 id="4-acemi-biyoloji-araştırmacıları-neleri-bilmeli">4. Acemi Biyoloji Araştırmacıları Neleri Bilmeli</h2>
<p><em>What Newcomers to Biological Research Should Know</em></p>

<p><strong>Genel eğitim. Uzmanlaşma gereği. Yabancı dil. Monograflar nasıl okunmalı. Doğadan ilham alma. Teknikte uzmanlaşma. Özgün veri arama.</strong></p>

<blockquote>
  <p>“İyi seçilmiş bir söz, düşünmeye harcanan zamandan tasarruf sağlar.”</p>
</blockquote>

<p>Düşüncenin kavramsallaştırılıp, kelimeler ile kapsül haline getirilmesi sorunun hem daha iyi anlaşılmasını hem de daha iyi aktarılmasını sağlar. Almanların kavramlaştırma yetileri bilimdeki başarı nedenlerinden biridir.</p>

<p>Modern toplumun sunduğu bilgiye ulaşım kolaylığı kararsızlığı ve “eğilim çarkını” yaygınlaştırdı. Daldan dala atlamak veya maymun iştahlılık başarıyı engelliryor. Genelci bilgi arayışı sadece parti ve kokteyllerde önem arz eder.</p>

<h2 id="5-i̇radenin-hastalıkları">5. İradenin Hastalıkları</h2>
<p><em>Diseases of The Will</em></p>

<p><strong>Tasarımcılar. Bibliyofiller ve çok dilliler. Megalomanyaklar. Alet bağımlılıları. Uyumsuzlar. Teorisyenler.</strong></p>

<p>Bu bölümde anlatılan tipler (tipoloji bağlamında, tahkir kastedilmedi) yazara göre iradele hastalıklarında muzdarip. Ansiklopedist eğilimleri olan genelciler (<strong>Generalist</strong>) bilim camiasında sık görülür. Onları belirlemek için kullanılacak en önemli ipucu yazmaya olan isteksizlikleridir.</p>

<p>Tasarımcılar (<strong>Contemplators</strong>) doğayı estetik nitelikleri için incelemeyi yeğlerler. Özgün bir katkı emelleri yoktur. Alanlarına göre seçtikleri inceleme nesnesinin fetişleştirilmesi sık görülür. Bibliyofiller ve çok dilliler (<strong>bibliophiles, poylglots</strong>) sürekli yeni çıkanın peşindedir. En son çıkan “çok önemli” ve “düşünmeye kışkırtan” eseri okudun mu soruları günlük söz dağarcıklarının bir parçasıdır. Bir diğer basmakalıp muhabbet soruları da “…‘nın teorisine aşina mısın?” şeklindedir. Teorisyenler (<strong>theorists</strong>) uygulamaya ve deneysele üstten bakar. Sürekli kapsayıcı, büyük ölçekli çalışmalar peşinde koştukları için monograftan (tek bir konu üstüne ayrıntılı çalışma) çok kitap yazma eğilimindedirler.</p>

<p>Bir alanda yeni çalışmaya başlayanlar özgün olgular (<strong>facts</strong>) peşinde koşmalıdır. Hipotezler, teoriler çürütülebilir, gözden geçirilebilir; fakat özgün veriler sabittir ve herkes tarafından tekrar üretilebilir.</p>

<h2 id="6-bilimsel-çalışmaya-faydalı-sosyal-etmenler">6. Bilimsel Çalışmaya Faydalı Sosyal Etmenler</h2>
<p><em>Social Factors Beneficial to Scientific Work</em></p>

<p><strong>Malzeme desteği. Meslek sahibi olma ve araştırma yapmak birbiri ile uyumludur. Araştırmacı ve onun ailesi</strong></p>

<p>Bu bölümde yazarın odaklandığı konu toplumsal çevrenin araştırmacı ve bilim insları üzerindeki etkileridir.  Ana iddiası araçların eksikliğinden çok sıkı çalışmayı körükleyecek iradenin eksikliğidir.</p>

<h2 id="7-bilimsel-araştırmanın-aşamaları">7. Bilimsel Araştırmanın Aşamaları</h2>
<p><em>Stages of Scientific Research</em></p>

<p><strong>Gözlem. Deney. Mevcut hipotez. Kanıt</strong></p>

<p>Bu bölümde bilimsel araştırmanın temel gidişatı incelenmiş. Özellikle veri toplanması aşamasındaki titizlik vurgulanıyor. Elde ettiğimiz verilerin doğrulunu sağlamak için farklı koşulları denemekten imtina etmemeliyiz. Bununla beraber uyguladığımız yöntemin güvenilirliğinin de garantilenmesi gerekir. Şimdiye kadar bahsedilen ilk adım ham veri toplamayla ilgilidir.</p>

<p>Deney, veri toplamanın aksine ayrıntılı bir şeklide seçilmiş koşullar altında doğanın verdiği tepkiyi ölçmeye yarar. Özgün deneyler tasarlamak bilimsel araştırmanın en mühim aşamalarından biridir.</p>

<h2 id="8-bilimsel-makale-yazma-üzerine">8. Bilimsel Makale Yazma Üzerine</h2>
<p><em>On Writing Scientific Papers</em></p>

<p><strong>Bilimsel katkının temellendirilmesi. Bibliyografi. Karar verirken adalet ve nezaket. Yöntemin tasviri. Sonuçlar. İlüstrasyon gereği. Uslüp. Bilimsel çalışmanın yayımlanması.</strong></p>

<p>Bilimsel yayınların hedef kitlesi genel okuyucudan daha fazla motivasyona sahiptir. Buna rağmen yazarken okuyucunun entelektüel olgunluk tayfının iki ucu da göz önünde bulundurulmalıdır.</p>]]></content><author><name>Onur Tunali</name></author><category term="etc" /><category term="notes" /><summary type="html"><![CDATA[Kitap neurobilimin kurucularından Santiago Ramon y Cajal'ın genç araştırmacılara verdiği öğütlerden oluşuyor. Bu girdide genel bir özete ek olarak, ünite ünite ilgimi çeken ve önemli olduğunu düşündüğüm konulara istinaden notlarımı yazıyorum.]]></summary></entry><entry><title type="html">Perfect Writing</title><link href="/etc/2018/11/08/perfect-writing.html" rel="alternate" type="text/html" title="Perfect Writing" /><published>2018-11-08T20:10:40+03:00</published><updated>2018-11-08T20:10:40+03:00</updated><id>/etc/2018/11/08/perfect-writing</id><content type="html" xml:base="/etc/2018/11/08/perfect-writing.html"><![CDATA[<p>This post contains lists of common expressions to be used in academic writing or just in expository texts. Even though it is mostly list of conjuctions, there are usefull idioms for argumentation, expanding on your topic etc.</p>

<ul id="markdown-toc">
  <li><a href="#personal-opinion" id="markdown-toc-personal-opinion">Personal opinion:</a></li>
  <li><a href="#to-list-pros-and-cons" id="markdown-toc-to-list-pros-and-cons">To list pros and cons</a></li>
  <li><a href="#to-list-points" id="markdown-toc-to-list-points">To list points</a></li>
  <li><a href="#to-add-more-points-to-the-same-topic" id="markdown-toc-to-add-more-points-to-the-same-topic">To add more points to the same topic</a></li>
  <li><a href="#to-refer-to-other-sources" id="markdown-toc-to-refer-to-other-sources">To refer to other sources</a></li>
  <li><a href="#to-express-cause-and-result" id="markdown-toc-to-express-cause-and-result">To express cause and result</a></li>
  <li><a href="#to-express-effect" id="markdown-toc-to-express-effect">To express effect</a></li>
  <li><a href="#to-emphasize" id="markdown-toc-to-emphasize">To emphasize</a></li>
  <li><a href="#to-express-reality" id="markdown-toc-to-express-reality">To express reality</a></li>
  <li><a href="#to-express-distinction" id="markdown-toc-to-express-distinction">To express distinction</a></li>
  <li><a href="#to-give-example" id="markdown-toc-to-give-example">To give example</a></li>
  <li><a href="#to-make-a-general-statement" id="markdown-toc-to-make-a-general-statement">To make a general statement</a></li>
  <li><a href="#to-make-partially-correct-statement" id="markdown-toc-to-make-partially-correct-statement">To make partially correct statement</a></li>
  <li><a href="#to-express-limit-of-knowledge" id="markdown-toc-to-express-limit-of-knowledge">To express limit of knowledge</a></li>
  <li><a href="#to-state-opinions-of-other-people" id="markdown-toc-to-state-opinions-of-other-people">To state opinions of other people</a></li>
  <li><a href="#to-make-a-contrasting-point" id="markdown-toc-to-make-a-contrasting-point">To make a contrasting point</a></li>
  <li><a href="#to-express-balance" id="markdown-toc-to-express-balance">To express balance</a></li>
  <li><a href="#to-clarify-or-rephrase" id="markdown-toc-to-clarify-or-rephrase">To clarify or rephrase</a></li>
  <li><a href="#to-express-similarity" id="markdown-toc-to-express-similarity">To express similarity</a></li>
  <li><a href="#to-express-condition" id="markdown-toc-to-express-condition">To express condition</a></li>
  <li><a href="#to-conclude" id="markdown-toc-to-conclude">To conclude</a></li>
  <li><a href="#to-summarize" id="markdown-toc-to-summarize">To summarize</a></li>
</ul>

<h2 id="personal-opinion">Personal opinion:</h2>

<ul>
  <li>In my view</li>
  <li>To my mind</li>
  <li>To my way of thinking</li>
  <li>Personally I believe that</li>
  <li>It strikes me that</li>
  <li>It seems to me that</li>
  <li>As far as I am concerned</li>
</ul>

<h2 id="to-list-pros-and-cons">To list pros and cons</h2>

<ul>
  <li>One (dis)advantage to/of</li>
  <li>Another (dis)advantage of</li>
  <li>A further (dis)advantage</li>
  <li>Main (dis)advantage</li>
</ul>

<h2 id="to-list-points">To list points</h2>

<ul>
  <li>Firstly, secondly, thirdly</li>
  <li>First of all</li>
  <li>To start with</li>
  <li>At the beginning</li>
  <li>Afterwards, next, then</li>
</ul>

<h2 id="to-add-more-points-to-the-same-topic">To add more points to the same topic</h2>

<ul>
  <li>What is more</li>
  <li>Furthermore</li>
  <li>Apart from that</li>
  <li>In addition</li>
  <li>Moreover</li>
  <li>Besides</li>
</ul>

<h2 id="to-refer-to-other-sources">To refer to other sources</h2>

<ul>
  <li>With reference to</li>
  <li>According to</li>
</ul>

<h2 id="to-express-cause-and-result">To express cause and result</h2>

<ul>
  <li>Because</li>
  <li>Owing to</li>
  <li>Due to the fact that</li>
  <li>On the grounds that</li>
  <li>Since</li>
  <li>As</li>
  <li>Because of</li>
</ul>

<h2 id="to-express-effect">To express effect</h2>

<ul>
  <li>Thus</li>
  <li>Therefore</li>
  <li>So</li>
  <li>Consequently</li>
  <li>As a result</li>
  <li>For this reason</li>
  <li>As a consequence</li>
</ul>

<h2 id="to-emphasize">To emphasize</h2>

<ul>
  <li>Clearly</li>
  <li>Obviously</li>
  <li>Of course</li>
  <li>Needless to say</li>
</ul>

<h2 id="to-express-reality">To express reality</h2>

<ul>
  <li>It is fact that</li>
  <li>In effect</li>
  <li>In fact</li>
  <li>Actually</li>
  <li>In practice</li>
  <li>Indeed</li>
</ul>

<h2 id="to-express-distinction">To express distinction</h2>

<ul>
  <li>Initially</li>
  <li>At first sight</li>
</ul>

<h2 id="to-give-example">To give example</h2>

<ul>
  <li>For instance</li>
  <li>For example</li>
</ul>

<h2 id="to-make-a-general-statement">To make a general statement</h2>

<ul>
  <li>As a general rule</li>
  <li>Generally</li>
  <li>In general</li>
  <li>On the whole</li>
  <li>As a main tendency</li>
</ul>

<h2 id="to-make-partially-correct-statement">To make partially correct statement</h2>

<ul>
  <li>Up to a point</li>
  <li>To a certain extend</li>
  <li>In a sense</li>
  <li>In a way</li>
</ul>

<h2 id="to-express-limit-of-knowledge">To express limit of knowledge</h2>

<ul>
  <li>To the best of my knowledge</li>
  <li>As far as I know</li>
</ul>

<h2 id="to-state-opinions-of-other-people">To state opinions of other people</h2>

<ul>
  <li>It is popular to believed that</li>
  <li>People often claim that</li>
  <li>It is often alleged that</li>
  <li>Some people argue that</li>
</ul>

<h2 id="to-make-a-contrasting-point">To make a contrasting point</h2>

<ul>
  <li>Yet</li>
  <li>However</li>
  <li>Nevertheless</li>
  <li>But</li>
  <li>Nonetheless</li>
  <li>Still</li>
  <li>Although</li>
  <li>Even though</li>
  <li>Regardless of the fact that</li>
  <li>Despite the fact that</li>
</ul>

<h2 id="to-express-balance">To express balance</h2>

<ul>
  <li>However</li>
  <li>But</li>
  <li>On the other hand</li>
  <li>Although</li>
  <li>In contrast</li>
</ul>

<h2 id="to-clarify-or-rephrase">To clarify or rephrase</h2>

<ul>
  <li>In other words</li>
  <li>That is to say</li>
  <li>To put it in another way</li>
</ul>

<h2 id="to-express-similarity">To express similarity</h2>

<ul>
  <li>Similarly</li>
  <li>Likewise</li>
  <li>In the same way</li>
</ul>

<h2 id="to-express-condition">To express condition</h2>

<ul>
  <li>On the condition that</li>
  <li>Provided that</li>
  <li>Only if</li>
  <li>As long as</li>
  <li>Otherwise</li>
</ul>

<h2 id="to-conclude">To conclude</h2>

<ul>
  <li>Finally</li>
  <li>Lastly</li>
  <li>As a conclusion</li>
  <li>In conclusion</li>
  <li>Taking everything into account</li>
  <li>On the whole</li>
  <li>All things considered</li>
  <li>To sum up</li>
</ul>

<h2 id="to-summarize">To summarize</h2>

<ul>
  <li>In short</li>
  <li>Briefly</li>
  <li>To put it briefly</li>
  <li>As a conclusion</li>
</ul>]]></content><author><name>Onur Tunali</name></author><category term="etc" /><category term="writing" /><summary type="html"><![CDATA[This post containts lists of common expressions to be used in academic writing or just in expository texts. Even though it is conjuctions oriented, there are usefull constructions for argumentation.]]></summary></entry></feed>