李明殊,数码胶片XX法师群群成员(33/79) 阅读原文 从江湖算命到人工智能 前言: 这篇文章是与一个朋友闲聊时候的话题,后来想着索性整理成文章,为了让更多的同学理解人工智能的相关内容和常见算法思想,我决定不使用公式或者代码,尽量用一些简单通俗的例子,但是这样必然有失准确性,有什么问题可以在评论区里边讨论。 社会进步在发展中部分领域呈现了令人惊异的相似性。 前几天,看到有群研究者整理了一份 AI 为了完成任务所耍了一些小心思,觉着十分有趣,摘抄两个小例子: 问题:检测 X 光片有无肺炎 程序实际检测的不是 X 光片的内容而是拍摄它使用的机器,因为它“发现”病重的病人更可能在特定的医院使用特定的机器拍片(Zech et al, 2018) 问题:检测皮肤癌 程序发现照片里皮肤病变的边上如果放了一把尺子,那么这个病变就更可能是恶性的(Andre Esteva et al, 2017) 仔细一看,这不就是江湖算命大(pianzi)师(zi)的套路嘛。 如果你曾经了解过江湖算命这个行当,会发现他们一个惯用的套路就是,第一时间并不会问你所问何事,会故作高深地凝视你一会,然后得出几个结论,问你他说的对不对。 然后你会惊呼: 『你算得真准』。 本质上这个过程并不是算命,而是『观察』和『总结』的能力: 如是老年人问事业多半子女不孝; 如是年轻人穿着破烂,多是英雄迷途不知前路; 如是年轻女性问,十有八九是姻缘,再看其神色则可知是热恋,还是年轻人要闹分手了。 从概率上讲,这些论断八九不离十,你也可以尽量朝坏了说,毕竟,一个人过得开心快乐,生活幸福美满,他是不会去算命的。 人类的学习和认知,大部分结论是来自于经验总结,根据历史和经验归纳出规律; 当遇到新的问题的时候,再根据总结出的规律,进行预测。 不过有趣的是,人类从历史中得到的唯一教训,就是人类从来不从历史中接受教训。 相似的,而机器学习不是基于推理的“演绎法”,而是基于观测的“归纳法”。 这个过程中,使用算法处理历史数据,在机器学习中,叫做『训练』; 『训练』得到的结果是一个『关系』,这个关系可以描述历史数据,也可以预测新的数据,这个『关系』,被称之为模型。 机器学习 我们把经验和历史(包含特征和结果)这些数据扔给机器,让他自动找出特征和结果之间的关系(模型),然后在利用这个模型进行预测和分类,这个过程就是所谓的机器学习。 华强买瓜 - 线性回归(Linear Regression) 让我们来举一个小例子。 有一个人前来买瓜。 假如旁边有一个计算机,他并不知道西瓜的价格,他只能观察到称上的数字(重量),和付了多少钱(价格)。 当有很多『华强』来买瓜,这个计算机便收集了很多重量和价格的数据。 我们把这些数据列出来,计算机会从中找出一条规律,其实就是找到一条线,让这条线尽量经过所有数据点,或者尽量离所有数据点最近。 很快,计算机就找到这条线,用一个函数来表达: 价格=重量×2 这个规律也就是,商贩口中的『两块钱一斤』。 如果还有人来买瓜,计算机就可以根据这个规律来报出价格。 当然这个是一个简单的线性模型,也可以是其它类型的曲线,比如抛物线,或者指数关系,机器学习有很多的算法,比如最为经典的梯度下降算法,这也就是我们所说的线性回归。 当然,也有能够进行『非线性拟合』的算法。 打游戏吗 - 决策树模型(Decision Tree) 还有一种经典的机器学习模型 ,叫做决策树,从上到下,好像是一个开枝散叶的树。 简单来说,就是根据一层层的判断,来做最终的决策或者分类。 就拿周六要不要打游戏这件事情来说,决策树模型如下: 要不要打游戏这件事情,受到多个变量的控制: 取决于你有没有女朋友要陪,取决于你有没有紧急的工作要完成。 那么这个决策树是怎么来的,来自于以往的经验和数据,当把这些数据输入到计算机中,就可以按照一定的算法生成决策树模型。 当然以上的决策树是一个简单的模型,大家可以看到,『有没有女朋友』这个特征的重要性被过度放大了: 假如你有女朋友,但是你的女朋友不需要陪,根据这个决策树,你毅然决然的选择了打游戏,但是有一项重要的工作你并没有完成,周一上班老板肯定要砍了你的那种,所以单一的决策树往往会造成偏差。 女朋友比工作重要吗 - 随机森林(Random Forests) 怎么解决呢,可以通过随机挑选多个特征构建多个决策树,之后再通过『投票』的方式来进行最终的决策,这种方式被称之为『随机森林』(Random Forests)。 但是如果你精力旺盛,好家伙,同时交了八个女朋友,因为每个女朋友脾气秉性,对你的依赖程度也不尽相同,随机森林这种『随机挑选』特征的方式有可能就会导致错误。 交了八个女朋友 - 梯度提升(Gradient Boosting) 于是又诞生了,梯度提升树(GBDT)。 思路步骤如下: 1.与随机森林不同的是,并不是随机挑选特征来生成树,梯度提升树采用了所有的特征来构建决策树; 2.然后把预测的结果与真实的结果进行比对,计算出一个差值,根据这个差值,对于某些重要特征赋予权重。建立新的决策树模型,比如你给女友 A 赋予了更高的权重,其它女友的权重甚至都没有工作重要; 3.不断的重复这个步骤,就可以获得准确性更高的的决策树模型,最终多个决策树模型的和就是最终结果。 杨绛先生书中说, 精通命理的对以往的事历历如绘,不差分毫。但推算将来,则茫如捕风。 机器学习也同样如此,对于历史的数据太容易做拟合了,只要你愿意,每一个过往的数据都能给你拟合上,做预测,大部分都抓瞎了,只能给出一个概率。 这是因为什么呢,大量的现实问题,并不是『重量』,『价格』这样明确的数字,他们有可能不是数值,有可能包含多个属性,为了更好的量化他们,所以很多时候我们需要给数据打标签,其实人类在生活中,很多的时候也下意识这么做,会给人群打上标签,地域黑,00 后,五毛党,海军,米粉,就是这么来的。 可见数据越多,模型就会越加的准确,这也就是机器学习中『数据为王』的原因。 你的数据标准更加全面,更加准确,无疑可以获得更加精确的结果。 人工智能最为典型的应用,图像识别,内容归类,疾病判断,搜索推荐。其实最基础的操作,就是分类。 分类的奥义我是哪种人 - 邻近算法(KNN,K-NearestNeighbor) 所谓 K 临近算法,就是有 K 个最近的邻居的意思。 思路也很简单: 1.计算一个新数据与已有数据的距离; 2.对距离进行排序,选择距离最小的 K 个点; 3.对于 K 个点的属性进行查看,把这个新数据归类到那个最多的类别中去。 一个小例子,假如只有两种学生,一种勤奋苦学的,一种是吊儿郎当的,他们之间的差异是学习时间和抖音时长。 历史数据如下: 这时候有一个新人,叫孙八,学习时间 3 小时,游戏时间 5 小时,他属于那种类型的呢? 做一下数据可视化,我们一眼就可以看出孙八到底属于哪种类型。 当然,算法没有你这么好的眼力,他还得老老实实的计算新数据每一个数据点的距离,然后排个序。 这时候我们只要统计前 K 个数据的标签是什么,就知道新数据应该划分到那个类别。 当然这个例子为了简化,只用了时间一个维度的数据,实际上 KNN 算法可以采取多个维度的数据,计算距离的方式也多种多样,最为常用的是欧氏距离。 K 的取值有时候也会影响结果的准确性。 那么如何选择一个准确的 K 值呢? 实际中并没有特别通用有效的解法,只能是不断是尝试,更换参数,大家发现,这个过程跟炼丹特别像,加多少汞,用多少炭,完全不知道,凭着感觉来,爆炸了就更改下比例再来一次。 于是调参,也就被戏称为『炼丹』了。 概率的概率 - 贝叶斯分类器(Bayes classifier) 所谓贝叶斯分类器,主要原理就是贝叶斯定理。 贝叶斯定理,其实就算计算条件概率的公式,指得就是在事件 B 发生的情况下,事件 A 发生的概率。 一个很简单的例子,你经常在网上发一些自拍,然后收到了很多私信,那么大概率你是一个美女(帅哥)。 这里边隐藏了一个『经验概率』,就是我们认为好看的人比难看的人有更大概率收到私信,这个概率被称之为先验概率。 可以看到这个先验概率存在很大的主观性。 而且实际生活中,许多的事物是没有办法进行客观判断的,到了互联网时代,大数据和运算力为贝叶斯提供了基础,只要数据量足够多,这个先验概率也会不断的趋于准确。 再举一个输入法的例子: 如果你使用拼音输入法,输入『tianqi』,那么这个词语可能是,天气,田七,天启。 没有上下文的时候,天气出现的概率要比田七多得多。但是如果你前文出现了中药这两个字,那么是这个词语『田七』的概率就会比『天气』大很多。 为什么呢,我们统计了之前大量的中文资料,『中药 + 田七』这个词组出现的概率要比『中药 + 天气』多得多。 贝叶斯分类器就是基于这样的原理,来对新的数据进行分类。 支持向量机(SVM) 支持向量机,本质上也是一种逻辑回归算法,根据已有数据,用一条线作为数据集的分界线。 如图所示,两条虚线是数据集的边界线,其实这两条线也能作为两个数据集的分类,但是明显精确度不高,这时候我们需要算出两条线中间的那条实线,也就是离已有数据越远越好,这条分界的实线就被称为『超平面』。 为什么一条线被称为平面呢,这是因为目前我们的数据是二维的,如果是三维的,这条线就是一个面。离超平面最近的数据点称之为『支持向量』。 其实这样的分类线用逻辑回归方法也能画出来,那么支持向量机的的优点在哪里? 我们看这样的数据集。 很明显,是很难画出一条线将两类数据分开,怎么做呢,我们可以采用『核函数』这种数学手段,把数据转换到高维度。 这样我们就很容易画出这个『超平面』,来对数据进行分类。 未被标注的数据 以上所有的训练数据,都经历过标注,这些算法也被称之为监督学习。 那么如果如果我们手头的数据没有标注,如果通过这些数据来训练模型呢? 这种不需要标注数据,通过训练得到模型的算法称之为无监督学习。 最为常见的就是聚类算法。 人以类聚 -K- 平均算法(K-Means) 步骤也很好理解: 1.将数据分为 K 组,随机选择 K 个对象作为初始的聚类中心 2.计算每个数据点到这聚类中心的距离; 3.按照距离把这些点分配给给对应的聚类中心。 其实这就是一个『近朱者赤近墨者黑』的过程,和人类自发组织的过程极其相似: 有一大群人,接收到命令,要分为若干个群体,这时候肯定会有人自发站出来当小组长(随机的聚类中心); 然后人们会按照跟组长的相似性(爱好,习惯)来决定跟定那个组(计算距离,归类); 这时候组已经建成,通过相互了解,人们发现,组里有一个人更加契合组长的要求,然后推选他作为新的组长(算法选出新的聚类中心); 衡量你我的关系 - 降维算法(Dimensionality Reduction) 数据有多少维度? 就拿你举例子吧,关于你的数据,有身高,体重,三围,口味,喜欢的电影,在哪个大学读书,历史观,年收入,喜欢的人,是什么? 种种数据,要完全的形容你,这个数据可以轻松松达到百维,甚至千维。 而每当增加一个维度时,数据体积也就会指数级的增长,以现在机器的处理能力根本没有办法应对,这种情概况,也被称之为维数灾难。 那就,降维打击吧。 我们从一个现实的例子感受一下『数据降维』的过程。 人与人之间的交往关系,是特别复杂的: 你请我吃过饭,我帮你修过空调,你曾经带我出去旅游,我之前给你买过生日礼物,你帮我内推过简历,我帮你引荐了一个官员,你给我推荐过股票,我帮你挂了一个协和医院的专家号。 那么如何衡量我们之间关系的好坏,要把种种交往关系的过程数据化,不是不可能,只是数据量太多,维度太高,导致根本无法计算。 那么有没有一种方法,既可以减少分析的数据量,又能够尽量的保留主要的信息。 你肯定听过一句话,成年人的世界只有利益。 那么我们就可以把所有的交际过程转换成利益得失,请吃饭多少钱,修空调多少钱,生日礼物多贵等等等,都可以折合成金钱指标。 这样原本多维的数据分析也就变成一维数据了,分析起来自然明确而简单,虽然有失精确,但是起码能够对人际交往这种事情进行衡量了。 这里只是为了数据降维举例,不讨论人情世故。 做错了就要挨揍 - 强化学习(Reinforcement learning) 上边提到的种种算法,不论是监督学习,还是无监督学习,都需要原料 - 也就是数据。 没有数据的时候,机器还能学习吗? 答案是肯定的,这种方法被称之为强化学习。 强化学习的原理也很简单。 就是直接把模型丢到环境中,模型会随机的进行操作,环境会对操作做出反馈,反馈就是惩罚或者奖励,我们可以把反馈定义为加分或者减分。 如果某种操作能够得到高分的话,那么这个模型就会强化这个操作,来获得更高的分数。这也就是强化学习名称的的来由。 我们假设有个孩子叫小明,从来没追过女孩子,也没看过什么爱情片,总之对于恋爱这方面就是一张白纸(无数据); 但是年纪到了,春心萌动,他对班上的小红动了心,他决定追小红,于是就开始了各种操作(动作),小红也会对他的操作进行各种回复(反馈)。 小红说他饿了,小明于是采取了以下操作: 买了两个大馒头给小红送了过去,小红骂他,你是沙雕吗~惩罚(减分); 请小红吃海底捞,然后小红给他发了一条信息,今天晚上谢谢你哦~奖励(加分)。 小明在这个过程中,发现请吃贵的,高档的东西,容易获得奖励,于是他就强化了这个操作,下一次直接请小红吃西餐~强化策略的过程。 当然实际的恋爱过程并不是这么简单。 不同激励值的设置有可能会导致完全不同的结果,上文的例子中,如果只有请小红吃海底捞或者西餐才能获得加分,其它操作都是减分,小明很快就发现,这样下去钱包根本扛不住,所以小明毅然决然的选择了搞基,这就不是我们想要的了。 目前强化学习的应用主要在游戏方面,比如打星际争霸的 AlphaStar。 让羊踢足球 - 遗传算法(Genetic Algorithm) 顾名思义,就是模拟对生物进化的过程,借鉴了达尔文和孟德尔的遗传学说。 小明是个牧民,养了一群羊,有一天他突然奇想,要让他的羊们学会踢足球。 但是羊跟不知道什么是足球,并且要把足球踢到门里去,小明也懒得训练他们。 于是小明想了一个办法: 随机找一群羊放到羊圈里,并且给羊圈里安上球门,放上足球; 肯定有一部分羊对足球感兴趣,会试着踢足球,于是小明把那部分对足球不感兴趣的羊拿去烤了; 留下来的羊开始生儿育女,同样的做法,不仅把对足球不感兴趣的羊弄死,还有把踢不远的羊也弄死(或者不让他们交配); 这样很多代过去了,留下了的羊,就能把足球踢的越准越好了。 实际中的遗传算法,跟真正的遗传过程一样,也有染色体,基因,选择,变异,种群的概念,十分有意思,感兴趣的可以深入了解一下。 深度学习 神经网络(neural network) 既然称之为人工智能,人们自然的想到一个问题: 人类是如何思考和学习的呢? 人们开始从生物学的角度研究大脑工作的原理。 初中我们就学过了,神经系统最为基础的结构就是『神经元』,这里不妨复习一下: 一个神经元就有多个树突,用来接受外外接的消息; 轴突只有一条,用来整合从树突传来的消息; 通过轴突末梢把信息传递给其他神经元。 类似的,我们把借用神经元这种结构翻译成计算机能够识别的模型,就是以下这样,也被称之为感知器。 由于接受的信息的复杂了,所以要给每个输入赋予一个权重,也就是衡量这个信息重要程度的值。 举个例子,别人打了你一拳,同时一滴雨落在你脸上,还有一只蚊子咬了你一口(三个输入信息)。那么很显然,打了一拳这个信息明显是最重要的(赋予权重),因为这个操作对你造成的伤害最大。 而训练一个神经网络,所谓的调参过程,也就是在调整这些权重,以使得最终的结果趋于准确。 当很多的感知器分层次的连接起来的时候,就形成了一个神经网络。 蓝色我们称之为输入层; 虚线我们称之为中间层,也被称之为隐藏层;可以是单层,也可以是多层; 橙色的我们称之为输出层。 中间的连线就是我们赋予的权重; 目前你手机上的图片搜索,识别,甚至你抖音开的美颜滤镜,无一不归功神经网络的发展。 那么神经网络工作的原理是什么? 首先我们把一大堆数据塞给输入层,然后计算机会根据神经网络进行输出; 将输出值与实际值进行比对,算出一个差值,根据这个差值反馈回去,调节不同的权重; 循环往复这个过程,直到到达预期的目标; 还是来一个简单的例子吧,识别数字 1。 可以看到一共有 20 个输入,每个输入代表不同的值,涂色的我们可以用 1 代表,没涂的可以用 0 代表。 第一次训练的时候,机器根据反馈,很容易的给出了这 20 个不同输入的权重,3,8,13,18 权重为 100%,其它格子为 0%。 但是输入了第二幅图,实际的结果也是 1。 所以机器就将相关权重进行了调节,比如将 2 的权重从 0 调整到 50%,这样也能得到正确的结果。 如此可以根据大量的数据,整个模型在不断的自我优化过程中,在成千上万次的训练中,模型会变得越加的准确。但是这个过程需要大量的运算,这也也就是为什么之前机器学习的效果并不理想的原因,算力不太够,算法也不太聪明。 后来又发展出了卷积神经网络(CNN),生成对抗神经网络(GAN),尤其是在图像处理领域上,大放异彩。 机器是否能够真的理解? 这是一个长盛不衰的话题,机器是否能够真的理解,机器是否有意识,以及机器是否能够预测? 其实这个答案无关紧要。 答案的关键,就在于你怎么定义,理解,意识,和预测? 回到我们开头说道的算命,有一句话说得好: 你若信命,一切偶然都是必然; 你若不信,一切必然都是偶然。 问题是,『偶然的必然』和『必然的偶然』有区别么? 同样的, 你认为的机器学习不过是数字的统计和矩阵的运算, 那我也可以认为人类的情感和意识只不过是化学反应和神经电位的传播。 你可以认为 Alpha Go 不理解围棋,但是他就是打败柯洁; 你可以认为 GAN 不懂梵高,但是它能够轻松地把《Starry night》的风格迁移到任何一副照片上; 对于结果来说,理解真的重要么,或者还是说人类所谓的理解,只不过是一厢情愿? 人类的出路 不可否认的是,虽然目前的人工智能还处于人工智障的状态,但是他也在飞速的成长。 在某些领域,人工智能已经超越了人类,人类智力最后的堡垒 - 围棋,也在 5 年前也被人工智能拿下了。 还有一个不可忽视的问题就是,人类有可能会看不懂『人工智能』,神经网络的存在多个隐藏层的时候,人们就无法理解其中的规律了。层数越多,结果越准确,也就越难以解释。 看不懂的后果的灾难性的,因为你不知道他某一天会采取什么你意想不到的举措,你还不知道怎么调节他,因为压根不知道问题在哪。 有朋友可能会说,怕啥,人类还有终极大招,拉闸。 这个从来都不是什么好的解法,不信你看,现在多少电站都是无人值守的了。 那么对于人类来说,最好的结局是什么? 『成为人工智能』。 毕竟,只有魔法才能打败魔法。 以上。 阅读原文