<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>PAB&#39;s Blog</title>
        <subtitle></subtitle>
        <icon>https://www.bondrewd.com/assets/favicon.ico</icon>
        <link>https://www.bondrewd.com</link>
        <author>
          <name>Plusjia&amp;Bondrewd</name>
        </author>
        <description>记录生活与技术</description>
        <language>zh-CN</language>
        <pubDate>Sun, 19 Jul 2026 11:07:32 +0000</pubDate>
        <lastBuildDate>Sun, 19 Jul 2026 11:07:32 +0000</lastBuildDate>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/19/hello-world/</guid>
            <title>Hello World</title>
            <link>https://www.bondrewd.com/2026/07/19/hello-world/</link>
            <pubDate>Sun, 19 Jul 2026 11:07:32 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;Welcome to &lt;a href=&#34;https://hexo.io/&#34;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&#34;https://hexo.io/docs/&#34;&gt;documentation&lt;/a&gt; for more info. If you get any problems when using Hexo, you can find the answer in &lt;a href=&#34;https://hexo.io/docs/troubleshooting.html&#34;&gt;troubleshooting&lt;/a&gt; or you can ask me on &lt;a href=&#34;https://github.com/hexojs/hexo/issues&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;quick-start&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#quick-start&#34;&gt;#&lt;/a&gt; Quick Start&lt;/h3&gt;
&lt;h4 id=&#34;create-a-new-post&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#create-a-new-post&#34;&gt;#&lt;/a&gt; Create a new post&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;$ hexo new &#34;My New Post&#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&#34;https://hexo.io/docs/writing.html&#34;&gt;Writing&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;run-server&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#run-server&#34;&gt;#&lt;/a&gt; Run server&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;$ hexo server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&#34;https://hexo.io/docs/server.html&#34;&gt;Server&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;generate-static-files&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#generate-static-files&#34;&gt;#&lt;/a&gt; Generate static files&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;$ hexo generate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&#34;https://hexo.io/docs/generating.html&#34;&gt;Generating&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;deploy-to-remote-sites&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#deploy-to-remote-sites&#34;&gt;#&lt;/a&gt; Deploy to remote sites&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;$ hexo deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;More info: &lt;a href=&#34;https://hexo.io/docs/one-command-deployment.html&#34;&gt;Deployment&lt;/a&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/17/seldon-core-1/</guid>
            <title>Seldon Core 1</title>
            <link>https://www.bondrewd.com/2026/07/17/seldon-core-1/</link>
            <category term="seldon core" scheme="https://www.bondrewd.com/categories/seldon-core/" />
            <pubDate>Fri, 17 Jul 2026 07:58:34 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;Seldon Core一个运行在 Kubernetes 上的机器学习模型服务平台，用来把训练好的模型部署成可访问、可扩缩、可观测的在线推理服务。这里学习的是1版本。&lt;/p&gt;
&lt;p&gt;它解决的不是“怎么训练模型”，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型训练好了，怎么部署上线？&lt;/li&gt;
&lt;li&gt;怎么暴露 REST / gRPC 接口？&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;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;当前官方重点已经转向 &lt;strong&gt;Seldon Core 2&lt;/strong&gt;。Core 2 被定位为 Kubernetes 上的 MLOps/LLMOps 框架，可以管理单模型、多个模型以及模块化推理应用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;架构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#架构&#34;&gt;#&lt;/a&gt; 架构&lt;/h3&gt;
&lt;p&gt;Seldon Core 1 在K8s 上增加了一个更高层的抽象：SeldonDeployment。&lt;/p&gt;
&lt;p&gt;这里描述的是模型推理服务，Seldon Operator 再将它转换成 k8s 能运行的资源。&lt;/p&gt;
&lt;h4 id=&#34;认识-seldondeployment&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#认识-seldondeployment&#34;&gt;#&lt;/a&gt; 认识 SeldonDeployment&lt;/h4&gt;
&lt;p&gt;官方将 &lt;code&gt;SeldonDeployment&lt;/code&gt; 定义为 Kubernetes 自定义资源，用户通过它描述模型组件和推理图。&lt;/p&gt;
&lt;p&gt;一个简单示例如下：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;apiVersion&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; machinelearning.seldon.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;kind&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; SeldonDeployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;metadata&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;  name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; iris-model&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;  namespace&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; seldon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;spec&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;  name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; iris&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;  predictors&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;    -&lt;/span&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt; name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      replicas&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#2F798A;--shiki-dark:#4C9A91&#34;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      graph&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;        name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;        type&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; MODEL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;        implementation&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; SKLEARN_SERVER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;        modelUri&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; gs://seldon-models/sklearn/iris&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      componentSpecs&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;        -&lt;/span&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt; spec&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;            containers&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;              -&lt;/span&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt; name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                resources&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                  requests&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                    cpu&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; 100m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                    memory&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; 256Mi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                  limits&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                    cpu&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#2F798A;--shiki-dark:#4C9A91&#34;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;                    memory&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; 1Gi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一份 YAML 里混合了两类信息：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;模型语义&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;Kubernetes 运行配置&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;spec.predictors&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;predictors:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - name: default&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一个 predictors 可以理解为：一套可以独立接收推理请求的模型服务配置。&lt;/p&gt;
&lt;p&gt;其中可以包含：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;模型；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;输入转换器；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;输出转换器；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;路由器；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;组合器；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;副本数量；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;Pod 配置。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;replicas&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;repicas: 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;描述该 predictor 的副本数量。但实际生成资源时，可能根据图结构和组件配置创建一个或多个 Deployment，因此不要机械认为一个 predictor 永远只对应一个 Deployment。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;graph&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;graph:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  type: MODEL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  implementation: SKLEARN_SERVER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  modelUri: gs://seldon-models/sklearn/iris&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是 Seldon 相比普通 Deployment 最核心的能力之一，描述的是推理组件之间的调用关系。&lt;/p&gt;
&lt;p&gt;只有一个模型时：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;response&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;稍微复杂一点：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;input-transformer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;output-transformer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;response&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还可以存在：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;router&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt; ┌─┴─────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt; ↓           ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;model-a    model-b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt; └────┬──────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;   combiner&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  response&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seldon Core 1 官方文档说明，推理图可以由模型以及 router、combiner、输入和输出 transformer 等组件构成。&lt;/p&gt;
&lt;p&gt;普通 Kubernetes Deployment 只知道：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;运行哪些容器&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SeldonDeployment 还知道：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;这些模型组件之间应该如何调用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;graph&lt;/code&gt; 是根节点，&lt;code&gt;children&lt;/code&gt; 表示连接的下一层节点，多个 &lt;code&gt;-&lt;/code&gt; 表示多个并列节点，&lt;code&gt;implementation&lt;/code&gt; 选择预打包服务器，&lt;code&gt;modelUri&lt;/code&gt; 指向模型目录。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;implementation&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;implementation: SKLEARN_SERVER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;意思是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 Seldon 已经准备好的 sklearn 推理服务器运行模型。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Seldon Core 1 提供了多种预打包推理服务器，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SKLearn Server；&lt;/li&gt;
&lt;li&gt;XGBoost Server；&lt;/li&gt;
&lt;li&gt;TensorFlow Serving；&lt;/li&gt;
&lt;li&gt;MLflow Server；&lt;/li&gt;
&lt;li&gt;自定义服务器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此你不一定要自己完整实现：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;HTTP Server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;请求反序列化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;模型加载&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;predict 调用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;响应序列化&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 Seldon 比“直接写 Deployment”多做的一层标准化。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;什么是预打包服务器？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;预&lt;/strong&gt;：提前准备好&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;打包&lt;/strong&gt;：把代码、依赖库、运行环境放进一个容器镜像里&lt;/p&gt;
&lt;p&gt;“服务器”则表示它不是普通脚本，而是一个会持续运行、接收网络请求并返回预测结果的程序。&lt;/p&gt;
&lt;p&gt;所以预打包服务器指：提前打包好的，用于运行模型的服务器程序。之所以叫这个名字，核心原因就是：服务器代码和运行环境已经由 Seldon 提前封装好了，你不需要自己再写和配置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;modelUri&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;modelUri: gs://seldon-models/sklearn/iris&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;描述模型文件的位置，而不是容器镜像的位置。&lt;/p&gt;
&lt;p&gt;Seldon 可以使用预打包模型服务器，然后根据 &lt;code&gt;modelUri&lt;/code&gt; 加载模型。官方 SKLearn 示例就是通过 &lt;code&gt;implementation&lt;/code&gt; 和 &lt;code&gt;modelUri&lt;/code&gt; 描述模型服务。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;conponentSpec&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;componentSpecs:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        - name: classifier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          resources:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            requests:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;              cpu: 100m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;              memory: 256Mi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;非常接近 Kubernetes 的：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;PodTemplateSpec&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;CPU、内存；&lt;/li&gt;
&lt;li&gt;Volume；&lt;/li&gt;
&lt;li&gt;VolumeMount；&lt;/li&gt;
&lt;li&gt;安全上下文；&lt;/li&gt;
&lt;li&gt;节点选择；&lt;/li&gt;
&lt;li&gt;GPU 资源；&lt;/li&gt;
&lt;li&gt;其他 Pod 配置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此可以这样理解：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;graph&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;描述模型推理逻辑。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;componentSpecs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;描述模型组件如何在 Kubernetes 中运行。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;sldon-operator&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#sldon-operator&#34;&gt;#&lt;/a&gt; Sldon Operator&lt;/h4&gt;
&lt;p&gt;核心循环抽象：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;func Reconcile(request Request) &amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 1. 获取 SeldonDeployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    sdep := getSeldonDeployment(request)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 2. 根据 spec 计算期望资源&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    desiredDeployments := buildDeployments(sdep)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    desiredServices := buildServices(sdep)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 3. 查询当前资源&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    currentDeployments := getDeployments(sdep)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    currentServices := getServices(sdep)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 4. 对比期望状态与当前状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    diff := compare(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        desiredDeployments,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        currentDeployments,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 5. 创建、更新或删除资源&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    apply(diff)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    // 6. 更新状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    updateStatus(sdep)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;与直接写-deployment-相比&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#与直接写-deployment-相比&#34;&gt;#&lt;/a&gt; 与直接写 Deployment 相比&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;模型语义 Deployment 只知道运行镜像，SeldonDeployment 能表达：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;这是 MODEL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;这是 ROUTER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;这是 TRANSFORMER&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;这是 COMBINER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推理图&lt;/p&gt;
&lt;p&gt;Deployment 本身不能直接表达：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;请求 → 预处理 → 模型 → 后处理&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SeldonDeployment 可以通过 &lt;code&gt;graph&lt;/code&gt; 描述这种关系。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;标准推理服务器&lt;/p&gt;
&lt;p&gt;普通 Deployment 通常需要你自己准备完整模型服务镜像。&lt;/p&gt;
&lt;p&gt;Seldon 可以使用预打包服务器运行 sklearn、XGBoost、MLflow 等模型。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/22-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9A%E7%89%B9%E6%9D%83%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%AE%89%E5%85%A8%E4%B8%8A%E4%B8%8B%E6%96%87%E9%99%90%E5%88%B6/</guid>
            <title>22-系统加固：特权容器逃逸与配置安全上下文限制</title>
            <link>https://www.bondrewd.com/2026/07/16/22-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9A%E7%89%B9%E6%9D%83%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8%E4%B8%8E%E9%85%8D%E7%BD%AE%E5%AE%89%E5%85%A8%E4%B8%8A%E4%B8%8B%E6%96%87%E9%99%90%E5%88%B6/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 06:01:22 +0000</pubDate>
            <description><![CDATA[ &lt;h5 id=&#34;心智模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#心智模型&#34;&gt;#&lt;/a&gt; 心智模型&lt;/h5&gt;
&lt;p&gt;攻击者容易利用特权容器从受限容器环境侵入宿主机操作系统。&lt;/p&gt;
&lt;h5 id=&#34;️-实操手册逃逸演示与防御配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#️-实操手册逃逸演示与防御配置&#34;&gt;#&lt;/a&gt; 🛠️ 实操手册：逃逸演示与防御配置&lt;/h5&gt;
&lt;h5 id=&#34;第一阶段演示特权容器逃逸危险操作仅限实验&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第一阶段演示特权容器逃逸危险操作仅限实验&#34;&gt;#&lt;/a&gt; 第一阶段：演示特权容器逃逸（危险操作，仅限实验）&lt;/h5&gt;
&lt;p&gt;我们将演示攻击者如何利用特权容器直接访问宿主机的磁盘。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;部署一个特权 Pod&lt;/strong&gt;： 注意 &lt;code&gt;privileged: true&lt;/code&gt; 这个开关。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: privileged-escape-demo&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: attacker-container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;sh&#34;, &#34;-c&#34;, &#34;sleep 3600&#34;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    securityContext:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      privileged: true  # 开启特权模式&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;执行逃逸攻击&lt;/strong&gt;： 特权容器可以看到宿主机的设备文件。我们可以直接挂载宿主机的根磁盘。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## 进入容器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl exec -it privileged-escape-demo -- sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## 在容器内，查看宿主机的磁盘设备（通常是 /dev/sda1 或 /dev/nvme0n1p1）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;fdisk -l&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## 创建一个挂载点并挂载宿主机根目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;mkdir /host_root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;mount /dev/sda1 /host_root  # 请根据 fdisk 结果替换设备名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## 现在，你已经在容器里看到了宿主机的所有敏感文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;ls /host_root/etc/shadow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;ls /host_root/root/.ssh/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：一旦开启 &lt;code&gt;privileged: true&lt;/code&gt;，容器与宿主机之间已无安全可言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;第二阶段配置安全上下文限制权限提升&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第二阶段配置安全上下文限制权限提升&#34;&gt;#&lt;/a&gt; 第二阶段：配置安全上下文限制权限提升&lt;/h5&gt;
&lt;p&gt;仅仅不开启 &lt;code&gt;privileged&lt;/code&gt; 就够了吗？不够。 很多进程会利用 &lt;code&gt;setuid&lt;/code&gt;（如 &lt;code&gt;sudo&lt;/code&gt; 命令）在运行时尝试获取更高级别的权限。我们需要通过 &lt;code&gt;allowPrivilegeEscalation: false&lt;/code&gt; 封死这条路。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编写安全加固的 Pod 配置&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: hardened-pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: safe-container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: alpine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;sh&#34;, &#34;-c&#34;, &#34;sleep 3600&#34;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    securityContext:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      # 1. 明确禁止特权模式&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      privileged: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      # 2. 禁止进程通过 setuid 等方式获取比父进程更高的权限&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      allowPrivilegeEscalation: false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      # 3. 配合之前的实验，以非 root 用户运行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      runAsNonRoot: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      runAsUser: 1000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;核心参数深度解析&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#核心参数深度解析&#34;&gt;#&lt;/a&gt; 🔍 核心参数深度解析&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;allowPrivilegeEscalation&lt;/code&gt; (禁止权限提升)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;它是干什么的？&lt;/strong&gt; 它控制 &lt;code&gt;no_new_privs&lt;/code&gt; 内核标志。如果设为 &lt;code&gt;false&lt;/code&gt;，即使一个程序设置了 &lt;code&gt;SUID&lt;/code&gt; 位（比如一个只有 root 才能跑的程序），普通用户也无法通过它获得 root 权限。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为什么重要？&lt;/strong&gt; 很多提权漏洞（Exploit）依赖于在容器内通过特殊手段获取 root。关掉这个开关，就砍掉了攻击者的“阶梯”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;readOnlyRootFilesystem&lt;/code&gt; (只读根文件系统)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;建议配合使用&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;securityContext:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  readOnlyRootFilesystem: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效果&lt;/strong&gt;：容器的整个根目录变成只读。如果黑客想下载一个木马脚本到 &lt;code&gt;/tmp&lt;/code&gt; 或 &lt;code&gt;/bin&lt;/code&gt;，会直接被内核拦截。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/21-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9Aseccomp/</guid>
            <title>21-系统加固：Seccomp</title>
            <link>https://www.bondrewd.com/2026/07/16/21-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9Aseccomp/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 06:00:35 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;strong&gt;Seccomp (Secure Computing mode)&lt;/strong&gt; 是 Linux 内核的一项功能，用于限制容器可以发起的&lt;strong&gt;系统调用 (System Calls)&lt;/strong&gt;。&lt;/p&gt;
&lt;h5 id=&#34;️-实操手册配置-seccomp-profile&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#️-实操手册配置-seccomp-profile&#34;&gt;#&lt;/a&gt; 🛠️ 实操手册：配置 Seccomp Profile&lt;/h5&gt;
&lt;p&gt;在 Kubernetes 中，Seccomp 已经比 AppArmor 更加标准化，直接集成在 &lt;code&gt;securityContext&lt;/code&gt; 字段中。&lt;/p&gt;
&lt;h5 id=&#34;第一阶段使用-runtimedefault-最推荐的生产配置&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第一阶段使用-runtimedefault-最推荐的生产配置&#34;&gt;#&lt;/a&gt; 第一阶段：使用 &lt;code&gt;RuntimeDefault&lt;/code&gt; (最推荐的生产配置)&lt;/h5&gt;
&lt;p&gt;这是容器运行时（如 containerd 或 Docker）自带的一套“安全模板”，它禁用了大约 40 多个危险的系统调用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编写 Pod 配置文件&lt;/strong&gt;： 与 AppArmor 不同，Seccomp 建议直接写在 &lt;code&gt;spec&lt;/code&gt; 字段中。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: seccomp-default-pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  securityContext:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    # 在 Pod 级别应用 seccomp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    seccompProfile:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      type: RuntimeDefault&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: web-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: nginx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;第二阶段自定义-seccomp-profile-精细化控制&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第二阶段自定义-seccomp-profile-精细化控制&#34;&gt;#&lt;/a&gt; 第二阶段：自定义 Seccomp Profile (精细化控制)&lt;/h5&gt;
&lt;p&gt;有时候默认配置还是太宽松，或者你需要运行极其特殊的应用。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 Worker 节点创建 Profile 目录&lt;/strong&gt;： Kubelet 默认在特定的安全目录下寻找 Profile。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;# 在所有 Worker 节点执行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;sudo mkdir -p /var/lib/kubelet/seccomp/profiles&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编写 JSON Profile&lt;/strong&gt;： 创建一个名为 &lt;code&gt;audit-only.json&lt;/code&gt; 的文件，它的作用是：允许大部分操作，但对某些操作记录日志（用于审计）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JSON&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    &#34;defaultAction&#34;: &#34;SCMP_ACT_ALLOW&#34;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    &#34;architectures&#34;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        &#34;SCMP_ARCH_X86_64&#34;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    &#34;syscalls&#34;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        &amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            &#34;names&#34;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;                &#34;reboot&#34;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            &#34;action&#34;: &#34;SCMP_ACT_KILL&#34;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;语法解释&lt;/strong&gt;：如果进程尝试调用 &lt;code&gt;reboot&lt;/code&gt;（重启），内核会直接杀掉 (&lt;code&gt;SCMP_ACT_KILL&lt;/code&gt;) 该进程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;将文件放入 Worker 节点指定路径&lt;/strong&gt;： 将此 JSON 放在 &lt;code&gt;/var/lib/kubelet/seccomp/profiles/audit-only.json&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在 Pod 中引用自定义 Profile&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: seccomp-custom-pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: test-container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: busybox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;sh&#34;, &#34;-c&#34;, &#34;sleep 3600&#34;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    securityContext:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      seccompProfile:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        type: Localhost&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        # 注意：这里的路径是相对于 /var/lib/kubelet/seccomp/ 的相对路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        localhostProfile: profiles/audit-only.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;第三阶段验证实验结果&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第三阶段验证实验结果&#34;&gt;#&lt;/a&gt; 第三阶段：验证实验结果&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;部署 Pod&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl apply -f seccomp-custom-pod.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试拦截效果&lt;/strong&gt;： 由于我们设置了 &lt;code&gt;reboot&lt;/code&gt; 就会被 &lt;code&gt;KILL&lt;/code&gt;，我们可以进入容器尝试触发这个调用。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl exec seccomp-custom-pod -- reboot&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;预期现象&lt;/strong&gt;： 你会发现连接被断开，或者提示 &lt;code&gt;command terminated with exit code 137&lt;/code&gt;。这是因为内核检测到非法调用，瞬间终止了进程。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;避坑指南&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#避坑指南&#34;&gt;#&lt;/a&gt; 避坑指南&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路径陷阱&lt;/strong&gt;：在 Pod YAML 中写 &lt;code&gt;localhostProfile&lt;/code&gt; 时，&lt;strong&gt;不要&lt;/strong&gt;写绝对路径 &lt;code&gt;/var/lib/...&lt;/code&gt;。Kubelet 会自动拼凑前缀。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限陷阱&lt;/strong&gt;：由于 Seccomp 需要在每个节点部署 JSON 文件，建议在生产中使用 &lt;strong&gt;DaemonSet&lt;/strong&gt; 来自动把 Profile 文件同步到所有节点的磁盘上。&lt;/li&gt;
&lt;/ul&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/20-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9Aapparmor/</guid>
            <title>20-系统加固：Apparmor</title>
            <link>https://www.bondrewd.com/2026/07/16/20-%E7%B3%BB%E7%BB%9F%E5%8A%A0%E5%9B%BA%EF%BC%9Aapparmor/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 05:59:46 +0000</pubDate>
            <description><![CDATA[ &lt;h5 id=&#34;心智模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#心智模型&#34;&gt;#&lt;/a&gt; 心智模型&lt;/h5&gt;
&lt;p&gt;最小权限原则，要求每个程序或系统进程这你能访问其任务所必须的信息和资源。&lt;/p&gt;
&lt;h5 id=&#34;实验部署和引用-apparmor-profile&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#实验部署和引用-apparmor-profile&#34;&gt;#&lt;/a&gt; 实验：部署和引用 AppArmor Profile&lt;/h5&gt;
&lt;h5 id=&#34;第一阶段在-worker-节点准备-profile&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第一阶段在-worker-节点准备-profile&#34;&gt;#&lt;/a&gt; 第一阶段：在 Worker 节点准备 Profile&lt;/h5&gt;
&lt;p&gt;AppArmor 是 Linux 内核模块，因此 Profile 必须加载到&lt;strong&gt;每一个&lt;/strong&gt;运行 Pod 的节点内核中。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;登录到你的 Worker 节点&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建 Profile 文件&lt;/strong&gt;：创建一个名为 &lt;code&gt;k8s-deny-write&lt;/code&gt; 的配置文件，禁止容器写入任何文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;cat &amp;#x3C;&amp;#x3C;EOF &gt; /etc/apparmor.d/k8s-deny-write&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;profile k8s-deny-write flags=(attach_disconnected) &amp;#123;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # 包含基本抽象&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  include &amp;#x3C;abstractions/base&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # 拒绝所有写入操作&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  deny /** w,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;加载 Profile 到内核&lt;/strong&gt;： 使用 &lt;code&gt;apparmor_parser&lt;/code&gt; 命令解析并加载该配置文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;sudo apparmor_parser -r -W /etc/apparmor.d/k8s-deny-write&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;确认加载成功&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;sudo aa-status  grep k8s-deny-write&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;第二阶段：在 Pod 中通过 Annotation 引用&lt;/p&gt;
&lt;p&gt;在 Kubernetes 1.30 之前的版本中，AppArmor 主要通过 &lt;strong&gt;Annotation (注解)&lt;/strong&gt; 进行配置。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编写 Pod 部署文件&lt;/strong&gt;： 注意 Annotation 的格式：&lt;code&gt;container.apparmor.security.beta.kubernetes.io/&amp;lt;container_name&amp;gt;: localhost/&amp;lt;profile_name&amp;gt;&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: apparmor-test-pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  annotations:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    # 这里的 &#39;test-container&#39; 必须匹配下方的容器名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    # &#39;localhost/k8s-deny-write&#39; 表示引用节点本地加载的 profile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    container.apparmor.security.beta.kubernetes.io/test-container: localhost/k8s-deny-write&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: test-container&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: busybox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;sh&#34;, &#34;-c&#34;, &#34;echo &#39;Hello AppArmor&#39; &amp;#x26;&amp;#x26; sleep 3600&#34;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;部署 Pod&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl apply -f apparmor-pod.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;第三阶段验证防御效果&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第三阶段验证防御效果&#34;&gt;#&lt;/a&gt; 第三阶段：验证防御效果&lt;/h5&gt;
&lt;p&gt;我们要验证“最小权限”是否生效：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;尝试在容器内创建文件&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl exec apparmor-test-pod -- touch /tmp/test.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预期结果&lt;/strong&gt;： 系统应报错：&lt;code&gt;touch: /tmp/test.txt: Permission denied&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查看内核日志&lt;/strong&gt;（在 Worker 节点上）：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;dmesg  grep -i apparmor&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你会看到类似 &lt;code&gt;apparmor=&amp;quot;DENIED&amp;quot;&lt;/code&gt; 的记录，这证明内核成功拦截了违规操作。&lt;/p&gt;
&lt;h5 id=&#34;关键要点总结&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#关键要点总结&#34;&gt;#&lt;/a&gt; 💡 关键要点总结&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;步骤&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心操作&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意事项&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;节点侧&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;加载 Profile 到内核&lt;/p&gt;
&lt;p&gt;必须在&lt;strong&gt;所有&lt;/strong&gt;潜在的 Worker 节点上执行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;集群侧&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pod Annotation 引用&lt;/p&gt;
&lt;p&gt;格式必须极其精确，否则 Pod 可能无法启动或静默失败。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;维护&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;审计与调优&lt;/p&gt;
&lt;p&gt;生产环境通常先使用 &lt;code&gt;complain&lt;/code&gt; 模式（仅记录不拦截）观察业务需求，再转为 &lt;code&gt;enforce&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 从 Kubernetes 1.30 开始，AppArmor 已进入正式版 (GA)，推荐开始使用 &lt;code&gt;securityContext.appArmorProfile&lt;/code&gt; 字段替代 Annotation，但目前社区中 Annotation 仍是最通用的学习和迁移方式。&lt;/p&gt;
&lt;/blockquote&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/19-%E9%9B%86%E7%BE%A4%E8%AE%BE%E7%BD%AE%EF%BC%9Atls-ingress-%E5%AE%9E%E9%AA%8C/</guid>
            <title>19-集群设置：TLS Ingress 实验</title>
            <link>https://www.bondrewd.com/2026/07/16/19-%E9%9B%86%E7%BE%A4%E8%AE%BE%E7%BD%AE%EF%BC%9Atls-ingress-%E5%AE%9E%E9%AA%8C/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 05:56:40 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;实验在 Killercoda 进行，自己搭的网络实在是太麻烦了。&lt;/p&gt;
&lt;h5 id=&#34;步骤-1安装-nginx-ingress-controller&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-1安装-nginx-ingress-controller&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 1：安装 NGINX Ingress Controller&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;Killercoda 的默认集群没有自带 Ingress 控制器，我们需要手动部署官方的裸机（Bare-metal）版本。&lt;/p&gt;
&lt;p&gt;在终端中执行以下命令：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; apply&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -f&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/baremetal/deploy.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;提示：安装需要拉取镜像并启动 Pod，你可以运行 &lt;code&gt;kubectl get pods -n ingress-nginx&lt;/code&gt; 查看状态，等到 &lt;code&gt;ingress-nginx-controller&lt;/code&gt; 开头的 Pod 变成 &lt;code&gt;Running&lt;/code&gt; 状态再继续。&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;步骤-2生成自签名的-tls-证书&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-2生成自签名的-tls-证书&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 2：生成自签名的 TLS 证书&lt;/strong&gt;&lt;/h5&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;openssl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; req&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -x509&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -nodes&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -days&lt;/span&gt;&lt;span style=&#34;color:#2F798A;--shiki-dark:#4C9A91&#34;&gt; 365&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -newkey&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; rsa:2048&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt;  -keyout&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; tls.key&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -out&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; tls.crt&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt;  -subj&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt; &#34;&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;/CN=my-secure-app.com/O=my-local-test&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-x509&lt;/code&gt;&lt;/strong&gt;: &lt;strong&gt;最关键的参数&lt;/strong&gt;。告诉 OpenSSL 直接输出一个&lt;strong&gt;自签名证书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-nodes&lt;/code&gt;&lt;/strong&gt;: 读作 “no DES”。意思是&lt;strong&gt;不对私钥进行加密&lt;/strong&gt;。这样生成的 &lt;code&gt;tls.key&lt;/code&gt; 文件就不需要密码保护。在 Kubernetes Secret 中使用时，必须加这个参数，否则 Pod 启动时会因为无法输入密码解密私钥而报错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-newkey rsa:2048&lt;/code&gt;&lt;/strong&gt;: 同时生成一个新的私钥。指定算法为 &lt;strong&gt;RSA&lt;/strong&gt;，长度为 &lt;strong&gt;2048&lt;/strong&gt; 位&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-days 365&lt;/code&gt;&lt;/strong&gt;: 设置证书的有效期。这里是 1 年。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-keyout tls.key&lt;/code&gt;&lt;/strong&gt;: 指定生成的&lt;strong&gt;私钥&lt;/strong&gt;保存的文件名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-out tls.crt&lt;/code&gt;&lt;/strong&gt;: 指定生成的&lt;strong&gt;公钥证书&lt;/strong&gt;保存的文件名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;-subj &amp;quot;...&amp;quot;&lt;/code&gt;&lt;/strong&gt;: 以命令行方式直接提供证书的身份信息，避免进入交互式问答模式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/CN&lt;/code&gt; (Common Name)&lt;/strong&gt;：域名。比如 &lt;code&gt;my-secure-app.com&lt;/code&gt;，这要和你的 Ingress 规则里的 &lt;code&gt;host&lt;/code&gt; 匹配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/O&lt;/code&gt; (Organization)&lt;/strong&gt;：组织机构名称。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;步骤-3在-kubernetes-中创建-tls-secret&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-3在-kubernetes-中创建-tls-secret&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 3：在 Kubernetes 中创建 TLS Secret&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;将生成的证书存入 Secret 中：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl create secret tls my-tls-secret \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  --key tls.key \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  --cert tls.crt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;步骤-4部署测试应用-后端服务&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-4部署测试应用-后端服务&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 4：部署测试应用 (后端服务)&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;部署简单的 NGINX 容器作为后端。可以直接在终端粘贴以下命令，它会使用 &lt;code&gt;cat&lt;/code&gt; 直接生成并应用配置文件：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;cat&lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;EOF&lt;/span&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;  kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; apply&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -f&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;apiVersion: apps/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;kind: Deployment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  name: hello-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  replicas: 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  selector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      app: hello-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  template:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      labels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        app: hello-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      - name: hello-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        image: nginxdemos/hello:plain-text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        ports:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        - containerPort: 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;kind: Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  name: hello-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  selector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    app: hello-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  ports:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  - port: 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    targetPort: 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;步骤-5配置带有-tls-的-ingress&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-5配置带有-tls-的-ingress&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 5：配置带有 TLS 的 Ingress&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;与 Minikube 稍有不同，在标准集群中，显式声明 &lt;code&gt;ingressClassName: nginx&lt;/code&gt; 是一个好习惯，确保流量被正确接管。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;cat&lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;EOF&lt;/span&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;  kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; apply&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -f&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;kind: Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  name: secure-ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  ingressClassName: nginx  # 指定使用我们刚刚安装的 Nginx Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  tls:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  - hosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    - my-secure-app.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    secretName: my-tls-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  rules:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  - host: my-secure-app.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;    http:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      paths:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;      - path: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        pathType: Prefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;        backend:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;          service:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;            name: hello-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;            port:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;              number: 80&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;步骤-6在-killercoda-中测试-https&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#步骤-6在-killercoda-中测试-https&#34;&gt;#&lt;/a&gt; &lt;strong&gt;步骤 6：在 Killercoda 中测试 HTTPS&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;我们刚才安装的裸机版 Ingress Controller 是通过 &lt;strong&gt;NodePort&lt;/strong&gt; 暴露在集群上的。我们需要获取它暴露的 443 (HTTPS) 端口的映射端口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 自动提取 HTTPS 的 NodePort 端口号并存入变量：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B07D48;--shiki-dark:#BD976A&#34;&gt;HTTPS_NODEPORT&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;=$&lt;/span&gt;&lt;span style=&#34;color:#2993a3;--shiki-dark:#5eaab5&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; get&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; svc&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; ingress-nginx-controller&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -n&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; ingress-nginx&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -o&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; jsonpath=&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#39;&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;&amp;#123;.spec.ports[?(@.name==&#34;https&#34;)].nodePort&amp;#125;&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#39;&lt;/span&gt;&lt;span style=&#34;color:#2993a3;--shiki-dark:#5eaab5&#34;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;echo&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt; &#34;&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;HTTPS NodePort is: $HTTPS_NODEPORT&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 发起请求测试：&lt;/strong&gt; 我们直接在 Killercoda 的终端里，向本机的（&lt;code&gt;localhost&lt;/code&gt;）这个 NodePort 发起请求，同样强制指定 Host 头：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;curl&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -kv&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; https://localhost:&lt;/span&gt;&lt;span style=&#34;color:#B07D48;--shiki-dark:#BD976A&#34;&gt;$HTTPS_NODEPORT&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -H&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt; &#34;&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;Host: my-secure-app.com&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;-k： 允许连接到“不安全”的 SSL 站点。&lt;/p&gt;
&lt;p&gt;-v：输出&lt;strong&gt;详细日志&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;-H：手动注入 HTTP Header 中的 &lt;strong&gt;Host 字段&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;期望结果：&lt;/strong&gt; 会在输出信息中看到 &lt;code&gt;Server certificate: my-secure-app.com&lt;/code&gt; 的 TLS 握手信息，并看到底层 NGINX 应用返回的纯文本内容（如 &lt;code&gt;Server address&lt;/code&gt; 和 &lt;code&gt;Server name&lt;/code&gt; 等信息）。这证明在 Killercoda 标准集群上，TLS 终结实验圆满成功！&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/18-%E9%9B%86%E7%BE%A4%E8%AE%BE%E7%BD%AE%EF%BC%9Akube-bench/</guid>
            <title>18-集群设置：kube-bench</title>
            <link>https://www.bondrewd.com/2026/07/16/18-%E9%9B%86%E7%BE%A4%E8%AE%BE%E7%BD%AE%EF%BC%9Akube-bench/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 05:54:29 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;code&gt;kube-bench&lt;/code&gt; 进行集群安全加固是 Kubernetes 运维中的高级进阶任务。它主要基于 &lt;strong&gt;CIS (Center for Internet Security) Kubernetes Benchmark&lt;/strong&gt; 标准来检查集群配置。&lt;/p&gt;
&lt;h5 id=&#34;心智模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#心智模型&#34;&gt;#&lt;/a&gt; 心智模型：&lt;/h5&gt;
&lt;p&gt;在操作之前，需要建立这样一个逻辑回路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;扫描 (Scan)：&lt;/strong&gt; &lt;code&gt;kube-bench&lt;/code&gt; 作为一个二进制工具或容器运行，它会读取主机的进程参数（如 &lt;code&gt;ps -ef grep kube-apiserver&lt;/code&gt;）和配置文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;比对 (Compare)：&lt;/strong&gt; 它将获取到的参数与 CIS 标准进行比对。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;报告 (Report)：&lt;/strong&gt; 输出 &lt;code&gt;[PASS]&lt;/code&gt;（通过）、&lt;code&gt;[FAIL]&lt;/code&gt;（失败）或 &lt;code&gt;[WARN]&lt;/code&gt;（警告）。每个 &lt;code&gt;[FAIL]&lt;/code&gt; 都会附带一个 &lt;code&gt;Remediation&lt;/code&gt;（修复建议）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复 (Fix)：&lt;/strong&gt; 修改 &lt;code&gt;/etc/kubernetes/manifests/&lt;/code&gt; 下的 YAML。由于这些是 &lt;strong&gt;Static Pod&lt;/strong&gt;，&lt;code&gt;kubelet&lt;/code&gt; 会监控文件变化并自动重启组件应用新参数。&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;实验步骤指南&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#实验步骤指南&#34;&gt;#&lt;/a&gt; 实验步骤指南&lt;/h5&gt;
&lt;h5 id=&#34;方式一推荐直接用-job&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#方式一推荐直接用-job&#34;&gt;#&lt;/a&gt; 方式一（推荐）：直接用 Job&lt;/h5&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看结果：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl logs job/kube-bench&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;你会看到类似：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;[PASS] 1.1.1 Ensure API server pod specification file permissions are set to 644 or more restrictive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;[FAIL] 1.2.7 Ensure that the --authorization-mode argument includes Node&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2.定位漏洞与修复&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设报告中出现以下失败项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;[FAIL] 1.2.7 Ensure that the --authorization-mode argument includes Node&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[FAIL] 1.2.19 Ensure that the --profiling argument is set to false&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 修改 Manifest&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入目录并编辑 API Server 的定义文件：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;cd /etc/kubernetes/manifests/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;vi kube-apiserver.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;spec.containers.command&lt;/code&gt; 列表下添加或修改参数：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;- --authorization-mode=Node,RBAC  # 确保包含 Node&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;- --profiling=false               # 关闭分析接口以减少攻击面&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存退出后，等待约 30 秒，使用 &lt;code&gt;kubectl get pods -n kube-system&lt;/code&gt; 查看 api-server 是否重启成功&lt;/p&gt;
&lt;h5 id=&#34;kubernetes-安全-4层防线&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#kubernetes-安全-4层防线&#34;&gt;#&lt;/a&gt; Kubernetes 安全 = 4层防线&lt;/h5&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;① 身份（RBAC / authn）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;② 权限（authorization）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;③ 数据（etcd encryption）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;④ 节点（kubelet security）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/430/</guid>
            <title>Untitled Post - 4</title>
            <link>https://www.bondrewd.com/2026/07/16/430/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Thu, 16 Jul 2026 05:52:01 +0000</pubDate>
            <description><![CDATA[  ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/17-%E4%BD%BF%E7%94%A8-etcdctl-%E7%BB%83%E4%B9%A0%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D%E9%9B%86%E7%BE%A4%E6%95%B0%E6%8D%AE/</guid>
            <title>17-使用 etcdctl 练习备份与恢复集群数据</title>
            <link>https://www.bondrewd.com/2026/07/16/17-%E4%BD%BF%E7%94%A8-etcdctl-%E7%BB%83%E4%B9%A0%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D%E9%9B%86%E7%BE%A4%E6%95%B0%E6%8D%AE/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 05:46:01 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;ectdctl 是一个命令行界面 （CLI）工具，专门用于与 etcd 数据库进行交互。&lt;/p&gt;
&lt;p&gt;目前 ectd 普遍使用 v3 版本的 API ，操作前需要指定环境变量 &lt;code&gt;ETCDCTL_API=3&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;新版将 etcdctl 功能拆分了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ectdctl&lt;/code&gt;:用于与正在运行的 etcd 服务交互 （通过网络）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;etcdutl&lt;/code&gt;:用于处理离线文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;第一部分etcd-备份与恢复的心智模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第一部分etcd-备份与恢复的心智模型&#34;&gt;#&lt;/a&gt; 第一部分：etcd 备份与恢复的心智模型&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;集群所有状态都以键值对形式存储在 etcd 中。除了 kube-apiserver，没有任何组件可以直接和 etcd 对话。&lt;/li&gt;
&lt;li&gt;备份的本质是拷贝那一瞬间 etcd 底层 BoltDB 引擎的物理文件。&lt;/li&gt;
&lt;li&gt;恢复操作不是覆盖，而是那旧的快照文件，在一个全新的目录下解压重现当时的数据结构，然后修改 etcd 配置文件，指向这个新目录。&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;第二部分实战演练指南&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第二部分实战演练指南&#34;&gt;#&lt;/a&gt; 第二部分：实战演练指南&lt;/h5&gt;
&lt;h5 id=&#34;第一步准备万能钥匙设置-alias&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第一步准备万能钥匙设置-alias&#34;&gt;#&lt;/a&gt; 第一步：准备“万能钥匙”（设置 Alias）&lt;/h5&gt;
&lt;p&gt;在 kubeadm 搭建的集群中，etcd 启用了双向 TLS 认证。每次敲击 &lt;code&gt;etcdctl&lt;/code&gt; 都需要带上一长串证书路径，非常反人类。我们先设置一个临时别名来简化操作：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A0ADA0;--shiki-dark:#758575DD&#34;&gt;## 确认 etcdctl 已安装 (如果没有，可通过 apt/yum 安装 etcd-client)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A0ADA0;--shiki-dark:#758575DD&#34;&gt;## 设置别名，指定 API 版本为 3，并带上 kubeadm 默认的 etcd 证书路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#AB5959;--shiki-dark:#CB7676&#34;&gt;alias&lt;/span&gt;&lt;span style=&#34;color:#B07D48;--shiki-dark:#BD976A&#34;&gt; etcdctl&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#39;&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;ETCDCTL_API=3 etcdctl \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  --endpoints=https://127.0.0.1:2379 \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  --cacert=/etc/kubernetes/pki/etcd/ca.crt \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  --cert=/etc/kubernetes/pki/etcd/server.crt \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt;  --key=/etc/kubernetes/pki/etcd/server.key&lt;/span&gt;&lt;span style=&#34;color:#B5695977;--shiki-dark:#C98A7D77&#34;&gt;&#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;验证一下：&lt;/em&gt; 运行 &lt;code&gt;sudo etcdctl endpoint health&lt;/code&gt;，如果返回 &lt;code&gt;is healthy&lt;/code&gt;，说明钥匙管用。&lt;/p&gt;
&lt;h5 id=&#34;第二步制造案发现场创造测试数据&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第二步制造案发现场创造测试数据&#34;&gt;#&lt;/a&gt; 第二步：制造“案发现场”（创造测试数据）&lt;/h5&gt;
&lt;p&gt;我们在集群里留下一些独特的痕迹，证明当前的“时间线”。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; create&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; namespace&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; disaster-recovery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; run&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; survivor-pod&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; --image=nginx&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -n&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; disaster-recovery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; get&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; pods&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -n&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; disaster-recovery&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A0ADA0;--shiki-dark:#758575DD&#34;&gt;## 确保 pod 处于 Running 状态&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&#34;第三步时空冻结执行备份&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第三步时空冻结执行备份&#34;&gt;#&lt;/a&gt; 第三步：时空冻结（执行备份）&lt;/h5&gt;
&lt;p&gt;现在，我们将当前的集群状态备份到 &lt;code&gt;/opt/etcd-backup.db&lt;/code&gt; 文件中。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;etcdctl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; snapshot&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; save&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /opt/etcd-backup.db&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;验证一下：&lt;/em&gt; 运行 &lt;code&gt;etcdutl snapshot status /opt/etcd-backup.db -w table&lt;/code&gt;，你会看到备份文件的详细哈希和体积。&lt;/p&gt;
&lt;h5 id=&#34;第四步模拟灾难破坏数据&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第四步模拟灾难破坏数据&#34;&gt;#&lt;/a&gt; 第四步：模拟灾难（破坏数据）&lt;/h5&gt;
&lt;p&gt;现在，假装有新手误删了整个核心业务线。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; delete&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; namespace&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; disaster-recovery&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;验证一下：&lt;/em&gt; 此时再运行 &lt;code&gt;kubectl get pods -n disaster-recovery&lt;/code&gt;，会提示 Namespace 不存在。案发现场已被破坏。&lt;/p&gt;
&lt;h5 id=&#34;第五步解压快照生成新目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第五步解压快照生成新目录&#34;&gt;#&lt;/a&gt; 第五步：解压快照（生成新目录）&lt;/h5&gt;
&lt;p&gt;注意心智模型：我们要把备份恢复到一个&lt;strong&gt;全新的空目录&lt;/strong&gt;（例如 &lt;code&gt;/var/lib/etcd-restore&lt;/code&gt;），而不是直接覆盖现有的 &lt;code&gt;/var/lib/etcd&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;etcdutl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; snapshot&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; restore&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /opt/etcd-backup.db&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt;  --data-dir=/var/lib/etcd-restore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行完毕后，你可以 &lt;code&gt;ls -l /var/lib/etcd-restore&lt;/code&gt;，会发现里面生成了新的数据文件。&lt;/p&gt;
&lt;h5 id=&#34;第六步大脑移植切换-etcd-数据目录&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第六步大脑移植切换-etcd-数据目录&#34;&gt;#&lt;/a&gt; 第六步：大脑移植（切换 etcd 数据目录）&lt;/h5&gt;
&lt;p&gt;在 kubeadm 集群中，etcd 是以 Static Pod（静态 Pod）的形式运行的。kubelet 会死死盯着 &lt;code&gt;/etc/kubernetes/manifests/&lt;/code&gt; 目录。只要我们修改了里面的 yaml，kubelet 就会自动重启对应的 Pod。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;vi&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /etc/kubernetes/manifests/etcd.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;翻到文件最下面，找到 &lt;code&gt;volumes&lt;/code&gt; 挂载部分的 &lt;code&gt;hostPath&lt;/code&gt;。 &lt;strong&gt;将原来的 &lt;code&gt;/var/lib/etcd&lt;/code&gt; 修改为 &lt;code&gt;/var/lib/etcd-restore&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;  volumes&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;  -&lt;/span&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt; hostPath&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      path&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /etc/kubernetes/pki/etcd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      type&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; DirectoryOrCreate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;    name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; etcd-certs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;  -&lt;/span&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt; hostPath&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      path&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /var/lib/etcd-restore&lt;/span&gt;&lt;span style=&#34;color:#A0ADA0;--shiki-dark:#758575DD&#34;&gt;  # &amp;#x3C;--- 修改这里！&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;      type&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; DirectoryOrCreate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#998418;--shiki-dark:#B8A965&#34;&gt;    name&lt;/span&gt;&lt;span style=&#34;color:#999999;--shiki-dark:#666666&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; etcd-data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存并退出 (&lt;code&gt;:wq&lt;/code&gt;)。&lt;/p&gt;
&lt;h5 id=&#34;第七步见证奇迹&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#第七步见证奇迹&#34;&gt;#&lt;/a&gt; 第七步：见证奇迹&lt;/h5&gt;
&lt;p&gt;保存退出后，kubelet 会发现 yaml 发生了变化，开始销毁旧的 etcd pod 并挂载新目录启动新的 etcd。这个过程大概需要 30 秒到 1 分钟。在这期间，你敲 &lt;code&gt;kubectl&lt;/code&gt; 可能会卡住或报错（因为 apiserver 连不上数据库了），这是正常现象。&lt;/p&gt;
&lt;p&gt;耐心等待一小会儿，再次输入：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;kubectl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; get&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; pods&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; -n&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; disaster-recovery&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你会发现，刚才被删除的 &lt;code&gt;disaster-recovery&lt;/code&gt; 命名空间和里面的 &lt;code&gt;survivor-pod&lt;/code&gt; 又奇迹般地复活了！这就标志着你的集群时光倒流成功。&lt;/p&gt;
&lt;h5 id=&#34;总结&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#总结&#34;&gt;#&lt;/a&gt; 总结&lt;/h5&gt;
&lt;p&gt;常用命令：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据备份&lt;/strong&gt;：&lt;code&gt;etcdctl snapshot save backup.db&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;查看备份文件哈希和体积&lt;/strong&gt;： &lt;code&gt;etcdutl snapshot status /opt/etcd-backup.db -w table&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;备份恢复到指定路径：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#59873A;--shiki-dark:#80A665&#34;&gt;etcdutl&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; snapshot&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; restore&lt;/span&gt;&lt;span style=&#34;color:#B56959;--shiki-dark:#C98A7D&#34;&gt; /opt/etcd-backup.db&lt;/span&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span style=&#34;color:#A65E2B;--shiki-dark:#C99076&#34;&gt;  --data-dir=/var/lib/etcd-restore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/%E5%A4%9A%E5%AE%B9%E5%99%A8%E6%9E%B6%E6%9E%84%E5%AE%9E%E6%88%98%EF%BC%88sidecar-%E8%BE%B9%E8%BD%A6%E6%A8%A1%E5%BC%8F%E6%94%B6%E9%9B%86%E6%97%A5%E5%BF%97%EF%BC%89/</guid>
            <title>16-多容器架构实战（Sidecar 边车模式收集日志）</title>
            <link>https://www.bondrewd.com/2026/07/16/%E5%A4%9A%E5%AE%B9%E5%99%A8%E6%9E%B6%E6%9E%84%E5%AE%9E%E6%88%98%EF%BC%88sidecar-%E8%BE%B9%E8%BD%A6%E6%A8%A1%E5%BC%8F%E6%94%B6%E9%9B%86%E6%97%A5%E5%BF%97%EF%BC%89/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Thu, 16 Jul 2026 05:35:25 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;在真实的生产环境中，很多老旧系统（Legacy Systems）并不符合云原生标准。它们不会把日志输出到终端（&lt;code&gt;stdout&lt;/code&gt;），而是死板地写进容器内的某个文件里（比如 &lt;code&gt;/var/log/app.log&lt;/code&gt;）。这就导致 Kubernetes 原生的 &lt;code&gt;kubectl logs&lt;/code&gt; 命令直接失效（因为它只抓取容器的 &lt;code&gt;stdout&lt;/code&gt;）。&lt;/p&gt;
&lt;h4 id=&#34;核心技术逻辑sidecar边车模式与共享卷&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#核心技术逻辑sidecar边车模式与共享卷&#34;&gt;#&lt;/a&gt; 核心技术逻辑：Sidecar（边车）模式与共享卷&lt;/h4&gt;
&lt;p&gt;要在不修改老旧代码的前提下解决这个问题，K8s 给出的标准答案是：&lt;strong&gt;Sidecar 模式&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pod 的本质：&lt;/strong&gt; Pod 不是一个容器，而是一个“容器组”。同一个 Pod 内的多个容器共享网络（localhost）和存储卷。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EmptyDir 卷（桥梁）：&lt;/strong&gt; 我们创建一个生命周期与 Pod 绑定的临时存储卷 &lt;code&gt;emptyDir&lt;/code&gt;，把它同时挂载给这两个容器。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据流向：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;业务容器 (Main)：&lt;/strong&gt; 把日志不断写入挂载的目录中（例如 &lt;code&gt;/var/log/app/sys.log&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边车容器 (Sidecar)：&lt;/strong&gt; 同样挂载这个目录，只运行一个极为简单的命令（如 &lt;code&gt;tail -f /var/log/app/sys.log&lt;/code&gt;），把文件内容实时读取出来，并输出到&lt;strong&gt;自己的&lt;/strong&gt;终端（&lt;code&gt;stdout&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最终结果：&lt;/strong&gt; 此时，你只需要用 &lt;code&gt;kubectl logs&lt;/code&gt; 去看那个 Sidecar 容器，就能完美获取老旧系统的日志了！&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;实战挑战&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#实战挑战&#34;&gt;#&lt;/a&gt; 实战挑战&lt;/h4&gt;
&lt;p&gt;我们将从零手写一个包含两个容器的 Pod YAML。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 编写多容器 Pod 配置文件 &lt;code&gt;sidecar-pod.yaml&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: legacy-app-pod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # 1. 声明一个共享的空目录卷&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  volumes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: shared-logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    emptyDir: &amp;#123;&amp;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  containers:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # 2. 这是老旧的业务主容器（它只往文件里写，不往屏幕上打）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: main-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: busybox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;/bin/sh&#34;, &#34;-c&#34;, &#34;while true; do echo &#39;$(date) - ERROR: legacy system failure&#39; &gt;&gt; /var/log/app/sys.log; sleep 2; done&#34;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    volumeMounts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - name: shared-logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      mountPath: /var/log/app   # 挂载到业务容器的这个路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # 3. 这是我们注入的 Sidecar 日志收集容器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: log-sidecar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    image: busybox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    command: [&#34;/bin/sh&#34;, &#34;-c&#34;, &#34;tail -f /var/log/app/sys.log&#34;] # 实时读取文件并输出到标准输出&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    volumeMounts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - name: shared-logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      mountPath: /var/log/app   # 必须挂载同一个卷到相同的（或不同的）路径&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2. 部署这个“双黄蛋” Pod：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl apply -f sidecar-pod.yaml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3. 观察多容器的就绪状态：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl get pod legacy-app-pod -w&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;预期现象：&lt;/strong&gt; 注意看 &lt;code&gt;READY&lt;/code&gt; 那一列。普通的 Pod 是 &lt;code&gt;1/1&lt;/code&gt;，而这个 Pod 在启动时会显示 &lt;code&gt;0/2&lt;/code&gt;，最终变成 &lt;code&gt;2/2&lt;/code&gt;。这代表里面的两个容器都已成功运行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;阶段二见证-sidecar-的魔法-cka-必考命令&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#阶段二见证-sidecar-的魔法-cka-必考命令&#34;&gt;#&lt;/a&gt; 阶段二：见证 Sidecar 的魔法 (CKA 必考命令)&lt;/h4&gt;
&lt;p&gt;现在，我们来验证日志提取。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 尝试直接获取 Pod 日志（会报错）：&lt;/strong&gt; 在单容器时代，你习惯直接敲 &lt;code&gt;kubectl logs &amp;lt;pod-name&amp;gt;&lt;/code&gt;。但在多容器时代，这行不通了：&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl logs legacy-app-pod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;预期输出：&lt;/strong&gt; &lt;code&gt;error: a container name must be specified for pod legacy-app-pod...&lt;/code&gt; K8s 会抱怨：你这 Pod 里有两个容器，你到底要看谁的？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2. 明确指定容器名称（查看主容器）：&lt;/strong&gt; 使用 &lt;code&gt;-c&lt;/code&gt; 参数指定容器名。&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl logs legacy-app-pod -c main-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;预期输出：&lt;/strong&gt; 空空如也。因为老旧系统没有向终端输出任何东西。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. 见证奇迹时刻（查看 Sidecar 容器）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl logs legacy-app-pod -c log-sidecar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;预期输出：&lt;/strong&gt; 你会看到屏幕上源源不断地打印出带有时间戳的 &lt;code&gt;ERROR: legacy system failure&lt;/code&gt;！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这就是 Sidecar 模式的魅力：&lt;strong&gt;解耦&lt;/strong&gt;。业务容器专心跑业务，日志容器专心搬运日志，互不干扰，却完美协同。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;清理&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#清理&#34;&gt;#&lt;/a&gt; 清理&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kubectl delete pod legacy-app-pod&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/07/16/wp-global-styles-sakurairo/</guid>
            <title>Custom Styles</title>
            <link>https://www.bondrewd.com/2026/07/16/wp-global-styles-sakurairo/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Thu, 16 Jul 2026 05:32:52 +0000</pubDate>
            <description><![CDATA[ &lt;p version:=&#34;&#34; 3,=&#34;&#34; isGlobalStylesUserThemeJSON:=&#34;&#34; true=&#34;&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/26/wp-global-styles-twentytwentythree/</guid>
            <title>Custom Styles</title>
            <link>https://www.bondrewd.com/2026/03/26/wp-global-styles-twentytwentythree/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Thu, 26 Mar 2026 04:38:10 +0000</pubDate>
            <description><![CDATA[ &lt;p version:=&#34;&#34; 3,=&#34;&#34; isGlobalStylesUserThemeJSON:=&#34;&#34; true=&#34;&#34;&gt;&lt;/p&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/transformer-%E7%AE%80%E4%BB%8B/</guid>
            <title>Transformer 简介</title>
            <link>https://www.bondrewd.com/2026/03/24/transformer-%E7%AE%80%E4%BB%8B/</link>
            <category term="深度学习" scheme="https://www.bondrewd.com/categories/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/" />
            <pubDate>Tue, 24 Mar 2026 04:44:17 +0000</pubDate>
            <description><![CDATA[ &lt;h3 id=&#34;背景&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#背景&#34;&gt;#&lt;/a&gt; 背景&lt;/h3&gt;
&lt;p&gt;给定一个翻译任务：将 I love you baby 翻译为中文。&lt;/p&gt;
&lt;p&gt;先把每一个词转换成对应的 &lt;code&gt;词向量&lt;/code&gt;，考虑按照下面方式处理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接丢到 MLP 中，那么：
&lt;ul&gt;
&lt;li&gt;每个词都会&lt;strong&gt;失去上下文信息&lt;/strong&gt;，且长度只能一一对应&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774354582-image-744x1024.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;用 RNN，那么：
&lt;ul&gt;
&lt;li&gt;会面临&lt;strong&gt;串行计算&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;句子太长会导致&lt;strong&gt;记不住长距离的信息&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774354614-image-1024x450.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;注意力机制-attention&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#注意力机制-attention&#34;&gt;#&lt;/a&gt; 注意力机制 Attention&lt;/h3&gt;
&lt;p&gt;上面两个方法都有缺陷，可以考虑按照下面的方法处理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先，给每个 &lt;code&gt;词向量&lt;/code&gt;&lt;strong&gt;加上&lt;/strong&gt;各自的 &lt;code&gt;位置编码&lt;/code&gt;（表示该词出现在整个句子中的位置），现在这个词向量就具备了位置信息&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774354656-image-1024x366.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;但现在每个词都还没有其他词的上下文信息（注意不到其他词的存在）。用&lt;code&gt;权重矩阵&lt;/code&gt; &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_q&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9933em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 与第一个词向量相乘(&lt;code&gt;MatMul&lt;/code&gt;)，得到维度不变的 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 矩阵。同理，用 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_k, W\_v&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 矩阵处理得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;k\_1, v\_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。同理，得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_{1,2,3,4}, k\_{1,2,3,4}, v\_{1,2,3,4}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;其中 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_q, W\_k, W\_v&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 矩阵都是可以经过训练学习到的一组权重值&lt;/em&gt;。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;实际在 GPU 中运算时，是把词向量拼接成一个矩阵，再与 W 矩阵相乘。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355126-image-1024x607.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355131-image-1024x607.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355170-image-1024x731.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;现在，原来的词向量已经通过线性变换映射成了维度相同的 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q, k, v&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8889em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 。将 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 与 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;k\_2&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 做 &lt;code&gt;内积&lt;/code&gt; 得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_{12}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，表示在第一个词的视角下，与第二个词的 &lt;code&gt;相似度系数&lt;/code&gt;。同理，得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;11&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;13&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;14&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_{11}, a\_{12}, a\_{13}, a\_{14}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;11&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;12&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord&#34;&gt;14&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355272-image-1024x490.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;得到相似度系数后，分别和 v 向量相乘，再相加，得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，表示在第一个词的视角下的&lt;strong&gt;全部上下文信息&lt;/strong&gt;。同理，得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_1, a\_2, a\_3, a\_4&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_1&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_2&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_3&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;_4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355339-image-1024x296.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355350-image-1024x696.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;从全局的视角看，就是把最初的词向量，处理得到新的词向量（包含了&lt;strong&gt;位置信息&lt;/strong&gt;和&lt;strong&gt;其他词上下文信息&lt;/strong&gt;），这就是 &lt;code&gt;注意力机制 Attention&lt;/code&gt; 的原理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355506-image-1024x653.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;多头注意力机制-multi-head-attention&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#多头注意力机制-multi-head-attention&#34;&gt;#&lt;/a&gt; 多头注意力机制 Multi-Head Attention&lt;/h3&gt;
&lt;p&gt;对于注意力机制而言，通过一种方式计算一次相关性，那么灵活性会大大降低。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;之前是每个词向量计算一组 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_{i}, k\_{i}, v\_{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ，现在基于原来的 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_{i}, k\_{i}, v\_{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，再经过两个&lt;code&gt;权重矩阵&lt;/code&gt; W 变成两组 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;q&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;k&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo separator=&#34;true&#34;&gt;,&lt;/mo&gt;&lt;mi&gt;v&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;q\_{i}, k\_{i}, v\_{i}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03148em;&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mpunct&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.1667em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，相当于&lt;strong&gt;给每个词向量两次学习机会&lt;/strong&gt;，学习到不同的待计算相似度的 $q_{ij}, k_{ij}, v_{ij} $（&lt;code&gt;头部 head&lt;/code&gt;）来增加语言的灵活性。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355598-image-1024x622.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;两个 &lt;code&gt;head&lt;/code&gt; 经过注意力层的计算，得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_{ij}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9695em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.05724em;&#34;&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 向量，再把两个 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;a\_{ij}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9695em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.05724em;&#34;&gt;ij&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 向量拼接起来，得到和原词向量相同维度的新词向量。这种方式也即 &lt;code&gt;多头注意力机制机制 Multi-Head Attention&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355635-image-1024x502.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355638-image-1024x642.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;transformer-论文架构图&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#transformer-论文架构图&#34;&gt;#&lt;/a&gt; Transformer 论文架构图&lt;/h3&gt;
&lt;h4 id=&#34;整体架构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#整体架构&#34;&gt;#&lt;/a&gt; 整体架构&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;把输入的内容通过 &lt;code&gt;词嵌入 Word Embedding&lt;/code&gt; 的方式转换为向量矩阵&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355930-image-1024x710.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;加入位置信息&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355902-image-1024x618.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;经过多头注意力的处理，输入、输出的矩阵在维度上没有变化，输出的矩阵的每个词向量都增加了&lt;strong&gt;上下文信息&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;后面的 &lt;code&gt;Add &amp;amp; Norm&lt;/code&gt; 是优化步骤。表示 &lt;code&gt;残差网络&lt;/code&gt; 和 &lt;code&gt;归一化&lt;/code&gt;，是为了&lt;strong&gt;解决梯度消失问题、让分布更加稳定&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355939-image-1024x636.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;多头注意力架构&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#多头注意力架构&#34;&gt;#&lt;/a&gt; 多头注意力架构&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;单头注意力：先让 q, k 内积，得到一个 &lt;code&gt;相似度系数&lt;/code&gt; 的矩阵，再和 v 相乘，得到包含上下文信息的词向量矩阵
&lt;ul&gt;
&lt;li&gt;Scale：缩放&lt;/li&gt;
&lt;li&gt;Mask：掩码&lt;/li&gt;
&lt;li&gt;SoftMax：将输出映射到(0, 1)区间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\frac&lt;ruby&gt;QK&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;T&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;{\sqrt{d_k}})V&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774355952-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;多头注意力机制&lt;br /&gt;
q,k,v 分别经过 &lt;code&gt;线性变换 Linear&lt;/code&gt;（&lt;code&gt;矩阵乘法&lt;/code&gt;）拆分成多组（相当于给了多次机会学习到不同的相似度关系），依次经过 &lt;code&gt;单头注意力机制&lt;/code&gt; 运算后，把运算结果拼接 Concat 起来。最后再用权重矩阵 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W^O&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8413em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8413em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.02778em;&#34;&gt;O&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 进行线性变换&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MultiHead(Q,K,V)=Concat(head1,…,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)\begin&lt;ruby&gt;align\*} \\text{MultiHead}(Q, K, V) &amp;amp;= \\text{Concat}(\\text{head}\_1, \\dots, \\text{head}\_h) W&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;O \\\\ \\text{head&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;_i &amp;amp;= \text&lt;ruby&gt;Attention}(Q W\_i&lt;rp&gt;(&lt;/rp&gt;&lt;rt&gt;Q, K W\_i^K, V W\_i^V) \\\\ \\end{align\*&lt;/rt&gt;&lt;rp&gt;)&lt;/rp&gt;&lt;/ruby&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774356093-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;编码器与解码器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#编码器与解码器&#34;&gt;#&lt;/a&gt; 编码器与解码器&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774356122-image-670x1024.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;用原来的翻译任务为例：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编码器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入要翻译的文本&lt;/li&gt;
&lt;li&gt;经过 词嵌入 Embedding，引入位置编码 Positional Encoding&lt;/li&gt;
&lt;li&gt;经过多头注意力、残差和归一化&lt;/li&gt;
&lt;li&gt;送入一个全连接神经网络 Feed Forward，再残差和归一化&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结果送入解码器的一个多头注意力机制的两个输入中&lt;/strong&gt;（作为 &lt;code&gt;K&lt;/code&gt;, &lt;code&gt;V&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解码器&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;输入要翻译的文本&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;经过 词嵌入 Embedding，引入位置编码 Positional Encoding&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;经过 &lt;code&gt;掩码后的多头注意力&lt;/code&gt;、残差和归一化，送入多头注意力的一个输入中（作为 &lt;code&gt;Q&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K,V,Q&lt;/code&gt; 进行多头注意力，再残差和归一化&lt;/li&gt;
&lt;li&gt;最后结果一层线性变换的神经网络，把向量投射到词表向量中&lt;/li&gt;
&lt;li&gt;Softmax 转化为概率&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Masked Attention&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;作用：&lt;strong&gt;屏蔽未来位置信息&lt;/strong&gt;，保证解码器只能基于已生成的前缀序列预测下一个词&lt;/li&gt;
&lt;li&gt;Transformer 解码器是&lt;strong&gt;自回归生成模型&lt;/strong&gt;：每一步的输出都依赖于之前所有的输出&lt;/li&gt;
&lt;li&gt;掩码是一个上三角矩阵，未来位置的注意力权重置为 −∞（或极小值）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;参考链接：&lt;a href=&#34;https://www.bilibili.com/video/BV1C3dqYxE3q?spm_id_from=333.788.videopod.sections&amp;amp;vd_source=c5551749b3e52456db43941bf55d8d6b&#34;&gt;Transformer 其实是个简单到令人困惑的模型【AI入门06】_哔哩哔哩_bilibili&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86-lstm/</guid>
            <title>长短期记忆 LSTM</title>
            <link>https://www.bondrewd.com/2026/03/24/%E9%95%BF%E7%9F%AD%E6%9C%9F%E8%AE%B0%E5%BF%86-lstm/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Tue, 24 Mar 2026 04:05:53 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;长短期记忆（Long Short-Term Memory，&lt;code&gt;LSTM&lt;/code&gt;） 是 &lt;a href=&#34;https://iplusjia.top/2026/03/24/%e5%be%aa%e7%8e%af%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c-rnn/&#34;&gt;RNN&lt;/a&gt; 最重要的变体，也是深度学习 NLP 发展史上的&lt;strong&gt;里程碑&lt;/strong&gt;。在 Transformer 出现之前（2017 年），LSTM 是序列建模的绝对王者。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;背景rnn-梯度消失&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#背景rnn-梯度消失&#34;&gt;#&lt;/a&gt; 背景：RNN 梯度消失&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;句子：&amp;quot;我住在法国，...（中间 200 个字）... 所以我会说___&amp;quot;&lt;br /&gt;
空格应该填 &lt;em&gt;“法语”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;RNN 的问题&lt;/strong&gt;：&lt;br /&gt;
需要记住 200 个字前的&amp;quot;法国&amp;quot;。&lt;code&gt;反向传播&lt;/code&gt; 时，梯度要连乘 200 次，导致前面的信息传不过来。&lt;br /&gt;
&lt;em&gt;如果每次乘 0.9 → &lt;code&gt;0.9^200 ≈ 0.000000001&lt;/code&gt; → &lt;strong&gt;梯度消失&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;lstm-的结构及接口&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#lstm-的结构及接口&#34;&gt;#&lt;/a&gt; LSTM 的结构及接口&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774353528-image-1024x403.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774353542-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;LSTM 与 RNN 的接口的不同之处在于，LSTM 还有路径 &lt;code&gt;c&lt;/code&gt;。这个 c 称为 &lt;code&gt;记忆单元&lt;/code&gt;（或者简称为“单元”），相当于 LSTM 专用的记忆部门。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;记忆单元的特点：&lt;strong&gt;仅在 LSTM 层内部接收和传递数据&lt;/strong&gt;，对外部不可见，我们甚至不用考虑它的存在&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\sigma&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.854em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ma&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;：&lt;code&gt;sigmoid函数&lt;/code&gt;用于求门的开合程度（sigmoid函数的输出范围在0.0 ~ 1.0）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;输出门-output-gate&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#输出门-output-gate&#34;&gt;#&lt;/a&gt; 输出门 Output Gate&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：决定&lt;strong&gt;输出&lt;/strong&gt;哪些信息作为隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;（求出隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;o\_t = \\sigma\\left(x\_t W\_x^{(o)} + h\_{t-1} W\_h^{(o)} + b^{(o)}\\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9251em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.854em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ma&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mopen&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.888em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1em;vertical-align:-0.25em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;隐藏状态&lt;/code&gt; &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;⊙&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h\_t=o\_t ⊙ \\tanh(c\_t)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9251em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;⊙&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.06em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;anh&lt;/span&gt;&lt;span class=&#34;mopen&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，记忆单元 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;c\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9251em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 和隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的关系只是按元素应用 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\tanh&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;anh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 函数。这意味着，记忆单元 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;c\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9251em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 和隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h\_t&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 的_元素个数相同_。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⊙ 表示 &lt;code&gt;阿达玛乘积&lt;/code&gt;。即，对应元素的乘积&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;遗忘门-forget-gate&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#遗忘门-forget-gate&#34;&gt;#&lt;/a&gt; 遗忘门 Forget Gate&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：决定从细胞状态中&lt;strong&gt;丢弃&lt;/strong&gt;哪些信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;f\_t = \\sigma\\left(x\_t W\_x^{(f)} + h\_{t-1} W\_h^{(f)} + b^{(f)}\\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.854em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ma&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mopen&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.888em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1em;vertical-align:-0.25em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;输入门-input-gate&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#输入门-input-gate&#34;&gt;#&lt;/a&gt; 输入门 Input Gate&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用&lt;/strong&gt;：决定&lt;strong&gt;更新&lt;/strong&gt;哪些新信息到细胞状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;i\_t = \\sigma\\left(x\_t W\_x^{(i)} + h\_{t-1} W\_h^{(i)} + b^{(i)}\\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9695em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.854em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ma&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mopen&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.888em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1em;vertical-align:-0.25em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;新的记忆单元&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#新的记忆单元&#34;&gt;#&lt;/a&gt; 新的记忆单元&lt;/h4&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774353784-image-1024x712.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;向记忆单元添加的&lt;code&gt;新信息&lt;/code&gt; ：&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mrow&gt;&lt;mo stretchy=&#34;false&#34;&gt;(&lt;/mo&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo stretchy=&#34;false&#34;&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\hat{c\_t} = \\tanh\\left(x\_t W\_x^{(g)} + h\_{t-1} W\_h^{(g)} + b^{(g)}\\right)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ha&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;anh&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mopen&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.198em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.888em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.888em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mopen mtight&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mord mathnormal mtight&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mclose mtight&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1em;vertical-align:-0.25em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mclose&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;新的记忆单元&lt;/code&gt;： &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;⊙&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;⊙&lt;/mo&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;c\_t=f ⊙ c\_{t-1} + i ⊙ \\hat{c\_t}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9251em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8889em;vertical-align:-0.1944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;⊙&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.9544em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.7429em;vertical-align:-0.0833em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;⊙&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ha&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;，&lt;em&gt;细胞状态 = 遗忘 × 旧细胞 + 输入 × 新候选&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\hat{c\_t}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ha&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 也即上面的 g&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个 tanh 节点的作用不是门，而是将新的信息添加到记忆单元中&lt;/strong&gt;。因此，它不用 &lt;code&gt;sigmoid 函数&lt;/code&gt; 作为激活函数，而是使用 &lt;code&gt;tanh 函数&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;lstm-不会梯度消失&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#lstm-不会梯度消失&#34;&gt;#&lt;/a&gt; LSTM 不会梯度消失&lt;/h3&gt;
&lt;p&gt;观察记忆单元的反向传播：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774353862-image-1024x298.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;记忆单元的反向传播仅流过 &lt;code&gt;+&lt;/code&gt; 和 &lt;code&gt;×&lt;/code&gt; 节点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;+ 节点&lt;/code&gt; 将上游传来的&lt;strong&gt;梯度原样流出&lt;/strong&gt;，所以梯度没有变化（退化）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;× 节点&lt;/code&gt; 的计算并&lt;strong&gt;不是矩阵乘积&lt;/strong&gt;，而是对应元素的乘积（阿达玛积）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;pytorch-代码示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pytorch-代码示例&#34;&gt;#&lt;/a&gt; PyTorch 代码示例&lt;/h3&gt;
&lt;p&gt;基础 LSTM：&lt;/p&gt;
&lt;p&gt;import torch&lt;br /&gt;
import torch.nn as nn&lt;/p&gt;
&lt;p&gt;class SimpleLSTM(nn.Module):&lt;br /&gt;
def __init__(self, input_size, hidden_size, num_layers, num_classes):&lt;br /&gt;
super().__init__()&lt;br /&gt;
self.hidden_size = hidden_size&lt;br /&gt;
self.num_layers = num_layers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    # LSTM 层
    self.lstm = nn.LSTM(input\_size, hidden\_size, 
                       num\_layers=num\_layers,
                       batch\_first=True,
                       dropout=0.3)  # 层间 Dropout
    
    # 全连接层
    self.fc = nn.Linear(hidden\_size, num\_classes)

def forward(self, x):
    # x: (batch\_size, seq\_len, input\_size)
    
    # 初始化隐藏状态
    h0 = torch.zeros(self.num\_layers, x.size(0), self.hidden\_size)
    c0 = torch.zeros(self.num\_layers, x.size(0), self.hidden\_size)
    
    # 前向传播
    out, (hn, cn) = self.lstm(x, (h0, c0))
    # out: (batch, seq\_len, hidden\_size)
    # hn: (num\_layers, batch, hidden\_size)
    
    # 取最后一个时间步的输出
    out = self.fc(out\[:, -1, :\])
    return out
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;使用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#使用&#34;&gt;#&lt;/a&gt; 使用&lt;/h2&gt;
&lt;p&gt;model = SimpleLSTM(input_size=100, hidden_size=128,&lt;br /&gt;
num_layers=2, num_classes=2)&lt;/p&gt;
&lt;p&gt;IMDB 情感分析:&lt;/p&gt;
&lt;p&gt;import torch.optim as optim&lt;/p&gt;
&lt;h2 id=&#34;超参数&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#超参数&#34;&gt;#&lt;/a&gt; 超参数&lt;/h2&gt;
&lt;p&gt;batch_size = 64&lt;br /&gt;
seq_len = 100&lt;br /&gt;
learning_rate = 0.001&lt;br /&gt;
epochs = 10&lt;/p&gt;
&lt;h2 id=&#34;模型-损失-优化器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#模型-损失-优化器&#34;&gt;#&lt;/a&gt; 模型、损失、优化器&lt;/h2&gt;
&lt;p&gt;model = SentimentBiLSTM(vocab_size=10000, embed_dim=300,&lt;br /&gt;
hidden_size=128, num_classes=2)&lt;br /&gt;
criterion = nn.CrossEntropyLoss()&lt;br /&gt;
optimizer = optim.Adam(model.parameters(), lr=learning_rate)&lt;/p&gt;
&lt;h2 id=&#34;训练循环&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#训练循环&#34;&gt;#&lt;/a&gt; 训练循环&lt;/h2&gt;
&lt;p&gt;for epoch in range(epochs):&lt;br /&gt;
model.train()&lt;br /&gt;
total_loss = 0&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for batch\_x, batch\_y in train\_loader:
    # batch\_x: (64, 100), batch\_y: (64,)
    
    optimizer.zero\_grad()
    output = model(batch\_x)
    loss = criterion(output, batch\_y)
    loss.backward()
    
    # 梯度裁剪（防止 LSTM 梯度爆炸）⭐
    torch.nn.utils.clip\_grad\_norm\_(model.parameters(), 1.0)
    
    optimizer.step()
    total\_loss += loss.item()

# 验证
model.eval()
correct = 0
total = 0
with torch.no\_grad():
    for batch\_x, batch\_y in val\_loader:
        output = model(batch\_x)
        predicted = torch.argmax(output, dim=1)
        correct += (predicted == batch\_y).sum().item()
        total += batch\_y.size(0)

val\_acc = correct / total
print(f&amp;quot;Epoch &amp;#123;epoch+1&amp;#125;: Loss=&amp;#123;total\_loss:.4f&amp;#125;, Val Acc=&amp;#123;val\_acc:.4f&amp;#125;&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/%E5%BE%AA%E7%8E%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C-rnn/</guid>
            <title>循环神经网络 RNN</title>
            <link>https://www.bondrewd.com/2026/03/24/%E5%BE%AA%E7%8E%AF%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C-rnn/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Tue, 24 Mar 2026 03:54:06 +0000</pubDate>
            <description><![CDATA[ &lt;h3 id=&#34;背景及推导&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#背景及推导&#34;&gt;#&lt;/a&gt; 背景及推导&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;需求&lt;/strong&gt;：输入一句话，输出每个单词的褒贬性&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352814-image-1024x509.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;假设对于上面 5 个单词，每个单词采用 300 维的 &lt;code&gt;词向量&lt;/code&gt;，那么输入端就需要 1500 个词向量，这会带来几个&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输入层的&lt;strong&gt;节点太多&lt;/strong&gt;了，并且是&lt;strong&gt;变长&lt;/strong&gt;的，会随着句子的长短发生变化&lt;/li&gt;
&lt;li&gt;无法体现词语之间的&lt;strong&gt;先后顺序&lt;/strong&gt;，仅仅只是把他们拉直展开成一个大向量，直接送入输入层（类似于 MLP）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了解决上述缺点，&lt;strong&gt;可以让上一步的信息参与下一步的运算&lt;/strong&gt;，具体可以这样做：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352850-image-1024x521.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352856-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一个词 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;X^{&amp;lt;1&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.07847em;&#34;&gt;X&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 经过非线性变换 g(&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\cdot&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;) 后得到一个中间结果(&lt;code&gt;隐藏状态&lt;/code&gt;) &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h^{&amp;lt;1&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ，它再经过一次非线性变换得到第一个输出 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;Y&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;Y^{&amp;lt;1&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.22222em;&#34;&gt;Y&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接着，第二个词 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;X&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;X^{&amp;lt;2&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.07847em;&#34;&gt;X&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 与刚才的隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h^{&amp;lt;1&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 一起参与非线性变换，得到隐藏状态 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;h^{&amp;lt;2&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; ，它再经过一次非线性变换得到 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msup&gt;&lt;mi&gt;Y&lt;/mi&gt;&lt;mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;/mrow&gt;&lt;/msup&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;Y^{&amp;lt;2&amp;gt;}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.22222em;&#34;&gt;Y&lt;/span&gt;&lt;span class=&#34;msupsub&#34;&gt;&lt;span class=&#34;vlist-t&#34;&gt;&lt;span class=&#34;vlist-r&#34;&gt;&lt;span class=&#34;vlist&#34; style=&#34;height:0.8141em;&#34;&gt;&lt;span style=&#34;top:-3.063em;margin-right:0.05em;&#34;&gt;&lt;span class=&#34;pstrut&#34; style=&#34;height:2.7em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;sizing reset-size6 size3 mtight&#34;&gt;&lt;span class=&#34;mord mtight&#34;&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mord mtight&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;mrel mtight&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;g(&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\cdot&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;o&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)：&lt;em&gt;激活函数，一般取双曲正切 tanh&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_{xh}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;x&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;：专门针对词向量的矩阵&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_{hh}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;hh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;：&lt;em&gt;专门针对隐藏状态的矩阵&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;W&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;h&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;W\_{hy}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.13889em;&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;h&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.03588em;&#34;&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;：&lt;em&gt;专门针对输出结果的矩阵&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;b&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6944em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;：&lt;em&gt;偏置项 bias&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上图流程可以简化为下面两种等效表达方式：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352905-image-1024x507.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352921-image-1024x377.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;参考链接：&lt;a href=&#34;https://www.bilibili.com/video/BV1MNoRYEEVM/?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=c5551749b3e52456db43941bf55d8d6b&#34;&gt;语言居然可以被计算出来？从 RNN 到 Transformer【AI入门05】_哔哩哔哩_bilibili&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;rnn-的问题梯度消失爆炸&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#rnn-的问题梯度消失爆炸&#34;&gt;#&lt;/a&gt; RNN 的问题：梯度消失/爆炸&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352959-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反向传播时&lt;/strong&gt;，梯度需要从后往前传：&lt;/p&gt;
&lt;p&gt;∂L∂W=∂L∂sn×∂sn∂sn−1×∂sn−1∂sn−2×...×∂s1∂W\frac{\partial L}{\partial W}=\frac{\partial L}{\partial s_n}\times\frac{\partial s_n}{\partial s_{n-1}}\times\frac{\partial s_{n-1}}{\partial s_{n-2}}\times ... \times\frac{\partial s_1}{\partial W}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mo&gt;&amp;lt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\frac{\\partial s\_t}{\\partial s\_{t-1}} &amp;lt; 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6444em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;（如 0.5），连乘 100 次 → &lt;code&gt;0.5^100 ≈ 0&lt;/code&gt; → &lt;strong&gt;梯度消失&lt;/strong&gt; → 前面的权重几乎不更新 → 模型&lt;strong&gt;记不住长距离信息&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如果 &lt;span class=&#34;katex&#34;&gt;&lt;span class=&#34;katex-mathml&#34;&gt;&lt;math xmlns=&#34;http://www.w3.org/1998/Math/MathML&#34;&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mspace linebreak=&#34;newline&#34;&gt;&lt;/mspace&gt;&lt;mi&gt;p&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi mathvariant=&#34;normal&#34;&gt;_&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mo&gt;&amp;gt;&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding=&#34;application/x-tex&#34;&gt;\\frac{\\partial s\_t}{\\partial s\_{t-1}} &amp;gt; 1&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;span class=&#34;katex-html&#34; aria-hidden=&#34;true&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:1.0044em;vertical-align:-0.31em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.10764em;&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mspace newline&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.02778em;&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;ia&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34; style=&#34;margin-right:0.01968em;&#34;&gt;l&lt;/span&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;mord&#34; style=&#34;margin-right:0.02778em;&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;&lt;span class=&#34;mord mathnormal&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mbin&#34;&gt;−&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2222em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mrel&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;mspace&#34; style=&#34;margin-right:0.2778em;&#34;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;base&#34;&gt;&lt;span class=&#34;strut&#34; style=&#34;height:0.6444em;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mord&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;（如 1.5），连乘 100 次 → &lt;code&gt;1.5^100 ≈ 亿&lt;/code&gt; → &lt;strong&gt;梯度爆炸&lt;/strong&gt; → 权重变成 &lt;code&gt;NaN&lt;/code&gt; → 模型训练崩溃&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：&lt;br /&gt;
原始的 RNN 几乎已被淘汰&lt;/p&gt;
&lt;p&gt;方法&lt;/p&gt;
&lt;p&gt;说明&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;梯度裁剪&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;限制梯度最大值（如 1.0）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ReLU 激活&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;缓解梯度消失（但 RNN 常用 tanh）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LSTM/GRU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最有效的方案&lt;/strong&gt; ⭐ LSTM 和 GRU 中增加了一种名为“门”的结构&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Gated RNN&lt;/p&gt;
&lt;p&gt;在 RNN 的学习中，&lt;code&gt;梯度消失&lt;/code&gt; 也是一个大问题。为了解决这个问题，需要从根本上改变 RNN 层的结构。人们已经提出了诸多 Gated RNN 框架，其中具有代表性的有 &lt;a href=&#34;https://iplusjia.top/2026/03/24/%e9%95%bf%e7%9f%ad%e6%9c%9f%e8%ae%b0%e5%bf%86-lstm/&#34;&gt;LSTM&lt;/a&gt; 和 &lt;code&gt;GRU&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;pytorch-代码示例&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#pytorch-代码示例&#34;&gt;#&lt;/a&gt; PyTorch 代码示例&lt;/h3&gt;
&lt;p&gt;基础 RNN：&lt;/p&gt;
&lt;p&gt;import torch&lt;br /&gt;
import torch.nn as nn&lt;/p&gt;
&lt;p&gt;class SimpleRNN(nn.Module):&lt;br /&gt;
def __init__(self, input_size, hidden_size, num_classes):&lt;br /&gt;
super().__init__()&lt;br /&gt;
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)&lt;br /&gt;
self.fc = nn.Linear(hidden_size, num_classes)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def forward(self, x):
    # x: (batch, seq\_len, input\_size)
    out, hidden = self.rnn(x)  # out: (batch, seq\_len, hidden)
    # 取最后一个时间步
    out = self.fc(hidden\[-1\])
    return out
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;使用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#使用&#34;&gt;#&lt;/a&gt; 使用&lt;/h2&gt;
&lt;p&gt;model = SimpleRNN(input_size=100, hidden_size=128, num_classes=2)&lt;/p&gt;
&lt;p&gt;用上面的 model，结合 &lt;code&gt;IMDB 数据集&lt;/code&gt;进行情感分析：&lt;/p&gt;
&lt;p&gt;# 超参数&lt;br /&gt;
batch_size = 64&lt;br /&gt;
seq_len = 100&lt;br /&gt;
learning_rate = 0.001&lt;/p&gt;
&lt;h2 id=&#34;损失和优化器&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#损失和优化器&#34;&gt;#&lt;/a&gt; 损失和优化器&lt;/h2&gt;
&lt;p&gt;criterion = nn.CrossEntropyLoss()&lt;br /&gt;
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)&lt;/p&gt;
&lt;h2 id=&#34;训练&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#训练&#34;&gt;#&lt;/a&gt; 训练&lt;/h2&gt;
&lt;p&gt;for epoch in range(10):&lt;br /&gt;
model.train()&lt;br /&gt;
for batch_x, batch_y in train_loader:&lt;br /&gt;
optimizer.zero_grad()&lt;br /&gt;
output = model(batch_x)&lt;br /&gt;
loss = criterion(output, batch_y)&lt;br /&gt;
loss.backward()&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    # 梯度裁剪（防止 RNN 梯度爆炸）⭐
    torch.nn.utils.clip\_grad\_norm\_(model.parameters(), 1.0)
    
    optimizer.step()

# 验证
model.eval()
val\_acc = evaluate(model, val\_loader)
print(f&amp;quot;Epoch &amp;#123;epoch&amp;#125;: Val Acc = &amp;#123;val\_acc:.4f&amp;#125;&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/word2vec/</guid>
            <title>Word2Vec</title>
            <link>https://www.bondrewd.com/2026/03/24/word2vec/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Tue, 24 Mar 2026 03:46:01 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;code&gt;Word2Vec&lt;/code&gt; 其实就是一个&lt;strong&gt;没有隐藏层激活函数&lt;/strong&gt;的 2 层神经网络（&lt;code&gt;浅层神经网络&lt;/code&gt;），用来将单词映射为&lt;strong&gt;低维稠密向量&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;1-核心原理&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-核心原理&#34;&gt;#&lt;/a&gt; 1. 核心原理&lt;/h3&gt;
&lt;p&gt;基于&lt;strong&gt;分布假设&lt;/strong&gt;。通过大量文本语料学习词语的共现规律，将语义相似的词映射到向量空间中彼此靠近的位置&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;分布假设&lt;/p&gt;
&lt;p&gt;&amp;quot;A word is characterized by the company it keeps.&amp;quot;&lt;/p&gt;
&lt;p&gt;（一个词是由它周围的词决定的。）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;code&gt;Word2Vec&lt;/code&gt; 包含两种浅层神经网络结构，核心目标是学习词向量，输入层到隐藏层为&lt;code&gt;词嵌入映射&lt;/code&gt;，隐藏层到输出层为&lt;code&gt;概率预测&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352468-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h5 id=&#34;21-cbowcontinuous-bag-of-words连续词袋模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#21-cbowcontinuous-bag-of-words连续词袋模型&#34;&gt;#&lt;/a&gt; 2.1 CBOW（Continuous Bag-of-Words，连续词袋模型）&lt;/h5&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352492-image-1024x672.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心任务&lt;/strong&gt;：用&lt;strong&gt;上下文词&lt;/strong&gt;预测&lt;strong&gt;中心词&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：计算效率高，适合&lt;strong&gt;大规模语料&lt;/strong&gt;；对高频词效果更优&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类比&lt;/strong&gt;：像 “&lt;em&gt;完形填空&lt;/em&gt;”，根据周围词语推测中间缺失的词&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;22-skip-gram跳字模型&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#22-skip-gram跳字模型&#34;&gt;#&lt;/a&gt; 2.2 Skip-gram（跳字模型）&lt;/h5&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774352527-image-1024x805.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心任务&lt;/strong&gt;：用&lt;strong&gt;中心词&lt;/strong&gt;预测&lt;strong&gt;上下文词&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：对&lt;strong&gt;低频词、生僻词&lt;/strong&gt;效果更好；适合小数据集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类比&lt;/strong&gt;：像 “联想扩散”，由一个词联想到周围相关的词&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;经验&lt;/strong&gt;：默认首选 &lt;code&gt;Skip-Gram&lt;/code&gt;，除非数据量极大且追求速度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;3-训练优化技巧&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-训练优化技巧&#34;&gt;#&lt;/a&gt; 3. 训练优化技巧&lt;/h3&gt;
&lt;p&gt;为解决&lt;strong&gt;大规模语料&lt;/strong&gt;下的计算瓶颈，&lt;code&gt;Word2Vec&lt;/code&gt; 引入两大核心优化，大幅提升训练效率。&lt;/p&gt;
&lt;h5 id=&#34;0-关键点我们要的是什么&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#0-关键点我们要的是什么&#34;&gt;#&lt;/a&gt; 0. 🔑 关键点：我们要的是什么？&lt;/h5&gt;
&lt;p&gt;训练完成后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输出层权重&lt;/strong&gt;：扔掉 ❌&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;投影层权重矩阵&lt;/strong&gt;：保留 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个 &lt;strong&gt;V×N 的矩阵&lt;/strong&gt;，&lt;strong&gt;每一行就是一个词的向量&lt;/strong&gt;&lt;/p&gt;
&lt;h5 id=&#34;1-负采样negative-sampling-最常用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-负采样negative-sampling-最常用&#34;&gt;#&lt;/a&gt; 1. 负采样（Negative Sampling）⭐ 最常用&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;思想&lt;/strong&gt;：不需要更新所有词的权重，只更新&lt;strong&gt;正确的词&lt;/strong&gt;和&lt;strong&gt;几个错误的词&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：将多分类问题转化为&lt;strong&gt;二分类任务&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：对每个正样本（中心词 + 真实上下文词），随机采样 K 个负样本（中心词 + 噪声词）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：仅更新目标词与采样词的参数，避免全词表计算，&lt;strong&gt;训练速度提升显著&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;2-层次-softmaxhierarchical-softmax&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-层次-softmaxhierarchical-softmax&#34;&gt;#&lt;/a&gt; 2. 层次 Softmax（Hierarchical Softmax）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：用 &lt;code&gt;Huffman树&lt;/code&gt; 组织词汇表，将根节点到叶节点的 &lt;code&gt;路径概率乘积&lt;/code&gt; 作为预测结果，类似于&lt;code&gt;二叉搜索&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势&lt;/strong&gt;：将时间复杂度从 &lt;code&gt;O (V)&lt;/code&gt; 降至 &lt;code&gt;O (logV)&lt;/code&gt;，V 为词汇量，适合&lt;strong&gt;超大词汇表&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;4-局限性与发展&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4-局限性与发展&#34;&gt;#&lt;/a&gt; 4. 局限性与发展&lt;/h3&gt;
&lt;h5 id=&#34;41-主要局限&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#41-主要局限&#34;&gt;#&lt;/a&gt; 4.1 主要局限&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态向量&lt;/strong&gt;：一词一向量，无法处理&lt;strong&gt;一词多义&lt;/strong&gt;（如 “bank” 既指银行也指河岸）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;忽略词序&lt;/strong&gt;：依赖固定窗口，无法捕捉&lt;strong&gt;长距离语义依赖&lt;/strong&gt;和&lt;strong&gt;词序信息&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未登录词 OOV&lt;/strong&gt;：无法处理训练语料外的新词（如新兴术语、专有名词）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文无关&lt;/strong&gt;：同一词在不同语境下向量相同，语义表达不够精细&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;42-后续演进&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#42-后续演进&#34;&gt;#&lt;/a&gt; 4.2 后续演进&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FastText&lt;/strong&gt;：引入子词信息，支持未登录词生成&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GloVe&lt;/strong&gt;：结合全局统计与局部上下文，提升语义表达&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transformer 系列&lt;/strong&gt;：动态上下文编码，解决一词多义与长距离依赖问题（如 BERT、GPT）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;word2vec-示例代码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#word2vec-示例代码&#34;&gt;#&lt;/a&gt; Word2Vec 示例代码&lt;/h3&gt;
&lt;p&gt;安装依赖库：&lt;code&gt;pip install gensim nltk&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;import gensim&lt;br /&gt;
from gensim.models import Word2Vec&lt;br /&gt;
from gensim.utils import simple_preprocess&lt;br /&gt;
import nltk&lt;br /&gt;
from nltk.corpus import stopwords&lt;/p&gt;
&lt;h2 id=&#34;-1-数据准备与预处理-&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-1-数据准备与预处理-&#34;&gt;#&lt;/a&gt; ---------------------- 1. 数据准备与预处理 ----------------------&lt;/h2&gt;
&lt;h2 id=&#34;下载nltk停用词仅首次运行需要&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#下载nltk停用词仅首次运行需要&#34;&gt;#&lt;/a&gt; 下载nltk停用词（仅首次运行需要）&lt;/h2&gt;
&lt;p&gt;nltk.download(&#39;stopwords&#39;)&lt;br /&gt;
stop_words = stopwords.words(&#39;english&#39;)&lt;/p&gt;
&lt;h2 id=&#34;示例语料可替换为你自己的文本文件大规模语料&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#示例语料可替换为你自己的文本文件大规模语料&#34;&gt;#&lt;/a&gt; 示例语料（可替换为你自己的文本文件/大规模语料）&lt;/h2&gt;
&lt;p&gt;corpus = [&lt;br /&gt;
&amp;quot;Natural language processing is a subfield of artificial intelligence&amp;quot;,&lt;br /&gt;
&amp;quot;Word2Vec is a popular technique for word embedding in NLP&amp;quot;,&lt;br /&gt;
&amp;quot;Word embedding converts words into numerical vectors&amp;quot;,&lt;br /&gt;
&amp;quot;Semantic similarity can be measured using word vectors&amp;quot;,&lt;br /&gt;
&amp;quot;King minus man plus woman equals queen in word2vec&amp;quot;,&lt;br /&gt;
&amp;quot;Tokyo is the capital of Japan, Beijing is the capital of China&amp;quot;,&lt;br /&gt;
&amp;quot;Machine learning models use word vectors as input features&amp;quot;,&lt;br /&gt;
&amp;quot;Cat likes eating fish and dog loves enjoying bones&amp;quot;&lt;br /&gt;
]&lt;/p&gt;
&lt;h2 id=&#34;文本预处理函数分词-去除停用词-过滤短词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#文本预处理函数分词-去除停用词-过滤短词&#34;&gt;#&lt;/a&gt; 文本预处理函数：分词 + 去除停用词 + 过滤短词&lt;/h2&gt;
&lt;p&gt;def preprocess(text):&lt;br /&gt;
# 分词（gensim内置的简单分词，适合英文）&lt;br /&gt;
tokens = simple_preprocess(text, deacc=True)  # deacc=True去除标点&lt;br /&gt;
# 过滤停用词和长度&amp;lt;2的词&lt;br /&gt;
tokens = [token for token in tokens if token not in stop_words and len(token) &amp;gt; 2]&lt;br /&gt;
return tokens&lt;/p&gt;
&lt;h2 id=&#34;对语料库进行预处理得到训练用的句子列表每个句子是分词后的token列表&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#对语料库进行预处理得到训练用的句子列表每个句子是分词后的token列表&#34;&gt;#&lt;/a&gt; 对语料库进行预处理，得到训练用的句子列表（每个句子是分词后的token列表）&lt;/h2&gt;
&lt;p&gt;processed_corpus = [preprocess(sentence) for sentence in corpus]&lt;br /&gt;
print(&amp;quot;预处理后的语料：&amp;quot;)&lt;br /&gt;
for sent in processed_corpus:&lt;br /&gt;
print(sent)&lt;/p&gt;
&lt;h2 id=&#34;-2-训练word2vec模型-&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-2-训练word2vec模型-&#34;&gt;#&lt;/a&gt; ---------------------- 2. 训练Word2Vec模型 ----------------------&lt;/h2&gt;
&lt;h2 id=&#34;核心参数说明新手重点关注&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#核心参数说明新手重点关注&#34;&gt;#&lt;/a&gt; 核心参数说明（新手重点关注）：&lt;/h2&gt;
&lt;h2 id=&#34;-vector_size词向量维度常用50100300小语料用50即可&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-vector_size词向量维度常用50100300小语料用50即可&#34;&gt;#&lt;/a&gt; - vector_size：词向量维度（常用50/100/300，小语料用50即可）&lt;/h2&gt;
&lt;h2 id=&#34;-window上下文窗口大小中心词左右各window个词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-window上下文窗口大小中心词左右各window个词&#34;&gt;#&lt;/a&gt; - window：上下文窗口大小（中心词左右各window个词）&lt;/h2&gt;
&lt;h2 id=&#34;-min_count最小词频低于该值的词忽略过滤低频噪声&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-min_count最小词频低于该值的词忽略过滤低频噪声&#34;&gt;#&lt;/a&gt; - min_count：最小词频，低于该值的词忽略（过滤低频噪声）&lt;/h2&gt;
&lt;h2 id=&#34;-sg训练模型类型sg0为cbowsg1为skip-gram&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-sg训练模型类型sg0为cbowsg1为skip-gram&#34;&gt;#&lt;/a&gt; - sg：训练模型类型，sg=0为CBOW，sg=1为Skip-gram&lt;/h2&gt;
&lt;h2 id=&#34;-workers并行训练线程数根据cpu核心数调整&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-workers并行训练线程数根据cpu核心数调整&#34;&gt;#&lt;/a&gt; - workers：并行训练线程数（根据CPU核心数调整）&lt;/h2&gt;
&lt;p&gt;model = Word2Vec(&lt;br /&gt;
sentences=processed_corpus,&lt;br /&gt;
vector_size=50,        # 词向量维度&lt;br /&gt;
window=3,              # 上下文窗口&lt;br /&gt;
min_count=1,           # 保留所有出现过的词（小语料专用）&lt;br /&gt;
sg=1,                  # 使用Skip-gram模型（对小语料更友好）&lt;br /&gt;
workers=4,             # 4线程训练&lt;br /&gt;
epochs=100             # 训练轮数（小语料需增加轮数保证效果）&lt;br /&gt;
)&lt;/p&gt;
&lt;h2 id=&#34;保存模型可选后续可直接加载&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#保存模型可选后续可直接加载&#34;&gt;#&lt;/a&gt; 保存模型（可选，后续可直接加载）&lt;/h2&gt;
&lt;p&gt;model.save(&amp;quot;word2vec_demo.model&amp;quot;)&lt;/p&gt;
&lt;h2 id=&#34;加载模型后续使用时model-word2vecloadword2vec_demomodel&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#加载模型后续使用时model-word2vecloadword2vec_demomodel&#34;&gt;#&lt;/a&gt; 加载模型（后续使用时）：model = Word2Vec.load(&amp;quot;word2vec_demo.model&amp;quot;)&lt;/h2&gt;
&lt;h2 id=&#34;-3-模型使用示例-&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#-3-模型使用示例-&#34;&gt;#&lt;/a&gt; ---------------------- 3. 模型使用示例 ----------------------&lt;/h2&gt;
&lt;h2 id=&#34;31-查看单个词的向量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#31-查看单个词的向量&#34;&gt;#&lt;/a&gt; 3.1 查看单个词的向量&lt;/h2&gt;
&lt;p&gt;print(&amp;quot;\n=== 查看&#39;plus&#39;的词向量（前10维）===&amp;quot;)&lt;br /&gt;
print(model.wv[&#39;plus&#39;][:10])  # wv是word vector的缩写，存储所有词向量量&lt;/p&gt;
&lt;h2 id=&#34;32-计算两个词的语义相似度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#32-计算两个词的语义相似度&#34;&gt;#&lt;/a&gt; 3.2 计算两个词的语义相似度&lt;/h2&gt;
&lt;p&gt;print(&amp;quot;\n=== 计算语义相似度 ===&amp;quot;)&lt;br /&gt;
print(f&amp;quot;like vs love: {model.wv.similarity(&#39;like&#39;, &#39;love&#39;):.4f}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;beijing vs tokyo: {model.wv.similarity(&#39;beijing&#39;, &#39;tokyo&#39;):.4f}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;king vs queen: {model.wv.similarity(&#39;king&#39;, &#39;queen&#39;):.4f}&amp;quot;)&lt;br /&gt;
print(f&amp;quot;china vs japan: {model.wv.similarity(&#39;china&#39;, &#39;japan&#39;):.4f}&amp;quot;)&lt;/p&gt;
&lt;h2 id=&#34;33-找最相似的词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#33-找最相似的词&#34;&gt;#&lt;/a&gt; 3.3 找最相似的词&lt;/h2&gt;
&lt;p&gt;print(&amp;quot;\n=== 找与&#39;like&#39;最相似的5个词 ===&amp;quot;)&lt;br /&gt;
similar_words = model.wv.most_similar(&#39;like&#39;, topn=5)&lt;br /&gt;
for word, score in similar_words:&lt;br /&gt;
print(f&amp;quot;{word}: {score:.4f}&amp;quot;)&lt;/p&gt;
&lt;h2 id=&#34;34-语义类比国王-男人女人王后&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#34-语义类比国王-男人女人王后&#34;&gt;#&lt;/a&gt; 3.4 语义类比（国王-男人+女人=王后）&lt;/h2&gt;
&lt;p&gt;print(&amp;quot;\n=== 语义类比：king - man + woman == ? ===&amp;quot;)&lt;br /&gt;
try:&lt;br /&gt;
analogy = model.wv.most_similar(positive=[&#39;king&#39;, &#39;woman&#39;], negative=[&#39;man&#39;], topn=1)&lt;br /&gt;
print(f&amp;quot;结果：{analogy[0][0]} (相似度：{analogy[0][1]:.4f})&amp;quot;)&lt;br /&gt;
except KeyError as e:&lt;br /&gt;
print(f&amp;quot;类比失败：缺少词 {e}（语料太小导致）&amp;quot;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参数调整&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大规模语料：可将&lt;code&gt;vector_size&lt;/code&gt;调至 100/300，&lt;code&gt;min_count&lt;/code&gt;调至 5/10（过滤低频词），&lt;code&gt;epochs&lt;/code&gt;调至 10-20；&lt;/li&gt;
&lt;li&gt;小语料：保持 &lt;code&gt;min_count=1&lt;/code&gt;，增加 &lt;code&gt;epochs&lt;/code&gt;（如 100）保证训练效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如果结果奇怪&lt;/strong&gt;：&lt;br /&gt;
&lt;em&gt;根本原因：语料库太小了&lt;/em&gt;&lt;br /&gt;
直接用别人训练好的模型，不要自己训练小语料：&lt;/p&gt;
&lt;p&gt;from gensim.models import KeyedVectors&lt;/p&gt;
&lt;h2 id=&#34;加载-google-预训练的-word2vec-300-维300-万词&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#加载-google-预训练的-word2vec-300-维300-万词&#34;&gt;#&lt;/a&gt; 加载 Google 预训练的 Word2Vec (300 维，300 万词)&lt;/h2&gt;
&lt;h2 id=&#34;下载地址httpscodegooglecomarchivepword2vec&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#下载地址httpscodegooglecomarchivepword2vec&#34;&gt;#&lt;/a&gt; 下载地址：&lt;a href=&#34;https://code.google.com/archive/p/word2vec/&#34;&gt;https://code.google.com/archive/p/word2vec/&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;model = KeyedVectors.load_word2vec_format(&#39;GoogleNews-vectors-negative300.bin&#39;, binary=True)&lt;/p&gt;
&lt;h2 id=&#34;现在测试结果会正常&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#现在测试结果会正常&#34;&gt;#&lt;/a&gt; 现在测试结果会正常！&lt;/h2&gt;
&lt;p&gt;print(model.wv.similarity(&#39;like&#39;, &#39;love&#39;))  # 应该 &amp;gt; 0.5&lt;br /&gt;
print(model.wv.similarity(&#39;king&#39;, &#39;queen&#39;))  # 应该 &amp;gt; 0.6&lt;/p&gt;
&lt;h2 id=&#34;类比也会正确&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#类比也会正确&#34;&gt;#&lt;/a&gt; 类比也会正确&lt;/h2&gt;
&lt;p&gt;result = model.wv.most_similar(positive=[&#39;king&#39;, &#39;woman&#39;], negative=[&#39;man&#39;])&lt;br /&gt;
print(result[0][0])  # 应该输出 &#39;queen&#39;&lt;/p&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%92%8C%E5%8D%95%E8%AF%8D%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E8%A1%A8%E7%A4%BA/</guid>
            <title>自然语言和单词的分布式表示</title>
            <link>https://www.bondrewd.com/2026/03/24/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%92%8C%E5%8D%95%E8%AF%8D%E7%9A%84%E5%88%86%E5%B8%83%E5%BC%8F%E8%A1%A8%E7%A4%BA/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Tue, 24 Mar 2026 03:19:50 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;strong&gt;核心问题&lt;/strong&gt;：神经网络只能处理&lt;strong&gt;数字&lt;/strong&gt;，但人类语言是&lt;strong&gt;文字&lt;/strong&gt;。&lt;br /&gt;
&lt;em&gt;如下，怎么把&amp;quot;我&amp;quot;、&amp;quot;喜欢&amp;quot;、&amp;quot;深度&amp;quot;、&amp;quot;学习&amp;quot;变成向量？&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人类： &amp;quot;我喜欢深度学习&amp;quot;&lt;br /&gt;
↓ ???&lt;br /&gt;
计算机： [?, ?, ?, ?, ?, ?]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;表示方法的演进&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#表示方法的演进&#34;&gt;#&lt;/a&gt; 表示方法的演进&lt;/h3&gt;
&lt;h5 id=&#34;1️⃣-最早期one-hot-编码独热编码&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1️⃣-最早期one-hot-编码独热编码&#34;&gt;#&lt;/a&gt; 1️⃣ 最早期：One-Hot 编码（独热编码）&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;方法&lt;/strong&gt;：每个词用一个&lt;strong&gt;超长向量&lt;/strong&gt;表示，只有一个位置是 1，其他都是 0。&lt;/p&gt;
&lt;p&gt;词典：[&amp;quot;我&amp;quot;, &amp;quot;喜欢&amp;quot;, &amp;quot;讨厌&amp;quot;, &amp;quot;深度&amp;quot;, &amp;quot;学习&amp;quot;, &amp;quot;电影&amp;quot;, ...]  假设共 10000 词&lt;/p&gt;
&lt;p&gt;&amp;quot;我&amp;quot;   → [1, 0, 0, 0, 0, 0, ..., 0]  (第 1 位是 1)&lt;br /&gt;
&amp;quot;喜欢&amp;quot; → [0, 1, 0, 0, 0, 0, ..., 0]  (第 2 位是 1)&lt;br /&gt;
&amp;quot;讨厌&amp;quot; → [0, 0, 1, 0, 0, 0, ..., 0]  (第 3 位是 1)&lt;br /&gt;
&amp;quot;学习&amp;quot; → [0, 0, 0, 0, 1, 0, ..., 0]  (第 5 位是 1)&lt;/p&gt;
&lt;p&gt;优点&lt;/p&gt;
&lt;p&gt;缺点&lt;/p&gt;
&lt;p&gt;简单直观&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;维度灾难&lt;/strong&gt;：词典 10 万词 = 10 万维向量&lt;/p&gt;
&lt;p&gt;容易实现&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语义鸿沟&lt;/strong&gt;：任意两个词向量正交（内积=0）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无法表示相似性&lt;/strong&gt;：&amp;quot;喜欢&amp;quot;和&amp;quot;讨厌&amp;quot;距离一样远（如下例）&lt;/p&gt;
&lt;p&gt;向量空间示意（One-Hot）：&lt;/p&gt;
&lt;p&gt;&amp;quot;喜欢&amp;quot; ●                 所有词都在坐标轴上&lt;br /&gt;
│                彼此距离相等&lt;br /&gt;
│&lt;br /&gt;
●──────┼──────●  &amp;quot;讨厌&amp;quot;&lt;br /&gt;
&amp;quot;me&amp;quot;     │      &amp;quot;学习&amp;quot;&lt;br /&gt;
│&lt;br /&gt;
●&lt;br /&gt;
&amp;quot;电影&amp;quot;&lt;/p&gt;
&lt;p&gt;问题：无法表达&amp;quot;喜欢&amp;quot;和&amp;quot;爱&amp;quot;更接近 ❌&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;2️⃣-突破分布式表示distributed-representation&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2️⃣-突破分布式表示distributed-representation&#34;&gt;#&lt;/a&gt; 2️⃣ 突破：分布式表示（Distributed Representation）⭐&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;核心思想&lt;/strong&gt;（Hinton, 1986）：用低维稠密向量表示单词，语义相似的词向量也相似。&lt;/p&gt;
&lt;p&gt;词典：10000 词  →  向量维度：300&lt;/p&gt;
&lt;p&gt;&amp;quot;我&amp;quot;   → [0.25, -0.31, 0.67, ..., 0.12]  (300 维稠密向量)&lt;br /&gt;
&amp;quot;喜欢&amp;quot; → [0.82, -0.45, 0.33, ..., 0.56]&lt;br /&gt;
&amp;quot;爱&amp;quot;   → [0.79, -0.42, 0.35, ..., 0.54]  ← 和&amp;quot;喜欢&amp;quot;很接近！&lt;br /&gt;
&amp;quot;讨厌&amp;quot; → [-0.75, 0.51, -0.28, ..., -0.61] ← 和&amp;quot;喜欢&amp;quot;距离远&lt;br /&gt;
&amp;quot;学习&amp;quot; → [0.45, -0.12, 0.78, ..., 0.33]&lt;/p&gt;
&lt;p&gt;向量空间示意（分布式表示）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;quot;爱&amp;quot; ●
        ╱
       ╱   ← 语义相近，向量距离近 ✅
      ╱
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;quot;喜欢&amp;quot; ●───────● &amp;quot;热爱&amp;quot;&lt;br /&gt;
╲&lt;br /&gt;
╲&lt;br /&gt;
╲&lt;br /&gt;
● &amp;quot;讨厌&amp;quot;  ← 语义相反，距离远&lt;/p&gt;
&lt;p&gt;&amp;quot;学习&amp;quot; ●          ● &amp;quot;电影&amp;quot;  ← 无关词，距离中等&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么叫&amp;quot;分布式&amp;quot;？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One-Hot&lt;/strong&gt;：信息集中在&lt;strong&gt;一个位置&lt;/strong&gt;（向量中只有 1 个 1，其余都是 0）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分布式&lt;/strong&gt;：信息&lt;strong&gt;分布在整个向量&lt;/strong&gt;的所有维度&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;向量相似度&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#向量相似度&#34;&gt;#&lt;/a&gt; 向量相似度&lt;/h3&gt;
&lt;p&gt;可以用两个词向量之间的 &lt;code&gt;内积&lt;/code&gt; 或 &lt;code&gt;余弦相似度&lt;/code&gt; 来表示向量之间的相关性&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774350936-image-1024x588.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;把所有词向量组成的大矩阵称为 &lt;code&gt;嵌入矩阵&lt;/code&gt;：每一列都是一个词向量。&lt;/li&gt;
&lt;li&gt;这个矩阵可以通过 &lt;code&gt;word2vec&lt;/code&gt; 等方式训练获得&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1774350962-image-1024x605.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;词向量的维度很高，所以它所在空间的维度也很高，这个空间叫做 &lt;code&gt;潜空间&lt;/code&gt;。对于高维潜空间，可以通过降维投影等操作直观感受，参考： &lt;a href=&#34;https://projector.tensorflow.org/&#34;&gt;https://projector.tensorflow.org/&lt;/a&gt; 。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;学习词向量的经典方式&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#学习词向量的经典方式&#34;&gt;#&lt;/a&gt; 学习词向量的经典方式&lt;/h4&gt;
&lt;h5 id=&#34;1️⃣-word2vec2013-最经典&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1️⃣-word2vec2013-最经典&#34;&gt;#&lt;/a&gt; 1️⃣ Word2Vec（2013）⭐ 最经典&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提出者&lt;/strong&gt;：Google 的 Tomas Mikolov&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：&lt;strong&gt;一个词的语义由它周围的词决定，文本中离得越近的词语相似度越高&lt;/strong&gt;（分布假说）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;两种训练方式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;模型&lt;/p&gt;
&lt;p&gt;输入&lt;/p&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;p&gt;比喻&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip-Gram 跳元模型&lt;/strong&gt;（&lt;em&gt;常用&lt;/em&gt;）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;中心词&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;上下文词&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;给定这个词，预测周围&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CBOW 连续词袋&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;上下文词&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;中心词&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;猜中间是什么词&amp;quot;&lt;/p&gt;
&lt;p&gt;CBOW:     [&amp;quot;我&amp;quot;, &amp;quot;深度&amp;quot;, &amp;quot;学习&amp;quot;]  →  &amp;quot;喜欢&amp;quot;&lt;br /&gt;
(上下文)                  (中心词)&lt;/p&gt;
&lt;p&gt;Skip-Gram:  &amp;quot;喜欢&amp;quot;  →  [&amp;quot;我&amp;quot;, &amp;quot;深度&amp;quot;, &amp;quot;学习&amp;quot;]&lt;br /&gt;
(中心词)    (上下文)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Word2Vec 的架构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    输入层          隐藏层         输出层
   (词索引)        (词向量)       (概率分布)
      
      ●              ●              ● ● ● ●
      │              │              │ │ │ │
      │              │              │ │ │ │
输入词索引  →   查找向量表  →   Softmax  →  预测词
(one-hot)      (V×N 矩阵)        (V 维)

V = 词典大小 (如 10000)
N = 向量维度 (如 300)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 关键：训练完成后，&lt;strong&gt;隐藏层的权重矩阵&lt;/strong&gt;就是&lt;code&gt;词向量表&lt;/code&gt;！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;2️⃣-glove2014&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2️⃣-glove2014&#34;&gt;#&lt;/a&gt; 2️⃣ GloVe（2014）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提出者&lt;/strong&gt;：Stanford 的 Jeffrey Pennington&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：基于&lt;strong&gt;全局词共现统计&lt;/strong&gt;，而不是局部窗口。&lt;br /&gt;
500&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GloVe&lt;/code&gt; &lt;strong&gt;目标&lt;/strong&gt;：让上面 &lt;code&gt;共现矩阵&lt;/code&gt;（&lt;code&gt;co-occurence matrix&lt;/code&gt;）向量内积 ≈ log(共现次数)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;3️⃣-fasttext2016&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3️⃣-fasttext2016&#34;&gt;#&lt;/a&gt; 3️⃣ FastText（2016）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提出者&lt;/strong&gt;：Facebook AI&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心思想&lt;/strong&gt;：考虑&lt;strong&gt;词内部的字符 n-gram&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;优点&lt;/p&gt;
&lt;p&gt;缺点&lt;/p&gt;
&lt;p&gt;能处理&lt;strong&gt;未登录词&lt;/strong&gt;（&lt;code&gt;OOV&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;向量维度更大&lt;/p&gt;
&lt;p&gt;适合形态丰富的语言（如德语、俄语）&lt;/p&gt;
&lt;p&gt;计算稍慢&lt;/p&gt;
&lt;p&gt;中文效果提升有限&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;静态-vs-动态词向量&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#静态-vs-动态词向量&#34;&gt;#&lt;/a&gt; 静态 vs 动态词向量&lt;/h3&gt;
&lt;h5 id=&#34;1️⃣-静态词向量2013-2017&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1️⃣-静态词向量2013-2017&#34;&gt;#&lt;/a&gt; 1️⃣ 静态词向量（2013-2017）&lt;/h5&gt;
&lt;p&gt;方法&lt;/p&gt;
&lt;p&gt;特点&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Word2Vec&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一个词只有一个向量&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GloVe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;不管上下文&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FastText&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;考虑子词，但仍静态&lt;/p&gt;
&lt;p&gt;&amp;quot;苹果&amp;quot;在以下句子中意思不同，但向量相同 ❌&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;quot;我吃了一个苹果&amp;quot;  →  水果&lt;/li&gt;
&lt;li&gt;&amp;quot;我买了苹果股票&amp;quot;  →  公司&lt;/li&gt;
&lt;li&gt;&amp;quot;苹果发布了新手机&amp;quot; →  公司&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Word2Vec: &amp;quot;苹果&amp;quot; → [0.5, -0.3, 0.8, ...]  (固定不变)&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;2️⃣-动态词向量2018-至今主流&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2️⃣-动态词向量2018-至今主流&#34;&gt;#&lt;/a&gt; 2️⃣ 动态词向量（2018-至今）主流⭐&lt;/h5&gt;
&lt;p&gt;方法&lt;/p&gt;
&lt;p&gt;特点&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ELMo&lt;/strong&gt; (2018)&lt;/p&gt;
&lt;p&gt;用双向 &lt;code&gt;LSTM&lt;/code&gt;，上下文相关&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BERT&lt;/strong&gt; (2018)&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;Transformer&lt;/code&gt;，上下文相关 ⭐&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPT&lt;/strong&gt; 系列&lt;/p&gt;
&lt;p&gt;自回归，上下文相关&lt;/p&gt;
&lt;p&gt;BERT:&lt;br /&gt;
&amp;quot;我吃了一个苹果&amp;quot;  →  &amp;quot;苹果&amp;quot; → [0.6, -0.2, 0.9, ...]  (水果义)&lt;br /&gt;
&amp;quot;我买了苹果股票&amp;quot;  →  &amp;quot;苹果&amp;quot; → [0.8, -0.5, 0.4, ...]  (公司义)&lt;/p&gt;
&lt;p&gt;同一个词，不同上下文，向量不同 ✅&lt;/p&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/24/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86-nlp/</guid>
            <title>自然语言处理 NLP</title>
            <link>https://www.bondrewd.com/2026/03/24/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86-nlp/</link>
            <category term="uncategorized" scheme="https://www.bondrewd.com/categories/uncategorized/" />
            <pubDate>Tue, 24 Mar 2026 03:10:03 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;自然语言处理（&lt;code&gt;Natural Language Processing&lt;/code&gt;，&lt;code&gt;NLP&lt;/code&gt;） = 让计算机&lt;strong&gt;理解、生成、处理&lt;/strong&gt;人类语言的技术。NLP 的核心任务著有可以分为 3 类：理解类、生成类、其他类。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;nlp-技术演进史&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#nlp-技术演进史&#34;&gt;#&lt;/a&gt; NLP 技术演进史&lt;/h3&gt;
&lt;h5 id=&#34;1️⃣-规则系统时代1950s-1990s&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1️⃣-规则系统时代1950s-1990s&#34;&gt;#&lt;/a&gt; 1️⃣ 规则系统时代（1950s-1990s）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：人工编写语法规则、词典&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：ELIZA 聊天机器人（1966）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：规则太多，维护困难，无法处理例外&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;2️⃣-统计机器学习时代1990s-2010s&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2️⃣-统计机器学习时代1990s-2010s&#34;&gt;#&lt;/a&gt; 2️⃣ 统计机器学习时代（1990s-2010s）&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：&lt;code&gt;HMM&lt;/code&gt;、&lt;code&gt;CRF&lt;/code&gt;、&lt;code&gt;SVM&lt;/code&gt; 等&lt;strong&gt;统计模型&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：可以从数据中学习，不需要手工写规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：特征工程复杂，需要大量人工设计特征&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;3️⃣-深度学习时代2013-2017&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3️⃣-深度学习时代2013-2017&#34;&gt;#&lt;/a&gt; 3️⃣ 深度学习时代（2013-2017）⭐&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;突破&lt;/strong&gt;：&lt;strong&gt;Word2Vec&lt;/strong&gt;（2013）让词有了向量表示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：&lt;code&gt;RNN&lt;/code&gt;、&lt;code&gt;LSTM&lt;/code&gt;、&lt;code&gt;GRU&lt;/code&gt;、&lt;code&gt;CNN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：自动学习特征，效果大幅提升&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;4️⃣-transformer-时代2017-至今&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4️⃣-transformer-时代2017-至今&#34;&gt;#&lt;/a&gt; 4️⃣ Transformer 时代（2017-至今）🚀&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;突破&lt;/strong&gt;：&lt;strong&gt;Attention Is All You Need&lt;/strong&gt;（2017）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：&lt;code&gt;BERT&lt;/code&gt;（2018）、&lt;code&gt;GPT&lt;/code&gt; 系列、&lt;code&gt;T5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：并行计算、长距离依赖、效果碾压 RNN&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&#34;5️⃣-大语言模型时代2020-至今&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#5️⃣-大语言模型时代2020-至今&#34;&gt;#&lt;/a&gt; 5️⃣ 大语言模型时代（2020-至今）🦄&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：超大规模参数（千亿级）、预训练 + 微调&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代表&lt;/strong&gt;：GPT-3/4、Claude、LLaMA、ChatGLM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;能力&lt;/strong&gt;：零样本学习、多任务通用、接近人类水平&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;nlp-的核心概念&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#nlp-的核心概念&#34;&gt;#&lt;/a&gt; NLP 的核心概念&lt;/h3&gt;
&lt;h5 id=&#34;1️⃣-分词tokenization&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1️⃣-分词tokenization&#34;&gt;#&lt;/a&gt; 1️⃣ 分词（Tokenization）&lt;/h5&gt;
&lt;p&gt;把句子切成模型能处理的&amp;quot;单元&amp;quot;&lt;/p&gt;
&lt;p&gt;英文：&amp;quot;I love NLP&amp;quot; → [&amp;quot;I&amp;quot;, &amp;quot;love&amp;quot;, &amp;quot;NLP&amp;quot;]&lt;br /&gt;
中文：&amp;quot;我爱 NLP&amp;quot; → [&amp;quot;我&amp;quot;, &amp;quot;爱&amp;quot;, &amp;quot;NLP&amp;quot;]&lt;/p&gt;
&lt;p&gt;更细粒度（Subword）：&lt;br /&gt;
&amp;quot;playing&amp;quot; → [&amp;quot;play&amp;quot;, &amp;quot;##ing&amp;quot;]&lt;br /&gt;
&amp;quot;不喜欢&amp;quot; → [&amp;quot;不&amp;quot;, &amp;quot;喜欢&amp;quot;]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;空格分词&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;英文适用，中文不行&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;字符级&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每个字独立，序列太长&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;词级&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需要词典，未登录词问题&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subword&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BPE、WordPiece，平衡粒度和词汇量 ⭐&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;2️⃣-词嵌入word-embedding&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2️⃣-词嵌入word-embedding&#34;&gt;#&lt;/a&gt; 2️⃣ 词嵌入（Word Embedding）&lt;/h5&gt;
&lt;p&gt;把单词变成稠密向量，保留语义信息&lt;/p&gt;
&lt;p&gt;&amp;quot;国王&amp;quot; → [0.85, -0.32, 0.67, ...]&lt;br /&gt;
&amp;quot;王后&amp;quot; → [0.83, -0.30, 0.69, ...]&lt;br /&gt;
&amp;quot;男人&amp;quot; → [0.75, -0.45, 0.55, ...]&lt;br /&gt;
&amp;quot;女人&amp;quot; → [0.73, -0.43, 0.57, ...]&lt;/p&gt;
&lt;p&gt;向量运算：&amp;quot;国王&amp;quot; - &amp;quot;男人&amp;quot; + &amp;quot;女人&amp;quot; ≈ &amp;quot;王后&amp;quot; ✅&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One-Hot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;早期&lt;/p&gt;
&lt;p&gt;稀疏，无语义关系&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Word2Vec&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2013&lt;/p&gt;
&lt;p&gt;稠密，有语义，静态 ⭐&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GloVe&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2014&lt;/p&gt;
&lt;p&gt;基于全局共现统计&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FastText&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2016&lt;/p&gt;
&lt;p&gt;支持子词，处理未登录词&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BERT Embedding&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2018&lt;/p&gt;
&lt;p&gt;上下文相关，动态 ⭐⭐⭐&lt;/p&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;3️⃣-注意力机制attention-核心突破&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3️⃣-注意力机制attention-核心突破&#34;&gt;#&lt;/a&gt; 3️⃣ 注意力机制（Attention）⭐ 核心突破&lt;/h5&gt;
&lt;p&gt;让模型学会&amp;quot;关注重要的部分&amp;quot;&lt;/p&gt;
&lt;p&gt;翻译：&amp;quot;The animal didn&#39;t cross the street because it was too tired&amp;quot;&lt;br /&gt;
↓&lt;br /&gt;
&amp;quot;it&amp;quot; 指的是谁？&lt;br /&gt;
↓&lt;br /&gt;
注意力指向 &amp;quot;animal&amp;quot; ✅&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自注意力（Self-Attention）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个词都可以&amp;quot;看&amp;quot;句子中的其他词&lt;/li&gt;
&lt;li&gt;计算权重，决定关注谁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行计算&lt;/strong&gt;，比 &lt;code&gt;RNN&lt;/code&gt; 快得多&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h5 id=&#34;4️⃣-预训练-微调pretrain-finetune&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#4️⃣-预训练-微调pretrain-finetune&#34;&gt;#&lt;/a&gt; 4️⃣ 预训练 + 微调（Pretrain + Finetune）&lt;/h5&gt;
&lt;p&gt;现代 NLP 的标准范式：&lt;/p&gt;
&lt;p&gt;第 1 步：预训练&lt;br /&gt;
用海量无标签文本（维基百科、网页）训练通用语言模型&lt;br /&gt;
学习：语法、语义、常识、推理...&lt;br /&gt;
↓&lt;br /&gt;
第 2 步：微调&lt;br /&gt;
用少量有标签数据（如情感分析数据）训练特定任务&lt;br /&gt;
学习：分类边界、任务特定模式&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;类比&lt;/strong&gt;：预训练 = 读万卷书（通识教育），微调 = 专业训练（职业技能）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/13/networkpolicy/</guid>
            <title>NetworkPolicy</title>
            <link>https://www.bondrewd.com/2026/03/13/networkpolicy/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Fri, 13 Mar 2026 23:03:39 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;&lt;strong&gt;NetworkPolicy = Kubernetes 里 Pod 级别的网络防火墙&lt;/strong&gt;，它基于标签选择器定义&lt;strong&gt;允许&lt;/strong&gt;的入站（Ingress）和出站（Egress）流量，默认遵循“白名单”原则：一旦某个 Pod 被任何 NetworkPolicy 选中，未明确允许的流量都会被拒绝。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;实验要求&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从提供的 YAML 样本中查看并应用适当的 NetworkPolicy。&lt;/li&gt;
&lt;li&gt;确保选择的 NetworkPolicy &lt;strong&gt;不过于宽松&lt;/strong&gt;，同时允许运行在 &lt;code&gt;frontend&lt;/code&gt; 和 &lt;code&gt;backend&lt;/code&gt; namespaces 中的 &lt;code&gt;frontend&lt;/code&gt; 和 &lt;code&gt;backend&lt;/code&gt; Deployment 之间的通信。
&lt;ul&gt;
&lt;li&gt;首先，分析 &lt;code&gt;frontend&lt;/code&gt; 和 &lt;code&gt;backend&lt;/code&gt; Deployment，以确定需要应用的 NetworkPolicy 的具体要求。&lt;/li&gt;
&lt;li&gt;接下来，检查位于 &lt;code&gt;~/netpo&lt;/code&gt;l 文件夹中的 NetworkPolicy YAML 示例。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;注意：请勿删除或修改提供的示例。仅应用其中一个。否则可能会导致分数降低。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最后，应用启用 frontend 和 backend Deployment 之间的通信的 NetworkPolicy，但不要过于宽容。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;注意：请勿删除或修改现有的默认拒绝所有入站流量或出口流量 NetworkPolicy。否则可能导致零分。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考链接：无&lt;br /&gt;
难度：⭐⭐&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;0-环境确认&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#0-环境确认&#34;&gt;#&lt;/a&gt; 0. 环境确认&lt;/h3&gt;
&lt;p&gt;题干要求：“不过于宽松”，即最小权限原则&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773471099-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;查看`~/netpol`目录，发现存在 3 个文件，内容如下：&lt;/p&gt;
&lt;h4 id=&#34;netpol1yaml-过于宽松&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#netpol1yaml-过于宽松&#34;&gt;#&lt;/a&gt; netpol1.yaml ❌ 过于宽松&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: NetworkPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: netpol-1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  namespace: backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  podSelector: &amp;#123;&amp;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  policyTypes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  ingress:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - from:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - namespaceSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          kubernetes.io/metadata.name: frontend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第 7 行，⚠️ 会选择 backend 命名空间 ALL Pods&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;netpol2yaml-正确选择&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#netpol2yaml-正确选择&#34;&gt;#&lt;/a&gt; netpol2.yaml ✅ 正确选择&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: NetworkPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: netpol-2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  namespace: backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  podSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      app: backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  policyTypes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  ingress:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - from:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - namespaceSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          kubernetes.io/metadata.name: frontend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      podSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          app: frontend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 7 行，只选择 backend Pods&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 19 行，同时检查 namespace + Pod 标签&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4 id=&#34;netpol3yaml-配置错误&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#netpol3yaml-配置错误&#34;&gt;#&lt;/a&gt; netpol3.yaml ❌ 配置错误&lt;/h4&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: NetworkPolicy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: netpol-3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  namespace: backend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  podSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      app: database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  policyTypes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  ingress:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - from:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - namespaceSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          kubernetes.io/metadata.name: frontend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      podSelector:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        matchLabels:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          app: frontend&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - ipBlock:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        cidr: 10.0.0.0/24&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 9 行，错误标签（应该是 backend）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 21 行，⚠️ 额外开放整个网段，过于宽松&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;1-选择-netpol2yaml-并应用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-选择-netpol2yaml-并应用&#34;&gt;#&lt;/a&gt; &lt;strong&gt;1. 选择 netpol2.yaml 并应用&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773471298-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-检查&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-检查&#34;&gt;#&lt;/a&gt; 2. 检查&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773471312-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;code&gt;netpol2.yaml&lt;/code&gt; 中配置的 &lt;code&gt;NetworkPolicy&lt;/code&gt; 位于命名空间 &lt;code&gt;backend&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
        <item>
            <guid isPermalink="true">https://www.bondrewd.com/2026/03/13/gateway/</guid>
            <title>Gateway</title>
            <link>https://www.bondrewd.com/2026/03/13/gateway/</link>
            <category term="k8s 实验" scheme="https://www.bondrewd.com/categories/k8s-%E5%AE%9E%E9%AA%8C/" />
            <pubDate>Fri, 13 Mar 2026 22:40:27 +0000</pubDate>
            <description><![CDATA[ &lt;p&gt;K8s &lt;strong&gt;Gateway&lt;/strong&gt; 是&lt;strong&gt;官方新一代流量入口标准（Gateway API）&lt;/strong&gt;，用来&lt;strong&gt;替代 / 升级传统 Ingress&lt;/strong&gt;，专门管理&lt;strong&gt;外部流量进入 Kubernetes 集群&lt;/strong&gt;的南北向流量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gateway = 更强大、更规范、云原生的下一代 Ingress&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;实验要求&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将现有 Web 应用程序从 Ingress 迁移到 Gateway API。您必须维护 HTTPS 访问权限。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;注意：集群中安装了一个名为 nginx 的 GatewayClass 。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;首先，创建一个名为 &lt;code&gt;web-gateway&lt;/code&gt; 的 Gateway ，主机名为 &lt;code&gt;gateway.web.k8s.local&lt;/code&gt; ，并保持现有名为 &lt;code&gt;web&lt;/code&gt; 的 Ingress 资源的现有 TLS 和侦听器配置。&lt;/li&gt;
&lt;li&gt;接下来，创建一个名为 &lt;code&gt;web-route&lt;/code&gt; 的 &lt;code&gt;HTTPRoute&lt;/code&gt; ，主机名为 &lt;code&gt;gateway.web.k8s.local&lt;/code&gt; ，并保持现有名为 &lt;code&gt;web&lt;/code&gt; 的 Ingress 资源的现有路由规则。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;您可以使用以下命令测试 Gateway API 配置：&lt;/em&gt;
&lt;ul&gt;
&lt;li&gt;[candidate@cka000057]$ curl -Lk &lt;a href=&#34;https://gateway.web.k8s.local:31443&#34;&gt;https://gateway.web.k8s.local:31443&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;最后，删除名为 &lt;code&gt;web&lt;/code&gt; 的现有 Ingress 资源。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考链接： &lt;a href=&#34;https://kubernetes.io/docs/concepts/services-networking/gateway/&#34;&gt;https://kubernetes.io/docs/concepts/services-networking/gateway/&lt;/a&gt;&lt;br /&gt;
难度：⭐⭐⭐&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;0-环境确认&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#0-环境确认&#34;&gt;#&lt;/a&gt; 0. 环境确认&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469142-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;kubectl get ingress web -o yaml&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建 &lt;code&gt;Gateway&lt;/code&gt; 时需要： 查看 &lt;code&gt;spec.tls.secretName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;HTTPRoute&lt;/code&gt; 时需要：查看 &lt;code&gt;spec.rules.http.paths.backend&lt;/code&gt; 和 &lt;code&gt;spec.rules.http.paths.path&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469169-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;1-编写-gatewayyaml-并应用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#1-编写-gatewayyaml-并应用&#34;&gt;#&lt;/a&gt; 1. 编写 gateway.yaml 并应用&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469195-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-编写-httprouteyaml-并应用&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#2-编写-httprouteyaml-并应用&#34;&gt;#&lt;/a&gt; 2. 编写 httproute.yaml 并应用&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469239-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-验证并删除-ingress-web&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#3-验证并删除-ingress-web&#34;&gt;#&lt;/a&gt; 3. 验证并删除 ingress web&lt;/h3&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469270-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&#34;补充内容&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#补充内容&#34;&gt;#&lt;/a&gt; 补充内容&lt;/h3&gt;
&lt;h4 id=&#34;ingressgateway-和-httproute&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#ingressgateway-和-httproute&#34;&gt;#&lt;/a&gt; Ingress，Gateway 和 HTTPRoute&lt;/h4&gt;
&lt;p&gt;Gateway 和 HTTPRoute 是 Kubernetes &lt;code&gt;Gateway API&lt;/code&gt; 的两个核心资源，共同替代传统的 Ingress 实现更灵活的流量管理。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gateway 负责基础设施层&lt;/strong&gt;，定义&lt;code&gt;监听器&lt;/code&gt;（端口、协议、主机名）和 &lt;code&gt;TLS 配置&lt;/code&gt;，由平台团队管理；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPRoute 负责应用层&lt;/strong&gt;，定义&lt;code&gt;路由规则&lt;/code&gt;（路径匹配、权重分发、后端服务），由应用团队管理。两者通过 &lt;code&gt;parentRefs&lt;/code&gt; 关联，实现职责分离。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469306-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Gateway 和 HTTPRoute&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;/wp-uploads/2026/03/1773469873-image.png&#34; alt=&#34;&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Ingress&lt;/p&gt;
&lt;p&gt;关系&lt;/p&gt;
&lt;p&gt;说明&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Ingress&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第一代流量入口资源（已成熟，但功能有限）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Gateway&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第二代流量入口的&lt;strong&gt;基础设施层&lt;/strong&gt;（监听器+TLS）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HTTPRoute&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第二代流量入口的&lt;strong&gt;应用层&lt;/strong&gt;（路由规则）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Gateway + HTTPRoute&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;替代 Ingress&lt;/strong&gt; 的新标准&lt;/p&gt;
&lt;h4 id=&#34;配置对比&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#配置对比&#34;&gt;#&lt;/a&gt; 配置对比&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Ingress 配置（全部在一起）&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: web-ingress&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # ⚠️ TLS 配置在这里&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  tls:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - hosts:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    secretName: tls-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # ⚠️ 路由规则也在这里&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  rules:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - host: example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    http:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      paths:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      - path: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        pathType: Prefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        backend:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;          service:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            name: web-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;            port:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;              number: 80&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Gateway + HTTPRoute 配置（职责分离）&lt;/strong&gt;:&lt;/p&gt;
&lt;pre class=&#34;shiki shiki-themes vitesse-light vitesse-dark&#34; style=&#34;background-color:#ffffff;--shiki-dark-bg:#121212;color:#393a34;--shiki-dark:#dbd7caee&#34; tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## ===== Gateway（基础设施团队管理）=====&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: Gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: web-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  gatewayClassName: nginx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  listeners:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    protocol: HTTPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    port: 443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    hostname: example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    # ⚠️ TLS 配置在这里&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    tls:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      mode: Terminate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      certificateRefs:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      - kind: Secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        name: tls-secret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;## ===== HTTPRoute（应用团队管理）=====&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;apiVersion: gateway.networking.k8s.io/v1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;kind: HTTPRoute&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;metadata:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  name: web-route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;spec:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # ⚠️ 引用 Gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  parentRefs:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - name: web-gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    kind: Gateway&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  hostnames:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - example.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  # ⚠️ 路由规则在这里&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  rules:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;  - matches:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - path:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        type: PathPrefix&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        value: /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    backendRefs:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;    - name: web-service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      kind: Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;      port:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;line&#34;&gt;&lt;span&gt;        number: 80&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&#34;功能对比&#34;&gt;&lt;a class=&#34;anchor&#34; href=&#34;#功能对比&#34;&gt;#&lt;/a&gt; 功能对比&lt;/h4&gt;
&lt;p&gt;功能&lt;/p&gt;
&lt;p&gt;Ingress&lt;/p&gt;
&lt;p&gt;Gateway + HTTPRoute&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTP 路由&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ 支持&lt;/p&gt;
&lt;p&gt;✅ 支持&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HTTPS/TLS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ 支持&lt;/p&gt;
&lt;p&gt;✅ 支持（更灵活）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;路径匹配&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ 前缀/精确&lt;/p&gt;
&lt;p&gt;✅ 前缀/精确/正则&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主机名匹配&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ 支持&lt;/p&gt;
&lt;p&gt;✅ 支持&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多监听器&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 有限&lt;/p&gt;
&lt;p&gt;✅ 原生支持&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TCP/UDP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 不支持&lt;/p&gt;
&lt;p&gt;✅ 支持 (TCPRoute/UDPRoute)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 不支持&lt;/p&gt;
&lt;p&gt;✅ 支持 (GRPCRoute)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;流量拆分&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 困难&lt;/p&gt;
&lt;p&gt;✅ 原生支持&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;跨命名空间&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 困难&lt;/p&gt;
&lt;p&gt;✅ 原生支持&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;角色分离&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;❌ 混合&lt;/p&gt;
&lt;p&gt;✅ 清晰分离&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API 成熟度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;✅ GA&lt;/p&gt;
&lt;p&gt;✅ GA (v1)&lt;/p&gt;
&lt;hr /&gt;
 ]]></description>
        </item>
    </channel>
</rss>
