P5-2.2 隐藏层(hidden layer)与表征¶
Section ID:
P5-2.2Version:v2026.07.20
在 P5-2.1 里,我们已经看到:多层神经网络(multilayer neural network)会把感知机这类计算单元按多层堆起来,让输入不会直接走向最终判断,而是先经过中间步骤。现在可以把问题再推进一步。
那个中间步骤里,到底形成了什么?
用来回答这个问题的视角,就是表征(representation)。隐藏层并不是把输入值原封不动复制一遍的地方,而是一个会在内部逐渐形成、更利于后续判断的中间表征层。
如果后面章节里需要再次快速复习表征这个概念,更适合回到英文概念词汇表里的 representation 条目作为基线。
隐藏层怎样改变表征的问题¶
本节整理以下问题。
- 为什么隐藏层(hidden layer)会被当成不只是普通中间计算?
- 说模型在学习表征(representation),到底是什么意思?
- 当层数加深时,出现更抽象表征这句话具体该怎么读?
- 能不能直接把隐藏层节点解释成容易读懂的人类标签?
- 为什么深度学习总会和 representation learning 一起被提起?
关于 representation learning 这条更大的线索,会在 P5-10.1 与 P5-10.2 再继续扩展;CNN 里的滤波器与空间表征,会在 P5-11.1 与 P5-11.2 再连接;基于 attention 的表征,则会在 P5-13.1、P5-13.2,以及 P5-14.1 到 P5-14.5 的 Transformer 正文中重新连接。也就是说,这一节先要把隐藏层固定为把输入重新改写成内部表征的层。
内部表征与中间特征的判断标准¶
- 能把隐藏层解释成
输入与输出之间的表征变换层。 - 能把表征(representation)理解成
模型内部重新记录同一对象的坐标方式。 - 能说明层数变深时,为什么会形成更复杂、更抽象的表征。
- 能理解为什么如果给隐藏层节点强行贴上人类式名称,反而容易造成误解。
为什么隐藏层重要¶
在 Part 4 的传统机器学习里,很多时候是由人直接选择特征(feature)。
- 最近报警次数
- 平均振动幅度
- 温度上升幅度
- 恢复延迟时间
这些特征会先被人整理好,再送进模型。模型则在这些特征之上做回归或分类。
但到了深度学习里,问题会变成另一种问法。
如果不让人把有用特征全部提前写出来,能不能让模型在内部自己形成中间表征?
正是在这里,隐藏层变得重要。隐藏层不是一个简单的传输通道,而是会把输入重新组织成更有利于后续判断的内部表征。
也就是说,深度学习开始不只是学习一个判断函数,而是连有利于判断的表征本身也一起学习。
表征(representation)是什么意思¶
representation 这个词对读者来说容易显得抽象。这里先把它理解成下面这句话。
表征,就是模型在内部重新记录同一个对象的方式。
例如,假设一组设备状态数据最初是以四个数字送进来的。
- 最近报警次数
- 平均振动幅度
- 温度上升幅度
- 恢复延迟时间
经过隐藏层之后,模型未必还会按这四个原始输入原样保留它们。相反,它更可能在内部把它们改写成一些更有利于判断的组合,例如:
- 类似于“维持正常运行程度”的内部轴
- 类似于“故障前兆风险”的内部轴
- 类似于“是否需要立即检查”的内部轴
当然,这并不表示真实节点真的就叫这些名字。但从直觉上说,把它理解成原始输入被重新写进一个更有用的内部坐标系里就已经足够。
为什么“内部坐标系”这个说法有用¶
如果把表征类比成内部坐标系(internal coordinate system),隐藏层的角色就会更清楚。
- 在原始输入坐标里很难分开的对象,
- 经过隐藏层之后,
- 可能会在新的坐标里变得更容易区分。
也就是说,隐藏层并不只是做了一次计算,而更像是在把问题变换到一个更好解的坐标系里。
把它压缩成极简图,就是下面这样。
flowchart TD
A["相同的样本"]
B["原始坐标<br/>混在一起,难以分开"]
C["隐藏层重新表达它们"]
D["新的内部坐标<br/>更容易区分"]
E["最终预测变得更容易"]
A --> B
A --> C
B --> C --> D --> E
这张图最核心的点在于:改变的不是数据本身,而是模型内部看待同一批数据的方式。原本在旧坐标里混杂、难分的样本,经过隐藏层后,可能会在新的内部坐标里被重新写成更容易切开的形式。正因为这样,内部坐标系这个说法才有帮助。
层数变深时,到底变了什么¶
在深度学习里,经常会听到一种说法:前面的层更偏向简单特征,后面的层更偏向抽象特征。
这句话必须非常小心地来读。
它通常更接近下面这个意思。
- 前层会先抓住小组合或局部模式,
- 后层则会把这些组合再重新汇总成更大的模式,或更贴近问题本身的表征。
如果继续用图像当直觉类比,可以先这样想。
| 层级 | 直觉性说明 |
|---|---|
| 前层 | 线条、边缘、亮度变化这样的局部模式 |
| 中层 | 简单形状组合 |
| 后层 | 更大的局部结构,或更接近分类的表征 |
文本数据与表格数据其实也可以用同样感觉来读。当然,具体每一层到底学到了什么,会依模型结构与数据而不同。这里最重要的是固定这样一点:随着层数增加,模型能够逐步形成更利于当前问题的内部表征。
为什么不能太轻易解释隐藏层¶
读者很容易想给隐藏层中的每个节点立刻贴上人类语言标签,比如这是稳定性、这是风险度、这是警示灯状态。但这种解释要非常小心。
隐藏层表征往往有下面几个特征。
- 一个节点不一定只承担一个意义。
- 一个性质也可能要由多个节点一起表达。
- 它有可能属于一种人类很难直觉阅读的分散表征(distributed representation)。
也就是说,隐藏层并不是一张人手写出来的规则表,而可能是一个由多个数值一起分担信息的内部空间。
正因为这样,representation learning 很强大,但也会伴随可解释性上的困难。
为什么 distributed representation 重要¶
在深度学习文献里,representation learning 之所以重要,其中一个关键理由就是分散表征(distributed representation)。
先把它理解成下面这句话。
重要信息未必只落在一个节点上,而可能被分散到多个节点组合里。
例如,不一定是某一个节点单独代表某种输入性质,而可能是:
- 节点 A 保存一部分趋势,
- 节点 B 保存另一部分趋势,
- 节点 C 只有在与前两者组合时才会显出意义。
正因为有这种结构,神经网络的表征能力会更强;但也正因为如此,人很难简单地说这一格精确对应某个含义。
特征设计责任转移到了哪里¶
传统机器学习模型当然也有特征组合,但更多时候是由人直接控制下面这些事情。
- 要放哪些特征进去,
- 要做什么预处理,
- 要采用什么距离或切分规则。
而在多层神经网络里,模型内部会承担起更多形成有用中间表征的责任。
这个差异不只是工具换了。它意味着:原本由人先挑好特征,再让模型去调整边界或分数;现在则变成模型会在隐藏层里主动形成利于判断的内部轴。因此,这一节最该抓住的重点,不是传统模型和深层模型到底谁更好,而是在最终判断之前,问题本身先被重新写进了更容易切开的中间表征里。
案例与例子¶
案例 1. 设备面板警告状态判别¶
先想象这样一个场景:设备摄像头拍到了仪表盘和警示灯,模型要从一帧画面里分出正常监视、需要确认警告、需要立即评估停机这类状态。人看这类运行画面时,也不会真的逐像素去判断,而往往会先在脑中形成一些中间标准,例如指针是不是靠近红区、警示灯是不是亮了、阀门把手方向是不是和平常不同。这个场景正好能很好说明隐藏层为什么重要。
原始输入可能只是长长的一串像素值。但模型未必会直接凭这些像素值去最终判别。比如说,压力表指针稍微上扬、警示灯弱闪、阀门把手稍微转动,单独看每一个都可能很暧昧。可是在经过隐藏层之后,模型内部可能逐步形成下面这种表征。
- 指针是否接近警告区间
- 警示灯是否出现了明亮闪烁模式
- 阀门把手是否偏离了平时方向
- 多种视觉线索是否同时朝警告方向叠加
当然,这些仍然只是人类为了帮助理解而做的直觉性命名。真实的内部表征往往会更复杂,也更分散。但这个比喻足以说明:隐藏层不会把原始输入(raw input)原样留下,而是在不断把它们改写成更有利于判断的形式。
换句话说,多层结构更接近于先形成中间判断材料,再把它送到最终状态判断,而不是把相机帧直接映射成最终标签。这正是单个感知机与多层结构之间最重要的差别之一。所以在这个案例里,要确认的结果就是:为什么从“先经过中间表征再到最终判断”的视角去解释,会比“直接从像素到状态”更合理。
把这个案例的判断顺序再压缩成一个小流程,就是下面这样。
flowchart TD
A["面板画面输入"] --> B["指针 / 警示灯 / 阀门线索"]
B --> C["旧读法:直接猜最终状态"]
B --> D["隐藏层读法:先形成内部轴"]
D --> E["压力 / 警告 / 协调轴"]
E --> F["更稳妥的最终状态判断"]
人很容易觉得,只要看足够多的像素,模型就能直接猜出状态。但换到表征视角时,像素只是材料;真正被后续层读取的,是先形成的指针、警示灯、阀门等中间线索。最终状态判断,是对这些中间表征组合的再阅读。类似画面之所以容易混淆,也不只是因为像素看起来像,而是因为哪一条内部轴被更强地点亮,会决定最终走向哪一类解释。
案例 2. 设备警告状态的内部表征¶
在表格型数据里,也会发生类似的事情。比如说,一个设备样本里同时给出了最近报警次数、平均振动幅度、温度上升幅度、恢复延迟时间。人往往会先分别看这四个数字,并想立刻得出现在还撑得住,或者需要马上停机这样的结论。但在现实里,单独一个报警次数高,并不一定就代表危险;反过来,当振动、温升与恢复延迟一起增大时,才更可能显露出关键状态。隐藏层正是把这些输入重新写成一种更有用的内部表征,例如表面还能运行,但故障前兆已经在累积。
如果把同一个设备状态并排放在原始输入与内部表征这两种视角下,会更容易看出差异。
| 观察方式 | 看到的值 | 更容易得出的判断 |
|---|---|---|
| 原始输入列 | 报警次数多、平均振动偏高、温度上升大、恢复延迟长 | 各个信号混在一起,很难立刻收束成一个稳定解释 |
| 隐藏层内部表征 | 正常运行维持轴仍存在、故障前兆风险轴较高 | 更容易直接读成虽然输出还在,但该样本的检查优先级已经很高 |
如果只是分别读四个数字,就可能只盯着报警次数,觉得暂时还能撑,或者分不清究竟是哪一种组合在制造问题。可一旦换到隐藏层表征视角,首先看的就不再是四个数字本身,而是多个信号合成后的中间状态:例如,由振动、温升与恢复延迟共同形成的风险轴,到底离最终判断有多近。所以这个案例要确认的结果,是:比起只分别看原始列值,多信号组合形成的内部表征,是否更能把设备状态切开。
把这两个案例压成一句话,就是:
隐藏层不会直接判断原始输入,而是先把它重新写成更容易分开的内部表征。
在设备面板案例里,只说“像素相似所以容易混淆”是不够的。更关键的是看:指针位置、警示灯、阀门方向等线索在中间表征里是怎样被重组的,为什么它们会把“正常监视”和“立即停机评估”分开。在表格型数据案例里,也不再是分别去盯报警次数、振动、温升、恢复延迟,而是先去看更贴近问题的内部状态,例如稳定性轴与风险轴。读者最先要抓住的,不是多算了几层,而是在最终判断之前,模型先重新构造了自己要看的内部轴。
把这两个案例再一次压缩成一张共同流程图,就是下面这样。
flowchart TD
A[原始输入信号] --> B[指针、警示灯、阀门线索仍然混在一起]
B --> C[形成隐藏轴]
C --> D[压力、警告、协调轴变得更清楚]
D --> E[最终判断读取新的表征]
F[原始表格信号] --> G[报警、振动、热量、延迟仍然分散]
G --> H[隐藏状态被重新整理]
H --> I[稳定性与风险轴变得更清楚]
I --> J[最终判断读取新的表征]
这张图并不是要把案例 1 的视觉线索和案例 2 的表格信号再各自重复一遍,而是为了把它们共同展示的那条流程重新捆起来:原始输入 -> 重新写成内部轴 -> 最终判断更容易阅读。
练习与例题¶
这次练习的目标,是比较看上去彼此接近的设备面板画面,在经过隐藏层之后,到底会被重新写成什么样的内部表征,以及这种差异会怎样连接到最终分数与后续判断上。
输入:
- 四个帧样本,分别包含指针偏差、警示灯闪烁强度、阀门偏移程度
输出:
- 每个样本对应的隐藏表征
- 每个样本对应的最终分数
- 即使最终分数看上去接近,内部表征是否也可能完全不同
问题场景:
- 设备摄像头拍到的多帧画面,表面上都可能只是
有一点异常,但其中有的更偏向指针异常,有的更偏向警示灯与阀门组合异常。我们需要看清:通过 ReLU 的隐藏层,究竟怎样把这些差异重新写成内部表征。
要确认的概念:
- 隐藏层表征不是简单求和,而是在线性组合后再经过激活函数形成的
- 最终分数会取决于中间表征最终保留了哪些值
- 即使两个样本的最终分数接近,主导它们的隐藏轴也可能完全不同
输入(input):
使用上面整理的四个帧,以及会经过 ReLU 的隐藏层与输出层权重。
在看代码前,最好先猜一猜:每个帧会先在哪条隐藏轴上反应更强;以及为什么最终分数即便接近,内部状态也仍可能不同。
| 帧 | 先猜什么反应 | 直觉原因 |
|---|---|---|
needle_dominant_frame | pressure_axis 更大 | 指针偏差明显,而警示灯闪烁较弱,压力轴更可能先亮起 |
beacon_valve_frame | warning_axis、coordination_axis 更大 | 警示灯与阀门组合强,警告与协调轴更可能主导 |
combined_stop_frame | 三条轴都会更大 | 指针、警示灯、阀门都强,多个内部轴可能一起被点亮 |
borderline_watch_frame | 三条轴都只有中等强度 | 每种信号都不极端,因此很难一眼断定是谁主导 |
这张预判表的目的,并不是让你提前猜中所有数字,而是先固定两件事:看起来相近的异常画面,在隐藏层里可能会被写成完全不同的轴,以及最终分数接近,也不意味着内部表征一定相同。
在输出里,先看的不是最终答案,而是同一个帧到底是怎样被重新写进三条隐藏轴的,以及在此基础上分数又是怎样被算出来的。
数字输出会告诉你结果,但如果想更清楚地看到:原始输入是怎样被重新改写成中间值、经过 ReLU 后又留下了什么,再最终形成分数,那么最好把过程拆成分阶段图来读。

第一张图展示的是模型真正收到的原始输入(raw input)。在这一步里,只能看到指针偏差、警示灯闪烁与阀门偏移三种输入值,并不能直接从这里就闭合最终判断。

第二张图展示的是隐藏层三个轴在乘上权重并加上偏置之后、还没有经过激活函数前的值。此时你还能看到一些小于 0 的数,它们表示这些轴还没有真正被激活。比如 needle_dominant_frame,虽然压力轴仍是正的,但警告轴和组合轴已经落到 0 以下,说明它们将在下一步里被切掉。

第三张图展示的是 ReLU 之后真正留下来的隐藏表征(hidden representation)。所有小于 0 的值都会被裁成 0,只有正的轴会继续送到下一层。这一步会让你更直接看见:beacon_valve_frame 主要是警告轴与组合轴在共同发亮,而 combined_stop_frame 则是三条轴都同时被强烈点亮。

最后一张图展示的是:在 ReLU 之后得到的隐藏表征,再经过输出层权重后形成的最终分数。这里最重要的点不是“输入直接变成了分数”,而是:输入先被改写成隐藏表征,再由这个隐藏表征去形成最终分数。
这个例子里最关键的是下面几点。
- 同一帧输入不会被直接照搬,而是会先被隐藏层重新写成新的表征。
- 输入组合一旦不同,
hidden三条轴的反应方式也会不同。 - 最终分数不是建立在原始输入上,而是建立在这些中间表征之上。
如果再按哪条轴在主导重新看结果,差异会更明显。
| 帧 | hidden 模式 | score | 现在应当先抓住的点 |
|---|---|---|---|
needle_dominant_frame | (0.64, 0.0, 0.0) | 0.184 | 只有指针相关压力轴亮起,因此还不足以直接闭合为立即停机 |
beacon_valve_frame | (0.35, 0.93, 0.67) | 0.944 | 警示灯与阀门组合轴主导,已经更像一种强干预信号 |
combined_stop_frame | (0.98, 1.15, 1.05) | 1.698 | 三条轴都强烈亮起,形成接近立即停机评估的内部表征 |
borderline_watch_frame | (0.46, 0.47, 0.33) | 0.542 | 三条轴都只微弱亮起,因此更像边界监视而非强制停机 |
特别是 needle_dominant_frame 与 borderline_watch_frame 都不算典型强停机场景,但它们的内部表征很不一样。前者几乎只亮起压力轴,后者则是三条轴都微弱重叠。即便都只是看起来有点异常,到底是哪一条隐藏轴先被点亮,仍然会影响后续判断。这正是“隐藏层会重新改写输入”在实际计算里的感觉。
换句话说,隐藏层是把输入变成更有用内部表征的阶段。
当你读完整个输出后,最好再立刻把问题重新连回:这个样本到底该按原始输入列来读,还是该按隐藏轴重新来读?
needle_dominant_frame 与 borderline_watch_frame 看起来都不是立刻停机的极端场景,但一个主要是压力轴在主导,一个则是多条轴在轻微叠加。beacon_valve_frame 与 combined_stop_frame 虽然都倾向干预,但前者主要是警示灯-阀门组合在推动,后者则是三条轴一起强烈亮起。只要看到 hidden 三条轴并不是原始三项输入的简单复制,就更容易理解:模型其实是把输入重新写进了一个更有用的内部坐标系里。representation learning 的核心不是抛弃输入,而是把输入重新写成更容易切开的内部坐标系。
跑完代码后,最好继续自己改几个值,看看究竟是哪类画面会更快推高哪一条内部轴。
| 下一步可以亲自改的值 | 先看哪个输出 | 要问的解读问题 |
|---|---|---|
把 borderline_watch_frame 的 beacon_blink 从 0.6 提高到 0.9 | warning_axis 与 coordination_axis 会增长多快 | 当警示灯线索增强时,哪条内部轴会先取得主导? |
把 needle_dominant_frame 的 valve_offset 从 0.1 提高到 0.6 | 原本以 pressure_axis 为主的画面会不会转成多轴叠加 | 一个主要由单一输入轴主导的样本,会在什么位置开始转成组合表征? |
把最终 score 计算里的偏置 -0.2 改成 0.0 | 在 hidden 模式不变时,需要干预的帧会增加多少 | 如果只改变最终判断标准,而不改变隐藏表征,运行解释会怎样变? |
为什么会出现 representation learning 这个说法¶
Yoshua Bengio 的论文,以及 LeCun、Bengio、Hinton 在 2015 年的文章,都把深度学习描述为:它不只是一个参数很多的大网络,而是一个能够学习多个层级(level)表征(representation)的结构。
可以把它整理成下面这句话。
深度学习真正强的地方,不只是参数多,而是它能在多个层级里学习出利于问题求解的中间表征。
因此,如果想理解深度学习,单看深度(depth)本身并不够,更重要的是看:深度到底让哪种表征变换成为可能。
什么时候在这里结束表征解释,并把问题交给下一章¶
这一节关于隐藏层与表征的责任,是先把这样一件事闭合:为什么中间计算必须被读成表征变换,而不只是普通计算。 接下来,问题就必须自然地转向:究竟是什么让这种表征变换成立? 也就是非线性(nonlinearity)与激活函数。
| 先出现的信号 | 这里应该闭合的解释 | 立刻接到哪里 |
|---|---|---|
| 比起原始输入,隐藏表征更像一组可分离的轴 | 这表示内部坐标系被改写成更容易解决问题的形式 | 接到 P5-3 章的激活函数与非线性 |
| 很想给每个节点立刻贴上人类名称 | 因为它可能是分散表征,所以不能过早过度解释 | 之后会连到可解释性、attention、embedding 等例子 |
| “模型自己形成特征”这句话仍然很抽象 | 这里只需要先固定:模型在代替人形成中间表征 | 之后会接到 P5-10 的 representation learning 扩展 |
| 又重新问“那为什么还需要激活函数?” | 这正说明:只讲表征还不够,非线性的角色还没闭合 | 直接接到 P5-3.1 到 P5-3.5 |
检查清单¶
- 能否解释隐藏层不是普通中间计算,而是形成内部表征的层?
- 能否说明表征(representation)与表征学习(representation learning)之间的连接?
- 能否把隐藏层(hidden layer)解释成
输入与输出之间的表征变换层? - 能否把 representation 理解成“同一个对象在模型内部被重新记录的方式”?
- 能否说明随着层数加深,模型可以形成更利于问题解决的内部表征?
- 能否解释为什么如果把内部表征太快地固定成人类标签,反而容易产生误解?
- 当自己开始把隐藏层只当作中间计算格子时,能否先想起“它是在重新改写表征”这个角度?
- 是否已经理解:在 representation learning 之后,下一步自然就要接到激活函数与非线性?
出处与参考资料¶
- Yoshua Bengio, Aaron Courville, Pascal Vincent,
Representation Learning: A Review and New Perspectives, IEEE Transactions on Pattern Analysis and Machine Intelligence, 2013, 确认日期: 2026-07-19. https://arxiv.org/abs/1206.5538 - Ian Goodfellow, Yoshua Bengio, Aaron Courville,
Deep Learning, MIT Press, 2016, 确认日期:2026-06-28. https://www.deeplearningbook.org/ - Yann LeCun, Yoshua Bengio, Geoffrey Hinton,
Deep learning, Nature, 2015, 确认日期:2026-06-28. https://www.nature.com/articles/nature14539