上周和几个测试同行吃饭。有个做了三年自动化的朋友突然问我:“你说深度学习到底是个啥?我看了十几篇教程,什么卷积、反向传播,越看越懵。”
我问他:“你做饭吗?”
他说做。
我说:“你学做红烧肉的时候,第一次味道不对,你分析是盐放少了还是火候不够,第二次调整,第三次更好吃。这个过程就是深度学习。”
他愣了一下,然后说:“那为什么不直接叫‘自动试错’?”
我说:“因为叫‘深度学习’听起来更厉害。”
这不是段子。很多人的确被这个词吓住了。以为需要先啃完《统计学习方法》才能入门。实际上,深度学习的核心逻辑非常朴素。
这篇文章不讲公式,不堆术语。我用测试工程师能听懂的人话,把深度学习拆开给你看。
目录
- 一、别神话深度学习,它其实解决了一个古老的问题
- 二、为什么规则系统会失效
- 三、深度学习的三个核心机制
- 四、一个对比让你彻底明白
- 五、对你现在的工作有什么用
- 六、留一个问题
一、别神话深度学习,它其实解决了一个古老的问题
2016年AlphaGo战胜李世石的时候,全行业兴奋。但做工程的人很快冷静下来:这个东西跟我有什么关系?
2022年ChatGPT出来,情况变了。产品经理开始提需求“接个大模型”,测试经理开始问“你有没有测过模型”。
焦虑的点不在“深度学习有多牛”,而在“我不懂它,连它测什么都说不清楚”。
本质是:过去我们解决的问题,大多能用明确的规则描述。登录功能:用户名对且密码对,登录成功;否则失败。边界清晰。
但规则系统碰到两类问题就死。
第一类,规则写不全。比如判断一张图是不是猫。你写出100条规则:有胡须、有耳朵、有眼睛……随便换个角度、换个光线,规则就漏了。
第二类,规则相互冲突。比如判断一封邮件是不是垃圾邮件。标题含“免费”可能是广告,但朋友发的“免费帮你”又不是。规则越加越多,最后变成一团乱麻。
深度学习解决的就是这两个问题:不用你写规则,它自己从数据里找规律。
这个定位要记住:深度学习不是魔法,它是一个“自动从数据中学习映射关系”的工具。
二、为什么规则系统会失效
很多人没意识到,我们测试的绝大部分软件,目前还是规则驱动。需求文档写成什么样,开发就写成什么样,测试就按规则去测。
但当一个系统的输入空间大到无法枚举,规则就写不出来了。
人脸识别:输入的是一张图片,每个像素点有0-255的灰度值。一张100x100的灰度图,输入空间的维度是10000维。每个维度有256种取值。你告诉我,枚举所有可能的输入?
不可能。
更麻烦的是,真实世界的输入有噪声。同样的一个人,光线不同、角度不同、表情不同,像素值完全不同。你没法写一条规则说“左上角第5个像素亮度在120-130之间就是人脸”。
所以必须换思路:不定义规则,只给大量例子。让系统自己总结出“什么样的像素组合更像人脸”。
这就是深度学习的起点。
三、深度学习的三个核心机制
把深度学习拆到最简,就三件事。
1. 输入输出的数字化
计算机不认识猫、不认识图片。它只认识数字。一张图片本质上是一个三维数组:高、宽、颜色通道。每个位置存一个0-255的整数。
深度学习的第一步,就是把所有东西变成数字向量。图像变成像素矩阵。文字变成词向量。声音变成声谱图。
这个我们之前的文章讲过,向量是一切AI的起点。
2. 多层非线性变换
这里是最容易吓跑人的地方。一堆人讲“神经网络”“激活函数”,听着像天书。
说人话:你有一个原始输入(比如图片的像素矩阵)。你希望把它一步一步变换成一个输出(比如“猫”或者“不是猫”)。
每一层做一件事:把上一层的输出,加权求和,再压一下(非线性激活),传给下一层。
为什么需要多层?因为一层只能学直线分割。两层可以学折线。三层可以学任意形状。层数越多,能拟合的模式越复杂。
为什么需要非线性?如果没有非线性激活函数,堆再多层也只是线性变换,等价于一层。非线性才是“深度”能起作用的关键。
mermaid图可以帮你理解这个流程:
这个图上下两部分要连起来看。上面前向传播:输入经过多层变成输出。下面反向传播:用输出误差反过来调整每一层的参数。
本质是:你做了一个预测,发现错了,然后从最后一层往前一层一层追溯——到底是哪一层的哪个参数导致了错误,然后微调它。
3. 反向传播 + 梯度下降
这是整个学习过程的核心机制。
你随机初始化一堆参数,拿一个输入跑一遍,得到一个输出。拿输出和正确答案比,损失函数告诉你差多少。
然后反向传播:从输出层开始,一层一层往回计算每个参数对最终误差的贡献。梯度就是贡献的大小和方向。
最后梯度下降:参数朝着“让误差变小”的方向迈一小步。重复几万次、几十万次,误差越来越小。
怎么做的:链式求导。但你不必手算,框架替你做了。
为什么这么做:没有反向传播,你没法在几亿个参数里找到优化的方向。暴力搜索这辈子算不完。
解决了什么问题:让“学习”变成一个可计算的、可自动化的迭代过程。
四、一个对比让你彻底明白
拿测试场景举个例子。
传统方式判断一个界面元素是否应该可见:开发写死条件。如果用户等级>=VIP且订单状态=已支付,则显示“专属客服”按钮。规则明确,测试直接验证规则。
深度学习方式:你给模型几千张界面截图,每张标注“专属客服按钮该显示”或“不该显示”。模型自己学。
它会自己去发现:按钮显示时,往往页面右上角有某个图标、按钮文字是金色、背景有渐变。这些特征你可能根本没写在需求里。
规则系统的优劣:可解释、稳定、但漏掉复杂模式。
深度学习的优劣:能捕捉复杂模式、抗噪声、但需要大量数据、可解释性差、难调试。
你不需要在所有地方都用深度学习。只在规则写不出来、或者规则维护成本远高于数据成本的场景使用。
观点句1:深度学习的本质,是把“定义规则”转换成“提供样例”。
观点句2:反向传播是整个学习过程的导航系统,没有它,参数再多也找不到路。
观点句3:层数越深,能表达的模式越复杂,但训练难度和过拟合风险也指数上升。
五、对你现在的工作有什么用
测试工程师最容易犯的错误,是想用深度学习方法去替代已经稳定的规则系统。
登录功能不需要深度学习。边界清晰、用例可穷举,规则更好。
但是以下场景值得考虑:
- 图像识别类功能(OCR、人脸、目标检测)的测试。传统验证只能看结果对不对,很难构造覆盖所有光线/角度/遮挡的用例。引入对抗样本生成,可以自动发现模型脆弱点。
- UI自动化中的元素定位。页面结构频繁变化,用深度学习做基于图像的目标检测,比XPath稳定得多。
- 日志异常检测。规则写不全的异常模式,用无监督学习自动聚类。
- 测试用例自动生成。给模型一堆历史缺陷和对应代码变更,让它学习什么样的代码容易出bug,辅助高风险区域定位。
核心启示不是“马上去学TensorFlow”,而是开始理解三个工程原则:
第一,你的问题能不能转化为一个“输入→输出”的映射问题?输入是啥,输出是啥,数据样本够不够。
第二,接受不确定性。深度学习模型给的是概率,不是布尔值。你的断言逻辑要适配概率输出,比如置信度阈值、A/B测试。
第三,可观测性比准确性更关键。模型在线上效果突然变差,你能定位是数据分布变了,还是模型过时了?这需要监控数据漂移和模型版本。
观点句:不懂深度学习的工程原理,测不了深度学习系统。
这句话不是制造焦虑。是事实。一个模型输出的结果不对,你连是训练数据的问题、模型结构的问题、还是后处理逻辑的问题都分不清,怎么出测试报告?
六、留一个问题
你现在手上的测试任务里,有没有一个环节是这样的:你能列出几千个例子(做对了叫通过,做错了叫缺陷),但你就是写不出一条清晰的、不漏的规则来判断?
如果有,你已经在面对一个“深度学习适合解决的问题”。
问题不是“要不要学深度学习”,而是“你现在的测试方法,还停留在规则时代多久了”。
你怎么判断一个场景该用规则还是该用数据驱动?