The spelled-out intro to language modeling: building makemore

Andrej Karpathy
7 Sept 2022117:45

TLDRThe video transcript introduces the concept of building a character-level language model named 'makemore', which is designed to generate new, unique names based on a dataset of 32,000 names. The process involves creating a bi-gram model that predicts the next character in a sequence, given the previous one. The model is trained by counting the frequency of character occurrences in the dataset and normalizing these counts to form probability distributions. The video also covers the implementation of the model using PyTorch, including the creation of a training set, initialization of weights, and the use of one-hot encoding. The transcript further explains the forward pass, loss calculation using negative log likelihood, and the optimization process through gradient descent. Additionally, it touches on the concept of model smoothing to prevent assigning zero probability to any character and the use of regularization to control the growth of weights. The video concludes with a demonstration of how to sample from the trained neural network model.


  • 📚 The video introduces the concept of building a character-level language model called 'makemore', which generates new names based on a dataset of 32,000 names.
  • 🤖 Makemore uses a neural network trained on the dataset to create unique, name-like sequences of characters that haven't appeared in the training data.
  • 👶 The generated names could be useful for parents looking for unique baby names, offering a source of inspiration.
  • 🔍 The character-level language model operates by predicting the next character in a sequence, treating each line in the dataset as a sequence of individual characters.
  • 📈 The video demonstrates creating a bi-gram model, which predicts the next character based on the current character, using a simple counting mechanism to establish probabilities.
  • 🔢 A bi-gram model is limited as it only considers the immediately preceding character, but it serves as a foundational step towards more complex models.
  • 📊 The script discusses the use of a 2D array to store bigram counts, which are then visualized to understand the frequency of character sequences in the dataset.
  • 🎛️ The video covers the process of converting counts to probabilities, using a softmax function to ensure the outputs can be interpreted as probabilities.
  • 🔬 The negative log likelihood is introduced as a loss function to evaluate and improve the model, aiming to minimize it through gradient-based optimization.
  • 🧮 The concept of model smoothing is explained, which involves adding a small count to all bigrams to prevent zero probabilities and ensure a smoother probability distribution.
  • 📈 The video concludes with a discussion on how the model can be trained using gradient descent, emphasizing the flexibility and scalability of the neural network approach compared to the counting method.

Q & A

  • What is the purpose of the 'make more' repository?

    -The 'make more' repository is designed to generate more of things that you give it, such as names. It is used to create unique, name-like sequences that could be used for naming purposes, like finding a unique name for a baby.

  • How does the character level language model in 'make more' work?

    -The character level language model in 'make more' treats every single line as an example and within each example, it treats them all as sequences of individual characters. It models the sequences of characters and predicts the next character in the sequence.

  • What kind of neural networks are used in 'make more'?

    -The neural networks used in 'make more' range from simple bi-gram and back-off models to more complex structures like multilingual perceptrons, recurrent neural networks, and modern transformers equivalent to GPT-2.

  • How does the bigram language model predict the next character in a sequence?

    -The bigram language model predicts the next character by looking at the previous character and using a count of how often each character follows another in the training set to establish probabilities.

  • What is the significance of using a 2D array to store bigram counts?

    -A 2D array allows for efficient storage and retrieval of bigram counts. The rows represent the first character of the bigram, and the columns represent the second character. Each entry in the array indicates how often the first character is followed by the second character in the dataset.

  • How does the 'make more' model ensure that it does not generate names with impossible character sequences?

    -The model uses a special start token and a special end character to structure the names and ensure that impossible character sequences do not occur. It also uses a lookup table to map characters to integers, which helps in managing the character sequences.

  • What is the role of the special start and end tokens in the 'make more' model?

    -The special start token is used to signify the beginning of a name sequence, and the special end character indicates the end of a name sequence. These tokens help in framing the name generation process and ensuring that the generated names are structured properly.

  • How does the 'make more' model handle the generation of unique names?

    -The model generates unique names by learning from a dataset of names and creating new sequences that follow the patterns of the training data but are not exact matches, thus ensuring uniqueness.

  • What is the process of training a bigram language model in 'make more'?

    -Training a bigram language model involves counting the frequency of each bigram in the dataset, normalizing these counts to create probability distributions, and then using these distributions to predict the next character in a sequence.

  • How is the loss function calculated for the 'make more' model?

    -The loss function, or negative log likelihood, is calculated by taking the average of the negative log probabilities assigned by the model to the actual next characters in the bigrams of the training set.

  • What is the purpose of model smoothing in the context of the 'make more' model?

    -Model smoothing is used to prevent the model from assigning zero probability to certain character sequences. It does this by adding a small, constant count to all bigrams, ensuring a more uniform probability distribution and avoiding infinite loss values.



🚀 Introduction to Make More: A GitHub Repository for Name Generation

The speaker introduces 'Make More', a GitHub repository that generates more items, specifically names, given a dataset. The project aims to create unique, name-like entities that could be useful for naming babies. The dataset used contains 32,000 names sourced from a government website. The speaker plans to train a neural network on this dataset to generate new names, starting with a character-level language model and eventually moving to word and image generation.


📚 Understanding the Dataset and Building a Bi-gram Language Model

The speaker discusses the structure of the dataset and the concept of a bi-gram language model. This model predicts the next character in a sequence based on the previous one. The speaker demonstrates how to extract bi-grams from the dataset and create a dictionary to count the occurrences of each bi-gram. The goal is to model the statistical structure of character sequences in names.


🔢 Counting Bi-grams and Storing them in a 2D Array

The speaker explains the process of counting bi-grams across the entire dataset and storing these counts in a two-dimensional array. This array represents the likelihood of one character following another in a sequence. The speaker also introduces the use of PyTorch for efficient manipulation of these arrays.


🔍 Visualizing the Bi-gram Counts and Creating a Lookup Table

The speaker visualizes the bi-gram counts using matplotlib and discusses the need for a lookup table to map characters to integers for indexing into the array. The process of creating this lookup table and its importance in the context of the model is explained.


🔄 Sampling from the Bi-gram Model and Improving Efficiency

The speaker outlines how to sample new names from the bi-gram model by starting with a special start token and selecting subsequent characters based on the probability distribution. The discussion then shifts to improving the efficiency of the model by preparing a matrix of probabilities upfront and using broadcasting for tensor manipulation.


📉 Evaluating Model Quality with Negative Log Likelihood

The speaker introduces the concept of negative log likelihood as a measure of the model's quality. By calculating the likelihood of the entire training set and its logarithm, the model's predictive power is quantified. The lower the negative log likelihood, the better the model is at predicting the training data.


🔧 Model Smoothing and Transitioning to Neural Networks

The speaker addresses the issue of assigning zero probability to certain bi-grams by using model smoothing, which adds fake counts to the bi-gram table. The discussion then transitions to using neural networks for language modeling, emphasizing the scalability and flexibility of the neural network approach compared to the table-based model.


🤖 Building a Neural Network for Language Modeling

The speaker demonstrates how to compile a training set for a neural network and encode the inputs using one-hot encoding. The neural network is constructed with a single linear layer followed by a softmax function to output probabilities. The forward pass of the network is detailed, including the calculation of logits, their exponentiation to obtain counts, and normalization to get probabilities.


📉 Computing the Loss Function and Optimizing with Gradient Descent

The speaker calculates the loss function using the negative log likelihood of the correct character probabilities assigned by the neural network. The loss is then used to perform gradient descent, updating the weights of the network to minimize the loss. The process involves resetting gradients, performing a backward pass to calculate gradients, and updating the weights.


🔁 Iterating on Model Optimization and Sampling from the Neural Network

The speaker iterates the gradient descent process to further optimize the model and achieve a lower loss. The optimized neural network is then used to sample new names, demonstrating that the network can generate plausible name-like sequences. The speaker reflects on the process and the equivalence of the neural network model to the table-based model.



💡Language Modeling

Language modeling is the process of predicting the probability of a sequence of words. In the context of the video, it refers to the creation of a model called 'make more' that generates new, name-like sequences of characters that could serve as unique names. The model is trained on a dataset of names to predict the likelihood of certain characters following others.

💡Character-Level Language Model

A character-level language model operates on the level of individual characters in a sequence, rather than words or sentences. In the video, the 'make more' model is a character-level model that treats each line of text as a sequence of characters and learns to predict the next character in the sequence.


A dataset is a collection of data, often used for training machine learning models. In the script, the dataset 'names.txt' is a large set of names used to train the 'make more' model to generate new names.

💡Neural Network

A neural network is a set of algorithms modeled after the human brain that are designed to recognize patterns. In the video, the neural network is used to generate example names once trained on the dataset. It is also the underlying mechanism for the language model that predicts character sequences.

💡Bi-gram Model

A bi-gram model is a type of language model that predicts the probability of a sequence of two items (like characters or words) based on the first item of the pair. In the script, the speaker discusses starting with a bi-gram model to predict the next character in a sequence given the current character.

💡Training Set

A training set is a subset of data used to train a machine learning model. The video script mentions creating a training set from the 'names.txt' dataset for the 'make more' model to learn from.

💡Log Likelihood

Log likelihood is a measure used in statistics and machine learning to estimate the probability of observing a set of data given a model. In the video, the speaker discusses using log likelihood to evaluate the quality of the language model.

💡Negative Log Likelihood Loss

Negative log likelihood loss is a loss function often used in machine learning for classification tasks. It measures how well a model's predictions match the actual data. The video explains that a lower negative log likelihood loss indicates a better model.

💡One Hot Encoding

One hot encoding is a representation of categorical variables as binary vectors. It is used to convert integer indices into a format that can be provided to a neural network. In the script, one hot encoding is used to represent the characters as inputs for the neural network.

💡Softmax Function

The softmax function is a mathematical function that converts a vector of log counts (logits) into a probability distribution. In the context of the video, softmax is used in the neural network to output probabilities for the next character in the sequence.

💡Gradient-Based Optimization

Gradient-based optimization is a method used to minimize a loss function by adjusting the parameters of a model in the direction that most reduces the loss. In the video, the speaker uses gradient descent to optimize the weights of the neural network to lower the negative log likelihood loss.


Introduction to building a character-level language model called 'makemore' for generating unique names.

Makemore is a GitHub repository that will be developed step by step to ensure clarity.

The model is trained on a dataset of 32,000 names sourced from a government website.

After training, the model generates name-like sequences that can be used for naming purposes.

The generated names are unique and sound like real names, offering a creative solution for those seeking distinctive naming options.

Makemore operates as a character-level language model, treating lines as sequences of individual characters.

The model predicts the next character in a sequence, which is crucial for generating coherent text.

Implementation of various character-level language models, from simple bi-gram models to modern transformers equivalent to GPT2.

The character-level language model is extended to the word level for generating larger documents.

Exploration into image and image-text networks, such as Dolly stable diffusion, is mentioned as a future extension of the model.

Loading the dataset 'names.txt' and processing it into a list of individual words.

Analysis of the dataset reveals the frequency of words, shortest and longest word lengths.

Building a bi-gram language model that predicts the next character in a sequence based on the current character.

Introduction of a special start and end token to handle the beginning and end of words in the model.

Efficient counting of bi-grams using a dictionary to store the frequency of character sequences.

Conversion of bi-gram counts into a two-dimensional array for easier manipulation and understanding of character relationships.

Use of PyTorch for creating and manipulating tensors, which are multi-dimensional arrays of the counts.

The creation of a lookup table for efficient mapping between characters and their integer representations.

Visualization of the bi-gram model's counts using matplotlib for a clearer understanding of character sequences.

Sampling from the bigram model to generate new names, demonstrating the model's predictive capabilities.

Discussion on the limitations of the bigram model and the need for a more sophisticated approach like the transformer model.

Efficient normalization of model probabilities by preparing a matrix of probabilities ahead of time.

Explanation of the importance of understanding broadcasting in PyTorch for efficient tensor operations.

Introduction of the concept of log likelihood for evaluating the quality of language models.

Conversion of the bigram language model into a neural network framework for greater flexibility and scalability.

Encoding of integers into vectors using one-hot encoding for input into the neural network.

Construction of a simple neural network with 27 neurons corresponding to the 27 possible characters.

Interpretation of the neural network's output as log counts, which are then exponentiated and normalized to produce probabilities.

Differentiable operations in the neural network allow for backpropagation and gradient-based optimization.

Minimization of the negative log likelihood loss function to improve the neural network's predictions.

Demonstration of how to sample from the neural network model to generate new sequences of characters.

Comparison of the neural network approach with the counting approach, showing they yield identical results.

Discussion on the scalability and flexibility of the neural network framework for future expansions and improvements.