深度学习入门
概述
三者关系
人工智能(Artificial Intelligence,AI)是最宽泛的概念,是研发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。由于这个定义只阐述了目标,而没有限定方法,因此实现人工智能存在的诸多方法和分支,导致其变成一个“大杂烩”式的学科。机器学习(Machine Learning,ML)是当前比较有效的一种实现人工智能的方式。深度学习(Deep Learning,DL)是机器学习算法中最热门的一个分支,近些年取得了显著的进展,并替代了大多数传统机器学习算法。
机器学习
机器学习的实施方法和人类科研的过程有着异曲同工之妙,下面以“机器从牛顿第二定律实验中学习知识”为例,帮助读者更加深入理解机器学习(监督学习)的方法论本质,即在“机器思考”的过程中确定模型的三个关键要素:假设、评价、优化。
(1)模型假设:世界上的可能关系千千万,漫无目标的试探Y XY X之间的关系显然是十分低效的。因此假设空间先圈定了一个模型能够表达的关系可能,如红色圆圈所示。机器还会进一步在假设圈定的圆圈内寻找最优的YY~XX关系,即确定参数ww。
(2)评价函数:寻找最优之前,我们需要先定义什么是最优,即评价一个YY~XX关系的好坏的指标。通常衡量该关系是否能很好的拟合现有观测样本,将拟合的误差最小作为优化目标。
(3)优化算法:设置了评价指标后,就可以在假设圈定的范围内,将使得评价指标最优(损失函数最小/最拟合已有观测样本)的YY~XX关系找出来,这个寻找最优解的方法即为优化算法。最笨的优化算法即按照参数的可能,穷举每一个可能取值来计算损失函数,保留使得损失函数最小的参数作为最终结果。
深度学习
机器学习算法理论在上个世纪90年代发展成熟,在许多领域都取得了成功,但平静的日子只延续到2010年左右。随着大数据的涌现和计算机算力提升,深度学习模型异军突起,极大改变了机器学习的应用格局。今天,多数机器学习任务都可以使用深度学习模型解决,尤其在语音、计算机视觉和自然语言处理等领域,深度学习模型的效果比传统机器学习算法有显著提升。
相比传统的机器学习算法,深度学习做出了哪些改进呢?其实两者在理论结构上是一致的,即:模型假设、评价函数和优化算法,其根本差别在于假设的复杂度。
这种变换已经无法用数学公式表达,因此研究者们借鉴了人脑神经元的结构,设计出神经网络的模型
神经网络
人工神经网络包括多个神经网络层,如:卷积层、全连接层、LSTM等,每一层又包括很多神经元,超过三层的非线性神经网络都可以被称为深度神经网络。通俗的讲,深度学习的模型可以视为是输入到输出的映射函数,如图像到高级语义(美女)的映射,足够深的神经网络理论上可以拟合任何复杂的函数。因此神经网络非常适合学习样本数据的内在规律和表示层次,对文字、图像和语音任务有很好的适用性。这几个领域的任务是人工智能的基础模块,因此深度学习被称为实现人工智能的基础也就不足为奇了。
- 神经元:神经网络中每个节点称为神经元,由两部分组成:
- 加权和:将所有输入加权求和。
- 非线性变换(激活函数):加权和的结果经过一个非线性函数变换,让神经元计算具备非线性的能力。
- 多层连接: 大量这样的节点按照不同的层次排布,形成多层的结构连接起来,即称为神经网络。
- 前向计算: 从输入计算输出的过程,顺序从网络前至后。
- 计算图: 以图形化的方式展现神经网络的计算逻辑又称为计算图,也可以将神经网络的计算图以公式的方式表达:
Y=f3(f2(f1(w1⋅x1+w2⋅x2+w3⋅x3+b)+…)…)…)Y=f3(f2(f1(w1⋅x1+w2⋅x2+w3⋅x3+b)+…)…)…)
由此可见,神经网络并没有那么神秘,它的本质是一个含有很多参数的“大公式”
为何神经网络到2010年后才焕发生机呢?这与深度学习成功所依赖的先决条件:大数据涌现和硬件发展有关。
职业发展空间
根据各大咨询公司的行业研究报告,人工智能相关产业在未来十年预计有30%~40%的年增长率。一方面,人工智能的应用会从互联网行业逐渐扩展到金融、工业、农业、能源、城市、交通、医疗、教育等更广泛的行业,应用空间和潜力巨大;另一方面,受限于工智能技术本身的成熟度以及人工智能落地要结合场景的数据处理、系统改造和业务流程优化等条件的制约,人工智能应用的价值释放过程会相对缓慢。这使得市场对人工智能的岗位需求形成了一条稳步又长期增长的曲线,与互联网行业相比,对多数的求职者更加友好
机器学习的流程
数据获取——>特征工程——>建立模型——>评估与应用
深度学习相比一般的机器学习,在特征工程中不用依靠人工设置,可以通过神经网络这个大黑盒子,自动提取特征,选择合适的特征和组合
特征工程的作用:
- 数据特征决定了模型的上限
- 预处理和特征提取是最核心的
- 算法与参数选择决定了如何逼近这个上限
传统特征提取方法:
深度学习特征提取方法:
深度学习的应用
- 无人驾驶汽车:比如物体识别,以后用到的大多数就是计算机视觉和自然语言处理
- 人脸识别,比如人脸特效,也有特征定位
- 医学应用,基因组合等等
- AI换脸
- 图片处理,超分辨率重构。
存在的问题
深度学习需要的参数巨量,几千万级别很常见。所以速度会很慢
计算机视觉
图像分类
给出图像,能够识别出图片中的物体是什么
图像表示
计算机眼中的一张图片被表示成三维数组的形式,每个像素的值从0到255
例如:3001003
面临的挑战
-
拍照角度多变
-
形状改变
-
部分遮蔽
-
背景混入
应对上述挑战就是增加相似的数据训练,重要的还是大数据量
机器学习常规套路
- 收集数据并给定标签
- 训练一个分类器
- 测试,评估
K近邻算法
K近邻计算流程
- 计算已知类别数据集中的点与当前点的距离
- 按照距离依次排序
- 选取与当前点距离最小的K个点
- 确定前K个点所在类别的出现概率
- 返回前K个点出现频率最高的类别作为当前点预测分类
K近邻分析
- KNN 算法本身简单有效,它是一种 lazy-learning 算法。
- 分类器不需要使用训练集进行训练,训练时间复杂度为0.
- KNN 分类的计算复杂度和训练集中的文档数目成正比也就是说,如果训练集中文档总数为 n,那么 KNN 的分类时间复杂度为O(n).
- K值的选择,距离度量和分类决策规则是该算法的三个基本要素
数据库样例:CIFAR-10
距离的选择
测试结果
部分结果还可以但是不够理想
参数选择
用交叉验证(实践来检验真理)。交叉验证是最合适的参数选择方法,比经验值靠谱的多!
为什么K近邻不能用来图像分类
背景主导是一个最大的问题,我们关注的却是主体(主要成分)。那么现在主要用到就是神经网络
神经网络基础
线性函数
计算方法
这里类似矩阵计算
W:参数,是不断调整的,训练的过程实质上就找到比较好的W
xi:是测试样例,不变
最后面是得分,很显然,这里的W不好
多组权重参数构成了决策边界
损失函数
上面说到的“不好”要用损失函数来体现
结果的得分值有着明显的差异,我们需要明确的指导模型的当前效果,有多好或是多差!
正则惩罚项
其必要性
很显然,虽然模型A,B的损失函数值相同,但是参数大不相同,w1不稳定,过拟合。不是我们所想要的。
正则化惩罚项可以说是参数的损失。这里正则化惩罚项的系数λ越大,表示越不希望过拟合。不要变异的
Softmax分类器
现在我们得到的是一个输入的得分值,但如果给我一个概率值岂不更好!如何把一个得分值转换成一个概率值呢?
前向传播
上面说的就是有个前向传播的过程
反向传播
如何更新模型呢?这个就交给反向传播了(梯度下降)
引入:当我们得到了一个目标函数后,如何进行求解?直接求解?(并不一定可解,线性回归可以当做是一个特例)
常规套路:机器学习的套路就是我交给机器一堆数据,然后告诉它什么样的学习方式是对的(目标函数),然后让它朝着这个方向去做
如何优化:一口吃不成个胖子,我们要静悄悄的一步步的完成迭代(每次优化一点点,累积起来就是个大成绩了)
例子1:
例子2:
学习率(步长):对结果会产生巨大的影响,一般小一些
如何选择:从小的时候,不行再小
批处理数量:32,64,128都可以,很多时候还得考虑内存和效率
简短的例子
链式法则
梯度是一步一步传的,不要越级
也可以一大块一大块的计算
门单元
加法求偏导时会把梯度平均分配
MAX门单元给到最大的,其他的为零
乘法门单元求偏导会把梯度交换
神经网络
整体架构
- 层次结构,可以看出神经网络是由一层一层实现的
- 神经元,这里的input layer成里面的圆圈个数指的就是输入特征个数(相当于Java中的一个对象的属性)。这里的隐层中的神经元个数会变化,这是可以的
- 全连接,就是这里的神经元与下一层每个神经元相连
- 非线性,要求非线性,在每个隐层后面加一个非线性变化【激活函数的作用】,避免被多层函数被一次所替代【可以理解为复合函数不能被一个简单函数所表示】
正则化和神经元的影响
可以在这个网站上修改体验ConvNetJS demo: Classify toy 2D data
神经元个数不能太多不能太少,否则会过拟合和不精准
正则化系数不能太大不能太小,否则会不精准和过拟合
激活函数
激活函数就做非线性变换的,这里说几个常见的激活函数(Sigmoid,Relu,Tanh 等)
对比
- Sigmoid是早期所采用的,可以看出,图像斜率有时候趋近于零,容易造成梯度消失的现象。所以常用的是下面这个
- Relu现在常用的激活函数
数据预处理
不同的预处理结果会使得模型的效果发生很大的差异!
参数初始化
通常我们都使用随机策略来进行参数初始化
DROP-OUT
为了防止过拟合,除了正则化,还可以结合DROP-OUT
在每次训练中在每层神经元中随机选择一部分神经元杀死【每次训练不一定一样】,这样简化了一下架构,防止过拟合
卷积神经网络CNN
应用场景
卷积神经网络(CNN)主要应用于计算机视觉【CV】领域
重要的就是如何提取特征,有了特征能干很多事情
-
检测任务
-
分类和检索【淘宝图片搜类似的商品用到就是检索功能】
-
超分辨率重构
-
医学任务【比如分析CT图】,光学字符识别(OCR),无人驾驶,人脸识别等应用
卷积网络与传统网络的区别
整体架构
- 输入层
- 卷积层
- 池化层
- 全连接层
卷积层
注意:上面箭头两边的维度细节不太严谨,理解原理即可
众所周知,一张图像可以分成RGB三个通道
一次卷积就是在不同区域,一次提取特征值,得到特征图。子区域移动的步长可以自己设置
通过一个Filter可以得到输出一个特征图,多个Filter就可以输出多个特征图【上图就是两个,得到了两个特征图】。不同的Filter可以可以丰富特征图结果。下面示例
通常做一次卷积是不够的
卷积层涉及参数
-
滑动窗口步长
指的就是子区域一次移动的距离,很显然移动的越小特征提取越细,计算效率越低。通常可以根据任务类型的不同,设置不同的参数。一般设置成1
-
卷积核尺寸
指的就是子区域的大小,上面的子区域就是所谓的卷积核。同样卷积核越小特征提取越细,计算效率越低。通常可以根据任务类型的不同,设置不同的参数。一般设置成3*3
-
边缘填充
从上面一次卷积过程的图中可以看出,边缘区域是灰色的0,这就是边缘填充,pad就是相关参数。
可以看出,在计算特征图是,源数据图的每个点参与计算的次数不相同。中间参与的多,边缘参与的少。边缘填充是的本来是边缘的数据不在是边缘。一定程度上弥补了边缘缺失的问题
之所以填充零是因为对特征图结果无影响。
-
卷积核个数
和得到的特征图个数一致,和filter个数相关。每个特征图不一样,各自进行更新
卷积结果计算公式
其中W1、H1表示输入的宽度、长度;W2、H2表示输出特征图的宽度、长度;F表示卷积核长和宽的大小;S表示滑动窗口的步长;P表示边界填充(加几圈0)。
举个例子
如果输入数据是32*32*3
的图像,用10个5*5*3
的filter来进行卷积操作,指定步长为1,边界填充为2,最终输入的规模为?
(32-5+2*2)/1 + 1 = 32
,所以输出规模为32*32*10
,经过卷积操作后也可以保持特征图长度、宽度不变。
可以,经过卷积之后,特征图大小不一定变小,这里的就没变。
卷积参数共享
如果每个区域对应到参数不同【作图】,那么参数会很多,会影响效率,导致过拟合。卷积神经网络的参数共享对于不同区域,共享参数,减少了参数数量。
数据依旧是32*32*3
的图像,继续用10个5*5*3
的filter来进行卷积操作,
所需的权重参数有多少个呢?
5*5*3 = 75
,表示每一个卷积核只需要75个参数,此时有10个不同的卷积核,
就需要10*75 = 750个卷积核参数,不要忘记还有b参数,每个卷积核都有一
个对应的偏置参数,最终只需要750+10=760个权重参数。
池化层
通过卷积层,得到了丰富的特征,如何压缩这些特征【下采样】呢。提取有用的特征,过滤掉无用特征。
常用的就是最大池化,把子区域中的最大值提取出来,这样用最大值代表这个子区域。
另外就是平均池化,顾名思义就是把区域中的特征值提取平均值
注意:池化过程没有矩阵运算,就是简单的压缩过滤筛选
多层结合
通过一次一次的提取【CONV】、激活【RELU】和池化【POOL】。最后把特征图拉伸成特征向量,通过全连接层【FC】得到最终结果
通常所说的多少多少层网络,这里的层指的就是有矩阵运算的层。这里RELU和POOL层都不涉及矩阵运算。只有卷积和全连接层涉及。所以上图是7层卷积神经网络
经典网络
Alexnet
VGG
这里框起来的是VGG最流行的版本,有16层,可以看出其中maxpool后为了弥补特征损失,使特征图个数翻倍。
相比Alexnet的精准度更好,但是效率降低了,训练时间以天为单位了
随着层数增加精准度也不一定会增加,反而可能会降低,因为提取出来的特征可以是错的,不断增加层数可能会放到错误。这样在当时跟了学者更加迷茫,深度学习就止步于此了吗?
Resnet
中国学者针对上面的问题,该残差神经网络会把错误的层“跳过”。这样减少了错误的累积
可以看出,经过同等映射【图中弧线所示】可以拿到之前的x,可以和F(x)堆叠。如果其表现不好,可以把其权重参数设置为0,使其不产生影响。
感受野
如果堆叠3个3*3
的卷积层,并且保持滑动窗口步长为1,其感受野就是7*7
的了,这跟一个使用7*7
卷积核的结果是一样的,那为什么非要堆叠3个小卷积呢?可以看一下下面的例子
假设输入大小都是h*w*c
,并且都使用c个卷积核(得到c个特征图),可以来计算一下其各自所需参数:
很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数,这就是VGG网络的基本出发点,用小的卷积核来完成体特征提取操作。
循环神经网络RNN
RNN
又称递归神经网络
可以看右边的简单图,隐层有个弧线,便是其隐层中间结果会参与到下一次输入。这样神经网络可以考虑到时间上的数据关系。这里常用于自然语言处理【NLP】。因为文本前后之间往往有逻辑等关系。这样能提高精准度。
xt表示第t,t=1,2,3...步(step)的输入
st为隐藏层的第t步的状态,它是网络的记忆单元。
st=f(Uxt+Wst−1),其中f一般是非线性的激活函数
ot是第t步的输出,如下个单词的向量表示softmax(Vst)
可以很形象的看出实现了右边的效果。这里是叠加的,所以都会考虑到
长短期记忆网络LSTM
对应RNN会考虑之前的所有结果。这可能会造成误差,LSTM网络有选择的考虑之前结果,有助于提高正确率
C:控制参数
决定什么样的信息会被保留什么样的会被遗忘
门是一种让信息选择式通过的方法,sigmoid神经网络层和一乘法操作
Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过” ,1 就指“允许任意量通过”!
词向量模型
通常要让神经网络更好的使用文本数据,通常要把词转换成向量。通俗易懂的解释就是,对于一个陌生人可以根据很多个指标去了解他,比如身高体重,性格爱好,年龄等等。词向量模型就是把一个词用特征向量描述。也可以很好解决异名同义的问题。比如“自然语言处理”和“NLP”的关系。
只要有了向量就可以用不同的方法来计算相似度。
通常,数据的维度越高,能提供的信息也就越多,从而计算结果的可靠性就更值得信赖
如何来描述语言的特征呢?通常都在词的层面上来构建特征。Word2Vec就是要把词转换成向量
具体有什么含义很难说清,也不用理解,就像卷积神经网络的中间值一样,像个黑盒,
在结果中可以发现,相似的词在特征表达中比较相似【这里相近的词对应位置的颜色比较相近】,也就是说明词的特征是有实际意义的!
神经网络维护一个词库大表,通过输入的词,找到对应的特征向量。然后经过神经网络得出结果,在反向传播,不仅会更新参数,还会跟新词库大表。
训练数据库构建
只要是正常的文本都可以。因为是相通的。注意:相比英文,中文输入之前要经过分词处理,英文单词有天然的空格分开,而中文是连在一起的
得到一篇文章以后,可以根据小窗口一点一点滑动提取信息
常见的两个模型
- 左边是CBOW模型,根据上下文推测文本,想象完形填空
- 右边是Skip-gram模型,根据词推测上下文
训练过程
如果一个语料库稍微大一些,可能的结果简直太多了,最后一层相当于softmax,计算起来十分耗时
初始方案:输入两个单词,看他们是不是前后对应的输入和输出,也就相当于一个二分类任务
负采样方案
出发点非常好,但是此时训练集构建出来的标签全为1,无法进行较好的训练
改进方案:加入一些负样本(负采样模型)
光学字符识别OCR
用途
提取图像中的文字,并转换成文本形式,供后续NLP任务使用
图像提取文本
-
检测到文字所在位置(CTPN)
-
识别文本区域内容(CRNN)
CTPN算法
Connectionist Text Proposal Network算法,文本检测本质上也属于物体检测,但是文本却跟常规的物体有较大区别
- 文本通常都是从左往右写的(水平),并且字之间的宽度都大致相同
- 固定宽度,来检测文本高度即可,但是如何应对变长序列呢?
- 本质上还是RPN方法(可参考faster-rcnn),可将检测到的拼在一起!
从这个图可以看出,我们可以用很多个宽度相等【高度不一定相等】的矩形,最后频道一起,这样可以应对边长序列的问题
网络架构
-
VGG提取特征:
识别小框是不是文本,一个分类问题
-
BLSTM融入上下文信息:
CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征(毕竟文字是连续的)。
CTPN中使用双向LSTM,相比一般单向LSTM有什么优势?双向LSTM实际上就是将2个方向相反的LSTM连起来。把前后两个方向的特征值拼到了一起,两倍的关系
一般来说,双向LSTM都好于单向LSTM。还是看LSTM介绍文章中的例子:
我的手机坏了,我打算____一部新手机。
假设使用LSTM对空白部分填词。如果只看横线前面的词,“手机坏了”,那么“我”是打算“修”还是“买”还是“大哭一场”?双向LSTM能看到后面的词是“一部新手机“,那么横线上的词填“买“的概率就大得多了。显然对于文字检测,这种情况也依然适用。
-
基于RPN完成检测
过程分析
-
上面图中,
3*3*C
的C指的是一个点的特征个数,相当于CNN中的第三个维度,上面说到的RGB三个维度。也相当于词向量模型中文字的特征个数 -
可以看出,在W维度上展开成了一个序列,输入到了BLSTM中。然后每个点会产生多个候选框,高度不尽相同,后续会进一步筛选。
-
有了候选框,就要先看看候选框是背景还是文字。
-
2k vertical coordinates
指的是文本框两个坐标微调的结果之所以是两个维度,以为宽度是固定了的不用微调
-
可以从图中可以看出结果有
2k scores
,k指的是每个点会产生多少个候选框。每个候选框会有前景和背景两个得分,所以才是2k scores
-
k side-refinement
指的是对整个边界的微调,改善有时候覆盖的不太好的情况。注意这里只调位置x,不调宽度和高度。所以是一维的
-
VGG特征提取模块
经过了4次池化操作,特征图中一个像素对应原始输入的16个像素,因为这里每次池化都会减少原来的1/2
候选框Anchor大小选择
宽度固定,长度选了10个
输出结果
输出结果包括了三部分:2K得分,22K回归,1K边界调整
边界调整能使得文本检测框效果更好,下列是调整后的结果
拼接成大区域
检测到每一个小块文本区域还需拼接成完整的文本区域。
规则:分前向和后向两部分
先前向走,对于Xi,基于重合度【相邻点的文本框是重合的】(0.7)与位置距离(50像素)找到score值最大的的Xj,接下来再返向走(规则不变),比较两次得分值大小来判断序列。
举个例子
如图,Anchor已经按照 x 顺序排列好,并具有图中的Softmax score(这里的score是随便给出的,只用于说明文本线构造算法):
- 对 i=3 的 box3 ,向前寻找50像素,满足 overlapv>0.7 且score最大的是 box7 ,即 j=7 ; box7 反向寻找,满足 overlapv>0.7 且score最大的是 box3 ,即 k=3 。由于 score3>=score3 , pair(box3,box7) 是最长连接,那么设置 Graph(3,7)=True
- 对 box4 正向寻找得到 box7 ; box7 反向寻找得到 box3 ,但是 score4<score3 ,即 pair(box4,box7) 不是最长连接,包含在 pair(box3,box7) 中。
总结:如果 scorei >= scorek【前行得分不小于反向得分】 则这是一个长序列,反之则该序列被更长的序列所包含
CRNN算法
就是把卷积神经网络和循环神经网络结合到一起了
首先CNN进行特征提取,接下来RNN进行序列特征提取,最后得出预测结果即可。
注意:这里面的池化层,H和W可以不是等倍数的变换,这要得到结果也方便输入到RNN网络中。图中25*512
和CTPN的小方格个数没关系
CTC模块
其中还涉及了CTC模块,目的是对齐输入和输出结果,使结果更加稳定精确。
上面不同的输入,输出的长度也不同。可以处理输入输出标签对应不上的问题
在实际情况中,标记这种对齐样本非常困难(除了标记字符,还要标记每个字符的位置),工作量非常大。另外,由于每张样本的字符数量不同,字体样式不同,字体大小不同,导致每列输出并不一定能与每个字符一一对应。
当然这种问题同样存在于语音识别领域。例如有人说话快,有人说话慢,那么如何进行语音帧对齐,是一直以来困扰语音识别的巨大难题。
所以CTC提出一种对不需要对齐的Loss计算方法,用于训练网络,被广泛应用于文本行识别和语音识别中。
识别出中间空白和停顿区域,插入特殊字符,然后再适当去重,最后结果去掉特殊字符。