同一批 8×8 小图:手工特征(3 维)在 20 条样本时就是 1.000; 端到端吃 64 维像素,同样 20 条只有 0.933,要到 100 条才追到 0.993。
上一节看清「深」是什么,这一节把机器学习和深度学习放到同一道题上比, 看它们的差别到底体现在哪个数字上。
一、差别不在算法,在「谁来想特征」
机器学习:人先想好「该看什么」,把它算成几个数,再交给分类器。 深度学习:人只给原始数据,网络自己决定该看什么。 Demo 的任务是判断 8×8 的小图里是一条横线还是一条竖线。 手工路线:算「每行的方差最大值」「每列的方差最大值」「两者比值」——一共 3 维。 横线的行方差大,这条知识是人提前想好的。 端到端路线:直接把 64 个像素标准化后喂给两层网络,让它自己发现「行方差大」这条规律。
二、实测:小样本时手工特征完胜
20 条样本:手工 1.000,端到端 0.933。 50 条:手工 1.000,端到端 0.987。 100 条:手工 1.000,端到端 0.993。 250 条:手工 1.000,端到端 0.993。 手工那列从头到尾 1.000,因为它拿到的就是「答案的另一种写法」——行列方差比本身就是横竖的判据。 端到端从 0.933 一路爬到 0.993,越往后越接近。 这就是「数据换知识」:它要靠样本自己把那条规律找出来。
三、这个对比说明什么
第一,手工特征不是落后技术。样本少、规律清楚的时候,它比深度学习更省、更准、更好解释。 第二,端到端的优势在大数据量上。 本例 250 条就基本追平了,换成真实图像任务,那个交叉点会在几万到几十万条之间。 第三,代价不同。手工特征要人懂业务,端到端要数据和算力。哪个贵,取决于你有什么。 所以「用不用深度学习」不是技术先进性的问题,是资源配置的问题。这句话在真实项目里能省下很多冤枉钱。
四、两条路可以混
实际项目里最常见的不是二选一,而是混着来: - 用预训练网络提出特征,再接一个简单的分类器(迁移学习)。 - 在网络里塞进人工设计的特征通道(比如把边缘图当额外输入)。 - 用业务规则做后处理(比如「识别出两个头就报警」)。 这三条都在做同一件事:把人的知识用最便宜的方式塞进去。 纯端到端只在大厂那种「数据管够」的场景里才划算。
五、动手 Demo:手工特征 vs 端到端,样本量小时谁赢
生成 800 张 8×8 小图(一半横线、一半竖线,各带高斯噪声); 路线一抽 3 维手工特征(行方差、列方差、比值)接逻辑回归;路线二把 64 维像素标准化后喂两层网络; 在 20/50/100/250 四档样本量下各跑一次,比测试集准确率。
def hand_feat(im):
rv = im.var(axis=1).max() # 行方差最大:横线这里大
cv = im.var(axis=0).max() # 列方差最大:竖线这里大
return np.array([rv, cv, rv / (cv + 1e-9)])
acc_h = H.acc(pred_lr(fit_lr(hf[tr], ys[tr]), hf[te]), ys[te])
Ztr = (px[tr] - px[tr].mean(0)) / (px[tr].std(0) + 1e-9)
Zte = (px[te] - px[tr].mean(0)) / (px[tr].std(0) + 1e-9)
acc_n = H.acc(pred_nn(fit_nn(Ztr, ys[tr]), Zte), ys[te])
实跑输出:
--------------------------------------------------------------------
同一批小图:手工特征 vs 端到端,样本量小时谁赢
--------------------------------------------------------------------
训练样本 手工特征维度 手工+逻辑回归 像素维度 端到端两层
--------------------------------------------------------------
20 3 1.000 64 0.933
50 3 1.000 64 0.987
100 3 1.000 64 0.993
250 3 1.000 64 0.993
手工特征 行方差最大值、列方差最大值、两者比值(3 维)
端到端输入 8×8 原始像素(64 维),标准化后直接进网络
测试集 150 张
看两列随样本量的走势:手工特征一开始就接近满分,因为
「横线的行方差大」这条知识是人塞进去的;
端到端要从像素里自己发现这条规律,样本少的时候它学不出来。
样本一多,端到端就追上来了——这就是「数据换知识」。
这个分界没有固定数字,取决于任务的复杂度和特征工程的难度。
规律是:手工特征把人的知识提前塞进去,端到端靠数据自己长知识。
所以样本少、知识清楚,就用手工;样本多、规律说不清,就用端到端。
手工那列四行全是 1.000,一条没掉。 因为「行列方差比」就是横竖的判据,人在设计特征时已经把答案写进去了。 端到端那列:0.933 → 0.987 → 0.993 → 0.993。20 条时明显吃亏,100 条以后基本追平。 注意两列在 250 条时只差 0.007,但成本差得远:手工特征要人懂「方差」这个概念,端到端只需要标注。 这个 Demo 的图像只有 8×8,规律又极其简单,所以端到端 100 条就学会了。 真实图像是 512×512,规律复杂得多,交叉点会往后推好几个数量级。
30 秒实验
- 把手工特征只留 1 维(行方差),看准确率掉到多少。
- 把噪声从 0.15 加到 0.4,看两条路线谁先撑不住。
- 想一想:如果你手上只有 30 条标注数据,该选哪条路?
常见误区
- 「深度学习一定比机器学习强」——20 条样本时它输给 3 维手工特征。
- 「手工特征是过时技术」——样本少、规律清楚时它更省更准。
- 「端到端不需要人」——标注规则、数据清洗仍然要靠人。
自测三问(点开对答案)
1. 两条路线的根本差别在哪一步? —— 特征由人来设计,还是由网络从原始数据里自己学。 2. 本例中端到端在哪一档样本量追平手工特征? —— 100 条左右(0.993 对 1.000),250 条只差 0.007。 3. 为什么手工特征能从第一行就满分? —— 「行列方差比」本身就是横竖线的判据,答案被提前写进了特征。两条路比完,下一节钻进网络内部:一次前向、一次反向,到底算了什么。
- ☐ (本节完,下一节 5.1.3 工作原理:深度学习算法的底层逻辑)