智能化入门篇之深度学习今天的人工智能领域大致可以分为问题解决、机器学习、自然语言(NLP)、语音识别、视觉、机器人。各个
文/ 菜鸟团队-雷茂
今天人工智能对于普通人已经不是什么陌生的词语了,生活中像智能语音,智能驾驶等等,都是常见的人工智能下孵化的产品。
值得一提的是目前人工智能已经成为多个国家的国家级战略,其代表国家是美中俄等等大国,我国先后出台了《国家人工智能研究与发展战略规划》《人工智能与国家安全》《新一代人工智能发展规划》等系列政策规划,其重视程度可见一斑。
今天的人工智能领域大致可以分为问题解决、机器学习、自然语言(NLP)、语音识别、视觉、机器人。各个领域之间也不是严格的划分区分,相互都有交叉。

人工智能的三次浪潮
需知一点,AI发展已经数十年了,其阶段大致分为3个浪潮:
第一次浪潮(非智能对话机器人, 50~70)
1950年10月,图灵提出了人工智能(AI)的概念。 1966年,心理治疗机器人 ELIZA 诞生。(有限的词库)
第二次浪潮(语音识别,时间是1980~2000)
第二次浪潮最大的突破是改变了思路,摒弃了符号学派的思路,转而使用了统计学思路解决问题。
第三次浪潮(深度学习+大数据, 21世纪以后)
第三次浪潮到来的原因,主要来自于两个条件的成熟:
- 互联网行业飞速发展形成了海量数据。同时数据存储的成本也快速下降。使得海量数据的存储和分析成为了可能。
- GPU的不断成熟提供了必要的算力支持,提高了算法的可用性,降低了算力的成本。
这里提一下华人黄仁勋创建的英伟达市值在近5年涨了20倍之多,而英伟达自身也在2020年7月8日美股收盘后,首次在市值上实现对英特尔的超越,成为美国市值最高的芯片厂商。正因为得力于GPU的飞速发展,被算力能力困扰了数十年的人工智能,终于迎来了大爆发。
好了,今天的我们主题主要是深度学习,背景我们到此为止,我们需要知道深度它是机器学习的一个细小的分支,属于机器学习三大类下的监督式学习。除此之外还有非监督式学习和强化学习。
了解下深度学习~
先讨论下机器学习的基本思路:
- 把现实生活中的问题抽象成数学模型,并且很清楚模型中不同参数的作用。
- 利用数学方法对这个数学模型进行求解,从而解决现实生活中的问题。
- 评估这个数学模型,是否真正的解决了现实生活中的问题,解决的如何?

归纳一下思路,就是建模、调参、求解、评估。
机器学习建立的模型的核心是算法,但是不管是什么模型的创建都逃不过6个步骤:
- 收集数据
- 数据准备
- 选择一个模型 (what?)
- 训练 (what?)
- 评估
- 预测(开始使用)
至于算法本身,由于本文重点是深度学习,所以算法就只贴上一个列表:
线性回归 | 监督学习 | 随机森林 | 监督学习 |
---|---|---|---|
逻辑回归 | 监督学习 | AdaBoost | 监督学习 |
线性判别分析 | 监督学习 | 高斯混合模型 | 非监督学习 |
决策树 | 监督学习 | 限制波尔兹曼机 | 非监督学习 |
朴素贝叶斯 | 监督学习 | K-means 聚类 | 非监督学习 |
K邻近 | 监督学习 | 最大期望算法 | 非监督学习 |
学习向量量化 | 监督学习 | 随机森林 | 监督学习 |
支持向量机 | 监督学习 |
监督学习和非监督学习
算法的类型决定了机器学习的类型,监督学习的重点是数据都打了标,意思就是给机器提供的训练数据都要标记出这些数据都是些什么!
非监督学习则没有标记数据,而是让电脑自己提取特征,进行训练分类,最后再由人类去分类。 很显然两者的应用场景不一样,各自有自己应用场景,非监督学习对于异常处理很有一套,想象一下如果银行对于用户的行为异常做监督,那么那些不同于正常用户行为的操作就会被发现。
用一句话归纳机器学习:从「特定的」大量数据中总结规律,归纳出某些「特定的知识」,然后将这种「知识」应用到现实场景中去解决实际问题。
上面说了深度学习是一种监督类型的机器学习,所以它拥有监督学习的所有特征。
深度学习的独有的特征是什么?
那么问题来了,深度学习的独有的特征到底是什么?如何区别于其他监督学习?答案就是神经网络!
**深度学习主要涉及三类方式: **
- 基于卷积运算的神经网络系统
- 基于多层神经元的自编码神经网络.
- 以多层自编码神经网络的方式进行预训练,进而结合鉴别信息进一步优化神经网络权值的深度置信网络。
卷积神经网络是最具有代表性的深度学习,它拥有多层节点,应对了深度学习的深度2字。 接下来我们带来的是整个神经网络的结构和知识点,先来一张形象的图片:

什么?看不懂?不要慌,我们可以拆分的粗略点,先来看一张通用神经网络的图片,

对于神经网络来说,一共有输入层、隐层和输出层三层,每个层的点叫做神经元,里面装着的是激活值。 输入、输出很好理解,神经网络的主要工作在中间的隐层,他们通过权重W和偏置值、激活函数的计算得到隐层的各个值。
讲讲原理
我们来根据一个2层隐层的案例来学习神经网络的原理吧!首先我们看一组28*28的图片:



我们人类很快就能知道这是什么数字~ 这些数字对于人类眼睛来说,它的输入是一些像素,我们来模仿人类视觉的步骤:
- 由瞳孔摄入像素。
- 接着是初步识别边缘(各个数字都有不同的边缘),
- 然后抽象组成部分。
- 整体形状,最后得出结果。
那么神经网络也是类似的,一张图片对于机器来说就变成二进制像素,这里为了方便先用0~1的值去表示(真实的颜色像素是包括RGB)。

这么来说,对于机器来说我们输入的其实就是 28 * 28 = 784个输入值。

通过各种计算从而得到某个输出,上图得到的结果可以认定为9。 这就是原汁原味的多层感知器了(Multilayer Perceptron),也就是我们之前说的隐层。 看到上面的线了,他们叫做权重W,每个节点叫做神经元,里面装着的叫做激活值。
这里为了给大家更形象的理解这个结构,我们从人类视觉的角度来理解。 人类视觉是从边缘到部位再到整体的。 我们设想把一个数字进行拆分:

等等,那么他们一组合就能得到我们的结果。


那么问题来了?真实的神经网络是不是这么工作的呢? 答案:可以这么做,前提是你的权重设置的正确。然而实际工作当中,模型设置的要比这个复杂的多,这里只是为了方便理解。
讲讲数学公式
那么另一个问题来了?如何达到这种效果呢? 答案:权重,也就是神经网络的一条条线, 我们的激活值都是上一层的值和权重一起计算得来的:

最原始的时候,我们的计算公式为:a(L) = W * a(L-1)。也就是:

所以我们如果想识别一条横线,可以对对应的横线像素的权重设置为1,其他为0就ok了。我们把上面的值叫做加权值S。接下来会一直这么叫。
刚才上面我们说了,这种是最原始的计算公式,现实中,我们往往会給这个求到的S值,再使用一个激活函数去计算,保证激活值在一定可控的范围内。
比如我们需要把值可控在 0~1内。这个时候我们可以使用一个叫做sigmoid的激活函数,公示我们小学学过(你读的是什么小学😊),如下图:


这个公式大家都学过吧,它的值保持在0~1。好的,让我们来求一下激活值的公式,目前涉及到的参数有权重:



这样我们得到的公式就变成:

有时候出于某种考虑我们想要需要 S>10的时候,才点亮(可以理解大于0.5为亮的状态),那我们需要增加一个偏置值,这个公式变成了:

b就是偏置值basis。 我们把可以把里面的叫Z:

那么最终我们记为:

好了,这个时候咱们对神经网络的理解就丰满起来了。 在此,我们需要思考一个问题,那就是一共需要多少个偏置值和权重参数?
线的连接是两两互连的,所以一共有 78416 + 1616 + 1610 偏置值则是每个下一层计算都需要一个 所以是 16+16+10 相加为:78416 + 1616 + 1610 + 16+16+10 = 13002。一个简单的神经网络需要这么多的参数了。是不是很惊讶:

一共训练得比较好的神经网络,可以让图片识别成正确的情况,而复杂且多的参数是适应性强的前提条件。
好了,到这里其实我们已经明白了,神经网络的前向传播的原理了。
但是仍然不够,上面我们说了好的网络能够有个好的结果,那么问题来了,我们怎么得到一个好的神经网络呢?
怎么得到一个好的神经网络呢?
答案是:使用梯度下降算法不断反向传播的一种自我调节。
这么说你肯定想打我,对不对?

好了言归正传,这种工作量大的东西,一般都是设置规则让机器自己不断调整。首先我们需要明确我们需要关注问题:
- 结果准确不准确 (如何量化)。
- 如果不准确,我们如何调整,调整什么。
首先来看结果准不准确?这个比较简单,就是计算输出层损失(loss):

那么当cost比较大的时候,我们应该如何调整? 很显然,我们必须调整a(n),使得它和y(n)的值接近。 还记得a(n)的计算公式吗? 我们发现,真正能够调整的只有激活值 a 和权重 w 和 偏置值b, 但是激活值也是上一层的a、w、b对不对? 这些来看,我们能调整的只有w、b 还有第一层的a,但是第一层的是输入值,所以忽略。 划重点就是我们需要对所有的参数进行调整,权重w和偏置b
好了,目标有了对不对? 现在的问题是如何调整这些参数呢? 答案是梯度下降
学习梯度下降直接,我们来回忆两一个小学数学基础: 泰勒公示:

这里f′(x)是函数f在x处的梯度。一维函数的梯度是一个标量,也称导数,如下图所示:

接下来,找到一个常数η>0,使得∣ηf′(x)∣足够小,那么可以将ϵ替换为−ηf′(x)并得到

如果导数f′(x)≠0,那么


这就意味着,我们需要对f(x),求导,并设置一个足够小的正数η,就能让f(x)更小,而 x-ηf(x)就是目标值。 这是一维的求值方式:
好吧,相信这个时候很多人已经豁然开朗了。 我们的目标就是降低损失,而损失C则是所有 权重和 偏置还有输入在层层关系中得到的。 所以我们必须給所有的权重和偏置求 ηf′(x)来达到同样的目的。 得到所有要调整的向量,可以叫做

由于我们的计算是一层层的往回计算的,所以叫做反向传播。
先来计算输出层的调整量,设置最后一层为L层,输出层是n个。

这样最外层的误差调整就计算完了。 然后计算倒数第二层L-1层。 根据小学数学知识点链式法则,

同理,各个层的各个调整差值都需要链式法则去计算,直到获取向量

所有复杂的任务都交给机器去做,我们人类只是去做微调。 这一点在模型训练中表现得尤为明显。
这里已经将神经网络的原理给大家做了一个展现,接下来我们来看看卷积神经网络又是什么东东~
卷积神经网络其实就是有着特殊分层的神经网络,它包含卷积层、池化层、全连接层。

他们分别有不同的作用,我们先来看一下卷积层,用一张图来表达出卷积的意义:

卷积层本质就是多张卷积核对原始图做特征提取,图中中间的那张图就是卷积核。 对比一下我们的神经网络中的处理加权值S,其实不难发现可以把卷积核当作某个简单的权重设置。
卷积层参数包括卷积核大小、步长(stride)和填充(padding)。 下面分别介绍一下。
用一张动态图片感受一下下卷积核:

这里的卷积核特别的明显就是3*3的大小,全部为1,换句话说就是所有数字相加。
1 | 1 | 1 |
---|---|---|
1 | 1 | 1 |
1 | 1 | 1 |
前面可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。 这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。 这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。 为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用0来进行填充的。

设置padding来避免信息损失,那么有时候我们也需要设置步长去压缩信息,看下图



这图片就是通过常用的卷积核--拉普拉斯算子提取的边缘特征,再将提取边缘加强就能得到我们平常的锐化图片。

不同大小的卷积核效果也不一样,如下图:


很显然,下图要细腻不少,好了,知道了卷积核的作用,
让我们接着来看看 池化层(pooling),也有人翻译成采样层。 好了,其实我更倾向于叫他采样层,因为它的主要作用就是采样。 来,为了最快理解,我们看一下max pooling的处理方式:

从人类理解角度来看,就是取出最明显的特征嘛。 那么为什么需要这么做?那就需要追溯历史了。。 大致就是早期的机器计算能力不够,这种采样层可以大大减少计算量。 还有个原因就是防止过拟合。
那么最后一层就是全链接层了。 全链接层其实是没必要再讨论的层数,它起的就是做分类作用,原理基本和之前说的神经网络隐层原理一样。 主要作用就是抽象和分类。 值得一提的是最后一层往往是 softmax的激活函数,它对分类十分擅长。
好了,小结一下: 1、输入层为像素值。 2、卷积层是提取特征。 3、池化层是进行抽样,取得明显特征。 4、全链接层对特征进行非线性组合(分类)得到输出。 5、输出就是结果了。
卷积神经网络的结构就介绍到这里,大家需要记得的是这个结构是比较原始的,很多环节已经有更多人 研究优化了,比如光卷积,就有平铺卷积(tiled convolution)、反卷积(deconvolution)和扩张卷积(dilated convolution)等等,如果有兴趣,自行研究啦。
但是还没结束哦,有些重要的概念在这里还是需要跟大家强调一下: 1、模型微调(fine tune) 2、图像标准化。
先来看fine tune~ 一个例子告诉你什么是fine tune?。 假设我们需要训练一个线性模型 y = x; 如果一开始给的权重是 0.1,那么可能要很多步训练才能得到这个类似模型。
但是,如果别人直接給你这个类似权重,你训练就快很多了,对不对? 这个时候你再去反向传播,就是fine tune了。 当然真实的模型训练, 别人不会直接告诉你这个权重的, 但是你可以直接加载别人优秀的模型。 他们的参数和权重得到了很好的验证,你的训练速度会快很多。 你可以把这个模型叫做 预训练模型,这个过程叫迁移学习 , 而参数的调整就叫做** fine tune**
fine tune的优势无外乎两点: 1、不用从头开始,节省资源。 2、验证过的模型准确率高,参数得当。(比如 imagenet ,resnet)
说起imagenet, 这是一个非常牛逼的计算机视觉识别项目,可以说是目前世界图片识别最大的库了, 它建立的初衷是模拟人类的识别系统建立的,整个数据集大概有1500万张图片,2.2万个类别, 而且都是人工注释和控制 质量的,简直是骇人听闻, 可惜我个人觉得它不包括 D2C,不然我们真的可以直接拿来用了。
有兴趣的可以自己点击下面的链接去看看吧~ www.tensorflow.org/js/models?h… image-net.org/
图像标准化: 引用了别人的图片 developers.google.com/machine-lea…


转载自:https://juejin.cn/post/7028085998793785352