Він був професором в Стенфорді на деякий час, пізніше став керівником відділу AI Tesla, працював в OpenAI, і, на мій погляд, він також виробляє деякі з кращих освітніх відео AI, доступних сьогодні. Його останній проект, Однак це те, що я можу описати лише як твір мистецтва. microGPT microGPT - це повна реалізація GPT, написана в Навпаки, код чистий, добре структурований і ретельно коментується. Він навіть уникає використання зовнішніх бібліотек глибокого навчання. Іншими словами, він містить не тільки саму нейронну мережу, але і мінімальну структуру, необхідну для навчання та її роботи. only about 200 lines of Python code Насправді, весь проект навіть не має повного сховища — він просто публікується як . single GitHub Gist https://gist.github.com/karpathy/8627fe009c40f57531cb18360106ce95?embedable=true In this article, I will try to explain how this beautiful piece of code works in a way that . anyone with basic Python knowledge can understand Почнемо з назви . GPT ГПУ виступає за Ця архітектура складає основу більшості сучасних великих мовних моделей. ChatGPT сам містить цю абревіатуру в своєму ім'я, і більшість основних альтернатив в даний час будуються на тій же основній ідеї. Generative Pretrained Transformer Модель GPT передбачає на основі попередніх слів в тексті. the next word (or token) Вони генерують відповіді, передбачаючи одне слово за раз. Спочатку вони передбачають наступне слово, потім вони додають це слово до тексту і передбачають наступне знову, і так далі. At first glance, this may sound simple. But if we think about it more carefully, predicting the next word correctly requires a certain level of . understanding of the text and its meaning У нейронних мережах цей процес «мислення» реалізується як . very large mathematical function Вхідні слова перетворюються на числа і подаються в цю функцію, яка потім обчислює наступне слово. В принципі, будь-яка система правил може бути представлена математично за допомогою таких функцій. Цю функцію ми називаємо . model Проблема в тому, що ця функція може бути Сучасні мовні моделі містять мільярди параметрів, що означає, що математична формула, що їх описує, може мати мільярди компонентів. extremely complex На щастя, є розумний підхід. Замість того, щоб писати точну формулу самі, ми визначаємо для формули, структуру з багатьма регульованими параметрами. Ці параметри потім можуть бути настроєні автоматично, поки модель не спрацює добре. “template” У нас є кілька таких шаблонів, залежно від типу проблеми, яку ми хочемо вирішити: are commonly used for image processing Convolutional networks MLP (multi-layer perceptrons) використовуються для загального наближення функцій Трансформери використовуються для мовних моделей, таких як ChatGPT і т. д. Ці шаблони представляють собою величезні математичні структури, які можуть наблизити складні правила після того, як їхні параметри будуть належним чином налаштовані. Залишається питання: Або, іншими словами: How do we adjust these parameters? How do we “program” a neural network? Ручне регулювання параметрів нейронної мережі, очевидно, було б неможливим, особливо коли ми маємо справу з моделями, які містять мільйони або навіть мільярди параметрів. На щастя, є спосіб зробити це автоматично, використовуючи дані. Метод, який дозволяє це зробити, називається . training gradient descent Якщо ми маємо великий набір даних і велику математичну формулу (нашу модель), ми можемо обчислити помилку моделі для кожного прикладу в наборі даних. У випадку з трансформаторами процес працює приблизно так. Слова представлені як точки у високовимірному векторному просторі, де слова з подібними значеннями з'являються ближче один до одного. The model receives a sequence of words as input and tries to predict the next word. Since words are represented as vectors, we can calculate how far the predicted word is from the correct one. This distance gives us a numerical measure of the error. А тепер настає магія. Використовуючи градусивний спад, ми можемо обчислити, як параметри формули повинні змінюватися, щоб зменшити цю помилку. Якщо ми маємо достатньо даних, достатньо велику мережу, і ми тренуємо її достатньо довго, формула поступово адаптується до моделей у наборі даних і виробляє все більш точні прогнози. Але як саме працює ця «магія»? Як градієнтне сходження насправді знаходить кращі параметри? Ми можемо візуалізувати помилку як функцію у високовимірному просторі, де кожен вимір відповідає одному параметру моделі. Мислення в багатьох вимірах практично неможливе для людини, тому замість цього ми можемо уявити простішу аналогію: пейзаж пагорбів і долин. У цій аналогії: Every point on the landscape represents a specific combination of model parameters. Висота ландшафту в цей момент являє собою помилку моделі. На початку тренування параметри ініціалізуються випадково.Це як бути розміщеним десь випадково на пагорбі. Наша мета - мінімізувати помилку, що означає знайти найнижчу точку в ландшафті. Складність полягає в тому, що ми не знаємо, як виглядає пейзаж. Це так, ніби ми намагаємося спускатися вниз по горі в тумані або в густому тумані. Саме тут і відбувається спадковий рух. У математиці існує поняття, яке називається , що описує схил функції в певній точці. derivative Це неймовірно корисно тут. похідний говорить нам . which direction the landscape slopes downward Алгоритм виконує наступне: Вимірюйте схильність пейзажу. Зробіть невеликий крок у напрямку, де помилка зменшується. Повторити Крок за кроком модель поступово йде вниз, поки не досягне низької точки в ландшафті помилок. По суті, це те, що робить градусивний спуск. Залишається питання: як ми обчислюємо схил такої складної функції? Я не буду входити в повні математичні подробиці тут, тому що у Карпатії вже є І пояснювати це. excellent video Для наших цілей достатньо знати наступне. Кожна математична операція має відповідне правило, яке дозволяє нам обчислити його локальний градиент.Крім того, існує правило, що називається правилом ланцюга, яке дозволяє нам об'єднати ці локальні градиенти для обчислення градиента всієї композитної функції. Ключова ідея полягає в тому, що ми рухаємося назад через ланцюжок операцій, збираючи нахили уздовж шляху. Всі основні системи глибокого навчання застосовують цей механізм. Наприклад: TensorFlow використовує систему під назвою GradientTape, яка записує операції, наприклад, кабельний рекордер, щоб потім можна було обчислити градієнти. attaches gradient information directly to tensors. Each tensor remembers how it was created, which allows gradients to be computed automatically. This system is called . PyTorch autograd Карпатська реалізація слідує тій самій базовій ідеї. # Let there be Autograd to recursively apply the chain rule through a computation graph class Value: __slots__ = ('data', 'grad', '_children', '_local_grads') # Python optimization for memory usage def __init__(self, data, children=(), local_grads=()): self.data = data # scalar value of this node calculated during forward pass self.grad = 0 # derivative of the loss w.r.t. this node, calculated in backward pass self._children = children # children of this node in the computation graph self._local_grads = local_grads # local derivative of this node w.r.t. its children def __add__(self, other): other = other if isinstance(other, Value) else Value(other) return Value(self.data + other.data, (self, other), (1, 1)) def __mul__(self, other): other = other if isinstance(other, Value) else Value(other) return Value(self.data * other.data, (self, other), (other.data, self.data)) def __pow__(self, other): return Value(self.data**other, (self,), (other * self.data**(other-1),)) def log(self): return Value(math.log(self.data), (self,), (1/self.data,)) def exp(self): return Value(math.exp(self.data), (self,), (math.exp(self.data),)) def relu(self): return Value(max(0, self.data), (self,), (float(self.data > 0),)) def __neg__(self): return self * -1 def __radd__(self, other): return self + other def __sub__(self, other): return self + (-other) def __rsub__(self, other): return other + (-self) def __rmul__(self, other): return self * other def __truediv__(self, other): return self * other**-1 def __rtruediv__(self, other): return other * self**-1 def backward(self): topo = [] visited = set() def build_topo(v): if v not in visited: visited.add(v) for child in v._children: build_topo(child) topo.append(v) build_topo(self) self.grad = 1 for v in reversed(topo): for child, local_grad in zip(v._children, v._local_grads): child.grad += local_grad * v.grad У коді Карпати вся градієнтна обчислювальна логіка реалізується в класу, що стосується лише . Value 40 lines long Цей клас, по суті, є оболонкою навколо числових значень. Окрім зберігання самих даних, він також зберігає: Які цінності він обчислював від (її дітей), і місцеві градієнти, необхідні для зворотного розповсюдження. Якщо ми подивимося на код, ми можемо побачити, що стандартні оператори перевизначені: Додаток __mul__ та інших. This means that whenever we perform a mathematical operation on Програма не тільки обчислює результат, але і записує, які значення його виробляли і як слід поширювати градиент. Value Нарешті, на Метод здійснює процес зворотного поширення. Він проходить назад через ланцюжок операцій і обчислює загальний градиент по відношенню до помилки. backward() І це, по суті, вся ідея. Іншим важливим компонентом тренінгу є саме сходження, яке використовує обчислювані сходження для оновлення параметрів моделі. Іншими словами, це частина коду, яка насправді йде по пагорбу, використовуючи інформацію про схил. # Adam optimizer update: update the model parameters based on the corresponding gradients lr_t = learning_rate * (1 - step / num_steps) # linear learning rate decay for i, p in enumerate(params): m[i] = beta1 * m[i] + (1 - beta1) * p.grad v[i] = beta2 * v[i] + (1 - beta2) * p.grad ** 2 m_hat = m[i] / (1 - beta1 ** (step + 1)) v_hat = v[i] / (1 - beta2 ** (step + 1)) p.data -= lr_t * m_hat / (v_hat ** 0.5 + eps_adam) p.grad = 0 При виконанні Карпати, це робиться з , який є одним з найбільш широко використовуваних алгоритмів оптимізації в глибокому навчанні. Adam optimizer Адам трохи більш витончений, ніж базовий сходження сходин. Замість того, щоб приймати кроки фіксованого розміру, він динамічно адаптує розмір кроку на основі історії попередніх сходин. . faster and more stable The gradient computation described earlier and the optimization step together form what we could call the deep learning framework part of the code. Будь-яка нейронна мережа - будь то мовна модель, генератор зображень, робот-контролер або автономний автомобіль - тренується, використовуючи в основному той самий принцип. Ці кілька рядків коду захоплюють основну ідею сучасного AI. Великі рамки, такі як: TensorFlow Пітер Якс забезпечують високооптимізовані реалізації, які можуть працювати на GPU, TPU і розподілених кластерах, і включають багато додаткових трюків та оптимізацій. Але якщо ми стерти все до основоположних, основний принцип є точно таким же, як і те, що ми бачимо в цій крихітній реалізації Python. Тепер, коли ми побачили глибоку структуру навчання частину коду, ми можемо перейти до фактичної нейронної мережі, іншими словами, до самої моделі GPT. Як було сказано раніше, мета GPT полягає в тому, щоб передбачити наступний токен на основі токенів, які прийшли до нього. This definition is slightly simplified, because the input does not actually consist of words, but of tokens. Tokens дуже схожі на слова, але вони не однакові.Замість того, щоб покладатися на заздалегідь визначений словник, система вивчає словниковий запас статистично з даних навчання. So training does not begin with a fixed list of words where each word already has a number assigned to it. Instead, this “dictionary” emerges from the data itself during preprocessing. Цей підхід особливо корисний для агглютинативних мов, таких як угорська, де одне слово може мати багато різних форм через суфікси та граматичні закінчення. З достатньою кількістю даних навчання мовна модель може вивчати будь-яку мову, будь то природна або штучна. In fact, tokens do not even have to represent text. They can represent: Частини зображень Фрагменти аудіо Сенсорні читання Практично будь-який тип даних Через це моделі трансформаторів не обмежуються мовною обробкою, вони також можуть бути використані для створення зображень, обробки мови, робототехніки та багатьох інших завдань. Модель Карпатії навмисно дуже маленька, тому в цьому випадку токени - це не слова, а символи. Тому мета моделі - не генерувати повні речення або відповіді, а просто виробляти реалістичні імена. Набір даних навчання складається з великого списку імен, і після навчання ми очікуємо, що модель буде генерувати нові імена, які статистично схожі на приклади. Це, очевидно, далеко від повномасштабної мовної моделі, як ChatGPT. Але в реальності різниця в основному полягає в масштабі. Якби ми збільшили цю модель мільйони разів, використовували токени замість символів, і тренували її на величезних наборах даних, зібраних з інтернету, ми б закінчили з чимось дуже схожим на сучасну модель великої мови. Ці великі моделі зазвичай тренуються в два етапи: Попередня підготовка - навчання на масивних наборах даних в Інтернеті для вивчення загальних мовних моделей. Fine-tuning - подальше навчання з використанням кураторських розмов, створених людиною, для поліпшення відповідей. Процес вимагає величезних обчислювальних ресурсів і величезних обсягів високоякісних даних, які часто коштують мільйони доларів в обчисленні. Оскільки більшість з нас не мають доступу до таких ресурсів, нам доведеться змиритися з генеруванням імен. # Let there be a Dataset `docs`: list[str] of documents (e.g. a list of names) if not os.path.exists('input.txt'): import urllib.request names_url = 'https://raw.githubusercontent.com/karpathy/makemore/988aa59/names.txt' urllib.request.urlretrieve(names_url, 'input.txt') docs = [line.strip() for line in open('input.txt') if line.strip()] random.shuffle(docs) print(f"num docs: {len(docs)}") # Let there be a Tokenizer to translate strings to sequences of integers ("tokens") and back uchars = sorted(set(''.join(docs))) # unique characters in the dataset become token ids 0..n-1 BOS = len(uchars) # token id for a special Beginning of Sequence (BOS) token vocab_size = len(uchars) + 1 # total number of unique tokens, +1 is for BOS print(f"vocab size: {vocab_size}") At the beginning of the code, we find the section responsible for loading the dataset of names and building the vocabulary. У цьому випадку словниковий запас просто складається з списку символів, які з'являються в наборі даних. Кожному символу присвоюється чисельний ідентифікатор, що дозволяє конвертувати текст в числа, які може обробляти нейронна мережа. Next comes one of the most important concepts in deep learning: . embeddings Ідея проста, але потужна. Замість того, щоб працювати з ідентифікаторами сирих токенів, ми мапуємо кожен токен в Ці вектори є тим, що насправді обробляє нейронна мережа. point in a high-dimensional vector space Фактично, будь-яку нейронну мережу можна розглядати як функцію, яка . maps vectors from one high-dimensional space into another Наприклад: Якщо ми тренуємо нейронну мережу, щоб класифікувати зображення як собаки або кішки, мережа охарактеризує представлення зображення в двовимірний простір, де одне вимір відповідає «собачності», а інше — «кошеню». Якщо уявити собі генератор зображень, такий як Midjourney, він переказує випадковий шум у високовимірний простір, де кожна точка являє собою зображення, обумовлене на запиті. Незважаючи на завдання, мережа завжди виконує . vector-to-vector transformation using a large mathematical function Те ж саме стосується і GPT. Розмірність векторного простору визначається в коді константою які в цій статті передбачені для . n_embd 16 Це означає, що кожен токен (в даному випадку, кожен символ) представлений як . 16-dimensional vector Mathematically, this mapping is simply a . matrix multiplication У коді матриця, відповідальна за цю трансформацію, називається Що стоїть за . wte word/token embedding Однак знати, які персонажі з'являються в слові, недостатньо. І це стосується position Наприклад, значення послідовності змінюється, якщо ми перерозподіляємо символи. Для обробки інформації, модель використовує , реалізований за допомогою іншої матриці під назвою . positional embeddings wpe Код зображує як токен, так і його положення в 16-вимірних векторах, а потім просто . adds the two vectors together В результаті виникає один вектор, який кодує обидва: the identity of the token its position within the sequence Раніше ми згадували, що ці векторні представлення повинні бути значущими, тому що пізніше модель обчислює помилки на основі відстаней між векторами. Ideally: Практично правильні прогнози повинні бути близькими до правильного вектора. Дуже неправильні прогнози повинні бути далеко від нього Це викликає цікаве питання: How do we design a good embedding space? The answer is surprisingly simple: We don’t. Instead, we initialize the embedding matrices ( та ) with random numbers and allow gradient descent to learn the correct representation during training. wte wpe Якщо у нас є достатньо даних, процес оптимізації поступово буде регулювати матриці, поки вони не представлятимуть корисні відносини. Це може призвести до дивовижно потужних виникаючих властивостей. Наприклад, у відомій embedding model, vector arithmetic can capture semantic relationships. A classic example is: word2vec king − man + woman ≈ queen Тут ми вже можемо побачити, що вбудований простір починає представляти своєрідний , де відносини між поняттями з'являються як геометричні відносини між векторами. simplified model of the world Now that we have seen how vectors are created, we can finally look at the neural network itself, the component that transforms these vectors into new vectors representing the next token. Іншими словами, мережа відображає вектори з токена, що вбудовує простір назад в той же простір, але зміщується одним токеном. Для кожного токена він передбачає, який токен повинен слідувати далі. The architecture used for this is called the . Transformer The Transformer was introduced in 2017 by researchers at Google in the famous paper: “Attention Is All You Need.” Початкова архітектура була розроблена для . It consisted of two main parts: machine translation Кодекс Декодер Кодувальник обробляв вхідне речення, а декодер генерував перекладене вихідне речення. For generative models like GPT, however, we only need • The . half of the original architecture decoder stack Ось чому моделі GPT часто описуються як . decoder-only transformers The decoder receives the input tokens and repeatedly processes them through a stack of identical layers. Each layer contains two main components: Self-attention Нейронна мережа feed-forward (MLP) These layers are repeated many times in large models. In diagrams, you often see this represented as Це означає, що блок буде збитий кілька разів. ×N One of the key innovations of the Transformer architecture is that it processes the . entire sequence at once Older language models, especially recurrent neural networks (RNNs), processed text one word at a time, sequentially passing information along the sequence. Transformers work differently. They can look at all tokens simultaneously, allowing the model to learn relationships between any parts of the text. Цей механізм називається Саме тому оригінальна стаття має назву . attention Attention Is All You Need The attention mechanism calculates how in the sequence. relevant each token is to every other token For each token vector, the model computes a set of weights describing how much attention it should pay to the other tokens. It then combines the information from those tokens accordingly. Таким чином, отриманий вектор представляє не тільки сам токен, але і . its meaning in the context of the entire sequence This may sound complicated, but the intuition is straightforward. Suppose we ask a language model: “What is the capital of France?” If we only looked at the word , we could not determine the answer. But attention allows the model to connect the word з . “capital” “capital” “France” The resulting representation captures the meaning of the phrase , making it possible for the model to produce the correct answer: . “capital of France” Paris Одним із способів думати про трансформатори є уявити їх як своєрідну . soft database Instead of storing explicit facts, the model stores knowledge in a vector space representation. Because neural networks approximate functions rather than memorize exact rules, they can often answer questions they have never seen before. Повернувшись до нашої попередньої вбудованої прикладу: якщо дані навчання містять інформацію про королів і жінок, модель все одно може бути в змозі відповісти на питання про королеви, тому що відносини між цими концепціями захоплюються в векторному просторі. If we follow this database analogy, we might say: Увага діє як індекс, допомагаючи моделі знаходити відповідну інформацію. The contain the knowledge itself. MLP layers Ця психічна модель корисна для інтуїції, але вона не буквально правильна. У реальному трансформаторі, як той, який використовується в ChatGPT, ці блоки уваги + MLP повторюються багато разів. Knowledge is not stored in a single location but is distributed across layers. Крім того, кожен шар включає залишкове з'єднання, яке змішує оригінальні вхідні вектори з новообчисленими векторами. У міру проходження векторів через шари можуть виникати нові абстракції і значення.У той час, коли остаточний шар виробляє свій вихід, модель об'єднує інформацію з багатьох різних рівнів представлення. The full process is far too complex to follow step by step with human intuition. Yet despite this complexity, the system works remarkably well in practice. Now that we have a rough intuition about the transformer architecture, let’s look at one of its most important components in more detail: . attention # 1) Multi-head Attention block x_residual = x x = rmsnorm(x) q = linear(x, state_dict[f'layer{li}.attn_wq']) k = linear(x, state_dict[f'layer{li}.attn_wk']) v = linear(x, state_dict[f'layer{li}.attn_wv']) keys[li].append(k) values[li].append(v) x_attn = [] for h in range(n_head): hs = h * head_dim q_h = q[hs:hs+head_dim] k_h = [ki[hs:hs+head_dim] for ki in keys[li]] v_h = [vi[hs:hs+head_dim] for vi in values[li]] attn_logits = [sum(q_h[j] * k_h[t][j] for j in range(head_dim)) / head_dim**0.5 for t in range(len(k_h))] attn_weights = softmax(attn_logits) head_out = [sum(attn_weights[t] * v_h[t][j] for t in range(len(v_h))) for j in range(head_dim)] x_attn.extend(head_out) x = linear(x_attn, state_dict[f'layer{li}.attn_wo']) x = [a + b for a, b in zip(x, x_residual)] У виконанні Карпати увага обчислюється за допомогою трьох матриць, названих: Q (Query) K (Key) V (Value) Ці матриці виконують векторні проекції. Іншими словами, кожен токенний вектор мапається на три різні векторні простори. Для кожної гривні ми розраховуємо: a query vector a key vector a value vector Як тільки ми маємо ці вектори, ми порівнюємо вектор запиту одного токена з ключовими векторами всіх токенів в послідовності. Математично це робиться за допомогою продукту точки. продукт точки дає оцінку, яка представляє, наскільки сильно два вектора пов'язані. Вона складається з кількох чисел, які представляють . how relevant each token is to the current token However, these raw scores are not yet probabilities. To convert them into a probability distribution, we apply the , який перетворює оцінки на значення між 0 і 1 , що сумує до 1. softmax function Ці значення відображають, скільки уваги повинен отримувати кожен токен. Finally, the model combines the value vectors using these attention weights, producing a new vector that contains information gathered from the entire context. The formula for scaled dot-product attention looks like this: Attention(Q, K, V) = softmax(QKᵀ / √dₖ) V Ось тут: QKT обчислює схожість між запитами та ключами is a scaling factor that stabilizes training √dₖ converts the scores into attention probabilities softmax V надає інформацію, яка об'єднується відповідно до цих ймовірностей. The result is a new representation for each token that reflects . its meaning in the context of the entire sequence At this point, it is worth mentioning an important concept: . context length Як ми вже говорили раніше, трансформатори обробляють всю послідовність одночасно. . every token with every other token Це означає, що витрати на обчислення зростають with the number of tokens. quadratically If we double the context length, the amount of computation increases roughly four times. This is one of the main limitations of transformer models. На відміну від деяких інших архітектур, трансформатори не мають окремої системи пам'яті. Everything outside that window is effectively invisible to the model. This is why context length is such an important property of modern language models. У багатьох сучасних системах AI це обмеження вирішується шляхом додавання зовнішнього механізму пам'яті. A common approach is to use a . vector database Instead of storing knowledge directly in the model, information can be stored externally as vector embeddings. Коли модель отримує запитання, система може: Перетворення запитання на вектор. Пошук векторної бази даних для отримання відповідної інформації. Insert the retrieved information into the model’s context. This means the model sees both: Питання and the relevant knowledge retrieved from the database Оскільки обидва з'являються в контекстному вікні, модель може генерувати відповідь на основі цієї інформації. This technique is known as and is widely used in modern AI systems and agent frameworks. Retrieval-Augmented Generation (RAG) In this setup, the language model’s main role is not to store knowledge, but to generate coherent answers based on the information available in its context. Але, як ми бачимо, для цього потрібно простір в контекстному вікні, тому довжина контексту залишається такою важливою. Повернувшись до реалізації Karpathy, модель використовує , which is an improved form of the basic attention mechanism. multi-head attention Замість обчислення уваги за допомогою одного набору матриць Q, K і V, модель використовує кілька голов уваги. In this implementation, there are four heads. Наприклад, одна голова може зосередитися на граматичних відносинах, а інша може захопити залежності більш широкого діапазону. Використання декількох голов покращує якість представлення. Щоб зберегти обчислювальні витрати приблизно однаковими, зменшується розмірність кожної голови. Earlier, we mapped vectors from a . 16-dimensional space to another 16-dimensional space With four attention heads, each head instead works in a Результати з головок потім об'єднуються назад в один вектор. 4-dimensional space Хоча кожна головка працює з нижчовимірними векторами, комбінований результат зазвичай більш виразний і точний, ніж за допомогою однієї голови уваги. Now that we have covered the attention mechanism, let’s move on to the second major component of the transformer block: the , or . MLP feed-forward neural network In the code, the MLP block looks something like this: # 2) MLP block x_residual = x x = rmsnorm(x) x = linear(x, state_dict[f'layer{li}.mlp_fc1']) x = [xi.relu() for xi in x] x = linear(x, state_dict[f'layer{li}.mlp_fc2']) x = [a + b for a, b in zip(x, x_residual)] An MLP is a . If we look at the structure of the weight matrices, we can interpret the rows of the matrix as . classic neural network architecture neurons Нейрон - це проста обчислювальна одиниця, яка: Помноживши кожен вхід на вагу, sums the results, Потім вона застосовує функцію нелінійної активації для отримання результату. This model was originally inspired by biological neurons in the human brain. In that sense, neural networks were historically motivated by attempts to mimic how the brain might process information. Однак сучасні системи AI перейшли досить далеко від цієї оригінальної аналогії. У компоненті MLP ми все ще можемо вільно розпізнавати щось, що нагадує нейрони. Стає набагато складніше підтримувати натхненну мозком інтерпретацію. attention Через це часто краще думати про сучасні системи AI просто як , rather than literal models of the brain. trainable mathematical functions Блок MLP в коді складається з трьох основних кроків: a (matrix multiplication), linear transformation a (ReLU), nonlinear activation function Ще одна лінійна трансформація. Це може здатися простим, але такі структури мають надзвичайно потужну математичну властивість. Вони відомі як . universal approximators universal approximators Це означає, що за певних умов достатньо великий MLP може наблизитися до до довільного ступеня точності. any mathematical function In principle, a single enormous MLP could learn almost anything. However, that would not be very efficient in practice. That is why transformer architectures combine multiple mechanisms, including attention and stacked layers, to distribute the computation more effectively. Вихід мережі не є єдиним токеном, а . probability distribution over all possible tokens Іншими словами, для кожного токена у словнику модель виводить ймовірність того, що він повинен з'явитися наступним у послідовності. Під час генерації алгоритм потім вибирає зразки з цього розподілу ймовірності. This means that tokens with higher probability are more likely to be chosen, but there is still an element of randomness. Цей параметр регулюється параметром, який називається . temperature The parameter determines how deterministic or creative the model’s output will be. temperature Низька температура - модель сильно сприяє найбільш ймовірним токенам, виробляючи більш передбачувані і точні відповіді. Висока температура - розподіл ймовірності стає більш рівним, що дозволяє рідше вибирати токени частіше, що призводить до більш різноманітних або творчих результатів. For example: Якщо ми хочемо, щоб модель аналізувала документ і відповідала на фактичні питання, зазвичай бажано низьку температуру. Якщо ми хочемо, щоб модель генерувала творчий текст або досліджувала нові ідеї, більш висока температура може дати більш цікаві результати. This is roughly what I wanted to explain about this beautiful piece of code, and about GPT models in general. Моя мета полягала в тому, щоб знайти баланс між двома речами: включити якомога більше корисних уявлень, зберігаючи обговорення в межах однієї статті. Для читачів, які виявили частини пояснення трохи незрозумілим, або хто хоче вивчити деталі глибше, я дуже рекомендую Його І Там ви знайдете відмінний матеріал, який пояснює все необхідне для повного розуміння обговорюваних тут концепцій. Особистий сайт Андрія Карпати YouTube канал his blog Я сподіваюся, що ця стаття була корисною для багатьох читачів.Якщо нічого іншого, можливо, вона служить запрошенням вивчити захоплюючий світ AI.