Candlest 的博客

Back

你背负的今天已经无可挽救了吗-小杏LaylaBlur image

前期准备:作业环境#

cd /Volumes/lexar1t/learn/cs231n/assignment1
uv venv --python 3.9
source .venv/bin/activate
uv pip install numpy matplotlib future jupyterlab jupyterlab-lsp python-lsp-server
cd cs231n/datasets && ./get_datasets.sh && cd ../..
bash

Lec1 Intro#

训练动力学#

高容量算法需要靠海量数据驱动,模型才能学会泛化。这些泛化规则和过拟合背后,有着深层的数学原理。

L=1NiLidata loss(拟合数据)+λR(W)正则(压制容量,防过拟合)L = \underbrace{\frac{1}{N}\sum_i L_i}_{\text{data loss(拟合数据)}} + \underbrace{\lambda R(W)}_{\text{正则(压制容量,防过拟合)}}

CV 的最简单任务:图像分类#

2011 至今,ImageNet 见证了深度学习的再度繁荣。

imagenet

CV 的进阶任务:图像理解#

包括图像分割,目标检测……

CV 的未来:和生成式结合#

视觉不是全部。

Lec2 DL Basics#

计算机视觉的挑战#

以 RGB 图像为例:

平移旋转(位置及其关系)

RGB 变化(取决于表面材质、颜色和光源)

背景(高频和低频信息)

尺度变化(缩放)

图像尺寸(被归一化了,没那么重要)

遮挡

形变

类内差异

上下文

数据驱动的算法构建#

以图像识别为例

  1. 收集 (images, label) 对
  2. 用机器学习算法设计分类器,并使用数据训练
  3. 用保留数据测试分类器效果

最简单的两类分类器#

Nearest Neighbor Classifier#

算法设计#

distance_metric

曼哈顿距离(L1)和欧氏距离(L2):旋转敏感和旋转不敏感。(泛函)

距离

L1 距离对于旋转是不规则的,如果我们的特征是具体的,尺度不同的,推荐使用。

L2 距离是一个圆,如果我们的特征尺度相似,并不具体,可以使用。

超参数#

最近的 K 个邻居投票决定这个点是什么类别。

K 是我们接触的第一个超参数。

调参#

如何调参,寻找更好的超参数?

如何调参

也就是说,将我们能够得到的数据划分为三段:训练集、验证集和测试集。

我们在测试集上训练,选定对于验证集效果最好的超参,然后拿去给测试集测试。

还能更合理吗?交叉验证

交叉验证

但是太吃算力了,在大规模深度学习中是高成本的。人们往往依靠直觉调参,使用单一验证集。

Linear Classification#

原理:

f(x,W)=Wx+bf(x,W) = Wx + b

Linear Classification

现代深度学习模型的构建原语。

Linear_Classification2

局限性(单层)

局限性

损失函数 Loss#

L=1NiLi(f(xi,W),yi)\mathcal{L} = \frac{1}{N} \sum_i L_i (f(x_i,W), y_i)

反映预测的偏差程度。

在机器学习中,找到参数 w 使得损失函数 L 最小的过程称为优化(optimization)

Softmax 分类器#

归一化,选最大。

给定输入就是这第 ii 张图 xix_i 的前提下,标签 YY 等于第 kk 类的概率

P(Y=kX=xi)=eskjesjP(Y=k|X=x_i) = \frac{e^{s_k}}{\sum_j e^{s_j}}

交叉熵#

KL->MLE

计算理想分布 P(y)=(ABC100)P(y) = \begin{pmatrix} A & B & C\\1 & 0 & 0 \end{pmatrix} 和实际分布:P(y)=(ABCxaxbxc)P(y) = \begin{pmatrix} A & B & C\\ x_a & x_b & x_c \end{pmatrix} 的 KL 散度:

KL(P,Q)=P(y)logP(y)Q(y)=logP(xa)\text{KL}(P,Q) = \sum P(y) \log{\frac{P(y)}{Q(y)}} = - log P(x_a)

代入 Y=kX=xiY=k|X=x_i 也就是说:

L=KL(P,Q)=logP(Y=kX=xi)\mathcal{L} = \text{KL}(P,Q) = - log P(Y=k|X=x_i)

我们也叫这个为交叉熵(当理想分布为 One-Hot 编码时)

Lec3 Regularization & Optimization#

正则化#

L=1NiLi拟合训练数据+λR(W)避免模型在训练集上做的太好L = \underbrace{\frac{1}{N}\sum_i L_i}_{\text{拟合训练数据}} + \underbrace{\lambda R(W)}_{\text{避免模型在训练集上做的太好}}

对于 λR(W)\lambda R(W)λ\lambda 是正则化强度, R(W)R(W) 是正则化项。

L2 正则化(也叫 weight decay):

R(W)=klWk,l2R(W) = \sum_k \sum_l W_{k,l}^2

会让近 0 值被更多保留。

L1 正则化:

R(W)=klWk,lR(W) = \sum_k \sum_l| W_{k,l} |

会让权重更少近 0 项,保留少数非零项。

组合 L1 L2:

R(W)=klβWk,l2+Wk,lR(W) = \sum_k \sum_l \beta W_{k,l}^2 + | W_{k,l} |

正则化是一个不断发展的前沿课题。很多东西都能扯到正则化。

优化#

Loss Landscape

可微且凸函数。

海森矩阵#

我们用牛顿法引入海森矩阵。

高中我们学过,求 f(x)=0f(x) = 0 可以用:

x=xf(x)f(x)x' = x - \frac{f(x)}{f'(x)}

逐步逼近。

模型效果最好 \lrArr L(W)L(W) 取极小值 \lrArr L(W)=0L'(W) = 0。于是我们又回到了牛顿迭代法:

W=WL(W)L(2)(W)W' = W - \frac{L'(W)}{L^{(2)}(W)}

把一共有 nn 个参数的权重拉直为 W1WnW_1 \dots W_n

原来的一阶导 L(W)L'(W) 变成梯度 L(W)\nabla L(W)

原来的二阶导 L(2)(W)L^{(2)}(W) 变成海森矩阵:

H=(2LW1W12LW1W22LW1Wn2LW2W12LW2W22LW2Wn2LWnW12LWnWn)H= \begin{pmatrix} \frac{\partial^2 L}{\partial W_1 \partial W_1} & \frac{\partial^2 L}{\partial W_1 \partial W_2} & \cdots & \frac{\partial^2 L}{\partial W_1 \partial W_n}\\[4pt] \frac{\partial^2 L}{\partial W_2 \partial W_1} & \frac{\partial^2 L}{\partial W_2 \partial W_2} & \cdots & \frac{\partial^2 L}{\partial W_2 \partial W_n}\\[2pt] \vdots & \vdots & \ddots & \vdots\\[2pt] \frac{\partial^2 L}{\partial W_n \partial W_1} & \cdots & \cdots & \frac{\partial^2 L}{\partial W_n \partial W_n} \end{pmatrix}

不计成本的优化:

W=WLH=H1LW' = W - \frac{\nabla \mathcal{L}}{H} = H^{-1} \nabla \mathcal{L}

这就是牛顿法。现实里面的方法是做各种近似,然后以距离牛顿法的效果有多远为评价标准。

梯度下降(Gradient Descent, GD):

L=L+λWL(W,x,y)L' = L + \lambda \nabla_W L(W,x,y)
  1. 数值解,浮点运算
  2. 解析解,DAG 图链式发展

梯度下降遇到的问题#

局部最优解#

local minima 不等于 gobal minima

鞍点#

鞍点

鞍点和平原是优化要面临的主要挑战。

鞍点海森矩阵非正定。

随机梯度下降(Stochastic DG, SDG)#

x,yx,y 取 minibatch:

L=L+λWL(W,x,y)L' = L + \lambda \nabla_W L(W,x',y')

Momentium#

优化器保存动量。

CS231N 学习笔记
https://blog.candlest.cc/blog/course/cs231n
Author Candlest
Published at 2026年7月15日