机器学习是人工智能时代对于开发者而言,最核心也是最近的领域。机器学习看上去是比较深,比较复杂的后端开发技术,被算法工程师紧紧掌控着,前端开发者难道不能涉足吗?咱们真的要错过吗?若是我是前端开发者,如何入门机器学习?要学 python 吗?我不会怎么办?本期 Robust 我就带你来聊一聊机器学习。html
网易云音乐:点击播放前端
求打赏🙇若是你以为 Robust 这样一档技术类的谈话节目还不错,但愿我继续作下去,不妨打赏支持。你能够扫描本文下方的二维码打赏,也能够加我微信后红包打赏。python
- 什么是人工智能?
简单的讲,是要用信息技术模拟人的天然行为,以辅助人类完成某些工做。
它包含哪些内容?最起码:a 感觉系统(传感器技术)b 认知系统(天然语言处理 (NLP),深度神经网络)c 决策系统(深度学习)d 响应系统(机器人技术)
- 什么是机器学习?
咱们如今讲机器学习,实际就是讲基于神经网络的深度学习。它是人工智能的认知决策的核心内容。
- 目前已经实现的领域有哪些?
图像识别、自动驾驶、智能语音(同声传译)、搜索、艺术创做、医学诊断、玩游戏
语言中提到的搜索引擎 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 进行训练开发,建立属于本身的模型。
若是刚开始,咱们能够不用它来作训练,而是只用一些已经公开的模型,来作应用开发。
它的官方网站是 tensorflow.google.cn/js 你能够在官网上找到它的接口,固然,用于训练的接口你能够先无论,能够先跟着官方的入门文章,掌握如何利用官方公开的模型,作一些小案例,好比如何识别手写体数字等等。这段时间是疫情时期,你们都在家远程办公,长时间坐着会不会带来健康问题,有一位腾讯的小伙伴突发其想,利用人体骨架模型写了一个监控坐姿的小应用,你能够经过 www.doverr.com/alarm/index… 访问。其实里面涉及的技术还挺多的,有兴趣能够本身去八一八。一样是人体骨架模型,实际上,还有有其余的用法,好比我想到一个点,就是经过对人体骨架的预测,来匹配背景音乐,这样,可让抖音背景音乐更匹配。
在使用 tensorflow.js 实现了一些应用以后,若是有兴趣,就能够学习它的训练api,同时深刻去学习算法,编写本身的神经网络,建立本身的模型。
在小有成就感以后,就能够从新回头,开始去研究机器学习算法,甚至从新学习高数来提高本身的算法能力。
Robust 是一档程序员的谈话节目,聊一聊编程,聊一聊科技。你能够在这里收听往期全部节目。若是你喜欢欢迎收藏和打赏。程序员