首先声明下文中用到很多图片来源不同文章,如果有侵权问题请告知,马上删除
此文献给准备入门或者想了解目前火热的人工智能技术的朋友们,首先科普下,人工智能是个很大的课题,实现的方式有传统的机器学习各种算法,只不过目前效果最好最强大算法是深度学习算法,所以现在常说的人工智能技术一般就是指深度学习。
机器学习的概念早在80年代就提出了,由于计算机性能的限制,和传统算法的局限性,所以没有大规模的应用,直到2006年深度学习算法的出现,相比传统的机器学习算法在很多领域都取得了突破性进展,比如 语音识别 翻译 领域的进展。目前大公司都非常重视人工智能的布局,目前影响未来最大的2个技术我认为一是人工智能、二是基因编辑技术。
很多人了解过的人工智能可能只是听过Alpha Go下围棋战胜最强人类选手,人脸识别,自动驾驶,这些领域,会觉得这些东西离自己很遥远,认为这个技术还是概念不像其他开发语言能实际拿来做项目,或者认为这技术非常难,是博士 硕士才能玩得动,曾经没人教我,我自己网上找教程看,动不动讲一堆数学公式,看来确实头大,差点被吓退了。但是我告诉你其实并没有那么难学,接下来我会带你们从一些基本的概念开始了解,用最直白的话来说明白其中原理。
目前主流的深度学习算法分支大概是这些,每种算法都是在前人的基础上吸收了优点然后不断改进而来,特别感谢国外的开源精神,就是这种开源促使了一个群体加速创新的效应,这几年深度学习发展得很快,谷歌为了促进深度学习在视觉领域的发展,从2004年开始创办的ImageNet视觉竞赛。ImageNet 中含有超过 1500 万由人手工注释的图片,也就是带标签的图片,标签说明了图片中的内容,超过 2.2 万个类别。其中,至少有 100 万张里面提供了边框(bounding box)上图中SLIM分类中的网络就是近几年内取得冠军的网络。直到2017年宣布这个比赛宣布停止了,因为目前最好的网络识别率已经达到了97%的精度,在某种程度上已经超过了人眼。所以没必要再举办下去了。
我简要说明下这些算法分支的应用领域吧
CNN: 主要用于计算机视觉领域,包括分类识别和目标检测
RNN:主要应用领域是有时序特征的数据,比如语音识别、翻译、NLP自然语言处理、天气预测、股票量化投资等
GAN:自编码特征工程、图像风格迁移、图片自动上色、图像的超分辨率修复等等
强化学习:主要应用在游戏领域,业内开源框架openAI 提供了很多基本的操作,就是让ai模拟人来玩游戏,能学习游戏的策略,不断改进自己,就像Alpha Go那样
目前TensorFlow 整体排名第一,是目前最流行的深度学习框架,资料丰富,文档多,基于Python语言容易上手,Keras是一个上层的封装框架,就是把Tensorflow、Theano、CNTK 再封装一遍,可以切换不同的后端网络,不过我建议新手还是从Tensorflow 框架开始,熟悉了之后再去用Keras。
我们从最简单的分类问题入手
首先说下神经网络神经元的一个基本数学表达式:y=f(wx+b)
y就是输出,f是个非线性激活函数,w代表权重,x是输入,b代表偏置 ,别急这些概念通过下面的例子慢慢了解
我们要把图中X和O 分开,这种情况很简单,一条直线就能做到, y=wx+b 比如现在输入一个数字 带入方程得到的Y在直线的右上方,就是X这个分类,在直线左下方就是O分类,这是最简单的情况下,如果数据变成这样
还能用一条直线分开吗?答案是否定的,那怎么办呢?
这是在二维空间不能,那映射到多维空间
,映射也很简单,传统机器学习叫核函数,深度学习力叫非线性的激活函数比如Sigmod
这种函数很多,这只是举个例子,wx+b 主要做一些线性的变化,比如旋转,平移,放大缩小,来区分二维情况下的数据,加上非线性激活函数后,就是会把数据扭曲,变形 比如下图1 无法使用一个超平面将蓝色和红色区域切割开,经过扭曲 变形成图2后就能分割开了
可以发开这个网址 http://playground.tensorflow.org 体验一下数据的流动,变化,最后把它们切分开
上图是一个生物上的神经元,细胞周围那些突触就是接收信号,然后神经元计算处理,然后发射给下一个神经元计算,数学家应用数学模仿这个原理发明了这种算法,因此命名为神经网络。
就用这图来说明吧:
上图中 i1 i2 就是输入特征数据, h1 h2 就是2个神经元,这2个神经元组成一个隐藏层,o1,o2 是输出,我们称为输出层,神经网络就是由一个输入层,多层隐藏层,一个输出层组成的一个网络。
以上图为例子,输入层一般代表我们数据的特征,如果是图片就是每个像素点的值,还可以是其他特征数据,举个生活中的例子吧,比如追女生,输入就是你的特征,身高 年龄 颜值 才艺 薪水 等等,比如你和你朋友同时追2个女生,2个女生就是这2个隐藏层的神经元,你的这些特征经过女生1的大脑神经元,每个特征有不同的重要程度,就是你的每个特征乘以一个w 分配不同的权重,然后把每个特征乘以权重(就是在女生心中的重要程度),然后女生心中就有一个答案就是输出。假设女生1最终输入要等于1才符合她男朋友的标准,女生2要输出2才符合, 假设你是喜欢女生1,但是你的特征经过女生大脑神经元计算输出后是0.5,说明你的有些地方做的还不够好,要去把好的做得更好,不好的改掉(这里如果对应程序,输入的数据是不可能改的,这只是为了故事连接,实际程序做得是,让女生调整对你特征的权重比例),达到她喜欢的输出1。其实深度学习就是这个原理,输入一堆的数据,这些数据特征乘上不同的权重+偏置项,为了输出的值不会偏差太大,会用一个非线性的函数来激活,称为激活函数,常用的有sigmod 、Relu ,函数也很简单 就是把你的值压缩到-1~1之间 0~1之间。
那通过不断的更新这些权重,达到预期的效果,比如你成功追到来女生1,你朋友追到来女生2,那我们最终学习到的模型就是 女生1喜欢什么样的男生,女生2喜欢什么样的男生,然后过段时间你们都分手了,然后要给她们介绍男朋友,我们学习到了上次的模型,就可以直接对男生进行筛选,把男生的特征输入这个神经网络模型,这些特征跟训练好的权重相乘,计算,就能得到你是属于哪个女生喜欢的类型。这就是最简单的神经网络中的分类识别模型。模型学习的就是,不同特征的权重,使得输入的数据经过权重的计算输出跟我们预期的分类相符合,这也是有监督学习最基本的分类模型
如果还不明白,我们用上面的图中的数值带入网络来计算一遍就明白了,首先公式是
不用怕 很简单的计算,L代表的是神经网络的层,J代表是L层的第J个神经元,K代表输入的特征个数, σ 就是上面说的非线性激活函数, w 就是神经元对每个特征的权重,a代表就是输入的特征数据,b是偏置项,就是一个数字, 上述公式用文字来描述就是,输入K个特征 分别和L层的第J个神经元连接的权重相乘,然后加上L层第J个神经元的偏置,然后输入到激活函数, 每个特征和每个权重相乘加上偏置项求和,然后输入一个激活函数,就得出这个神经元计算的结果,具体到上面图中 计算h1=sigmod((0.5*0.15+0.1*0.25)+0.1)) h2 同理,算出结果,比如h1=0.35(没具体算,就是一个-1~1的数字),h2=0.26. 然后经过输出层,输出层也有2个神经元,同理,2个特征 h1 h2 乘以2个权重 求和 非线性激活 得到输出值。这样每个输入特征和每个神经元都进行连接运算,我们称为 全连接网络, 全连接网络 的缺点就是参数太多。我们再举个例子,就是学习深度学习里的hello word
手写数字的识别:首先准备数据集,大概图片长这样,训练样本有6万张,测试样本1000张
输入图片是28*28的单通道灰度图,我们根据上面的模式来搭建一个全连接网络
输入28*28=784 个特征,隐藏层假设我们放1024个神经元,根据我们前面说的,每个特征都要和每个神经元连接的权重相乘,我们来计算一下参数的个数,就是784*1024=802816 个参数,这还只是一层的参数,如果多层这些参数更可怕,所以后面会引入CNN卷积神经网络来减少参数。最后输出9个数字分类的概率,我们用one-hot形式来表示,就是一个长度为10的向量,每一位上代表是该数字分类的概率,最后一位表示不是数字,比如 数字2 的表示为 0100000000,数字3表示为001000000,这里在介绍一个分类会用到的sofrmax, 这个也很简单,比如我们得到输出Y1值为5,y2=3,y3=2, 那么 y1的概率=5/10=0.5 y2=3/10=0.3 y3=2/10=0.2, 取最大概率的那个为最终的分类。以上先介绍了全连接网络的概念以及缺点。
一个完整神经网络分为2步,前向传播计算,反向传播,通常很多教程说的BP算法,这也是整个神经网络的核心基础。先来说前向传播,前向传播比较简单,就是我们把数据喂入神经网络,经过前面神经元的连接和权重的相乘计算,到最后经过一个全连接层,最后输出
反向传播
我们每一层那些W 权重和 B 就是我们要训练的参数,假设我们输入一个数字经过了网络最后输出是3,跟我们预期的答案5,那我们首先得求这个偏差,叫做损失,专门计算这些损失的方法叫做损失函数,损失函数的计算方法有很多种,常用的有均方误差,交叉熵等等。举个例子均方误差就是
根据求出的损失,来推算出前面的W权重该怎么更新。这就要用到数学里面的求导了。导数我简单介绍下也很简单,导数就是来求函数的变化率的,因为我们是经过一层一层的函数计算得到的结果,所以要用到链式求导法则来求每个函数的偏导数,从结果到倒数第一层开始计算偏导数,然后一层一层往回计算,计算出了偏导数,乘以一个学习率就是W要调整的数值,这个计算还是很复杂的,不过都不用我们自己写,框架早就帮我们封装好了,我们只要了解下里面的原理懂得怎么计算的就 行了。 具体的推导过程可以看看
https://www.cnblogs.com/charlotte77/p/5629865.html 这篇写得不错。
首先来看下什么是卷积操作,卷积其实就是 比如一个 3*3的小窗口,里面放着不同的权重参数,然后在一张图上滑动,小窗口的每个数值跟图上重叠部分相乘,然后把这9个格子的得到的结果再相加起来,得到一个数字,每次滑动1个格子 这个叫步长,比如上图5*5的图 用3*3的卷积之后得到的是一个3*3的图。卷积的用处就是提取图片的特征,通过增加不同的卷积核来提取不同的特征,然后经过多层的网络后网络会去学习组合这些特征。下面看一张图
第一层经过卷积之后,可能网络只学习到一些局部的特征,比如眼睛,眉毛 嘴巴等。经过深度的网络之后,开始组合这些特征,学习到能代表这个图片的特征经过一个全连接层输出结果。
卷积的最大好处就是降低参数数量,它是利用权值共享来减少参数,什么意思呢,一个卷积核代表的就是一种特征,在一张图上提取特征这些权值都是一样的。
说到卷积,就不得不说下池化,池化分为平均池化,和最大池化,池化一般就是跟在卷积层后面,同样还是为了降维,池化也是一个核套在图上滑动,平均池化就是把窗口里的值求平均,最大池化顾名思义就是取最大的那个。均值池化可以保留图片的背景特征,最大池化可以突出图片的轮廓特征
卷积还有一个概念需要了解叫填充padding
padding就是在你的输入数据旁边补0,比如5*5的图 用3*3卷积核去卷积,步长1,滑动第3步的时候发现右边跟你的卷积核少了一列,这时候pading就是给这一列补上0,。padding 后卷积后的 宽度 长度 计算公式就是 输入的长/步长 。如果没有padding 那计算公式就是 入长-核长+1/步长
我们接下来来具体看一个卷积神经网络
推导一下是不是就是很清晰了。其他的卷积网络都差不多,网络的层数越多,特征的表达能力越强,不过也带来另一个问题,就是反向求梯度的时候,容易造成梯度消失,所以后来ResNet 残差网络提出了跨层连接的思想,解决了这个问题,使网络深度达到了152层。
总结
再写下去可能篇幅太长了,还是分篇幅来写吧,目标检测网络里还是有些算法需要去推导一下才能理解,然后再去应用,这些算法都是吸收了先前各种版本的优点不断改进。大家如果想入门可以去了解一下Tensorflow 这个框架,上手写几个例子就入门了。个人认为AI技术落地应用化现在是个好时机了,各大公司都在布局,目前由于计算的瓶颈很多计算还是放在云端,但是苹果似乎是 想把AI应用本地化,今年发布的A12芯片,就是专门对AI计算优化的,每秒可计算5万亿次,包括苹果从IOS11开始推出的Meta 结合了Opengl opencl 来处理异构计算框架,支持分类网络,语音识别,自然语言处理等神经网络,这是个很大的机会。互联网现在要创新我觉得一个方向就是需要结合AI的能力来赋能你的产品,做出创新。
联系人:徐经理
手机:13907330718
电话:0731-22222718
邮箱:hniatcom@163.com
地址: 湖南省株洲市石峰区联诚路79号轨道智谷2号倒班房6楼603室