ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从ABC理论到猫狗识别:AI课程作业的完整实践与反思

从ABC理论到猫狗识别:AI课程作业的完整实践与反思 这学期本来只是想水一门人文选修性质的人工智能导论结果作业3直接给我整不会了。前两次作业还是写写搜索树、调一调线性回归到第三次大作业老师一次性塞了三件事第一用书面形式把生物智能、人工智能、计算智能的层次关系——也就是很多教材里提到的ABC理论——讲清楚第二独立完成一个猫狗识别的图像分类项目提交代码和报告第三结合自己使用ChatGPT完成课程论文的体验讨论认知债务这个概念。看起来是三个独立任务实际上是一条从认知框架到工程实践再到伦理反思的完整链路也正是这条链路让我彻底改变了对人工智能四个字的理解。这篇文章把我完成作业3的整个过程、踩过的坑、最后的思考都写出来不管你是正在上AI课的学生还是想自学入门、准备相关毕业设计的学习者都值得参考。尤其适合那些拿到一个AI课程大作业不知道该从哪下手、跑完模型不会做进一步分析的读者。1. 作业3的第一道门槛ABC层次关系不是背概念1.1 生物智能、人工智能、计算智能到底怎么分层ABC理论里的A是Artificial Intelligence人工智能B是Biological Intelligence生物智能C是Computational Intelligence计算智能。我第一次看的时候以为是按字母表排的层级后来仔细读教材才发现层次关系并不是从A到C而是外延从B到A再到C逐层收窄。生物智能是所有生命体在自然演化中形成的感知、决策、学习、适应能力的总和。单细胞生物的趋光性、蚂蚁的群体协作、鸟类的迁徙记忆、人类的语言和抽象思维都属于生物智能的范畴。它最大的特点是没有一个明确的设计者是在亿万年自然选择中通过试错涌现出来的能力而且始终在适应不断变化的环境。人工智能是人类通过工程手段构造的、能够表现出智能行为的系统。它的外延比生物智能小得多因为目前所有AI系统都是面向特定任务的。哪怕是ChatGPT这样看起来什么事都能聊几句的大模型本质上也只是在优化预测下一个token这个单一目标只是这种优化在超大规模数据和参数的加持下涌现出了让人误以为通用的能力。计算智能则是人工智能的一个子集特指那些从生物系统和物理系统中获得启发、以计算过程为核心机制的智能方法典型代表包括神经网络、模糊系统、进化算法、群体智能等。换句话说人工智能里面的逻辑推理、知识图谱那一支并不算计算智能而深度学习这种基于大规模矩阵运算的方法才是计算智能的主力。我在作业里画了一个包含关系的韦恩图来理解三者计算智能的圆完全落在人工智能的圆之内人工智能的圆又完全落在生物智能的圆之内。这个包含关系在课堂讨论时有过一点争议——因为智能是否必须来自生物体本身是一个哲学问题——但在课程层面老师要求掌握的就是这个经典的层次框架。1.2 为什么ABC框架是读懂一切AI争论的标尺如果只是把上面那段话背下来这个作业就白做了。我后来发现ABC框架最值钱的地方在于它能用来解释AI圈子里绝大多数争论的根子。比如深度学习和符号AI谁才是未来这个争论用ABC的视角看其实是计算智能内部两条技术路线之争连接主义神经网络和行为主义强化学习倾向于通过大量数据和算力来拟合智能行为符号主义则更靠近传统AI的逻辑推理传统。它们都属于计算智能的范畴只不过是从不同角度去模拟生物智能的机制。再比如AI会不会取代人类这类讨论。如果你脑子里有ABC层次关系就会本能地意识到当前所有AI包括大模型都停留在计算智能层面。而人类拥有的生物智能除了理性计算还包含情感体验、道德判断、身体感知、创造力等无法被规约为单一目标优化的东西。这不是说AI永远做不到而是说取代人类这个命题本身混淆了ABC三个层次的具体指向。我在报告里用了一个比喻计算智能像是一个计算力极强、但只擅长按规则做题的速算选手人工智能像一个会运用各种算法解决具体问题的工程师而生物智能则是既有速算能力、又知道什么时候该算什么时候不该算、还会为自己算出的结果负责任的那个决策者。这个比喻不一定严谨但至少让我的认知理顺了很多。1.3 作业里最容易写错的概念辨析这部分是我在互评环节看了七八份同学作业之后总结出来的高频错误写出来给大家避雷。第一个错误把计算智能等同于算力。计算智能是算法方法论不是硬件性能。GPU集群提供的是算力而神经网络训练框架里的反向传播算法、注意力机制这些才属于计算智能的范畴。第二个错误把人工智能包含生物智能的包含关系画反了。从概念外延上说是生物智能包含人工智能人工智能又包含计算智能——因为AI的技术灵感来自生物系统它只是对生物智能的一种工程模拟。很多人的韦恩图画成了AI的大圈套住生物智能的小圈这个方向完全反了。第三个错误把智能和思维混为一谈。生物智能是整个生物体应对环境的能力不是只有大脑的思维能力。植物的趋利避害、细菌的趋化运动都是生物智能的表现但它们根本没有人类意义上的思维。理解这个区别才能理解为什么计算智能方法研究神经网络而不是研究机器如何像人一样思考。把这三个易错点理清之后作业的第一问基本稳了。接下来就是动手环节也是我认为整个作业3最花时间的部分。2. 从概念到代码复现一个猫狗识别全流程2.1 选猫狗识别的理由它是AI课程的hello world作业里有一个子任务是自定义一个计算机视觉分类项目并完成训练评估。班里有同学选了表情识别、实时手势分类也有人选街景号码识别。我选了最经典的Dogs vs Cats猫狗分类原因有两个。一是这个任务恰好踩在ABC三个层次的交叉点上。对人类来说识别猫和狗是生物智能层面的本能两三岁的小孩就能区分对机器来说要实现这个能力需要构建一个感知模型这是典型的计算智能方法卷积神经网络而把这个模型封装成可用的应用则落在人工智能的工程层面。一个任务同时打通了ABC三层作为课程作业非常合适。二是数据集质量好、易获取。Kaggle上的Dogs vs Cats数据集有25000张标注好的图片猫狗各半类别均衡不用在数据清洗上花太多精力。而且图片基本来自日常场景背景杂、姿态多、光照不均这些不干净反而有利于暴露模型泛化能力的问题——对后续分析过拟合特别有用。2.2 环境配置与数据准备我的实验环境如下列出来供参考操作系统Ubuntu 20.04Python3.9.12深度学习框架PyTorch 1.12.1 CUDA 11.3GPU单张RTX 3060 12GB图像处理库Pillow 9.0、OpenCV 4.5辅助工具Scikit-learn 1.1用于混淆矩阵和分类报告环境配置环节有一个警告不要直接pip install torch了事一定要先确认显卡驱动版本和PyTorch编译时的CUDA版本是否匹配。我一开始图省事用pip默认装的是CPU版PyTorch训练一个epoch要7分钟后来换成CUDA版同样的epoch只需要40秒差了十倍不止这个差距直接决定了作业迭代效率。数据准备方面我按7:2:1把25000张图分成训练集、验证集和测试集。预处理做三件事统一缩放成224×224用ImageNet的均值和标准差做归一化训练集上加了随机翻转、随机裁剪和颜色抖动作为数据增强。验证集和测试集不做增强只做缩放和归一化。这里有个特别容易忽略的细节数据增强一定只能用在训练集上。如果验证集也做增强相当于对真实数据引入了额外噪声用它判断模型好坏会严重失真。我第一版代码里图省事把同样的预处理函数同时应用在验证集上结果验证准确率波动特别大一个epoch高了三个点下一个epoch又掉回去我还以为是模型的问题排查了半天最后才发现是数据管线的锅。2.3 从三层CNN到迁移学习两个方案的对比实验作业要求至少实现一个模型并分析性能。我做两个方案一个是从零搭一个三层卷积网络另一个是迁移学习微调ResNet18。两个方案的对比本身就构成了一份很有意思的分析报告。自己搭的CNN结构很朴素Conv2d(3, 16, 3) ReLU MaxPool2d(2) Conv2d(16, 32, 3) ReLU MaxPool2d(2) Conv2d(32, 64, 3) ReLU MaxPool2d(2) Flatten Linear(64×26×26, 128) ReLU Dropout(0.5) Linear(128, 2)训练超参数batch size 64优化器Adam初始学习率0.001交叉熵损失总共训练30个epoch学习率在第15和第25个epoch时降为原来的十分之一。这个方案在验证集上最终达到了大约87%的准确率。坦白讲对猫狗识别这个问题87%只是中等偏下的水平。因为猫和狗的图像里共享大量背景特征——草地、沙发、玩具——模型很容易依赖背景做判断而不是真正学到猫和狗的形态差别。第二个方案用PyTorch内置的ResNet18把最后的全连接层换成输出维度为2的分类头冻结前面的卷积层只微调最后两个残差块和分类头。初始学习率0.0005batch size同样是64只训练10个epoch就收敛了验证集准确率到了96.2%。两个方案的差距相当直观参数多、结构深的预训练模型在数据量不算大的情况下性能远远胜过从零训练的小模型。这正是迁移学习在计算智能方法中的典型示范——用在海量数据上预训练的通用特征迁移到具体任务上做微调相当于给模型配了一个先验经验而不是让它从一张白纸开始学。2.4 结果分析准确率之外还要看什么交作业不是跑完准确率就完事了。为了让报告有深度我额外做了三个分析。一是画混淆矩阵。测试集上模型把猫识别成狗的比率是2.8%把狗识别成猫的比率是4.0%也就是说狗更容易被误判成猫。我回去翻错误样本发现被误判的狗大多是小型犬比如吉娃娃、博美这类体型和猫非常接近脸型、毛色在某些角度下跟猫高度相似。这个观察在报告里写出来后老师给了个分析得不错的批注。二是可视化错误样本。我挑出6张预测错误的图片逐一分析背景、姿态和遮挡情况。其中有一张图是猫趴在狗窝里模型看到狗窝的背景就直接判成了狗。这说明模型确实在学背景和目标之间的关联它的决策逻辑跟人类靠生物本能形成的识别方式根本不是一回事这也正好呼应了ABC框架里计算智能和生物智能的差异。三是做了一个简单的消融实验把数据增强关掉重新训练三层CNN验证准确率从87%掉到了81%。这个结果让我直观地感受到数据增强对泛化能力的实际价值也为后面要说的过拟合问题埋下了伏笔。3. 两轮调参之后我梳理出的三个典型翻车现场3.1 CUDA环境不匹配症状、根因与修复这是我遇到的最耗时的坑。症状是程序启动不到10秒就报错CUDA error: no kernel image is available for execution on the device第一次看到这个报错我完全懵了。代码是照着教程写的理论上不会有问题但PyTorch就是不认我的显卡。我按下面这个思路排查第一步用nvidia-smi查看显卡驱动版本显示驱动版本是470系列支持的最高CUDA版本是11.4。第二步检查PyTorch的编译信息发现我用的是官方默认的1.12.1版本对应的CUDA编译版本是11.6。第三步推断问题出在PyTorch的CUDA kernel和当前驱动环境的兼容性上——RTX 3060是Ampere架构PyTorch的CUDA 11.6编译包按理说能识别但470系列驱动对某些kernel的加载确实存在问题。解决方法是把PyTorch换成CUDA 11.3编译的版本重新安装pip install torch1.12.1cu113 torchvision0.13.1cu113 --extra-index-url https://download.pytorch.org/whl/cu113装完后再验证python -c import torch; print(torch.cuda.is_available())输出True问题解决。这个坑的教训是遇到CUDA报错先查显卡型号、驱动支持的CUDA版本、PyTorch编译的CUDA版本三者之间的匹配关系。很多人一看到CUDA报错就重装驱动大概率没用因为根源往往是PyTorch版本和驱动不兼容而不是驱动本身坏了。3.2 数据增强过头loss卡在0.69的排查过程第二个坑出现在尝试提高三层CNN性能的时候。我把随机裁剪范围从原来的0.8到1.0扩大到了0.5到1.0同时还加了更强的颜色抖动。结果训练不到一个epochloss就卡在0.69附近不动了验证集准确率只有50%接近随机猜测。0.69这个数字非常有特征——它接近于ln(2)0.6931恰好是二分类交叉熵在模型完全无法区分两个类别时的理论值。也就是说模型在摆烂完全没学到任何有效特征。排查分三步。第一步关掉所有数据增强用原始图片直接训练loss正常下降说明模型本身没有问题。第二步逐步恢复不同的增强策略发现罪魁祸首是随机裁剪范围太大。很多猫狗的图片中主体只占画面的一小部分如果裁剪窗口缩小到原图的0.5很容易只裁到背景导致标签和图像内容完全错位——模型看到的是一张标着cat但实际上只有草地和沙发的猫图这等于是在喂噪声给模型。第三步把随机裁剪范围回调到0.75到1.0同时保留适度的颜色抖动和随机翻转loss很快就降到了0.2以下。这个坑的本质是数据增强的目的是在保持语义不变的前提下扩充样本多样性。一旦增强强度过大、破坏了图像内容和标签之间的语义对应关系增强就从帮手变成了毒药。做数据增强时不要贪心每个增强操作的幅度要单独调试。3.3 过拟合训练集99%验证集80%的教训用三层CNN训练到第20个epoch时训练集准确率已经冲到99.3%验证集却只有81.2%这是教科书级别的过拟合。看损失曲线会发现一个很典型的开口剪刀形状训练loss一路降到0.03附近但验证loss在第10个epoch触底后开始缓慢回升之后两个loss曲线明显分叉。针对过拟合我一共做了四件事一是添加Dropout。在全连接层前加一个概率0.5的Dropout验证集准确率提升了约两个百分点。二是开启数据增强。把随机翻转、随机裁剪、颜色抖动都加上训练样本的多样性提高了过拟合被明显抑制大约又提升了三个百分点。三是早停。监控验证loss连续3个epoch没有下降时停止训练并回滚到验证loss最低的那个模型避免最后10个epoch白白浪费。四是在Adam优化器上加L2正则也就是weight_decay1e-4。效果相对较弱但聊胜于无。四管齐下之后三层CNN的验证准确率从81.2%提升到了87%左右过拟合得到明显缓解。我在这部分总结了一条经验当训练集和验证集准确率差距超过10个百分点时别急着加数据、调学习率优先检查正则化手段是否到位。4. 作业之外的延伸偏见、认知债务与AI落地的真实距离4.1 人工智能偏见模型只是数据的镜子作业3的最后一个主题是写一篇反思性短文。我写的话题是人工智能偏见。在完成猫狗识别项目过程中我其实已经隐约感受到了偏见产生的机制假设一个猫狗数据集里所有猫的图片都是白色背景那模型在白色背景的猫图上表现好在杂色背景的猫图上就会变差。这种性能差异本质上不是算法偏见而是数据偏见被神经网络忠实学到并放大了。现实中的问题比猫狗识别严重得多。人脸识别系统如果训练数据以某一肤色人群为主对其他人群的识别准确率就会出现明显下降招聘算法如果以过去十年的录用记录作为训练数据就很可能把历史招聘中存在的性别或地域偏好自动学进模型里。更麻烦的是模型还会把这种偏好包装成看似客观的预测结果普通人很难察觉背后的统计规律。用ABC框架来分析这个问题的根源在于计算智能层面对智能的定义是在给定训练分布上拟合输入到输出的映射而生物智能层面的公平、正义这些价值判断根本不在这个优化目标里。所以在设计AI系统时仅靠技术手段——调整损失函数、做数据平衡——只能缓解一部分偏见更根本的是要在定义问题的阶段就把伦理考量放进去。这不是什么高深的觉悟而是做完这个作业顺理成章的反思。4.2 认知债务用ChatGPT完成作业的利与弊认知债务这个词是我第一次在老师发的阅读材料里看到的。它的定义大致是当我们过度依赖AI助手完成认知任务时虽然短期内效率很高但长期会积累一种债务——因为跳过了主动思考、检索、推理、犯错、修正的完整认知过程我们对知识的理解深度和对问题的判断能力会逐渐下降。说实话读到这个概念时我心里一紧因为我当时正打算让ChatGPT帮我润色作业报告。后来我调整了用法先自己完成ABC理论的框架梳理、猫狗识别的实验和错误分析再让ChatGPT帮我把一部分表述改得更学术化最后自己逐句审查所有改动。这样做的体验是AI确实提高了效率但并没有替代我的思考——核心的推导和结论都是我自己得出来的AI只负责帮我优化表达。这个经验我写进了报告里顺便给作业提了一条实操建议使用AI工具时应该让AI当提词器而不是代笔人。让它帮你补充术语、改进句式、检查逻辑漏洞都可以但如果你自己都无法解释报告里每一句话背后的逻辑那这篇报告就不应该署你的名字。我在最后一句写道认知债务的利率很高它最终会用来偿还你未来解决问题的能力来结算。这句被老师划了波浪线。4.3 从作业到产业AI项目与课程作业的差距写完反思短文后我还没收手额外查了查人工智能在制造业落地、智能体应用这些产业话题想看看真实的AI项目和课程作业之间到底隔多远。结论是隔了一整条工程化链路。作业里数据是老师准备好的模型是经典结构评估看准确率就够了跑通就有分。但在制造业AI质检系统里数据需要从生产线上的几百个摄像头实时采集标注需要和工艺工程师反复对齐什么样的划痕算缺陷模型要在光照忽好忽坏、机体振动、工人操作不一致的严苛环境中保持稳定还要精确估算一个误判会带来多少经济损失。这些内容课程作业里连边都摸不到。我给自己的结论是课程作业最重要的价值是帮你建立起从问题定义到算法选择再到结果评估的完整思维框架。这个框架是通用的不管以后做推荐系统、自然语言处理还是机器人控制都用得上。而真正的项目能力也就是定义问题、处理真实数据、权衡成本与收益、上线后持续迭代的能力需要在实际工程中慢慢锻炼这恰好是下一门课和实习要解决的问题。写完这门课的作业3最深的感受是AI课程作业的价值不在于最后跑出了多高的准确率而在于它在多大程度上逼着你把智能这个词拆开来看。ABC理论给了我一个分类框架猫狗识别让我亲手体会到神经网络是如何从像素里一步步长出语义的对偏见和认知债务的讨论则提醒我技术的背后永远站着人。做这个作业之前我以为人工智能就是更厉害的程序做完之后我才明白程序只是工具而智能到底是什么、我们到底想要什么类型的智能才是更值得每一个人认真思考的问题。最后再分享一个做作业过程里意外养成的习惯每学一个AI概念先问自己这个概念在ABC框架里处于哪个层次——是算法、是系统、还是认知层面的问题这个问题看起来很简单却能帮你快速判断一个概念的核心归属从而更精准地找到对应的学习资料和参考文献。如果你也在上人工智能课或者正准备做类似的课程项目希望这篇经验帖能帮你少走一点弯路。
返回列表