从零学AI指南手册内容自写作之初就完全是为初学者、跨学科人员所量身打造,包括机器学习、深度学习、RAG 与Agent开发 3部分内容。 作为一个过来人和从业者,我深知大家在学习过程的难点和容易踩的坑,所以在内容的组织结构上、行文逻辑上,都完全是以一个小白的视角在进行叙述。希望对于有兴趣学习和了解人工智能的朋友一些帮助!
点击左侧菜单栏可在线阅读,如需离线阅读可按如下步骤操作。
git clone git@github.com:mlwithme/mlwithme.github.io.git # 克隆
https://github.com/mlwithme/mlwithme.github.io/archive/refs/heads/main.zip # 下载链接cd mlwithme.github.io.git
python -m http.server 8888浏览器中输入地址: http://127.0.0.1:8888/ 即可访问。
一转眼距离《跟我一起学机器学习》出版上市已经3年有余,如今第二版的内容也总算定稿了。由于在第一版内容出版之初我们便发现它并不够完美,但秉持“不要等到变完美再行动,应该在行动中变完美”的想法,最终我们还是选择了出版,因此在出版之后我们便开始继续补充和完善相关章节的内容。
有了前车之鉴,此次我们更加注重全书内容的逻辑性、严谨性和完整性,期间也参考了不少优秀材料,如《统计学习方法》、《动手学深度学习》、《The Elements of Statistical Learning, Data Mining, Inference, and Prediction》、《Machine Learning》和 Scikit-Learn 实现源码等。
同时,我们也更加严格地按照了先前提出的“5层次3阶段”学习理念框架来对《跟我一起学机器学习》第一版的内容进行修订和补充。
学习一个算法就好比遍历一棵大树上的所有枝节,算法越复杂对应的枝叶也就越繁茂。一般来讲通常有两种方式遍历这棵大树:深度优先遍历和广度优先遍历。对于有的人来讲可能适合第一种,即从底部的根开始,每到一个枝干就深入遍历下去,然后回到主干继续遍历第二个枝干,直到结束;而对于有的人来讲可能更适合第二种,即从底部的根开始,先沿着主干爬到树顶以便对树的整体结构有一定的概念,然后从根部开始像第一种方式那样遍历整棵大树。相比于第一种方式,第二种方式在整个过程中更不易“迷路”,因为一开始便对这棵树的整体结构有了一定的了解。所以,我们一贯主张:先抓主干,后抓枝节。
进一步,对于一个算法的学习,我们还将它归结成了5个层次(3个阶段):
其中,阶段一可以看成先从大树主干爬到树顶一窥大树全貌的过程,因为对于一个算法来讲最基本的就是它所对应的思想,而这也是一个算法的灵魂所在。阶段二和阶段三可以看成遍历完整棵大树后的层次,它是对算法里细枝末节的具体探索。
这样的学习顺序可以打乱吗?我们的回答是:当然可以,只有适合自己的方法才是好方法。不过,对于绝大多数人来讲,我们认为应该遵循上面这一学习顺序。不过遗憾的是现在大多数读者的学习顺序是①②④⑤③或者是①②④③⑤。这两种学习顺序的弊端在于很多算法在其数学推导过程中难度较大,当克服不了这个困难时很多读者往往就会停滞不前,而这一问题在初学者当中尤为突出。最后导致的结果便是既没有学会怎么用,也不知道为什么。
相反,我们主张先学会怎么用,再探究为什么。在学习过程中最重要的是要形成一个良好的正向循环,这样才会有继续学习下去的动力。方法论本身也远大于学习材料的选择。
学到什么时候?
对于一个算法到底应该学到什么层次同样也是初学者所面临的一个问题。可以想象,如果没有事先将一个算法的学习过程归结为这3个阶段,此时我们还真不知道该如何回答这一问题。因此我们的建议是,对于所有的算法来讲阶段一是必须完成的,对于一些相对容易的算法(如线性回归)可以要求自己达到上述3个阶段,而对于那些难度较大的算法(如支持向量机)可以根据自己的定位选择。同时需要注意的是,对于任何一个算法的学习极少人能做到学一遍就全懂的境界,所以也不要抱着学一遍就结束的想法。
因此,大家在实际学习过程中可以在第1次学习时先达到阶段一,然后在第2次学习时再达到阶段二,因为分阶段学习方式更能够使自己获得满足感,获得继续学下去的乐趣。最后,按照以上步骤进行,学习3~4个算法后,便算得上是初窥机器学习的门径了。
相较于第一版,第二版内容的主要变化在于:首先,对原有章节中的内容进行了补充和修订,以符合3阶段框架的对应内容;其次,对原第6章和第7章的顺序整体进行了交换,原第8章进行了拆分及内容顺序调整(拆分成了第8、9两个章节),原第9、10章中小节内容顺序进行了调整以符合本书叙述理念;最后,新增了第12降维算法和第13章自训练与标签传播算法,以扩充机器学习领域常见经典算法。最终形成了现在的《跟我一起学机器学习》第二版的内容,其中第1、2、3、7、10、12、13章由王成修订编写,第4、5、6、8、9、11章由由黄晓辉修订编写。同时,为了满足不同读者的学习需要,此次我们还为每个章节录制了对应的讲解视频。
本书特色
从本书成文开始,我们就尽量选择了以直白的方式阐述每个算法背后的思想与原理。尽管这看起来可能有些口语化,但极大地降低了学习门槛,尤其是对于非计算机专业的读者来讲。同时,对于一些重要而又难以理解的概念,我们也会尝试2~3次以不同的口吻进行阐述。例如在第3章中用了下面这段话阐述为什么需要用到最大似然估计:
我们知道,在有监督的机器学习中都是通过给定训练集,即$({{x}^{(i)}},{{y}^{(i)}})$求得其中的未知参数$W$和$b$。换句话说,对于每个给定的样本${x}^{(i)}$,事先已经知道了其所属的类别${y}^{(i)}$,即${y}^{(i)}$的分布结果是知道的。那么,什么样的参数$W$和$b$能够使已知的${{y}^{(1)}},{{y}^{(2)}},\cdots ,{{y}^{(m)}}$这样一个结果(分布)最容易出现呢?也就是说,给定什么样的参数$W$和$b$,能使当输入${{x}^{(1)}},{{x}^{(2)}},\cdots ,{{x}^{(m)}}$这$m$个样本时,最能够产生已知类别标签${{y}^{(1)}},{{y}^{(2)}},\cdots ,{{y}^{(m)}}$这一结果呢?
尽管这段话读起来可能有些啰唆,但只要各位读者认真体会,一定会受益匪浅。
回顾过去5年时间,人工智能领域发生了翻天覆地的变化。大语言模型的横空出世改变了人们生活的方方面面,这当然也包括了我们的学习方式以及对待传统机器学习的态度。因此我时常听见有人问到,既然现在已经有大模型了我们还有必要去学习传统机器学习算法吗?对于类似问题,我的回答一贯都是要,当然要,但又不需完全要。为什么呢?
首先,作为一个人工智能领域的从业者,毋庸置疑你应该掌握常见经典算法所有阶段一内容的学习,剩下两个阶段按需再学,因为算法本身的应用可能是其次但其背后的思想却值得我们借鉴和思考;其次,传统机器学习依然是理解现在大模型底层思想与关键技术的基础支撑,在模型训练、数据预处理中都发挥着重要作用。例如聚类、逻辑回归、TF-IDF、N-gram等在大模型数据预处理中的应用,大模型网络结构中全连接层与逻辑回归的联系、层归一化与标准化的联系以及残差连接、丢弃法与集成学习的联系等等,这些都是机器学习的影子。
自1959年人工智能先驱亚瑟·塞缪尔创造了“机器学习”一词以来,机器学习已经走过了近70年的时间。机器学习从最初的简单规则推理,演化为支撑现代人工智能体系的核心技术。如今我们进入了“大模型时代”,但这并不意味着传统机器学习已被淘汰,相反,它像是深海中的基石支撑着庞大的模型建筑,使得AI系统得以稳健运行与持续进化。
在工作之中我时常感叹一些中间件的设计模式是如此之巧妙,但我知道很大程度上这都要归功于对传统数据结构的理解。所以,无论今后大模型会如何发展,我相信算法的本质不会变,思维的根基依然在“机器学习”之中。正因如此,学习机器学习不仅是为了掌握一门技术,更是为了获得一种我们身处大模型时代思考问题的方式。希望《跟我一起学机器学习》这本书能够让更多对人工智能领域感兴趣的人重新认识这门学科的魅力!
最后,由于我们才学和资历尚浅,书中也一定存在着这样或那样目前尚未发现的错误,还请各位读者海涵与见谅。同时,也欢迎各位同行前辈对本拙作的不吝指教。作为补救,后期我们也将提供持续跟进的勘误追踪,各位读者可以在本书配套的GitHub仓库中获取。在今后的岁月里,我们也将不遗余力地持续去打磨《跟我一起学机器学》和《跟我一起学深度学习》这两本书中的内容,力争以最直观、最简洁和最有新意的语言将各个算法的原理与实现呈现在各位读者面前,继续秉持“为往圣继绝学”的初心。
2025年11月 于上海
作为《跟我一起学机器学习》的姊妹篇,两年之后《跟我一起学深度学习》一书也终于出版了。北宋大家张载有言:“为天地立心,为生民立命,为往圣继绝学,为万世开太平”,这两部编著虽然没有这样的宏伟愿景,但在它们的编写过程中我们自始至终都秉持着”为往圣继绝学“的想法在进行。
作为机器学习方向的一个重要分支,深度学习在近年来的发展可谓是大放异彩。随着深度学习技术地不断发展,与之相关的技术应用已经深入渗透到了我们日常生活的方方面面,从医疗保健、金融服务到零售、交通再到智能助理、智能家居等等,尤其是在以GPT为代表的大语言模型出现以后,深度学习技术的影子更是无处不在。如今,利用ChatGPT来作为日常生产力工具更是成为了一种共识。例如在本书的成文过程过中ChatGPT就为我们提供了不少的灵感和启示,部分内容也是在ChatGPT的辅助下所完成,而这在10年乃至5年前都是难以想象的。也正因如此,对于这些热门应用背后技术的探索便逐渐成为了计算机行业及高校所追捧的对象。但对于绝大多数初学者来讲,想要跨入深度学习这一领域依旧存在着较高的门槛。所以,一本数形结合、动机原理并重、细致考究的入门书籍对于初学者来讲就显得十分必要了。
尽管目前市面上已经存在着大量类似书籍,并且每年还以数本的速度递增,但现有书籍的不足之处在于往往太过高估了学生们的学习能力。首先,这类书籍往往都只是罗列了一堆名词概念、抽象晦涩的数学公式或是枯燥冗长的代码,而这对于初学者或是数学基础比较薄弱的学生来说是极为糟糕的,作为过来人我们对此深有体会。其次,这类书籍在介绍各个算法时仅仅只是做到了知其然而不知其所以然,并没有介绍每个算法模型出现的背景和动机,仿佛它们都是一个个从天而降的独立个体彼此之间毫无前因后果的联系。最后,对于算法原理或实现的细节之处并没有充分把握,往往都是一笔带过,而这就导致了初学者总是有一种似是而非朦朦胧胧的感觉。
**“数无形时少直觉,形少数时难入微,数形结合百般好”,这是本书在编写过程中所遵循的第一大原则。**在学习深度学习相关内容的过程中,如果只看论文那我们只能了解到算法模型的整体思想但无法精确刻画其中的细节之处;但如果只看代码又会发现均是各种矩阵之间的四则运算但并不知道其中的含义。因此,本书在写作之初就始终秉持着要以数形结合的方式来介绍每一个算法模型,即先通过图示直观地来介绍模型的整体思想和原理,再通过实际的数学计算过程或代码来刻画其中的细节和模糊之处。用图形去形象化,用代码去唯一化,做到真正“数+形”的结合,让各位读者能够真正的做到看得懂、学得会、写得出。为了将各个算法的建模原理表述清楚,本书使用近400余幅示意插图。
为了直观感受卷积操作的计算过程,我们绘制了全部4种情况下的卷积计算示意图;为了厘清GoogLeNet中各个网络层的参数及输出信息,我们重新绘制了更加详细的网络结构图并进行了全方位的标记;为了讲清楚多头注意力中”多头“的概念,我们完整绘制了整个注意力机制的计算流程图;为了讲清楚BERT模型的预训练任务和4大经典下游任务的构建原理,我们对于每个任务模型和数据集构建流程都进行图例绘制;为了介绍百川大模型内部的原理机制,我们又根据官方开源的代码实现绘制了其网络结构图,以便让读者能够从第一眼就能把握其整体的技术架构;为了讲清楚大模型对话场景中的Key-Value缓存机制,我们根据Transformers框架中的实现代码绘制了对应原理图。这样的图示还有很多很多,因为我们始终相信,能够用眼睛看到的一定是最直观、最容易理解的。
**“知其然,更要知其所以然”,这是本书在编写过程中所遵循的第二大原则。**任何一个算法的提出都不会是凭空捏造或无中生有,它要么是为了解决新场景下的问题,要么是为了对已有算法模型的改进,因此明白一个算法模型背后的动机就显得格外重要。一方面这样我们能更好地理解作者的想法以及与其它算法模型之间的联系,另一方面这也可以学习如何去讲好一个故事。所以我们不仅需要知道一项技术的原理,还需要知道为什么出现了这种技术、它的动机是什么、它需要解决什么样的问题。这样才更有利于我们了解整个技术的发展脉络并形成一个合理的思考方向。
因此,本书在行文过程中对于每一个算法模型的介绍都遵循了“动机+原理”的方式进行,即先梳理其提出时的背景动机,然后再介绍其具体的实现原理,而不是直愣愣地开始就某个算法模型进行介绍以至于前后衔接生硬。这也将使得各位读者不仅仅能够学会一个算法的原理和使用,同时还能知道它所提出的契机,养成这样的思维习惯对于一些读者后续的论文写作也是百利而无一害。
**“如履薄冰,有理有据”,这是本书在编写过程中所遵循的第三大原则。**在本书签订之初我们就预留了充分的时间,约定15个月交稿,计划12个月完稿,而实际14个月完成,目的就是为了能在一个轻松的氛围下完成写作。不过如果再算上之前在理解Transformer(2021年3月2021年8月)和BERT(2021年8月2022年4月)这两个模型所花费的13个月时间,整本书总共算是历经了27个月。所以我们也时常告诫自己切莫心急浮躁、切莫急功近利、切莫误人子弟,要为我们写下的每一句话、每一个字负责。同时,在本书的编写过程中对于每个重要细节的把握我们也会进行多方求证力争在理解上不会出现太大偏差。对于同一个模型的实现过程我们通常都会参考不同框架中的实现源码,TensorFlow、PyTorch、Transformers以及论文作者的实现等等,然后再根据这些代码整理出一份保留核心逻辑且适合初学者学习的示例代码。
例如在介绍BERT模型的实现过程时,我们先后阅读了GoogleResearch、PyTorch和Transformers框架中的相关实现过程;为了弄清楚fastText模型中关于中文$N$-gram的构建方式,我们在官方开源项目的dictionary.cc文件中找到了佐证;为了画出ELMo模型的真实结构图,我们在官方的Allennlp库中见到了答案;为了弄清楚大模型对话场景中模型在推理时的具体解码过程,我们几番周折终于在transformers库的generation/utils.py模块中找到了示例;甚至就连GPT这个简称的来历我们也都进行了细致的考究,而这些本都可以一笔带过。
对于“GPT”这个简称的来历,它到底应该是“Generative Pre-Training”的缩写,还是“Generative Pre-training Transformer”的缩写,我们也曾反复思考过很多次。此时有读者可能会说:这还用想?当然是后者,因为GPT使用到的是Transformer中解码器的部分。可当时我们并不这样认为。首先GPT表示生成式预训练模型“Generative Pre-Training”也并无不可,因为它的确是第一个大规模语料下的生成式预训练模型;其次GPT-1的论文中并没有明确交代“T”的代指,甚至全文中根本没有出现GPT这一缩写,反而从标题“Improving Language Understanding by Generative Pre-Training” 来看它更符合是“Generative Pre-Training”的缩写;最后,我们检索OpenAI 官网的所有论文和内容后,也并没有明确发现GPT的来由。但对于这件事的疑惑并没有停止。在我们写作GPT-2的相关内容时意外发现了论文第二作者 Jeffrey Wu 的 GitHub账户。在浏览他的所有项目时我们意外发现了一个名为名为minGPT的工程,其简介中赫然写到一句描述:"A minimal PyTorch re-implementation of the OpenAI GPT (Generative Pretrained Transformer) training" ,到这里总算是找到了官方对于GPT简称的认证。
当然,上面提到的细节之处本书中还有很多很多,各位读者可以在阅读学习的过程中自行慢慢体会。本书的目的只有一个,那就是所有的坑都让我们先来踩,所有的错都先让我们来犯,各位读者只需要跟随本书的足迹一步一步踏入深度学习的大门即可。不过遗憾的一方面是,这本书也只能刚好带领各位读者进入深度学习的大门,至于怎么将这些技术用得更好、用得更出色还需要各位读者在实际使用中进行反复锤炼。
2024年3月 于上海
页面总访问量: 次 网站总访客数: 人


