Skip to main content

parallel neural network layer for binarization of ternarization - quantized layers from the beginning

Project description

plinear

Github for parrallel - linear layer

You can install PLinear using pip:

pip install plinear

Idea inspired from

https://arxiv.org/pdf/2402.17764?trk=public_post_comment-text

Code inspired from

https://github.com/kyegomez/BitNet/blob/main/bitnet/bitlinear.py

Ideas and Road Map

Parrallel neural network (PLinear)

Layer composition

Binarizing ternary layers by making posNet and negNet and compute them.

Both are created with posNet, which returns 1 if the weight if over 0 and 0 else.

Result comes out with posNet - negNet to mimic ternary.

Found out that tanh(weight) makes the model to fit in and learn without normalizing entire layer.

No additional activation function used in test.

tanh makes learning much more stable (quite stunning if you see the curve.)

tanh

posNet

W_neg is calculated just as W_pos

Equation

Learning w' - w as bitNet does

Learning

Example usage

import torch
import torch.nn as nn
from plinear import PLinear

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = PLinear(28*28, 128)
        self.fc2 = PLinear(128, 10)

    def forward(self, x):
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = self.fc2(x)
        return x

Test code for Mnist example (Should clone whole git)

pytest -k mnist -s

Results can be found in tests/result_mnist.

You are offered with precision, accuracy, recall per epochs.

Also confusion matrix and full visualization of weights per epochs will be offered in animation.

Complex layers

parrellized 4 binarized nn.Linears (using same algorithms with PLinear).

2 for real and 2 for complex.

Real and Complex Results

Real Result

Real Result

Complex Result

Complex Result

Notations

Notations

P.S.

I used torch.zeros if there is no complex input to feed.

pretty lovely result comes out, I suggest you to try this.

Example usage

import torch
import torch.nn as nn
from plinear import PLinear_Complex as PL

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.complex = torch.zeros(28*28, 1)
        self.fc1 = PL(28*28, 128)
        self.fc2 = PL(128, 10)

    def forward(self, x):
        real = torch.flatten(x, 1)
        real, complex = self.fc1(real, complex)
        real, complex = self.fc2(real, complex)
        return real

Test code for Mnist example (Should clone whole git)

pytest -k mnist_c -s

visualization (Not finised for documentation)

Exhaustive search of 3 x 3 CNN (Only Idea)

Since I parrallelized layers, each 3 x 3 CNN layer can be brute forced in 2^9 * 2 weights for ternary, which is very cheap against previous models.

Even the model is same, the layer is still at least 9 times smaller even if the model seeked through every cases.

And we can reduce the model with simple searching tasks.

I believe this can be used to vectorize images in proper size of vector which can be reused for image generation or more.

I guess vectorizing concepts and dynamically allocating them with layers would be the final goal of this project.

Developer Note

15, July, 2024

Checked plinear works on colab

16, July, 2024

version 0.1.2.2. version 0.1.2.3.

19, July, 2024

version 0.1.3.0 - PLinear_Complex

fixed some documentaion

14, Auguest, 2024

version 0.1.3.1 - Minor Tester change

changelog

0.1.2.2.

Documented readme.md

Preflight testing done for mnist both layer and visualization.

0.1.2.3

Integrated posNet, negNet functions to posNet.

Layer now does posNet - negNet instead of posNet + negNet since negNet is not negative in real now.

Weight is now processed with tanh and shows much stable learning curve.

Removed test result from the git.

0.1.3.0

Complex layer created and tested on MNIST

mnist run case fixed to show result through cmd

0.1.3.1

Teseted SAM optimizer and somehow it did not work well.

Found out that square models way better than non-square models.
Hypothesis

While backpropagation if the tensor got smaller, the change should spread thinner.

Need compensation since unlike traditional linear, quantized models does not show the change until it passes threshold.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plinear-0.1.3.1.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plinear-0.1.3.1-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

Details for the file plinear-0.1.3.1.tar.gz.

File metadata

  • Download URL: plinear-0.1.3.1.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Darwin/23.5.0

File hashes

Hashes for plinear-0.1.3.1.tar.gz
Algorithm Hash digest
SHA256 0b545397e82f3c84ba07b332b4f9b8d024c290ddb59e886767bae5239c5688eb
MD5 a50d013eabaedd553fe34fdaebd1e5ac
BLAKE2b-256 1b594cc63310e2eaad3a82bb47d8029a909b76074125b950232a0ab500896ed0

See more details on using hashes here.

File details

Details for the file plinear-0.1.3.1-py3-none-any.whl.

File metadata

  • Download URL: plinear-0.1.3.1-py3-none-any.whl
  • Upload date:
  • Size: 8.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Darwin/23.5.0

File hashes

Hashes for plinear-0.1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0e51558b8ed1917a64a51b7d70c8ebf946815845d3ace12593cd81f627ed737e
MD5 a1c7ae237e2b3aece8a3fe4d94fb8d07
BLAKE2b-256 a8ba975324a378f3c9fe64a3d065ab58e0303f76a68d8519ea9f2be1b9219940

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page