查看全课大纲(第 12 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

机器学习的模型:找输入与输出的关系

约 15 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

概率篇收官时说过:从这里开始,真正走进机器学习。第一站,讲师先把名字摆正——这门学问更该叫 Model Learning;再借统计学家 George Box 的名言立起模型的哲学——所有模型都是错的,但有些是有用的;然后,用一个”函数反转”的小把戏,把机器学习问题从数学课里请出来:给定数据,找出输入与输出之间的关系。本节几乎没有公式,但立下的框架会贯穿全课。

💡 核心导读

  • 正名:机器学习学的是数学模型而非钢铁机器——行业里都叫”算法工程师”,做的就是 algorithm、就是 model learning。
  • 模型哲学:“All models are wrong, but some are useful”——模型没有对错,只有好坏;一切模型都是真实世界的近似。
  • 问题的反转:高中是”已知 f(x)=2x+1f(x)=2x+1 去套用”;机器学习是”只给 (x, y) 数据对,反求 ff“——而且真实数据带噪声,往往没有任何函数能全部命中。
  • 维度升级:输入从标量到向量(找平面)、再到 20×20×3=1200 维的图像向量(映射到 0/1 做分类);输出可以是离散类别,也可以是连续数值。
  • capacity 与工具箱:直线拟合不了曲折数据就换更复杂的模型——多项式、正弦指数对数组合、神经网络、概率模型、决策树,都是”找关系”的家伙。

名字与哲学:Model Learning,所有模型皆错

开讲前,讲师先亮出一个个人观点:这门课叫 Machine Learning,其实”我个人感觉更应该叫 Model Learning”。为什么?Machine 这个词总让人联想到机器人、机械、钢铁构成的实体;但看看行业里大家在做什么——我们的头衔是算法工程师,做的是 algorithm,学的是一个 mathematical model。名字虽然将错就错叫惯了,本质却是:学模型,不学机器。

那”模型”到底是什么地位?统计学家 George Box 有句名言:

All models are wrong, but some are useful. (所有模型都是错的,但有些是有用的。)

讲师展开说:模型本身没有对错,只有好坏。用数学去解释一件事,只能说解释得够不够详尽、够不够完整、够不够好,很难说”我这个模型是错的”。Box 也幽默了一把:既然模型没有真正的对错,那不妨干脆认为所有模型都是错的——只不过有些模型有用,能帮我们解决问题。因为世界上没有任何一个模型能完美解释世界。

例子就在天上:月球绕地球一圈约 30.5 天、一个月 30 天左右;地球绕太阳一圈约 365 天。无论公式写得多详尽,都没法精确刻画每一次轨道运动——所以任何数学解释都只是真实世界的近似,较真起来都是”错”的。可是”月亮绕地球基本 30 天、地球绕太阳基本 365 天”这两个模型基本正确、非常有用:足够人类调整作息、安排耕种和农时、繁衍生息——“那就足够了”。

问题的反转:从套用函数到寻找关系

先回顾高中就学过的函数:自变量 xx 通过规则 ff 映射到 f(x)f(x)。比如 f(x)=2x+1f(x) = 2x + 1:x=1x=1 时 f(x)=3f(x)=3(2×1+12 \times 1 + 1,很正确);x=2x=2 时等于 5;x=10x=10 时等于 21。给定输入,查函数拿输出——这是套用。

现在把问题反转。假设别人递给你一张表格:只有 (x,f(x))(x, f(x)) 的配对——(1, 3)、(2, 5)、……、(10, 21)。“我想知道这个关系是怎么做出来的、是什么样的关系”——此时问题已经变了:不再是套用函数,而是从数据中找出这个关系。找出这个 model,“就是我们 machine learning 很重要的一部分”。

真实世界还嫌这太简单。“The world is complicated”——数据经常带噪声:给定 1 得到的是 3.2,给定 2 得到 4.9,给定 10 得到 20.9。把这些点画在图上,它们大致排成一条线的样子,却总有几个点差那么一点:

def f(x):
    return 2 * x + 1

observed = [(1, 3.2), (2, 4.9), (10, 20.9)]   # 世界给出的带噪声数据

print("x : 净值 f(x) : 观测值 : 误差")
for x, y in observed:
    clean = f(x)
    print(f"{x:2d} : {clean:7d} : {y:5.1f} : {y - clean:+.1f}")

slope_first = (4.9 - 3.2) / (2 - 1)
slope_second = (20.9 - 4.9) / (10 - 2)
print(f"前两点斜率 = {slope_first:.1f},后两点斜率 = {slope_second:.1f}:三点不在同一条直线上")
x : 净值 f(x) : 观测值 : 误差
 1 :       3 :   3.2 : +0.2
 2 :       5 :   4.9 : -0.1
10 :      21 :  20.9 : -0.1
前两点斜率 = 1.7,后两点斜率 = 2.0:三点不在同一条直线上

误差 +0.2、−0.1、−0.1——也许没有任何一条直线(或任何函数)能同时穿过所有点,因为中间总有一些误差。“这就是一个真实世界的情况”:给定了这些数据,想找最近似的那条线——这也是机器学习的问题。(“最近似”三个字怎么定义、怎么找?第 4 章会给出正式答案:损失函数与梯度下降。)

维度升级:从直线到平面,再到 1200 维图像

用上一章的线性代数视角看:刚才输入是标量、输出也是标量。往下走一步,输入换成向量 (x1,x2)(x_1, x_2),函数的形式就升级成 wTx+b\mathbf{w}^T\mathbf{x} + b,比如 g(x1,x2)=2x1+3x2−1g(x_1, x_2) = 2x_1 + 3x_2 - 1。讲师照样给了一组带噪声的数据:(1, 1) 对应 4.1,(1, 2) 对应 6.9,(4, 3) 对应 15.8——

def g(x1, x2):
    return 2 * x1 + 3 * x2 - 1

observed_3d = [((1, 1), 4.1), ((1, 2), 6.9), ((4, 3), 15.8)]

print("输入(x1,x2) : 平面值 g : 观测值 : 相对平面")
for (x1, x2), y in observed_3d:
    clean = g(x1, x2)
    side = "上方" if y > clean else "下方"
    print(f"  ({x1}, {x2}) : {clean:6.1f} : {y:6.1f} : {side} {y - clean:+.1f}")
输入(x1,x2) : 平面值 g : 观测值 : 相对平面
  (1, 1) :    4.0 :    4.1 : 上方 +0.1
  (1, 2) :    7.0 :    6.9 : 下方 -0.1
  (4, 3) :   16.0 :   15.8 : 下方 -0.2

现在是三维的情况:输入是平面上的点,输出把每个点顶到三维空间里——有的点落在平面的上方,有的落在下方,还有的误差更大、离平面更远。和找”最近似的直线”完全同理:找到一个面,使这些点离它最近——学的仍是输入与输出之间的关系。

再往下走一步,把输入换成图像。一张 20×20 的图片有 20×20=40020 \times 20 = 400 个像素点;彩色图像每个像素有 RGB 三个值,再乘 3——1200 维向量。一张小狗的图片,就这样变成 1200 维空间里的一个点。而我们要学的函数是:把这个 1200 维向量映射到 0 或 1 上——0 代表 dog(小狗),1 代表 cat(猫)。这就是大家已经听过的模式识别、图像分类问题。当然输出未必总是离散的类别:也可能映射到连续值——相当于在高维空间里拟合一条特别复杂的线。

直线不够用:capacity 与两条新路

换不同模型时有一条规律:模型的 complexity(复杂度、capacity)越大,能力越强。对大致排成一条线的数据,y=2x+1y = 2x+1 这种直线就够;可一旦数据带拐弯、有曲折,“你会发现我找不到任何一条线”能描述它。这时就需要更复杂的函数:

  • 多项式:ax3+bx2+cxax^3 + bx^2 + cx;
  • 基函数组合:asin⁡(x)+bex+clog⁡(x)a\sin(x) + b e^x + c\log(x)——每个系数都是可学的参数,把以前学过的函数拼装成特别曲折的新函数。

用以前学过的复杂函数,可以构造出足够”能拐弯”的新函数去解释这些点——这就是更复杂的 capacity。但还有一个现实问题:我们会的函数终究有限。讲师指出两条逼近任意复杂关系的路:

  1. 神经网络:以后会学到,它能拟合特别复杂的非线性函数,把已知数据点贴得更近;
  2. 概率:拿小狗小猫分类来说,直接找”x 映射到 0/1”的函数并不好找;但可以求条件概率——给定 xx 时它等于 0 的概率多大、等于 1 的概率多大,两相比较:0 的概率大就判 0,反之判 1。分类问题特别容易走这条概率通道——概率也是一种数学函数,尤其条件概率,可以构造非常复杂的数学函数。

那么模型能力是不是越大越好?先埋个引子:本章后面有一整节专门讨论”过拟合”——模型太强也会出事。

输入输出的全谱系与模型工具箱

把镜头拉远,机器学习问题的输入输出有完整的谱系:

  • 输入:可以是标量、向量、矩阵,甚至更高维的矩阵和向量;
  • 输出:可能是离散值(0、1、2、3——分类),也可能是连续值(1.3、4.4、5.7、8——回归);
  • 向量到向量:当然也有——输入一段英文、输出一段汉语(两种语言都用向量表示);输入一张彩色图像、把颜色全部去掉变成黑白图像——这类映射输入输出大小一样;
  • 矩阵到矩阵:给定一个矩阵、输出一个矩阵,同样是找关系的任务。

无论形式怎么变,机器学习做的事情始终是那一句:找输入和输出之间的复杂函数关系,用它拟合给定的数据。而能出场的模型是一个工具箱:概率模型(probabilistic)、神经网络(neural network)、决策树(decision tree,dt),以及其他任何复杂的数学模型——都是想做”找到关系”这件事的家伙。机器学习到底想做什么,本节已经给出了全景。

📝 动手练一练

  1. 概念辨析:George Box 说”All models are wrong, but some are useful”。请结合一个生活中的例子(别用课上的月球绕地球),谈谈你的理解:为什么模型是”错”的?又如何判断它是否”有用”?
👉 点击查看参考答案

例如,用”平均气温”描述一座城市的气候。它是”错”的:完全忽略了每日温差、极端天气、湿度、风速等细节,无法精确反映任何一天的真实体感。但它又是”有用”的:高度概括了地区的冷热全貌,足以指导准备衣物、安排种植季节、比较不同城市的宜居度。判断”有用”的标准只有一条:能否以可接受的简洁度,服务好我们特定的决策目的——这与讲师说的”足够调整作息、安排农时,那就足够了”是同一个意思。

  1. 动手算一算:一张 32×32 的彩色图片,按本节”像素 × RGB”的算法展平后是多少维的向量?若模型对某张图学出条件概率 P(0|x)=0.62、P(1|x)=0.38(0=狗、1=猫),按讲师的概率判别法该输出哪一类?什么样的概率会让判断翻转?
👉 点击查看参考答案

维度:32×32×3=307232 \times 32 \times 3 = 3072 维——和课上 20×20×3=1200 同一个算法,图像一大,维度立刻爆炸(这正是”高维”的直观来源)。

判别:0.62 > 0.38,判 0(狗)。只要 P(1|x) 大过 P(0|x)(越过 0.5 这条中线),判断就翻转为猫。这正是讲师说的:直接找”x → 0/1”的函数不好找,但比较两个条件概率再下判,等价且可行——概率本身也是一种函数。

本章小结

机器学习更本质的名字是 Model Learning——学的不是机器,是数学模型。模型没有对错、只有好坏:一切模型都是真实世界的近似,“All models are wrong, but some are useful”,月亮绕地球”基本 30 天”这样的近似模型已足够有用。机器学习的问题从”套用已知函数”反转而来:给定 (x, y) 数据对,反求映射关系;真实数据带噪声,找的常常是”最近似”的线或面。输入从标量升到向量(找平面)、再升到 1200 维图像向量(分类到 0/1),输出可离散可连续,向量还能映到向量(翻译、图像去色)。直线不够就上 capacity 更大的模型:多项式、基函数组合、神经网络,或者走概率那条路——条件概率也是函数。工具箱里 probabilistic、neural network、decision tree 各就各位。至于”最近似”的严格定义与系统求法——第 4 章正式开工。

📋 行动清单

  • 用”输入-输出-找关系”的框架,把一个你熟悉的预测问题(比如根据历史销量预测未来销量)改写成机器学习问题:输入是什么维度的?输出是离散还是连续?
  • 给朋友讲”为什么这门课更该叫 Model Learning”:机器 ≠ 机器人,算法工程师做的是数学模型
  • 亲手验证 3.1 的两组噪声数据:三个二维点为何没有共线(斜率 1.7 ≠ 2.0)、三个三维点相对平面 2x1+3x2−12x_1+3x_2-1 各在哪一侧

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第3章课件:机器学习的哲学
    下载