From 8f3e5b024d583d21e0808a081c98d0134fb85e46 Mon Sep 17 00:00:00 2001 From: Sebastian Raschka Date: Sun, 14 Sep 2025 11:57:55 -0500 Subject: [PATCH] Add LoRA scaling (#823) --- .../01_main-chapter-code/appendix-E.ipynb | 78 ++++++++++--------- pkg/llms_from_scratch/appendix_e.py | 4 +- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/appendix-E/01_main-chapter-code/appendix-E.ipynb b/appendix-E/01_main-chapter-code/appendix-E.ipynb index dec9921..9c0efd3 100644 --- a/appendix-E/01_main-chapter-code/appendix-E.ipynb +++ b/appendix-E/01_main-chapter-code/appendix-E.ipynb @@ -48,12 +48,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "matplotlib version: 3.10.0\n", + "matplotlib version: 3.10.5\n", "numpy version: 2.0.2\n", - "tiktoken version: 0.9.0\n", - "torch version: 2.6.0\n", - "tensorflow version: 2.18.0\n", - "pandas version: 2.2.3\n" + "tiktoken version: 0.11.0\n", + "torch version: 2.8.0\n", + "tensorflow version: 2.20.0\n", + "pandas version: 2.3.1\n" ] } ], @@ -185,7 +185,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "File downloaded and saved as sms_spam_collection/SMSSpamCollection.tsv\n" + "sms_spam_collection/SMSSpamCollection.tsv already exists. Skipping download and extraction.\n" ] } ], @@ -403,16 +403,16 @@ }, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "checkpoint: 100%|███████████████████████████| 77.0/77.0 [00:00<00:00, 45.0kiB/s]\n", - "encoder.json: 100%|███████████████████████| 1.04M/1.04M [00:00<00:00, 2.15MiB/s]\n", - "hparams.json: 100%|█████████████████████████| 90.0/90.0 [00:00<00:00, 54.5kiB/s]\n", - "model.ckpt.data-00000-of-00001: 100%|███████| 498M/498M [01:12<00:00, 6.86MiB/s]\n", - "model.ckpt.index: 100%|███████████████████| 5.21k/5.21k [00:00<00:00, 2.99MiB/s]\n", - "model.ckpt.meta: 100%|██████████████████████| 471k/471k [00:00<00:00, 1.32MiB/s]\n", - "vocab.bpe: 100%|████████████████████████████| 456k/456k [00:00<00:00, 1.48MiB/s]\n" + "File already exists and is up-to-date: gpt2/124M/checkpoint\n", + "File already exists and is up-to-date: gpt2/124M/encoder.json\n", + "File already exists and is up-to-date: gpt2/124M/hparams.json\n", + "File already exists and is up-to-date: gpt2/124M/model.ckpt.data-00000-of-00001\n", + "File already exists and is up-to-date: gpt2/124M/model.ckpt.index\n", + "File already exists and is up-to-date: gpt2/124M/model.ckpt.meta\n", + "File already exists and is up-to-date: gpt2/124M/vocab.bpe\n" ] } ], @@ -649,9 +649,13 @@ " torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)) # similar to standard weight initialization\n", " self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))\n", " self.alpha = alpha\n", + " self.rank = rank\n", "\n", " def forward(self, x):\n", - " x = self.alpha * (x @ self.A @ self.B)\n", + " # Note: The original chapter didn't include the scaling by self.rank\n", + " # This scaling is not necessary, but it's more canonical and convenient\n", + " # as this lets us compare runs across different ranks without retuning learning rates\n", + " x = (self.alpha / self.rank) * (x @ self.A @ self.B)\n", " return x" ] }, @@ -1380,24 +1384,24 @@ "output_type": "stream", "text": [ "Ep 1 (Step 000000): Train loss 3.820, Val loss 3.462\n", - "Ep 1 (Step 000050): Train loss 0.396, Val loss 0.364\n", - "Ep 1 (Step 000100): Train loss 0.111, Val loss 0.229\n", - "Training accuracy: 97.50% | Validation accuracy: 95.00%\n", - "Ep 2 (Step 000150): Train loss 0.135, Val loss 0.073\n", - "Ep 2 (Step 000200): Train loss 0.008, Val loss 0.052\n", - "Ep 2 (Step 000250): Train loss 0.021, Val loss 0.179\n", - "Training accuracy: 97.50% | Validation accuracy: 97.50%\n", - "Ep 3 (Step 000300): Train loss 0.096, Val loss 0.080\n", - "Ep 3 (Step 000350): Train loss 0.010, Val loss 0.116\n", - "Training accuracy: 97.50% | Validation accuracy: 95.00%\n", - "Ep 4 (Step 000400): Train loss 0.003, Val loss 0.151\n", - "Ep 4 (Step 000450): Train loss 0.008, Val loss 0.077\n", - "Ep 4 (Step 000500): Train loss 0.001, Val loss 0.147\n", - "Training accuracy: 100.00% | Validation accuracy: 97.50%\n", - "Ep 5 (Step 000550): Train loss 0.007, Val loss 0.094\n", - "Ep 5 (Step 000600): Train loss 0.000, Val loss 0.056\n", - "Training accuracy: 100.00% | Validation accuracy: 97.50%\n", - "Training completed in 12.10 minutes.\n" + "Ep 1 (Step 000050): Train loss 0.346, Val loss 0.325\n", + "Ep 1 (Step 000100): Train loss 0.063, Val loss 0.144\n", + "Training accuracy: 100.00% | Validation accuracy: 92.50%\n", + "Ep 2 (Step 000150): Train loss 0.054, Val loss 0.045\n", + "Ep 2 (Step 000200): Train loss 0.058, Val loss 0.122\n", + "Ep 2 (Step 000250): Train loss 0.041, Val loss 0.199\n", + "Training accuracy: 100.00% | Validation accuracy: 95.00%\n", + "Ep 3 (Step 000300): Train loss 0.020, Val loss 0.153\n", + "Ep 3 (Step 000350): Train loss 0.018, Val loss 0.202\n", + "Training accuracy: 100.00% | Validation accuracy: 95.00%\n", + "Ep 4 (Step 000400): Train loss 0.014, Val loss 0.134\n", + "Ep 4 (Step 000450): Train loss 0.000, Val loss 0.145\n", + "Ep 4 (Step 000500): Train loss 0.002, Val loss 0.205\n", + "Training accuracy: 97.50% | Validation accuracy: 90.00%\n", + "Ep 5 (Step 000550): Train loss 0.016, Val loss 0.153\n", + "Ep 5 (Step 000600): Train loss 0.038, Val loss 0.159\n", + "Training accuracy: 100.00% | Validation accuracy: 95.00%\n", + "Training completed in 6.21 minutes.\n" ] } ], @@ -1412,7 +1416,7 @@ "\n", "torch.manual_seed(123)\n", "\n", - "optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5, weight_decay=0.1)\n", + "optimizer = torch.optim.AdamW(model.parameters(), lr=8e-4, weight_decay=0.1)\n", "\n", "num_epochs = 5\n", "train_losses, val_losses, train_accs, val_accs, examples_seen = train_classifier_simple(\n", @@ -1450,7 +1454,7 @@ "outputs": [ { "data": { - "image/png": "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yDp5e3uj0Wisn/fv34+npyc//vgjffr0wWAw8Msvv3D48GHuvPNOAgMD8fDwoF+/fqxevdpmuxee+tZoNHz44YeMGTMGNzc3IiIi+O6776zLLzz1XXmKesWKFXTt2hUPDw/i4uJsfliUl5czefJkfHx88PPzY/r06cTHxzN69Oh61cH8+fPp2LEjer2eyMhI/vvf/1qXKaVITEwkLCwMg8FASEgIkydPti7/17/+RUREBC4uLgQGBnL33XfXa99XiyTqC0iiFkJAxUMrSsvtMjXm6MPPPPMMc+fOZd++fURFRVFYWMitt97KmjVr2LFjB3FxcYwaNYr09PRLbmf27Nncc8897Nq1i1tvvZXx48dz9uzZi5Y/f/48r732Gv/973/ZsGED6enpTJs2zbr85Zdf5tNPP2XhwoVs3LiR/Px8li5dWq9jW7JkCY8//jhPPvkku3fv5v/+7/+4//77Wbt2LQBff/01//znP3n//fc5ePAgS5cupWfPngBs3bqVyZMn88ILL5CWlsby5csZMmRIvfZ/tcip7wtU3qK1MyMXs1mh1crtGkJci4rLTHSbucIu+977wgjc9I3z5/mFF17g5ptvtn5u1aoV0dHR1s8vvvgiS5Ys4bvvvmPSpEkX3c6ECRMYN24cAP/4xz9466232LJlC3FxcbWWLysr47333qNjx44ATJo0iRdeeMG6/O2332bGjBmMGTMGgHfeeYdly5bV69hee+01JkyYwKOPPgrA1KlT2bx5M6+99ho33ngj6enpBAUFMXz4cJydnQkLC6N///4ApKen4+7uzu23346npyfh4eHExMTUa/9Xi7SoLxAZ6Imrs44CYzmHTxXaOxwhhLgiffv2tflcWFjItGnT6Nq1Kz4+Pnh4eLBv377LtqijoqKs793d3fHy8rI+IrM2bm5u1iQNlsdoVpbPy8sjOzvbmjQBdDodffr0qdex7du3j4EDB9rMGzhwIPv27QPgj3/8I8XFxXTo0IEHH3yQJUuWUF5eDsDNN99MeHg4HTp04N577+XTTz/l/Pnz9dr/1SIt6gs46bT0bOPNlqNn2ZGRS0Sgp71DEkLYgauzjr0vjLDbvhuLu7u7zedp06axatUqXnvtNTp16oSrqyt33303paWll9yOs7OzzWeNRoPZbK5X+cY8pV8XoaGhpKWlsXr1alatWsWjjz7Kq6++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", + "image/png": "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SVCW4NOvXz9VhyyBR+p+pbhbXvf++++r1uKloXfv3qp7lARLuaGQzy2q+5L0B//HP/6BZ599FqdPn1Y3G7fddpvqMibkxkMCaHx8vAqocuNRsM5dJ7lnaWUun5eZmanSIS3PpUuXeO2111S3MSk+l4Aux0su+u9//7t6XqoBJHC/8MIL6lxJ+qWKQD6zsBsNIk9gkhZlRieCiMqH9KOWLk5LliwxOilEVEy8BSUiInJhDNREREQujEXfRERELow5aiIiIhfGQE1EROTCGKiJiIhcGAO1zezZs9VoRzL1nkzjt2XLFng6me1IhmOUvqkyxGLBLjvSfEGGeJR+vjKKlYwkpc+YpJOhL2VADOk/K31eZSANfShIncy4JKNaybmVEaxkNiN3I/16ZRpJGZRDpqOUqSJl9DBH0i9Y+hPLYCUy0peMea1PW6mTwUtkkBAZ21reRwY4yc3NdTpGhteUvsMySpcMQzpnzhy4GxnnXAZEkd+FLDKe+LJly+zP81xd24wZM9Tfowwko+P5yid98OX8OC5Nmzb17HNl9KwgrmDevHmav7+/9sUXX2j79+9XMxmFh4dr586d0zzZ0qVLtZdeekn7/vvv1exDixcvdnp+xowZWlhYmLZkyRJt9+7d2j333KPVr19fy8jIsB/Tv39/LTo6Wtu8ebP222+/aQ0bNrTPdCSSk5O16tWrayNGjND27dunZngKCgrSPvnkE82d3HnnndqXX36pvsOuXbu0u+66S4uKitLS0tLsxzzxxBNanTp11OxV27Zt02677TatS5cu9udzc3O1li1ban369NF27typzn/VqlXts1CJ48ePqxmkJkyYoB04cED74IMP1OxVy5cv19zJDz/8oP3888/a4cOH1axWf//73zU/Pz91/gTPVeG2bNmi1atXT2vdurV9BjPB85VvypQpWosWLbSzZ8/aF5ldzpPPFQO1pmkdO3bUxo4da9+W6f4iIyPVFIHeomCgtlgsWo0aNbS33nrLvu/y5ctaQECACrZCfsDyuq1bt9qPWbZsmWYymezTIn744YdapUqV1LSOOplu0HHqRXeUmJiovvu6devs50YC0XfffWc/5uDBg+qYTZs2qW25IJjNZi0hIcFpikmZ9lE/P88//7y6CDl64IEH1I2Cu5PfgUzLyXNVuNTUVK1Ro0baihUrnKYa5fm6OlBL5qAw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", "text/plain": [ "
" ] @@ -1496,8 +1500,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training accuracy: 100.00%\n", - "Validation accuracy: 96.64%\n", + "Training accuracy: 99.81%\n", + "Validation accuracy: 97.99%\n", "Test accuracy: 97.33%\n" ] } diff --git a/pkg/llms_from_scratch/appendix_e.py b/pkg/llms_from_scratch/appendix_e.py index 9d004e3..25901ad 100644 --- a/pkg/llms_from_scratch/appendix_e.py +++ b/pkg/llms_from_scratch/appendix_e.py @@ -14,9 +14,11 @@ class LoRALayer(torch.nn.Module): torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5)) # similar to standard weight initialization self.B = torch.nn.Parameter(torch.zeros(rank, out_dim)) self.alpha = alpha + self.rank = rank def forward(self, x): - x = self.alpha * (x @ self.A @ self.B) + + x = (self.alpha / self.rank) * (x @ self.A @ self.B) return x