想学 AI 又担心没有数学背景或软件背景?没关系,这篇博客非常适合你。
我曾经花费一年半的时间自学各种在线课程和博客,过程中有太多专家、太多信息,而且他们的很多观点还有冲突。我在学习过程中经常充满自我怀疑。
我不想要很多专家帮我学习,我只想要一个老师。我希望有人能够拉着我的手说:「Dave,这就是你需要学的东西,请按照这个顺序学。现在我将用图画、有趣的故事、现实示例和浅显易懂的语言教你学习 AI。」
而现在,我就是那个老师。
为什么是我?和网上的专家不同,我没有数学或编程背景,不过我曾就读于耶鲁大学和普林斯顿大学,环游过 100 多个国家,是一名旅行作家,我曾在《周六夜现场》工作,我的作品得过奖。也就是说,我知道如何通过写作来传达复杂的概念,知道如何讲故事。我热爱教学,也善于发现好的老师。在学习深度学习过程中我遇到了四位优秀的老师,他们是 Andrew Trask、Grant
最重要的是,我理解你正在经历的痛苦。你听说过「专家盲区」(expert blindness)吗?专家向新手讲授某个学科时,由于他成为专家的时间太久,会忘了初学者对教材的感受。因此专家会快速介绍一些复杂的概念,而这些概念需要分解成小块才能方便初学者掌握。或者他们不使用类比、图画或示例来帮助初学者掌握概念,导致初学者非常受挫。
每一个初学者都想要专家来教他们 AI。而事实上,你需要的不是专家,而是一名老师。
最好的教师就是那个刚刚学过这些知识的人,因为他仍然记得自己挣扎过的地方以及克服方法,并且他可以向你传授捷径。而我就是这个人。我不是专家,但我是个好老师,而且富有激情。
本文的阅读过程和小说不同,只读一次是无法理解和掌握所有内容的。我学数学的朋友告诉我,他们常常需要读至少 7 遍数学文本才能开始理解。这不是开玩笑……
为方便讲授,我使用了类比、图画、示例和几何表示。但是请放心,本文在数学层面上是准确而严谨的。请做好阅读本文五遍的准备,无法立刻领会也不要着急。
我在学习复杂材料的时候,通常会设置计时器,每五分钟响一次,不断地提醒自己不要在绝望中沉沦,要微笑、耐心并坚持下去。这真的有效,相信我。
- 神经网络是深度学习中非常流行的前沿技术;
- 深度学习是机器学习的分支;
- 机器学习是人工智能的分支。
深度学习包括四个主要概念。本文的目标是让读者掌握这四个深度学习基础概念:
之前对这四个概念一无所知?没关系,首先我会使用类比和图示尽量简单地讲授这些知识,然后不断地回到这四个概念,探讨其中的细节。你应该将本文看作一个「螺旋上升」的学习过程,每一次回到这些概念时你都会收获更多见解。
- 过去一个月,您是否购买过 Litter Rip! 猫砂?
这四个问题的答案即之前顾客的「特征」(feature)。
那么问题来了:什么使得 AI 网络如此强大?
答案是:它使用调查结果进行训练,从而准确地预测未来顾客的购买行为。
首先,你需要将之前顾客的调查数据和他们对前三个问题的回答输入到网络中,进行训练。该网络使用这些数据预测某位顾客是否确实购买了新款猫砂。然后网络再将预测结果与顾客第四个问题的答案进行对比。第四个问题的答案就是标签,作为事实供网络进行对比。例如,如果网络预测结果是「是的,我认为这位顾客买过 Litter Rip!
猫砂」,而这位顾客第四个问题的答案确实是「Yes」,那么你就拥有了一个成功的神经网络。
神经网络通过试错进行自我训练:网络先预测,然后对比预测结果与第四个问题的真正答案,再从错误中学习,并在多次迭代中不断改进。
神经网络通常在一个数据集上训练,在另一个数据集上执行预测,理解这一点很重要。一旦你的神经网络很擅长根据之前顾客的调查数据预测新款猫砂的购买情况,那么你就可以换一个新的数据集,该数据集包含潜在新顾客的名单。
你从兽医那里得到了新的数据集,这些被调查者回答了前三个问题。现在,如果让你用训练好了的网络在潜在新顾客中预测广告投放的最佳对象,你该怎么做呢?
?」的答案。那么,如果顾客 1 对这三个问题的答案是「Yes/No/Yes」,则左上圆圈包含 1,左中圆圈包含 0,左下圆圈包含 1。
突触(连接这些圆圈和隐藏层的所有线)是神经网络用来「思考」的部位。右侧的单个圆圈(它依然和四个突触相连)是网络的预测结果,即「基于输入到网络的特征组合,此处展示了这位顾客购买新款猫砂的概率。」
最右侧标注「y」的单个圆圈表示真值,即每个顾客对第四个调查问题「你是否购买过 Litter Rip! 猫砂?」的回答。这个圆圈有两个选择:0 表示没买过,1 表示买过。神经网络将输出一个预测概率,并将其与 y 进行对比,查看准确率,然后在下一次迭代中吸取教训。神经网络在数秒时间内可以完成数万次试错。
上图是神经网络的典型图示。本质上,它描述的是前馈,即我们要介绍的第一个主要概念。你可能以为神经元是该过程中最重要的部分,但是这里的类比似乎存在一些误导性。事实上,本文要介绍的四个深度学习主要概念的共同驱动力是突触。因此,目前这部分最重要的知识点是:突触使得预测发生。下面一节我会把这一概念类比为落进碗里的乒乓球。
在进行下一个类比之前,我想首先详细解释一下神经网络之所以强大的原因。
在只有三个调查问题、四名被调查顾客时,这是可行的。但是如果有 40 个问题、4000 名顾客呢?人类如何决定哪一个问题作为执行准确预测的核心因素?人类大脑能够容纳的数量是有限的,我们很难量化 40000 名顾客中的某一位购买新款猫砂的概率。这个数字是 67% 还是 68%?谁知道呢!
现在我们来看神经网络如何执行预测:神经网络不会将预测局限于直截了当的「是」或「否」,相反,它会预测出一个 0 和 1 之间的数字——概率。例如, website?' means (/)
网站,我们可以推断出这些顾客热衷技术:他们喝进口啤酒因为他们欣赏其供应链物流,他们访问网站,各种各样的网站,说明他们很显然热衷技术。因此我们可以推断出,这些顾客可能会出于对这款猫砂先进技术的欣赏而购买它,尽管他们可能实际上并没有养猫。所以我们或许需要调整 syn0 的权重,强化这些特征之间的连接。
现在你明白了吗?当我们将调查问题的回复 l0 与 syn0 中的权重(每个权重表示我们对一个推断问题对预测结果的重要程度的最佳猜测)相乘时,我们是在尝试不同的答案组合,以查看哪些组合对预测结果最有帮助。很明显,在 6 万次迭代中,访问过猫砂网站的猫主人更有可能购买这款猫砂,因此在迭代的过程中它们对应的权重会增加,即其统计概率更接近 1 而不是
0。而喝进口啤酒却没有猫的人购买这款猫砂的可能性较低,因此对应的权重较小,即其统计概率更接近 0 而不是 1。是不是很奇妙?这就像数字谱写的诗歌,这些是会推理和思考的矩阵!
这也是我为什么大费周章介绍这个的原因。你是否经历过,一些傲慢的软件工程师或制造恐慌的记者告诉你,神经网络隐藏层是潘多拉的魔盒?而事实上它的底层并没有什么「神奇魔法」。这些数学知识清晰、优雅而美丽。你可以掌握它,只要有耐心肯坚持。
接下来我们继续看矩阵乘法。
3.5 用神经元和突触的形式可视化矩阵乘法
我们用神经元和突触的形式可视化 l0 和 syn0,如下图所示:
上图展示了输入 l0 的行 1 如何完成在网络中的第一步。第一行代表顾客 1 对三个调查问题的答案。这三个数字需要乘以 syn0 的 12 个值,然后网络还要对其他三位顾客的答案进行同样的处理,那么如何清晰地展现这些数字并进行计算呢?
这里的关键在于,将四位顾客看作一个「batch」(批次),他们在其中堆叠在一起,即一共 4 个 stack。那么,最上面的那个 stack 就是第一行(顾客 1),依此类推。如上图所示,你将第一行的三个数字和 syn0 的 12 个值相乘,再相加,最后得到 l1 最上面 stack 的四个值。
接着是 batch 中的第二个 stack——顾客 2 的回答是 0,1,1。将这三个数字和 syn0 的 12 个值相乘,再相加,最后得到 l1 第二个 stack 的四个值。
依此类推。其核心在于一次计算一个 stack,这样不管 batch 中有多少个 stack,四个还是四百万个,你都可以很好地处理。你可能会说每个特征都有一个 batch,在猫砂这个示例中,每个调查问题(特征)的 batch 为 4,因为只有四位顾客的答案。但它也可能是四百万。「full batch
configuration」的概念是非常常见的模型,接下来我将解释这一点。
其实认为给定特征具备一个 batch 的值是最容易理解的。当你看到一个特征时,你知道它底下有一个 batch 的值。
那么这四个预测结果告诉我们什么呢?预测值距离 1 越近,则该顾客购买这款猫砂的可能性越高;预测值距离 0 越近,则该顾客购买这款猫砂的可能性越低。
现在我们完成了前馈部分。接下来我们将看 6 万次迭代过程中如何调整网络权重,使预测结果越来越好。
4. 从试错中学习:梯度下降
梯度下降的目的是什么?是为了更好地调整网络权重,从而在下次迭代中获得更好的预测结果。也就是说,网络的突触矩阵中的某些值要被增减。为了调整这些值,我们必须回答以下两个重要问题:
我应该按什么方向调整数字?应该增加还是减少数值?正方向还是负方向?……
下面我们将详细解释这两个基础问题。还记得上文的红色碗吗?「梯度」就是「坡度」,「梯度下降」即计算出使小球从碗表面上的某个点尽快下降到碗底的最优坡度。
梯度下降的第一步即,计算当前的预测结果与真值 y(1/yes 或 0/no)之间的差距。
4.2 预测结果与调查问题 4 的答案相比有多大差距?
第一次预测结果距离目标值「Yes/1」(顾客 1 对第四个调查问题的回答真值是「购买过」)有多远距离呢?我们需要将 l2 预测值与 y 值(1)进行对比,即 y 值减去 l2 得到的就是 l2_error——「预测值距离目标值 y 的距离」。
因此,我们可以想象这幅图景:网络使用每位顾客的回复作为输入,并操作这些数据,以得到顾客是否购买猫砂的预测结果。
我们有四位顾客,网络就做了四次预测。因此 l2_error 是四次误差的向量(每个误差针对一次预测)。接下来我们将打印出该误差:
行 72 使计算机每隔一万次迭代打印一次 l2_error。这有助于我们每隔一万次查看网络的学习效果和进展。if (j% 10000)==0: 表示「如果你的迭代器所处的迭代次数除以 10000 后没有余数,则……」。j%10000 共有六次没有余数的情况:迭代数为 10000、20000、30000、40000、50000、60000
时。该打印输出会帮助我们很好地了解网络的学习进展。
现在我们已经知道预测结果(l2)距离真值(y)的距离,并打印了出来。但是,我们和城堡的距离实在太远,我们要如何降低目前令人失望的预测误差 0.5,最终到达目的地呢?
一步步来。接下来,我们将了解调整网络的哪一部分才能改进下一次预测的结果,之后会讨论如何调整网络。