<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nlp on davethehuman.com</title><link>https://davethehuman.com/tags/nlp/</link><description>Recent content in Nlp on davethehuman.com</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Dave the human</copyright><lastBuildDate>Tue, 29 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://davethehuman.com/tags/nlp/index.xml" rel="self" type="application/rss+xml"/><item><title>F1-score</title><link>https://davethehuman.com/notes/f1-score/</link><pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/f1-score/</guid><description>&lt;p&gt;&lt;em&gt;F1-score&lt;/em&gt; (also called &lt;a href="https://davethehuman.com/coming-soon/" rel="nofollow"&gt;harmonic mean&lt;/a&gt;) is a &lt;a href="https://davethehuman.com/coming-soon/" rel="nofollow"&gt;metric&lt;/a&gt; that takes into account both &lt;a href="https://davethehuman.com/notes/precision/"&gt;precision&lt;/a&gt; and &lt;a href="https://davethehuman.com/notes/recall/"&gt;recall&lt;/a&gt;:
&lt;/p&gt;
$$
\mathrm{F1} = \frac{2*Precision*Recall}{Precision + Recall}
$$&lt;p&gt;It is widely used in &lt;a href="https://davethehuman.com/coming-soon/" rel="nofollow"&gt;NLP&lt;/a&gt; and it balances precision and recall, handling &lt;a href="https://davethehuman.com/coming-soon/" rel="nofollow"&gt;class imbalance&lt;/a&gt; and highlighting poor performance on minority classes.&lt;/p&gt;</description></item><item><title>Dataloader</title><link>https://davethehuman.com/notes/dataloader/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/dataloader/</guid><description>&lt;p&gt;The &lt;em&gt;DataLoader&lt;/em&gt; is a PyTorch data primitive that allows to manage how a &lt;a href="https://davethehuman.com/notes/dataset/"&gt;Dataset&lt;/a&gt; is loaded onto a model.
In &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt;s tasks, it is usually included in a funcion with the &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt; so that the input data is already processed to be ingested by the model, e.g.:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;create_dataloader_v1&lt;/span&gt;(txt, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;						 batch_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;						 max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stride&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;, &lt;span style="color:#75715e"&gt;#number of positions the input shifts across batches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; shuffle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; drop_last&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; num_workers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tokenizer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tiktoken&lt;span style="color:#f92672"&gt;.&lt;/span&gt;get_encoding(&lt;span style="color:#e6db74"&gt;&amp;#34;gpt2&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPTDatasetV1(txt, tokenizer, max_length, stride)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataloader &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DataLoader(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dataset,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; batch_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;batch_size,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; shuffle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;shuffle,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; drop_last&lt;span style="color:#f92672"&gt;=&lt;/span&gt;drop_last, &lt;span style="color:#75715e"&gt;#if True, drops the last batch if shorter than batch_size - to prevent loss spikes during training&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; num_workers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;num_workers &lt;span style="color:#75715e"&gt;#n. of CPU processes to use &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; dataloader&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>Dataset</title><link>https://davethehuman.com/notes/dataset/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/dataset/</guid><description>&lt;p&gt;The &lt;em&gt;Dataset&lt;/em&gt; is a PyTorch data class that allows to manage how the individual rows are fetched and then loaded into the model by the &lt;a href="https://davethehuman.com/notes/dataloader/"&gt;DataLoader&lt;/a&gt;.
In &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt;s tasks, it is usually included in a funcion with the &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt; so that the input data is already processed to be ingested by the model, e.g.:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GPTDatasetV1&lt;/span&gt;(Dataset):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, txt, tokenizer, max_length, stride):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input_ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target_ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; token_ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(txt) &lt;span style="color:#75715e"&gt;#this tokenizes the entire text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, len(token_ids) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; max_length, stride): &lt;span style="color:#75715e"&gt;#sliding window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_chunk &lt;span style="color:#f92672"&gt;=&lt;/span&gt; token_ids[i:i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; max_length]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target_chunk &lt;span style="color:#f92672"&gt;=&lt;/span&gt; token_ids[i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;max_length&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input_ids&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tensor(input_chunk))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target_ids&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tensor(target_chunk))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__len__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; len(self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input_ids)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__getitem__&lt;/span&gt;(self, idx):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;input_ids[idx], self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;target_ids[idx]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Among the common args we find the &lt;a href="https://davethehuman.com/notes/batch-size/"&gt;batch size&lt;/a&gt;, the &lt;a href="https://davethehuman.com/notes/stride/"&gt;stride&lt;/a&gt; and &lt;a href="https://davethehuman.com/notes/max_length/"&gt;max_length&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>max_length</title><link>https://davethehuman.com/notes/max_length/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/max_length/</guid><description>&lt;p&gt;Talking about &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt;s and the &lt;a href="https://davethehuman.com/notes/dataset/"&gt;Dataset&lt;/a&gt;s used for their training, &lt;em&gt;max_length&lt;/em&gt; usually indicates the length of the overlapping sequences that get loaded by the &lt;a href="https://davethehuman.com/notes/dataloader/"&gt;DataLoader&lt;/a&gt; in a sliding window fashion.&lt;/p&gt;</description></item><item><title>stride</title><link>https://davethehuman.com/notes/stride/</link><pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/stride/</guid><description>&lt;p&gt;The &lt;em&gt;stride&lt;/em&gt; dictates the number of positions the inputs shift across &lt;a href="https://davethehuman.com/notes/batch/"&gt;batch&lt;/a&gt;es, creating a &lt;a href="https://davethehuman.com/coming-soon/" rel="nofollow"&gt;sliding window&lt;/a&gt; approach.
It is used for example in the &lt;a href="https://davethehuman.com/notes/dataloader/"&gt;DataLoader&lt;/a&gt;; in the following example we see that a &lt;code&gt;stride = 1&lt;/code&gt; shifts the second batch by one position compared to the first one, with the target portion as an anchor point for the shift.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dataloader &lt;span style="color:#f92672"&gt;=&lt;/span&gt; create_dataloader_v1(raw_text, batch_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_length&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#75715e"&gt;#usually much larger (e.g. 256)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stride&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; shuffle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data_iter &lt;span style="color:#f92672"&gt;=&lt;/span&gt; iter(dataloader)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inputs, targets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; next(data_iter)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;Inputs:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, inputs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Targets:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, targets)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;pre class="code-output"&gt;```
Inputs:
 tensor([[ 40, 367, 2885, 1464]])

Targets:
 tensor([[ 367, 2885, 1464, 1807]])
```&lt;/pre&gt;

&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#with a stride=1 the second batch will be shifted by 1 position &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inputs, targets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; next(data_iter)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;Inputs:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, inputs)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Targets:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, targets)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;pre class="code-output"&gt;```
Inputs:
 tensor([[ 367, 2885, 1464, 1807]])

Targets:
 tensor([[2885, 1464, 1807, 3619]])
```&lt;/pre&gt;

&lt;p&gt;The anchor point concept is mote visible in an example where we use &lt;code&gt;batch_size = 2&lt;/code&gt; , and let&amp;rsquo;s use a larger &lt;code&gt;stride = 2&lt;/code&gt; too:&lt;/p&gt;</description></item><item><title>padding</title><link>https://davethehuman.com/notes/padding/</link><pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/padding/</guid><description>&lt;p&gt;When training LLMs with &lt;a href="https://davethehuman.com/notes/batch-size/"&gt;batch size&lt;/a&gt; sizes larger than one, the batch might contain texts of varying lengths. To ensure all texts have the same length, the shorter texts are extended or &amp;ldquo;padded&amp;rdquo; up to the length of the longest text in the batch.&lt;/p&gt;</description></item><item><title>embedding</title><link>https://davethehuman.com/notes/embedding/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/embedding/</guid><description>&lt;p&gt;An &lt;em&gt;embedding&lt;/em&gt; is a mapping from discrete objects, such as words, images, or entire documents, to points in a continuous vector space.
Its primary purpose is to convert non-numeric data into a format that neural networks can process.&lt;/p&gt;
&lt;p&gt;One of the earlier and most popular examples of word embedding is the &lt;a href="https://davethehuman.com/notes/word2vec/"&gt;Word2Vec&lt;/a&gt; approach.&lt;/p&gt;
&lt;p&gt;Such embedding models can be used as pretrained models to generate embeddings for Machine Learning models, but &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt;s produce their own embeddings as part of the input layer and they get updated during training.
The advantage of optimizing the embeddings as part of the training is that they get optimized to the specific task and data at hand.&lt;/p&gt;</description></item><item><title>Word2Vec</title><link>https://davethehuman.com/notes/word2vec/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/word2vec/</guid><description>&lt;p&gt;&lt;em&gt;Word2Vec&lt;/em&gt; is one of the earlier and most popular examples of word &lt;a href="https://davethehuman.com/notes/embedding/"&gt;embedding&lt;/a&gt; approach. It was created training a &lt;a href="https://davethehuman.com/notes/neural-network/"&gt;neural network&lt;/a&gt; architecture that predicts the context of a word given the target word or vice versa.&lt;/p&gt;
&lt;p&gt;The main idea behind this technique is that words that appear in similar contexts tend to have similar meanings, and consequently, when projected into two-dimensional word embeddings for visualization, simple terms are displayed as clustered together.&lt;/p&gt;</description></item><item><title>BPE</title><link>https://davethehuman.com/notes/bpe/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/bpe/</guid><description>&lt;p&gt;&lt;em&gt;BPE&lt;/em&gt; stands for &lt;em&gt;Byte Pair Encoding&lt;/em&gt;, a method to split into &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt;s that can represent both common and rare words using a mix of full words and sub-words units. Spaces are also included in tokens, and this helps &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt; detect word boundaries.&lt;/p&gt;
&lt;p&gt;Using a BPE &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt;, the correct &lt;a href="https://davethehuman.com/notes/encoding/"&gt;encoding&lt;/a&gt; and &lt;a href="https://davethehuman.com/notes/decoding/"&gt;decoding&lt;/a&gt; of unknown out-of-&lt;a href="https://davethehuman.com/notes/vocabulary/"&gt;vocabulary&lt;/a&gt; words is possible without an explicit &lt;code&gt;&amp;lt;|unk|&amp;gt;&lt;/code&gt; token.&lt;/p&gt;
&lt;p&gt;In short, &lt;em&gt;BPE&lt;/em&gt; builds its vocabulary by iteratively merging frequent characters into subwords and frequent subwords into words.
For example, it starts with adding single characters to the vocabulary (&lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, etc.), then at the following stage it merges the most frequent characters combinations into subwords (e.g. &lt;code&gt;d&lt;/code&gt; and &lt;code&gt;e&lt;/code&gt; may be merged into &lt;code&gt;de&lt;/code&gt;), dependent from a frequency cutoff.&lt;/p&gt;</description></item><item><title>decoding</title><link>https://davethehuman.com/notes/decoding/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/decoding/</guid><description>&lt;p&gt;When a &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt; performs the process of &lt;em&gt;decoding&lt;/em&gt; (through its &lt;code&gt;decode&lt;/code&gt; method), a list of IDs representing &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt;s is converted to natural language.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;input_token_ids_list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;19152&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;20238&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;358&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;646&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;944&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;653&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;429&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(input_token_ids_list)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(text)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;pre class="code-output"&gt;Sorry Dave, I can&amp;#39;t do that&lt;/pre&gt;

&lt;p&gt;The other way around from natural language to IDs is called &lt;a href="https://davethehuman.com/notes/encoding/"&gt;encoding&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>encoding</title><link>https://davethehuman.com/notes/encoding/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/encoding/</guid><description>&lt;p&gt;When a &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt; performs the process of &lt;em&gt;encoding&lt;/em&gt; (through its &lt;em&gt;encode&lt;/em&gt; method), a natural language text is broken into &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt;s that are then converted to IDs.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Even notes can have code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prompt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Sorry Dave, I can&amp;#39;t do that&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;input_token_ids_list &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(prompt)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(input_token_ids_list)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;pre class="code-output"&gt;[19152, 20238, 11, 358, 646, 944, 653, 429]&lt;/pre&gt;

&lt;p&gt;The way back from IDs to natural language is called &lt;a href="https://davethehuman.com/notes/decoding/"&gt;decoding&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>vocabulary</title><link>https://davethehuman.com/notes/vocabulary/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/vocabulary/</guid><description>&lt;p&gt;The number of &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt;s that can be handled by a &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A larger vocabulary in &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;increases the model size because the &lt;a href="https://davethehuman.com/notes/embedding/"&gt;embedding&lt;/a&gt; and output layers must store more &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt; representations&lt;/li&gt;
&lt;li&gt;increases the per-token compute cost of producing next-token probabilities&lt;/li&gt;
&lt;li&gt;allows more words to be represented as single tokens rather than being split into subword components; this can reduce the sequence length since less tokens are required to represent a sentence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the tradeoff is between a larger vocabulary with somewhat higher per-token cost and a smaller vocabulary that often produces longer token sequences.&lt;/p&gt;</description></item><item><title>token</title><link>https://davethehuman.com/notes/token/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/token/</guid><description>&lt;p&gt;A &lt;em&gt;token&lt;/em&gt; is not necessary an entire word: it can be defined as a small unit of text that gets processed by a language model.&lt;/p&gt;
&lt;p&gt;It can be a full word, part of a word, or even punctuation depending on how the text is split and mapped to IDs by the &lt;a href="https://davethehuman.com/notes/tokenizer/"&gt;tokenizer&lt;/a&gt;.
E.g. the sentence &lt;code&gt;Sorry Dave, I can't do that&lt;/code&gt; can be broken into tokens like this:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;19152 --&amp;gt; Sorry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;20238 --&amp;gt; Dave
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 --&amp;gt; ,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;358 --&amp;gt; I
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;646 --&amp;gt; can
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;944 --&amp;gt; &amp;#39;t
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;653 --&amp;gt; do
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;429 --&amp;gt; that&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The ID mapping is necessary to make the model ingest the tokens.&lt;/p&gt;</description></item><item><title>tokenizer</title><link>https://davethehuman.com/notes/tokenizer/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/tokenizer/</guid><description>&lt;p&gt;A &lt;em&gt;tokenizer&lt;/em&gt; is a critical component of the &lt;a href="https://davethehuman.com/notes/llm/"&gt;LLM&lt;/a&gt; text processing and generation pipeline even though it is not directly part of it.
It splits the text into &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt;s that get converted into numerical IDs to be ingested by the language model (&lt;a href="https://davethehuman.com/notes/encoding/"&gt;encoding&lt;/a&gt;) and it decodes back the LLM&amp;rsquo;s output to human-readable text (&lt;a href="https://davethehuman.com/notes/decoding/"&gt;decoding&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Tokenization is usually done on a &lt;a href="https://davethehuman.com/notes/dataset/"&gt;Dataset&lt;/a&gt; within a &lt;a href="https://davethehuman.com/notes/dataloader/"&gt;DataLoader&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example code for a basic tokenizer:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SimpleTokenizerV2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self, vocab):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;str_to_int &lt;span style="color:#f92672"&gt;=&lt;/span&gt; vocab &lt;span style="color:#75715e"&gt;#stores the vocabulary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;int_to_str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {i:s &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; s,i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; vocab&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items()} &lt;span style="color:#75715e"&gt;#creates inverse vocabulary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;encode&lt;/span&gt;(self, text): 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#75715e"&gt;#processes the input text into token ids&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; preprocessed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;([,.:;?_!&amp;#34;()&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;]|--|\s)&amp;#39;&lt;/span&gt;,text)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; preprocessed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [item&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip() &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; item &lt;span style="color:#f92672"&gt;in&lt;/span&gt; preprocessed &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; item&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip()]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#replaces unknown words by &amp;lt;|unk|&amp;gt; tokens&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; preprocessed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [item &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; item &lt;span style="color:#f92672"&gt;in&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;str_to_int &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;|unk|&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; item &lt;span style="color:#f92672"&gt;in&lt;/span&gt; preprocessed]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;str_to_int[s] &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; s &lt;span style="color:#f92672"&gt;in&lt;/span&gt; preprocessed]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ids
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;decode&lt;/span&gt;(self, ids): &lt;span style="color:#75715e"&gt;#converts token ids back into text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join([self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;int_to_str[i] &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; ids])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sub(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\s+([,.?!&amp;#34;()&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;])&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\1&amp;#39;&lt;/span&gt;, text) &lt;span style="color:#75715e"&gt;#removes spaces before the specified punctuation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; text&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>LLM</title><link>https://davethehuman.com/notes/llm/</link><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate><guid>https://davethehuman.com/notes/llm/</guid><description>&lt;p&gt;An &lt;em&gt;LLM (Large Language Model)&lt;/em&gt; is a type of artificial intelligence trained on humongous datasets of text to understand, generate, and manipulate human language.
They are built using &lt;a href="https://davethehuman.com/notes/transformer/"&gt;transformer&lt;/a&gt; architectures and function by predicting the next most likely &lt;a href="https://davethehuman.com/notes/token/"&gt;token&lt;/a&gt; (word or part of a word) in a sequence.&lt;/p&gt;
&lt;p&gt;The core technical concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;scale&lt;/strong&gt;: &amp;ldquo;Large&amp;rdquo; refers to both the training data (petabytes of text) and the &lt;a href="https://davethehuman.com/notes/parameters/"&gt;parameters&lt;/a&gt; count (billions)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://davethehuman.com/notes/llm-training-pipeline/"&gt;LLM training pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;context window&lt;/strong&gt;: the maximum amount of text the model can &amp;ldquo;hold in mind&amp;rdquo; at one time during a single conversation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main capabilities:&lt;/p&gt;</description></item></channel></rss>