很多 AI 教程一上来就:
“这是神经网络,这是神经元,这是激活函数……”
然后画一张蜘蛛网一样的图。
看起来很高级。
实际上拆开以后,核心就是:
乘法 + 加法 + 一个函数
就这么朴素。
假设我们要根据服务器三个指标判断:
**这台服务器是否可能过载?**
输入:
CPU = 80 Memory = 70 GPU = 90
所以:
X = [80, 70, 90]
神经元给三个输入分别一个权重:
CPU 权重 = 0.2 Memory 权重 = 0.5 GPU 权重 = 0.3
于是:
W = [0.2, 0.5, 0.3]
计算:
80 × 0.2 + 70 × 0.5 + 90 × 0.3
分别算:
16 + 35 + 27
得到:
78
这实际上就是我们刚才学过的:
**向量点积**
也就是:
X · W
神经网络里面通常还有一个:
**偏置 Bias**
假设:
b = -70
于是:
z = X·W + b
也就是:
z = 78 - 70
得到:
z = 8
所以一个神经元最核心的计算就是:
z = XW + b
是不是很眼熟?
得到:
z = 8
然后呢?
神经元需要把这个结果进行一次处理。
于是出现:
Activation Function
激活函数。
可以暂时理解成:
**把神经元计算出来的数字,再通过一个函数处理一下。**
例如最简单的:
ReLU
定义:
ReLU(x) = max(0,x)
意思就是:
如果 x > 0
返回 x
如果 x < 0
返回 0
例如:
ReLU(8) = 8
而:
ReLU(-5) = 0
输入 ↓ 加权 ↓ 加 Bias ↓ Activation ↓ 输出
数学形式:
z = XW + b y = ReLU(z)
也就是:
X ↓ XW+b ↓ ReLU ↓ y
这就是一个最基本的神经元。
刚才我们只有一个输出:
过载概率/评分
但是假设我们希望同时预测:
① 是否 CPU 过载 ② 是否 GPU 过载
那么就需要两个神经元。
于是:
输入:
CPU
Memory
GPU
↓
Neuron 1
Neuron 2
↓
输出:
CPU Score
GPU Score
两个神经元分别有自己的权重。
例如:
W = [ 0.2 0.1 0.5 0.4 0.3 0.6 ]
注意这个矩阵:
3 × 2
为什么?
因为:
3 个输入 2 个神经元
输入:
X = [80,70,90]
计算:
X × W
就是:
[80,70,90] × [ 0.2 0.1 0.5 0.4 0.3 0.6 ]
第一列:
[0.2, 0.5, 0.3]
对应:
Neuron 1 的权重
所以:
[80,70,90] · [0.2,0.5,0.3]
就是:
80×0.2 + 70×0.5 + 90×0.3
得到:
78
第二列:
[0.1,0.4,0.6]
对应:
Neuron 2 的权重
所以:
[80,70,90] · [0.1,0.4,0.6]
计算:
80×0.1 + 70×0.4 + 90×0.6
得到:
8 + 28 + 54 = 90
所以:
XW = [78,90]
这就是两个神经元的输出。
我们之前学矩阵的时候:
(1×3) × (3×2) = (1×2)
现在:
输入: 1×3 权重: 3×2 输出: 1×2
这不是巧合。
它就是:
**一个最简单的全连接神经网络层。**
所以:
数学: X × W ↓ 神经网络: 输入 × 权重 ↓ 结果: 神经元输出
假设:
W = [ 0.2 0.1 0.5 0.4 0.3 0.6 ]
这些数字:
0.2 0.1 0.5 0.4 0.3 0.6
就是模型的:
**参数 Parameters**
或者:
**Weights**
模型训练的过程,本质上就是:
**不断调整这些数字。**
—
假设真实答案是:
CPU过载 = 1 GPU过载 = 0
但是模型输出:
[78,90]
显然不是我们想要的结果。
于是需要一个东西衡量:
**模型到底错得有多离谱?**
这就是:
Loss
损失函数。
例如:
真实值: 10 预测值: 8
误差:
如果:
真实值: 10 预测值: 2
误差:
所以:
**Loss 越大 → 模型越差**
text
Loss
↑
越大 = 越差
Loss
↓
越小 = 越好
训练模型就是想办法:
Loss 100 ↓ 80 ↓ 50 ↓ 20 ↓ 5 ↓ 1
不断降低。
我们之前讲过:
导数 = 变化率。
现在问题来了:
假设某个权重:
W = 0.3
如果稍微修改:
W = 0.31
Loss 是:
10
变成:
说明:
调整这个权重以后,Loss 下降了。
那么我们就希望:
**继续往这个方向调整。**
反过来,如果:
W = 0.3 → W = 0.31
结果:
Loss 10 → 15
说明:
这个方向走错了。
—
梯度下降。
你现在已经可以看懂最基本的神经网络训练:
输入
│
↓
┌───────────┐
│ Matrix │
│ × │
│ Weight │
└─────┬─────┘
↓
+ Bias
↓
Activation
↓
输出
↓
Loss
↓
Gradient
↓
修改 Weight
│
└───────────→ 再来一次
你会发现:
神经网络没有想象中那么神秘。
—
一个神经元只能做很简单的事情。
所以我们可以:
输入 ↓ Layer 1 ↓ Layer 2 ↓ Layer 3 ↓ 输出
例如:
3个输入 ↓ 10个神经元 ↓ 20个神经元 ↓ 5个神经元 ↓ 2个输出
于是就形成:
**Deep Neural Network**
深度神经网络。
“深度”主要就是:
**层比较多。**
—
每一层本质上都在做:
XW + b
再经过:
Activation
所以:
Layer 1 = XW1+b1 Layer 2 = XW2+b2 Layer 3 = XW3+b3
然后一层接一层。
所以神经网络其实就是:
**大量矩阵运算 + 非线性函数。**
这句话非常值得记住。
这是一个非常重要的问题。
如果没有 Activation:
X ↓ XW1+b1 ↓ XW2+b2 ↓ XW3+b3
虽然看起来有三层。
但是数学上最终仍然可以合并成:
XW+b
也就是说:
**没有非线性激活函数,堆再多层,本质上还是一个线性变换。**
而有了:
ReLU GELU SiLU
之后,网络才能表达非常复杂的关系。
例如:
y = 2x
这是线性的。
但:
y = max(0,x)
就是 ReLU。
它改变了函数的形状:
/
/
/
────●────────
负数全部变成 0。
这种非线性让神经网络能够学习复杂模式。
现在你已经有了一条路线:
向量 ↓ 矩阵 ↓ 矩阵乘法 ↓ 神经网络 ↓ Activation ↓ Loss ↓ Gradient
再往后:
神经网络 ↓ Attention ↓ Transformer ↓ LLM
而 Transformer 最核心的东西之一:
Q = XWq K = XWk V = XWv
你现在看到:
XW
应该已经不陌生了。
这就是为什么我不建议你直接上来学 Transformer。
**神经网络的一层,本质上就是“输入向量和权重矩阵进行矩阵乘法,再加 Bias,然后经过激活函数”。**
写成:
Y = Activation(XW + b)
这是非常重要的一条公式。
你以后看到很多神经网络代码,实际上都在围绕这个东西展开。