文章目录
每天一遍,学习不厌
一、深度学习概述
1.1引言
早期的深度学习受到了神经科学的启发它们之间有着非常密切的联系。深度学习方法能够具备提取抽象特征的能力,也可以看作是从生物神经网络中获得了灵感。
深度学习(英语: deep learning)是机器学习的分支,是一种以人工神经网络为架构,对数据进行特征学习的算法。
1.2 机器学习与深度学习对比
传统机器学习过程
1.特征提取与人工整理
2.选择机器学习模型
3.针对训练集进行模型训练,得到最优模型参数
4.针对测试集进行测试,得到预测结果
深度学习过程(以图像数据为例)
1.输入(原始图片数据)
⒉提取基础特征(灰度处理,整理基础图片特征数据,图像像素)
3.提取复杂特征(可以有多个步骤,每次提取获取不同的图像信息∶线条、简单形状、复杂形状)
4.模型训练,得到最优模型参数
5.得到预测结果
区别:
(1) 特征整理
-
机器学习需要人工整理特征工程
-
深度学习不需要整理特征,深度学习机器自己整理特征。
-
数据量小的情况下,普通的机器学习的学习效果比深度学习效果更优秀,人为整理好的特征的学习后比深度学习有过之而不及。
-
深度学习适合数据量特别大的情况。
传统机器学习算法需要在样本数据输入模型前经历一个人工特征提取的步骤,之后通过算法更新模型的权重参数。经过这样的步骤后,当在有一批符合样本特征的数据输入到模型中时,模型就能得到一个可以接受的预测结果。
而深度学习算法不需要在样本数据输入模型前经历一个人工特征提取的步骤,将样本数据输入到算法模型中后,模型会从样本中提取基本的特征(图像的像素)。之后,随着模型的逐步深入,从这些基本特征中组合出了更高层的特征,比如线条,简单形状(如汽车轮毂边缘)等。此时的特征还是抽象的,我们无法形象这些特征组合起来会得到什么,简单形状可以被进一步组合,在模型越深入的地方,这些简单的形状也逐步地转化成更加复杂的特征(特征开始具体化,比如看起来更像一个轮毂而不是车身),这就使得不同类别的图像更加可分。这时,将这些提取到的特征再经历类似的机器学习算法中的更新模型权重参数等步骤,也就可以得到一个令人满意的结果。
(2)数据量
从数据量的角度出发:
- 1.深度学习需要大量的训练数据集,会有更高的效果
- ⒉深度学习训练深度神经网络需要大量的算力,因为其中有更多的参数
1.3 应用场景
1.图像识别
- 1.物体识别
- 2场景识别
- 3.人脸检测跟踪
- 4.人脸身份认证
2.自然语言处理技术
- 1.机器翻译
- 2.文本识别
- 3.聊天对话
3.语音技术
- 1.语音识别
二、神经网络简介
2.1 神经元
生物学神经元简单介绍
1904年生物学家就已经知晓了神经元的组成结构。
1.每个神经元都是一个信息处理单元,且具有多输入单个输出特性。
2.神经元的输入可分为兴奋性输入和抑制性输入两种类型。
3.神经元阈值特性,当细胞体膜内外电位差(由突触输入信号总和)超过阈值时
突触
突触是由突触前膜,突触间隙和突触后膜三部分构成,一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触而形成突触
化学突触指的是突触前膜借助化学信号(即递质)将信息转送到突触后细胞;而电突触则借助电信号。化学突触和电突触都又相应地被分为兴奋性突触和抑制性突触。使下一个神经元产生兴奋效应的为兴奋性突触,使下一个神经元禅师抑制效应的为抑制性突触。因此看来,突触的主要作用是在神经元细胞传递信息。
2.2 人工神经网络
2.2.1 常见深度学习框架
目前企业中常见的深度学习框架有很多,TensorFlow, Caffe2, Keras,Theano, PyTorch,Chainer, DyNet,MXNet, and CNTK等等
其中tensorflow和Kears是google出品的,使用者很多,但是其语法晦涩而且和python的语法不尽相同,对于入门玩家而言上手难度较高。
所以在之后的课程中我们会使用facebook出的PyTorch,PyTorch的使用和python的语法相同,整个操作类似Numpy的操作,并且 PyTorch使用的是动态计算,会让代码的调试变的更加简单
2.2.2 搭建人工神经网络
我们仿照神经元模型建立一个人工神经网络,简称神经网络或连接模型。这是一种模仿动物神经网络行为特征,进行分布式信息处理的数学算法模型,本质就是按照生物神经圆的结构和工作原理构造出来一个抽象和简化了的数学模型。
这个模型不必模拟生物神经元的所有属性和行为,但要足以模拟它执行计算的过程。处理简单易表达的目的,我们忽略了不太相关的复杂因素。我们的人工神经网络模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。
下图是一个典型的神经元模型∶包含有2个输入,1个阈值,1个输出,以及2个计算功能。这些线称为"连接"”。每个上有一个"权值”。
数据输入1经过权值1 ,输入2 经过权重2 参与计算。如果不经过线性函数,直接输出值y。那么y = w0 +w1x1 +w2x2
将上一个神经元得到的y的值交给下一个神经元,作为输入重新参与计算。由此可知这样上一个的神经元是线性的,那么得到的值经过下一个神经元线性的计算,得到的值依然是线性的。这样的神经网络无论有几个,最后只能得到线性的神经网络。
所以就需要一个非线性激活函数 模拟神经元之间进行数据传输的时候,神经元之间的信息并不能全部都传递给下一个神经元,模拟神经元之间信息的损失损耗。
对于某一个神经元,它可能同时接收了多个输入信号(输入1,2),神经元之间考形成突触的方式构成神经网络,但各个突触的结构的性质与连接强度不尽相同,具体表示时相同的输入可能对不同的神经元有不同的影响。引入权重值的目的就是为了模拟突触的这种表现,其征途代表了生物神经元中突出的兴奋或抑制,其大小则表示突触间的不同连接强度。
b表示一个阈值。
考虑到神经元的累加性,我们对全部的输入信号进行累加整合,相当于生物神经元中膜电位的变化总量,其值可以用下述公式表示∶
生物神经元的激活与否取决于输入信号与某一阈值电平的比较。在神经元模型中也是类似的,只有当其输入总和超过阈值b是才会被激活,否则神经元不会被激活,当处于激活后,可以计算出y值。
之后会在进行一个非线性变换,也就是经过非线性激活函数,计算出该节点的输出(激活值) a = g(y)
其中g(y)为非线性函数。在深度学习中,常用的激活函数主要有,sigmoid, tanh,ReLu。
比如此时我们选用sigmoid函数,该函数是将取值为负无穷到正无穷的数映射到( 0,1 )之间。Sigmoid函数的公式及图形如下。
若神经元的激活a为正值,称改神经元处于激活状态或兴奋状态,若a为负值,则称神经元处于抑制状态。I
** 总结 ** :
使用数学公式表示就是:
一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数得到一个标量结果。
2.2.3神经网络基本结构(NN)
简单神经网络可分为三层,分别是输入层、输出层、以及中间的隐藏层
不同的输入层会被不同的神经元进行刺激计算,得到的结果再交给输出层,再交给下一个。 一个样本的不同的特征就是不同的输入层,同时交给隐藏层中的一个神经元,神经元计算后,加上权重,加上阈值得到y,将交给一个激励函数sigmoid 计算。得到的输出交给输出层。
每个隐藏层中神经元对于x1,x2,x3的阈值和权重都不一样,训练使得权重得到最优
层级主要是算经过了几层的权重运算
输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。
1.设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定﹔
⒉.神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
3.结构图里的关键不是圆圈(代表"神经元”),而是连接线(代表"神经元"之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
2.2.4 感知机
感知机由两层神经网络组成,输入层接收外界输入信号后传递给输出层(输出+1正例,-1反例)输出层是M-P神经元
感知机的作用:
把一个n维向量空间用一个超平面分割成两部分,给定一个输入向量,超平面可以判断出这个向量位于超平面的哪一边,得到输入时正类或者是反类,对应到2维空间就是一条直线把一个平面分为两个部分。
2.2.5 多层神经网络
2.3 神经网络训练过程
1.整理输入与输出(输出不一定只有一个输出要自己确定)
我们有一组样本数据。每个样本有三个输入特征与一个输出结果。我们需要做的就是通过三个输入特征值预测输出。
⒉模型搭建与训练(自己确定隐藏层和感知机的数量)
依据设计好的神经网络结构,为每一层的输入分配权重,完成神经网络正向结构搭建。基于正向传播计算样本预测输出。根据已知训练样本,设计损失函数,基于反向传播不断迭代更新每一层的权重参数使得损失函数值向最低点快速收敛。
3.预测
使用训练好的一组权重,对未知输出的输入进行结果预测。
正向传播就像多人比划猜图的过程。
多人之间有w都有误差,经过多层描述,最后的结果就会有误差
反向传播就是为了更新w的值,使得误差越变越小。
最后一个人告诉前面的人,哪里有错误,所以前面的人就修正w。倒数第二个人又告诉倒数第三个人。依次向前修正。
2.4 正向传播(FP -Forward Propagation )
现有两个特征的数据 经过权重计算得到 x1,然后经过sigmoid 最终第一层的结果为x1
根据矩阵的算法确定输出是几个,可以通过矩阵的相乘,可以达到升维的效果。
经过多层的矩阵变换得到最后一个的输出结果
2.4.1正向传播的推导
layer0是第0层,就是输出。就是矩阵之间运算。所以对这个函数的损失函数的求导就是复合函数的求导,所以需要从内层到外层一层一层求导。而且w是矩阵,涉及对于矩阵的求导。
2.5 反向传播(BP- Backward Propagation )
根据预测结果与实际结果的误差设计损失函数,对损失函数求偏导,随着迭代次数的不断增加。从而从后向前更新权重的过程称为反向传播。
起初,w0,w1,w2都是随机生成的,经过正向传播得到的值是0.73,实际值为1.73,所以误差就是1。进行反向传播更新
反向传播根据一个函数 loss* f “(x)就是损失值乘以对想求偏导的一个函数,进行求得上一层的损失值。
有分叉的时候就是对应求偏导,带入求值
代码实现
1.设计神经网络结构,按照已定结构训练神经网络实现分类业务。
图中 w0 ,w1 的初始的值为 -1到1 之间。可以随意设置
2.封装模型