从机器学习基础到 MLP(上)
🔥星恒随风:个人主页
❄️个人专栏: 《指针合集》《c语言基础》《数据结构》《机器学习导论》《前端基础》
✨数据即知识,压缩即智能
这里我们先讲起:
机器学习到底在学什么?我们会从机器学习的发展背景讲起,再补充理解机器学习必须掌握的数学基础,包括向量、矩阵、函数、导数、梯度、概率和损失函数。
如果你之前学过 Python、NumPy 或 PyTorch,但还不太理解"模型为什么能训练",这篇文章就是为了打通这条主线。
当然如果各位对于这方面数学内容的功底较为薄弱的话,可以去看3b1b的科普视频,他讲课通过动画演示的十分生动形象为大家展示微积分和线性代数的本质
目录
- [从机器学习基础到 MLP(上)](#从机器学习基础到 MLP(上))
-
- 一、机器学习为什么会出现?
- 二、机器学习的发展简史
-
- [1. 早期人工智能:规则和推理](#1. 早期人工智能:规则和推理)
- [2. 统计学习:从数据中总结规律](#2. 统计学习:从数据中总结规律)
- [3. 深度学习:神经网络重新崛起](#3. 深度学习:神经网络重新崛起)
- 三、机器学习到底在学什么?
- 四、机器学习任务的基本分类
-
- [1. 监督学习](#1. 监督学习)
- [2. 分类任务](#2. 分类任务)
- [3. 回归任务](#3. 回归任务)
- [4. 无监督学习](#4. 无监督学习)
- [5. 强化学习](#5. 强化学习)
- 五、机器学习中的数据怎么表示?
- 六、训练集、验证集、测试集
-
- [1. 训练集](#1. 训练集)
- [2. 验证集](#2. 验证集)
- [3. 测试集](#3. 测试集)
- 七、数学基础一:标量、向量和矩阵
-
- [1. 标量 scalar](#1. 标量 scalar)
- [2. 向量 vector](#2. 向量 vector)
- [3. 矩阵 matrix](#3. 矩阵 matrix)
- 八、数学基础二:矩阵乘法和线性变换
-
- [1. 权重 w 的含义](#1. 权重 w 的含义)
- [2. 偏置 b 的含义](#2. 偏置 b 的含义)
- [3. 矩阵乘法的直观理解](#3. 矩阵乘法的直观理解)
- 九、数学基础三:函数
- 十、数学基础四:导数和梯度
-
- [1. 导数是什么?](#1. 导数是什么?)
- [2. 导数和模型训练有什么关系?](#2. 导数和模型训练有什么关系?)
- [3. 梯度是什么?](#3. 梯度是什么?)
- 十一、数学基础五:梯度下降
-
- [1. 为什么是减去梯度?](#1. 为什么是减去梯度?)
- [2. 学习率的作用](#2. 学习率的作用)
- 十二、数学基础六:概率和分类
-
- [1. Sigmoid:二分类概率](#1. Sigmoid:二分类概率)
- [2. Softmax:多分类概率](#2. Softmax:多分类概率)
- 十三、损失函数:模型错在哪里?
-
- [1. 回归任务:均方误差 MSE](#1. 回归任务:均方误差 MSE)
- [2. 分类任务:交叉熵 Cross Entropy](#2. 分类任务:交叉熵 Cross Entropy)
- 十四、线性回归:最简单的预测模型
-
- [NumPy 实现一个简单线性回归](#NumPy 实现一个简单线性回归)
- 十五、逻辑回归:从回归走向分类
- 十六、总结
一、机器学习为什么会出现?
在传统编程中,我们通常是这样解决问题的:
text
人写规则 + 输入数据 = 输出结果
比如判断一个数是不是偶数:
python
x = 10
if x % 2 == 0:
print("偶数")
else:
print("奇数")
这里的规则非常清楚:
能被 2 整除就是偶数
但是现实中很多问题并没有这么简单。
例如:
- 如何判断一张图片里有没有病虫害?
- 如何判断一张水稻叶片是否健康?
- 如何判断一封邮件是不是垃圾邮件?
这些问题很难用几条 if-else 写完整。
以图像识别为例,如果我们想让程序判断一张图片是不是水稻病害图片,人工写规则会非常困难:
- 叶片颜色发黄?
- 是否有斑点?
- 斑点大小是多少?
- 斑点边缘是否规则?
- 光照变化怎么办?
- 拍摄角度变化怎么办?
- 背景有杂草怎么办?
如果每一种情况都靠人写规则,程序会变得非常复杂,而且泛化能力很差。
所以机器学习的思路是:
text
不直接手写规则,而是让模型从数据中学习规律。
二、机器学习的发展简史
机器学习不是凭空出现的,它的发展大致可以理解为三条线索:
- 人工智能
- 统计学习
- 深度学习
1. 早期人工智能:规则和推理
早期人工智能更强调:
- 逻辑推理
- 专家系统
- 规则系统
例如:
如果发烧并且咳嗽,那么可能患有某种疾病。
如果棋局中某一步能吃子,那么优先考虑这一步。
这种方法的问题在于:
- 规则很难穷举
- 现实世界变化太多
- 很多知识难以形式化表达
也就是说,人很难把所有经验都写成程序规则。
2. 统计学习:从数据中总结规律
后来,研究者开始把注意力转向数据。
如果我们有大量样本:
- 输入数据 X
- 真实答案 y
那么能不能让模型自动找到它们之间的关系?
于是出现了很多经典机器学习方法:
1.线性回归
2.逻辑回归
3.朴素贝叶斯
4.KNN
5.决策树
6.随机森林
7.支持向量机
这些方法的核心问题是:
如何从有限数据中学到对新数据也有效的规律?
这里就涉及机器学习中非常关键的概念:
text
训练误差
测试误差
泛化能力
过拟合
欠拟合
正则化
3. 深度学习:神经网络重新崛起
神经网络的思想出现很早,但早期受限于:
text
数据量不足
计算能力不足
训练方法不成熟
所以没有马上成为主流。
后来随着:
text
大规模数据集
GPU 算力提升
反向传播算法成熟
深层网络结构改进
深度学习开始快速发展。
常见模型包括:
text
MLP
CNN
RNN
LSTM
Transformer
其中,MLP 是理解神经网络最基础的一站。
因为无论后面的 CNN、YOLO、Transformer 多复杂,都离不开这几个基本环节:
- 前向传播
- 损失函数
- 反向传播
- 参数更新
三、机器学习到底在学什么?
机器学习可以用一句话概括:
text
用数据训练一个函数,让它能够对新数据做出尽量正确的预测。
tips:当然这里写的比较笼统,更本质的原因是去构建了一个流形,这里不过多展开,各位要是感兴趣可以下来自己去研究
数学上可以写成:
text
ŷ = f(x)
其中:
text
x:输入数据
f:模型
ŷ:预测结果
训练模型的过程,就是让:
text
ŷ 尽量接近真实答案 y
也就是:
text
f(x) ≈ y
例如:
-
房价 = f(面积, 地段, 楼层)
-
病害类别 = f(水稻叶片图像)
-
是否及格 = f(学习时长, 作业完成率, 课堂表现)
所以机器学习的核心不是"机器产生意识",而是:
text
从数据中拟合出一个函数。
四、机器学习任务的基本分类
常见机器学习任务可以分为:
text
监督学习
无监督学习
强化学习
初学阶段最重要的是监督学习。
1. 监督学习
监督学习的特点是:
text
数据有答案
例如:
| 输入数据 | 标签 |
|---|---|
| 水稻叶片图片 | 健康 |
| 水稻叶片图片 | 病害 |
| 学习时长、作业完成率 | 是否及格 |
| 房屋面积、楼层、地段 | 房价 |
监督学习又可以分为:
text
分类
回归
2. 分类任务
分类任务的输出是类别。
例如:
text
健康 / 病害
猫 / 狗
垃圾邮件 / 正常邮件
及格 / 不及格
如果只有两个类别,叫:
text
二分类
如果有多个类别,叫:
text
多分类
3. 回归任务
回归任务的输出是连续数值。
例如:
text
预测房价
预测温度
预测销量
预测考试分数
预测作物产量
分类和回归的区别可以简单理解为:
text
分类:预测类别
回归:预测数值
4. 无监督学习
无监督学习的特点是:
text
数据没有明确标签
常见任务包括:
text
聚类
降维
异常检测
例如把用户自动分成不同群体,但是事先并不知道每个用户属于哪一类。
5. 强化学习
强化学习强调:
text
智能体通过与环境交互,根据奖励信号学习策略。
例如:
text
游戏 AI
机器人控制
自动驾驶决策
这篇文章重点讲监督学习,因为 MLP 最常见的入门场景就是监督学习。
五、机器学习中的数据怎么表示?
监督学习数据通常由两部分组成:
text
X:输入特征
y:标签
例如我们要预测学生是否及格。
| 学习时长 | 作业完成率 | 课堂表现 | 是否及格 |
|---|---|---|---|
| 8 | 0.95 | 90 | 是 |
| 3 | 0.40 | 50 | 否 |
| 6 | 0.80 | 75 | 是 |
| 2 | 0.30 | 40 | 否 |
这里:
text
X = 学习时长、作业完成率、课堂表现
y = 是否及格
在代码里可以写成:
python
X = [
[8, 0.95, 90],
[3, 0.40, 50],
[6, 0.80, 75],
[2, 0.30, 40],
]
y = [1, 0, 1, 0]
其中:
text
1 表示及格
0 表示不及格
六、训练集、验证集、测试集
机器学习不能把全部数据都拿来训练后就直接说模型有效。
通常要把数据划分为:
text
训练集
验证集
测试集
1. 训练集
训练集用于:
text
让模型学习参数
例如线性模型中的:
text
w1, w2, w3, b
神经网络中的:
text
weight, bias
都是通过训练集学习出来的。
2. 验证集
验证集用于:
text
调超参数
选择模型结构
例如:
text
学习率设置多少?
隐藏层有多少个神经元?
训练多少轮?
是否使用正则化?
这些参数不是模型自己直接学出来的,而是人为设置或调整的,叫:
text
超参数
3. 测试集
测试集用于:
text
最终评估模型在未知数据上的效果
测试集不能参与训练,也不应该反复用来调参。
否则模型可能会间接记住测试集,导致测试结果不真实。
七、数学基础一:标量、向量和矩阵
机器学习中经常会看到:
x
W
b
X
y
这些符号背后就是标量、向量和矩阵。
1. 标量 scalar
标量就是一个数字。
例如:
text
3
0.01
-2
5.6
2. 向量 vector
向量实际上可以看成把数字穿成串连在一起。
例如一个学生样本有 3 个特征:
text
学习时长 = 8
作业完成率 = 0.95
课堂表现 = 90
可以写成:
text
x = [8, 0.95, 90]
在机器学习中,一个样本经常被表示为一个向量。
当然向量不仅是一串数字,也可以理解为空间中的一个点或一根箭头。
例如二维向量:
text
[3, 2]
可以理解为平面上从原点指向 (3, 2) 的箭头。
3. 矩阵 matrix
矩阵可以理解为二维数字表。
多个样本,每个样本多个特征,就组成矩阵。
例如:
text
X = [
[8, 0.95, 90],
[3, 0.40, 50],
[6, 0.80, 75],
[2, 0.30, 40]
]
这里有:
text
4 个样本
每个样本 3 个特征
所以矩阵形状是:
text
4 × 3
在代码中也可以用 NumPy 表示:
python
import numpy as np
X = np.array([
[8, 0.95, 90],
[3, 0.40, 50],
[6, 0.80, 75],
[2, 0.30, 40]
])
print(X.shape)
输出:
text
(4, 3)
八、数学基础二:矩阵乘法和线性变换
机器学习里经常看到:
text
z = Wx + b
这就是线性模型和神经网络的基础。
假设:
text
x = [x1, x2, x3]
w = [w1, w2, w3]
那么:
text
z = w1x1 + w2x2 + w3x3 + b
这就是加权求和。
1. 权重 w 的含义
权重表示不同特征的重要程度。
例如预测考试成绩:
text
学习时长
作业完成率
课堂表现
模型可能学到:
text
学习时长权重大
作业完成率权重中等
课堂表现权重较小
这说明模型认为不同特征对结果的影响不同。
2. 偏置 b 的含义
偏置可以理解为基础值。
例如:
text
分数 = w × 学习时长 + b
即使学习时长为 0,模型也可能给出一个基础分数,这个基础分数就由 b 控制。
3. 矩阵乘法的直观理解
从视觉化角度看,矩阵可以理解为一种空间变换。
例如一个二维点:
text
x = [1, 2]
乘以某个矩阵后,可能发生:
text
旋转
拉伸
压缩
翻转
投影
在神经网络中,每一层的线性部分:
text
Wx + b
可以理解为:
text
先对输入空间做一次变换,再平移。
所以 nn.Linear 本质上就是:
text
学习一种空间变换。
九、数学基础三:函数
函数可以理解为:
text
输入一个 x,输出一个 y。
写成:
text
y = f(x)
在机器学习中,模型就是函数。
例如:
text
ŷ = f(x)
其中:
text
x 是输入
ŷ 是预测
f 是模型
训练模型的本质就是:
text
找到一个合适的 f,让 f(x) 尽量接近真实 y。
十、数学基础四:导数和梯度
机器学习训练时,我们会不断调整参数。
问题是:
text
参数应该往哪个方向调?
这就需要导数和梯度。
1. 导数是什么?
导数描述函数变化的速度。
例如:
text
y = x²
它的导数是:
text
y' = 2x
这表示:
text
当 x = 1 时,函数变化速度是 2
当 x = 10 时,函数变化速度是 20
导数告诉我们:
text
函数在某一点附近变化得快不快。
2. 导数和模型训练有什么关系?
假设模型只有一个参数 w,损失函数是:
text
Loss(w)
我们想知道:
text
w 变大一点,loss 会变大还是变小?
如果:
text
dLoss / dw > 0
说明 w 增大时,loss 也增大。
那就应该让 w 变小。
如果:
text
dLoss / dw < 0
说明 w 增大时,loss 变小。
那就可以让 w 变大。
3. 梯度是什么?
如果模型有很多参数:
text
w1, w2, w3, b
那么我们需要知道损失函数对每个参数的导数:
text
dLoss/dw1
dLoss/dw2
dLoss/dw3
dLoss/db
这些导数组合起来,就是梯度。
写成:
text
∇Loss = [dLoss/dw1, dLoss/dw2, dLoss/dw3, dLoss/db]
梯度告诉我们:
text
每个参数应该如何调整,才能让损失下降。
十一、数学基础五:梯度下降
梯度下降的核心公式是:
text
参数 = 参数 - 学习率 × 梯度
也可以写成:
text
w = w - lr × dw
其中:
text
w:参数
lr:学习率
dw:损失函数对 w 的梯度
1. 为什么是减去梯度?
因为梯度方向是函数上升最快的方向。
但训练模型的目标是让损失函数变小。
所以要沿着梯度反方向走:
text
减去梯度
可以把损失函数想象成一座山:
text
当前位置:当前参数
高度:当前损失
目标:往低处走
梯度告诉我们哪里最陡,我们要朝相反方向下坡。
2. 学习率的作用
学习率决定每一步走多远。
如果学习率太大:
text
可能一步迈过最低点
导致损失震荡甚至发散
如果学习率太小:
text
训练速度很慢
很久到不了较好的位置
所以学习率是非常重要的超参数。
十二、数学基础六:概率和分类
分类任务中,模型经常输出概率。
例如水稻叶片三分类:
text
健康:0.80
病害:0.15
杂草:0.05
这些概率需要满足:
text
每个概率在 0 到 1 之间
所有类别概率之和等于 1
1. Sigmoid:二分类概率
二分类常用 sigmoid 函数:
text
sigmoid(z) = 1 / (1 + e^(-z))
它可以把任意实数压缩到 0 到 1 之间。
例如:
text
z 很大,sigmoid(z) 接近 1
z 很小,sigmoid(z) 接近 0
z = 0,sigmoid(z) = 0.5
所以它适合表示二分类概率。
2. Softmax:多分类概率
多分类常用 softmax。
假设模型输出三个类别分数:
text
logits = [2.0, 1.0, 0.1]
softmax 会把它转换成概率:
text
probabilities = [0.66, 0.24, 0.10]
概率最大的类别就是预测类别。
注意:
text
logits 不是概率
softmax 之后才是概率
十三、损失函数:模型错在哪里?
模型预测一开始通常不准。
我们需要一个指标衡量:
text
预测值和真实值差多少
这个指标就是损失函数。
1. 回归任务:均方误差 MSE
假设真实值是:
text
y
预测值是:
text
ŷ
均方误差为:
text
MSE = 1/n × Σ(ŷ - y)²
含义是:
text
预测值和真实值差得越多,损失越大。
Python 中可以写成:
python
loss = ((y_pred - y_true) ** 2).mean()
2. 分类任务:交叉熵 Cross Entropy
分类任务更关心:
text
真实类别的预测概率够不够高。
例如真实类别是"病害":
text
模型 A 给病害的概率:0.90
模型 B 给病害的概率:0.10
显然模型 B 错得更严重。
交叉熵就是用来衡量这种概率预测错误程度的损失函数。
十四、线性回归:最简单的预测模型
线性回归用于回归任务。
单特征线性回归:
text
ŷ = wx + b
多特征线性回归:
text
ŷ = w1x1 + w2x2 + w3x3 + ... + b
例如根据学习时长预测考试分数:
text
分数 = w × 学习时长 + b
如果 w 是正数,说明学习时长越长,预测分数越高。
NumPy 实现一个简单线性回归
python
import numpy as np
X = np.array([1, 2, 3, 4, 5], dtype=np.float32)
y = np.array([40, 50, 60, 70, 80], dtype=np.float32)
w = 0.0
b = 0.0
lr = 0.01
epochs = 1000
for epoch in range(epochs):
# 前向传播
y_pred = w * X + b
# 计算损失
loss = np.mean((y_pred - y) ** 2)
# 手动计算梯度
dw = np.mean(2 * (y_pred - y) * X)
db = np.mean(2 * (y_pred - y))
# 更新参数
w -= lr * dw
b -= lr * db
print("w =", w)
print("b =", b)
print("预测学习 6 小时的分数:", w * 6 + b)
这段代码已经包含机器学习训练的基本结构:
text
预测
计算损失
计算梯度
更新参数
十五、逻辑回归:从回归走向分类
逻辑回归虽然名字里有"回归",但它常用于分类。
二分类中,逻辑回归先计算:
text
z = w1x1 + w2x2 + ... + b
然后经过 sigmoid:
text
p = sigmoid(z)
得到一个 0 到 1 之间的概率。
当:
text
p >= 0.5
预测为正类。
当:
text
p < 0.5
预测为负类。
逻辑回归可以看作:
text
线性模型 + 非线性函数
这个思想非常关键,因为神经网络也是:
text
线性变换 + 非线性激活函数
十六、总结
这一篇主要解决的是机器学习入门最重要的基础问题:
机器学习是什么?
数据如何表示?
模型为什么可以看成函数?
机器学习训练流程可以概括为:
text
输入数据
↓
模型预测
↓
计算损失
↓
计算梯度
↓
更新参数
↓
重复训练