第1章 为什么程序员要学机器学习?
说起来,上周三下午在星巴克和几个做Web开发的朋友聊天,大家的话题聊着聊着就转到了AI和机器学习上。其中一个朋友说:“我现在每天看新闻都是AI这个AI那个,感觉技术栈又要更新了,但机器学习这东西感觉离我挺远的。另一个朋友接话:“是啊,我们这些做后端的,平时就是写写API、优化一下数据库,机器学习好像是个完全不同的世界。我听了挺有感触的。作为AI Native Coder,我每天都在和这些工具打交道
说起来,上周三下午在星巴克和几个做Web开发的朋友聊天,大家的话题聊着聊着就转到了AI和机器学习上。
其中一个朋友说:“我现在每天看新闻都是AI这个AI那个,感觉技术栈又要更新了,但机器学习这东西感觉离我挺远的。”
另一个朋友接话:“是啊,我们这些做后端的,平时就是写写API、优化一下数据库,机器学习好像是个完全不同的世界。”
我听了挺有感触的。作为AI Native Coder,我每天都在和这些工具打交道,但我完全理解他们的感受。
因为两年前,我也这么想过。
那时候我主要做Web开发,机器学习对我来说就是个黑盒子——知道它很厉害,但不知道怎么用,也不知道从哪开始。
后来是怎么转变的呢?不是因为突然想转行做算法工程师,而是我发现机器学习解决了很多传统编程解决不了的问题。
今天我想聊聊这个转变的过程,也聊聊为什么我觉得每个程序员都应该了解机器学习。
传统编程的局限性
先说个我亲身经历的故事。
2024年的时候,我接了个项目:做一个垃圾邮件过滤系统。按照传统编程的思路,我是这么设计的:
- 定义一些规则:如果邮件标题包含"中奖"、"免费"这些关键词,就标记为垃圾邮件
- 维护一个黑名单:把已知的垃圾邮件发件人地址存起来
- 评分机制:每个规则打分,总分超过阈值就过滤
代码大概是这个样子:
def is_spam(email):
score = 0
# 规则1:标题包含敏感词
spam_keywords = ['中奖', '免费', '点击', '优惠']
for keyword in spam_keywords:
if keyword in email.title:
score += 10
# 规则2:发件人在黑名单
if email.sender in BLACKLIST:
score += 50
# 规则3:全大写字母过多
if email.title.isupper():
score += 20
# 规则4:包含大量感叹号
if email.title.count('!') > 3:
score += 15
return score > 50 # 超过50分就是垃圾邮件
这个系统一开始还行,但很快问题就暴露了。
第一,规则越来越复杂。垃圾邮件的发送者很狡猾,他们会避开你的关键词,用同音字代替,或者把敏感词拆开写。我得不断添加新规则。
第二,误报很多。有次一封正常的商业邮件因为标题有个"限时优惠"被标记为垃圾邮件,客户差点错过重要合同。
第三,黑名单跟不上。垃圾邮件发送者每次都换个新邮箱,黑名单怎么都补不完。
我花了三个月优化这个系统,规则写了200多条,但准确率还是卡在75%左右,怎么也上不去。
[图片:传统垃圾邮件过滤的规则复杂度增长曲线]
后来我接触了机器学习,用朴素贝叶斯算法重新实现了一个版本,代码量从200多行规则变成了不到50行,但准确率直接跳到了92%。
这个反差挺大的。
我意识到一件事:传统编程适合处理"规则明确"的问题,但现实世界很多问题是"模糊"的、"复杂"的,很难用明确的规则描述。
而机器学习的核心思想就是:从数据中自动发现规律,而不是由人来硬编码规则。
编程范式的转变
让我换个角度来理解这两种范式的区别。
传统编程是这样的:
输入数据 → 程序(规则)→ 输出结果
比如写一个计算器,你告诉计算机"2 + 3等于5",这就是规则。
机器学习是这样的:
输入数据 + 输出结果 → 机器学习算法 → 程序(规则)
比如做垃圾邮件过滤,你给机器学习算法1000封邮件,告诉它哪些是垃圾邮件哪些不是,算法会自动学会"什么样的邮件是垃圾邮件"。
[图片:传统编程 vs 机器学习流程对比图]
这个区别看起来简单,但影响很大。
传统编程中,规则是由人来编写的。这要求你对问题有深刻的理解,能总结出规律。
机器学习中,规则是从数据中自动提取的。这意味着即使你不知道规律是什么,只要数据足够,机器也能学会。
举个更直观的例子。
假设你要写一个程序,判断一张图片里有没有猫。
用传统编程,你得定义:猫有哪些特征?尖耳朵、胡须、毛茸茸的身体…然后写代码检测这些特征。但这太难了,因为猫的姿势、角度、光照条件都不同,规则根本写不完。
用机器学习,你只需要准备几千张猫的图片和几千张没有猫的图片,训练一个模型,它就能自动学会识别猫。
这个能力上的差异,是根本性的。
什么时候应该用机器学习?
那是不是所有问题都要用机器学习?当然不是。
传统编程和机器学习各有适用场景。
传统编程适合的场景:
- 规则明确,容易描述
- 不需要从数据中学习
- 对性能、资源有严格要求
- 例如:计算器、数据库查询、文件压缩
机器学习适合的场景:
- 规则复杂或难以描述
- 有大量标注数据
- 问题存在模式,但人类难以总结
- 例如:图像识别、语音识别、推荐系统、自然语言处理
我看过一个挺有意思的比喻:
传统编程就像手工雕刻,你需要精确知道要刻出什么形状。
机器学习就像训练一只狗,你给它展示正确的例子,它会自己学会。
这个比喻不完美,但抓住了核心。
我为什么开始学机器学习
回到一开始的问题:我为什么开始学机器学习?
不是因为觉得AI是未来、要跟风,也不是想转行做算法工程师。
而是我在实际工作中遇到了很多传统编程难以解决的问题:
- 用户行为分析:怎么根据用户的点击、浏览记录,推荐他可能感兴趣的内容?
- 异常检测:怎么在海量日志中自动发现异常行为?
- 文本理解:怎么自动判断用户评论的情感倾向是正面还是负面?
- 图像处理:怎么自动识别用户上传的图片里有什么?
这些问题,用传统编程要么做不了,要么效果很差。
但用机器学习,这些问题都有成熟的解决方案。
更关键的是,我发现机器学习不是一个完全陌生的技术栈。
它依然是编程,依然是写代码,只是思维方式有所不同。作为一名有编程基础的开发者,你不需要从零开始学编程,只需要学新的工具和新的思维方式。
学习曲线其实没有你想象的那么陡。
这系列教程要讲什么
那么,这个系列教程要讲什么?
我的目标是:帮助有编程基础的开发者建立机器学习的基本认知框架。
具体来说:
-
从传统机器学习到深度学习:我会带你从基础的线性回归、决策树,一步步学到卷积神经网络、Transformer这些现代架构。
-
理论结合实践:每个概念我都会解释"为什么重要"和"怎么用",而不是只堆公式和定义。
-
代码驱动学习:每章都有可运行的代码示例,你可以边看文章边跑代码,加深理解。
-
项目巩固知识:每个模块结束后,我们都会做一个完整的实战项目,把学到的知识串起来。
-
建立工程思维:最后还会讲到模型部署、MLOps这些实战中必须的知识。
这30章读完后,你会:
- 理解机器学习的核心概念和思维方式
- 掌握从传统算法到深度学习的主要技术
- 能够独立完成常见的机器学习项目
- 知道如何将机器学习应用到实际工作中
一个简单的对比示例
最后,我想用一个更简单的例子,展示一下传统编程和机器学习的区别。
假设我们要写一个程序,判断一个数是奇数还是偶数。
用传统编程:
def is_odd_traditional(n):
return n % 2 != 0
print(is_odd_traditional(3)) # True
print(is_odd_traditional(4)) # False
用机器学习(这里用简单的逻辑回归):
import numpy as np
from sklearn.linear_model import LogisticRegression
# 训练数据
X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
y = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0]) # 1表示奇数,0表示偶数
# 训练模型
model = LogisticRegression()
model.fit(X, y)
# 预测
print(model.predict([[3]])) # [1]
print(model.predict([[4]])) # [0]
这个例子中,传统编程用了取模运算,直接实现规则。机器学习则是从数据中学习规律。
当然,判断奇数这个问题用传统编程明显更合适,我只是想展示两种范式的代码风格差异。
在接下来的章节中,我会展示更多真正适合机器学习解决的例子。
下章预告
下一章,我会介绍机器学习的核心概念:监督学习vs无监督学习、回归vs分类、过拟合vs欠拟合。
这些概念是机器学习的基础,理解了它们,后面的学习会更顺畅。
如果你对机器学习还有什么疑问,或者有特别想了解的内容,欢迎在评论区告诉我。
更多推荐


所有评论(0)