Machine Learning Crash Course with Tensorflow APIs | Notes
After work, I studied the “Machine Learning Crash Course” produced by Google and made some notes.
在工作之余学习了 Google 出品的 “机器学习速成课程”,做了些笔记。
这门课在讲什么
Google 的 Machine Learning Crash Course (MLCC) 适合作为机器学习入门课,因为它并不追求一次性讲完所有算法,而是围绕一个更实际的问题展开:如果要把一个模型从数据、训练、评估一路做到能用,最核心的概念是什么。
这门课覆盖的重点大致包括:
- 监督学习的基本问题定义
- 线性回归与逻辑回归
- 损失函数与梯度下降
- 分类模型的评估指标
- 训练集、验证集、测试集
- 泛化、过拟合与正则化
- 特征工程与特征组合
- 用 TensorFlow API 搭建基础模型
如果已经学过一些机器学习教材,那么 MLCC 最有价值的地方不一定是“新知识”,而是它把很多概念讲得非常工程化。
机器学习项目的基本流程
MLCC 里反复强调的一点是,不要把机器学习理解成“选个算法然后开始训练”。更合理的视角是把它看成一个迭代流程:
- 明确任务与标签
- 准备和理解数据
- 设计特征表示
- 选择模型与损失函数
- 训练模型
- 在验证集上调参
- 在测试集上做最终评估
很多初学者一开始最容易忽略的是第 2 步和第 3 步。实际上,在工业场景中,数据质量和特征设计往往比“换一个更复杂的模型”更重要。
线性回归与损失函数
MLCC 从最基础的线性回归开始,这很合理,因为很多后续概念都可以从这里自然过渡出来。
线性模型可以写成:
1 | y' = b + w1x1 + w2x2 + ... + wnxn |
其中 x 是特征,w 是权重,b 是偏置,y' 是模型预测值。
训练的目标就是找到一组更好的参数,使预测值尽可能接近真实值。对于回归问题,常见的损失函数是平方损失或均方误差 (Mean Squared Error, MSE)。
这里最重要的不是记住公式,而是理解两个事实:
- 损失函数定义了“模型错得有多严重”
- 训练过程本质上是在最小化损失函数
梯度下降在做什么
梯度下降 (Gradient Descent) 是整门课最核心的概念之一。
它的直觉并不复杂:如果把损失函数看成一座山地形图,那么当前参数所在的位置通常不在最低点。梯度告诉我们当前位置“往哪个方向上升最快”,因此只要沿着梯度的反方向走,就有机会让损失继续下降。
更新过程可以简单写成:
1 | parameter = parameter - learning_rate * gradient |
这里有两个容易低估但非常关键的点:
- learning rate 太小,训练会很慢
- learning rate 太大,训练可能震荡,甚至无法收敛
MLCC 在这一部分讲得很实用。对于工程实践来说,先观察 loss curve 是否稳定下降,通常比一开始纠结更复杂的优化器更重要。
从回归到分类
在线性回归之后,MLCC 也继续讲到了逻辑回归 (Logistic Regression) 和分类问题。
逻辑回归本质上仍然是在做一个线性组合,只不过最后会经过一个 sigmoid 函数,把输出压到 0 到 1 之间,表示某个类别出现的概率。
1 | probability = sigmoid(wx + b) |
在二分类任务中,模型输出的通常不是最终类别,而是一个概率值。接下来还需要设定阈值 (threshold),例如:
1 | if probability >= 0.5: |
这也是很多初学者容易混淆的地方:模型预测概率和最终分类决策,不是同一件事。
不要只看 Accuracy
MLCC 在分类部分给人的一个很深的印象是,它没有停留在“准确率越高越好”这种非常表面的结论上。
对于类别不平衡的数据集,Accuracy 往往会误导人。比如正样本只占 1%,模型如果永远预测负类,也能得到 99% 的准确率,但这个模型基本没有价值。
因此在实际问题里,经常还要看:
- Precision
- Recall
- F1
- ROC
- AUC
更实际一点的做法是,先想清楚业务更怕哪种错误,再选择更合适的指标。如果是风控问题,可能更怕漏报;如果是推荐或广告问题,可能更关注 precision 和排序质量。
泛化、过拟合与正则化
这部分是机器学习入门里最重要的内容之一,但也最容易被草草带过。
一个模型在训练集上表现很好,并不代表它真的学到了规律,也可能只是记住了训练数据中的噪声。这就是过拟合 (Overfitting)。
与之对应,模型太简单、连训练集都学不好,就是欠拟合 (Underfitting)。
MLCC 提醒我们,评估模型时要特别区分三件事:
- training error
- validation error
- test error
一个健康的训练过程,通常是训练误差下降、验证误差也随之下降;如果训练误差继续下降,但验证误差开始恶化,就要警惕过拟合。
缓解过拟合的常见方法包括:
- 收集更多数据
- 减少特征噪声
- 降低模型复杂度
- 使用正则化
- 合理做 early stopping
正则化 (Regularization) 可以理解为对模型复杂度加约束,避免参数过大、模型过于依赖少数特征。
特征工程依然很重要
虽然现在很多深度学习模型能够自动学习特征,但在结构化数据、广告、推荐、搜索、风控等问题里,特征工程依然是模型效果的重要来源。
MLCC 对特征工程的讲解很适合初学者,尤其是下面几个点:
- 数值特征需要关注尺度、分布和异常值
- 类别特征通常要做 one-hot encoding、hashing 或 embedding
- 分桶 (bucketization) 可以把连续值转成更稳定的离散特征
- 特征交叉 (feature cross) 可以让线性模型表达更强的非线性关系
例如用户年龄和设备类型分别看都很普通,但交叉起来之后,可能就能更好地区分不同人群的行为模式。这也是线性模型在工业界长期有生命力的一个原因。
TensorFlow 简介
这门课一边讲机器学习基础,一边用 TensorFlow 把一些核心概念落到代码里。这样做的好处是,很多原本停留在公式和定义层面的内容,会更容易和训练流程、特征处理、模型评估这些工程问题对应起来。
从设计思路上看,TensorFlow 做的事情其实很清楚:用统一的计算图和张量表示,把数据流、模型计算、损失函数和参数更新组织到一起。这样一来,研究里常见的“定义模型、计算 loss、反向传播、更新参数”这条链路,就能比较自然地落到工程实现中。
在实际使用中,TensorFlow 最常见的几类工作大致是:
- 定义模型结构
- 组织输入数据管道
- 执行训练与评估
- 保存和加载模型
- 部署到不同运行环境
我觉得 TensorFlow 最值得关注的地方,不是某一层 API 怎么写,而是它把机器学习训练过程拆得比较清楚。数据怎么进入模型,模型怎么产生预测,损失怎么定义,梯度怎么回传,参数又如何更新,这些环节都能在框架里找到明确对应。
对初学者来说,这一点很有帮助。很多时候学机器学习最大的障碍不是公式本身,而是不知道一个模型在代码里到底是如何真正跑起来的。借助 TensorFlow 这样的框架,至少可以把“数学定义”和“工程实现”之间的那层隔阂拆开一些。
我觉得这门课最有价值的地方
学完之后,我觉得 MLCC 最有价值的不是某一个公式,而是下面这些比较“工程化”的提醒:
- 先把问题定义清楚,再谈模型
- 先把数据看明白,再谈调参
- 指标要服务于业务目标,不要迷信单一 accuracy
- 验证集的作用是调参,不要把测试集用成验证集
- 简单模型往往是很好的 baseline
- 特征工程和数据质量常常决定上限
这些原则今天看依然不过时。
小结
如果把 MLCC 当成一门“机器学习第一课”,它最大的优点是路径非常清楚:从线性模型讲到分类,从损失函数讲到梯度下降,从训练讲到评估,从特征工程讲到 TensorFlow 实现,基本把一个入门者最需要建立的认知框架串了起来。
对于已经有一些基础的同学,这门课的作用可能不是补充多少新知识,而是帮助自己把很多零散概念重新组织成一条更完整的工程链路。