<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>LLM on Blog</title>
    <link>/tags/llm/</link>
    <description>Recent content in LLM on Blog</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 21 Aug 2026 08:00:00 +0800</lastBuildDate>
    <atom:link href="/tags/llm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【LLM】从零开始学大语言模型 | 6 | Encoder-Decoder和掩码</title>
      <link>/posts/encoder%E5%92%8Cdecoder/</link>
      <pubDate>Fri, 21 Aug 2026 08:00:00 +0800</pubDate>
      <guid>/posts/encoder%E5%92%8Cdecoder/</guid>
      <description>&lt;h1 id=&#34;encoder-decoder-架构与-mask-机制从翻译模型到自回归生成&#34;&gt;Encoder-Decoder 架构与 Mask 机制：从翻译模型到自回归生成&lt;/h1&gt;
&lt;p&gt;在理解了 Attention、Multi-Head Attention、FFN 以及 Transformer Block 之后，我们已经拥有了一个可以反复堆叠的基础模块。下一步要回答的问题是：这些模块如何组成一个完整的模型？在 2017 年的论文《Attention Is All You Need》中，Transformer 被设计成一个 Encoder-Decoder 架构，最初主要用于机器翻译这样的序列到序列任务。也就是说，输入是一段序列，输出也是一段序列，而且输入和输出长度可以不同。&lt;/p&gt;
&lt;p&gt;这篇文章将从整体架构、Decoder 的特殊结构、Mask 机制、训练时的 Loss 与反向传播，以及多层 Decoder 中 Cross-Attention 的 KV 来源几个方面，把 Encoder-Decoder Transformer 的工作方式完整梳理一遍。&lt;/p&gt;
&lt;h2 id=&#34;一从单个-transformer-block-到-encoder-decoder-架构&#34;&gt;一、从单个 Transformer Block 到 Encoder-Decoder 架构&lt;/h2&gt;
&lt;h3 id=&#34;1-encoder-与-decoder-的分工&#34;&gt;1. Encoder 与 Decoder 的分工&lt;/h3&gt;
&lt;p&gt;可以把 Encoder-Decoder 结构理解成一个翻译官的工作台。&lt;/p&gt;
&lt;p&gt;左侧是 Encoder，也就是编码器。它的任务是深度阅读源语言。例如输入一句中文：“我 / 爱 / AI”，Encoder 会通过多层网络逐步理解这些词之间的关系：谁是主语，谁是谓语，哪个词修饰哪个词，整句话的整体语义是什么。经过若干层 Encoder Block 之后，模型得到的不是一串孤立的词向量，而是一组包含上下文信息的特征向量。可以把它看作 Encoder 对源语言句子进行抽象压缩后得到的“语义表示”。&lt;/p&gt;
&lt;p&gt;右侧是 Decoder，也就是解码器。它的任务是逐字生成目标语言。例如它要生成英文：“I / love / AI”。Decoder 不能像 Encoder 那样一次性随意看完整句目标语言的全部内容，因为在真正生成文本时，模型只能依赖已经生成的内容。Decoder 需要一边参考 Encoder 对源语言的理解，一边根据当前已经生成的词预测下一个词。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 7 | Encoder-only架构和BERT</title>
      <link>/posts/bert/</link>
      <pubDate>Fri, 21 Aug 2026 08:00:00 +0800</pubDate>
      <guid>/posts/bert/</guid>
      <description>&lt;h1 id=&#34;encoder-only-架构与-bert-家族理解型大模型的构建方式&#34;&gt;Encoder-only 架构与 BERT 家族：理解型大模型的构建方式&lt;/h1&gt;
&lt;p&gt;在 Transformer 的完整结构中，Encoder 与 Decoder 共同组成了一套既能理解文本、又能生成文本的模型框架。但在真实工业应用中，不同任务对模型能力的要求并不相同。有些任务需要模型不断生成新的词元，例如机器翻译、对话生成、文章续写；而另一些任务只需要模型读懂输入文本，然后给出判断、分类、标注或打分。&lt;/p&gt;
&lt;p&gt;正是因为任务目标不同，Transformer 在后续发展中逐渐演化出了几类典型架构。其中第一类，就是专门面向文本理解任务的 &lt;strong&gt;Encoder-only 架构&lt;/strong&gt;。这一方向最具代表性的模型，是 Google 在 2018 年提出的 &lt;strong&gt;BERT&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文将系统梳理 Encoder-only 架构的设计动机、BERT 的核心训练任务、特殊 Token 的作用，以及“预训练 + 微调”这一改变 NLP 发展路径的技术范式。同时，我也会把一些常见疑问自然地融入解释中，例如：BERT 的伟大是否主要来自训练任务设计？微调时所谓“在顶层加一个分类器”到底是什么意思？Encoder-only 模型最后输出的矩阵又如何接到具体任务上？&lt;/p&gt;
&lt;h2 id=&#34;一从完整-transformer-到-encoder-only&#34;&gt;一、从完整 Transformer 到 Encoder-only&lt;/h2&gt;
&lt;h3 id=&#34;1-encoder-的特长双向理解上下文&#34;&gt;1. Encoder 的特长：双向理解上下文&lt;/h3&gt;
&lt;p&gt;在原始 Transformer 中，Encoder 的职责是接收一段输入序列，并通过多层 Self-Attention 和前馈网络，为序列中的每个词元生成富含上下文信息的表示。&lt;/p&gt;
&lt;p&gt;Encoder 的关键特点是：它的 Self-Attention 通常不限制词元之间的可见范围。对于输入序列中的任意一个词元，它既可以关注左侧上下文，也可以关注右侧上下文。也就是说，模型在表示一个词时，能够同时利用这个词前后的信息。&lt;/p&gt;
&lt;p&gt;举例来说，对于句子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我 今天 去 买 了 苹果&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;如果要理解“苹果”这个词的含义，模型不仅可以看到左侧的“我 今天 去 买 了”，也可以在条件允许时看到右侧可能出现的词。虽然这个例子右侧可能没有更多内容，但在更复杂的句子中，右侧上下文常常非常重要。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;He deposited some money in the bank（他在银行存了钱）&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;与：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 5 | Transformer</title>
      <link>/posts/transformer/</link>
      <pubDate>Fri, 21 Aug 2026 07:00:00 +0800</pubDate>
      <guid>/posts/transformer/</guid>
      <description>&lt;h1 id=&#34;从多头注意力到完整-transformer-block结构原理与训练逻辑的系统讲解&#34;&gt;从多头注意力到完整 Transformer Block：结构、原理与训练逻辑的系统讲解&lt;/h1&gt;
&lt;p&gt;本文假设你已经了解词向量、位置编码以及单头 Self-Attention 的基本思想。在这个基础上，我们继续向前推进：为什么单头注意力不够用？多头注意力到底在做什么？Attention 之后为什么还要接一个前馈网络？残差连接和层归一化为什么是深层 Transformer 能够训练的关键？最终的 Transformer Block 又如何组成一个完整的语言模型？&lt;/p&gt;
&lt;p&gt;我们会尽量把这些问题放在同一条主线里讲清楚：以一个&amp;quot;预测下一个词&amp;quot;的语言模型为例，从输入词向量开始，一步一步说明数据如何被加工，参数如何被训练，以及每个组件为什么必须存在。&lt;/p&gt;
&lt;h2 id=&#34;一从任务出发transformer-在语言模型中做什么&#34;&gt;一、从任务出发：Transformer 在语言模型中做什么&lt;/h2&gt;
&lt;h3 id=&#34;1-语言模型的核心任务&#34;&gt;1. 语言模型的核心任务&lt;/h3&gt;
&lt;p&gt;为了让讨论有明确的目标，我们采用现代大语言模型最常见的训练任务之一：预测下一个词。&lt;/p&gt;
&lt;p&gt;给定一句话的前半部分，例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;今天天气真好，我想去&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;模型的任务是预测下一个最可能出现的词，例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;公园&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这看起来只是&amp;quot;猜下一个词&amp;quot;，但要做好这件事，模型需要理解词义、语法、指代关系、常识推理，甚至语气和语境。因此，Transformer 并不是简单地查表，而是要把原始词向量逐层加工成更适合预测的语义表示。&lt;/p&gt;
&lt;h3 id=&#34;2-transformer-的整体流水线&#34;&gt;2. Transformer 的整体流水线&lt;/h3&gt;
&lt;p&gt;一个典型的 Decoder-only 语言模型，前向过程大致可以概括为：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;词编号 → 词嵌入与位置编码 → 多个 &lt;strong&gt;Transformer Block&lt;/strong&gt; → LM Head → 下一个词的概率分布&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;更具体地说：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输入文本首先被切成 token，并转换为整数编号。&lt;/li&gt;
&lt;li&gt;每个 token 编号通过词嵌入矩阵变成一个稠密向量。&lt;/li&gt;
&lt;li&gt;为了让模型知道 token 的位置，再加入位置编码。&lt;/li&gt;
&lt;li&gt;得到的向量矩阵进入第一个Transformer Block。&lt;/li&gt;
&lt;li&gt;经过多个 Block 的逐层加工后，得到更高层的语义表示。&lt;/li&gt;
&lt;li&gt;最后的 LM Head 将某个位置的隐藏向量映射到词表大小的 logits。&lt;/li&gt;
&lt;li&gt;通过 Softmax 得到下一个词的概率分布。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果输入序列的形状是 &lt;code&gt;[batch_size, seq_len, d_model]&lt;/code&gt;，那么经过每一个 Transformer Block 后，形状通常保持不变，仍然是 &lt;code&gt;[batch_size, seq_len, d_model]&lt;/code&gt;。也就是说，Block 的工作不是改变序列长度或向量维度，而是不断改变每个 token 向量内部的语义内容。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 4 | Attention</title>
      <link>/posts/attention/</link>
      <pubDate>Fri, 21 Aug 2026 06:00:00 +0800</pubDate>
      <guid>/posts/attention/</guid>
      <description>&lt;h1 id=&#34;从注意力机制到自注意力与位置编码transformer-核心机制详解&#34;&gt;从注意力机制到自注意力与位置编码：Transformer 核心机制详解&lt;/h1&gt;
&lt;p&gt;在这篇文章中，我们从一个非常自然的问题出发：为什么深度学习在处理序列信息时，会从 RNN 逐渐走向 Attention，再进一步走向 Transformer 中的 Self-Attention？我们会把注意力机制的直觉、数学公式、工程意义，以及它与 RNN 的本质区别讲清楚，并进一步讨论 Self-Attention 中非常关键的缩放因子、位置信息丢失和位置编码问题。&lt;/p&gt;
&lt;p&gt;为了避免概念混乱，本文会特别澄清几个常见误解：Attention 不是简单地把 RNN 的隐藏状态替换成 Q、K、V；W_Q、W_K、W_V 也不是所谓“三层感知机”；早期 Attention 与现代大模型中常见的 Self-Attention 之间既有历史联系，也有本质差别。&lt;/p&gt;
&lt;h2 id=&#34;一从-rnn-的串行记忆到注意力机制的直觉&#34;&gt;一、从 RNN 的串行记忆到注意力机制的直觉&lt;/h2&gt;
&lt;h3 id=&#34;1-rnn-的串行记忆为什么容易遗忘&#34;&gt;1. RNN 的串行记忆为什么容易遗忘&lt;/h3&gt;
&lt;p&gt;在 RNN 中，序列通常是一个词一个词地被处理。假设当前时刻的输入是 $x_t$，上一时刻的隐藏状态是 $h_{t-1}$，那么当前时刻的隐藏状态可以写成：&lt;/p&gt;
&lt;p&gt;$$
h_t = \tanh(W_{hh}h_{t-1} + W_{xh}x_t+b)
$$&lt;/p&gt;
&lt;p&gt;这里最重要的角色是隐藏状态 $h_t$。它可以被理解为 RNN 的“记忆胶囊”：模型把之前看到的信息压缩进这个向量里，然后带着这个向量继续往下走。&lt;/p&gt;
&lt;p&gt;这种方式在短序列上很自然，但问题也很明显。&lt;/p&gt;
&lt;p&gt;首先，信息必须一站一站传递。第 1 个词的信息要先影响第 2 个词，再影响第 3 个词，一直传到第 100 个词。换句话说，如果第 100 个词想知道第 1 个词说了什么，它只能依赖前面经过 99 次传递后残留下来的状态。&lt;/p&gt;
&lt;p&gt;其次，隐藏状态通常是固定维度的向量。无论句子有多长，所有历史信息都要被压缩进同一个有限空间里。这样一来，早期信息很容易被后来的信息覆盖、稀释或干扰。&lt;/p&gt;
&lt;p&gt;这就是 RNN 长距离依赖困难的根源：不是模型“不想记住”，而是它的结构决定了信息必须通过一条很长、很窄、不断被压缩的通路传递。&lt;/p&gt;
&lt;h3 id=&#34;2-人类阅读中的选择性关注&#34;&gt;2. 人类阅读中的选择性关注&lt;/h3&gt;
&lt;p&gt;我们来看一个很常见的英文句子：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The animal didn&amp;rsquo;t cross the street because it was too tired.&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 3 | RNN</title>
      <link>/posts/rnn/</link>
      <pubDate>Fri, 21 Aug 2026 05:00:00 +0800</pubDate>
      <guid>/posts/rnn/</guid>
      <description>&lt;h1 id=&#34;序列建模的演进与困境彻底理解-rnnlstm-与-gru&#34;&gt;序列建模的演进与困境：彻底理解 RNN、LSTM 与 GRU&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在上一篇文章中，我们学会了把文字变成计算机可以处理的向量——词向量，相当于拿到了处理文字的&amp;quot;数字砖块&amp;quot;。接下来的问题自然是：如何把这些砖块砌成一面能理解&amp;quot;上下文&amp;quot;的墙？语言天生带有顺序，同样几个词，顺序不同，意思可能完全相反。本文将讲述早期的研究者如何试图给模型装上&amp;quot;记忆&amp;quot;，以及这些尝试为何最终走入死局。只有把这份&amp;quot;痛&amp;quot;理解透彻，日后才能真正体会 Transformer 带来的范式革命。&lt;/p&gt;
&lt;p&gt;全文将沿着三个问题展开：RNN 是干什么的？它靠什么机制实现？它又卡在了哪里？&lt;/p&gt;
&lt;h2 id=&#34;一mlp-是失忆的而语言是有顺序的&#34;&gt;一、MLP 是&amp;quot;失忆&amp;quot;的，而语言是有顺序的&lt;/h2&gt;
&lt;p&gt;回顾一下多层感知机（MLP，也就是神经网络的基本形态）。从数学上看，一个训练好的 MLP 就是一个固定的函数 $y = f(x)$：输入 $x$，经过逐层的线性变换与非线性激活，得到输出 $y$。这里要注意&amp;quot;函数&amp;quot;二字的含义——&lt;strong&gt;每一次调用都是独立的&lt;/strong&gt;。你输入 $x_1$ 得到 $y_1$，再输入 $x_2$ 得到 $y_2$，这两次计算在底层完全不共享任何内部状态，前一次输入对后一次输出没有任何影响。换句话说，MLP 没有记忆：处理完一个输入就忘，根本不知道上一个输入是什么。&lt;/p&gt;
&lt;p&gt;但语言恰恰是讲究顺序的。&amp;ldquo;我打了他&amp;quot;和&amp;quot;他打了我&amp;rdquo;，词完全一样，仅因顺序不同，意思就完全相反。如果把每个词独立地喂进 MLP，模型看到的只是一堆孤立的词，看不见顺序，也看不见上下文。这就像一页一页随机抽着读一本书，永远拼不出完整的情节。&lt;/p&gt;
&lt;p&gt;因此，要处理语言，就需要一种带记忆的结构：它在处理当前输入时，能够同时参考&amp;quot;之前发生过什么&amp;quot;。这正是循环神经网络（Recurrent Neural Network, RNN）的出发点。&lt;/p&gt;
&lt;h2 id=&#34;二先明确目标rnn-最终输出什么&#34;&gt;二、先明确目标：RNN 最终输出什么？&lt;/h2&gt;
&lt;p&gt;在讲机制之前，有必要先说清楚 RNN 是用来干什么的。不知道目的，就很容易在过程的细节里迷路。&lt;/p&gt;
&lt;p&gt;RNN 的目的，是&lt;strong&gt;处理变长的序列数据（文本、语音等），把它压缩成包含上下文信息的向量，或者直接输出另一个序列，从而完成分类、翻译、预测等任务&lt;/strong&gt;。具体而言，最典型的任务形态有三种：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多对一（Many-to-One）&lt;/strong&gt;：输入一整句话，输出一个标签。典型例子是情感分类：模型依次读入&amp;quot;这 / 电影 / 太 / 棒 / 了&amp;quot;，读完最后一个词后，给出&amp;quot;正面 95%、负面 5%&amp;ldquo;这样的判断，目的是分辨这句话是夸还是骂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;序列到序列（Seq2Seq）&lt;/strong&gt;：输入一个序列，输出另一个序列。典型例子是机器翻译：一个 RNN 作为编码器（Encoder）读入中文&amp;quot;我 / 爱 / 你&amp;rdquo;，把整句话压缩成一个浓缩语义的&lt;strong&gt;上下文向量&lt;/strong&gt;；另一个 RNN 作为解码器（Decoder）依据这个向量，逐个词地生成英文&amp;quot;I → love → you&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多对多（Many-to-Many）&lt;/strong&gt;：每读入一个词，同时输出一个标签。典型例子是词性标注：对&amp;quot;我 / 吃 / 苹果&amp;quot;，模型同步输出 [代词, 动词, 名词]，用于分析句子的语法结构。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 2 | 词嵌入</title>
      <link>/posts/wordembedding/</link>
      <pubDate>Fri, 21 Aug 2026 04:00:00 +0800</pubDate>
      <guid>/posts/wordembedding/</guid>
      <description>&lt;h1 id=&#34;从-one-hot-到词嵌入让计算机理解文字的语义空间&#34;&gt;从 One-Hot 到词嵌入：让计算机理解文字的语义空间&lt;/h1&gt;
&lt;p&gt;自然语言处理要解决的第一件事，其实非常朴素：&lt;strong&gt;怎样把人类语言变成计算机能够计算、能够学习、能够比较的数学对象&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一句话看起来很简单，比如：&lt;code&gt;我喜欢吃苹果&lt;/code&gt;。但对计算机来说，这串文字本身并不能直接参与矩阵乘法、梯度下降和概率计算。计算机擅长处理的是数字，尤其是连续的、可以进行加减乘除和求导的数值。因此，自然语言处理的第一步，就是把“文字符号”转换成“数值表示”。&lt;/p&gt;
&lt;p&gt;这篇文章将从最基础的 One-Hot 编码讲起，逐步过渡到现代深度学习中广泛使用的词嵌入，也就是 Word Embedding。我们会解释为什么 One-Hot 编码虽然简单却不够好，词向量为什么能够表达语义，Word2Vec 是如何训练出词向量的，以及现代大模型中的 Embedding 层和中文 Tokenization 又是怎么一回事。&lt;/p&gt;
&lt;p&gt;理解这些内容，是后续理解 Transformer、注意力机制以及大语言模型中各种矩阵运算的重要前提。&lt;/p&gt;
&lt;h2 id=&#34;一计算机的文字障碍&#34;&gt;一、计算机的“文字障碍”&lt;/h2&gt;
&lt;p&gt;计算机本质上处理的是数字。更准确地说，是基于二进制数值进行算术运算和逻辑运算。如果我们把一句话直接交给模型，例如：&lt;code&gt;我喜欢吃苹果&lt;/code&gt;模型并不能天然理解“我”“喜欢”“吃”“苹果”这些符号意味着什么。它们只是字符，是离散的语言单位。&lt;/p&gt;
&lt;p&gt;这里至少有三个困难。&lt;/p&gt;
&lt;h3 id=&#34;1-文字是离散符号&#34;&gt;1. 文字是离散符号&lt;/h3&gt;
&lt;p&gt;语言中的词或者字，本质上是离散符号。我们可以说“苹果”和“香蕉”都是水果，但很难说“苹果”比“香蕉”大多少。数字则不同。对于数值 3 和 5，我们可以说 5 比 3 大，差值是 2。这种连续性让数学运算变得自然。但词语之间没有这种天然的数值大小关系。因此，我们需要人为设计一种数值表示，使离散符号能够进入连续数学空间。&lt;/p&gt;
&lt;h3 id=&#34;2-词汇量很大容易造成维度灾难&#34;&gt;2. 词汇量很大，容易造成维度灾难&lt;/h3&gt;
&lt;p&gt;人类语言的词汇量非常庞大。中文有常用字、生僻字、词语、成语、专有名词；英文有单词、词形变化、缩写、外来词。一个实际语言系统的词表规模可能从几万到几十万不等。如果用最朴素的方法，每个词占用一个独立维度，那么向量维度会变得非常高。假设词表有 10 万个词，那么每个词都需要一个 10 万维向量来表示。这会带来严重的稀疏性和计算负担。&lt;/p&gt;
&lt;h3 id=&#34;3-普通编码无法表达语义关系&#34;&gt;3. 普通编码无法表达语义关系&lt;/h3&gt;
&lt;p&gt;人类语言中，词与词之间存在复杂关系。例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“猫”和“狗”都是常见动物；&lt;/li&gt;
&lt;li&gt;“苹果”和“香蕉”都是水果；&lt;/li&gt;
&lt;li&gt;“医生”和“医院”经常共同出现；&lt;/li&gt;
&lt;li&gt;“国王”和“女王”之间存在性别对应关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果只是简单给每个词编号，计算机无法知道这些关系。我们需要一种表示方法，使得语义相近的词在数值空间中也更接近。&lt;/p&gt;
&lt;p&gt;换句话说，我们希望把离散符号变成&lt;strong&gt;连续的、低维的、带有语义结构的数学对象&lt;/strong&gt;，通常是向量。这就是词嵌入要解决的问题。&lt;/p&gt;
&lt;h2 id=&#34;二one-hot编码最朴素的词表示方法&#34;&gt;二、One-Hot编码：最朴素的词表示方法&lt;/h2&gt;
&lt;p&gt;最直观的想法是：给词典里的每个词编号，然后用一个向量来表示它。&lt;/p&gt;
&lt;p&gt;假设我们的词典只有 4 个词&lt;code&gt;[&amp;quot;苹果&amp;quot;, &amp;quot;香蕉&amp;quot;, &amp;quot;猫&amp;quot;, &amp;quot;狗&amp;quot;]&lt;/code&gt;,我们可以这样表示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3
&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;苹果 = [1, 0, 0, 0]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;香蕉 = [0, 1, 0, 0]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;猫   = [0, 0, 1, 0]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;狗   = [0, 0, 0, 1]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这种表示方法叫作 &lt;strong&gt;One-Hot 编码&lt;/strong&gt;，也叫独热编码
它的意思是：每个词对应一个向量，向量中只有一个位置是 1，其余位置全是 0。这个 1 的位置代表该词在词表中的编号
如果词表大小为 $V$，那么每个词都可以表示成一个 $V$ 维向量。设某个词的索引为 $i$，则它的 One-Hot 向量记作：&lt;/p&gt;</description>
    </item>
    <item>
      <title>【LLM】从零开始学大语言模型 | 1 | 神经网络和多层感知机</title>
      <link>/posts/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%92%8Cmlp/</link>
      <pubDate>Fri, 21 Aug 2026 03:00:00 +0800</pubDate>
      <guid>/posts/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E5%92%8Cmlp/</guid>
      <description>&lt;h2 id=&#34;一从生物神经元到人工感知机&#34;&gt;一、从生物神经元到人工感知机&lt;/h2&gt;
&lt;p&gt;深度学习的名字里带有“神经”二字，是因为它最初的灵感来自生物神经元。一个生物神经元大致是这样工作的：树突接收来自其他神经元的信号，细胞体对这些信号进行整合；&lt;strong&gt;当总信号超过某个阈值时，神经元就会被激活&lt;/strong&gt;，并通过轴突向外发出脉冲。人工感知机就是对这一过程的高度简化。1957 年前后，Frank Rosenblatt 提出了人工感知机模型。它的数学表达非常简单：&lt;/p&gt;
&lt;p&gt;$$y = f(W^T x + b)$$&lt;/p&gt;
&lt;p&gt;也可以写成：&lt;/p&gt;
&lt;p&gt;$$y = f\left(\sum_{i=1}^{n} w_i x_i + b\right)$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$x$ 是输入特征向量。例如一张图片的像素值、一个样本的若干数值特征；&lt;/li&gt;
&lt;li&gt;$W$ 是权重向量，表示每个输入特征的重要程度；&lt;/li&gt;
&lt;li&gt;$b$ 是偏置，可以理解为一个阈值，决定神经元是否容易被激活；&lt;/li&gt;
&lt;li&gt;$f$ 是激活函数，或者说输出函数；&lt;/li&gt;
&lt;li&gt;$y$ 是神经元的输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很多初学者第一次看到这个公式时会问：这里的 $f$ 到底是什么？是不是一个 0/1 函数？这个猜测是有道理的。在最早的感知机模型中，$f$ 确实常常是阶跃函数：&lt;/p&gt;
&lt;p&gt;$$
f(z)=
\begin{cases}
1, &amp;amp; z &amp;gt; 0 \\
0, &amp;amp; z \le 0
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;也就是说，从二维来看，如果加权求和的结果大于 0，输出 1；否则输出 0。这看起来就是一个硬性的二分类器。从几何上看，感知机在输入空间中定义了一个超平面：&lt;/p&gt;
&lt;p&gt;$$
W^T x + b = 0
$$&lt;/p&gt;
&lt;p&gt;这个超平面把数据分成两类：一侧输出 1，另一侧输出 0。在二维空间里，它是一条直线；在三维空间里，它是一个平面；在更高维空间里，它是超平面。因此，感知机本质上是一个线性分类器。&lt;/p&gt;
&lt;p&gt;不过，阶跃函数虽然直观，却有一个严重问题：它在 $z=0$ 处不可导。不可导意味着我们无法用微积分中的链式法则去计算梯度，也就很难通过“误差反向传播”来更新参数。所以，在现代神经网络中，感知机公式里的 $f$ 通常不再是阶跃函数，而是更平滑、至少几乎处处可导的函数，例如 Sigmoid、Tanh、ReLU 等。这些函数统称为激活函数。就是说，今天当我们写：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
