上一篇理清了 AI → 机器学习 → 深度学习的关系。这篇我们拆到最小单元:深度学习里一个神经元到底在算什么,以及把这些神经元拼起来以后发生了什么。
从一道算术题开始
一个神经元做的事情,写成代码:
y=w1*x1+w2*x2+w3*x3+bx1、x2、x3 是输入。比如你要预测房价:
- x1 = 面积(平方米)
- x2 = 楼层
- x3 = 距离地铁站(米)
w1、w2、w3 是权重,表示每个因素有多重要。面积可能比楼层重要,那 w1 大一些。
b 是偏置,可以理解成"起步价"——面积为零的时候也有个基础价格。
这个式子就在做一件事:加权求和。跟你高考算总分没两样——语文 150 分、数学 150 分、英语 150 分、物理 100 分,权重不一样。工作以后的绩效打分也是同理:产出占 60%、协作占 20%、考勤占 20%。加权完了加个基础分,得一个最终分。
这就叫线性回归,是机器学习里最简单的模型。也是神经网络的起点。
手算一遍
搞几个虚构的数据,感受一下过程。
假设房价跟面积和距地铁站距离有关(忽略楼层了,两个输入好算):
房价的公式是 y = 0.8 × 面积 + (-0.3) × 距地铁距离 + 50。
如果你有一套 100 平、距地铁 200 米的房子:
y = 0.8 × 100 + (-0.3) × 200 + 50 = 80 + (-60) + 50 = 70模型预测 70 万。
实际成交价是 85 万,差了 15 万。模型不准,因为权重 (0.8, -0.3) 和偏置 (50) 是瞎猜的。下一篇我们会讲怎么"调"这些参数让预测越来越准。现在先记住:神经网络的所有参数(w 和 b)都是数字,训练就是在不断调整这些数字。
光加权求和不够
叠多少层加权求和都不够。因为 wx+b 这种线性变换叠一万层,展开还是个线性变换。
w2(w1·x + b1) + b2 = (w2·w1)·x + (w2·b1 + b2) = 新w·x + 新b还是一次的。现实世界的问题没有几个是线性的。人脸识别不是一条直线能分出来的,语音识别也不是。
所以每个神经元在加权求和之后,还要多做一步:激活函数。
y=activation(w1*x1+w2*x2+...+b)这个 activation 函数必须是非线性的。不是直线,才能把多个神经元的输出"弯曲",组合出复杂的决策边界。
三个常用的激活函数
Sigmoid
把任意实数压缩到 0~1 之间。输入越大越接近 1,越小越接近 0。
形状像拉长的 S。最早很流行,现在输出层做二分类还在用——因为输出正好可以解释成"概率"。
最大的毛病:输入过大或过小的时候,梯度趋近于 0(曲线两端接近平了)。反向传播是链式法则,中间有一个接近 0 的梯度,前面的层就几乎收不到更新信号了。这叫梯度消失,直接导致深网络训不动。这也是为什么 sigmoid 现在不怎么出现在隐藏层了。
Tanh
把输入压缩到 -1~1 之间。形状跟 sigmoid 类似也是 S 形,不过是"零中心"的——对称。
比 sigmoid 好一点,但同样有梯度消失问题。实际使用中也不如 ReLU 常见。
ReLU
defrelu(x):returnmax(0,x)没了。负数直接变 0,正数原样输出。
ReLU 看着简单到让人怀疑"这玩意能有用?" 答案是太有用了。
优点:
- 梯度不会消失(x>0 的时候导数是 1,不变小)
- 计算极快(就是一个 if 判断)
缺点:
- x<0 的神经元永远沉默,再也不会被激活(叫"神经元死亡",学习率太大容易触发这个)
带点攻(LeakyReLU、ELU)就是为了解决死亡问题的,思路是负数侧给一个很小的斜率而不是直接 0。
现阶段记住 ReLU 就行。你要搭一个全连接网络,隐藏层无脑用 ReLU,90% 的场景是对的。输出层看情况——分类用 Softmax,回归直接用线性输出(不加激活)。
拼起来:前向传播
单个神经元能力有限,叠起来就不一样了。
输入层 ──→ 隐藏层 1 ──→ 隐藏层 2 ──→ 输出层 3 个输入 4 个神经元 3 个神经元 1 个输出每一层的每个神经元,都接收上一层的全部输出,经过加权求和 + ReLU,传给下一层。这种叫全连接层(Fully Connected Layer),是最基础的结构。
我们走一遍前向传播的完整流程。假设:
- 输入层 3 个数:[2, -1, 3]
- 隐藏层 2 个神经元(为了简洁),权重和偏置已经"学好了"
- 输出层 1 个神经元
隐藏层神经元 A 的计算:
z_A = w1_A × 2 + w2_A × (-1) + w3_A × 3 + b_A = 0.5 × 2 + (-0.3) × (-1) + 0.8 × 3 + 0.1 = 1.0 + 0.3 + 2.4 + 0.1 = 3.8 输出_A = relu(3.8) = 3.8 (正数,保持不变)隐藏层神经元 B 的计算:
z_B = 0.1 × 2 + 0.7 × (-1) + (-0.4) × 3 + (-0.2) = 0.2 + (-0.7) + (-1.2) + (-0.2) = -1.9 输出_B = relu(-1.9) = 0 (负数,直接变 0)输出层:
z_out = 1.2 × 3.8 + (-0.6) × 0 + 0.3 = 4.56 + 0 + 0.3 = 4.86 输出_out = 4.86这就是一次完整的前向传播。从原始输入 [2, -1, 3],经过两层网络,算出最终结果 4.86。一个 GPT-4 做推理的时候,就是在做这件事——只不过规模是上千亿次这样的运算。
每一层在学什么
2015 年有研究者把训练好的深度卷积网络每一层的权重可视化出来,发现了一个非常符合直觉的层级结构:
- 第 1 层学的全是边缘:横线、竖线、左斜线、右斜线、拐角
- 第 2 层把边缘拼成纹理和简单形状:圆圈、条纹、方格
- 第 3 层拼出部件:眼睛的轮廓、鼻子的大概形状、耳朵的弧线
- 更深层组合出完整的语义模式:一张脸的正面 vs 侧面、一只猫 vs 一只狗
没人告诉网络"你先找边缘再找眼睛",它自己是这么学的。前端层学到的是通用的低层特征,越往后越跟具体任务相关。这也是为什么你拿一个在 ImageNet 上训练好的网络,把最后几层扔掉,接上自己的分类器,少量数据就能在自己的任务上取得不错的效果——这项操作叫迁移学习,工业界极其常用。
为什么深度比宽度重要
刚学的时候我想:一层搞宽点不就行了?10000 个像素直接怼 10000 个神经元,凭啥不行。
问题在于——表达能力的天差地别。
一层很宽的全连接层,本质上只做了一次非线性变换。它能学会的是"一个复杂的单步函数"。
多层网络每层都在前一层的基础上做抽象。第一层学到边缘,第二层把边缘拼成形状,第三层把形状拼成物体。这种逐层抽象的能力,单层再宽也给不了。
而且还有数学上的支撑。有些函数,用深层网络只需要 20 个神经元就能表达,但用浅层网络可能需要指数级(2 的 n 次方)的神经元才能近似。这跟数字电路的原理挺像——多层逻辑门能高效表达复杂函数,单层逻辑阵列表会迅速膨胀。
"深度学习"里"深度"这两个字,讲的就是这个。
但有个问题
上面所有计算,都假设权重 w 和偏置 b 已经"学好了"。但实际刚开始训练的时候,w 和 b 全是随机初始化的,网络输出基本是瞎蒙。
怎么从"瞎蒙"变成"能分辨猫和狗"?关键就在下一篇要讲的两件事:损失函数和梯度下降。