资讯详情

资讯详情

人工智能导论:从搜索算法到机器学习的AI入门必修课

“在软件学院当了两届人工智能导论课助教之后我越来越确定一件事这门被很多新生当成‘混学分’的课其实是大学四年里被低估得最厉害的一门课。”这不是客套话。人工智能导论在课程表里的位置很特殊它是必修课但又不像操作系统、计算机网络那样有硬核代码量它讲的东西看起来都能听懂可一到作业和考试很多人就懵了。于是每年的选课评价都会出现两极分化——有人觉得是“水课”有人却把它列为大学期间收获最大的一门课。我写这篇内容就是想把人工智能导论这门课从“听说”拆到“门儿清”它到底讲什么作业项目怎么做才能少踩坑零基础怎么自救以及结课之后真正剩下来的是什么。适合正在选课或即将上课的同学也适合想自学入门、但不知道从哪里开始的朋友参考。1. 一门导论课为什么让软件学院学生又爱又恨1.1 它在整个课程体系里的位置很多同学第一次看到“人工智能导论”这门课心里想的是“终于有个听起来前沿的课了”。但打开教材目录就会发现前几章讲的是搜索算法、博弈树、知识表示这些“八竿子打不着”的东西和想象里的“AI”完全不一样。这里面的原因其实很实际。软件学院的专业课体系通常分三层底层是数学和程序语言中层是数据结构、算法设计、数据库这类通用能力上层是操作系统、计算机网络、软件工程这些系统能力。人工智能导论的位置很尴尬——它既不属于底层也不完全属于上层而是横在“算法”和“应用”之间的一座桥。它的课程目标不是培养你成为算法工程师而是让你建立一套“智能系统是怎么被设计出来”的整体认知。换句话说它要回答的问题是给定一个任务如何把求解过程形式化让计算机能够处理。这个能力才是后续机器学习、计算机视觉、自然语言处理这些进阶课程真正的起点。我在答疑课上经常问新生一个问题如果让你写一个程序让电脑自己学会下五子棋你会怎么拆解绝大多数人的第一反应是“用机器学习”“用神经网络”。这不能说错但人工智能导论想让你先理解另一条路能不能把下棋规则、每一步的输赢可能性都显式地表达出来通过搜索来选定策略。理解了这条路你才明白为什么后来会有机器学习——因为显式规则在很多场景下太难写了。1.2 导论课和“机器学习”课真正的区别不少同学以为人工智能导论就是机器学习的删减版选课之前还专门去补了线性回归和梯度下降。等上课才发现机器学习只是这门课三分之一左右的内容而且讲得很浅。这里我得帮这门课说句公道话。人工智能这个学科的历史比我们想象的长得多早期研究者试图解决的核心问题是人和计算机的区别到底在哪里这个问题催生了不同的阵营——符号主义者觉得智能就是符号推理连接主义者觉得智能来自大量神经元的连接行为主义者觉得智能体现在与环境交互。人工智能导论的教学主线其实就是在把这些流派按时间顺序讲一遍。先是搜索和逻辑推理然后是基于知识的专家系统再然后是统计学习方法最后简单提一下深度学习和强化学习。它不是“机器学习入门”而是“人工智能学科入门”。理解了这一点你就不会因为某个章节暂时用不上就觉得它在凑课时。如果说机器学习课是教你一把刀的打磨方法那人工智能导论课就是带你逛一遍整个厨房有哪些锅哪些灶各自解决什么问题为什么后来大家都爱用某一种锅。等你真正进了机器学习课才会知道自己其实站在哪个位置该往哪个方向练刀工。2. 课程三条主线搜索、知识表示与机器学习2.1 搜索从八数码到对抗搜索人工智能导论的第一个大模块通常是搜索算法。很多同学不理解搜索明明在数据结构课上学过为什么还要单独开一个模块来讲。但这里的搜索和操作系统里的文件搜索、数据库里的索引查询完全不是一回事。课程里经常用“八数码问题”开场一个三乘三的盒子八个格子有编号一个格子空着通过移动方块恢复成目标排列状态。这个问题看起来像玩具但它的实质是把“从初始状态到目标状态”的路径求解变成一个图搜问题。关键是理解状态空间这个概念每一个排列都是一种状态每次移动都是从一种状态跳到相邻状态你的任务是找到一条最短路径。这里最容易忽略的细节是“状态去重”。很多第一次实现宽搜的人写的代码把所有展开过的状态存成一个列表每次查找用线性遍历结果八数码稍微复杂一点就慢到怀疑人生。正确做法是用哈希把状态编码成整数用集合记录已访问状态这样才能保证每个状态只被展开一次。我见过太多同学在这里卡住明明算法逻辑没问题就因为数据结构粗糙程序跑不动。这不是搜索算法的问题而是工程意识的问题。后续课程会从盲目搜索过渡到启发式搜索。A星算法是第一个真正让同学们觉得“有点东西”的算法。它的核心是一个评估函数由两部分组成从起点到当前点已经花费的代价加上从当前点到终点需要代价的估算值。关键是这个估算值必须满足“一致性条件”否则算法可能给出次优解。很多同学直接用欧氏距离做启发式函数看起来没问题但放到网格地图里就可能失效原因就是估算值超出了真实代价。课程里另一个让人头疼但是收获很大的模块是“对抗搜索”。简单说象棋、五子棋这类游戏里两个对手轮流行动你和对手的目标是相反的。最直接的思路是极小化极大搜索遍历所有可能的局面当前玩家选收益最大的节点对手选让你收益最小的节点。但纯粹遍历组合爆炸所以需要配合裁剪方法——如果你已经找到了一个足够好的走法而某个分支里对方已经能让你得到更差的结果那这个分支剩下的节点就不需要继续看了。我第一次实现对抗搜索的时候傻乎乎地把整个博弈树都展开了结果五子棋棋盘稍大一点就爆内存。后来才明白课程让你写这个算法不是为了让你真的在游戏里无敌而是让你体会一个核心思想面对完全理性且对立的对手时如何用“最坏情况下的最好结果”来定义最优决策。这个思想在后面做强化学习、做多智能体系统的时候会反复出现。2.2 知识表示与专家系统的兴衰第二个大模块是知识表示和逻辑推理。这一段大概是整门课里“画风最老”的部分教材里会出现一阶逻辑、产生式规则、语义网络这些术语。不少同学上课的时候觉得这些内容又抽象又过时但到了考试复习才会发现这一块反而是拿分最容易的地方。知识表示要回答的核心问题是为了让人工智能系统能够推理你该用什么结构把人的知识装进去。早期研究者做过这样的尝试把你需要领域专家总结规则比如“如果体温大于38度且喉咙发炎则可能是上呼吸道感染”然后用一堆这样的规则组成一个专家系统系统输入事实通过规则向前或向后推理得出诊断结论。为什么会讲这个内容因为它是“符号主义”思想的典型产物也是人工智能历史上最成功的早期应用之一。但老师往往会花一节课去分析它为什么衰落规则是脆弱的遇到规则里没有覆盖的边界情况就无能为力获取规则又极依赖专家成本极高而且规则数量多了之后推理性能会急剧下降。你站在今天回看这段历史恰恰解释了一个反直觉的事实你在智能音箱、推荐系统里看到的AI能力其实不是靠写规则写出来的而是靠从数据里“学”出来的。这一章的难点不是概念而是怎么把一个生活问题“形式化”。比如期末考试里可能会出这样的题给你几个谓词让你表示“所有人类都会死”这句话或者给你一组事实和规则让你判断某个结论是否成立。很多同学在这里丢分不是因为不会谓词逻辑而是因为平时根本没有练习过“把自然语言翻译成逻辑表达式”的思维方式。我的建议是不要死记硬背多找几个生活例子练手比如把“小明要么去图书馆要么去食堂”写成一阶逻辑表达式练完你就知道坑在哪里了。2.3 机器学习入门第一次接触“从数据中学规律”从这一章开始画风彻底变了。前面还在跟逻辑、规则打交道到这里突然变身统计学。课程通常从最简单的监督学习讲起典型的案例是垃圾邮件分类或手写数字识别用到的算法是朴素贝叶斯、决策树、K近邻这些比较基础的模型态度很克制不会一上来就上深度神经网络。我要特别提醒零基础的同学这一章里最容易被绕进去的不是算法而是评估指标。准确率看起来最好理解比如一封邮件判断是否正确对所有邮件算一下正确比例就行。但如果一个数据集有90封正常邮件、10封垃圾邮件你就算直接把所有邮件都判断为正常准确率也能到90%。这类问题在真实场景里更严重所以课程里一定会引出精确率、召回率和F1这几个概念。很多同学一开始不理解为什么不能用准确率直到我举了一个“银行交易诈骗检测”的例子——诈骗交易占比可能只有万分之一直接全部放行准确率也有99.99%但银行会亏死。这时候大家才明白指标的选择取决于“少数的错误带来多大代价”。手写数字识别通常是这一模块的标配作业。大多数人的第一次实现都会踩一个经典的坑测试集和训练集的数据划分混乱导致模型表现虚高。比如有人偷懒直接按文件顺序切分前面一部分做训练后面一部分做测试但数字分布不均匀测试里“1”特别多模型就变得偏爱预测“1”。这不是模型的问题是实验方法的问题。真正严谨的做法是先做随机打散再做分层划分保证训练集和测试集里各类数字比例接近。做完这一步你会发现模型性能往往比之前的“虚高”成绩要低一些但那才是真实的水平。这一章还会引入“过拟合”和“欠拟合”这两个概念。老师说得很形象过拟合就像学生背答案平时练过的题全会考试换一种问法就抓瞎欠拟合就像学生只学了个大概连平时练过的题也答不对。考试里常考你怎么判断这两种状态以及怎么缓解。缓解过拟合的手段无非是加正则、减少特征数量、增加数据量、交叉验证这几种理解它们背后的逻辑比背定义更重要。3. 作业与小项目里的真实翻车现场环境、算法、报告3.1 环境配置把时间花在刀刃上每次课程项目发布之后我的答疑邮箱就会收到大量问题其中约有一半属于“环境配置”类。Python版本对不上、某个第三方库安装失败、在命令行能跑但提交后运行报错……这些问题在助教眼里不算什么大事但对第一次做项目的同学来说确实是最大的拦路虎。我的建议是项目开始前先花半天时间把统一环境搭好不要一上来就跟着博客教程东装一个组件西装一个插件。最省事的路径是创建一个干净的虚拟环境把课程要求的依赖一次性装好然后立刻跑通课程提供的基础代码。如果跑不通优先检查Python版本和依赖版本而不是怀疑自己的机器不行。很多人栽在一个细节上文件路径里有中文或者空格。某个同学的项目花了两天找不到原因最后发现是代码里写了相对路径运行目录和项目目录不一致造成所有数据文件都加载失败。这种问题很基础但每年都有大量同学中招。所以在答疑时我总会先问三件事运行在什么目录下环境变量是不是继承了之前项目的老配置数据文件到底有没有放到预期位置这三问能解决一半以上的“玄学问题”。另外如果课程明确说用某个特定版本的框架或库就老老实实用那个版本。不要试图用最新版本“顺便升级一下”因为旧项目的代码未必兼容新接口你会在毫无意义的版本迁徙上浪费大量时间。这个教训我每学期都要重复。3.2 搜索类作业的经典翻车剪枝没用好搜索类作业最经典的场景是按题意实现八数码求解器统计扩展节点数和运行时间并分析启发式函数的效果。第一个常踩的坑是状态比较和去重。前面提过答案要用哈希集合存状态但很多人把状态表示成字符串然后直接丢进集合做判断。这带来两个问题一是编码没有统一规范两个等价状态可能因为空格位置不同被视为不同状态二是字符串拼接的性能不太好在数据规模很大的时候差距明显。更合理的做法是用整数编码把三个数字合成一个状态键。这一步虽然不复杂但能直接让你的程序快出一个数量级。第二个坑是A星算法里启发式函数设计得不合理。很多人选择错误地统计“有多少个方块不在目标位置”而正确好用的是“每个方块当前位置到目标位置的曼哈顿距离之和”。两者的区别在于前者完全没有利用“方块需要移动多少步”的信息导致启发值偏小扩展很多节点后者更贴合真实代价搜索效率高很多。老师通常不直接告诉你用哪个而是让你在报告里对比不同启发函数的效果。第三个坑是五子棋对抗搜索的剪枝实现里很多人把“父节点已经得到的值”传错了层级。极小化极大里最难讲清楚的是裁剪时保存的是当前路径上已经确定的边界值而不是全局最优值。不少同学对着代码看半天觉得自己写对了结果发现某些棋局中电脑会下出“送分棋”排查后才发现是把上下界变量的作用域搞错了。遇到这种情况优先在日志里打印每一步搜索的深度和评估值用一个小棋盘复现问题别盯着整个代码干瞪眼。3.3 报告老师到底在看你写什么人工智能导论的作业和项目报告分数占比往往不少。而报告恰恰是最多同学表现失常的地方——他们算法写得还行但报告像流水账算法、流程图、代码、结果贴一遍就完事最后拿个不上不下的分还不知道差在哪儿。以我批报告的经验老师想看到的不是“我怎么写的代码”而是“我怎么想这个问题的”。一份好报告至少要包含三个部分问题建模、方案对比与论证、失败与调优过程。问题建模部分要写清楚状态空间怎么定义、状态转移什么条件下发生方案对比要讲明白为什么用启发式搜索而不用单纯宽搜启发函数为什么取这个形式调优过程则要诚实记录你遇到的坑和改法。很多同学觉得“失败过程”写进报告会扣分恰恰相反写清楚反而加分。因为设计一份高质量报告的底层逻辑是证明你已经掌握了评估与迭代的思路——这是工程师很重要的素养。当然光说结论还不够要放数据和图表不同剪枝方式下的扩展节点数、使用不同距离度量时的路线长度、不同参数下的准确率变化。这些图表的背后才是你真正做过实验的证据。4. 零基础自救指南数学、编程与“调包”的边界4.1 数学到底需要多少很多同学听说人工智能导论涉及数学先吓退一半。其实从课程实际内容来看这门课的数学要求不高只要把几个核心概念吃透就够用。搜索部分基本不需要高等数学只需要理解图论里的节点、边和路径知识表示部分需要一点点集合论基础机器学习部分会用到微积分里的偏导数、线性代数里矩阵向量、概率论里的条件概率。听起来很宽但深入程度都很浅。比如梯度下降你只需要知道它是沿着函数的负梯度方向迭代寻找最小值不需要手工推导复杂函数的二阶导。我的建议是不要系统复习线性代数或概率论的整本书而是带着问题去补看到“向量内积”就查一下几何意义看到“条件概率”就查一下贝叶斯公式看到“矩阵乘法”就回顾一下行列含义。用问题驱动的学习方式效率高得多。遇到实在不理解的数学概念先在代码里跑一跑看看每一步输入输出变成什么样很多时候代码跑通了数学直觉也就有了。我在答疑时见过一个特别极端的例子有个同学线性代数挂过科但人工智能导论学得不错最后还拿了高分。他的方法很朴素每次看到符号先不焦虑把符号写成具体数字算一遍找规律然后把规律理解成一句话。比如“权重矩阵是特征的线性组合方式”这样一句话比记住整个推导过程都管用。4.2 先手写一次线性回归再谈用框架这可能是我想给零基础同学强调的最有价值的一条经验在接触任何现成机器学习库之前先自己从零手写一次简单的线性回归模型。为什么因为直接用封装好的库你会觉得训练模型就是“三行代码跑完”根本看不到里面发生了什么事。而手写一次哪怕只是在二维数据点上拟合一条直线你也会亲眼看到随机初始化参数、计算预测值和真实值的差距、朝梯度下降的方向更新参数、模型逐渐收敛。这个过程本身能把数学公式和程序代码牢牢焊在一起。具体来说你可以打开编辑器自己实现一个只处理二维特征的线性回归类。初始化两个参数写一个前向计算函数再写一个计算损失和梯度的函数最后写一个梯度下降的循环。数据可以用课程提供的小数据集或者自己随手生成几十个点。跑完之后画出一条直线和散点图的对比图你会对麦克劳林展开之外的那些抽象公式有完全不同的感觉。手写完成之后再去看别人封装好的线性模型你会觉得它的用法非常自然。因为你知道它的内部是什么就不会在学习其他算法时只靠“背 API”来撑过作业。4.3 “调包侠”与“造轮子”的边界到底在哪人工智能领域入门最大的诱惑就是调包。一个分类任务导入一个库调用一下函数准确率直接90%以上看起来非常有成就感。问题是如果所有的作业都靠这种“黑盒调用”完成结课后你会发现自己对算法的理解非常空洞换个任务依然不知道从哪里开始。但另一个极端也不可取有些人认为“必须从零实现所有算法才算会”结果每个项目都耗费大量时间研究底层细节最后连课程的进度都跟不上。这两者之间其实有个清晰的分界线——课程要求实现的算法一定要手写一遍可以调用的库限定在数据加载、可视化、指标计算这些非核心环节。比如学朴素贝叶斯的时候手写完整实现并不算太难你完全可以自己做。但当你只是为了验证一个预处理思路时何必重写一个已经存在且测试充分的库呢真正专业的做法是把时间花在问题理解和数据处理上而不是重复别人做好的轮子。课程项目考察的是你有没有能力把问题建模成一个可计算的流程并不要求你从零刻出每一个零件。我在做项目验收时发现那些被一顿猛夸的同学往往有一个共同特点他们能用一两句话讲清楚每个模块为什么存在他们自己写的代码和调用的东西之间边界在哪里。这种“知道自己在干什么”的能力比写出多漂亮的代码更重要。5. 结课后留下的比分数更值钱的思维资产5.1 状态空间视角把问题变成“找路径”课程结束后我发现最大的变化不是学会了几种算法而是看待问题的角度变了。以前遇到一个自动化问题我第一反应是“找公式”或“找规则”学完人工智能导论之后我的第一反应是“这个问题的状态是什么初始和目标的差异是什么中间有哪些动作”。这个“状态空间视角”在所有领域都通用。比如说做一个表单校验系统你可以把它看作在一个输入空间里搜索合法状态的过程做一个推荐排序你可以把它看作在候选集状态上做策略选择的过程。虽然具体实现可能和搜索算法关系不大但那种“把问题形式化、可计算化”的思维模式会一直留在你的工具箱里。我还记得课程最后一堂讨论课上老师给了个开放问题如何设计一个人工智能系统来管理个人时间。大部分人的第一反应是“做一个智能推荐系统”或者“做一个聊天机器人帮忙排日程”。但当讨论深入之后大家开始意识到时间管理本质上是一个约束满足问题——你的时间槽就是变量各任务的时长和优先级就是约束要在这些限制下找出一组可行安排。那一刻整门课的内容一下子串起来了搜索、约束、规则、优化全都在这个例子里汇合。5.2 后续方向和我的个人建议结课后如果你发现自己对机器学习那段内容特别有兴趣那直接去学机器学习专业课、深度学习相关课程如果你对搜索和逻辑推理感兴趣可以在算法设计、复杂度分析方面继续深入如果你对对抗搜索着迷可以考虑强化学习方向。人工智能导论最大的价值之一就是给你一张足够大的地图让你找到最想深入的那块区域。按我的经验学完大半个学期的人工智能导论一个很有价值的学习方法是“复述练习”试着不看教材给室友或同学讲一遍“为什么搜索需要启发式函数”“为什么专家系统后来不吃香了”。如果能讲得让外行也听懂那你就是真的理解了。这个练习不需要额外花太多时间但效果极其显著比多做一套模拟题有用得多。这门课不保证你毕业之后能立刻找到AI相关的岗位但它能在你面对一个复杂问题时多给出一条清晰的思考路径“这个问题能不能拆成状态和动作能不能从数据中学到规律要不要考虑对抗和不确定性”我觉得这门课最高级的地方恰恰在这里——它不逼你立刻成为一个精通算法的高手而是先帮你在心里装下一个足够大的AI学科框架以后再往里填东西都不会迷路。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →