说起来,上周三下午在星巴克和几个做Web开发的朋友聊天,大家的话题聊着聊着就转到了AI和机器学习上。

其中一个朋友说:“我现在每天看新闻都是AI这个AI那个,感觉技术栈又要更新了,但机器学习这东西感觉离我挺远的。”

另一个朋友接话:“是啊,我们这些做后端的,平时就是写写API、优化一下数据库,机器学习好像是个完全不同的世界。”

我听了挺有感触的。作为AI Native Coder,我每天都在和这些工具打交道,但我完全理解他们的感受。

因为两年前,我也这么想过。

那时候我主要做Web开发,机器学习对我来说就是个黑盒子——知道它很厉害,但不知道怎么用,也不知道从哪开始。

后来是怎么转变的呢?不是因为突然想转行做算法工程师,而是我发现机器学习解决了很多传统编程解决不了的问题

今天我想聊聊这个转变的过程,也聊聊为什么我觉得每个程序员都应该了解机器学习


传统编程的局限性

先说个我亲身经历的故事。

2024年的时候,我接了个项目:做一个垃圾邮件过滤系统。按照传统编程的思路,我是这么设计的:

  1. 定义一些规则:如果邮件标题包含"中奖"、"免费"这些关键词,就标记为垃圾邮件
  2. 维护一个黑名单:把已知的垃圾邮件发件人地址存起来
  3. 评分机制:每个规则打分,总分超过阈值就过滤

代码大概是这个样子:

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是未来、要跟风,也不是想转行做算法工程师。

而是我在实际工作中遇到了很多传统编程难以解决的问题

  1. 用户行为分析:怎么根据用户的点击、浏览记录,推荐他可能感兴趣的内容?
  2. 异常检测:怎么在海量日志中自动发现异常行为?
  3. 文本理解:怎么自动判断用户评论的情感倾向是正面还是负面?
  4. 图像处理:怎么自动识别用户上传的图片里有什么?

这些问题,用传统编程要么做不了,要么效果很差。

但用机器学习,这些问题都有成熟的解决方案。

更关键的是,我发现机器学习不是一个完全陌生的技术栈

它依然是编程,依然是写代码,只是思维方式有所不同。作为一名有编程基础的开发者,你不需要从零开始学编程,只需要学新的工具和新的思维方式。

学习曲线其实没有你想象的那么陡。


这系列教程要讲什么

那么,这个系列教程要讲什么?

我的目标是:帮助有编程基础的开发者建立机器学习的基本认知框架

具体来说:

  1. 从传统机器学习到深度学习:我会带你从基础的线性回归、决策树,一步步学到卷积神经网络、Transformer这些现代架构。

  2. 理论结合实践:每个概念我都会解释"为什么重要"和"怎么用",而不是只堆公式和定义。

  3. 代码驱动学习:每章都有可运行的代码示例,你可以边看文章边跑代码,加深理解。

  4. 项目巩固知识:每个模块结束后,我们都会做一个完整的实战项目,把学到的知识串起来。

  5. 建立工程思维:最后还会讲到模型部署、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欠拟合。

这些概念是机器学习的基础,理解了它们,后面的学习会更顺畅。

如果你对机器学习还有什么疑问,或者有特别想了解的内容,欢迎在评论区告诉我。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐