从机器学习基础到 MLP(上)

从机器学习基础到 MLP(上)

🔥星恒随风:个人主页

❄️个人专栏: 《指针合集》《c语言基础》《数据结构》《机器学习导论》《前端基础》
✨数据即知识,压缩即智能

这里我们先讲起:
机器学习到底在学什么?

我们会从机器学习的发展背景讲起,再补充理解机器学习必须掌握的数学基础,包括向量、矩阵、函数、导数、梯度、概率和损失函数。

如果你之前学过 Python、NumPy 或 PyTorch,但还不太理解"模型为什么能训练",这篇文章就是为了打通这条主线。

当然如果各位对于这方面数学内容的功底较为薄弱的话,可以去看3b1b的科普视频,他讲课通过动画演示的十分生动形象为大家展示微积分和线性代数的本质

目录


一、机器学习为什么会出现?

在传统编程中,我们通常是这样解决问题的:

text 复制代码
人写规则 + 输入数据 = 输出结果

比如判断一个数是不是偶数:

python 复制代码
x = 10

if x % 2 == 0:
    print("偶数")
else:
    print("奇数")

这里的规则非常清楚:

能被 2 整除就是偶数

但是现实中很多问题并没有这么简单。

例如:

  • 如何判断一张图片里有没有病虫害?
  • 如何判断一张水稻叶片是否健康?
  • 如何判断一封邮件是不是垃圾邮件?

这些问题很难用几条 if-else 写完整。

以图像识别为例,如果我们想让程序判断一张图片是不是水稻病害图片,人工写规则会非常困难:

  • 叶片颜色发黄?
  • 是否有斑点?
  • 斑点大小是多少?
  • 斑点边缘是否规则?
  • 光照变化怎么办?
  • 拍摄角度变化怎么办?
  • 背景有杂草怎么办?

如果每一种情况都靠人写规则,程序会变得非常复杂,而且泛化能力很差。

所以机器学习的思路是:

text 复制代码
不直接手写规则,而是让模型从数据中学习规律。

二、机器学习的发展简史

机器学习不是凭空出现的,它的发展大致可以理解为三条线索:

  1. 人工智能
  2. 统计学习
  3. 深度学习

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 多复杂,都离不开这几个基本环节:

  1. 前向传播
  2. 损失函数
  3. 反向传播
  4. 参数更新

三、机器学习到底在学什么?

机器学习可以用一句话概括:

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 复制代码
输入数据
↓
模型预测
↓
计算损失
↓
计算梯度
↓
更新参数
↓
重复训练
相关推荐
Front思11 小时前
AI前端面试锦集
前端·人工智能·面试
sheji10511 小时前
扫地机器人行业 企业篇-追觅科技
人工智能·机器人·智能硬件
smartpi_ai11 小时前
语音模块带负载时播报卡顿排查指南:从 7805 稳压器到电源设计
人工智能
流年如夢11 小时前
类和对象(下)
android·java·开发语言·面试·排序算法
炸薯条!11 小时前
栈和队列的简述
java·开发语言·数据结构
加成BUFF11 小时前
《机器人学》MATLAB 机器人工具箱 应用指南一
机器学习·matlab·机器人·机器人工具箱
万岳科技程序员小金11 小时前
AI数字人系统源码开发教程|真人数字人APP与小程序搭建全流程解
人工智能·语音识别·ai数字人小程序·ai数字人系统源码·ai数字人软件开发·ai数字人平台搭建
yeflx11 小时前
Union-Find算法在特征匹配轨迹构建中的应用
开发语言·python·算法
deardao11 小时前
【NeuriPS-25】检索增广生成的时序零概率预测
人工智能·机器学习·数据挖掘·transformer·时间序列