<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="bthndmn12.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="bthndmn12.github.io/" rel="alternate" type="text/html" /><updated>2024-12-15T12:30:34+00:00</updated><id>bthndmn12.github.io/feed.xml</id><title type="html">batuhanduman_i</title><subtitle></subtitle><entry><title type="html">Landau Network: The Travelling Wave and Results</title><link href="bthndmn12.github.io/landaunet/" rel="alternate" type="text/html" title="Landau Network: The Travelling Wave and Results" /><published>2024-06-30T02:14:15+00:00</published><updated>2024-06-30T02:14:15+00:00</updated><id>bthndmn12.github.io/landau-net</id><content type="html" xml:base="bthndmn12.github.io/landaunet/"><![CDATA[<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>

<p>Podcast(Generated by NotebookLM)</p>
<audio controls="">
  <source src="/assets/audio/landaunet.wav" type="audio/wav" />
</audio>

<p>My research journey began with an exploration of Partial Differential Equations (PDEs), specifically focusing on traveling wave solutions. Intrigued by the application of the Klein-Gordon equation with hyperbolic functions, I questioned the conventional use of a static beta parameter within these functions. This led me to hypothesize that a dynamically updated beta parameter, mirroring the time-dependent nature of the weight and loss function, could potentially enhance model performance.</p>

<p>To achieve this dynamic update, I sought a suitable function and discovered the Allen-Cahn equation through the Gemini Model. This equation, closely resembling those utilized in reaction-diffusion systems and phase-field models, offered a promising mechanism. Its ability to facilitate the propagation of “phase boundaries” through parameter space suggested potential for inducing sharp transitions within network behavior, an area requiring further investigation. Further exploration of PDE solutions for traveling waves led me to Ginzburg-Landau theory. Recognizing the potential of its free energy calculation as a component within the loss function, I pursued a simplified implementation. This resulted in a novel loss calculation framework directly inspired by a simplified Ginzburg-Landau equation.</p>

<p>Given the physics-based foundation of the neural network components explored thus far, I investigated the feasibility of employing a similarly grounded optimization approach. This led to the identification of Stochastic Gradient Langevin Dynamics (SGLD) as a suitable candidate. The implementation of SGLD, aided by the Claude language model, provided valuable insights into its application and divergences from traditional optimization techniques.</p>

<p>Preliminary results indicate comparable performance to a standard fully connected network. Although the proposed model did not consistently outperform a modified, fully connected network, this work, developed as an exploratory weekend project, provides a foundation for future research into physics-inspired neural network architectures and optimization algorithms.</p>

<h2 id="introduction-the-intersection-of-physics-and-machine-learning">Introduction: The Intersection of Physics and Machine Learning</h2>

<p>Machine learning and physics might seem like two distinct fields, but they share a common goal: understanding and modeling complex systems. In machine learning, we build models to learn from data and make predictions. In physics, we develop theories to explain natural phenomena. By bringing these disciplines together, we can create more powerful and flexible neural networks.</p>

<h2 id="the-inspiration-ginzburg-landau-theory">The Inspiration: Ginzburg-Landau Theory</h2>

<p>At the heart of experimental neural network lies the Ginzburg-Landau theory, a powerful framework originally developed to describe superconductivity and other phase transitions in physical systems. But what does superconductivity have to do with neural networks, you might ask?</p>

<p>The key insight is this: both superconducting systems and neural networks can be thought of as complex systems trying to find optimal configurations. In superconductors, it’s about finding the state of lowest energy. In neural networks, it’s about finding the configuration that best fits the data.</p>

<h2 id="the-custom-loss-function-a-physics-inspired-approach">The Custom Loss Function: A Physics-Inspired Approach</h2>

<p>Inspired by the Ginzburg-Landau free energy functional, we’ve designed a custom loss function for this network:</p>

\[\mathcal{L}( \phi, \text{target} ) = \left| \text{mean} \left( \alpha (\phi_{\text{norm}} - \text{target}_{\text{norm}})^2 - \gamma (\phi_{\text{norm}} - \text{target}_{\text{norm}})^4 + 0.5 \left( \frac{\partial \phi_{\text{norm}}}{\partial x} \right)^2 \right) \right|\]

<p>Where:</p>
<ul>
  <li>
\[\phi_{\text{norm}} = \frac{\phi}{\max(|\phi|)}\]
  </li>
  <li>
\[\text{target}_{\text{norm}} = \frac{\text{target\_one\_hot}}{\max(|\text{target\_one\_hot}|)}\]
  </li>
  <li>
\[\frac{\partial \phi_{\text{norm}}}{\partial x} \approx \frac{\phi_{\text{norm}}(i+1) - \phi_{\text{norm}}(i-1)}{2}\]
  </li>
  <li>\(\alpha\) is the coefficient for the quadratic term that encourages the network’s output to match the target values.</li>
  <li>\(\gamma\) is the coefficient for the quartic term that allows for multiple stable states.</li>
  <li>The spatial term promotes coherence in the network’s outputs across spatial dimensions.</li>
</ul>

<h3 id="breakdown-of-the-loss-function">Breakdown of the Loss Function</h3>

<ul>
  <li><strong>Quadratic Term:</strong> Encourages the network’s output to match the target values. This is similar to the traditional mean squared error used in many neural networks.</li>
  <li><strong>Quartic Term:</strong> Allows for multiple stable states, potentially enabling the network to capture more complex patterns. This term, with a negative sign, adds richness to the energy landscape, facilitating better exploration during training.</li>
  <li><strong>Spatial Term:</strong> Promotes coherence in the network’s outputs across spatial dimensions. This is particularly useful for tasks involving spatial data, such as image processing.</li>
</ul>

<h2 id="dynamic-weight-modification-adapting-to-input">Dynamic Weight Modification: Adapting to Input</h2>

<p>Another unique feature of this network is its dynamic weight modification scheme:</p>

\[\mathbf{W} = \mathbf{W}_0 \cdot \left( \cosh(5\beta) \cdot \mathbf{a} + t_{\text{dynamic}} \cdot \sinh(5\beta) \right)\]

<p>where:</p>
<ul>
  <li>\(\mathbf{W}_0\) is the initial weight matrix.</li>
  <li>\(\beta\) is a learned parameter.</li>
  <li>\(t_{\text{dynamic}}\) is a dynamic term that adapts based on the input.</li>
</ul>

<h3 id="explanation">Explanation</h3>

<p>This might look complex, but the idea is simple yet powerful: the network adapts its weights based on the input it receives. The use of hyperbolic functions (cosh and sinh) introduces a form of non-Euclidean geometry, potentially allowing the network to better capture hierarchical structures in the data.</p>

<h2 id="physics-inspired-optimization-langevin-dynamics">Physics-Inspired Optimization: Langevin Dynamics</h2>

<p>To train this network, I’ve developed a custom optimizer inspired by Langevin dynamics, a concept from statistical physics used to describe the motion of particles in a fluid:</p>

<h3 id="step-method-equation">Step Method Equation</h3>

<p>For each parameter \(\theta_i\):</p>

<ol>
  <li>
    <p><strong>Compute the loss gradient with respect to each parameter:</strong>
\(F_i = -\frac{\partial \mathcal{L}}{\partial \theta_i}\)
where \(\mathcal{L}\) is the loss function, and \(F_i\) is the force (negative gradient) applied to \(\theta_i\).</p>
  </li>
  <li>
    <p><strong>Update the velocity:</strong>
\(v_i \leftarrow (1 - \gamma) v_i + \alpha F_i + \sqrt{2 \gamma \alpha T} \cdot \eta_i\)
where \(\eta_i\) is a noise term sampled from a standard normal distribution \(\mathcal{N}(0, 1)\).</p>
  </li>
  <li>
    <p><strong>Update the parameter:</strong>
\(\theta_i \leftarrow \theta_i + v_i\)</p>
  </li>
</ol>

<h3 id="full-update-equation">Full Update Equation</h3>

<p>For each parameter \(\theta_i\) :</p>

\[v_i \leftarrow (1 - \gamma) v_i - \alpha \frac{\partial \mathcal{L}}{\partial \theta_i} + \sqrt{2 \gamma \alpha T} \cdot \eta_i\]

\[\theta_i \leftarrow \theta_i + v_i\]

<p>Where:</p>
<ul>
  <li>\(\alpha\) is the learning rate.</li>
  <li>\(\gamma\) is the damping coefficient.</li>
  <li>\(T\) is the temperature.</li>
  <li>\(\eta_i \sim \mathcal{N}(0, 1)\) is the noise term.</li>
</ul>

<h3 id="combined-in-a-single-expression">Combined in a Single Expression</h3>

<p>Combining both steps, we get the following update rules for each parameter \(\theta_i\):</p>

\[v_i \leftarrow (1 - \gamma) v_i - \alpha \frac{\partial \mathcal{L}}{\partial \theta_i} + \sqrt{2 \gamma \alpha T} \cdot \eta_i\]

\[\theta_i \leftarrow \theta_i + v_i\]

<p>This optimizer introduces concepts of velocity, damping, and temperature into the learning process. The idea is to allow the network to explore the loss landscape more thoroughly, potentially escaping local minima and finding better global solutions.</p>

<h2 id="beta-update-equations">Beta Update Equations</h2>

<p>Given:</p>
<ul>
  <li>\(\beta\) is the learnable parameter.</li>
  <li>\(\phi\) is the model output.</li>
  <li>\(\text{target}\) is the ground truth.</li>
  <li>\(dt\) is the time step.</li>
  <li>\(\kappa\) is a constant.</li>
</ul>

<p>The steps involved in updating \(\beta\) are as follows:</p>

<ol>
  <li>
    <p><strong>Compute the loss derivative with respect to the input:</strong>
\(\text{d\_loss} = \mathcal{L}(\phi, \text{target})\)
where \(\mathcal{L}\) is the loss function.</p>
  </li>
  <li>
    <p><strong>Compute the spatial derivative of the loss:</strong>
\(\text{d\_loss}_x = \frac{\text{d\_loss}_{i+1} - \text{d\_loss}_{i-1}}{2}\)</p>
  </li>
  <li>
    <p><strong>Compute the force term:</strong>
\(\text{force} = -\kappa \cdot \text{d\_loss}_x\)</p>
  </li>
  <li>
    <p><strong>Compute the second spatial derivative of \(\beta\):</strong>
\(\beta_{xx} = \beta_{i+1} - 2\beta_i + \beta_{i-1}\)</p>
  </li>
  <li>
    <p><strong>Compute the time derivative of \(\beta\):</strong>
 \(\beta_t = \frac{\beta - \beta_{\text{previous}}}{dt}\)</p>
  </li>
  <li>
    <p><strong>Update \(\beta\) using the combined terms:</strong>
\(\beta \leftarrow \beta + dt \left( \beta_t - \beta_{xx} + \beta - \beta^3 + \text{force} \right)\)</p>
  </li>
</ol>

<p>Putting these steps together, the beta update rule can be written as:</p>

\[\beta_{t+1} \leftarrow \beta_t + dt \left( \frac{\beta_t - \beta_{t-1}}{dt} - (\beta_{i+1} - 2\beta_i + \beta_{i-1}) + \beta - \beta^3 - \kappa \cdot \frac{\text{d\_loss}_{i+1} - \text{d\_loss}_{i-1}}{2} \right)\]

<h2 id="putting-it-all-together-a-new-paradigm-for-neural-networks">Putting It All Together: A New Paradigm for Neural Networks</h2>

<p>By combining these physics-inspired components - the Ginzburg-Landau-based loss function, dynamic weight modification, and Langevin dynamics-inspired optimization - i’ve created a neural network that operates on principles quite different from traditional architectures.</p>

<h3 id="potential-benefits">Potential Benefits</h3>

<ol>
  <li><strong>Better Handling of Complex, Hierarchical Data Structures:</strong> The dynamic weight modification and rich energy landscape help capture intricate patterns in the data.</li>
  <li><strong>Improved Exploration of the Solution Space:</strong> The Langevin dynamics-inspired optimizer enhances the network’s ability to find global optima.</li>
  <li><strong>Multiple Stable States:</strong> The quartic term allows for capturing diverse data patterns.</li>
  <li><strong>Enhanced Spatial Coherence:</strong> Useful for tasks involving spatial data, ensuring smooth transitions in the output.</li>
</ol>

<h3 id="challenges">Challenges</h3>

<ol>
  <li><strong>Increased Complexity in Training:</strong> More parameters and terms to tune can complicate the training process.</li>
  <li><strong>Need for Careful Interpretation:</strong> Understanding the network’s behavior requires a deeper theoretical insight.</li>
  <li><strong>Potential Instabilities:</strong> Non-standard loss functions and optimization processes might introduce new challenges.</li>
</ol>

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

<h4 id="example-outputs-from-1-layer-experimental-nn">Example Outputs from 1 Layer Experimental NN</h4>

<p><img src="/assets/images/1LayerMNIST.png" alt="" /></p>
<h5 id="1-layer-experimental-net-example-test-set-output">1 Layer Experimental Net Example Test Set Output</h5>

<p>To provide a clear comparison, here’s how this experimental neural network performs on MNIST dataset across various metrics:</p>

<p><img src="/assets/images/loss_1layer_mish.png" alt="Description" /></p>
<h5 id="1-layer-experimental-nn-with-mish-activation-and-batch-norm">1 Layer Experimental NN with Mish activation and batch norm</h5>

<p><img src="/assets/images/loss_2layer_mish.png" alt="" /></p>
<h5 id="2-layer-experimental-nn-with-mish-activation-and-batch-norm">2 Layer Experimental NN with Mish activation and batch norm</h5>

<table>
  <thead>
    <tr>
      <th>Metric</th>
      <th>1 Layer</th>
      <th>2 Layer</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Accuracy on MNIST</td>
      <td>92%</td>
      <td>96%</td>
    </tr>
    <tr>
      <td>Epoch</td>
      <td>100 epochs</td>
      <td>100 epochs</td>
    </tr>
    <tr>
      <td>alpha</td>
      <td>0.0095</td>
      <td>0.0095</td>
    </tr>
    <tr>
      <td>gamma</td>
      <td>6.5</td>
      <td>6.5</td>
    </tr>
    <tr>
      <td>beta init</td>
      <td>1e-3</td>
      <td>1e-3</td>
    </tr>
    <tr>
      <td>learning rate</td>
      <td>1e-2</td>
      <td>1e-2</td>
    </tr>
    <tr>
      <td>kappa</td>
      <td>1e-2</td>
      <td>1e-2</td>
    </tr>
    <tr>
      <td>hidden layer</td>
      <td>-</td>
      <td>156</td>
    </tr>
    <tr>
      <td>damping</td>
      <td>0.001</td>
      <td>0.001</td>
    </tr>
    <tr>
      <td>temperature</td>
      <td>0.008</td>
      <td>0.008</td>
    </tr>
    <tr>
      <td>dt</td>
      <td>0.001</td>
      <td>0.001</td>
    </tr>
  </tbody>
</table>

<h3 id="visualization-with-some-datasets">Visualization with Some Datasets</h3>
<!-- ![First Dataset](/docs/1.2 20240201174519.png) -->
<h5 id="1-layer-example-on-circle-dataset">1 Layer Example on Circle dataset</h5>
<p><img src="/assets/images/circles_boundary.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="2-layer-example-on-circle-dataset">2 Layer Example on Circle dataset</h5>
<p><img src="/assets/images/circles_boundary_2layer.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="2-layer-example-on-circle-dataset-1">2 Layer Example on Circle dataset</h5>
<p><img src="/assets/images/circles_boundary_2layer_2.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="1-layer-example-on-classification-dataset">1 Layer Example on Classification dataset</h5>
<p><img src="/assets/images/classification_boundary.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="1-layer-example-on-classification-dataset-1">1 Layer Example on Classification dataset</h5>
<p><img src="/assets/images/classification_boundary_2layer_1.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="1-layer-example-on-moons-dataset">1 Layer Example on Moons dataset</h5>
<p><img src="/assets/images/moons_boundary.gif" alt="1 Layer Example on Circle dataset" /></p>

<h5 id="2-layer-example-on-moons-dataset">2 Layer Example on Moons dataset</h5>
<p><img src="/assets/images/moons_boundary_2layer_1.gif" alt="1 Layer Example on Circle dataset" /></p>

<h3 id="code-snippet-for-the-experimentallayer">Code Snippet for the ExperimentalLayer</h3>

<p>Here’s a more detailed code snippet of the ExperimentalLayer to give readers a clearer picture of its implementation:</p>

<h3 id="landau-layer-with-traveling-wave-approach">Landau Layer with Traveling Wave Approach</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">LandauLayer</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_size</span><span class="p">,</span> <span class="n">output_size</span><span class="p">,</span> <span class="n">beta_init</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.0035</span><span class="p">,</span> <span class="n">gamma</span><span class="o">=</span><span class="mf">5.0</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">LandauLayer</span><span class="p">,</span> <span class="bp">self</span><span class="p">).</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">w</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">Parameter</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">randn</span><span class="p">(</span><span class="n">output_size</span><span class="p">,</span> <span class="n">input_size</span><span class="p">))</span>
        <span class="n">nn</span><span class="p">.</span><span class="n">init</span><span class="p">.</span><span class="n">xavier_normal_</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">w</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">beta</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">Parameter</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">(</span><span class="n">beta_init</span><span class="p">).</span><span class="nb">float</span><span class="p">())</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">alpha</span> <span class="o">=</span> <span class="n">alpha</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">gamma</span> <span class="o">=</span> <span class="n">gamma</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">t</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">Parameter</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">([</span><span class="mf">1.0</span><span class="p">]))</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="n">t_dynamic</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">t</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="n">sigmoid</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">mean</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">dim</span><span class="o">=-</span><span class="mi">1</span><span class="p">)).</span><span class="n">unsqueeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">w2</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">w</span> <span class="o">*</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">arange</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">size</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="nb">float</span><span class="p">,</span> <span class="n">device</span><span class="o">=</span><span class="n">x</span><span class="p">.</span><span class="n">device</span><span class="p">)</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="n">cosh</span><span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">)</span> <span class="o">+</span> <span class="n">t_dynamic</span> <span class="o">*</span> <span class="n">torch</span><span class="p">.</span><span class="n">sinh</span><span class="p">(</span><span class="mi">5</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">)).</span><span class="n">unsqueeze</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
        <span class="n">phi</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">matmul</span><span class="p">(</span><span class="n">w2</span><span class="p">,</span> <span class="n">x</span><span class="p">.</span><span class="n">unsqueeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)).</span><span class="n">squeeze</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">phi</span>
        
    <span class="k">def</span> <span class="nf">update_beta</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">phi</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="n">kappa</span><span class="o">=</span><span class="mf">0.01</span><span class="p">):</span>
        <span class="n">d_loss</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">d_loss</span><span class="p">(</span><span class="n">phi</span><span class="p">,</span> <span class="n">target</span><span class="p">).</span><span class="n">detach</span><span class="p">()</span>
        <span class="n">d_loss_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="n">d_loss</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="n">d_loss</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="o">/</span> <span class="mf">2.0</span>
        <span class="n">force</span> <span class="o">=</span> <span class="o">-</span><span class="n">kappa</span> <span class="o">*</span> <span class="n">d_loss_x</span>
        
        <span class="k">with</span> <span class="n">torch</span><span class="p">.</span><span class="n">no_grad</span><span class="p">():</span>
            <span class="n">beta_xx</span> <span class="o">=</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span> <span class="o">+</span> <span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span>
            <span class="n">beta_t</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">beta</span> <span class="o">-</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">.</span><span class="n">clone</span><span class="p">().</span><span class="n">detach</span><span class="p">())</span> <span class="o">/</span> <span class="n">dt</span>
            <span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="p">.</span><span class="n">data</span> <span class="o">+=</span> <span class="n">dt</span> <span class="o">*</span> <span class="p">(</span><span class="n">beta_t</span> <span class="o">-</span> <span class="n">beta_xx</span> <span class="o">+</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span> <span class="o">-</span> <span class="bp">self</span><span class="p">.</span><span class="n">beta</span><span class="o">**</span><span class="mi">3</span> <span class="o">+</span> <span class="n">force</span><span class="p">)</span>
            
    <span class="k">def</span> <span class="nf">d_loss</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">phi</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
        <span class="n">max_abs_phi</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nb">max</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">phi</span><span class="p">),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">keepdim</span><span class="o">=</span><span class="bp">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">phi_norm</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">/</span> <span class="p">(</span><span class="n">max_abs_phi</span><span class="p">)</span>  
        
        <span class="n">phi_x</span> <span class="o">=</span> <span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="n">phi_norm</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">dims</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span> <span class="o">-</span> <span class="n">torch</span><span class="p">.</span><span class="n">roll</span><span class="p">(</span><span class="n">phi_norm</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dims</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span> <span class="o">/</span> <span class="mf">2.0</span>
        <span class="n">target_one_hot</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="n">one_hot</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">num_classes</span><span class="o">=</span><span class="n">phi</span><span class="p">.</span><span class="n">size</span><span class="p">(</span><span class="mi">1</span><span class="p">)).</span><span class="nb">float</span><span class="p">()</span>
        
        <span class="n">max_abs_target</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nb">max</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">target_one_hot</span><span class="p">),</span> <span class="n">dim</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">keepdim</span><span class="o">=</span><span class="bp">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
        <span class="n">target_norm</span> <span class="o">=</span> <span class="n">target_one_hot</span> <span class="o">/</span> <span class="p">(</span><span class="n">max_abs_target</span> <span class="p">)</span>  
        
        <span class="n">diff</span> <span class="o">=</span> <span class="n">phi_norm</span> <span class="o">-</span> <span class="n">target_norm</span>
        
        <span class="n">quadratic_term</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">alpha</span> <span class="o">*</span> <span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
        <span class="n">quartic_term</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">gamma</span> <span class="o">*</span> <span class="p">(</span><span class="n">diff</span><span class="p">)</span><span class="o">**</span><span class="mi">4</span>
        <span class="n">spatial_term</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="n">phi_x</span><span class="o">**</span><span class="mi">2</span>
        
        <span class="n">d_loss</span> <span class="o">=</span> <span class="n">quadratic_term</span> <span class="o">-</span> <span class="n">quartic_term</span> <span class="o">+</span> <span class="n">spatial_term</span>
        
        <span class="n">mean_d_loss</span> <span class="o">=</span> <span class="n">d_loss</span><span class="p">.</span><span class="n">mean</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">torch</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">mean_d_loss</span><span class="p">)</span>
</code></pre></div></div>
<hr />

<h3 id="modified-langevin-optimizer">Modified Langevin Optimizer</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">LangevinLandauOptimizer</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">learning_rate</span><span class="o">=</span><span class="mf">0.001</span><span class="p">,</span> <span class="n">damping</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">temperature</span><span class="o">=</span><span class="mf">0.8</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">lr</span> <span class="o">=</span> <span class="n">learning_rate</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">damping</span> <span class="o">=</span> <span class="n">damping</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">temperature</span> <span class="o">=</span> <span class="n">temperature</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">velocities</span> <span class="o">=</span> <span class="p">[</span><span class="n">torch</span><span class="p">.</span><span class="n">zeros_like</span><span class="p">(</span><span class="n">p</span><span class="p">.</span><span class="n">data</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">model</span><span class="p">.</span><span class="n">parameters</span><span class="p">()]</span>

    <span class="k">def</span> <span class="nf">step</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">phi</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
        <span class="n">d_loss</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">model</span><span class="p">.</span><span class="n">llayer2</span><span class="p">.</span><span class="n">d_loss</span><span class="p">(</span><span class="n">phi</span><span class="p">,</span> <span class="n">target</span><span class="p">)</span>
        
        <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="n">velocity</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">model</span><span class="p">.</span><span class="n">parameters</span><span class="p">(),</span> <span class="bp">self</span><span class="p">.</span><span class="n">velocities</span><span class="p">)):</span>
            <span class="n">force</span> <span class="o">=</span> <span class="o">-</span><span class="n">torch</span><span class="p">.</span><span class="n">autograd</span><span class="p">.</span><span class="n">grad</span><span class="p">(</span><span class="n">d_loss</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">create_graph</span><span class="o">=</span><span class="bp">True</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
            
            <span class="c1"># Langevin dynamics directly application without modify
</span>            <span class="n">velocity</span><span class="p">.</span><span class="n">mul_</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="bp">self</span><span class="p">.</span><span class="n">damping</span><span class="p">).</span><span class="n">add_</span><span class="p">(</span><span class="n">force</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">lr</span><span class="p">)</span>
            <span class="n">noise_scale</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">tensor</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">damping</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">temperature</span> <span class="o">*</span> <span class="bp">self</span><span class="p">.</span><span class="n">lr</span><span class="p">))</span>
            <span class="n">velocity</span><span class="p">.</span><span class="n">add_</span><span class="p">(</span><span class="n">torch</span><span class="p">.</span><span class="n">randn_like</span><span class="p">(</span><span class="n">velocity</span><span class="p">)</span> <span class="o">*</span> <span class="n">noise_scale</span><span class="p">)</span>
            
            <span class="n">param</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="n">add_</span><span class="p">(</span><span class="n">velocity</span><span class="p">)</span>

        <span class="k">return</span> <span class="n">d_loss</span><span class="p">.</span><span class="n">item</span><span class="p">()</span>
</code></pre></div></div>
<hr />
<h3 id="simple-network">Simple Network</h3>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ExperimentalNet</span><span class="p">(</span><span class="n">nn</span><span class="p">.</span><span class="n">Module</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_size</span><span class="p">,</span> <span class="n">hidden_size</span><span class="p">,</span> <span class="n">output_size</span><span class="p">,</span> <span class="n">beta_init</span><span class="p">):</span>
        <span class="nb">super</span><span class="p">(</span><span class="n">ExperimentalNet</span><span class="p">,</span> <span class="bp">self</span><span class="p">).</span><span class="n">__init__</span><span class="p">()</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">llayer1</span> <span class="o">=</span> <span class="n">LandauLayer</span><span class="p">(</span><span class="n">input_size</span><span class="p">,</span> <span class="n">hidden_size</span><span class="p">,</span> <span class="n">beta_init</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">llayer2</span> <span class="o">=</span> <span class="n">LandauLayer</span><span class="p">(</span><span class="n">hidden_size</span><span class="p">,</span> <span class="n">output_size</span><span class="p">,</span> <span class="n">beta_init</span><span class="p">)</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">bn1</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="n">BatchNorm1d</span><span class="p">(</span><span class="n">hidden_size</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
        <span class="c1"># x = F.rrelu(self.bn1(self.layer1(x)))
</span>        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="n">rrelu</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">bn1</span> <span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">llayer1</span><span class="p">(</span><span class="n">x</span><span class="p">)))</span>
        <span class="n">x</span> <span class="o">=</span> <span class="n">F</span><span class="p">.</span><span class="n">rrelu</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">llayer2</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
        <span class="k">return</span> <span class="n">x</span>
</code></pre></div></div>]]></content><author><name>Mehmet Batuhan Duman</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Applying Lossless Compression and k-Nearest Neighbors for Text Classification</title><link href="bthndmn12.github.io/jekyll/update/2023/07/26/applying-lossless-compression-and-k-nearest-neighbors-for-text-classification.html" rel="alternate" type="text/html" title="Applying Lossless Compression and k-Nearest Neighbors for Text Classification" /><published>2023-07-26T11:45:00+00:00</published><updated>2023-07-26T11:45:00+00:00</updated><id>bthndmn12.github.io/jekyll/update/2023/07/26/applying-lossless-compression-and-k-nearest-neighbors-for-text-classification</id><content type="html" xml:base="bthndmn12.github.io/jekyll/update/2023/07/26/applying-lossless-compression-and-k-nearest-neighbors-for-text-classification.html"><![CDATA[<blockquote>
  <p>In the past weeks, an intriguing article was published on text classification. This article aims to provide simple but effective text classification using k-nearest-neighbors (kNN) and gzip, in contrast to Deep Neural Networks (DNNs). Although DNNs yield high results in text classification, they require extensive processing, millions of parameters, and a large number of labeled data. However, this article suggests a lightweight method that delivers good results without requiring any parameters or training. In this post, we will test this application using a dataset consisting of approximately 300 Turkish questions and answers related to law.</p>
</blockquote>

<h4 id="related-studies-andapproach">Related Studies and Approach</h4>

<p>The article also mentions previous studies in this field, which were conducted using minimum cross entropy but did not produce efficient results. The explanations, formulas, and diagrams in this section are taken directly from the article.</p>

<p>Text classification with compressors can be divided into two main approaches:</p>

<p>Using Shannon Information Theory for entropy estimation and approximating Kolmogorov complexity and using information distance. The approach primarily uses a text compression technique called Prediction by Partial Matching (PPM) and applies it for topic classification. This approach estimates the cross-entropy between the probability distribution created with a given document d for a specific class c: Hc(d).</p>

<p>The article’s approach to this topic consists of a lossless compressor, a compressor-based distance metric, and a k-nearest neighbor classifier. Lossless compressors try to represent information using fewer bits, assigning shorter codes to symbols with higher probability.</p>

<p>For example, x1 belongs to the same category as x2, but belongs to a different category than x3. Assuming C(·) represents the compressed length, we will find C(x1x2) — C(x1) &lt; C(x1x3) — C(x1); here, C(x1x2) denotes the compressed length of the combination of x1 and x2.</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*ehBJUd88QghLldU2wjAswQ.png" alt="" /></p>

<p>To measure the shared information content between two objects, Bennett et al. (1998) define the information distance E(x,y) as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*p4NHGHxNATJ2l3pCiVxrKQ.png" alt="" /></p>

<p>E(x,y) equates the similarity with the shortest program length needed to transform one object into the other.</p>

<p>The uncomputability of Kolmogorov complexity hinders the computability of E(x,y), hence Li et al. (2004) propose the Normalized Compression Distance (NCD), using the compressed length C(x) of real-world compressors to approximate Kolmogorov complexity K(x). The formula is as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*YEOI-yGXxYPlut4_lQmMag.png" alt="" /></p>

<p>Here, C(x) represents the length after x has been compressed at the highest rate by the compressor. Generally, the higher the compression rate, the closer C(x) is to K(x).</p>

<p>We can use the kNN with the distance matrix provided by the NCD for classification. Our method can be implemented with 12 lines of Python code:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="ow">in</span> <span class="n">test_set</span><span class="p">:</span>  
    <span class="n">Cx1</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
    <span class="n">distance_from_x1</span> <span class="o">=</span> <span class="p">[]</span>  
    <span class="k">for</span> <span class="p">(</span><span class="n">x2</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="ow">in</span> <span class="n">train_set</span><span class="p">:</span>  
        <span class="n">Cx2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
        <span class="n">x1x2</span> <span class="o">=</span> <span class="s">" "</span><span class="p">.</span><span class="n">join</span><span class="p">([</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">])</span>  
        <span class="n">Cx1x2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
        <span class="n">ncd</span> <span class="o">=</span> <span class="p">(</span><span class="n">Cx1x2</span> <span class="o">-</span> <span class="nb">min</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">))</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">)</span>  
        <span class="n">distance_from_x1</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">ncd</span><span class="p">)</span>  
    <span class="n">sorted_idx</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">array</span><span class="p">(</span><span class="n">distance_from_x1</span><span class="p">))</span>  
    <span class="n">top_k_class</span> <span class="o">=</span> <span class="p">[</span><span class="n">train_set</span><span class="p">[</span><span class="n">idx</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">idx</span> <span class="ow">in</span> <span class="n">sorted_idx</span><span class="p">[:</span><span class="n">k</span><span class="p">]]</span>  
    <span class="n">predict_class</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">top_k_class</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="n">top_k_class</span><span class="p">.</span><span class="n">count</span><span class="p">)</span>
</code></pre></div></div>
<h4 id="data-preparation-and-testing-theapproach">Data Preparation and Testing the Approach</h4>

<p>This part of the post is a bit experimental, and I believe, rather amateurish. Firstly, I downloaded my ChatGPT data and then split them into questions and answers. I assigned my data as questions, and the responses from GPT as answers, and converted them into a csv file. I then split it into train and test sets, but my approach here was as if I was training a DNN. I then conducted a test, and the results were somewhat successful.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">gzip</span>  
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>  
<span class="kn">import</span> <span class="nn">csv</span>  
  
  
<span class="n">dataset</span> <span class="o">=</span> <span class="p">[]</span>  
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'dataset.csv'</span><span class="p">,</span> <span class="s">'r'</span><span class="p">,</span> <span class="n">newline</span><span class="o">=</span><span class="s">''</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="nb">file</span><span class="p">:</span>  
    <span class="n">csv_reader</span> <span class="o">=</span> <span class="n">csv</span><span class="p">.</span><span class="n">reader</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span>  
    <span class="nb">next</span><span class="p">(</span><span class="n">csv_reader</span><span class="p">)</span>    
    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">csv_reader</span><span class="p">:</span>  
        <span class="n">question</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>  
        <span class="n">answer</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>    
        <span class="n">dataset</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">question</span><span class="p">,</span> <span class="n">answer</span><span class="p">))</span>  
  
<span class="n">train_size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="mf">0.8</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">dataset</span><span class="p">))</span>  
<span class="n">training_set</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[:</span><span class="n">train_size</span><span class="p">]</span>  
<span class="n">test_set</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="n">train_size</span><span class="p">:]</span>  
  
<span class="k">def</span> <span class="nf">normalized_compression_distance</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">):</span>  
    <span class="c1">#C(x) and C(y) are the compressed sizes of strings x and y, respectively.  
</span>    <span class="n">Cx1</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>   
    <span class="n">Cx2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
    <span class="n">x1x2</span> <span class="o">=</span> <span class="s">" "</span><span class="p">.</span><span class="n">join</span><span class="p">([</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">])</span>  
    <span class="c1">#C(xy) is the compressed size of the concatenated strings x and y.  
</span>    <span class="n">Cx1x2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
    <span class="c1">#min{C(x), C(y)} represents the smallest compressed size between x and y.  
</span>    <span class="c1">#max{C(x), C(y)} represents the largest compressed size between x and y.  
</span>    <span class="n">ncd</span> <span class="o">=</span> <span class="p">(</span><span class="n">Cx1x2</span> <span class="o">-</span> <span class="nb">min</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">))</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">)</span>  
    <span class="k">return</span> <span class="n">ncd</span>  
  
<span class="c1"># Function to predict the class for a given text using KNN  
</span><span class="k">def</span> <span class="nf">predict_class_knn</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>  
    <span class="n">distances</span> <span class="o">=</span> <span class="p">[]</span>  
    <span class="k">for</span> <span class="p">(</span><span class="n">question</span><span class="p">,</span> <span class="n">answer</span><span class="p">)</span> <span class="ow">in</span> <span class="n">dataset</span><span class="p">:</span>  
        <span class="n">distance</span> <span class="o">=</span> <span class="n">normalized_compression_distance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">question</span><span class="p">)</span>  
        <span class="n">distances</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">distance</span><span class="p">,</span> <span class="n">answer</span><span class="p">))</span>  
    <span class="n">distances</span><span class="p">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  
    <span class="n">top_k_class</span> <span class="o">=</span> <span class="p">[</span><span class="n">distances</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">)]</span>  
    <span class="n">predicted_class</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">top_k_class</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="n">top_k_class</span><span class="p">.</span><span class="n">count</span><span class="p">)</span>  
    <span class="k">return</span> <span class="n">predicted_class</span>
</code></pre></div></div>

<p>I tried random things since I didn’t know and couldn’t remember exactly what my conversations were about, but I couldn’t get a fully efficient result. However, I was surprised at one point because when I left a blank or entered meaningless letters or numbers, I received this response</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*azTaDwIJznxV-gJmgre-Xg.png" alt="" /></p>

<p>Afterward, I collected approximately 300 data points from a law website and decided to give it a try, and the result was surprising. I felt as if I was performing a sort of search, but the result was good. It gave a lot of wrong results in some places, but for now, it was satisfactory.</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*XA8jdNrYLp5alEqJv5O5Ng.png" alt="" /></p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*EVjOt81f8ZwNEIQaSkJ0cg.png" alt="" /></p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*pDuGHQcA-Q3ErBzdcTZe9Q.png" alt="" /></p>

<p>I also tested model on Sentiment Analysis with winvoker’s Turkish Sentiment Analysis Dataset and results are very good. It works quickly and effectively.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">gzip</span>  
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>  
<span class="kn">import</span> <span class="nn">datasets</span>  
  
  
<span class="n">dataset</span> <span class="o">=</span> <span class="n">datasets</span><span class="p">.</span><span class="n">load_dataset</span><span class="p">(</span><span class="s">"winvoker/turkish-sentiment-analysis-dataset"</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="s">"train"</span><span class="p">)</span>  
  
  
<span class="n">questions</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s">'text'</span><span class="p">]</span>  
<span class="n">answers</span> <span class="o">=</span> <span class="n">dataset</span><span class="p">[</span><span class="s">'label'</span><span class="p">]</span>  
  
  
<span class="n">data_tuples</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">questions</span><span class="p">,</span> <span class="n">answers</span><span class="p">))</span>  
  
<span class="n">train_size</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="mf">0.8</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_tuples</span><span class="p">))</span>  
<span class="n">training_set</span> <span class="o">=</span> <span class="n">data_tuples</span><span class="p">[:</span><span class="n">train_size</span><span class="p">]</span>  
<span class="n">test_set</span> <span class="o">=</span> <span class="n">data_tuples</span><span class="p">[</span><span class="n">train_size</span><span class="p">:]</span>  
  
      
<span class="k">def</span> <span class="nf">normalized_compression_distance</span><span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">):</span>  
    <span class="c1">#C(x) and C(y) are the compressed sizes of strings x and y, respectively.  
</span>    <span class="n">Cx1</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>   
    <span class="n">Cx2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
    <span class="n">x1x2</span> <span class="o">=</span> <span class="s">" "</span><span class="p">.</span><span class="n">join</span><span class="p">([</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">])</span>  
        <span class="c1">#C(xy) is the compressed size of the concatenated strings x and y.  
</span>    <span class="n">Cx1x2</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">gzip</span><span class="p">.</span><span class="n">compress</span><span class="p">(</span><span class="n">x1x2</span><span class="p">.</span><span class="n">encode</span><span class="p">()))</span>  
    <span class="c1">#min{C(x), C(y)} represents the smallest compressed size between x and y.  
</span>    <span class="c1">#max{C(x), C(y)} represents the largest compressed size between x and y.  
</span>    <span class="n">ncd</span> <span class="o">=</span> <span class="p">(</span><span class="n">Cx1x2</span> <span class="o">-</span> <span class="nb">min</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">))</span> <span class="o">/</span> <span class="nb">max</span><span class="p">(</span><span class="n">Cx1</span><span class="p">,</span> <span class="n">Cx2</span><span class="p">)</span>  
    <span class="k">return</span> <span class="n">ncd</span>  
  
    <span class="c1"># Function to predict the class for a given text using KNN  
</span><span class="k">def</span> <span class="nf">predict_class_knn</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>  
    <span class="n">distances</span> <span class="o">=</span> <span class="p">[]</span>  
    <span class="k">for</span> <span class="p">(</span><span class="n">question</span><span class="p">,</span> <span class="n">answer</span><span class="p">)</span> <span class="ow">in</span> <span class="n">dataset</span><span class="p">:</span>  
        <span class="n">distance</span> <span class="o">=</span> <span class="n">normalized_compression_distance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">question</span><span class="p">)</span>  
        <span class="n">distances</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">distance</span><span class="p">,</span> <span class="n">answer</span><span class="p">))</span>  
    <span class="n">distances</span><span class="p">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  
    <span class="n">top_k_class</span> <span class="o">=</span> <span class="p">[</span><span class="n">distances</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">k</span><span class="p">)]</span>  
    <span class="n">predicted_class</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">top_k_class</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="n">top_k_class</span><span class="p">.</span><span class="n">count</span><span class="p">)</span>  
    <span class="k">return</span> <span class="n">predicted_class</span>
</code></pre></div></div>

<p><img src="https://cdn-images-1.medium.com/max/800/1*UJOgzgq8ajOTwFSED0sAqg.png" alt="" /></p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*fMg2PiXlTgBkiMdmziqlDA.png" alt="" /></p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*JNO9DCLRb1tEwt6Rd79W8Q.png" alt="" /></p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*deCJiO2o8gY2iuy3Dy7ZdA.png" alt="" /></p>

<h4 id="article">Article</h4>

<blockquote>
  <p><a href="[https://aclanthology.org/2023.findings-acl.426](https://aclanthology.org/2023.findings-acl.426)">“Low-Resource” Text Classification: A Parameter-Free Classification Method with Compressors</a> (Jiang et al., Findings 2023)</p>
</blockquote>

<blockquote>
  <p><a href="https://github.com/bazingagin/npc_gzip/tree/main">https://github.com/bazingagin/npc_gzip/tree/main</a></p>
</blockquote>]]></content><author><name>Mehmet Batuhan Duman</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[In the past weeks, an intriguing article was published on text classification. This article aims to provide simple but effective text classification using k-nearest-neighbors (kNN) and gzip, in contrast to Deep Neural Networks (DNNs). Although DNNs yield high results in text classification, they require extensive processing, millions of parameters, and a large number of labeled data. However, this article suggests a lightweight method that delivers good results without requiring any parameters or training. In this post, we will test this application using a dataset consisting of approximately 300 Turkish questions and answers related to law.]]></summary></entry><entry><title type="html">Optimizing FF-NN using Gravitational Search Algorithm</title><link href="bthndmn12.github.io/jekyll/update/2023/05/31/optimizing-ff-nn-using-gravitational-search-algorithm.html" rel="alternate" type="text/html" title="Optimizing FF-NN using Gravitational Search Algorithm" /><published>2023-05-31T11:45:00+00:00</published><updated>2023-05-31T11:45:00+00:00</updated><id>bthndmn12.github.io/jekyll/update/2023/05/31/optimizing-ff-nn-using-gravitational-search-algorithm</id><content type="html" xml:base="bthndmn12.github.io/jekyll/update/2023/05/31/optimizing-ff-nn-using-gravitational-search-algorithm.html"><![CDATA[<blockquote>
  <p><em>In the context of neural networks, this article gives a thorough analysis and use of the Gravitational Search Algorithm (GSA). The GSA is an optimization method that borrows principles from nature and imitates the effects of mass and gravity. To maximize the weights of the network, the technique is combined with a feed-forward neural network. A Python implementation of the GSA for optimizing the weights of a neural network with a single hidden layer is shown in the provided code. Using matplotlib, the evaluation of the algorithm’s performance is done over a number of epochs. Scholarly studies exploring the use of GSA in neural networks and its benefits over conventional optimization techniques are among the sources considered for this study.</em></p>
</blockquote>

<h4 id="introduction"><strong>INTRODUCTION</strong></h4>

<p>The Gravitational Search Algorithm (GSA) is a nature-inspired optimization algorithm that mimics the law of gravity and mass interactions. In 2009, Rashedi, Nezamabadi-pour, and Saryazdi first presented it. The GSA has been applied to a variety of domains, including machine learning, to improve the weights of neural networks. In order to optimize the weights of a neural network with a single hidden layer, the GSA is presented in this article with a Python implementation.</p>

<h4 id="problem-definition">PROBLEM DEFINITION</h4>

<p>The primary challenge in training neural networks is the optimization of the weights. Traditional optimization methods, such as gradient descent, can often get stuck in local minima, leading to suboptimal performance. The GSA, being a global optimization algorithm, can potentially overcome this issue by exploring the solution space more thoroughly. The problem at hand is to implement the GSA in Python and use it to optimize the weights of a neural network.</p>

<h4 id="literature-analysis">LITERATURE ANALYSIS</h4>

<p>Several studies have been conducted on the application of the GSA in neural networks. For instance, a study by Fedorovici et al. (2012) presented a method of embedding GSA in CNNs for OCR systems. The study demonstrated that the GSA, in combination with the Back Propagation BP algorithm, could improve performance by avoiding the algorithms’ traps in local minima. Another study by George and Huerta (2018) introduced Deep Filtering, a method for end-to-end time-series signal processing, based on a system of two deep convolutional neural networks, designed for classification and regression to rapidly detect and estimate parameters of signals in highly noisy time-series data streams. The study showcased the application of this method for the detection and parameter estimation of gravitational waves from binary black hole mergers.</p>

<h4 id="methods-and-technologies-to-beused">METHODS AND TECHNOLOGIES TO BE USED</h4>

<p>The method used in this study is the Gravitational Search Algorithm, a nature-inspired optimization algorithm. The GSA is implemented in Python and used to optimize the weights of a neural network with a single hidden layer. The neural network is a simple feed-forward network implemented using the numpy library. Since the GSA is a global optimization technique, it might locate the global minimum of the error function rather than a local minimum. Given that the error function of a neural network is frequently non-convex and may have numerous local minima, this makes it an excellent option for optimizing the weights of a neural network. The literature has looked into the application of GSA for neural network weight optimization. For instance, a way of embedding GSA in CNNs for OCR systems was provided in a study by Fedorovici et al. (2012). The study showed that by avoiding the algorithms’ traps in local minima, the GSA and the Back Propagation method might increase performance. Deep Filtering is a technique for end-to-end time-series signal processing developed by George and Huerta (2018). It is based on a system of two deep convolutional neural networks and was created for classification and regression in order to quickly identify and estimate the parameters of signals in time-series data streams with high levels of noise. This method’s use for the detection and parameter determination of gravitational waves from binary black hole mergers was demonstrated in the study.</p>

<h4 id="studies">STUDIES</h4>

<p>The neural network is a simple feed-forward network with a single hidden layer. The weights of the network are initialized randomly, and the GSA is used to optimize these weights over a series of epochs. The performance of the algorithm is evaluated by calculating the error between the network’s output and the desired output.</p>

<p>The parameters for the GSA and the neural network are set. This includes the number of agents , the learning rate, the number of iterations , the number of input features, and the number of neurons in the hidden layer. The agents, which represent the weights of the neural network, are initialized randomly. Each agent is a vector of weights, and the size of this vector is determined by the number of input features and the number of neurons in the hidden layer. The input data and the desired output are set. In this case, the input data is a vector of 0.2s, and the goal prediction is 0.9. A function is defined to calculate the fitness of an agent.</p>

<p>The fitness is calculated as the sum of the squared differences between the output of the network (using the agent’s weights) and the goal prediction.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">def</span> <span class="nf">calculate_fitness</span><span class="p">(</span><span class="n">agent</span><span class="p">):</span>  
    <span class="c1"># Reshape the agent's weights to match the network's structure  
</span>    <span class="n">weights</span> <span class="o">=</span> <span class="n">agent</span><span class="p">.</span><span class="n">reshape</span><span class="p">((</span><span class="n">n_inputs</span><span class="p">,</span> <span class="n">n_hidden</span><span class="p">))</span>  
    <span class="n">biases</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">n_hidden</span><span class="p">)</span>  <span class="c1"># You could also optimize the biases  
</span>  
    <span class="c1"># Forward pass through the network  
</span>    <span class="n">hidden_layer</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">maximum</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">input_data</span><span class="p">,</span> <span class="n">weights</span><span class="p">)</span> <span class="o">+</span> <span class="n">biases</span><span class="p">)</span>  
    <span class="n">output_layer</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">dot</span><span class="p">(</span><span class="n">hidden_layer</span><span class="p">,</span> <span class="n">output_weights</span><span class="p">)</span>  
  
    <span class="c1"># Calculate error  
</span>    <span class="n">error</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nb">sum</span><span class="p">((</span><span class="n">output_layer</span> <span class="o">-</span> <span class="n">goal_pred</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>  
    <span class="k">return</span> <span class="n">error</span>
</code></pre></div></div>
<p>A function is defined to calculate the gravitational forces between agents. The force between two agents is proportional to the product of their masses and inversely proportional to the distance between them. The direction of the force is from the agent with lesser mass to the agent with greater mass.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">def</span> <span class="nf">calculate_forces</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>  
    <span class="n">forces_i</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">agents</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>  
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_agents</span><span class="p">):</span>  
        <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">j</span><span class="p">:</span>  
            <span class="c1"># Distance between agents  
</span>            <span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nb">abs</span><span class="p">(</span><span class="n">agents</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">agents</span><span class="p">[</span><span class="n">j</span><span class="p">])</span>  
  
            <span class="c1"># Gravitational force  
</span>            <span class="n">force</span> <span class="o">=</span> <span class="p">(</span><span class="n">mass</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">mass</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="o">/</span> <span class="p">(</span><span class="n">distance</span> <span class="o">+</span> <span class="mf">1e-5</span><span class="p">)</span>  <span class="c1"># Add a small constant to avoid division by zero  
</span>  
            <span class="c1"># Direction  
</span>            <span class="n">direction</span> <span class="o">=</span> <span class="p">(</span><span class="n">agents</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">agents</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">/</span> <span class="p">(</span><span class="n">distance</span> <span class="o">+</span> <span class="mf">1e-5</span><span class="p">)</span>  <span class="c1"># Add a small constant to avoid division by zero  
</span>  
            <span class="c1"># Update force  
</span>            <span class="n">forces_i</span> <span class="o">+=</span> <span class="n">force</span> <span class="o">*</span> <span class="n">direction</span>  
    <span class="k">return</span> <span class="n">forces_i</span>
</code></pre></div></div>

<p>The algorithm starts by initializing a population of agents. Each agent represents a potential solution to the optimization problem. In the context of neural networks, each agent is a vector of weights. The fitness of each agent is evaluated. The fitness function depends on the specific problem being solved. In the context of neural networks, the fitness function could be the error between the network’s output (using the agent’s weights) and the desired output. <br />
The mass of each agent is calculated based on its fitness. Agents with better fitness have higher mass. The mass of an agent i at iteration t is calculated as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*jAiwNw4opJR3Amif_a-R8w.png" alt="" /></p>

<p>The gravitational force between two agents is calculated. The force between agent i and agent j at iteration t is calculated as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*UmTbmedzG4Iu6-j3dnb1aQ.png" alt="" /></p>

<p>The positions of the agents are updated based on the forces. The new position of agent i at iteration t+1 is calculated as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*E9Yix07y3H248_kP7on6Dg.png" alt="" /></p>

<p>The weights of the neural network, which are represented by the agents in the GSA, are updated in each epoch based on the calculated forces and a random velocity. The formula used in the code to update the weights is as follows:</p>

<p><img src="https://cdn-images-1.medium.com/max/800/1*ttGVAKfX0CiBV7AJEQ8-jA.png" alt="" /></p>

<p>In this example parameters are in the below</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># GSA parameters  
</span><span class="n">n_agents</span> <span class="o">=</span> <span class="mi">100</span>  <span class="c1"># Number of agents (solutions)  
# lr = 0.001  # Learning rate  
</span><span class="n">lr</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">(</span><span class="mf">0.001</span><span class="p">)</span>   
  
<span class="n">epochs</span> <span class="o">=</span> <span class="mi">1000</span>  <span class="c1"># Number of iterations  
</span><span class="n">n_inputs</span> <span class="o">=</span> <span class="mi">20</span>  <span class="c1"># The number of input features  
</span><span class="n">n_hidden</span> <span class="o">=</span> <span class="mi">10</span>  <span class="c1"># The number of neurons in the hidden layer  
</span>  
<span class="c1"># Initialize agents (weights)  
# agents = np.random.uniform(low=-1, high=1, size=(n_agents, n_inputs * n_hidden))  
</span><span class="n">agents</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">uniform</span><span class="p">(</span><span class="n">low</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">high</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="n">n_agents</span><span class="p">,</span> <span class="n">n_inputs</span> <span class="o">*</span> <span class="n">n_hidden</span><span class="p">)).</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span>  
  
<span class="c1"># Training data  
# goal_pred = 0.9  
</span><span class="n">goal_pred</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">(</span><span class="mf">0.9</span><span class="p">)</span>  
<span class="c1"># input_data = np.full(n_inputs, 0.2)  
</span><span class="n">input_data</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">full</span><span class="p">(</span><span class="n">n_inputs</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span>
</code></pre></div></div>

<h4 id="references">REFERENCES</h4>

<ol>
  <li>Fedorovici, L. O., Precup, R. E., Dragan, F., David, R. C., &amp; Purcaru, C. (2012). Embedding Gravitational SearchAlgorithms in Convolutional Neural Networks for OCR applications. 2012 7th IEEE International Symposium on Applied Computational Intelligence and Informatics (SACI). (<a href="https://ieeexplore.ieee.org/document/6249989">https://ieeexplore.ieee.org/document/6249989</a>)</li>
  <li>
    <ol>
      <li>George, D. J., &amp; Huerta, E. A. (2018). Deep neural networks to enable real-time multimessenger astrophysics. Physical Review D, 97(4)(<a href="https://doi.org/10.1103/physrevd.97.044039">https://doi.org/10.1103/physrevd.97.044039</a>)</li>
    </ol>
  </li>
  <li>Poma, Y., Melin, P., González, C. M., &amp; Martínez, G. (2019). Optimization of Convolutional Neural Networks Using the Fuzzy Gravitational Search Algorithm. Journal of Applied Mathematics and Robotics. (<a href="https://doi.org/10.14313/jamris/1-2020/12">https://doi.org/10.14313/jamris/1-2020/12</a>)</li>
  <li>Wang, J., &amp; Han, S. (2015). Feed-Forward Neural Network Soft-Sensor Modeling of Flotation Process Based on Particle Swarm Optimization and Gravitational Search Algorithm. Mathematical Problems in Engineering, 2015. (<a href="https://doi.org/10.1155/2015/147843">https://doi.org/10.1155/2015/147843</a>)</li>
  <li>Nagra, A. A., Alyas, T., Abdul Hamid, M. A., Tabassum, N., &amp; Ahmad, A. (2022). Training a Feedforward Neural Network Using Hybrid Gravitational Search Algorithm with Dynamic Multiswarm Particle Swarm Optimization. Complexity, 2022.(<a href="https://doi.org/10.1155/2022/2636515">https://doi.org/10.1155/2022/2636515</a>)</li>
  <li>Ezzat, D., Hassanien, A. E., &amp; Ella, H. A. (2021). An optimized deep learning architecture for the diagnosis of COVID-19 disease based on gravitational search optimization. Applied Soft Computing, 98. (<a href="https://doi.org/10.1016/j.asoc.2020.106742">https://doi.org/10.1016/j.asoc.2020.106742</a>)</li>
</ol>]]></content><author><name>Mehmet Batuhan Duman</name></author><category term="jekyll" /><category term="update" /><summary type="html"><![CDATA[In the context of neural networks, this article gives a thorough analysis and use of the Gravitational Search Algorithm (GSA). The GSA is an optimization method that borrows principles from nature and imitates the effects of mass and gravity. To maximize the weights of the network, the technique is combined with a feed-forward neural network. A Python implementation of the GSA for optimizing the weights of a neural network with a single hidden layer is shown in the provided code. Using matplotlib, the evaluation of the algorithm’s performance is done over a number of epochs. Scholarly studies exploring the use of GSA in neural networks and its benefits over conventional optimization techniques are among the sources considered for this study.]]></summary></entry></feed>