From 1fbff7a1e6b97bbab97a52ecb9329ff85609aeb3 Mon Sep 17 00:00:00 2001
From: Kavya Rambhia <161142013+kavya-r30@users.noreply.github.com>
Date: Thu, 21 Nov 2024 19:27:31 +0530
Subject: [PATCH] Added GPT-Reimagined readme.md
---
GPT-Reimagined.md | 161 ++++++++++++++++++++++++++++++++++
assets/kan-generated-text.png | Bin 0 -> 61895 bytes
assets/kan-gpt.png | Bin 0 -> 43259 bytes
3 files changed, 161 insertions(+)
create mode 100644 GPT-Reimagined.md
create mode 100644 assets/kan-generated-text.png
create mode 100644 assets/kan-gpt.png
diff --git a/GPT-Reimagined.md b/GPT-Reimagined.md
new file mode 100644
index 0000000..74cff80
--- /dev/null
+++ b/GPT-Reimagined.md
@@ -0,0 +1,161 @@
+# GPT-Reimagined: KANs vs MLPs
+
+This repository [GPT Reimagined: KANs vs MLPs](https://github.com/kavya-r30/GPT-Reimagined/) contains an implementation of a __Generative Pre-trained Transformer (GPT)__ model. The focus is to compare the performance and effectiveness of traditional __multilayer perceptron (MLP)__ layers and __Kolmogorov-Arnold Networks (KANs)__ in the architecture.
+
+__KANs__ are mathematical constructs based on the Kolmogorov-Arnold representation theorem, which suggests that any *multivariable continuous function* can be represented by a *composition of univariate functions and summation*. This unique approach can enable alternative network structures, potentially improving efficiency, expressiveness, or convergence rates for certain tasks.
+
+## Table of Contents
+- [Project Overview](#project-overview)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Experiment Details](#experiment-details)
+- [Results](#results)
+- [Directory Structure](#file-directory)
+- [Contributors](#contributors)
+- [Acknowledgement & Resources](#acknowledgement-and-Resources)
+
+# Project Overview
+
+## Description
+In this project, we aim to explore the effectiveness of __Kolmogorov-Arnold Networks (KANs)__ as an alternative to traditional __Multi Layer Perceptrons (MLPs)__ for implementing Generative Pretrained Transformers (GPTs). GPTs are a class of machine learning models known for their ability to generate __natural language text__ and perform various natural language processing tasks. Traditionally, GPTs have been implemented using MLP architectures. However, KANs, a relatively new development, have shown promise in outperforming MLPs in certain tasks.
+
+This project contributes to the ongoing research in machine learning architectures by providing empirical evidence on the efficacy of Kolmogorov-Arnold Networks as an alternative to traditional MLPs for implementing state-of-the-art language models like GPTs. The findings of this study can inform future developments in neural network architectures and guide the design of more efficient and effective models for natural language processing tasks.
+
+## Model: KAN-GPT architecture
+
+

+
+
+## Tech Stack
+
+| **Category** | **Technologies** |
+|-----------------------------|----------------------------------------------------------------------------------------------------|
+| **Programming Languages** | [](https://www.python.org/) |
+| **Frameworks** | [](https://pytorch.org/) |
+| **Libraries** | [](https://scipy.org/) [](https://pandas.pydata.org/) [](https://numpy.org/) [](https://tqdm.github.io/) [](https://github.com/openai/tiktoken) |
+| **Datasets** | [](https://www.kaggle.com/datasets/harvardnlp/tiny-shakespeare) [](https://huggingface.co/datasets/wikitext) |
+| **Tools** | [](https://git-scm.com/) [](https://colab.research.google.com/) [](https://www.kaggle.com/) |
+| **Visualization & Analysis**| [](https://matplotlib.org/) [](https://www.tensorflow.org/tensorboard) |
+
+## Objectives
+
+- Implement GPT using the traditional MLP approach.
+- Implement GPT using Kolmogorov-Arnold Networks (KANs).
+- Compare the performance of GPT implemented with MLPs and KANs across various metrics, including but not limited to:
+ - Language generation quality
+ - Training speed
+ - Model size
+ - Resource utilization
+- Provide a proof of principle for the performances of MLP-based GPTs versus KAN-based GPTs.
+
+## Other mini-projects
+- Neural Network based on MNIST dataset
+ - Using MLP
+ - Using KAN
+- Fashion classifier using CNN
+- NameGPT
+- Masked Language Model using encoder
+- Language translation (English-French) model using transformers
+
+# Installation
+
+1. Clone the Repository:
+ ```bash
+ git clone https://github.com/your-username/GPT-Reimagined.git
+ cd GPT-Reimagined
+ ```
+2. Install all the dependencies:
+ ```bash
+ pip install -r requirements.txt
+ ```
+3. Download the Tiny Shakespeare or WikiText-2 Dataset: This is handled in dataset_shakespeare.py, which automatically downloads and tokenizes the dataset if it's not present.
+
+# Usage
+
+1. Training the Model: Run the main script to train the models.
+ ```bash
+ python main.py
+ ```
+ - Training details, including training and validation loss, are logged and saved for analysis in TensorBoard.
+
+2. Generating Text: After training, you can generate text using the trained model:
+ ```bash
+ python generate.py
+ ```
+ - his will generate text based on a provided input prompt.
+ - Customize generate.py with desired configurations such as max_new_tokens to control the length of generated text.
+
+3. Troubleshooting:
+If you encounter issues or want to suggest any improvements [raise an issue](https://github.com/kavya-r30/GPT-Reimagined/issues) on GitHub.
+
+# Experiment Details
+
+The goal is to evaluate the comparative performance between KANs and MLPs when used in transformer models. Key experimental configurations:
+
+- **Block Size:** 64 (number of tokens processed in a single pass)
+- **Batch Size:** 64
+- **Learning Rate:** 2e-5
+- **Training Epochs:** 6 ~ ( 9435 * 6 steps)
+- **Loss Function:** Cross-entropy for next-token prediction
+- **Evaluation Metric:** Validation loss and perplexity
+
+## Logging and Model Saving
+
+- Training progress is logged to TensorBoard.
+- Model checkpoints are saved in the `models/` directory.
+
+# Results
+
+- **Text Generation Quality:** Generated text samples from both models reveal the qualitative differences in coherence and fluency in similar number of epochs and hyper-parameter.
+
+| **Metrics KAN-GPT** | **Tiny-Shakespeare** | **WikiText-2** |
+|-------------------------|-------------|-------------|
+| Tokens | ~337k tokens | ~3M tokens |
+| Training Time (per epoch) | 65 min | 335 min |
+| Perplexity | 40.44 | 35.16 |
+| Loss | 3.70 | 3.56 |
+| Parameters (millions) | 25.47M ||
+
+
+## Generated Results (KANs)
+
+
+## Conclusion
+
+- Concluded that KANs, despite potential, are hindered by **high computational requirements**, favoring MLPs in the
+long run for Natural language text generation.
+
+# File Directory`
+
+
+GPT-Reimagined/
+├── data/ # Dataset (tiny Shakespeare data used here)
+│ ├── tinyshakespeare/
+│ │ ├── input.txt # Encoded input data
+│ │ ├── train.bin # Encoded training data
+│ │ ├── val.bin # Encoded validation data
+├── models/ # Directory for saving trained models
+├── logs/ # Training logs for TensorBoard
+├── archive_logs/ # Archive of zipped logs
+├── main.py # Main script to initiate training
+├── dataset_shakespeare.py # Data processing and loading script
+├── model_kan.py # Kolmogorov-Arnold Network (KAN) model
+├── model_mlp.py # MLP-based GPT model
+├── train.py # Training loop for the models
+├── config.py # Configuration for hyperparameters and paths
+├── generate.py # Script for generating text with the trained model
+├── utils.py # Utility functions
+├── requirements.txt # Required dependencies
+└── README.md # This README file
+
+
+# Contributors
+- [Kavya Rambhia](https://github.com/kavya-r30)
+- [Abhay Upadhyay](https://github.com/urabhay10)
+
+# Acknowledgement and Resources
+- Andrej Karpathy https://www.youtube.com/playlist?list=PLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ
+- CMU Deep Learning lectures https://www.youtube.com/playlist?list=PLp-0K3kfddPzMmSaoGy5SqQsqhUeMC1ay
+- Research Paper-Attention Is All You Need https://arxiv.org/abs/1706.03762
+- Research Paper-Kolmogorov Arnold Networks https://arxiv.org/pdf/2404.19756
+- Special thanks to our mentors [Param Thakkar](https://github.com/ParamThakkar123) and [Mayank Palan](https://github.com/MayankPalan2004/) and to the entire [Project X](https://github.com/ProjectX-VJTI) community for unwavering support and guidance throughout this journey.
\ No newline at end of file
diff --git a/assets/kan-generated-text.png b/assets/kan-generated-text.png
new file mode 100644
index 0000000000000000000000000000000000000000..a5fdc62a9a9c49c29ac0fce015ca300a352188bd
GIT binary patch
literal 61895
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