今天不想机器学习...?
人工智能经常被人批评为一种"务虚"的技术, 差点就没和隔壁的元宇宙一起成为"概念股"; 曾几何时, 我也对这种统计方法的应用感到无聊, 对机器学习的评价就是调参"炼丹", 又没有工程代码的优雅: AI 给出的都是 fuzzy 的结果, 一个概率分布...而我更喜欢用一个个 assert 证实正确性的程序, 一个复杂但又内在协调的程序系统.
但是, 正巧我入学没多久, LLM 等一众横空出世的 generative AI, 它们的表现实在是太靓眼了: Novel AI 的降维打击, 更别提后续 control net, LORA 等方法的优化; 而 GPT 则彻彻底底改变了我的学习习惯, 方方面面(如果能帮我高中写读后续写就好了).
时值 22 年末, 这些新颖的 AI 就像打开我心门的黑船, 让我重新思考无数可能世界线中的一条: 人工智能会变得越来越主流——融入到我们的世界当中, sooner or later...
继续在传统的 CS 赛道上奔跑: 你已经看到结果了. 学 AI, 不是说去抛弃那些浓缩人类工程师数十年技术的核心——说考古算是过头了——而是转去开拓新领域, 探索, 交融.
也许今天不想学机器学习...? Who knows what is next day gonna be.
机器学习基础
了解相关术语
模型评估指标: 分类任务会用哪些指标 metrics? 回归任务又常用哪些指标?
- 回归任务里: MSE, Rooted MSE, R-Squared
- Mean Squared Error (MSE): \(\frac{1}{n}\sum_{i=1}^n(y_i-\hat{y}_i)^2\)
- \(R^2=1-SSE/SST\), 1 - 残差平方和/总平方和, 越靠近 1 越好
- R 方是一种相对指标, 相当于是做了归一化处理的指标, 在不同任务下模型的说服力会更强
- 其实是描述回归里不可解释项 残差 \(\varepsilon\) 的两种不同方式
区分 Acc.
和 Prec.
- 模型判断正确(可能蒙对了) VS 模型判断正确的可信度
根据混淆矩阵来计算不同指标
不同指标在不同任务上的意义:
- 例如, 在癌症诊断问题上,
Acc
,Prec
,Recall
该选择哪一个作为最主要的指标?- 不希望漏诊, 因此最应该关注 Recall = 真患病/(误诊患病+真患病)
Prec.
在这里和Recall
互补, 也很重要.
- class-imbalanced 类别不平衡问题的处理(hw2)
- 采样方法/给代价函数设定敏感系数/引入集成学习(如 boosting)
P-R 曲线, 以及 ROC 曲线的意义?
- 选择一个平衡精确度和召回率的最佳阈值
- 是工程上的一个 trick
- ROC: 真正率 (TPR, aka Recall) VS 假正率 (FPR) 的 trade-off
Area Under Curve (AUC), 通常意义上指的是 ROC-AUC.
一种简单计算方式(hw1):
若随机抽取一个阳性样本和一个阴性样本, 分类器正确判断阳性样本的值高于阴性样本之概率 = \(AUC\).
根据这种解释, 我们有如下的简易计算方式:
- 假设真实正例 TP 有 \(n_1\) 个, 真实负例 TN 有 \(n_0\) 个
- 将测试样例按预测值从高到低 sort
- 设 \(r_i\) 为第 \(i\) 个真实负例的排序位置(秩)
- 计算 \(S_0 = \sum r_i\)
- AUC 可以计算为
\[\hat{A}=\frac{S_0-n_0(n_0+1)/2}{n_0n_1}\]
学习理论
假设评估
回答几个核心问题:
- 为什么说样本量要足够大, 才能保证模型的有效性?
- 常用的统计学方法: t 检验, z 检验, 以及置信区间为什么是重要的
- 解释泛化误差: 方差与偏差
- Bias + Variance + Irreducible Error
- 为什么我们强调模型的无偏估计?
- 解释过拟合和欠拟合
- 不同测试集上, 不同假设下的模型评估, 真的仅靠一个 acc 就能体现出优劣性吗?
- 交叉验证为什么是有效的? 平均值用作评估, 比直接划分测试集好在哪里?
VC 维
回归 Regression
最老派(old-schooled)的机器学习方法: 描述数据存在某种线性关系
OLS 回归: 最小二乘法
有解析解 \(\beta=(X^TX)^{-1}X^TY\) (proof see hw1)
基本功: 能从一维情形 trival 推广到矩阵形式, 然后写出对应
numpy
代码
梯度下降法为什么能够找到最小值点?
- 最大化拟合, 最小化残差, 定义损失函数为 MSE,
目标使其最小化
- 这是一个很典的优化问题
- 梯度指向函数增长最快的方向, 负方向指向了函数值减小最快的方向
- 凸函数假设: 保证有解
- plausible region? 学习率?
- 实际中梯度下降前要做好归一化工作: 防止某一特征主导, 导致其它特征不显著
为什么我们喜欢 SGD 随机梯度下降? 因为快(随机选择一个样本或一小批样本来计算梯度).
- 缺点: 容易陷入局部最小值/更新方向可能不定(方向嘈杂)
衍生:
- 多元回归: 最熟悉的例子, 房价预测
- 多项式回归: 拟合诸如 \(a_nx^n+b_nx^{n-1}\dots+a_0\) 的多项式
- 本质上是多元回归的一种特例: \(x_i\coloneqq x^i\)
- 带正则项的回归方法: Ridge Regression, Lasso Regression
- L1 Norm 和 L2 Norm 的区别
- L1 Norm 适用于特征选择(消除不显著的特征, 产生稀疏的权重矩阵)
- L2正则化适用于控制模型复杂度(防止模型参数过大)
- 以及弹性网络正则项
一些进阶话题:
- 分段回归: KNN 的方法
- 加权分段回归
- 自回归 Autoregression, 以及 VAR 向量自回归
引入非线性
逻辑回归是回归问题吗?
- 不是, 它是分类问题
- 用一个激活函数将线性回归的输出映射到概率空间
- 损失函数不用 MSE, 改用交叉熵损失 or 对数损失
- \(\sigma (\textbf{wx}+b)\) 通过一个阈值来输出二分结果
- 会用 softmax 函数对输出结果放大
- 这里用的是 sigmoid 函数
\[g(z)=\frac{1}{1+e^{-z}}\]
- 缺点: 存在梯度消失问题, 即当输入值非常大或非常小时, 梯度接近 0
常用的激活函数: ReLU 函数 \(\max(0,z)\)
- 优点: 计算简单, 训练速度快, 缓解了梯度消失问题
- 缺点: Dead Relu Problem
多分类的思想: One vs Rest
人工神经网络, 感知机和初窥深度学习 (just a glimpse :>)
决策树 Decision Tree
决策树是一种经典的树状递归算法
决策树算法的基本流程
理解三种停止条件:
- 当前节点包含的样本属于同一类别
- 已"完美分类"
- 两种不能划分的情况
- 没有属性
- 没有样本
对算法流程的改进, 缓解过拟合的方式:
- 预剪枝: 提前终止(一定深度就 stop)
- 很重要的思想: beautiful free lunch
- 深度学习里经常用(到了一个epoch预测准确率就很好了)
- 后剪枝:
- 规则后剪枝
- 错误降低剪枝
- 从叶节点往上剪枝
划分特征的依据: 如何量化一个特征的纯度 purity?
- 信息熵 \(H(D)=-\sum p_i\log p_i\)
- 系统的混乱程度或不确定性
- 信息增益 \(IG(D,a)=H(D)-\sum_{a\in A}
|D_a| H(D_a)/|D|\)
- 根据这次划分计算一个加权平均
- 描述某个特征对信息熵的减少程度
- 基尼指数 \(1-\sum p_i^2\)
- 衡量数据集的不纯度
三种常用的决策树算法: CART, ID3, C4.5 划分依据
- ID3: 基于信息增益
- C4.5: 基于信息增益比
- CART: 基于基尼指数
连续值的特征如何处理? 离散化是怎么做的?
- 二分: 例如采用叶子的均值或中位数
- 多分: 将连续特征值划分成多个区间, 例如等宽分箱 Binning
- 这个过程涉及选择最优的分割点进行划分
决策树可以应用到回归问题吗? Regression Tree 是怎么实现划分特征的?
- 选择特征 X 和分割点 t
- 计算分割后的左右子集的均方误差 MSE
- 选择使 MSE 最小的分割点进行划分
贝叶斯方法
贝叶斯决策论的基本思想?
- 通过概率的计算和期望损失的最小化来进行决策
- 选择期望损失最小的决策
- 例如, 最小化分类错误率, 就引入误判损失, 让条件风险最小化
- 最重要的是获取后验概率 \(P(c \mid x)\)
怎么理解后验概率, 似然度, 先验概率以及边际似然度这些概念.(尤其是对 likelihood 的理解)
用医生诊病的例子来说明贝叶斯定理.
了解贝叶斯方法和生成模型/判别模型之间的关系.
- 如果我们无法从数据中得到显式的规则
- 那么就从数据中学习最符合的分布以及相匹配的参数
- 生成模型: 学习联合分布 \(P(x,c)\)
然后获得 \(P(c \mid x)\)
- 例: 朴素贝叶斯, HMM
- 判别模型: 学习条件分布 \(P(c \mid
x)\) 预测 \(c\)
- 例: 线性回归, 逻辑回归, 决策树, SVM...
极大似然估计 MLE 为什么说是机器学习的基石?
- 基于数据去学习一个分布
寻找能最大化似然 \(P(D_c \mid \theta_c)\) 的参数值 \(\hat{\theta_c}\) \[\hat{\theta_c}=\argmax_{\theta_c} LL(\theta_c)\]
例子: HTHH 抛硬币序列
- MLE 就会估计出正面朝上的概率 \(p=1/4\). (写出似然函数, 取对数, 求导, 取极小值)
极大后验估计 MAP, 以及朴素贝叶斯的假设都是什么?
- 极大后验估计 MAP \(\argmax_{\theta}P(x\mid \theta)P(\theta)\)
- 极大似然估计 MLE \(\argmax_{\theta}P(x\mid
\theta)\)
- 也就是假设 \(\theta\) 服从均匀分布
- 朴素贝叶斯: 属性的独立性假设
实现一个朴素贝叶斯分类器. 参考 GaussianNB
实现,
并应用于垃圾邮件分类任务上. (课程实验)
- 怎么学习文本数据的分布? NLP 相关基础.
- 这里的高斯分布应用在哪里?
- Laplace 平滑技术是用于什么的?
基于实例的学习
相似度的度量
除了欧氏距离, 有一种利用向量内积计算的余弦相似度
- 1/-1 可以体现出比较显著的正/负相关性, 0 表示无相似性
- 相当于做了一次归一化
非数值特征的处理? 例如文本类型的数据, 布尔类型的数据?
K-Nearest Neighbors 方法, 算法流程:
- 选择 K 值: 选择一个正整数 K 作为最近邻居的数量.
- 计算相似度:对于每个测试样本, 计算其与所有训练样本的相似度.
- 找到最近邻居: 根据距离,从训练样本中选择距离最近的 K 个样本。
- 投票或加权: 对于分类问题, 使用 K 个最近邻居的类别进行投票: 对于回归问题, 计算 K 个最近邻居的平均值或加权平均值。
- 预测: 将投票结果或平均值作为测试样本的预测结果.
优缺点
- 简单容易实现, 无需训练过程
- 同时也导致计算复杂度高
- 可以拟合非线性过程
- 自然处理多分类问题
- 对噪声和不相关特征敏感(离群点敏感)
核函数
一个最常用的: 高斯核函数 RBF
\[ K(\mathbf{x}, \mathbf{y}) = \exp\left(-\frac{\|\mathbf{x} - \mathbf{y}\|^2}{2\sigma^2}\right)\]
将低维数据映射到高维空间, 从而使得在低维空间中非线性不可分的数据在高维空间中变得线性可分
在 SVM 用的多
无监督学习
K-Means 算法的流程
- 初始化: 随机选质心作为 cluster 的中心
- 分配簇: 将每个数据点分配到最近的质心所属的簇
- 更新质心: 计算每个簇的质心
- 迭代步骤 2, 3, 直到质心不再发生改变
优点: 简单, 计算速度快,适用于大规模数据集
缺点:
- 对初始质心敏感, 不同的初始质心可能导致不同的聚类结果. (不一定是全局最优)
- 适用于球形簇, 不适用于非凸簇或大小、密度差异较大的簇.
- 对噪声和离群点敏感.
层次聚类
密度聚类: 例 DBSCAN
支持向量机
例题 求解诸如下面的二次优化问题
\[\begin{aligned}\arg\min_{\boldsymbol{w},b}&\frac12\|\boldsymbol{w}\|^2\\\mathrm{s.t.}&y_i(\boldsymbol{w}^\top\boldsymbol{x}_i+b)\geq1, i=1,2,\ldots,m.\end{aligned}\]
例:
\[\min_{w_1, w_2, b} \frac{1}{2}(w_1^2 + w_2^2)\]
满足
\[\begin{cases} 3w_1+3w_2+b\geqslant 1 \\ 4w_1+3w_2+b\geqslant 1 \\ w_1+w_2+b\leqslant 1 \end{cases}\]
解 一种简化过的方法: 先转换为对偶问题
\[\min_{\alpha}\quad\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_{i}\alpha_{j}y_{i}y_{j}\boldsymbol{x}_{i}^{\mathrm{T}}\boldsymbol{x}_{j}-\sum_{i=1}^{m}\alpha_{i}\]
- 根据上面的约束条件(3个点)得出 \(x_i\) 以及 \(y_i\).
- 推荐列出 \(x_i^Tx_j\) 的清单, 小心计算错误.
这里 \(\alpha_i\) 是引入的拉格朗日乘子, 满足
\[\boldsymbol{w}=\sum_{i=1}^m\alpha_iy_i\boldsymbol{x}_i ,\quad0=\sum_{i=1}^m\alpha_iy_i\]
- 上面的第一个式子用来求出 \(\alpha\) 后反代求 \(w\).
- 根据上面的第二个式子, 可以消去某一 \(\alpha_i\), 然后对 \(s(\alpha_i)\) 求无条件极值.
求解上面这个对偶问题, 关注 KTT 条件
\[\begin{cases}\alpha_i\geq0,\\y_if(\boldsymbol{x}_i)\geq1,\\\boxed{\alpha_i(y_if(\boldsymbol{x}_i)-1)=0}\end{cases}\]
- 如果 \(\alpha_i < 0\),
则极值在边界取到.
- 即, 考虑某一 \(\alpha_i = 0\), 然后继续求极值.
- 求出这些边界情况下的最小值. 此时就确定了全部 \(\alpha\).
- 利用 KTT 条件的 (3), 若 \(\alpha_i>0\), 则代表 \(x_i\) 是支持向量, 则 \(y_if(x_i)=1\).
- 此时可以代入 \(f(x_i)\), 反解出 \(b\).
上面这个例子的答案是 \(w_1=w_2=1/2, b=-2\).
了解 Seqential Minimal Optimization (SMO) 算法.
了解线性不可分问题: kernel trick 为什么有效?
soft-margin 的思想
支持向量机可以应用到分类问题吗? sklearn.svm
里
SVC
又是怎么实现的?
集成学习
- 集成学习的核心思想
- 为什么要"好而不同"
- Bagging 的采样方法(自助采样)
- 区分 Bagging/Boosting
- 算法流程
降维学习
SVD 分解
例题 对二维矩阵
\[A=\begin{pmatrix} 3 &0 \\ 4 &5 \end{pmatrix}\]
求其 SVD 分解.
解 掌握计算流程:
- 计算 \(A^TA\) 以及 \(AA^T\).
- 计算 \(A^TA\) 和 \(AA^T\) 的特征值和特征向量.
- 奇异值是 \(A^TA\) 特征值的平方根, 即 \(\sigma_i = \sqrt{\lambda_i}\), 下标根据特征值大小排过序.
- U 矩阵的列向量是 \(AA^T\) 的特征向量.
- V 矩阵的列向量是 \(A^TA\) 的特征向量.
- 注意特征向量需要单位化.
结果为
\[A=U\Sigma V^T=\left(\begin{array}{cc}\frac{1}{\sqrt{2}}&-\frac{1}{\sqrt{2}}\\\frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}\end{array}\right)\left(\begin{array}{cc}\sqrt{45}&0\\0&\sqrt{5}\end{array}\right)\left(\begin{array}{cc}\frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}\\-\frac{1}{\sqrt{2}}&\frac{1}{\sqrt{2}}\end{array}\right)\]
例:
1 | [U, S, V] = svd(A, 'econ'); |
用于对矩阵 \(A\) 进行经济规模的奇异值分解.
主成分分析 PCA
PCA的思想: 减少数据集的特征数量, 同时尽可能地保留信息
算法流程:
- 对样本数据标准化, 例如 \(x' = (x-\mu)/\sigma\).
- 样本中心化 \(X'=X-\overline{X}\). (减去均值向量)
- 对 \(X'\) 进行 SVD 分解
- 等价于对协方差矩阵 \(XX^T\) 进行特征值分解.
- 选择主成分, 通常为前 k 个奇异值以及对应的 V
矩阵的列向量.
- 新的数据投影就是 \(Z = X' V_k\), \(V_k\) 是选择前 k 个最大的奇异值对应的 V 矩阵的列向量.
- 投影后的样本方差最大化: 拥有更高的可区分度, 同时还保留着部分映射之前的空间信息
应用: t-SNE 算法 高维数据的可视化
intro to LLM
从传统的 NLP 到嵌入向量 embedding
BERT
sota techniques:
- Transformer
- Attention
- Diffusion Model
- ...
附录 Appendix
A. 相关问题与这学期的感悟 Q&A
Q: 机器学习要学到怎样的地步?
A: 参考张敏老师上课的课件
- 关键概念
- 基础学习理论
- 经典/重要算法
- 问题定义
- 基本思路
- 算法设计与分析
- 未来方向
- 分析问题, 特征与结果
- 解决实际问题的能力
最后一条深有体会, 纯背书的学习方式非常局限: 就像打算法比赛只会写板子题一样没用, 在设计实验的时候, 开始 coding 的时候才会感到来自各方的阻力.
来自周志华老师的建议:
- for beginners: 先速读, 花一个月把西瓜书读完(遇到不懂的细节 skip), 先建立一个 scope
- 然后再花上大笔的时间深入学习各个板块.
- 一门课程可涵盖的部分实在有限, 所以这就是为什么要在课程后加上概论/导论.
这学期机器学习的路径:
参考资料
- 周志华. (2016). 机器学习. 清华大学出版社.
- Mitchell, T. (1997). Machine Learning. McGraw-Hill Education.
- 清华大学, 张敏老师的机器学习概论课程讲义