背景
平常业务开发中每天都要接触到机器学习和深度学习的概念,在听了很多大佬的普及后,发现甚是有趣。于是小编想着着手开始学习这部分的内容。
那废话不多说,就从最基础的机器学习和神经网络开始~
一、机器学习基础
1、机器学习是什么?
机器学习是对能通过经验自动改进的计算机算法的研究 ------ 可以理解为机器学习是一个研究 ,它的研究对象是计算机算法。这个计算机算法的特点是:能通过经验来自动改进自身的能力。也就意味着,它可以像人一样积累一些经验,然后自动改进。
机器学习是用数据或以往的经验,以此优化计算机程序的性能标准 ------ 强调了数据或以往的经验。比如说:拿线性回归来举例,如下图所示:
线性回归的意思指的就是你给我一个连续的输入,比如说图上的 x
轴,它从 0
到 50
,然后我可以给你映射到它对应的 y
轴上的值分别是多少,也就是会给你一个连续的输出,我们可以在图上看到这个 y
轴从 0
到 35
也是一个连续的输出。
那么这个线性回归跟机器学习有什么关系呢?如我们上面所说的,这个线性回归问题通过数据或以往的经验 来解决。比如说我们这个图里面有很多黄色 的点,那么我们就可以沿着这些黄色的点,根据它的分布来画一条黄色的线,画完之后你随便给我一个 x
轴上的值,我都可以找到与之对应的 y
轴上的值。
比如说图上的 x
为 20
的时候,那么它的 y
大概就在 5- 10
之间这个位置,且就是你给我任意一个 x
轴上的值,我都可以得到 y
轴对应的值。当然不只是刚才那个20
,其他值也都可以。这就是通过数据以及以往的经验来解决线性回归问题,这些黄色的点就是数据或者说是以往的经验。
还有个问题是,可能有的小伙伴会有疑问:不使用机器学习,我也能画出这条黄线 or 红线。既然自己可以做到了,那为什么还需要机器学习呢?
其实啊,我们的目的就是为了实现人工智能,就是想办法让机器来代替人去画这两条线。
2、机器学习应用场景
上面我们说了机器学习的基础概念,接下来再列举一些常见的应用场景:
- 图片分类 ------ 准备大量图片,让机器去学习,判断这是一只猫、还是一只狗。
- 语音助手 ------ siri、小爱同学等等,给机器足够多的声音数据以及对应的标签,那么机器就可以识别我们的语音在讲什么了。
3、为何要用机器学习?
①有些棘手问题只能用机器学习来解决:
- 比如说给我一张图片,让我判断这个图片里有没有一只猫。这个问题看似简单,但是即便是很聪明的程序员,也没有办法通过编写规则和编写代码的方法来解决这个问题,这是不可能的。
- 比如说先是编写了一堆规则,然后判断一只猫,判断一个图片里面有没有一只猫。但是我们想一下,如果这个猫随便换个位置,换个动作,换个颜色,换个品种,那么它的规则是不是就被废弃掉了,就没用了?它要写多少条规则?它要写无数份规则,无数行代码,这显然是不可能解决的。
- 因此,我们可以通过机器,来学大量猫🐱的图片。之后,机器就大概知道了猫的特征是什么样的。然后等下次你再给它一张新的猫的图片,它就能判断这张图片里有一只猫的概率有多大了。
②获取数据比编写规则更加容易:
- 有些问题它既可以用机器学习来解决,也可以通过编写规则就是编写程序来解决。但是如果获取数据比获取规则更加容易 的话,那么这时候就应该用机器学习来解决。
- 举个例子,比如说你写了一个翻译程序,可以把这个英文翻译成中文,但第二天PM跟你说,想让你把这个翻译程序拓展一下,可以把英文翻译成日语。
- 如果是通过传统的编程,就会编写一堆的规则,一堆的
if else
逻辑。很大概率所有代码你还要全部再重写一遍,工作量非常大。 - 但是如果是通过机器学习的手段来做这个翻译程序的话,那么你一行代码都不需要改。我们要做的是,只需要把训练数据 换一下,重新训练一个新模型就 OK 了。这也就是为什么要使用机器学习的原因,因为有时候往往获取数据比编写规则要容易得多。
③GPU等计算能力显著提升:
- 机器学习的训练需要消耗大量的计算能力。在过去我们的算力非常的差的时候,其实使用机器学习的成本是很高的,或者说几乎是不可能的。在过去科学家跑一次训练可能得几个月,而且几个月跑一次训练实验,在这个过程中一般还要失败很多次。这个训练实验需要不断地试错,不断地试验,才能慢慢降低失败的次数。
- but...这么看的话,一次试验都要跑好几个月,那这个实验基本上也就没有什么可行性了,这也是为啥上世纪这个神经网络算法就已经被发明出来,但是到最近几年才火起来,就是因为过去的计算能力太差了。
- 但是现在我们的计算能力显著提升了,可能一个小时内我就能跑完一次训练,得到一个模型,看到实验结果了。那么这时候使用机器学习的可行性就变得非常高了。
4、机器学习如何运作?
- 机器学习可以通过神经网络算法来进行运作。
- 除了神经网络之外,还可以用很多其他的算法来进行机器学习,比如说决策树 、支持向量机 、贝叶斯分类器 、强化学习等等。
二、神经网络简介
1、什么是神经网络
- 神经网络,也称人工神经网络。
- 人工神经网络是一种运算模型(就是输入输出的映射),由大量的节点(或称神经元)之间相互联接构成。
- 运算模型指的是:从输入到输出的一种映射。
2、人工神经网络模型的特点
(1)特点
人工神经网络的特点就是:由大量的节点或神经元 相互连接构成,连接之后就形成了一张类似于网络状 的结构,所以我们把它称为神经网络。
(2)举例
举例生活中很常见的相亲例子:
左边是输入层,右边是输出层。中间的隐藏层,其实就是神经元,这个隐藏层是为了用来输出最后结果的。
对于输入来说,输入是我们可以从相亲对象身上直观看到的一些信息,那这些信息,每一个对应到形象、财富、品质和有趣的权重值,都不太一样。
可能五官跟财富和品质就没啥关系,那在财富和品质这两个神经元中,五官的权重就低一点。又或者说,学历和家境可能会对一个人的品质造成影响,所以说在品质这个神经元里面,它的权重可能就比较偏向于学历和家境。
总之,每一个神经元里面都存储着一些权重,然后把上一层的输入乘上这些权重加起来之后就得到一个值,得到值之后,就进入到下一层的神经元。
下一层的神经元就是最后一层的神经元,这个神经元叫满意程度 ,这个神经元里面也存着 4
个权重,它是把前面形象、财富、品质和有趣这四个神经元算出来权重,加起来得到的满意程度。
不过呢,现实生活中的机器学习比这还要复杂的多。比如说:有些用户他的眼光是比较高的,可能在我们看来已经很好看很漂亮的女孩,或者很帅的小伙,但是在他看来就是一般人,那么这时候我们光靠权重来算形象就不够了,可能还要加上一个偏置 。比如说在其他用户眼中,一个相亲对象他的形象有十分,但是在那个眼光比较高的用户眼里,只有 1 分 ,那么他的偏置就是-9。
值得注意的是,偏置是最后加上的,也就是那些权重乘完之后加起来然后再加上这个偏执。
接着,我们再来考虑一种情况,大多数人可能都会对相亲对象的财富有一定的要求,但是假设说超过了一定范围,其实对我们来说就没有区别了。比如说你觉得你的相亲对象只要年薪超过百万就可以了,那么他年薪 100 万、 200 万对你来说其实差别不大,但是对计算机来说这可是整整两倍的差距。所以说我们要告诉计算机,你不能再这么线性的增长上去了,对我来说只要超过 100 万都没有区别,不要再增加它的值了。
那么如何实现这一点呢? 神经元里面还有一个东西叫做激活函数 ,激活函数的作用就是用来做一些非线性的变化。所谓非线性的变化,就是:比如刚才我们举的例子,年薪超过 100 万就可以了,不要再线性的增长了,接下来我们可以把它想象成一条线,增长着增长这,最后就趋于直线平稳了,这就是一个非线性变化。
3、神经网络总结
最后,我们来对上面所讨论的做一个小结:
- 每个神经元里存储着若干权重(weight)、偏置(bias)和一个激活函数(activation)。
- 输入乘上权重加上偏置,经过激活函数得到输出。
- 激活函数用于添加一些非线性变换。
- 神经网络通常包含一个输入层、若干隐藏层、一个输出层。
- 输入层通常不用于计算神经网络的层数。
三、神经网络的训练
1、什么是神经网络的训练?
- 给大量输入和输出,算出神经网络里所有神经元的权重、偏置,然后给定新的输入,可以算出新的输出。
- 在机器学习里输入输出被称为特征 和标签 ,大量输入输出被称为训练集。
- 同样拿上面的相亲例子做举例:给 1000 个 相亲对象的数据(特征),以及对应的满意程度(标签)。训练完之后给一份新的相亲对象数据,就可以判定满意程度了。
2、如何训练神经网络?
- 初始化: 随机生成一些权重和偏置。
- 计算损失: 给定特征 ,计算出标签,看标签与真实标签差得多远。
- 优化: 微调权重和偏置(隐藏层),使损失变小。(微调与微积分中求导求梯度有关,哪个方向损失降得最快,那个方向就是正确的方向)
3、前向传播与反向传播
- 前向传播:把训练数据的特征送入网络,得到标签。
- 反向传播:计算损失并优化。(在最后一层计算损失,然后微调和优化,之后计算倒数第二层的权重)
4、如何计算损失?
- 使用业界已经研究出来的且很成熟的损失函数
- 常见损失函数:均方误差、对数损失、交叉熵...
5、如何优化?
- 使用业界科学家们已经研发的优化器
- 常见优化器:随机梯度下降(SGD)、Adam(从第三方库中调用)
结束语
在上面的文章中,我们学习了机器学习的基础知识,以及由机器学习衍生而来的人工神经网络。同时,我们还谈到了如何去训练一个神经网络。
通过本文的介绍,相信你对机器学习和神经网络会有一个基础的认识。
以上就是本文的全部内容,我们下期见~🍻
后语
- 工程才能创造更大的价值!不一定要搞底层,会应用+懂原理,足矣创造更大的价值~
- 参考材料:JavaScript玩转机器学习 - Tensorflow.js
- 欢迎交流:Zelina的个人说明书