机器学习是人工智能时代对于开发者而言,最核心也是最近的领域。机器学习看上去是比较深,比较复杂的后端开发技术,被算法工程师牢牢掌控着,前端开发者难道不能涉足吗?我们真的要错过吗?如果我是前端开发者,如何入门机器学习?要学 python 吗?我不会怎么办?本期 Robust 我就带你来聊一聊机器学习。
网易云音乐:点击播放
喜马拉雅:点击播放
求打赏🙇如果你觉得 Robust 这样一档技术类的谈话节目还不错,希望我继续做下去,不妨打赏支持。你可以扫描本文下方的二维码打赏,也可以加我微信后红包打赏。
以下是我的手稿原文:
- 什么是人工智能?
简单的讲,是要用信息技术模拟人的自然行为,以辅助人类完成某些工作。
它包含哪些内容?最起码:a 感受系统(传感器技术)b 认知系统(自然语言处理 (NLP),深度神经网络)c 决策系统(深度学习)d 响应系统(机器人技术) - 什么是机器学习?
我们现在讲机器学习,实际就是讲基于神经网络的深度学习。它是人工智能的认知决策的核心内容。 - 目前已经实现的领域有哪些?
图像识别、自动驾驶、智能语音(同声传译)、搜索、艺术创作、医学诊断、玩游戏
语言中提到的搜索引擎 https://magi.com/ - 机器学习基本上可以分为三个类别: 监督学习、非监督学习和强化学习。
- 对于前端同学(非数学专业)而言,如何用更简单的语言描述机器学习中遇到的复杂概念?
对于复杂概念而言,它的本质是对具体描述的抽象。它之所以难懂,是因为抽象程度高。我们要做的,就是还原它的具体,我们先忘记这些概念,去搞明白抽象背后的具体描述。一个概念,可以用不同的具体描述与之对应,我们就用自己日常生活中最接近自己的具体事件去描述,在没有概念的情况下,我们也能知道,这个概念是在描述一件什么事。当我们反复用啰里八嗦的具体描述去阐释一个东西时,我们自然而然,就会有强烈愿望用一个简单的概念去描述它,这个时候,我们再来看,就会发现原来这个概念就是这么回事。 - 那么我们如何用简单语言来描述“监督学习”这个概念呢?
它的本质就是归纳法。
简单的说,你首先需要一堆数据【给定数据集,也被称为训练集】,这些数据都是客观事实。其次,你需要有一个训练算法,通过这个算法,找出这一堆数据的内在联系(一般用一个函数来表示),这个东西就是训练的结果,也就是我们常听见的模型。【训练阶段】最后,利用这个模型,去预测一个新给的参数所带来的结果。【推理阶段】
其中,训练算法是关键。它存在性能问题,为什么呢?这和机器学习的范式(归纳法)有关。机器学习和我们以往寻找最优解的模式不同。我们以前寻找一个最优解,考虑的是运算最短路径和准确性,也就是在保证一定能找到最优解的情况下,用最少的运算次数找到最优解。
而机器学习皆然不同,它的预设是没有基本规则前提下的归纳方法,因此,通过机器学习找到最优解不是精确的,而是近似的,至于运算的次数,要看运气,但一般而言,都是将所有可能遍历一边。我们传统的一些思考方法,都是有预设和前提的,比如说,找出一组数中,最小的值。用传统算法,我们在“找出最小值”这个目标下,可以先将这些值进行分组,每组最小的再比,或者通过冒泡算法之类的进行排序,总之,我们很明确知道不同值之间它们存在的大小关系。
但是,机器学习的前提是,它不知道两个值谁大谁小。你需要先让它学习,比如说,1和2,它事先不知道1和2谁大谁小,你需要告诉它,你可以先告诉它这么一个集合[[1, 2], [8, 199], [5, 92], [43, 1993], [234, 93582], …],然后告诉它每一个数组第一个值比第二个值小。这个集合就是训练集。它可以通过这个集合学习到 a-b<0 的时候,表示a比b小。而这个 a-b<0 就是它的训练结果,将来遇到任何两个数,它都能知道这两个数谁大谁小。有了这个谁大谁小的前提,才能进行后面的“找出最小值”的算法。
那么怎么进行训练呢?这里就涉及到“成本函数”“神经网络”等等概念。 - 什么是成本函数?
训练的本质,实际上就是求函数的系数的过程。比如,我们初中学习的一元二次方程,y=ax^2+bx+c,这个一元二次方程可以运用到的地方实在太多太多了。比如经典的案例是“波特兰的房价”,一套房子大概能卖多少钱呢?假设它受三个因素影响:地理位置a,房子大小b,采光c。那么我们我们怎么知道 a, b, c 分别是多少呢?初中求一元二次方程告诉我们,需要给我们三组x, y,然后代来代去,最后算出 a, b, c。
机器学习的训练过程中,没有求一元二次方程这么高的智慧,它能干啥呢?它只能干最蠢的事,你需要先知道三套或以上的房子的实际价格,也就是知道三个以上 [x, y] 把所有的a, b, c可能的值,一个一个的代入到方程中,然后计算出 x, y,然后去看,当前代入的 a, b, c 算出来的 x, y 是否和这三个 [x, y] 都匹配,如果找到一组 a, b, c 正好让方程满足三个 [x, y],那么说明这一组 a, b, c 就是我们要找的解。
机器学习就是这么蠢。
那么什么是成本函数呢?现在,把上面这个房价问题抽象成坐标轴中的数学问题。三套已知房价就是平面坐标轴上的3个点。接下来,机器学习假设a的范围是[0, 100], b的范围是[0, 50],c的范围[0, 10],这里是先假设,假如再这个范围没找到,我们再扩大范围。A, b, c 的组合就有50000种可能,也就是在坐标系里面,可以画出50000条抛物线。那么哪一条抛物线才是我们要的呢?就是去看这些抛物线和已经画出来的那三个点。靠的最近的,就是那一条。怎么靠的最近呢?在x 相同的情况下,点的y值减去抛物线上的y值最小,三个点都这么去计算,当然,为了避免正负号问题,还可以相减之后求绝对值,这三个绝对值相加最小的那一条抛物线,就是我们要找的抛物线了。而这个算法,最终会变成一个 f(a, b, c) 的函数,而这个函数,就是成本函数。
成本函数,决定了这次训练过程的性能,也就是要花多少时间才能找到正确的 a,b,c,这个过程,运气不好的,可能比挖矿还要慢。 - 什么是神经网络呢?
我们现在所说的神经网络,多半是指深度神经网络。深度学习就是指基于深度神经网络的机器学习。神经网络和深度神经网络就是程度上的不同,本质一样。
神经网络和人脑神经元网络一样,每一个神经元都有自己处理信息的能力,通过树突接收信息,通过轴突输出信息。接收的信息可能来自另外一个神经元输出的信息。
在深度神经网络中,这些神经元被分层,每一层所负责的工作不一样,每一层可以包含多个神经元。每一层输出的信息,可以被下一层的任何神经元接收,这个根据需要来处理。
核心就在于,每一个神经元所包含的算法,以及这个神经元所得出结果的权重。算法工程师在编程时,实际上就是在干这件事,首先安排一个什么样的神经网络,其次,给网络中的每一个神经元加入算法和权重,然后找一大堆训练集,运行这个网络。
回到我们上面的房价问题。我们用穷举 a, b, c 的方法实在是太笨了。我们把这个穷举过程改为用神经网络来处理的过程。我们现在创建一个2层的神经网络。对于输入而言,地理位置的权重最大,房子大小权重居中,采光条件权重最小。第一层网络要解决一件事,就是将训练集中的所有房子之间,a, b, c 的关系转化为某个特殊逻辑关系,这个逻辑关系虽然是从已知的这些训练数据中来,但是和训练数据已经完全没有关系了,从输入到输出这个过程,被称为“激活”。
第二层网络要干一件事,就是将我们上面找到的逻辑关系再次进行运算,得到特定逻辑和房价之间的关系。
至于中间的激活函数是什么,我们就不去纠结了,这是算法工程师要写的东西。
最终的效果是,通过这个两层的神经网络,我们减少了找到 a, b, c 的时间,同时提高了准确率。 - 什么是激活函数?
在上面提到的过程中,原始输入值在输出之后,为了方便下一层网络使用,我们都要对这些不规则的结果值,进行归一化,一般都是将这些值转化为 [0,1] 或者 [-1, 1] 之间的小数,这样,我们可以非常容易的对两个值进行观察和处理,而不用考虑不规则的数之间带来的差异。而负责这个转化过程的算法被称为“激活函数”,激活函数的主要作用,实际上是将非线性的数转化为线性的,也就是我们经常听到的“线性变换”。
目前最常被提到的激活函数有 sigmoid, tanh, relu. - 什么是模型?
说白了,模型就是训练结果。也就是最前面,找出二元一次方程系数后,把这个二元一次方程固定下来。另外一个人在要预测另外一套房子的时候,就不需要自己再去训练,而是直接拿你训练的模型,也就是这个二元一次方程,传入对应的x,得到y就结束了。
训练算法是得到模型的关键。前面说过,机器学习不是追求最准确,而是近似。所以,就有一个算法调优的过程,也就是以更小的代价,得到更靠近准确值的 a, b, c 的过程。算法工程师的功力,实际上就在算法调优(发明或改进算法)的能力上。 - 什么是卷积神经网络(CNN)?
首先,什么是卷积?中文翻译的好,它包含“卷”和“积”,积就是相乘,卷就是相加且有反复连续不断的意思。卷积就是将要素值相乘,然后将乘积相加的过程,相加多少次由计算目的决定。不过,在相加过程中,实际上有一个衰变过程,也就是说,前面的乘积,在后续的相加过程中,会衰变,对权重的影响不如最新的积带来的效果大。它的本质,实际上,就是加权叠加,通过加权叠加,我们可以找到权重突出的要素。这也是卷积被应用到神经网络中的原因之一。
那么什么是卷积神经网络呢?深度神经网络有很多层组成,每一层内包含很多神经元,层与层之间有先后顺序。在众多神经网络中间,有这么一种神经网络,里面包含了一个特殊的层,这个层的主要作用是对输入值进行分组后相乘,然后通过激活函数进行归一化,而且,这个神经网络很奇怪,这个特殊层有连续好多个,只是里面的参数有稍微的调整。这种就是卷积神经网络,而这个特殊层就是卷积层。当然,这里是一个缩减化的,实际上,在卷积神经网络中,连续重复的不是只有卷积层,而是多个层,一般包括:卷积层、线性整流层(也就是上面提到的激活函数)、池化层(衰减作用,以得到维度更小的特征)。而这些重复的层结束之后,还会有一个全连接层,将卷积结果做最终的整合,得到最终的结果。
卷积神经网络在图像识别上取得了非常大的成功。我们简单说一下,图像的本质是像素的组合。对图像识别,实际上就是对图像中事物到已有知识库中进行匹配的过程。怎么在卷积中做呢?首先,将图片像素RGB分别取出,并通过补充的方式,得到一个3的整数倍长宽的正方形。现在有一个滤波器(一个3x3的01矩阵),将原始R层切分为3x3的网格,每一格拿出来和滤波器每个位置相乘,然后将所有位置相加,就得到一个值,然后将所有格子相乘相加得到的值组成一个新的矩阵,并通过激活函数,将上面的值归一化。按照上面的方法,再进行一次滤波相乘相加。如此反复几次,就可以得到一个经过归一化的很小矩阵,从而表达R层在某一个特征(滤波器所表达的这个特征)上的值。已同样的道理,再做其他层其他特征的卷积。最终在全连接层对这些特征值进行分类匹配,找出这张图片是车还是猫的可能性各自多大。 - 分类的重要性
对样本进行分类,无论是监督学习(人为给出分类),还是非监督学习(人为不给分类,只给出创建分类的方法),都极其重要。
机器学习的目标,是要做出决策。决策的依据是什么?就是被预测的值被丢到哪一个分类中。例如股票预测中,通过机器学习,得出3个分类,并对每一个分类采取不同的操作建议。当你输入新的一支股票时,它就可以预测这支股票属于不同分类的概率,并且你可以通过最大概率的那个分类进行决策。
所以,机器学习的【推理阶段】本质就是给目标进行分类的过程。而它进行分类的依据,就是来自【训练阶段】的结果,即模型。 - 前端开发者如何学习机器学习?
前端开发者最擅长的是应用开发,而非算法开发。所以,我觉得,要从应用开发开始,建立兴趣。
Tensorflow.js 是谷歌开源的机器学习框架,使用 Tensorflow.js 可以使用 js 作为开发语言,进行机器学习的开发。对于这个框架而言,我们其实可以做两件事:a 纯作为一个第三方开发库,用来做应用开发;b 进行训练开发,创建属于自己的模型。
如果刚开始,我们可以不用它来做训练,而是只用一些已经公开的模型,来做应用开发。
它的官方网站是 https://tensorflow.google.cn/js 你可以在官网上找到它的接口,当然,用于训练的接口你可以先不管,可以先跟着官方的入门文章,掌握如何利用官方公开的模型,做一些小案例,比如如何识别手写体数字等等。这段时间是疫情时期,大家都在家远程办公,长时间坐着会不会带来健康问题,有一位腾讯的小伙伴突发其想,利用人体骨架模型写了一个监控坐姿的小应用,你可以通过 https://www.doverr.com/alarm/index.html 访问。其实里面涉及的技术还挺多的,有兴趣可以自己去八一八。同样是人体骨架模型,实际上,还有有其他的用法,比如我想到一个点,就是通过对人体骨架的预测,来匹配背景音乐,这样,可以让抖音背景音乐更匹配。
在使用 tensorflow.js 实现了一些应用之后,如果有兴趣,就可以学习它的训练api,同时深入去学习算法,编写自己的神经网络,创建自己的模型。
在小有成就感之后,就可以重新回头,开始去研究机器学习算法,甚至重新学习高数来提升自己的算法能力。
2020-03-01 1987