<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>build large language model from scratch on Article</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/</link><description>Recent content in build large language model from scratch on Article</description><generator>Hugo</generator><language>zh</language><atom:link href="https://article.yanick.site/docs/ai/build_a_large_language_model/index.xml" rel="self" type="application/rss+xml"/><item><title>Understanding large language models 理解大型语言模型</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/01_understand_llm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/01_understand_llm/</guid><description>&lt;h2 id="transformer-架构"&gt;Transformer 架构&lt;a class="anchor" href="#transformer-%e6%9e%b6%e6%9e%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;原始 Transformer 架构的简化描述，这是一种用于语言翻译的深度学习模型。Transformer 由两部分组成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编码器：用于处理输入文本并生成文本的嵌入表示（一种在不同维度中捕获许多不同因素的数值表示），&lt;/li&gt;
&lt;li&gt;解码器：可以使用该表示一次生成一个翻译单词。此图显示了翻译过程的最后阶段，其中解码器必须仅生成最后一个单词（“Beispiel”），给定原始输入文本（“This is an example”）和部分翻译的句子（“Das ist ein”），以完成翻译。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744810572856.4g4op8jmek.webp" alt="NeatReader-1744810572856" /&gt;&lt;/p&gt;
&lt;h2 id="变种"&gt;变种&lt;a class="anchor" href="#%e5%8f%98%e7%a7%8d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BERT 及其变体专门从事掩码词预测，即模型预测给定句子中的掩码或隐藏词，如图 1.5 所示。这种独特的训练策略使 BERT 在文本分类任务中具备优势，包括情感预测和文档分类。作为其能力的一个应用，截至本文撰写时，X（以前的 Twitter）使用 BERT 来检测有毒内容。&lt;/li&gt;
&lt;li&gt;GPT 专注于原始 Transformer 架构的解码器部分，并且被设计用于需要生成文本的任务。这包括机器翻译、文本摘要、小说写作、编写计算机代码等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744810578051.7zqmf1mc6j.webp" alt="NeatReader-1744810578051" /&gt;&lt;/p&gt;
&lt;h2 id="构建一个-llm"&gt;构建一个 LLM&lt;a class="anchor" href="#%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa-llm"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;构建大模型架构&lt;/li&gt;
&lt;li&gt;预训练基础模型&lt;/li&gt;
&lt;li&gt;微调&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Working with text data 处理文本数据</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/02_working_with_text/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/02_working_with_text/</guid><description>&lt;h2 id="work-embedings-词嵌入"&gt;Work Embedings 词嵌入&lt;a class="anchor" href="#work-embedings-%e8%af%8d%e5%b5%8c%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;从本质上讲，嵌入是从离散对象（如单词、图像，甚至整个文档）到连续向量空间中点的映射——嵌入的主要目的是将非数值数据转换为神经网络可以处理的格式。虽然词嵌入是文本嵌入最常见的形式，但也有用于句子、段落或整篇文档的嵌入。句子或段落嵌入是检索增强生成的流行选择。检索增强生成将生成（如生成文本）与检索（如搜索外部知识库）相结合，以在生成文本时提取相关信息，这是本书范围之外的技术。由于我们的目标是训练类似 GPT 的 LLMs，它学习一次生成一个单词，我们将专注于词嵌入。&lt;/p&gt;
&lt;h3 id="word2vec"&gt;Word2Vec&lt;a class="anchor" href="#word2vec"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;早期且最流行的例子之一是 Word2Vec 方法。Word2Vec 训练神经网络架构，通过给定目标词预测词的上下文或反之来生成词嵌入。Word2Vec 背后的主要思想是，出现在相似上下文中的词往往具有相似的含义。因此，当为了可视化目的投影到二维词嵌入中时，相似的术语会聚集在一起&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744812155091.26lo5rvmqp.webp" alt="NeatReader-1744812155091" /&gt;&lt;/p&gt;
&lt;p&gt;不幸的是，高维嵌入对可视化提出了挑战，因为我们的感官感知和常见的图形表示本质上仅限于三维或更少维度，这就是为什么图 2.3 在二维散点图中显示二维嵌入的原因。然而，当使用LLMs时，我们通常使用具有更高维度的嵌入。对于 GPT-2 和 GPT-3 两者，嵌入大小（通常称为模型隐藏状态的维度）根据具体的模型变体和大小而变化。这是在性能和效率之间的权衡。最小的 GPT-2 模型（117M 和 125M 参数）使用 768 维的嵌入大小来提供具体示例。最大的 GPT-3 模型（175B 参数）使用 12,288 维的嵌入大小。&lt;/p&gt;
&lt;h2 id="tokenizing-text-分词"&gt;Tokenizing text 分词&lt;a class="anchor" href="#tokenizing-text-%e5%88%86%e8%af%8d"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如何将输入文本拆分为单个标记，这是创建LLM的嵌入所需的预处理步骤。这些标记可以是单个单词或特殊字符，包括标点符号
&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744812366148.77dqxc70pq.webp" alt="NeatReader-1744812366148" /&gt;&lt;/p&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;with&lt;/span&gt; open(&lt;span style="color:#e6db74"&gt;&amp;#34;the-verdict.txt&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, encoding&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; raw_text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()
&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;]|--|&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;s)&amp;#39;&lt;/span&gt;, raw_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; all_words &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sorted(set(preprocessed))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vocab_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(all_words)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(vocab_size)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="token-to-id-词转-id"&gt;Token to ID 词转 ID&lt;a class="anchor" href="#token-to-id-%e8%af%8d%e8%bd%ac-id"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744863629444.361rjslp7j.webp" alt="NeatReader-1744863629444" /&gt;&lt;/p&gt;</description></item><item><title>Coding attention mechanisms 注意力机制</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/03_coding_attention_mechanisms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/03_coding_attention_mechanisms/</guid><description>&lt;p&gt;本章，我们来到第 LLM 的第二个部分&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744895959920.3k87b735s2.webp" alt="NeatReader-1744895959920" /&gt;&lt;/p&gt;
&lt;h2 id="the-problem-with-modeling-long-sequences-长序列建模的问题"&gt;The problem with modeling long sequences 长序列建模的问题&lt;a class="anchor" href="#the-problem-with-modeling-long-sequences-%e9%95%bf%e5%ba%8f%e5%88%97%e5%bb%ba%e6%a8%a1%e7%9a%84%e9%97%ae%e9%a2%98"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;假设我们想要开发一个将文本从一种语言翻译成另一种语言的语言翻译模型。
&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744896100401.4ub4hinxe9.webp" alt="NeatReader-1744896100401" /&gt;&lt;/p&gt;
&lt;p&gt;为了解决这个问题，通常使用具有两个子模块（编码器和解码器）的深度神经网络。编码器的工作是首先读取并处理整个文本，然后解码器生成翻译后的文本。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744896404188.26lo761d9v.webp" alt="NeatReader-1744896404188" /&gt;&lt;/p&gt;
&lt;p&gt;编码器 - 解码器循环神经网络的一个大限制是，在解码阶段，循环神经网络无法直接访问编码器中的早期隐藏状态。因此，它仅依赖于当前隐藏状态，该状态封装了所有相关信息。这可能导致上下文丢失，特别是在依赖关系可能跨越很长距离的复杂句子中。&lt;/p&gt;
&lt;p&gt;因为这样的缺点，促使了注意力机制的设计。&lt;/p&gt;
&lt;h2 id="capturing-data-dependencies-with-attention-mechanisms-用注意力机制捕获数据依赖关系"&gt;Capturing data dependencies with attention mechanisms 用注意力机制捕获数据依赖关系&lt;a class="anchor" href="#capturing-data-dependencies-with-attention-mechanisms-%e7%94%a8%e6%b3%a8%e6%84%8f%e5%8a%9b%e6%9c%ba%e5%88%b6%e6%8d%95%e8%8e%b7%e6%95%b0%e6%8d%ae%e4%be%9d%e8%b5%96%e5%85%b3%e7%b3%bb"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744896633028.9rjlbdd56g.webp" alt="NeatReader-1744896633028" /&gt;&lt;/p&gt;
&lt;h2 id="attending-to-different-parts-of-the-input-with-self-attention-利用自注意力关注输入的不同部分"&gt;Attending to different parts of the input with self-attention 利用自注意力关注输入的不同部分&lt;a class="anchor" href="#attending-to-different-parts-of-the-input-with-self-attention-%e5%88%a9%e7%94%a8%e8%87%aa%e6%b3%a8%e6%84%8f%e5%8a%9b%e5%85%b3%e6%b3%a8%e8%be%93%e5%85%a5%e7%9a%84%e4%b8%8d%e5%90%8c%e9%83%a8%e5%88%86"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在自注意力 (self-attention) 机制中，“self” 指的是该机制通过关联单个输入序列内的不同位置来计算注意力权重的能力。它评估并学习输入本身各个部分（如句子中的单词或图像中的像素）之间的关系和依赖关系。&lt;/p&gt;
&lt;h3 id="a-simple-self-attention-mechanism-without-trainable-weights--一个没有可训练权重的简单自注意力机制"&gt;A simple self-attention mechanism without trainable weights 一个没有可训练权重的简单自注意力机制&lt;a class="anchor" href="#a-simple-self-attention-mechanism-without-trainable-weights--%e4%b8%80%e4%b8%aa%e6%b2%a1%e6%9c%89%e5%8f%af%e8%ae%ad%e7%bb%83%e6%9d%83%e9%87%8d%e7%9a%84%e7%ae%80%e5%8d%95%e8%87%aa%e6%b3%a8%e6%84%8f%e5%8a%9b%e6%9c%ba%e5%88%b6"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1744897331316.1zigbqz3oy.webp" alt="NeatReader-1744897331316" /&gt;&lt;/p&gt;
&lt;p&gt;自注意力的目标是为每个输入元素计算一个上下文向量，该向量结合了所有其他输入元素的信息。在这个例子中，我们计算上下文向量
&lt;span class="book-katex"&gt;\( z^{\left(2\right)} \)&lt;/span&gt;&lt;link rel="stylesheet" href="https://article.yanick.site/katex/katex.min.css" /&gt;&lt;script defer src="https://article.yanick.site/katex/katex.min.js"&gt;&lt;/script&gt;&lt;script defer src="https://article.yanick.site/katex/auto-render.min.js" onload="renderMathInElement(document.body, {&amp;#34;delimiters&amp;#34;:[{&amp;#34;left&amp;#34;:&amp;#34;$$&amp;#34;,&amp;#34;right&amp;#34;:&amp;#34;$$&amp;#34;,&amp;#34;display&amp;#34;:true},{&amp;#34;left&amp;#34;:&amp;#34;\\(&amp;#34;,&amp;#34;right&amp;#34;:&amp;#34;\\)&amp;#34;,&amp;#34;display&amp;#34;:false},{&amp;#34;left&amp;#34;:&amp;#34;\\[&amp;#34;,&amp;#34;right&amp;#34;:&amp;#34;\\]&amp;#34;,&amp;#34;display&amp;#34;:true}]});"&gt;&lt;/script&gt;
。计算&lt;span class="book-katex"&gt;\( z^{\left(2\right)} \)&lt;/span&gt; 时，每个输入元素的重要性或贡献由注意力权重 &lt;span class="book-katex"&gt;\( a_{21} \)&lt;/span&gt; 到 &lt;span class="book-katex"&gt;\( a_{2T} \)&lt;/span&gt; 决定。在计算 &lt;span class="book-katex"&gt;\( z^{\left(2\right)} \)&lt;/span&gt; 时，注意力权重是相对于输入元素 &lt;span class="book-katex"&gt;\( x^{\left(2\right)} \)&lt;/span&gt; 和所有其他输入计算的。&lt;/p&gt;</description></item><item><title>Implementing a GPT model from scratch to generate text 从零实现 GPT 模型</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/04_implementing_a_gpt_model_from_scratch_to_generate_text/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/04_implementing_a_gpt_model_from_scratch_to_generate_text/</guid><description>&lt;h2 id="coding-an-llm-architecture-编码-llm-架构"&gt;Coding an LLM architecture 编码 LLM 架构&lt;a class="anchor" href="#coding-an-llm-architecture-%e7%bc%96%e7%a0%81-llm-%e6%9e%b6%e6%9e%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用如下配置&lt;/p&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;GPT_CONFIG_124M &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 style="color:#e6db74"&gt;&amp;#34;vocab_size&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50257&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Vocabulary size 词汇量大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;context_length&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Context length 上下文长度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;768&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Embedding dimension 嵌入维度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;n_heads&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Number of attention heads 多头注意力数量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Number of layers 层数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;drop_rate&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Dropout rate Dropout 比例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;qkv_bias&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Query-Key-Value bias&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个抽象架构如下&lt;/p&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:#f92672"&gt;import&lt;/span&gt; torch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; torch.nn &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; nn
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DummyGPTModel&lt;/span&gt;(nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Module):
&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, cfg):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__init__&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;tok_emb &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Embedding(cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;vocab_size&amp;#34;&lt;/span&gt;], cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&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;pos_emb &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Embedding(cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;context_length&amp;#34;&lt;/span&gt;], cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&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;drop_emb &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Dropout(cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;drop_rate&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#1 TransformerBlock 占位符&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;trf_blocks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Sequential( 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;[DummyTransformerBlock(cfg) 
&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; _ &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&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; &lt;span style="color:#75715e"&gt;#2 LayerNorm&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;final_norm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DummyLayerNorm(cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&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;out_head &lt;span style="color:#f92672"&gt;=&lt;/span&gt; nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Linear(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;], cfg[&lt;span style="color:#e6db74"&gt;&amp;#34;vocab_size&amp;#34;&lt;/span&gt;], bias&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;
&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;forward&lt;/span&gt;(self, in_idx):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; batch_size, seq_len &lt;span style="color:#f92672"&gt;=&lt;/span&gt; in_idx&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tok_embeds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tok_emb(in_idx)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos_embeds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pos_emb(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;arange(seq_len, device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;in_idx&lt;span style="color:#f92672"&gt;.&lt;/span&gt;device)
&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; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tok_embeds &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pos_embeds
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;drop_emb(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;trf_blocks(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;final_norm(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logits &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;out_head(x)
&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; logits
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DummyTransformerBlock&lt;/span&gt;(nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Module): 
&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, cfg):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__init__&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;forward&lt;/span&gt;(self, x): 
&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; x
&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DummyLayerNorm&lt;/span&gt;(nn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Module): 
&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, normalized_shape, eps&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1e-5&lt;/span&gt;): 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__init__&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;forward&lt;/span&gt;(self, x):
&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; x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在我们就有了一个初始的框架，调用也可以跑通&lt;/p&gt;</description></item><item><title>Pretraining on unlabeled data 在未标签的数据进行预训练</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/05_pretraining_on_unlabeled_data/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/05_pretraining_on_unlabeled_data/</guid><description>&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1745479359000.7phqgylcc.png" alt="NeatReader-1745479359000" /&gt;&lt;/p&gt;
&lt;p&gt;我们来到了第二部分，关于训练&lt;/p&gt;
&lt;h2 id="evaluating-generative-text-models"&gt;Evaluating generative text models&lt;a class="anchor" href="#evaluating-generative-text-models"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;简要回顾了第四章的文本生成后，我们将设置我们的 LLM 进行文本生成，然后讨论评估生成文本质量的基本方法。接着，我们将计算训练和验证损失。&lt;/p&gt;
&lt;h3 id="using-gpt-to-generate-text"&gt;Using GPT to generate text&lt;a class="anchor" href="#using-gpt-to-generate-text"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;使用 GPTModel 实例，我们采用第 4 章中的 generate_text_simple 函数，并引入两个实用的函数： text_to_token_ ids 和 token_ids_ to_text 。这些函数便于在文本和 token 表示之间进行转换&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1745479730620.3uv1e02cgz.png" alt="NeatReader-1745479730620" /&gt;&lt;/p&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:#f92672"&gt;import&lt;/span&gt; tiktoken
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; chapter04 &lt;span style="color:#f92672"&gt;import&lt;/span&gt; generate_text_simple
&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;text_to_token_ids&lt;/span&gt;(text, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoded &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode(text, allowed_special&lt;span style="color:#f92672"&gt;=&lt;/span&gt;{&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;|endoftext|&amp;gt;&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoded_tensor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tensor(encoded)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;unsqueeze(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#1&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; encoded_tensor
&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;token_ids_to_text&lt;/span&gt;(token_ids, tokenizer):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; token_ids&lt;span style="color:#f92672"&gt;.&lt;/span&gt;squeeze(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#2&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; tokenizer&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(flat&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tolist())
&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;start_context &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Every effort moves you&amp;#34;&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;token_ids &lt;span style="color:#f92672"&gt;=&lt;/span&gt; generate_text_simple(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model&lt;span style="color:#f92672"&gt;=&lt;/span&gt;model,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; idx&lt;span style="color:#f92672"&gt;=&lt;/span&gt;text_to_token_ids(start_context, tokenizer),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_new_tokens&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;GPT_CONFIG_124M[&lt;span style="color:#e6db74"&gt;&amp;#34;context_length&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;print(&lt;span style="color:#e6db74"&gt;&amp;#34;Output text:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, token_ids_to_text(token_ids, tokenizer))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="calculating-the-text-generation-loss-计算文本生成损失"&gt;Calculating the text generation loss 计算文本生成损失&lt;a class="anchor" href="#calculating-the-text-generation-loss-%e8%ae%a1%e7%ae%97%e6%96%87%e6%9c%ac%e7%94%9f%e6%88%90%e6%8d%9f%e5%a4%b1"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://github.com/yanickxia/picx-images-hosting/raw/master/NeatReader-1745499271714.8vn45vw0n2.png" alt="NeatReader-1745499271714" /&gt;&lt;/p&gt;</description></item><item><title>Fine-tuning for classification 用于分类的微调</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/06_fine_tuning_for_classification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/06_fine_tuning_for_classification/</guid><description>&lt;h2 id="different-categories-of-fine-tuning-不同类别的微调"&gt;Different categories of fine-tuning 不同类别的微调&lt;a class="anchor" href="#different-categories-of-fine-tuning-%e4%b8%8d%e5%90%8c%e7%b1%bb%e5%88%ab%e7%9a%84%e5%be%ae%e8%b0%83"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;微调语言模型最常见的方法是指令微调与分类微调。指令微调涉及在一组任务上训练语言模型，使用特定的指令来提高其理解和执行自然语言提示中描述的任务的能力&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jsd.cdn.zzko.cn/gh/yanickxia/picx-images-hosting@master/image.41y9e5uswf.webp" alt="image" /&gt;&lt;/p&gt;
&lt;h2 id="preparing-the-dataset-准备数据集"&gt;Preparing the dataset 准备数据集&lt;a class="anchor" href="#preparing-the-dataset-%e5%87%86%e5%a4%87%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&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:#f92672"&gt;import&lt;/span&gt; urllib.request
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; zipfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; pathlib &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Path
&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;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zip_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sms_spam_collection.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;extracted_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sms_spam_collection&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;data_file_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Path(extracted_path) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SMSSpamCollection.tsv&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;
&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;download_and_unzip_spam_data&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url, zip_path, extracted_path, data_file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; data_file_path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;data_file_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; already exists. Skipping download &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;and extraction.&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; &lt;span style="color:#66d9ef"&gt;return&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;with&lt;/span&gt; urllib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;request&lt;span style="color:#f92672"&gt;.&lt;/span&gt;urlopen(url) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; response: &lt;span style="color:#75715e"&gt;#1 下载文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(zip_path, &lt;span style="color:#e6db74"&gt;&amp;#34;wb&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; out_file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; out_file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read())
&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;with&lt;/span&gt; zipfile&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ZipFile(zip_path, &lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; zip_ref: &lt;span style="color:#75715e"&gt;#2 解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; zip_ref&lt;span style="color:#f92672"&gt;.&lt;/span&gt;extractall(extracted_path)
&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; original_file_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Path(extracted_path) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SMSSpamCollection&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rename(original_file_path, data_file_path) &lt;span style="color:#75715e"&gt;#3 保存文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;File downloaded and saved as &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;data_file_path&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&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;download_and_unzip_spam_data(url, zip_path, extracted_path, data_file_path)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;数据集以制表符分隔的文本文件形式保存在 sms_spam_collection 文件夹中的 SMSSpamCollection.tsv，使用 PD 阅读&lt;/p&gt;</description></item><item><title>Fine-tuning to follow instructions 微调以遵循指令</title><link>https://article.yanick.site/docs/ai/build_a_large_language_model/07_fine-tuning_to_follow_instructions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://article.yanick.site/docs/ai/build_a_large_language_model/07_fine-tuning_to_follow_instructions/</guid><description>&lt;h2 id="preparing-a-dataset-for-supervised-instruction-fine-tuning-准备用于监督指令微调的数据集"&gt;Preparing a dataset for supervised instruction fine-tuning 准备用于监督指令微调的数据集&lt;a class="anchor" href="#preparing-a-dataset-for-supervised-instruction-fine-tuning-%e5%87%86%e5%a4%87%e7%94%a8%e4%ba%8e%e7%9b%91%e7%9d%a3%e6%8c%87%e4%bb%a4%e5%be%ae%e8%b0%83%e7%9a%84%e6%95%b0%e6%8d%ae%e9%9b%86"&gt;#&lt;/a&gt;&lt;/h2&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:#f92672"&gt;import&lt;/span&gt; json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; urllib
&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;download_and_load_file&lt;/span&gt;(file_path, url):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(file_path):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; urllib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;request&lt;span style="color:#f92672"&gt;.&lt;/span&gt;urlopen(url) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; response:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; response&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(file_path, &lt;span style="color:#e6db74"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;, encoding&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(text_data)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;: &lt;span style="color:#75715e"&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(file_path, &lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;, encoding&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;read()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; open(file_path, &lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; json&lt;span style="color:#f92672"&gt;.&lt;/span&gt;load(file)
&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; data
&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;format_input&lt;/span&gt;(entry):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instruction_text &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 style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Below is an instruction that describes a task. &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Write a response that appropriately completes the request.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&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;n### Instruction:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;entry[&lt;span style="color:#e6db74"&gt;&amp;#39;instruction&amp;#39;&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_text &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 style="color:#e6db74"&gt;f&lt;/span&gt;&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;n### Input:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;entry[&lt;span style="color:#e6db74"&gt;&amp;#39;input&amp;#39;&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; entry[&lt;span style="color:#e6db74"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&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; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; instruction_text &lt;span style="color:#f92672"&gt;+&lt;/span&gt; input_text
&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;if&lt;/span&gt; __name__ &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; file_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;instruction-data.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &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 style="color:#e6db74"&gt;&amp;#34;https://raw.githubusercontent.com/rasbt/LLMs-from-scratch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/main/ch07/01_main-chapter-code/instruction-data.json&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; download_and_load_file(file_path, url)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; format_input(data[&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; desired_response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&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;n### Response:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;data[&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;][&lt;span style="color:#e6db74"&gt;&amp;#39;output&amp;#39;&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(model_input &lt;span style="color:#f92672"&gt;+&lt;/span&gt; desired_response)
&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; train_portion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; int(len(data) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.85&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test_portion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; int(len(data) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; val_portion &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(data) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; train_portion &lt;span style="color:#f92672"&gt;-&lt;/span&gt; test_portion &lt;span style="color:#75715e"&gt;# 3&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; train_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data[:train_portion]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; test_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data[train_portion:train_portion &lt;span style="color:#f92672"&gt;+&lt;/span&gt; test_portion]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; val_data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data[train_portion &lt;span style="color:#f92672"&gt;+&lt;/span&gt; test_portion:]
&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; print(&lt;span style="color:#e6db74"&gt;&amp;#34;Training set length:&amp;#34;&lt;/span&gt;, len(train_data))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;Validation set length:&amp;#34;&lt;/span&gt;, len(val_data))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#34;Test set length:&amp;#34;&lt;/span&gt;, len(test_data))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="organizing-data-into-training-batches-将数据组织成训练批次"&gt;Organizing data into training batches 将数据组织成训练批次&lt;a class="anchor" href="#organizing-data-into-training-batches-%e5%b0%86%e6%95%b0%e6%8d%ae%e7%bb%84%e7%bb%87%e6%88%90%e8%ae%ad%e7%bb%83%e6%89%b9%e6%ac%a1"&gt;#&lt;/a&gt;&lt;/h2&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:#f92672"&gt;import&lt;/span&gt; torch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; torch.utils.data &lt;span style="color:#f92672"&gt;import&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;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;InstructionDataset&lt;/span&gt;(Dataset):
&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, data, tokenizer):
&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;data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data
&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;encoded_texts &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 style="color:#66d9ef"&gt;for&lt;/span&gt; entry &lt;span style="color:#f92672"&gt;in&lt;/span&gt; data: &lt;span style="color:#75715e"&gt;#1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; instruction_plus_input &lt;span style="color:#f92672"&gt;=&lt;/span&gt; format_input(entry)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response_text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&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;n### Response:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;entry[&lt;span style="color:#e6db74"&gt;&amp;#39;output&amp;#39;&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; full_text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; instruction_plus_input &lt;span style="color:#f92672"&gt;+&lt;/span&gt; response_text
&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;encoded_texts&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(
&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;encode(full_text)
&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;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__getitem__&lt;/span&gt;(self, index):
&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;encoded_texts[index]
&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;data)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="creating-data-loaders-for-an-instruction-dataset-为指令数据集创建数据加载器"&gt;Creating data loaders for an instruction dataset 为指令数据集创建数据加载器&lt;a class="anchor" href="#creating-data-loaders-for-an-instruction-dataset-%e4%b8%ba%e6%8c%87%e4%bb%a4%e6%95%b0%e6%8d%ae%e9%9b%86%e5%88%9b%e5%bb%ba%e6%95%b0%e6%8d%ae%e5%8a%a0%e8%bd%bd%e5%99%a8"&gt;#&lt;/a&gt;&lt;/h2&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:#f92672"&gt;from&lt;/span&gt; torch.utils.data &lt;span style="color:#f92672"&gt;import&lt;/span&gt; DataLoader
&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;num_workers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#75715e"&gt;#1&lt;/span&gt;
&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;8&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;torch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;manual_seed(&lt;span style="color:#ae81ff"&gt;123&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;train_dataset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; InstructionDataset(train_data, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;train_loader &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; train_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; collate_fn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;customized_collate_fn,
&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;num_workers
&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;val_dataset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; InstructionDataset(val_data, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;val_loader &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; val_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; collate_fn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;customized_collate_fn,
&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; drop_last&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; num_workers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;num_workers
&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;test_dataset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; InstructionDataset(test_data, tokenizer)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test_loader &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; test_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; collate_fn&lt;span style="color:#f92672"&gt;=&lt;/span&gt;customized_collate_fn,
&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; drop_last&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; num_workers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;num_workers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="loading-a-pretrained-llm-加载预训练的-llm"&gt;Loading a pretrained LLM 加载预训练的 LLM&lt;a class="anchor" href="#loading-a-pretrained-llm-%e5%8a%a0%e8%bd%bd%e9%a2%84%e8%ae%ad%e7%bb%83%e7%9a%84-llm"&gt;#&lt;/a&gt;&lt;/h2&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:#f92672"&gt;from&lt;/span&gt; gpt_download &lt;span style="color:#f92672"&gt;import&lt;/span&gt; download_and_load_gpt2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; chapter04 &lt;span style="color:#f92672"&gt;import&lt;/span&gt; GPTModel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; chapter05 &lt;span style="color:#f92672"&gt;import&lt;/span&gt; load_weights_into_gpt
&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;BASE_CONFIG &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 style="color:#e6db74"&gt;&amp;#34;vocab_size&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;50257&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Vocabulary size&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;context_length&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Context length&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;drop_rate&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.0&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# Dropout rate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;qkv_bias&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Query-key-value bias&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;model_configs &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 style="color:#e6db74"&gt;&amp;#34;gpt2-small (124M)&amp;#34;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;768&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_heads&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gpt2-medium (355M)&amp;#34;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_heads&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gpt2-large (774M)&amp;#34;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1280&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_heads&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gpt2-xl (1558M)&amp;#34;&lt;/span&gt;: {&lt;span style="color:#e6db74"&gt;&amp;#34;emb_dim&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1600&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_layers&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;48&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;n_heads&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;25&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;CHOOSE_MODEL &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gpt2-medium (355M)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BASE_CONFIG&lt;span style="color:#f92672"&gt;.&lt;/span&gt;update(model_configs[CHOOSE_MODEL])
&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;model_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CHOOSE_MODEL&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;)[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lstrip(&lt;span style="color:#e6db74"&gt;&amp;#34;(&amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;rstrip(&lt;span style="color:#e6db74"&gt;&amp;#34;)&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;settings, params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; download_and_load_gpt2(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;model_size, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; models_dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model &lt;span style="color:#f92672"&gt;=&lt;/span&gt; GPTModel(BASE_CONFIG)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load_weights_into_gpt(model, params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;model&lt;span style="color:#f92672"&gt;.&lt;/span&gt;eval();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;训练逻辑如下&lt;/p&gt;</description></item></channel></rss>