<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>BlueberryOreo的个人博客</title><link>http://blueberryoreo.github.io/hugo-blog/</link><description>Recent content on BlueberryOreo的个人博客</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 15 Jul 2026 07:00:00 +0012</lastBuildDate><atom:link href="http://blueberryoreo.github.io/hugo-blog/index.xml" rel="self" type="application/rss+xml"/><item><title>（翻译）神经网络、流形和拓扑（编辑中）</title><link>http://blueberryoreo.github.io/hugo-blog/p/nn-manifolds-and-topology/</link><pubDate>Wed, 15 Jul 2026 07:00:00 +0012</pubDate><guid>http://blueberryoreo.github.io/hugo-blog/p/nn-manifolds-and-topology/</guid><description>&lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/example_network.svg" alt="Featured image of post （翻译）神经网络、流形和拓扑（编辑中）" /&gt;&lt;h2 id="神经网络流形和拓扑"&gt;神经网络、流形和拓扑
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;原文：&lt;a class="link" href="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/" target="_blank" rel="noopener"
 &gt;Neural Networks, Manifolds, and Topology&lt;/a&gt; 发布于2014年4月6日 【&lt;em&gt;关键词：拓扑、神经网络、深度学习、流形假设&lt;/em&gt;】&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;最近深度神经网络在不少领域（例如计算机视觉）取得了重大突破，引发了广泛关注[1]。然而我们对于深度神经网络还有很多困惑，例如我们很难去理解深度神经网络&lt;em&gt;到底&lt;/em&gt;在做什么。如果训练的很好，深度神经网络可以得到高质量的结果，但我们不知道为什么这样会好；同样的，如果训练的不好，我们也很难去找问题出在哪儿了。&lt;/p&gt;
&lt;p&gt;不过相比于去整体理解高维深度神经网络的原理，从低维的、一层只有几个神经元的“深度”神经网络来思考会容易很多。实际上，我们可以通过可视化的方法完全理解深度神经网络的机理以及如何去训练这样的网络。基于这个角度，我们可以对神经网络的机理有更加深入的认知，同时我们还可以发现它和数学里面的“拓扑”有很大的联系。通过这些分析，我们可以看到很多有趣的发现，&lt;del&gt;包括一个神经网络可以分类的数据集分布的基本上限在哪里&lt;/del&gt;。&lt;/p&gt;
&lt;h3 id="一个简单的例子"&gt;一个简单的例子
&lt;/h3&gt;&lt;p&gt;我们先从这个最简单的数据集开始：平面上的两条曲线。一个网络需要去学习将这两条曲线上的点区分开来。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/simple2_data.png" alt="平面上的两条曲线" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;想要直观看到一个神经网络、或者说一个分类算法的分类能力，我们只需要去看它如何去分类任意一个数据点。我们先考虑一个最简单的神经网络，只有一个输入层和一个输出层（译者注：即 $y=Wx$ ）。这种网络仅会用一条直线将数据集分成两类。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/simple2_linear.png" alt="简单网络分类" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;这种网络没什么意思。现代神经网络通常在输入和输出之间还有至少一层的神经元，这些层被称为“隐藏层（hidden layers）”。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/example_network.svg" alt="维基百科上的神经网络示意图" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;用这样的神经网络，我们再进行一次分类的可视化，可以看到它将数据用一条更复杂的曲线分成了两类。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/simple2_0.png" alt="带有隐藏层的神经网络的分类" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;这种多层的神经网络会在每一层将数据进行变换，得到一个新的&lt;em&gt;表示（representation）&lt;/em&gt;[2]。我们可以在每一个表示中观察网络是如何分类这些数据的。在得到了最终的表示之后，神经网络就会直接用一条直线（或者高维空间中的超直线）来区分这些数据。&lt;/p&gt;
&lt;p&gt;在之前的可视化里面，我们观察的是数据的“原始”表示，可以认为这是我们从输入的角度来看这些数据是如何分布的。现在我们来看看经过第一个隐藏层变换后的表示，可以认为我们换了一个角度，从隐藏层输出的角度来看数据的分布。&lt;/p&gt;
&lt;p&gt;每一维代表隐藏层的一个神经元的输出的结果。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/simple2_1.png" alt="隐藏层学到的表示，这种表示下的数据可以被线性区分" width="50%"&gt;&lt;br&gt;
 &lt;sub&gt;隐藏层学到的表示，这种表示下的数据可以被线性区分&lt;/sub&gt;
&lt;/p&gt;
&lt;h3 id="层的连续可视化"&gt;层的连续可视化
&lt;/h3&gt;&lt;p&gt;通过上一节的内容，我们学习了如何利用每一层得到的表示来理解网络在做什么。这样我们得到了一系列离散的表示。&lt;/p&gt;
&lt;p&gt;一个难点是我们如何去理解一个表示如何变化为另一个表示，不过神经网络的性质可以很容易地解决这个问题。&lt;/p&gt;
&lt;p&gt;神经网络中有大量不同种类的层。我们以 &lt;code&gt;tanh&lt;/code&gt; 层作为具体的例子。一个 &lt;code&gt;tanh&lt;/code&gt; 层 $\tanh(Wx+b)$ 包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线性变换矩阵 $W$（也被称为“权重矩阵”）&lt;/li&gt;
&lt;li&gt;偏置项 $b$&lt;/li&gt;
&lt;li&gt;逐元素计算的激活函数 $\tanh$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们可以用一个连续的变换过程来表示：&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/1layer.gif" alt="tanh变换过程" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;其他网络也差不多是这种方式，包含一个仿射变换和一个逐元素计算的单调激活函数。&lt;/p&gt;
&lt;p&gt;我们可以将这种可视化方法用到更加复杂的网络上去。例如下面这个有四层隐藏层的神经网络，可以将两个稍微纠缠在一起的数据区分开来。随着变换的进行，我们可以看到网络将原始表示变换成了更高级的表示，用来分类数据。即使最开始这两个数据是螺旋形纠缠在一起的，最终它们同样能够被线性分割。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/spiral.1-2.2-2-2-2-2-2.gif" alt="成功的螺旋状数据的表示变换" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;而像下面这个同样有多层的网络，却没能将两个数据成功区分开来，反而让两个数据更加纠缠在一起。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/spiral.2.2-2-2-2-2-2-2.gif" alt="失败的螺旋状数据的表示变换" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;值得注意的是，这里的任务看起来很复杂主要是因为我们仅仅使用了低维的神经网络。如果我们使用更高维的神经网络，这些分类任务就会变得很容易处理。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;（Andrej Karpathy 做了一个很棒的 &lt;a class="link" href="http://cs.stanford.edu/people/karpathy/convnetjs//demo/classify2d.html" target="_blank" rel="noopener"
 &gt;demo&lt;/a&gt; 可以交互式地可视化探索神经网络的训练过程）&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="tanh-层的拓扑"&gt;tanh 层的拓扑
&lt;/h3&gt;&lt;p&gt;每一层都会拉伸和压缩数据空间，但从来不会剪切、破坏或者折叠这个空间。直觉上我们可以看出它们保留了拓扑的性质。例如一个连续的集合在变换后仍然是连续的。&lt;/p&gt;
&lt;p&gt;这种不会影响到拓扑的变换被称为&lt;em&gt;同胚（homeomorphisms）&lt;/em&gt;。准确来讲，它们是连续的双射函数。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;定理：&lt;/strong&gt; 具有 $N$ 个输入和 $N$ 个输出的层是同胚的，如果权重矩阵是非奇异的。（需要注意激活函数的定义域和值域）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;证明：&lt;/strong&gt; 我们一步步来考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;假设 $W$ 的行列式不为 0。那么这就是一个双射线性方程，并且线性可逆。线性方程是连续的，所以乘 $W$ 是同胚的。&lt;/li&gt;
&lt;li&gt;加上偏置是同胚的。&lt;/li&gt;
&lt;li&gt;$\tanh$（包括 sigmoid 和 softplus，但不包括 $\text{ReLU}$）是连续函数，拥有连续的逆函数。如果我们仔细考虑定义域和值域，它们可以是双射的。所以按元素做这些运算是同胚的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，如果 $W$ 的行列式不为 0，这个层就是同胚的。$\Box$&lt;/p&gt;
&lt;p&gt;这个结论在任意多个层复合在一起的时候也是成立的。&lt;/p&gt;
&lt;h3 id="拓扑和分类"&gt;拓扑和分类
&lt;/h3&gt;&lt;p&gt;考虑一组包含两类的二维数据 $A, B\in\mathbb{R}^2$：&lt;/p&gt;
&lt;p&gt;&lt;img
src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/topology_base.png"
alt="红色的点为类别A，蓝色的点为类别B"
width="300"
style="float: right; margin: 0 0 16px 20px;"
/&gt;&lt;/p&gt;
$$
A = \{ x\mid d(x, 0) &lt; \frac{1}{3}\}\\
B = \{ x\mid \frac{2}{3} &lt; d(x, 0) &lt; 1\}
$$&lt;p&gt;&lt;strong&gt;断言：&lt;/strong&gt; 隐藏层每层神经元数量小于 3 的神经网络无法分类这样的数据，不论网络有多深。&lt;/p&gt;
&lt;p&gt;上文提到，使用 sigmoid 或者 softmax 构建网络的分类方式等同于尝试在最终的表示中寻找一个超平面（或像这里的一条直线）来将两类数据划分开来。如果只有两个隐藏神经元，神经网络在拓扑层面是无法将这种数据区分开来的。&lt;/p&gt;
&lt;p&gt;在下面的可视化例子中，我们来观察训练过程中的一个网络的隐藏表示，以及划分的线。我们可以看到，不论网络怎么尝试变换隐藏表示，划分线始终无法将两类数据进行正确地划分。&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/topology_2D-2D_train.gif" alt="简单网络失败样例" width="50%"&gt;&lt;br&gt;
 &lt;sub&gt;这个网络无法将这两类数据正确分类&lt;/sub&gt;
&lt;/p&gt;
&lt;p&gt;最终表示被压缩到了一个近乎无意义的局部空间内。不过即便这样，这个网络也能够达到 80% 左右的分类准确率。&lt;/p&gt;
&lt;p&gt;这个例子只有一个隐藏层，但更多的隐藏层也同样无法处理这种数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;证明：&lt;/strong&gt; 一个层或者是一同胚的，或者其权重矩阵的行列式为 0。如果一个层是同胚的，那么 $A$ 始终环绕着 $B$，因此一条直线无法将它们划分开来。如果我们假设权重矩阵的行列式为 0，那么数据就会坍缩到某些维度上。由于我们处理的是一个与原始 $A$ 围绕着 $B$ 的数据集同胚的对象，坍缩到任何维度意味着 $A$ 和 $B$ 中的一些点会混合到一起，这样我们更无法将它们区分开来。$\Box$&lt;/p&gt;
&lt;p&gt;如果我们增加一维，那问题就简单了。神经网络可以学习到这样的表示：&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/topology_3d.png" alt="三维中的表示" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;在这样的表示下，我们可以通过一个超平面来区分这个数据集。&lt;/p&gt;
&lt;p&gt;为了更好地理解到底发生了什么，我们可以考虑一组更简单的一维数据：&lt;/p&gt;
&lt;p&gt;&lt;img
src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/topology_1d.png"
alt="一维数据样例"
width="300"
style="float: right; margin: 0 0 16px 20px;"
/&gt;&lt;/p&gt;
$$
A = [-\frac{1}{3}, \frac{1}{3}] \\[1em]
B = [-1, -\frac{2}{3}] \cup [\frac{2}{3}, 1]
$$&lt;p&gt;如果我们不用有两个及以上的神经元的隐藏层，我们无法将这组数据进行分类。但如果我们只用一个有两个神经元的隐藏层，我们可以学习到一个完美的弧线形的表示，使得我们用一条直线可以将两类数据划分开来：&lt;/p&gt;
&lt;p align="center"&gt;
 &lt;img src="https://colah.github.io/posts/2014-03-NN-Manifolds-Topology/img/topology_1D-2D_train.gif" alt="一维数据划分" width="50%"&gt;
&lt;/p&gt;
&lt;p&gt;发生了什么？一个神经元会在 $x&amp;gt;-\frac{1}{2}$ 的时候被激活，另一个会在 $x&amp;gt;\frac{1}{2}$ 的时候被激活。如果只有第一个神经元被激活，说明我们得到的数据点是属于 $A$ 类的。&lt;/p&gt;
&lt;h3 id="流形假设the-manifold-hypothesis"&gt;流形假设（The Manifold Hypothesis）
&lt;/h3&gt;&lt;p&gt;真实世界中的数据集，例如图像数据，是否也是类似的情况？如果你认真对待流形假设，我认为这是值得考虑的。&lt;/p&gt;
&lt;p&gt;流形假设认为自然数据集在嵌入空间中组成低维流形，有理论[3]和实验[4]可以说明这一点。如果你认为这是正确的，那分类算法的任务实际上就是将一组纠缠在一起的流形。&lt;/p&gt;
&lt;p&gt;我们可以看前面的那个例子，一类被完全包围在另一类里面，这就是一组纠缠在一起的流形。不过一般来说狗的图像的流形也不一定就是像这种样子完全被猫的图像的流形所“包围”。在下一节中我们可以看到一些拓扑结构，它们虽然看起来很合理，但会引起一些问题。&lt;/p&gt;
&lt;p&gt;[1]: This seems to have really kicked off with Krizhevsky et al., (2012), who put together a lot of different pieces to achieve outstanding results. Since then there’s been a lot of other exciting work.&lt;/p&gt;
&lt;p&gt;[2]: These representations, hopefully, make the data “nicer” for the network to classify. There has been a lot of work exploring representations recently. Perhaps the most fascinating has been in Natural Language Processing: the representations we learn of words, called word embeddings, have interesting properties. See Mikolov et al. (2013), Turian et al. (2010), and, Richard Socher’s work. To give you a quick flavor, there is a very nice visualization associated with the Turian paper.&lt;/p&gt;
&lt;p&gt;[3]: A lot of the natural transformations you might want to perform on an image, like translating or scaling an object in it, or changing the lighting, would form continuous curves in image space if you performed them continuously.&lt;/p&gt;
&lt;p&gt;[4]: Carlsson et al. found that local patches of images form a klein bottle.&lt;/p&gt;</description></item><item><title>Linux分区移动记录</title><link>http://blueberryoreo.github.io/hugo-blog/p/linux-partition/</link><pubDate>Sat, 11 Jul 2026 09:00:00 +0012</pubDate><guid>http://blueberryoreo.github.io/hugo-blog/p/linux-partition/</guid><description>&lt;img src="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0.png" alt="Featured image of post Linux分区移动记录" /&gt;&lt;h2 id="引言"&gt;引言
&lt;/h2&gt;&lt;p&gt;之前在Windows笔记本上装了一个Linux系统，原本想的是这个Linux系统用于玩玩agent，因此没有给Linux留很多的空间。但后来发现Linux系统用起来也挺顺手，而且基本可以把电脑完全交给agent来管理，因此打算长期使用Linux系统。此时发现Linux中的空间不太够用，于是打算把Windows系统盘里面更多的空闲空间分配给Linux用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="磁盘初始状态" class="gallery-image" data-flex-basis="639px" data-flex-grow="266" data-title-escaped="磁盘初始状态" height="401" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0.png" srcset="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0_hu_85d2b4cf6e9ff2f0.png 800w, http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0.png 1068w" title="磁盘初始状态" width="1068"&gt;&lt;/p&gt;
&lt;p&gt;有一种方便的方法，就是新建一个路径，然后把这个路径挂载到空闲空间上，但这样原本需要更大空间的位置就没法存入更多的数据。因此我想要把空闲空间移动到我想要扩容的目标挂载点上，然后进行扩容。整体磁盘的分区状态如上图所示，左边是Windows分区，右边是Linux分区。但这样会有如下的问题：&lt;/p&gt;
&lt;p&gt;&lt;img alt="移动问题" class="gallery-image" data-flex-basis="1015px" data-flex-grow="423" data-title-escaped="移动问题" height="243" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0-1.png" srcset="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0-1_hu_2ae980974d576e0f.png 800w, http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-0-1.png 1028w" title="移动问题" width="1028"&gt;&lt;/p&gt;
&lt;p&gt;在已有的Linux系统中，利用GParted进行Windows分区的移动是很容易的，但无法直接进行当前Linux分区的移动，尤其是这里需要移动&lt;code&gt;/boot&lt;/code&gt;分区。此外，在已有的Windows系统中，也无法使用DiskGenius对Linux的分区进行操作。网上查了一圈，好像没有人有写过类似的记录，询问了AI之后说这种情况需要借助LinuxLive USB来做。这篇博客就记录了我利用启动盘对磁盘分区进行移动的过程。&lt;/p&gt;
&lt;h2 id="前置工作准备"&gt;前置工作准备
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据备份&lt;/strong&gt;，把待处理的目标系统中重要的数据进行备份，毕竟这属于磁盘操作，一旦操作失败很有可能导致数据的丢失&lt;/li&gt;
&lt;li&gt;一块LinuxLive USB&lt;/li&gt;
&lt;li&gt;在现有系统中记录一下各个分区分别挂载的是什么地方&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于第二点，实际上这个只需要用最开始安装Linux用的启动盘来做就可以了，里面一般都会装有这样的环境。我们主要是要利用这个外部的临时系统来对电脑磁盘进行操作。&lt;/p&gt;
&lt;p&gt;对于第三点，这个主要是为了后续操作的方便。刚才操作的时候我没有记录具体分区挂载的是什么位置，导致后面出了一些麻烦。具体的查看方法有多种，比如直接在现有Linux系统中打开GParted然后看&lt;code&gt;Partition&lt;/code&gt;列和&lt;code&gt;Mount Point&lt;/code&gt;列，记录下对应关系；或者用原生的方法，打开终端，输入&lt;code&gt;lsblk -f&lt;/code&gt;，会列出像这样的内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvme0n1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─nvme0n1p1 vfat FAT32 SYSTEM DC9A-088D 141.3M 28% /boot/efi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;......
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─nvme0n1p9 btrfs a9803022-ed20-49d1-8783-d3074a15f7e5 195.3M 45% /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─nvme0n1p10 swap 1 db10c61c-0bb4-4002-8810-78a14ff1b97b [SWAP]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─nvme0n1p11 ext4 1.0 6ff5661f-c122-425d-a026-ac1ad5e99949 9.5G 72% /
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├─nvme0n1p12 ext4 1.0 6d6471ff-9417-41a8-8074-6b78be19e95e 127.5G 30% /home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─nvme0n1p13 ext4 1.0 fb60d579-4a4d-45da-9e2c-e3403bdcb4ec 334.9M 90% /home/sunjiayang/texlive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最后一列就是挂载点，最前面的就是分区的号。把这个对应关系记录下来就好。像我这里的就是：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分区&lt;/th&gt;
					&lt;th&gt;挂载点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p1&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/boot/efi&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p9&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/boot&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p10&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;[SWAP]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p11&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p12&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/home&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvme0n1p13&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;/home/sunjiayang/texlive&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注意这里特别要记录一下EFI所在的挂载点，一般是&lt;code&gt;vfat&lt;/code&gt;文件系统的那个分区的挂载点。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="进入启动盘"&gt;进入启动盘
&lt;/h2&gt;&lt;p&gt;和安装系统时一样，插入启动盘，然后在开机的时候进入启动引导界面（我这里的华为笔记本是按F12），然后选择用USB启动，进入正常的Linux系统安装界面。&lt;/p&gt;
&lt;h2 id="进行分区移动"&gt;进行分区移动
&lt;/h2&gt;&lt;p&gt;此时不要进行安装流程，而是直接按&lt;code&gt;Ctrl+Alt+T&lt;/code&gt;唤出终端，然后输入&lt;code&gt;gparted&lt;/code&gt;唤出GParted应用。此时想要对里面所有的分区进行操作都是可行的，不像之前在已有Linux系统里面想要移动&lt;code&gt;/boot&lt;/code&gt;分区却显示的是灰色，移动不了。此时按照GParted的UI引导进行分区移动和扩容即可，我这里做的就是把&lt;code&gt;/boot&lt;/code&gt;分区移动到左边挨着Windows分区，再把&lt;code&gt;/&lt;/code&gt;分区移动到左边挨着&lt;code&gt;/boot&lt;/code&gt;分区，这样空间部分就挨着了我想要扩容的&lt;code&gt;/home&lt;/code&gt;分区。然后再把&lt;code&gt;/home&lt;/code&gt;分区扩容就可以了。&lt;/p&gt;
&lt;h2 id="移动过后的处理"&gt;移动过后的处理
&lt;/h2&gt;&lt;p&gt;此时有一个关键的步骤，就是进行引导修复。因为移动了&lt;code&gt;/boot&lt;/code&gt;分区，因此可能会导致原本的引导找不到系统启动的路径导致无法启动。在刚才移动的时候GParted也会提示这个问题，虽然在官网上说GRUB 2和GPT/EFI Windows installations相对来说更加稳定一些，但以防万一这一个操作还是有必要做的。&lt;/p&gt;
&lt;p&gt;GParted官网在&lt;a class="link" href="https://gparted.org/faq.php" target="_blank" rel="noopener"
 &gt;FAQ&lt;/a&gt;里面给了各种系统的处理方案，我们这里可以参考&lt;a class="link" href="https://gparted.org/display-doc.php?name=help-manual&amp;amp;lang=C#gparted-fix-grub-boot-problem" target="_blank" rel="noopener"
 &gt;GRUB boot problem&lt;/a&gt;这个来做。&lt;/p&gt;
&lt;p&gt;首先打开一个新的终端，然后在&lt;code&gt;/tmp&lt;/code&gt;下面新建一个临时挂载点：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /tmp/mydir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个时候就要用到我们刚才记录下来的各个挂载点和分区对应的位置了。像我这里&lt;code&gt;/&lt;/code&gt;是被&lt;code&gt;nvme0n1p11&lt;/code&gt;分区挂载的，那么我们就把这个分区挂载到刚才我们创建的临时挂载点上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount /dev/nvme0n1p11 /tmp/mydir &lt;span class="c1"&gt;# 挂载 /&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后将我们将&lt;code&gt;/boot&lt;/code&gt;对应的分区（比如我这里是&lt;code&gt;nvme0n1p9&lt;/code&gt;）挂载到&lt;code&gt;/tmp/mydir/boot&lt;/code&gt;上面：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount /dev/nvme0n1p9 /tmp/mydir/boot &lt;span class="c1"&gt;# 挂载 /boot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;注意：如果刚才的&lt;code&gt;/&lt;/code&gt;没有挂载对，那么这里可能会显示找不到&lt;code&gt;/tmp/mydir/boot&lt;/code&gt;这个路径。如果找不到，建议先检查一下分区有没有挂载对，如果挂载错了，那么可以把原本挂载的分区先卸载掉（就像我刚才做的一样），然后再挂载正确的分区&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo umount /tmp/mydir &lt;span class="c1"&gt;# 卸载分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后按照官方的流程，输入下面这些指令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount --bind /dev /tmp/mydir/dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount --bind /proc /tmp/mydir/proc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount --bind /sys /tmp/mydir/sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mount --bind /run /tmp/mydir/run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这几个&lt;code&gt;--bind&lt;/code&gt;的核心作用就是让接下来的&lt;code&gt;chroot&lt;/code&gt;环境“借用”启动盘的系统接口，让&lt;code&gt;grub-install&lt;/code&gt;和&lt;code&gt;update-grub&lt;/code&gt;能够正常检测硬件、生成配置文件。&lt;/p&gt;
&lt;p&gt;接下来切换root环境：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chroot /tmp/mydir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后重新安装GRUB2。这里官网上给的指令比较精简，可能会出现一些问题。按照grok给出的指令，这里需要指定&lt;code&gt;target&lt;/code&gt;、&lt;code&gt;efi-directory&lt;/code&gt;和&lt;code&gt;bootloader&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grub-install --target&lt;span class="o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="o"&gt;=&lt;/span&gt;/boot/efi --bootloader-id&lt;span class="o"&gt;=&lt;/span&gt;GRUB /dev/nvme0n1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里的&lt;code&gt;--efi-directory&lt;/code&gt;就是刚才我们在查看分区的时候看到的EFI的那个分区所在的挂载点。如果这一步没有问题，那么可以进行GRUB的更新，然后就可以重启电脑了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-grub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="c1"&gt;# 退出root环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot &lt;span class="c1"&gt;# 重启电脑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;到这里就已经完整完成了分区的移动以及引导的修复。像我这里不出意外的话最终电脑可以正常重启，并进入Linux系统。再次查看磁盘状态，可以看到分区已经被正确移动，并且我这里的目标分区&lt;code&gt;/home&lt;/code&gt;分区已经被扩容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="处理后的磁盘状态" class="gallery-image" data-flex-basis="444px" data-flex-grow="185" height="720" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-1.png" srcset="http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-1_hu_b103edd3d3479a35.png 800w, http://blueberryoreo.github.io/hugo-blog/p/linux-partition/partition-1.png 1334w" width="1334"&gt;&lt;/p&gt;
&lt;p&gt;想要给双系统中的Linux系统扩容Windows的空闲空间还是比较麻烦的，但不是不可以。不过磁盘操作总归会有一定的数据丢失的风险，所以建议还是在最开始安装双系统的时候就规划好合理的磁盘分配。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考资料"&gt;参考资料
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://gparted.org/faq.php" target="_blank" rel="noopener"
 &gt;GParted FAQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://grok.com/share/c2hhcmQtMi1jb3B5_afe5d457-03bc-4b8e-93bb-122e7746aae0" target="_blank" rel="noopener"
 &gt;与Grok的聊天记录&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>论文介绍</title><link>http://blueberryoreo.github.io/hugo-blog/p/procap/</link><pubDate>Fri, 10 Jul 2026 13:00:00 +0012</pubDate><guid>http://blueberryoreo.github.io/hugo-blog/p/procap/</guid><description>&lt;p&gt;这篇博客将介绍我们的第一篇工作：Imagine How To Change: Explicit Procedure Modeling for Change Captioning。&lt;/p&gt;</description></item><item><title>测试博客</title><link>http://blueberryoreo.github.io/hugo-blog/p/hello-world/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate><guid>http://blueberryoreo.github.io/hugo-blog/p/hello-world/</guid><description>&lt;p&gt;Welcome to Hugo theme Stack. This is your first post. Edit or delete it, then start writing!&lt;/p&gt;
&lt;p&gt;For more information about this theme, check the documentation: &lt;a class="link" href="https://stack.jimmycai.com/" target="_blank" rel="noopener"
 &gt;https://stack.jimmycai.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Want a site like this? Check out &lt;a class="link" href="https://github.com/CaiJimmy/hugo-theme-stack-starter" target="_blank" rel="noopener"
 &gt;hugo-theme-stack-stater&lt;/a&gt;&lt;/p&gt;
&lt;!-- &gt; Photo by [Pawel Czerwinski](https://unsplash.com/@pawel_czerwinski) on [Unsplash](https://unsplash.com/) --&gt;</description></item></channel></rss>