|
|
<!DOCTYPE html> |
|
|
<html> |
|
|
<head> |
|
|
<meta charset="utf-8"> |
|
|
<meta name="description" |
|
|
content="AI Now Lives in Time: Temporal Dense Networks for Distributed Generalization."> |
|
|
<meta name="keywords" content="Temporal AI, DenseNet, Neural Networks, PyTorch, XOR Generalization"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"> |
|
|
<title>Temporal DenseNet: AI Now Lives in Time</title> |
|
|
|
|
|
<link href="https://fonts.googleapis.com/css?family=Google+Sans|Noto+Sans|Castoro" rel="stylesheet"> |
|
|
<link rel="stylesheet" href="./static/css/bulma.min.css"> |
|
|
<link rel="stylesheet" href="./static/css/bulma-carousel.min.css"> |
|
|
<link rel="stylesheet" href="./static/css/bulma-slider.min.css"> |
|
|
<link rel="stylesheet" href="./static/css/fontawesome.all.min.css"> |
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/jpswalsh/academicons@1/css/academicons.min.css"> |
|
|
<link rel="stylesheet" href="./static/css/index.css"> |
|
|
<link rel="icon" href="./static/images/favicon.svg"> |
|
|
|
|
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> |
|
|
<script defer src="./static/js/fontawesome.all.min.js"></script> |
|
|
<script src="./static/js/bulma-carousel.min.js"></script> |
|
|
<script src="./static/js/bulma-slider.min.js"></script> |
|
|
</head> |
|
|
<body> |
|
|
|
|
|
<section class="hero"> |
|
|
<div class="hero-body"> |
|
|
<div class="container is-max-desktop"> |
|
|
<div class="columns is-centered"> |
|
|
<div class="column has-text-centered"> |
|
|
<h1 class="title is-1 publication-title">AI Now Lives in Time: Temporal DenseNet</h1> |
|
|
<div class="is-size-5 publication-authors"> |
|
|
<span class="author-block">Independent Research</span> |
|
|
</div> |
|
|
|
|
|
<div class="column has-text-centered"> |
|
|
<div class="publication-links"> |
|
|
<span class="link-block"> |
|
|
<a href="#code-section" class="button is-normal is-rounded is-dark"> |
|
|
<span class="icon"><i class="fab fa-github"></i></span> |
|
|
<span>Code</span> |
|
|
</a> |
|
|
</span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
<section class="section"> |
|
|
<div class="container is-max-desktop"> |
|
|
<div class="columns is-centered has-text-centered"> |
|
|
<div class="column is-four-fifths"> |
|
|
<h2 class="title is-3">Abstract</h2> |
|
|
<div class="content has-text-justified"> |
|
|
<p> |
|
|
This network is a fully connected “temporal” architecture where each neuron sees not only the neurons in earlier layers of the current computation, but also all neurons from the previous computation step (tick). |
|
|
</p> |
|
|
<p> |
|
|
By spreading information across layers and time, no single neuron can memorize an input-output pair directly. Instead, the network learns patterns in a distributed way, naturally favoring generalization over memorization. This makes it useful for tasks where datasets are small or where overfitting is a risk, because the architecture itself prevents simple lookup-table memorization and encourages learning the underlying rules. |
|
|
</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
<section class="section"> |
|
|
<div class="container is-max-desktop"> |
|
|
<div class="columns is-centered"> |
|
|
<div class="column is-full-width"> |
|
|
<h2 class="title is-3">Temporal Accumulation Results</h2> |
|
|
|
|
|
<div class="columns is-vcentered"> |
|
|
<div class="column"> |
|
|
<p> |
|
|
The model demonstrates extreme precision on the XOR dataset by utilizing <strong>time ticks</strong> to accumulate state. |
|
|
</p> |
|
|
<ul style="list-style-type: square; margin-left: 20px;"> |
|
|
<li><strong>Final Loss:</strong> 0.000002</li> |
|
|
<li><strong>Ticks:</strong> 3 iterative steps</li> |
|
|
<li><strong>Structure:</strong> 8x8x8 Hidden layers</li> |
|
|
</ul> |
|
|
</div> |
|
|
<div class="column"> |
|
|
<table class="table is-narrow is-fullwidth is-bordered"> |
|
|
<thead> |
|
|
<tr><th>Epoch</th><th>MSE Loss</th></tr> |
|
|
</thead> |
|
|
<tbody> |
|
|
<tr><td>200</td><td>0.000091</td></tr> |
|
|
<tr><td>1000</td><td>0.000008</td></tr> |
|
|
<tr><td>2000</td><td>0.000002</td></tr> |
|
|
</tbody> |
|
|
</table> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<h3 class="title is-4">Final Prediction Accuracy</h3> |
|
|
<p>The network achieves near-perfect separation for non-linear logic:</p> |
|
|
<pre style="background: #232323; color: #00ff00; padding: 15px; border-radius: 8px;"> |
|
|
Raw Predictions: |
|
|
[[7.0460670e-04] [9.9793684e-01] [9.9922490e-01] [2.1156450e-03]] |
|
|
Rounded: [0, 1, 1, 0]</pre> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
|
|
|
|
|
|
<section class="section" id="code-section"> |
|
|
<div class="container is-max-desktop"> |
|
|
<h2 class="title is-3">PyTorch Implementation</h2> |
|
|
<div class="content"> |
|
|
<p>The architecture uses <code>nn.ModuleList</code> to manage current tick layers ($U$) and previous tick recurrence ($W$).</p> |
|
|
<pre style="background-color: #f5f5f5; padding: 20px; border-radius: 10px; border: 1px solid #ddd; font-size: 0.9em;"><code> |
|
|
import torch |
|
|
import torch.nn as nn |
|
|
|
|
|
class TemporalDenseNet(nn.Module): |
|
|
def __init__(self, input_size, hidden_sizes, output_size): |
|
|
super().__init__() |
|
|
self.num_layers = len(hidden_sizes) |
|
|
self.hidden_sizes = hidden_sizes |
|
|
self.prev_concat_size = sum(hidden_sizes) |
|
|
|
|
|
# Current-tick linear layers U[i] |
|
|
self.U = nn.ModuleList() |
|
|
for i in range(self.num_layers): |
|
|
in_size = input_size if i == 0 else sum(hidden_sizes[:i]) |
|
|
self.U.append(nn.Linear(in_size, hidden_sizes[i])) |
|
|
|
|
|
# Previous-tick linear layers W[i] |
|
|
self.W = nn.ModuleList([nn.Linear(self.prev_concat_size, hidden_sizes[i]) |
|
|
for i in range(self.num_layers)]) |
|
|
|
|
|
self.out = nn.Linear(self.prev_concat_size, output_size) |
|
|
self.activation = torch.tanh |
|
|
|
|
|
def forward(self, x, prev_outputs=None): |
|
|
layer_outputs = [] |
|
|
prev_cat = torch.cat(prev_outputs, dim=1) if prev_outputs is not None else None |
|
|
|
|
|
for i in range(self.num_layers): |
|
|
current_input = x if i == 0 else torch.cat(layer_outputs, dim=1) |
|
|
out = self.U[i](current_input) |
|
|
if prev_cat is not None: |
|
|
out = out + self.W[i](prev_cat) |
|
|
out = self.activation(out) |
|
|
layer_outputs.append(out) |
|
|
|
|
|
final_cat = torch.cat(layer_outputs, dim=1) |
|
|
return layer_outputs, torch.sigmoid(self.out(final_cat)) |
|
|
</code></pre> |
|
|
</div> |
|
|
</div> |
|
|
</section> |
|
|
|
|
|
<footer class="footer"> |
|
|
<div class="container"> |
|
|
<div class="content has-text-centered"> |
|
|
<p>Research integrated from <code>timeBasedAIDense.py</code>.</p> |
|
|
</div> |
|
|
</div> |
|
|
</footer> |
|
|
|
|
|
</body> |
|
|
</html> |
|
|
|