目录
🚀 下期预告:手撕深度前馈网络——用NumPy实现真正的“深度”学习
🌟 前言:为什么你要从数学开始学深度学习?
想象你要建造一座100层的摩天大楼,你会直接开始砌砖吗?当然不!你必须先打地基。深度学习就像这座摩天大楼,而线性代数、概率统计和微积分就是它的钢筋混凝土。别担心,今天我会用Python代码带你把数学变成看得见的魔法!
一、必须掌握的三大数学基石(附可视化代码)
1.1 线性代数:神经网络的骨架
🔥 核心概念:
-
张量(多维数组):神经网络的通用货币
-
矩阵乘法:神经信号传递的管道
-
特征分解:理解数据本质的钥匙
import numpy as np
import matplotlib.pyplot as plt
# 可视化矩阵变换
original = np.array([[0,0], [1,0], [1,1], [0,1]])
matrix = np.array([[1, 0.5], [-0.5, 1]]) # 剪切变换
transformed = np.dot(original, matrix.T)
plt.figure(figsize=(10,5))
plt.subplot(121)
plt.fill(original[:,0], original[:,1], alpha=0.5)
plt.title('原始形状')
plt.subplot(122)
plt.fill(transformed[:,0], transformed[:,1], alpha=0.5)
plt.title('矩阵变换后')
plt.show()
💡 运行结果:你会看到一个正方形被矩阵变换为平行四边形的过程
1.2 概率统计:让AI学会思考
🎲 关键知识点:
-
条件概率:P(下雨|乌云) vs P(乌云|下雨)
-
贝叶斯定理:反直觉的癌症检测案例
-
高斯分布:为什么它统治了机器学习?
from scipy.stats import norm
# 生成两种考试成绩分布
math_scores = norm(loc=75, scale=10).rvs(1000)
cs_scores = norm(loc=82, scale=8).rvs(1000)
plt.hist(math_scores, bins=30, alpha=0.5, label='数学成绩')
plt.hist(cs_scores, bins=30, alpha=0.5, label='CS成绩')
plt.legend()
plt.title('成绩分布对比')
plt.xlabel('分数')
plt.ylabel('人数')
plt.show()
1.3 微积分:优化算法的灵魂
📈 必会技能:
-
导数:成本函数的斜率探测器
-
梯度:多维空间的指南针
-
链式法则:反向传播的核心
# 梯度下降可视化
def f(x): return x**2 + 5*np.sin(x)
def df(x): return 2*x + 5*np.cos(x)
x = np.linspace(-10, 10, 100)
x_path = []
current_x = -8 # 初始点
for _ in range(50):
x_path.append(current_x)
current_x -= 0.1 * df(current_x) # 学习率0.1
plt.plot(x, f(x), label='函数曲线')
plt.scatter(x_path, f(np.array(x_path)), c='red')
plt.title('梯度下降过程')
plt.show()
二、机器学习基础:深度学习的垫脚石
2.1 机器学习三要素(代码实现)
from sklearn.linear_model import LinearRegression
import numpy as np
# 1. 数据准备
X = np.array([[1], [2], [3], [4]]) # 特征
y = np.array([2, 4, 6, 8]) # 标签
# 2. 模型选择
model = LinearRegression()
# 3. 损失函数与优化
model.fit(X, y)
# 预测新数据
print(f"预测结果:{model.predict([[5]])[0]:.2f}")
📌 关键解读:
-
模型:
y = w*x + b
的线性方程 -
损失函数:均方误差(MSE)
-
优化:最小二乘法(解析解)
2.2 梯度下降的三种形态
# 随机梯度下降示例
def sgd(X, y, lr=0.01, epochs=100):
w, b = 0.0, 0.0
n = len(X)
for _ in range(epochs):
for i in range(n):
# 随机选择一个样本
xi, yi = X[i], y[i]
# 计算梯度
dw = -2 * xi * (yi - (w*xi + b))
db = -2 * (yi - (w*xi + b))
# 更新参数
w -= lr * dw
b -= lr * db
return w, b
# 使用相同数据训练
w, b = sgd(X.flatten(), y)
print(f"SGD结果:y = {w:.2f}x + {b:.2f}")
三、通向深度学习之路:你的第一个神经网络
3.1 用NumPy实现神经元
class Neuron:
def __init__(self, input_size):
self.weights = np.random.randn(input_size)
self.bias = np.random.randn()
def forward(self, inputs):
return np.dot(inputs, self.weights) + self.bias
# 创建神经元(3个输入)
neuron = Neuron(3)
inputs = np.array([0.5, -1, 0.8])
print(f"神经元输出:{neuron.forward(inputs):.2f}")
3.2 神经网络训练流程解析
-
前向传播:数据流过网络
-
计算损失:预测值与真实值的差距
-
反向传播:沿着计算图传递梯度
-
参数更新:优化器调整权重