<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Machine-Learning | Haihao Sun's Homepage</title><link>https://h3sun.github.io/tags/machine-learning/</link><atom:link href="https://h3sun.github.io/tags/machine-learning/index.xml" rel="self" type="application/rss+xml"/><description>Machine-Learning</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sun, 20 Apr 2025 00:00:00 +0000</lastBuildDate><image><url>https://h3sun.github.io/media/icon_hu68170e94a17a2a43d6dcb45cf0e8e589_3079_512x512_fill_lanczos_center_3.png</url><title>Machine-Learning</title><link>https://h3sun.github.io/tags/machine-learning/</link></image><item><title>D2L - Chapter 3.4 Linear Regression Implementation From Scratch</title><link>https://h3sun.github.io/post/2025-04-20-chapter-3-4-linear-regression-implementation-from-scratch/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-20-chapter-3-4-linear-regression-implementation-from-scratch/</guid><description>&lt;h2 id="34-linear-regression-implementation-from-scratch">3.4 Linear Regression Implementation From Scratch&lt;/h2>
&lt;p>We are now realy to implement the entire method from scratch, including&lt;/p>
&lt;ol>
&lt;li>model&lt;/li>
&lt;li>loss function&lt;/li>
&lt;li>a minibatch stochastic gradient descent optimizer&lt;/li>
&lt;li>training function that stitches all these pieces together&lt;/li>
&lt;/ol>
&lt;h3 id="341-defining-the-model">3.4.1 Defining the Model&lt;/h3>
&lt;p>Initialize weights and bias.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearRegressionScratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">module&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">num_inputs&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lr&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">float&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sigma&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">float&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.01&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">w&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">param&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">nn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">initializers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">normal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sigma&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_inputs&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">param&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">nn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">initializers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zeros&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Define our model, relating its input and parameters to its output&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegressionScratch&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">forward&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="342-defining-the-loss-funciton">3.4.2 Defining the Loss Funciton&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegressionScratch&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">y_hat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_fn&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;params&amp;#34;: params}, *X) # X unpacked from a tuple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">l&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">y_hat&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y_hat&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="343-defining-the-optimization-algorithm">3.4.3 Defining the Optimization Algorithm&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">SGD&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lr&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">del&lt;/span> &lt;span class="n">params&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">EmptyState&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">updates&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">del&lt;/span> &lt;span class="n">params&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># When state.apply_gradients method is called to update flax&amp;#39;s train_state object, it internally calls&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">updates&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tree_util&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tree_map&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">lambda&lt;/span> &lt;span class="n">g&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lr&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">updates&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">updates&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__call__&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">GradientTransformation&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">init&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">update&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegressionScratch&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">configure_optimizers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">SGD&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="344-training">3.4.4 Training&lt;/h3>
&lt;ul>
&lt;li>Initialize parameters &lt;strong>(𝑤, 𝑏)&lt;/strong>&lt;/li>
&lt;li>Repeat until done:
&lt;ul>
&lt;li>Compute gradient &lt;strong>𝐠&lt;/strong> ← ∂&lt;sub>(𝑤,𝑏)&lt;/sub> (1 / |𝔅|) ∑&lt;sub>𝑖∈𝔅&lt;/sub> 𝑙(𝐱&lt;sup>(𝑖)&lt;/sup>, 𝑦&lt;sup>(𝑖)&lt;/sup>, &lt;strong>𝑤&lt;/strong>, &lt;strong>𝑏&lt;/strong>)&lt;/li>
&lt;li>Update parameters (&lt;strong>𝑤&lt;/strong>, &lt;strong>𝑏&lt;/strong>) ← (&lt;strong>𝑤&lt;/strong>, &lt;strong>𝑏&lt;/strong>) − η &lt;strong>𝐠&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Trainer&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">prepare_batch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">batch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Trainer&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">fit_epoch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">training&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">batch_stats&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mutable states will be used later (e.g. for batch norm)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mutated_vars&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">grads&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">training_step&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">prepare_batch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">batch&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_gradients&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">grads&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">grads&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># can be ignored for models without dropout layers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dropout_rng&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dropout_rng&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">batch_stats&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">mutated_vars&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;batch_stats&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_batch_idx&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">grads&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">training_step&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">prepare_batch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">batch&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_gradients&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">grads&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">grads&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Can be ignored for models without dropout layers&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dropout_rng&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dropot_rng&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_batch_idx&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">training&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">batch&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">validation_step&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">prepare_batch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">batch&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_batch_idx&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Testing with SyntheticRegressionData classs&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">LinearRegressionScratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lr&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.03&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">SyntheticRegressionData&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mf">3.4&lt;/span>&lt;span class="p">]),&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">4.2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Trainer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">max_epochs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">params&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;error in estimating w: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">w&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;error in estimating b: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;b&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">error&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">estimating&lt;/span> &lt;span class="n">w&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="mf">0.07147813&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mf">0.19255161&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">error&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">estimating&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">0.24309802&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="345-summary">3.4.5 Summary&lt;/h3>
&lt;p>We implemented the following:&lt;/p>
&lt;ol>
&lt;li>dataloader&lt;/li>
&lt;li>model&lt;/li>
&lt;li>loss function&lt;/li>
&lt;li>optimization procedure&lt;/li>
&lt;/ol></description></item><item><title>D2L - Chapter 3.5 Concise Implementation of Linear Regression</title><link>https://h3sun.github.io/post/2025-04-20-chapter-3-5-concise-implementation-of-linear-regression/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-20-chapter-3-5-concise-implementation-of-linear-regression/</guid><description>&lt;h2 id="35-concise-implementation-of-linear-regression">3.5 Concise Implementation of Linear Regression&lt;/h2>
&lt;h3 id="351-defining-the-model">3.5.1 Defining the Model&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">LinearRegression&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Module&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lr&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">float&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">setup&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">net&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Dense&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">kernel_init&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">nn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">initializers&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">normal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">0.01&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegression&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">forward&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">net&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="352-defining-the-loss-function">3.5.2 Defining the Loss Function&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegression&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">y_hat&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_fn&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;params&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">l2_loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y_hat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="353-defining-the-optimization-algorithm">3.5.3 Defining the Optimization Algorithm&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LinearRegression&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">configure_optimizers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sgd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="354-training">3.5.4 Training&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">model = LinearRegression(lr=0.03)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">data = d2l.SyntheticRegressionData(w=jnp.array([2, -3.4]), b=4.2)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trainer = d2l.Trainer(max_epochs=3)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">trainer.fit(model, data)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">@d2l.add_to_class(LinearRegression) #@save
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">def get_w_b(self, state):
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> net = state.params[&amp;#39;net&amp;#39;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> return net[&amp;#39;kernel&amp;#39;], net[&amp;#39;bias&amp;#39;]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">w, b = model.get_w_b(trainer.state)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>D2L - Chapter 3.6 Generalization</title><link>https://h3sun.github.io/post/2025-04-20-chapter-3-6-generalization/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-20-chapter-3-6-generalization/</guid><description>&lt;h2 id="36-generalization">3.6 Generalization&lt;/h2>
&lt;ol>
&lt;li>Exploring both what is known about the principles underlying generalization in various models&lt;/li>
&lt;li>Also heuristic techniques that have been found (empirically) to yield improved generalization on tasks of practical interest.&lt;/li>
&lt;/ol>
&lt;h3 id="361-training-error-and-generalization-error">3.6.1 Training Error and Generalization Error&lt;/h3>
&lt;h4 id="3611-model-complexity">3.6.1.1 Model Complexity&lt;/h4>
&lt;h3 id="362-underfitting-or-overfitting">3.6.2 Underfitting or Overfitting&lt;/h3>
&lt;ol>
&lt;li>Underfitting, both error high&lt;/li>
&lt;li>Overfitting, training error low, validation error high&lt;/li>
&lt;/ol>
&lt;h4 id="3621-polynomial-curve-fitting">3.6.2.1 Polynomial Curve Fitting&lt;/h4>
&lt;h4 id="3622-dataset-size">3.6.2.2 Dataset Size&lt;/h4>
&lt;h3 id="363-model-selection">3.6.3 Model Selection&lt;/h3>
&lt;h4 id="3631-cross-validation">3.6.3.1 Cross-validation&lt;/h4>
&lt;ol>
&lt;li>split into k&lt;/li>
&lt;li>train on k - 1, validate on the remaining&lt;/li>
&lt;li>average among all the errors&lt;/li>
&lt;/ol>
&lt;h3 id="364-summary">3.6.4 Summary&lt;/h3></description></item><item><title>D2L - Chapter 3.7 Weight Decay</title><link>https://h3sun.github.io/post/2025-04-20-chapter-3-7-weight-decay/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-20-chapter-3-7-weight-decay/</guid><description>&lt;h2 id="37-weight-decay">3.7 Weight Decay&lt;/h2>
&lt;h3 id="371-norms-and-weight-decay">3.7.1 Norms and Weight Decay&lt;/h3>
&lt;p>The total loss with weight decay is:&lt;/p>
$$
\mathcal{L}_{\text{total}} = \mathcal{L}_{\text{original}} + \lambda \|\mathbf{w}\|^2
$$
&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>\( \mathcal{L}\_{\text{original}} \) is the original loss (e.g., cross-entropy)&lt;/li>
&lt;li>\( \lambda \) is the weight decay coefficient&lt;/li>
&lt;li>\( \|\mathbf{w}\|^2 \) is the squared L2 norm of the weights&lt;/li>
&lt;/ul>
&lt;p>The weight update rule with weight decay for linear regression is:&lt;/p>
$$
\mathbf{w} \leftarrow (1 - \eta \lambda)\mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left( \mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)} \right)
$$
&lt;h3 id="372-high-dimensional-linear-regression">3.7.2 High-Dimensional Linear Regression&lt;/h3>
&lt;h3 id="373-implementation-from-scratch">3.7.3 Implementation From Scratch&lt;/h3>
&lt;h4 id="3731-defining-norm-penalty">3.7.3.1. Defining Norm Penalty&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">l2_penalty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3732-defining-the-model">3.7.3.2. Defining the Model&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">WeightDecayScratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">LinearRegressionScratch&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lambd&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">super&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lambd&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">l2_penalty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_val&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_inputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">5&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Trainer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">max_epochs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">train_scratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lambd&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WeightDecayScratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">num_inputs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">200&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lambd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">lambd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lr&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.01&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">yscale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;log&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;L2 norm of w:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l2_penalty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;w&amp;#39;&lt;/span>&lt;span class="p">])))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="3733-training-without-regularization">3.7.3.3 Training without Regularization&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">train_scratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">train_scratch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="374-concise-implementation">3.7.4. Concise Implementation&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">WeightDecay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">LinearRegression&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">wd&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">configure_optimizers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Weight Decay is not available directly within optax.sgd, but&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># optax allows chaining several transformations together&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chain&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">additive_weight_decay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">wd&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">optax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sgd&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lr&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">WeightDecay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">wd&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">lr&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.01&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">yscale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;log&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;L2 norm of w:&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">l2_penalty&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_w_b&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span>&lt;span class="p">)[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="375-summary">3.7.5. Summary&lt;/h3></description></item><item><title>D2L - Chapter 3.1 Linear Regression</title><link>https://h3sun.github.io/post/2025-04-19-chapter-3-1-linear-regression/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-19-chapter-3-1-linear-regression/</guid><description>&lt;h2 id="31-linear-regression">3.1 Linear Regression&lt;/h2>
&lt;h3 id="311-basics">3.1.1 Basics&lt;/h3>
&lt;h4 id="3111-model">3.1.1.1 Model&lt;/h4>
&lt;ol>
&lt;li>y = wx + b&lt;/li>
&lt;li>search for the best w and b&lt;/li>
&lt;li>measure of the quality of some given model (todo - 1)&lt;/li>
&lt;li>a procedure for updating the model to improve its quality (todo - 2)&lt;/li>
&lt;/ol>
&lt;h4 id="3112-loss-function">3.1.1.2 Loss Function&lt;/h4>
$$
L(\mathbf{w}, b)
= \frac{1}{n} \sum_{i=1}^{n} l^{(i)}(\mathbf{w}, b)
= \frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\!\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^{2}. \tag{3.1.6}
$$
&lt;h4 id="3113-analytic-solution">3.1.1.3 Analytic Solution&lt;/h4>
$$
\partial_{\mathbf{w}} \| \mathbf{y} - \mathbf{Xw} \|^2 = 2 \mathbf{X}^\top (\mathbf{Xw} - \mathbf{y}) = 0
\quad \text{and hence} \quad
\mathbf{X}^\top \mathbf{y} = \mathbf{X}^\top \mathbf{Xw}. \tag{3.1.8}
$$
&lt;p>Solving for $\mathbf{w}$ provides us with the optimal solution for the optimization problem. Note that this solution&lt;/p>
$$
\mathbf{w}^* = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y} \tag{3.1.9}
$$
&lt;h4 id="3114-minibatch-stochastic-gradient-descent">3.1.1.4 Minibatch Stochastic Gradient Descent&lt;/h4>
&lt;ol>
&lt;li>Gradient Descent&lt;/li>
&lt;li>Stochastic Gradient Descent (SGD)&lt;/li>
&lt;li>MiniBatch SGD
$$
\mathbf{w} \leftarrow \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t} \partial_{\mathbf{w}} l^{(i)}(\mathbf{w}, b)
= \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t} \mathbf{x}^{(i)} \left( \mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)} \right)
\tag{3.1.11}
$$&lt;/li>
&lt;/ol>
$$
b \leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t} \partial_b l^{(i)}(\mathbf{w}, b)
= b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t} \left( \mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)} \right).
$$
&lt;h4 id="3115-predictions">3.1.1.5 Predictions&lt;/h4>
&lt;p>Plug w and b to predict y&lt;/p>
&lt;h3 id="312-vectorization-for-speed">3.1.2 vectorization for Speed&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jax&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">tensorflow&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># JAX arrays are immutable, meaning that once created their contents&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># cannot be changed. For updating individual elements, JAX provides&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># an indexed update syntax that returns an updated copy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zeros&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">c&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">at&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s1">.5f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1"> sec&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">/*&lt;/span> &lt;span class="mi">22&lt;/span>&lt;span class="n">s&lt;/span> &lt;span class="o">*/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">d&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sa">f&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s1">.5f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s1"> sec&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">/*&lt;/span> &lt;span class="mf">0.017&lt;/span>&lt;span class="n">s&lt;/span> &lt;span class="o">*/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="313-the-normal-distribution-and-squared-loss">3.1.3 The Normal Distribution and Squared Loss&lt;/h3>
&lt;h3 id="314-linear-regression-as-a-neural-network">3.1.4 Linear Regression as a Neural Network&lt;/h3>
&lt;h4 id="3141-biology">3.1.4.1 Biology&lt;/h4>
&lt;h3 id="315-summary">3.1.5 Summary&lt;/h3>
&lt;p>introduced/reviewed linear regression, the cornerstone of deep learning.&lt;/p></description></item><item><title>D2L - Chapter 3.2 Object-Oriented Design for Implementation</title><link>https://h3sun.github.io/post/2025-04-19-chapter-3-2-ood/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-19-chapter-3-2-ood/</guid><description>&lt;h2 id="32-object-oriented-design-for-implementation">3.2 Object-Oriented Design for Implementation&lt;/h2>
&lt;ol>
&lt;li>Module contains models, losses, and optimization methods&lt;/li>
&lt;li>DataModule provides data loaders for training and validation&lt;/li>
&lt;li>Both classes are combined using Trainer class which allows us to train models on a variety of hardware platforms.&lt;/li>
&lt;/ol>
&lt;p>Most code in this book adapts Module and DataModule. We will touch upon the Trainer class only when we discuss GPUs, CPUs, parallel training, and optimization algorithms.&lt;/p>
&lt;h3 id="321-utilities">3.2.1 Utilities&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Class&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Register functions as methods in created class.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">wrapper&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">obj&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">setattr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Class&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="vm">__name__&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">obj&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">wrapper&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">A&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">A&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">A&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">do&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Class attribute &amp;#34;b&amp;#34; is&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">do&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Class attribute &amp;#34;b&amp;#34; is 1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">HyperParameters&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;The base class of hyperparameters.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">save_hyperparameters&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ignore&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[]):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="bp">NotImplemented&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Call the fully implemented HyperParameters class saved in d2l&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">B&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ignore&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;self.a =&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;self.b =&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;There is no self.c =&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="nb">hasattr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;c&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">B&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">c&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">ProgressBoard&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;The board that plots data points in animation.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xlabel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ylabel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xlim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ylim&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">xscale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;linear&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">yscale&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;linear&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ls&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;-&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;--&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;-.&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;:&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">colors&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;C0&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;C1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;C2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;C3&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fig&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">axes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">figsize&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">3.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.5&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">display&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">label&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">every_n&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="bp">NotImplemented&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">board&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ProgressBoard&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;x&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.1&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s1">&amp;#39;sin&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">every_n&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cos&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s1">&amp;#39;cos&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">every_n&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="322-models">3.2.2 Models&lt;/h3>
&lt;p>The Module class is the base class of all models that we will implement. At the very least we need three models. The first, &lt;strong>init&lt;/strong> stores the learnable parameters, the &lt;strong>training_step&lt;/strong> method accepts a data batch to return the loss value, and finally, &lt;strong>configure_optimizers&lt;/strong> returns the optimization method, or a list of them, that is used to update the learnable parameters. Optionally, we can define &lt;strong>validation_steps&lt;/strong> to report the evaluation measures. Sometimes we put the code for computing the output into a separate of &lt;strong>forward&lt;/strong> method to make it more resubale.&lt;/p>
&lt;p>With the introduce of dataclasses in Python3.7, classes decorated with @dataclass automatically add magic methods such as &lt;strong>init&lt;/strong> and &lt;strong>repr&lt;/strong>. The member variables are defined using type annotations. All Flax modules are Python 3.7 dataclasses.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Module&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Module&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;The base class of models&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># No need for save_hyperparam when using Python dataclass.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plot_train_per_epoch&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">field&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">init&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">plot_valid_per_epoch&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">int&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">field&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">default&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">init&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Use default_factory to make sure new plots are generated on each run.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">board&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ProgressBoard&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">field&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">default_factory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">lambda&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">ProgressBoard&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">init&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y_hat&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">NotImplementedError&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># JAX &amp;amp; Flax do not have a forward-method-like syntax. Flax uses setup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># and built-in __call__ magic methods for forward pass. Adding here&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># for consistency&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">forward&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">**&lt;/span>&lt;span class="n">kwargs&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="nb">hasattr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;net&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s1">&amp;#39;Neural network is defined&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">net&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="n">args&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">**&lt;/span>&lt;span class="n">kwargs&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Plot a point in animation.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="nb">hasattr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;trainer&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="s1">&amp;#39;Trainer is not inited&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">xlabel&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;epoch&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_batch_idx&lt;/span> &lt;span class="o">/&lt;/span> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train_batches&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train_batches&lt;/span> &lt;span class="o">/&lt;/span> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot_train_per_epoch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">epoch&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_val_batches&lt;/span> &lt;span class="o">/&lt;/span> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot_valid_per_epoch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">draw&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">device_put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">cpu&lt;/span>&lt;span class="p">()),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;train_&amp;#39;&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">train&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="s1">&amp;#39;val_&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">every_n&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">training_step&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">l&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">grads&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">value_and_grad&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loss&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;loss&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">grads&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">validation_step&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">l&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">loss&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">batch&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">state&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">plot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;loss&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">l&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">apply_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dummy_input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;To be defined later in :numref:`sec_lazy_init`&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">NotImplementedError&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">configure_optimizers&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">NotImplementedError&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="323-data">3.2.3 Data&lt;/h3>
&lt;p>The Datamodule class is the base class for data. Quite frequently the &lt;strong>init&lt;/strong> method is used to prepare the data.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">DataModule&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;The base class of data.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;../data&amp;#39;&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">get_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">NotImplementedError&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">train_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">val_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="324-training">3.2.4 Training&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Trainer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">HyperParameters&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;The base class for training models with data.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_epochs&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_gpus&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">gradient_clip_val&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">assert&lt;/span> &lt;span class="n">num_gpus&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;No GPU support yet&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">prepare_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train_batches&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_val_batches&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_dataloader&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="kc">None&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">prepare_model&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">trainer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="bp">self&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">board&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">xlim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">max_epochs&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">fit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">data&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">None&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">prepare_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">prepare_model&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">optim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">configure_optimizers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">key&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_key&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">root_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dropout_key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">root_key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s1">&amp;#39;params&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">params_key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;dropout&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">dropout_key&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dummy_input&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">next&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">iter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_dataloader&lt;/span>&lt;span class="p">))[:&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">variables&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply_init&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dummy_input&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">variables&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;params&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;batch_stats&amp;#39;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">variables&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">keys&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Here batch_stats will be used later (e.g., for batch norm)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_stats&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">variables&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;batch_stats&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_stats&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Flax uses optax under the hood for a single state obj TrainState.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># More will be discussed later in the dropout and batch&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># normalization section&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">class&lt;/span> &lt;span class="nc">TrainState&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">train_state&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TrainState&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_stats&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Any&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dropout_rng&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PRNGKeyArray&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">state&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TrainState&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">create&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">apply_fn&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">apply&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">params&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">params&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_stats&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">batch_stats&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dropout_rng&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">dropout_key&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tx&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">configure_optimizers&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">epoch&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">train_batch_idx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">val_batch_idx&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">epoch&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">max_epochs&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit_epoch&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">fit_epoch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">NotImplementedError&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="325-summary">3.2.5 Summary&lt;/h3>
&lt;p>This object-oriented design provides moduality.&lt;/p></description></item><item><title>D2L - Chapter 3.3 Synthetic Regression Data</title><link>https://h3sun.github.io/post/2025-04-19-chapter-3-3-synthetic-regression-data/</link><pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-19-chapter-3-3-synthetic-regression-data/</guid><description>&lt;h2 id="33-synthetic-regression-data">3.3 Synthetic Regression Data&lt;/h2>
&lt;h3 id="331-generating-the-dataset">3.3.1 Generating the Dataset&lt;/h3>
&lt;p>generate the fake data&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">SyntheticRegressionData&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataModule&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Synthetic data for linear regression.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="fm">__init__&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">w&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">noise&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_train&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num_val&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">super&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="fm">__init__&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">save_hyperparameters&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">num_train&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">num_val&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PRNGKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">key2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">split&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">X&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">normal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">w&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">noise&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">normal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">noise&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">matmul&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">w&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)))&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">noise&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="332-reading-the-dataset">3.3.2 Reading the Dataset&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SyntheticRegressionData&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">indices&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># The examples are read in random order&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shuffle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">indices&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">indices&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_val&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">indices&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">batch_size&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">batch_indices&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">indices&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">batch_size&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">yield&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">batch_indices&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">batch_indices&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="333-concise-implementation-of-the-data-loader">3.3.3 Concise Implementation of the Data Loader&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d2l&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataModule&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_tensorloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tensors&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">indices&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">)):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tensors&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">tuple&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">indices&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">tensors&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Use Tensorflow Datasets &amp;amp; Dataloader. JAX or Flax do not provide&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># any dataloading functionality&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shuffle_buffer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tensors&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">train&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">tfds&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">as_numpy&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tf&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Dataset&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_tensor_slices&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tensors&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shuffle&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">buffer_size&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">shuffle_buffer&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">batch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">batch_size&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@d2l.add_to_class&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SyntheticRegressionData&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#@save&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_dataloader&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="n">train&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="nb">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">num_train&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_tensorloader&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">train&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="334-summary">3.3.4 Summary&lt;/h3></description></item><item><title>D2L - Chapter 2.6 Probablity and Statistics + 2.7 Documentation</title><link>https://h3sun.github.io/post/2025-04-12-chapter-2-6+7-probabilty-and-statistics+documentation/</link><pubDate>Sat, 12 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-12-chapter-2-6+7-probabilty-and-statistics+documentation/</guid><description>&lt;h2 id="probablity-and-statistics">Probablity and Statistics&lt;/h2>
&lt;h3 id="covariance-matrix-diagonal--off-diagonal-entries">Covariance Matrix, Diagonal &amp;amp; Off-Diagonal Entries&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Covariance Matrix&lt;/strong>&lt;br>
A covariance matrix \(\Sigma\) is a square matrix that shows the covariance between each pair of coordinates in a random vector. It is:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Symmetric&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Positive semidefinite&lt;/strong>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Diagonal Entries&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Each diagonal entry \(\Sigma\_{ii}\) is the &lt;strong>variance&lt;/strong> of the \(i\)-th coordinate, denoted \(\mathrm{Var}(x_i)\).&lt;/li>
&lt;li>Variance measures how spread out the \(i\)-th coordinate is around its mean.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Off-Diagonal Entries&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Each off-diagonal entry \(\Sigma\_{ij}\) (with \(i \neq j\)) is the &lt;strong>covariance&lt;/strong> \(\mathrm{Cov}(x_i, x_j)\).&lt;/li>
&lt;li>Positive covariance means the two coordinates tend to vary in the same direction (above/below their means together), negative covariance indicates they move in opposite directions, and zero covariance indicates no linear co-movement.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Why Symmetric?&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Because \(\mathrm{Cov}(x_i, x_j) = \mathrm{Cov}(x_j, x_i)\), the matrix \(\Sigma\) must be symmetric.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="documentation">Documentation&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">dir&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">help&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">numpy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>D2L - Chapter 2.4 Calculus + 2.5 Automatic Differentiation</title><link>https://h3sun.github.io/post/2025-04-09-d2l-chapter-2-4+5-calculus+automatic-differentiation/</link><pubDate>Wed, 09 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-09-d2l-chapter-2-4+5-calculus+automatic-differentiation/</guid><description>&lt;h2 id="24-calculus">2.4 Calculus&lt;/h2>
&lt;h3 id="241-derivatives-and-differentiation">2.4.1 Derivatives and Differentiation&lt;/h3>
&lt;h3 id="242-visualization-utilities">2.4.2 Visualization Utilities&lt;/h3>
&lt;h3 id="243-partial-derivatives-and-gradients">2.4.3 Partial Derivatives and Gradients&lt;/h3>
&lt;p>When there is no ambiguity, ∇ₓf(&lt;strong>x&lt;/strong>) is typically replaced by ∇f(&lt;strong>x&lt;/strong>). The following rules come in handy for differentiating multivariate functions:&lt;/p>
&lt;ul>
&lt;li>For all &lt;strong>A&lt;/strong> ∈ ℝᵐˣⁿ we have ∇ₓ(&lt;strong>A&lt;/strong>x) = &lt;strong>A&lt;/strong>ᵀ and ∇ₓ(&lt;strong>x&lt;/strong>ᵀ&lt;strong>A&lt;/strong>) = &lt;strong>A&lt;/strong>.&lt;/li>
&lt;li>For square matrices &lt;strong>A&lt;/strong> ∈ ℝⁿˣⁿ we have that ∇ₓ(&lt;strong>x&lt;/strong>ᵀ&lt;strong>A&lt;/strong>x) = (&lt;strong>A&lt;/strong> + &lt;strong>A&lt;/strong>ᵀ)&lt;strong>x&lt;/strong> and in particular&lt;br>
∇ₓ‖&lt;strong>x&lt;/strong>‖² = ∇ₓ(&lt;strong>x&lt;/strong>ᵀ&lt;strong>x&lt;/strong>) = 2&lt;strong>x&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;h3 id="244-chain-rule">2.4.4 Chain Rule&lt;/h3>
&lt;h3 id="245-discussion">2.4.5 Discussion&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Automatic differentiation&lt;/strong> allows us to compute gradients systematically using composition rules, freeing up cognitive effort for higher-level tasks.&lt;/li>
&lt;li>&lt;strong>Gradient computation&lt;/strong> for vector-valued functions involves matrix multiplication, following the chain of variable dependencies.&lt;/li>
&lt;li>&lt;strong>Dependency graphs&lt;/strong>:
&lt;ul>
&lt;li>Evaluated &lt;strong>forward&lt;/strong> to compute function outputs.&lt;/li>
&lt;li>Traversed &lt;strong>backward&lt;/strong> to compute gradients (backpropagation).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Backpropagation&lt;/strong> is a computational application of the chain rule, introduced formally in later chapters.&lt;/li>
&lt;li>In &lt;strong>optimization&lt;/strong>, gradients indicate how to adjust model parameters to reduce the loss.&lt;/li>
&lt;li>Every step of an optimization algorithm relies on computing the gradient.&lt;/li>
&lt;/ul>
&lt;h2 id="25-automatic-differentiation">2.5 Automatic Differentiation&lt;/h2>
&lt;h3 id="251-a-simple-function">2.5.1 A simple function&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">jax&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">grad&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">4.0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">lambda&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># The `grad` transform returns a Python function that&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># computes the gradient of the original function&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x_grad&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">grad&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">y&lt;/span>&lt;span class="p">)(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x_grad&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="252-backward-for-non-scalar-variables">2.5.2 Backward for Non-Scalar Variables&lt;/h3>
&lt;h3 id="253-detaching-computation">2.5.3 Detaching Computation&lt;/h3>
&lt;ul>
&lt;li>move some calculations outside the recorded computational graph&lt;/li>
&lt;/ul>
&lt;h3 id="254-gradients-and-python-control-flow">2.5.4. Gradients and Python Control Flow&lt;/h3>
&lt;h3 id="255-discussion">2.5.5 Discussion&lt;/h3>
&lt;p>For now, try to remember these basics:&lt;/p>
&lt;ul>
&lt;li>(i) attach gradients to those variables with respect to which we desire derivatives;&lt;/li>
&lt;li>(ii) record the computation of the target value;&lt;/li>
&lt;li>(iii) execute the backpropagation function;&lt;/li>
&lt;li>(iv) access the resulting gradient.&lt;/li>
&lt;/ul></description></item><item><title>D2L - Chapter 2.2 Data Preprocessing + 2.3 Linear Algebra</title><link>https://h3sun.github.io/post/2025-04-08-d2l-chapter-2-2+3-data-preprocessing+linear-algebra/</link><pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-08-d2l-chapter-2-2+3-data-preprocessing+linear-algebra/</guid><description>&lt;h2 id="22-data-preprocessing">2.2 Data Preprocessing&lt;/h2>
&lt;h3 id="221-reading-the-dataset">2.2.1 Reading the Dataset&lt;/h3>
&lt;h3 id="222-data-preparation">2.2.2 Data Preparation&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">inputs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_dummies&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inputs&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dummy_na&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">inputs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">inputs&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fillna&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inputs&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="223-conversion-to-the-tensor-format">2.2.3 Conversion To the Tensor Format&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">jax&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">jnp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">inputs&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_numpy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">targets&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">to_numpy&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb">float&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="23-linear-algebra">2.3 Linear Algebra&lt;/h2>
&lt;h3 id="231-scalars">2.3.1 Scalars&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x = jnp.array(3.0)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">y = jnp.array(2.0)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="232-vectors">2.3.2 Vectors&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">x = jnp.arange(3)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">x
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">x[2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">len(x)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">x.shape
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="233-matrices">2.3.3 Matrices&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">6&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">T&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">A&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">T&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="234-tensors">2.3.4 Tensors&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">24&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="235-basic-properties-of-tensor-arithmetic">2.3.5 Basic Properties of Tensor Arithmetic&lt;/h3>
&lt;ol>
&lt;li>element-wise addition&lt;/li>
&lt;li>element-wise multiplication (Hadamard Product)&lt;/li>
&lt;li>element * scalar&lt;/li>
&lt;/ol>
&lt;h3 id="236-reduction">2.3.6 Reduction&lt;/h3>
&lt;p>By default, invoking the sum function reduces a tensor along all of its axes, eventually producing a scalar. Our libraries also allow us to [specify the axes along which the tensor should be reduced.] To sum over all elements along the rows (axis 0), we specify axis=0 in sum. Since the input matrix reduces along axis 0 to generate the output vector, this axis is missing from the shape of the output.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">A&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">A&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">axis&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">C&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">24&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">C&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">C&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">axis&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="237-non-reduction-sum">2.3.7 Non-Reduction Sum&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">print(A)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sum_A = A.sum(axis=1, keepdims=True)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sum_A, sum_A.shape
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[[0. 1. 2.]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> [3. 4. 5.]]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(Array([[ 3.],
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> [12.]], dtype=float32),
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (2, 1))
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A.cumsum(axis=0)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="238-dot-products">2.3.8 Dot Products&lt;/h3>
&lt;p>weighted sum/ weighted average&amp;hellip;&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dtype&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">float32&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="239-matrix-vector-products">2.3.9 Matrix-Vector Products&lt;/h3>
&lt;h3 id="2310-matrix-matrix-products">2.3.10 Matrix-Matrix Products&lt;/h3>
&lt;p>n&lt;em>k X k&lt;/em>m
-&amp;gt; n * m dot products&lt;/p>
&lt;h3 id="2311-norms">2.3.11 Norms&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">u = jnp.array([3.0, -4.0])
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">jnp.linalg.norm(u)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">jnp.linalg.norm(u, ord=1) # same as jnp.abs(u).sum()
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">jnp.linalg.norm(jnp.ones((4, 9)))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2312-discussions">2.3.12 Discussions&lt;/h3>
&lt;ul>
&lt;li>Scalars, vectors, matrices, and tensors are the basic mathematical objects used in linear algebra and have zero, one, two, and an arbitrary number of axes, respectively.&lt;/li>
&lt;li>Tensors can be sliced or reduced along specified axes via indexing, or operations such as sum and mean, respectively.&lt;/li>
&lt;li>Elementwise products are called Hadamard products. By contrast, dot products, matrix–vector products, and matrix–matrix products are not elementwise operations and in general return objects having shapes that are different from the the operands.&lt;/li>
&lt;li>Compared to Hadamard products, matrix–matrix products take considerably longer to compute (cubic rather than quadratic time).&lt;/li>
&lt;li>Norms capture various notions of the magnitude of a vector (or matrix), and are commonly applied to the difference of two vectors to measure their distance apart.&lt;/li>
&lt;li>Common vector norms include the l1 and l2 norms, and common matrix norms include the spectral and Frobenius norms.&lt;/li>
&lt;/ul></description></item><item><title>D2L - Chapter 2.1 Data Manipulation</title><link>https://h3sun.github.io/post/2025-04-07-d2l-chapter-2-1-data-manipulation/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-07-d2l-chapter-2-1-data-manipulation/</guid><description>&lt;p>&lt;a href="https://colab.research.google.com/github/d2l-ai/d2l-jax-colab/blob/master/chapter_preliminaries/ndarray.ipynb">colab&lt;/a>&lt;/p>
&lt;h3 id="211-get-started">2.1.1 Get Started&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">jax&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">jax&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">jnp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="n">Array&lt;/span>&lt;span class="p">([&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">6&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">7&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">int32&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">size&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="mi">12&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span> &lt;span class="o">-&amp;gt;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">zeros&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Any call of a random function in JAX requires a key to be&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># specified, feeding the same key to a random function will&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># always result in the same sample being generated&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">normal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">jax&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">random&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PRNGKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="personal-note">Personal Note&lt;/h4>
&lt;ol>
&lt;li>shape -&amp;gt; (axis-0, axis-1, &amp;hellip;)&lt;/li>
&lt;li>reshape must be multiple&lt;/li>
&lt;/ol>
&lt;h3 id="212-indexing-and-slicing">2.1.2 Indexing and Slicing&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># JAX arrays are immutable. jax.numpy.ndarray.at index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># update operators create a new array with the corresponding&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># modifications made&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X_new_1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">X&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">at&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">17&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X_new_1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X_new_2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">X_new_1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">at&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">:]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X_new_2&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="213-operations">2.1.3 Operations&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">1.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">x&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="n">y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dtype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">float32&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Y&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([[&lt;/span>&lt;span class="mf">2.0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># axis sets which direction to stack, axis = 0, stacks on the row, meaning will have 6 in axis-0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">concatenate&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">axis&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">concatenate&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Y&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">axis&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Y&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">X&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="personal-note-1">Personal Note&lt;/h4>
&lt;ol>
&lt;li>axis sets which direction to stack. For example, axis = 0, stacks on the row, meaning will have 6(3 + 3) items in axis-0.&lt;/li>
&lt;/ol>
&lt;h3 id="214-broadcasting">2.1.4 Broadcasting&lt;/h3>
&lt;p>By now, you know how to perform elementwise binary operations on two tensors of the same shape. Under certain conditions, even when shapes differ, we can still [perform elementwise binary operations by invoking the broadcasting mechanism.] Broadcasting works according to the following two-step procedure: (i) expand one or both arrays by copying elements along axes with length 1 so that after this transformation, the two tensors have the same shape; (ii) perform an elementwise operation on the resulting arrays.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">b&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">arange&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">reshape&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="personal-note-2">Personal Note&lt;/h4>
&lt;ol>
&lt;li>broadcasting copies data to reach lcm and do computation.&lt;/li>
&lt;/ol>
&lt;h3 id="215-conversion-to-other-python-objects">2.1.5 Conversion to Other Python Objects&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">jnp&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">array&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="mf">3.5&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">item&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">float&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="err">🙅&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="err">🙅&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>D2L - Introduction - 2/2</title><link>https://h3sun.github.io/post/2025-04-07-d2l-chapter-1-2-introduction-2-complete/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-07-d2l-chapter-1-2-introduction-2-complete/</guid><description>&lt;h2 id="132-unsupervised-and-self-supervised-learning">1.3.2 UnSupervised and Self-Supervised Learning&lt;/h2>
&lt;p>The author lists the difference between traditional software engineering and machine learning. While software engineering focuses on solving problems with rule-based solutions, machine learning(deep learning) tries to solve problems that are ambiguous and the solution can evlove by itself after seeing more examples.&lt;/p>
&lt;ol>
&lt;li>Clustering&lt;/li>
&lt;li>PCA&lt;/li>
&lt;li>Relationship, Rome - Italy = France - Paris&lt;/li>
&lt;li>causality and probabilistic graphical models&lt;/li>
&lt;/ol>
&lt;h3 id="133-interacting-with-an-environment">1.3.3 Interacting with an Environment&lt;/h3>
&lt;h3 id="134-reinforcement-learning">1.3.4 Reinforcement Learning&lt;/h3>
&lt;h2 id="14-roots">1.4 Roots&lt;/h2>
&lt;h2 id="15-the-road-to-deep-learning">1.5 The road to deep learning&lt;/h2>
&lt;h2 id="16-success-stories">1.6 Success Stories&lt;/h2>
&lt;h2 id="17-the-essence-of-deep-learning">1.7 The essence of deep learning&lt;/h2>
&lt;p>Thus, one key advantage of deep learning is that it replaces not only the shallow models at the end of traditional learning pipelines, but also the labor-intensive process of feature engineering.&lt;/p>
&lt;h2 id="18-summary">1.8 Summary&lt;/h2>
&lt;h2 id="my-takeaway">My takeaway&lt;/h2>
&lt;p>Chapter1. Introduction mainly discussed machine learning from data, definition, examples, history, current success, provided foundation to future studies.&lt;/p></description></item><item><title>D2L - Introduction</title><link>https://h3sun.github.io/post/2025-04-02-d2l-chapter-1-1-introduction-1/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2025-04-02-d2l-chapter-1-1-introduction-1/</guid><description>&lt;h2 id="10-introduction">1.0 Introduction&lt;/h2>
&lt;p>The author lists the difference between traditional software engineering and machine learning. While software engineering focuses on solving problems with rule-based solutions, machine learning(deep learning) tries to solve problems that are ambiguous and the solution can evlove by itself after seeing more examples.&lt;/p>
&lt;h2 id="11-a-motivating-example">1.1 A Motivating Example&lt;/h2>
&lt;p>The author lists an example of a wake word system where we feed model with data and let the model learn.&lt;/p>
&lt;h2 id="12-key-components">1.2 Key Components&lt;/h2>
&lt;ol>
&lt;li>The data that we can learn from.&lt;/li>
&lt;li>A model of how to transform the data.&lt;/li>
&lt;li>An objective function that quantifies how well or badly the model is doing.&lt;/li>
&lt;li>An algorithm to adjust the model&amp;rsquo;s parameters to optimize the objective function.&lt;/li>
&lt;/ol>
&lt;h3 id="121-data">1.2.1 Data&lt;/h3>
&lt;p>Machine learning relies on data, which consists of examples represented numerically through features (inputs) and, in supervised learning, labels (targets). Examples include images or medical records, which can be structured as fixed-length vectors—but not all data fits this format, especially text or variable-sized inputs. Deep learning models handle such complexity more effectively than traditional methods. However, more data generally leads to better models, especially in deep learning, where large datasets are often essential. Crucially, the quality and representativeness of the data matter just as much as quantity—biased or flawed data can lead to harmful and unfair outcomes, even without malicious intent.&lt;/p>
&lt;h3 id="122-models">1.2.2 Models&lt;/h3>
&lt;p>Most machine learning involves transforming input data to make predictions. A model refers to the system that performs this transformation—taking data of one type and outputting another, such as predicting emotions from photos or detecting anomalies in sensor readings. While simple models can solve basic problems, more complex challenges often require more powerful tools. Deep learning stands out by using layered models that apply many transformations in sequence, hence the term deep. This approach enables tackling problems that push beyond the limits of classical methods, though traditional techniques still play a role along the way.&lt;/p>
&lt;h3 id="123-objective-function">1.2.3 Objective function&lt;/h3>
&lt;p>In machine learning, learning means improving performance at a task over time, which requires a clear way to measure improvement. These measurements are called objective functions or loss functions, which we usually define so that lower values are better. Common examples include squared error for regression and error rate for classification. Some losses are hard to optimize directly, so we often use surrogate objectives that are easier to work with.&lt;/p>
&lt;p>We train models by minimizing loss on a training dataset, treating the data as fixed and adjusting model parameters. However, strong performance on training data doesn&amp;rsquo;t guarantee success on new, unseen data. To evaluate generalization, we use a separate test dataset. If a model performs well on training data but poorly on test data, it&amp;rsquo;s said to be overfitting—essentially memorizing rather than learning.&lt;/p>
&lt;h3 id="124-optimization-algorithms">1.2.4 Optimization Algorithms&lt;/h3>
&lt;p>ChatGPT said:
Once we have data, a model, and an objective function, the next step is to optimize the model’s parameters to minimize the loss. In deep learning, this is typically done using gradient descent. This algorithm works by computing how a small change in each parameter would affect the loss, then adjusting the parameters in the direction that reduces the loss. Repeating this process iteratively helps the model gradually improve its performance.&lt;/p>
&lt;h2 id="13-kinds-of-machine-learning-problems">1.3 Kinds of Machine Learning Problems&lt;/h2>
&lt;h3 id="131-supervised-learning">1.3.1 Supervised Learning&lt;/h3>
&lt;h3 id="1311-regression">1.3.1.1 Regression&lt;/h3>
&lt;ol>
&lt;li>Question: How many?&lt;/li>
&lt;li>Loss: squared error&lt;/li>
&lt;/ol>
&lt;h3 id="1312-classification">1.3.1.2 Classification&lt;/h3>
&lt;ol>
&lt;li>Question: Which one?&lt;/li>
&lt;li>Loss: cross-entropy&lt;/li>
&lt;/ol>
&lt;h3 id="1313-tagging">1.3.1.3 Tagging&lt;/h3>
&lt;ol>
&lt;li>Question: multi-label classification&lt;/li>
&lt;/ol>
&lt;h3 id="1314-search">1.3.1.4 Search&lt;/h3>
&lt;ol>
&lt;li>Question: releance scores&lt;/li>
&lt;/ol>
&lt;h3 id="1315-recommender-system">1.3.1.5 Recommender System&lt;/h3>
&lt;h3 id="1316-sequence-learning">1.3.1.6 Sequence Learning&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>They require a model either to ingest sequences of inputs or to emit sequences of outputs (or both).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Cases&lt;/p>
&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Tagging and Parsing: tag named entity&lt;/li>
&lt;li>Automatic Speech Recognition: challenge is that input is way longer than output&lt;/li>
&lt;li>Text to Speech: This is the inverse of asr.&lt;/li>
&lt;li>Machine Translation: input/output might not align in the same order.&lt;/li>
&lt;/ul></description></item><item><title>CS224n-NLP-lecture 1, 2</title><link>https://h3sun.github.io/post/2024-11-29-cs224n-nlp-lecture1+2-word2vec/</link><pubDate>Fri, 29 Nov 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-11-29-cs224n-nlp-lecture1+2-word2vec/</guid><description>&lt;h1 id="word2vector">Word2Vector&lt;/h1>
&lt;h2 id="how">How&lt;/h2>
&lt;ul>
&lt;li>Represent words by their context (Distributional semantics): A word&amp;rsquo;s meaning is given by words frequently appear close-by, within a fixed-size.&lt;/li>
&lt;li>Use the many contexts of w to build up a representation of w.&lt;/li>
&lt;li>We build a dense vector for each word, chosen so that it is similar to vectors of words that appear in similar context.&lt;/li>
&lt;li>Note that word vectors are also called word embeddings, or neural word representations. They are a distributed representation.&lt;/li>
&lt;/ul>
&lt;h2 id="word2vector-idea">Word2Vector idea&lt;/h2>
&lt;ul>
&lt;li>We have a large body of text (corpus).&lt;/li>
&lt;li>Every word in a fixed vocabulary is represented by vector.&lt;/li>
&lt;li>Go through each position t in the text, which has a center word (c) and a context word (o).&lt;/li>
&lt;li>Use similarity of word vectors for c and o, calculate the probablity of o given c.&lt;/li>
&lt;li>Keep adjusting the word vector to maximize this probablity.&lt;/li>
&lt;/ul>
&lt;h2 id="math">Math&lt;/h2>
&lt;ul>
&lt;li>$L(\theta) = \prod_{t=1}^T \prod_{\substack{-m \leq j \leq m \\ j \neq 0}} P(w_{t+j} \mid w_t; \theta)$&lt;/li>
&lt;li>$J(\theta) = -\frac{1}{T} \log L(\theta) = -\frac{1}{T} \sum_{t=1}^T \sum_{\substack{-m \leq j \leq m \\ j \neq 0}} \log P(w_{t+j} \mid w_t; \theta)$&lt;/li>
&lt;li>$P(o \mid c) = \frac{\exp(u_o^T v_c)}{\sum_{w \in V} \exp(u_w^T v_c)}$
&lt;ul>
&lt;li>Exponentiation makes anything positive&lt;/li>
&lt;li>Dot product compares similarity of o and c.&lt;/li>
&lt;li>Normalize over entire vocabulary to give probability distribution&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="gradient-descent-and-stochastic-gradient-descent">Gradient Descent and Stochastic Gradient Descent&lt;/h2>
&lt;h3 id="problem">Problem:&lt;/h3>
&lt;ul>
&lt;li>J is a function of all windows in the corpus, gradient is expensive to compute.&lt;/li>
&lt;/ul>
&lt;h3 id="solution">Solution:&lt;/h3>
&lt;ul>
&lt;li>SGD Stochastic Gradient Descent&lt;/li>
&lt;li>SGD in each window: we only have at most 2m + 1 words&lt;/li>
&lt;li>Either we need sparse matrix updates operations to only update certain rows of full embedding metrics U and V, or we need to keep around a hash of word vector. Millions of word vectors allow us to do distributed computing.&lt;/li>
&lt;/ul>
&lt;h2 id="word2vector-algo-family">Word2Vector Algo Family&lt;/h2>
&lt;h3 id="two-models">Two models:&lt;/h3>
&lt;ul>
&lt;li>Skip-gram(SG), predict context (outside) words given center words.&lt;/li>
&lt;li>Continuous bag of words (CBOW), predict context words from context words.&lt;/li>
&lt;/ul>
&lt;h3 id="negative-sampling">Negative Sampling&lt;/h3>
&lt;h4 id="problem-1">Problem&lt;/h4>
&lt;ul>
&lt;li>The normalization demonitator is computionally expensive.&lt;/li>
&lt;/ul>
&lt;h4 id="solution-1">Solution&lt;/h4>
&lt;ul>
&lt;li>Train a binary logistic regression for a true pair vs noise pair.&lt;/li>
&lt;li>$J(\theta) = \frac{1}{T} \sum_{t=1}^{T} J_t(\theta)$&lt;/li>
&lt;li>$J_t(\theta) = \log \sigma \left( u_o^\top v_c \right) + \sum_{i=1}^{k} \mathbb{E}_{j \sim P(w)} \left[ \log \sigma \left( -u_j^\top v_c \right) \right]$&lt;/li>
&lt;li>$\sigma(x) = \frac{1}{1 + e^{-x}}$&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>Take k negative samples&lt;/li>
&lt;li>Maxmize probablity that real words appear, minimize probablity that random words appear around the center words.&lt;/li>
&lt;li>Sample with P(w) = u(w)^(3/4)&lt;/li>
&lt;/ol>
&lt;h2 id="co-occurence-counting">Co-occurence counting&lt;/h2>
&lt;h3 id="problems">Problems:&lt;/h3>
&lt;ol>
&lt;li>vector increase in sizes&lt;/li>
&lt;li>Subsequent classification models have sparsity issues.&lt;/li>
&lt;/ol>
&lt;h3 id="singular-value-decomposition">Singular Value Decomposition&lt;/h3>
&lt;p>X = USV&lt;/p>
&lt;h3 id="glove">GloVe&lt;/h3>
&lt;p>Crucial Insight: Ratios of co-occurence probablities can encode meaning components (meaning component means going from male to female etc).&lt;/p>
&lt;p>$J = \sum_{i,j=1}^{V} f(X_{ij}) \left( w_i^\top \tilde{w}_j + b_i + \tilde{b}_j - \log X_{ij} \right)^2$&lt;/p>
&lt;ul>
&lt;li>$X\_{ij}$: The co-occurrence count between words \( i \) and \( j \).&lt;/li>
&lt;li>\( w_i \): The word vector for the word \( i \).&lt;/li>
&lt;li>\( \tilde{w}\_j \): The context word vector for the word \( j \).&lt;/li>
&lt;li>\( b_i \): The bias term for the word \( i \).&lt;/li>
&lt;li>\( \tilde{b}\_j \): The bias term for the context word \( j \).&lt;/li>
&lt;li>\( \log X*{ij} \): The logarithm of the co-occurrence count \( X*{ij} \).&lt;/li>
&lt;li>\( f(X\_{ij}) \): A weighting function to limit the influence of very frequent or very infrequent word pairs.&lt;/li>
&lt;li>\( x\_{\text{max}} \): A maximum co-occurrence count threshold.&lt;/li>
&lt;/ul>
&lt;h2 id="how-to-evaluate">How to evaluate&lt;/h2>
&lt;h3 id="intrinsics">Intrinsics&lt;/h3>
&lt;h4 id="definition">Definition&lt;/h4>
&lt;ol>
&lt;li>Evaluation on a specific subtask.&lt;/li>
&lt;li>Fast to compute.&lt;/li>
&lt;li>Helps to understand the system.&lt;/li>
&lt;li>Not clear if it really helps unless correlation to real task is established.&lt;/li>
&lt;/ol>
&lt;h4 id="example">Example&lt;/h4>
&lt;ol>
&lt;li>Word Vector Analogy&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>man:woman :: king:?&lt;/li>
&lt;li>Evaluate word vectors by how will their cosine distance after addition captures intuitive semantics and syntatic analogy questions.&lt;/li>
&lt;li>Discard the input words from search&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>WordSim human judgement&lt;/li>
&lt;/ol>
&lt;h3 id="extrinsics">Extrinsics&lt;/h3>
&lt;h4 id="definition-1">Definition&lt;/h4>
&lt;ol>
&lt;li>Evaluation on a real task.&lt;/li>
&lt;li>Can take a long time to compute.&lt;/li>
&lt;li>Unclear if the subsystem is the probelm or its interaction or other subsystems.&lt;/li>
&lt;li>If replacing exactly one subsystem is making progress, that&amp;rsquo;s good.&lt;/li>
&lt;/ol>
&lt;h4 id="example-1">Example&lt;/h4>
&lt;p>Named Entity recognition.&lt;/p>
&lt;h2 id="word-sense">Word sense&lt;/h2>
&lt;p>A word can have multiple meanings.&lt;/p></description></item><item><title>Recommender System Study Notes - Nomination(6/6)</title><link>https://h3sun.github.io/post/2024-09-06-rec-sys-nomination-6/</link><pubDate>Fri, 06 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-06-rec-sys-nomination-6/</guid><description>&lt;ul>
&lt;li>GeoHash Nomination&lt;/li>
&lt;li>Author Nomination
&lt;ul>
&lt;li>Subscribed Author&lt;/li>
&lt;li>Interacted Author&lt;/li>
&lt;li>Similar Author&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Cache Nomination&lt;/li>
&lt;/ul>
&lt;h3 id="geohash-nomination">GeoHash Nomination&lt;/h3>
&lt;ul>
&lt;li>Indexing
&lt;ul>
&lt;li>GeoHash -&amp;gt; Item with good quality(reverse chronological order)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>No personalized&lt;/li>
&lt;/ul>
&lt;h3 id="subscribed-author-nomination">Subscribed Author Nomination&lt;/h3>
&lt;ul>
&lt;li>Indexing:
&lt;ul>
&lt;li>User -&amp;gt; subscribed authors&lt;/li>
&lt;li>author -&amp;gt; uploaded items&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Nomination:
&lt;ul>
&lt;li>User -&amp;gt; Subscribed Author -&amp;gt; New Item&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="interacted-author-nomination">Interacted Author Nomination&lt;/h3>
&lt;ul>
&lt;li>If someone likes/love/forward an item&lt;/li>
&lt;li>Indexing:
&lt;ul>
&lt;li>User -&amp;gt; Interacted Author (update it)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Nomination:
&lt;ul>
&lt;li>User -&amp;gt; Interacted Author -&amp;gt; New Item&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="similar-author-nomination">Similar Author Nomination&lt;/h3>
&lt;ul>
&lt;li>Indexing:
&lt;ul>
&lt;li>Author -&amp;gt; Similar Author&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Nomination:
&lt;ul>
&lt;li>User ID -&amp;gt; Liked Author -&amp;gt; Similar Author -&amp;gt; New Item&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="cache-nomination">Cache Nomination&lt;/h3>
&lt;ul>
&lt;li>Intuition: Use the previous ranking winning candidates discarded by re-ranking.&lt;/li>
&lt;li>Top 50 items, but get discarded by re-ranking, go to nomination.&lt;/li>
&lt;li>Cache is fixed. How to clear the cache
&lt;ul>
&lt;li>Got impressed&lt;/li>
&lt;li>At most 10 times&lt;/li>
&lt;li>At most 3 days&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="bloom-filter">Bloom Filter&lt;/h3>
&lt;h4 id="intuition">Intuition&lt;/h4>
&lt;ul>
&lt;li>If user has seen an item, then we do not recommend this item to user&lt;/li>
&lt;li>For each user, record item that has been recommended(maybe for a month)&lt;/li>
&lt;li>For each item, check if it&amp;rsquo;s been recommended before&lt;/li>
&lt;/ul>
&lt;h4 id="basics">Basics&lt;/h4>
&lt;ul>
&lt;li>The Bloom filter determines whether an item ID is in the set of exposed items.&lt;/li>
&lt;li>If the judgment is &amp;ldquo;no&amp;rdquo;, then the item is definitely not in the set.&lt;/li>
&lt;li>If the judgment is &amp;ldquo;yes&amp;rdquo;, then the item is likely in the set. (There may be false positives, where an unexposed item is incorrectly judged as exposed and thus filtered out.)&lt;/li>
&lt;/ul>
&lt;h4 id="heading">&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>The size of the exposed item set is \( n \), the dimensionality of the binary vector is \( m \), and \( k \) hash functions are used.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The false positive probability of the Bloom filter \( \delta \) is approximately:&lt;/p>
\[
\delta \approx \left( 1 - \exp\left( \frac{-kn}{m} \right) \right)^k
\]
&lt;/li>
&lt;li>
&lt;p>As \( n \) increases, the more 1&amp;rsquo;s there are in the vector, and the higher the false positive probability. (The probability that all \( k \) positions corresponding to unexposed items are set to 1 increases.)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As \( m \) increases, the vector becomes longer, making hash collisions less likely.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>If \( k \) is too large or too small, it is not ideal; \( k \) has an optimal value.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Exposed Filtering Path:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+ +---------+ +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Recall 1 |------------&amp;gt; | Sorting |------------&amp;gt; | Item 1 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+ +---------+ +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Recall 2 | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+ |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Recall 3 | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+ v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Item 2 |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | ... |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Item q |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ^ |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+------------------+ | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">| Binary Vector |&amp;lt;-+ |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+------------------+ v
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------------+ +-----------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Bloom Filter |&amp;lt;----| Real-time Processing |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | (Exposure Filter) | | (Kafka + Flink) |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------------+ +-----------------------+
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Recommender System Study Notes - Nomination(5/6)</title><link>https://h3sun.github.io/post/2024-09-05-rec-sys-nomination-5/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-05-rec-sys-nomination-5/</guid><description/></item><item><title>Recommender System Study Notes - Nomination(4/6)</title><link>https://h3sun.github.io/post/2024-09-04-rec-sys-nomination-4/</link><pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-04-rec-sys-nomination-4/</guid><description>&lt;ul>
&lt;li>Two tower model full update/incremental update.
&lt;ul>
&lt;li>Online Nomination: Online compute user ID, ANN in stored vector database with item.&lt;/li>
&lt;li>Full Update: 1 epoch, 1 day.&lt;/li>
&lt;li>Incremental Update: Only upadte ID embedding, frozen the fully connected layer.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Two tower model Self-supervised learning
&lt;ul>
&lt;li>Problem: Two tower cannot learn item with limited amount of clicks (data biased).&lt;/li>
&lt;li>Self-supervised learning: random feature transformation&lt;/li>
&lt;li>bi&amp;rsquo;, bi&amp;rsquo;&amp;rsquo; high similarity&lt;/li>
&lt;li>bi&amp;rsquo;, bj&amp;rsquo;&amp;rsquo; low similarity&lt;/li>
&lt;li>Training:
&lt;ul>
&lt;li>pick n (user - item) as a batch for training.&lt;/li>
&lt;li>m items as a batch(uniform sampling) for self-supervised learning.&lt;/li>
&lt;li>$\frac{1}{n} \sum_{i=1}^{n} L_{\text{main}}[i] + \alpha \cdot \frac{1}{m} \sum_{j=1}^{m} L_{\text{self}}[j]$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="online-nomination">Online Nomination&lt;/h3>
&lt;h4 id="implementation">Implementation&lt;/h4>
&lt;ul>
&lt;li>Item
&lt;ul>
&lt;li>Use neural network to compute item b&amp;rsquo;s embedding.&lt;/li>
&lt;li>Store them in vectorized databse (Milvus, Faiss, HnswLib).&lt;/li>
&lt;li>Indexing, for ANN search.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>User
&lt;ul>
&lt;li>Use user ID, feature, etc to compute user a&amp;rsquo;s embedding.&lt;/li>
&lt;li>ANN search
&lt;ul>
&lt;li>Use a as query.&lt;/li>
&lt;li>Return the top k as return.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Why store item but compute user online?
&lt;ul>
&lt;li>User is only 1, item is O(b).&lt;/li>
&lt;li>User often changes quickly.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="model-update">Model Update&lt;/h3>
&lt;h4 id="full-update-vs-incremental-update">Full Update VS Incremental Update&lt;/h4>
&lt;ul>
&lt;li>Full Update
&lt;ul>
&lt;li>Use yesterday&amp;rsquo;s tfrecord, train 1 epoch.&lt;/li>
&lt;li>Update the new user neural network, store item data into database.&lt;/li>
&lt;li>Easy to implement, easy requirement for the system.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Incremental Update(online learning)
&lt;ul>
&lt;li>Why? User&amp;rsquo;s interest can change quickly.&lt;/li>
&lt;li>Data streaming, TFRecord.&lt;/li>
&lt;li>Online learning, gradient descent, only update ID Embedding, not other parameters in the neural network.&lt;/li>
&lt;li>Update the new ID embedding.&lt;/li>
&lt;li>To be discarded after full update.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Why only incremental update is not having the best result?
&lt;ul>
&lt;li>Hourly data is biased.&lt;/li>
&lt;li>Full update: random shuffle, 1 epoch.&lt;/li>
&lt;li>Incremental update: train from morning to night, this is not having the best result.&lt;/li>
&lt;li>random shuffle makes a positive impact on the learning.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="two-tower-model-self-supervised-learning">Two tower model Self-supervised learning&lt;/h3>
&lt;h4 id="problem">Problem&lt;/h4>
&lt;ul>
&lt;li>
&lt;p>The head effect in the recommendation system is severe:&lt;/p>
&lt;ul>
&lt;li>A small number of items account for most of the clicks.&lt;/li>
&lt;li>Most items have a low number of clicks.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>The features of high-click items are well-learned, but the features of long-tail items are not well-learned.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Self-supervised learning: data augumentation, to better learn long-tail items&amp;rsquo; embedding.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="intuition">Intuition&lt;/h4>
&lt;ul>
&lt;li>A simple feature transformation will make minimal impact on their feature embeddings, and pairwise, the similarity still remains large.&lt;/li>
&lt;li>i -&amp;gt; i&amp;rsquo; -&amp;gt; bi&amp;rsquo;, i -&amp;gt; i&amp;rsquo;&amp;rsquo; -&amp;gt; bi&amp;rsquo;&amp;rsquo;, j -&amp;gt; j&amp;rsquo; -&amp;gt; bj&amp;rsquo;, j -&amp;gt; j&amp;rsquo;&amp;rsquo;-&amp;gt;bj''&lt;/li>
&lt;li>i, bi&amp;rsquo; and bi&amp;rsquo;&amp;rsquo; has high similarity&lt;/li>
&lt;li>i, j, bi&amp;rsquo; and bj&amp;rsquo;&amp;rsquo; has low similarity&lt;/li>
&lt;li>cos(bi, bi&amp;rsquo;&amp;rsquo;) big, cos(bi&amp;rsquo;, bj&amp;rsquo;) small&lt;/li>
&lt;/ul>
&lt;h4 id="methods">Methods&lt;/h4>
&lt;ol>
&lt;li>Random Mask&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Randomly pick labels, and set them to null.&lt;/li>
&lt;/ul>
&lt;ol start="2">
&lt;li>Dropout&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Randomly dropout 50% label.&lt;/li>
&lt;/ul>
&lt;ol start="3">
&lt;li>Complementary&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>ID, Label, Keywords, City.&lt;/li>
&lt;li>Randomly divide them into two {ID, keyword} and {Label, City}.&lt;/li>
&lt;li>{ID, default, Keyword, default} -&amp;gt; Item embedding.&lt;/li>
&lt;li>{default, Label, default, City} -&amp;gt; Item embedding.&lt;/li>
&lt;/ul>
&lt;ol start="4">
&lt;li>Mask a set of correlated features&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>U = {Male, Female, Unisex}.&lt;/li>
&lt;li>V = {Photography, Football, IT, Makeup}.&lt;/li>
&lt;li>u = female, v = Makeup, p(u, v) is high.&lt;/li>
&lt;li>u = female, v = IT, p(u, v) is low.&lt;/li>
&lt;li>$MI(U, V) = \sum_{u \in U} \sum_{v \in V} p(u, v) \cdot \log \frac{p(u, v)}{p(u) \cdot p(v)}$&lt;/li>
&lt;/ul>
&lt;p>Learning:&lt;/p>
&lt;ul>
&lt;li>Assume there are a total of \( k \) features. Calculate the MI (Mutual Information) between any two features offline, resulting in a \( k \times k \) matrix.&lt;/li>
&lt;li>Randomly select one feature as a seed and find the \( k/2 \) features most related to the seed.&lt;/li>
&lt;li>Mask the seed and its related \( k/2 \) features, retaining the remaining \( k/2 \) features.&lt;/li>
&lt;/ul>
&lt;p>Training:&lt;/p>
&lt;ul>
&lt;li>Sampling m items as a batch&lt;/li>
&lt;li>cos(bi&amp;rsquo;, bi&amp;rsquo;&amp;rsquo;) -&amp;gt; 1, other cos(bi&amp;rsquo;, bj&amp;rsquo;&amp;rsquo;) -&amp;gt; 0&lt;/li>
&lt;/ul></description></item><item><title>Recommender System Study Notes - Nomination(3/6)</title><link>https://h3sun.github.io/post/2024-09-03-rec-sys-nomination-3/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-03-rec-sys-nomination-3/</guid><description>&lt;ul>
&lt;li>
&lt;p>Two Tower Model - Architecture + Training&lt;/p>
&lt;ul>
&lt;li>Pointwise Training
&lt;ul>
&lt;li>View nomination as binary classification&lt;/li>
&lt;li>Sample: cos(a,b) -&amp;gt; +1, negative sample: cos(a, b) -&amp;gt; -1&lt;/li>
&lt;li>Positive : negative = 1:2 / 1:3&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Pairwise Training
&lt;ul>
&lt;li>Intuntion: cos(a, b+) &amp;gt; cos(a, b-)&lt;/li>
&lt;li>Triplet hinge loss = max(0, cos(a, b-) + m - cos(a, b+))&lt;/li>
&lt;li>Triplet logistic loss = log(1 + exp(σ) * cos(a, b-) - cos(a, b+))&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Listwise Training
&lt;ul>
&lt;li>CrossEntropyLoss&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Two Tower Model - Positive Samples + Negative Samples&lt;/p>
&lt;ul>
&lt;li>Positive Sample:
&lt;ul>
&lt;li>Impressed and clicked&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Negative Sample:&lt;/li>
&lt;li>Easy negative sample:
&lt;ul>
&lt;li>All items&lt;/li>
&lt;li>In-batch items&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Hard negative sample:
&lt;ul>
&lt;li>Nominated, but discarded by ranking&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Mix easy and hard for training dataset&lt;/li>
&lt;li>Wrong sampling:
&lt;ul>
&lt;li>Impressed, but not clicked (can be used for training ranking but not nomination)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="two-tower-modeldssm---architecture-and-training">Two Tower Model(DSSM) - Architecture and Training&lt;/h3>
&lt;h4 id="two-tower-model-architecture">Two Tower Model Architecture&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">Neural Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Concatenate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Embedding Layer (User ID)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ └── Embedding (Vector Representation)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Embedding Layers (User Discrete Feature)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ └── Embedding (Vector Representation)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Normalization, Binning, etc. (normalize to 1, put into buckets)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── User Continuous Features (Vector Representation)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>$\cos(a, b) = \frac{a \cdot b}{\|a\|_2 \cdot \|b\|_2}$&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> Cosine Similarity:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> a b
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Neural Network Neural Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Feature Transformation Feature Transformation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User ID, Discrete Features, Product ID, Discrete Features,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Continuous Features Continuous Features
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="two-tower-model-training">Two Tower Model Training&lt;/h4>
&lt;ul>
&lt;li>Pointwise (binary classification)&lt;/li>
&lt;li>Pairwise&lt;/li>
&lt;li>Listwise&lt;/li>
&lt;/ul>
&lt;h5 id="pointwise-training">Pointwise Training&lt;/h5>
&lt;ul>
&lt;li>Intuition: View nomination as binary classification&lt;/li>
&lt;li>positive sample: cos(a,b) -&amp;gt; +1, negative sample: cos(a, b) -&amp;gt; -1&lt;/li>
&lt;li>positive : negative = 1:2 / 1:3&lt;/li>
&lt;/ul>
&lt;h5 id="pairwise-training">Pairwise Training&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl"> cos(a, b⁺) cos(a, b⁻)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \ / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \ / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> b⁺ a b⁻
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (Positive Sample) (User) (Negative Sample)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Neural Network Neural Network Neural Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Feature Transformation Feature Transformation Feature Transformation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Positive Item Feature User Features Negative Item Feature
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>Intuntion: cos(a, b+) &amp;gt; cos(a, b-)&lt;/li>
&lt;li>triplet hinge loss = max(0, cos(a, b-) + m - cos(a, b+))&lt;/li>
&lt;li>triplet logistic loss = log(1 + exp(σ) * cos(a, b-) - cos(a, b+))&lt;/li>
&lt;/ul>
&lt;h5 id="listwise-training">Listwise Training&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">CrossEntropyLoss(y, s) = -log(s⁺)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-----------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | CrossEntropyLoss |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-----------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | Softmax Activation Function |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +-------------------------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +------------+------------+-------------+ ... +------------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | | | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> s⁺ s⁻_1 s⁻_2 ... s⁻_n
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> (Positive) (Negative) (Negative) (Negative)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> cos(a, b⁺) cos(a, b⁻_1) cos(a, b⁻_2) ... cos(a, b⁻_n)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> | | | |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(Positive) (Negative) (Negative) (Negative)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Sample Sample Sample Sample
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="two-tower-modeldssm---positive-samples--negative-samples">Two Tower Model(DSSM) - Positive Samples + Negative Samples&lt;/h3>
&lt;h4 id="positive-samples">Positive Samples&lt;/h4>
&lt;ul>
&lt;li>impressed and clicked&lt;/li>
&lt;li>problem: 20% item takes 80% click&lt;/li>
&lt;li>solution:
&lt;ul>
&lt;li>up-sampling: one sample appear multiple times&lt;/li>
&lt;li>down-sampling: discard samples&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="negative-samples">Negative Samples&lt;/h4>
&lt;h5 id="simple-negative-sampling-all-items">Simple Negative Sampling: All Items&lt;/h5>
&lt;h6 id="uniform-sampling-unfair-to-unpopular-items">Uniform Sampling: Unfair to unpopular items&lt;/h6>
&lt;ul>
&lt;li>Most positive samples are popular items.&lt;/li>
&lt;li>If uniform sampling produces negative samples, most of the negative samples are unpopular items.&lt;/li>
&lt;li>positive sample: popular items, negative sample: unpopular items, this is unfair.&lt;/li>
&lt;/ul>
&lt;h6 id="non-uniform-sampling-the-goal-is-to-suppress-popular-items">Non-uniform Sampling: The goal is to suppress popular items&lt;/h6>
&lt;ul>
&lt;li>The probability of negative sampling is positively correlated with popularity (clicks).&lt;/li>
&lt;li>&lt;strong>Sampling probability ∝ (clicks) ^ 0.75&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h5 id="simple-negative-sampling-negative-sample-within-a-batch">Simple Negative Sampling: Negative Sample within a batch&lt;/h5>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">user1 - item1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">user2 - item2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">user3 - item3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">user_n - item_n
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;p>one batch has n positive samples&lt;/p>
&lt;/li>
&lt;li>
&lt;p>one batch has n(n - 1) negative samples&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The probablity that an item appear in a batch is propotional to the number of times it clicked.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>We aim to get it propotional to clicks^0.75.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>offline training cos(a, bi) - log(pi), pi ∝ clicks&lt;/p>
&lt;/li>
&lt;li>
&lt;p>online inference cos(a, bi)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h4 id="hard-negative-sampling">Hard Negative Sampling&lt;/h4>
&lt;h5 id="hard-negative-samples">Hard negative samples:&lt;/h5>
&lt;ul>
&lt;li>Items that are ranked and close to the target (relatively hard).&lt;/li>
&lt;li>Items that are ranked far behind the target (extremely hard).&lt;/li>
&lt;/ul>
&lt;h6 id="binary-classification-for-positive-and-negative-samples">Binary classification for positive and negative samples:&lt;/h6>
&lt;ul>
&lt;li>All items (simple): High classification accuracy.&lt;/li>
&lt;li>Items that are ranked and close to the target (relatively hard): Easy to misclassify.&lt;/li>
&lt;li>Items that are ranked far behind the target (extremely hard): Even easier to misclassify.&lt;/li>
&lt;/ul>
&lt;h4 id="datasets">Datasets&lt;/h4>
&lt;ul>
&lt;li>Mix negative samples&lt;/li>
&lt;li>50% easy negative sample&lt;/li>
&lt;li>50% hard negative sample&lt;/li>
&lt;/ul></description></item><item><title>Recommender System Study Notes - Nomination(2/6)</title><link>https://h3sun.github.io/post/2024-09-03-rec-sys-nomination-2/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-03-rec-sys-nomination-2/</guid><description>&lt;ul>
&lt;li>Discrete Feature&lt;/li>
&lt;li>Matrix Completion&lt;/li>
&lt;/ul>
&lt;h3 id="discrete-feature">Discrete Feature&lt;/h3>
&lt;h4 id="example">Example&lt;/h4>
&lt;ul>
&lt;li>sex&lt;/li>
&lt;li>nationality&lt;/li>
&lt;li>english words&lt;/li>
&lt;li>item id&lt;/li>
&lt;li>user id&lt;/li>
&lt;/ul>
&lt;h4 id="how-to-encode-discrete-feature---vectorization">How to encode discrete feature -&amp;gt; vectorization&lt;/h4>
&lt;ul>
&lt;li>one-hot encoding&lt;/li>
&lt;li>embedding (*)
&lt;ul>
&lt;li>size: vector dimension * number of items&lt;/li>
&lt;li>How to implement: TensorFlow, PyTorch -&amp;gt; embedding&lt;/li>
&lt;li>embedding = Parameter matrix * one-hot encoding&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="matrix-completion">Matrix Completion&lt;/h3>
&lt;h4 id="intuition">Intuition&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">item id -&amp;gt; embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> - cos(a, b)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">item id -&amp;gt; embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="formula">Formula&lt;/h4>
&lt;ul>
&lt;li>dataset = {u, i, y}&lt;/li>
&lt;li>training, u -&amp;gt; au, i -&amp;gt; bi&lt;/li>
&lt;li>optimization: $\min_{A, B} \sum_{\substack{(u, i, y) \in \Omega}} \left( y - \langle a_u, b_i \rangle \right)^2$&lt;/li>
&lt;/ul>
&lt;h4 id="proscons">Pros/Cons&lt;/h4>
&lt;ul>
&lt;li>Cons
&lt;ul>
&lt;li>It only uses ID embedding without item, user characteristics
&lt;ul>
&lt;li>item characteristics: label, key words&lt;/li>
&lt;li>user characteristics: gender, age, geo, liked label&lt;/li>
&lt;li>Two tower Model&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Negative sample is wrong
&lt;ul>
&lt;li>Positive: User interacted, which is good&lt;/li>
&lt;li>Negative: User did not interact, which is not correct&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Training
&lt;ul>
&lt;li>dot product is worse than cosine similarity&lt;/li>
&lt;li>Loss(regression) is worse than cross entropy&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="implementation">Implementation&lt;/h4>
&lt;h5 id="offline">Offline:&lt;/h5>
&lt;ul>
&lt;li>Learning A: user&lt;/li>
&lt;li>Learning B: item&lt;/li>
&lt;li>storing A into {user id: embedding} key-value&lt;/li>
&lt;/ul>
&lt;h5 id="online">Online:&lt;/h5>
&lt;ul>
&lt;li>user Id -&amp;gt; find a&amp;rsquo;s vector&lt;/li>
&lt;li>nearest neighbour search, return the top 100 b whose &amp;lt;a, b&amp;gt; is max&lt;/li>
&lt;li>Approximate Nearest Neighbor (ANN)
&lt;ul>
&lt;li>pre process the circile into sectors&lt;/li>
&lt;li>pick a representative vector(indexing) represents the sector&lt;/li>
&lt;li>find representative vector, then find vector in that sector instead of the whole circle&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Recommender System Study Notes - Nomination(1/6)</title><link>https://h3sun.github.io/post/2024-09-02-rec-sys-nomination-1/</link><pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-02-rec-sys-nomination-1/</guid><description>&lt;ul>
&lt;li>Item CF&lt;/li>
&lt;li>Swing&lt;/li>
&lt;li>User CF&lt;/li>
&lt;/ul>
&lt;h3 id="item-cf">Item CF&lt;/h3>
&lt;h4 id="intuition">Intuition&lt;/h4>
&lt;ul>
&lt;li>If user likes i1 and i1 is similar with i2 -&amp;gt; Then user is likely to like i2&lt;/li>
&lt;/ul>
&lt;h4 id="formula">Formula&lt;/h4>
&lt;ul>
&lt;li>$score = \sum_j \text{like}(\text{user}, \text{item}\_j) \times \text{sim}(\text{item}\_j, \text{item})$, to compute Item CF score&lt;/li>
&lt;li>$\text{sim}(i_1, i_2) = \frac{|\mathbf{v}|}{\sqrt{|\mathbf{w}_1| \cdot |\mathbf{w}_2|}}$, to compute similarity, w1 as the user who likes i1, w2 as the set, v as the intersection between i1 and i2.&lt;/li>
&lt;li>$\text{sim}(i*1, i_2) = \frac{\sum*{v \in v} \text{like}(v, i*1) \cdot \text{like}(v, i_2)}{\sqrt{\sum*{u*1 \in w_1} \text{like}^2(u_1, i_1)} \cdot \sqrt{\sum*{u_2 \in w_2} \text{like}^2(u_2, i_2)}}$, to take like score into consideration).&lt;/li>
&lt;/ul>
&lt;h4 id="implementation">Implementation&lt;/h4>
&lt;h5 id="offline">Offline:&lt;/h5>
&lt;ul>
&lt;li>User -&amp;gt; Item Indexing
&lt;ul>
&lt;li>return the last-n items with interaction that this user interacts with.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Item -&amp;gt; Item Indexing
&lt;ul>
&lt;li>compute sim (i, j) maybe maintaining User-&amp;gt;Item&lt;/li>
&lt;li>for each item, find the cloest k items&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h5 id="online-inference-user-id---100-items">Online Inference: (user id -&amp;gt; 100 items)&lt;/h5>
&lt;ul>
&lt;li>user id -&amp;gt; last-n items&lt;/li>
&lt;li>for each item in last-n, use item-item to find k items&lt;/li>
&lt;li>Use score formula to compute n * k items&amp;rsquo; score&lt;/li>
&lt;li>pick top 100, and output top 100 items as the nomination result in this Item CF Channel&lt;/li>
&lt;/ul>
&lt;h3 id="swing">Swing&lt;/h3>
&lt;h4 id="intuition-1">Intuition&lt;/h4>
&lt;ul>
&lt;li>If two items are not that relavant, but it got forwarded into a same small group, we want to lower the similarity score.&lt;/li>
&lt;/ul>
&lt;h4 id="formula-1">Formula&lt;/h4>
&lt;ul>
&lt;li>u1 -&amp;gt; j1, u2 -&amp;gt; j2
&lt;ul>
&lt;li>$\text{overlap}(u_1, u_2) = |\mathcal{J}_1 \cap \mathcal{J}_2|$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>i1 -&amp;gt; w1, i2 -&amp;gt; w2, v = w1 ∩ w2
&lt;ul>
&lt;li>$\text{sim}(i_1, i_2) = \sum_{u_1 \in V} \sum_{u_2 \in V} \frac{1}{\alpha + \text{overlap}(u_1, u_2)}$, to compute similarity, a is a hyper-parameter&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>if overlap is big, then the contribution to similarity becomes low&lt;/li>
&lt;/ul>
&lt;h3 id="user-cf">User CF&lt;/h3>
&lt;h4 id="intuition-2">Intuition&lt;/h4>
&lt;ul>
&lt;li>I will like the notes which liked by someone who is similar to me.&lt;/li>
&lt;/ul>
&lt;h4 id="formula-2">Formula&lt;/h4>
&lt;ul>
&lt;li>Method1: like, collect, click notes are similar&lt;/li>
&lt;li>Method2: Subscribed authors are similar&lt;/li>
&lt;li>u1 -&amp;gt; j1, u2 -&amp;gt; j2, I = j1 ∩ j2, nl: the number of users who likes l
&lt;ul>
&lt;li>$sim = \text{sim}(u_1, u_2) = \frac{|I|}{\sqrt{|\mathcal{J}_1| \cdot |\mathcal{J}_2|}}$&lt;/li>
&lt;li>$sim = \text{sim}(u_1, u_2) = \frac{\sum_{I \in I} \frac{1}{\log(1 + n_I)}}{\sqrt{|\mathcal{J}_1| \cdot |\mathcal{J}_2|}}$&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>$score = \sum_j \text{sim(user, user}_j\text{)} \times \text{like(user}_j, \text{item)}$&lt;/li>
&lt;/ul>
&lt;h4 id="implementation-1">Implementation&lt;/h4>
&lt;h5 id="offline-1">Offline:&lt;/h5>
&lt;ul>
&lt;li>User -&amp;gt; Item Indexing
&lt;ul>
&lt;li>return the last-n items with interaction that this user interacts with.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>User -&amp;gt; User Indexing
&lt;ul>
&lt;li>compute sim (i, j)&lt;/li>
&lt;li>for each user, find the cloest k users&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h5 id="online">Online:&lt;/h5>
&lt;ul>
&lt;li>user-user indexing: id -&amp;gt; k cloest users&lt;/li>
&lt;li>user-item indexing: for each user, find his/her last-n, use user-item to find n items&lt;/li>
&lt;li>compute score: Use the formula to compute n * k items&amp;rsquo; score&lt;/li>
&lt;li>rank: pick top 100, and output top 100 items as the nomination result in this User CF Channel&lt;/li>
&lt;/ul></description></item><item><title>Recommender System Study Notes Basics (1/1)</title><link>https://h3sun.github.io/post/2024-09-01-rec-sys-basics-1/</link><pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate><guid>https://h3sun.github.io/post/2024-09-01-rec-sys-basics-1/</guid><description>&lt;h2 id="basics">Basics&lt;/h2>
&lt;div class="markmap" style="height: 200px;">
&lt;pre>- Impression
- Click
- ScrollToEnd
- Comment
- Like
- Collect
- Share&lt;/pre>
&lt;/div>
&lt;h4 id="基础指标">基础指标&lt;/h4>
&lt;ul>
&lt;li>Click-through rate = Number of clicks / Number of impressions&lt;/li>
&lt;li>Like rate = Number of likes / Number of impressions&lt;/li>
&lt;li>Collection rate = Number of collections / Number of clicks&lt;/li>
&lt;li>Forwarding rate = Number of forwards / Number of clicks&lt;/li>
&lt;li>Completion rate = Number of times scrolled to the end / Number of clicks * f(Note length)&lt;/li>
&lt;/ul>
&lt;h4 id="北极星指标">北极星指标&lt;/h4>
&lt;ul>
&lt;li>用户规模
DAU daily active user
MAU monthly active user&lt;/li>
&lt;li>消费
人均使用时长，人均阅读笔记数量&lt;/li>
&lt;li>发布
发布渗透率，人均发布量&lt;/li>
&lt;/ul>
&lt;h4 id="实验流程">实验流程&lt;/h4>
&lt;div class="markmap" style="height: 200px;">
&lt;pre>- Offline Test
- A/B Test
- experiment rollout&lt;/pre>
&lt;/div>
&lt;h4 id="chain-of-recommender-system">Chain of Recommender System&lt;/h4>
&lt;div class="markmap" style="height: 200px;">
&lt;pre>- Nomination
- Pre-Ranking
- Ranking
- Re-Ranking&lt;/pre>
&lt;/div>
&lt;ul>
&lt;li>
&lt;p>Nomination O(billion) -&amp;gt; O(k)&lt;/p>
&lt;ul>
&lt;li>CF&lt;/li>
&lt;li>Two Tower&lt;/li>
&lt;li>Subscribed Content Creator&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Pre-Ranking + Ranking O(k) -&amp;gt; O(100)&lt;/p>
&lt;ul>
&lt;li>Use a neural network as follow:&lt;/li>
&lt;li>Input:
&lt;ul>
&lt;li>User Feature Embedding&lt;/li>
&lt;li>Item Feature Embedding&lt;/li>
&lt;li>Stats Embedding&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Output:
&lt;ul>
&lt;li>Click-through rate&lt;/li>
&lt;li>Like Rate&lt;/li>
&lt;li>Collection Rate&lt;/li>
&lt;li>Forwarding Rate&lt;/li>
&lt;li>Completion Rate&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Combine them and output a score&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Re-Ranking O(100) -&amp;gt; O(80?) | for diversity&lt;/p>
&lt;ul>
&lt;li>Common methods:&lt;/li>
&lt;li>MMR&lt;/li>
&lt;li>DPP&lt;/li>
&lt;li>use pre-set rules to diversify notes&lt;/li>
&lt;li>insert ads, change sequence based on rules&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="ab-test">A/B Test&lt;/h4>
&lt;ul>
&lt;li>Basic flow:
&lt;ul>
&lt;li>new GNN, Offline testing gives promising results&lt;/li>
&lt;li>online A/B test, vaildate&lt;/li>
&lt;li>tune hyper parameters&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>how to put user into buckets randomly
&lt;ul>
&lt;li>hash user id&lt;/li>
&lt;li>compute metrics for each bucket, DAU, etc&lt;/li>
&lt;li>experiment rollout&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Overlapping experiment
&lt;ul>
&lt;li>overlapping: nomination, pre-ranking, ranking, re-ranking, user interface, ads&lt;/li>
&lt;li>each layer: mutually exclusive&lt;/li>
&lt;li>between layers: orthogonality&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Holdout mechanism
&lt;ul>
&lt;li>10% as holdout bucket + 90% as overlapping experiment&lt;/li>
&lt;li>clean holdout and rollout experiment&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Experiment Rollout&lt;/li>
&lt;li>Experiment Reverse&lt;/li>
&lt;/ul>
&lt;h3 id="pre-ranking-rankingscoring">Pre-Ranking, Ranking(scoring)&lt;/h3>
&lt;h3 id="re-ranking">Re-Ranking&lt;/h3></description></item></channel></rss>