【计算机视觉】神经网络推理训练

0. 前言

此篇只讲解深度学习有关的基础概念和知识点

1. 激活函数

  • 神经元

    在这里插入图片描述

  • 在神经网络中,把处于在活跃状态的神经元称为激活态,处于非活跃状态的神经元称为抑制态

  • 激活函数赋予了神经元自我学习和适应的能力。 激活函数是神经网络设计的一个核心单元。

  • 作用(面试常问):为了在神经网络中引入非线性的学习和处理能力。 更好的实现一刀切

  • 常用的激活函数(满足 1 非线性 2 可微性 3 单调性)

    1. sigmoid函数

      缺点:梯度饱和,两边数值的梯度都为0; 结果的平均值不为0,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。
      y = l o g s i g ( x ) = 1 1 + e − x y=logsig(x)=\frac{1}{1+e^{-x}} y=logsig(x)=1+ex1
      步骤:先加权求和再带入激活函数,如下图所示

      在这里插入图片描述

    2. tanh函数
      y = t a n s i g ( x ) = e x − e − x e x + e − x y=tansig(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} y=tansig(x)=ex+exexex
      在这里插入图片描述

    3. ReLU函数 (线性整流层)
      f ( x ) = m a x ( 0 , x ) f(x) = max (0, x) f(x)=max(0,x)
      在这里插入图片描述

      ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被称为单侧抑制

      正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。

      模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍

      其他延伸:

      ReLU6:
      f ( x ) = { 0 , x ≤ 0 x , 0 < x < 6 6 , x ≥ 6 f(x)= \left\{ \begin{matrix} 0,x≤0\\ x,0<x<6\\ 6,x≥6 \end{matrix} \right. f(x)= 0,x0x,0<x<66,x6
      leaky relu:
      f ( x ) = { x , x > 0 a x , x ≤ 0 ( a 为很小的数) f(x)= \left\{ \begin{matrix} x,x>0\\ ax,x≤0(a为很小的数) \end{matrix} \right. f(x)={x,x>0ax,x0a为很小的数)

    在这里插入图片描述

2. 设计神经网络

  1. 使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数

  2. 特征向量在被传入输入层时通常要先标准化到0-1之间(为了加速学习过程)

  3. 离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值

    比如:特征值A可能取三个值(a0, a1, a2), 可以使用3个输入单元来代表A。

    如果A=a0, 那么代表a0的单元值就取1, 其他取0;1,0,0

    如果A=a1, 那么代表a1的单元值就取1,其他取0,以此类推 0,1,0

  4. 神经网络既可以用来做分类(classification)问题,也可以解决回归(regression)问题

    (1)对于分类问题,如果是2类,可以用一个输出单元表示(0和1分别代表2类);如果多于2类,则每一个类别用一个输出单元表示 1 0 0 01 0

    (2)没有明确的规则来设计最好有多少个隐藏层,可以根据实验测试和误差以及精准度来实验并改进。

3. 深度神经网络&深度学习

  • 深度神经网络:具有多个隐藏层的神经网络

  • 深度学习:基于深度神经网络的机器学习研究

  • 深度神经网络可以理解为对传统多层网络进行了结构、方法等方面的优化

在这里插入图片描述

  • 深度学习,就是多层人工神经网络 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述
    图像识别:像素->边缘->纹理->图形->局部->物体

    文字识别:字符->词->词组->子句->句子->故事

4. 推理和训练

4.1 推理和训练

  • Supervised Learning有监督式学习 :输入的数据被称为训练数据,一个模型需要通过一个训练过程,在这个过程中进行预期判断,如果错误了再进行修正,训练过程一直持续到基于训练数据达到预期的精确性。其关键方法是分类和回归,比如逻辑回归(Logistic Regression)和BP神经网络(BackPropagation Neural Network)
  • Unsupervised Learning无监督学习: 没有任何训练数据,基于没有标记的输入数据采取推导结构的模型,其关键方式是关联规则学习和聚合,比如k-means。
  • 训练(Training):一个初始神经网络通过不断的优化自身参数(这个参数也就是权重和偏置),来让自己变得准确。
  • 推理(Inference):你训练好了一个模型,在训练数据集中表现良好,但是我们的期望是它可以对以前没看过的图片进行识别。你重新拍一张图片扔进网络让网络做判断,这种图片就叫做现场数据(live data),如果现场数据的区分准确率非常高,那么证明你的网络训练的是非常好的。这个过程称为推理 (Inference)。

4.2 训练的相关概念

4.2.1 数据集的分类&优化与泛化

优化和泛化深度学习的根本问题是优化和泛化之间的对立。

  • 优化(optimization)是指调节模型以在训练数据上得到最佳性能(准确度的好坏)(即机器学习中的学习)。

  • 泛化(generalization)是指训练好的模型在前所未见的数据上的性能好坏。

分类

  1. 训练集:实际训练算法的数据集;用来计算梯度,并确定每次迭代中网络权值的更新;

  2. 验证集:用于跟踪其学习效果的数据集;是一个指示器,用来表明训练数据点之间所形成的网络函数发生了什么,并且验证集上的误差值在整个训练过程中都将被监测;

    交叉验证

    这里有一堆数据,我们把他切成3个部分(当然还可以分的更多)

    第一部分做测试集,二三部分做训练集,算出准确度;

    第二部分做测试集,一三部分做训练集,算出准确度;

    第三部分做测试集,一二部分做训练集,算出准确度;

    之后算出三个准确度的平局值,作为最后的准确度。

  3. 测试集:用于产生最终结果的数据集 。

为了让测试集能有效反映网络的泛化能力:

  1. 测试集绝不能以任何形式用于训练网络,即使是用于同一组备选网络中挑选网络。测试集只能在所有的训练和模型选择完成后使用;
  2. 测试集必须代表网络使用中涉及的所有情形

4.2.2 BP神经网络

  • BP网络(Back-Propagation Network)又称为反向传播神经网络,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。它是一种有监督的学习算法,用于函数逼近、模型识别分类、数据压缩和时间序列预测等。整个的训练过程是在基于bp神经网络上。

  • 该算法最主要是通过误差反向传播来优化参数(权重)

  • 一个典型的BP网络应该包括三层:输入层、隐藏层和输出层。各层之间全连接,同层之间无连接。隐藏层可以有很多层。

    一个例子:我们利用神经网络去解决图像分割,边界探测等问题时候,我们的输入(假设为x),与期望的输出(假设为y)之间的关系究竟是什么?也就是y=f(x)中,f是什么,我们也不清楚,但是我们对一点很确信,那就是f不是一个简单的线性函数,应该是一个抽象的复杂的关系,那么利用神经网络就是去学习这个关系,存放在model中,利用得到的model去推测训练集之外的数据,得到期望的结果。

  • 训练(学习)过程:

    • 正向传播 :输入信号从输入层经过各个隐藏层向输出层传播。在输出层得到实际的响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。

    • 反向传播 :按照梯度下降的方法从输出层经过各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。

在这里插入图片描述

备注:推理的过程与训练中的正向传播过程完全一样,但正向传播是属于训练过程在这里插入图片描述

BP神经网络 BP算法是一个迭代算法,它的基本思想如下:

  1. 将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。

  2. 由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;

  3. 在反向传播的过程中,根据误差调整各种参数的值(相连神经元的权重),使得总损失函数减小。

  4. 迭代上述三个步骤(即对数据进行反复训练),直到满足停止准则。

4.2.3 其他相关概念

(Epoch):使用训练集的全部数据对模型进行一次完整训练,被称为“一代训练”。

批大小(Batch size):使用训练集的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”

迭代(Iteration):使用一个Batch数据对模型进行一次参数更新的过程,被称为“一次训练”(一次迭代)。

每一次迭代得到的结果都会被作为下一次迭代的初始值。一个迭代=一个正向通过+一个反向通过。
N u m b e r o f B e t c h e s = T r a i n i n g S e t S i z e B a t c h S i z e Number\quad of\quad Betches=\frac{Training\quad Set\quad Size}{Batch\quad Size} NumberofBetches=BatchSizeTrainingSetSize
比如训练集有500个样本,batchsize = 10 ,那么训练完整个样本集:iteration=50,epoch=1.

4.3 训练的步骤及涉及的问题

粗略的训练过程

  1. 提取特征向量作为输入。

  2. 定义神经网络结构。包括隐藏层数,激活函数等等。

  3. 通过训练利用反向传播算法不断优化权重的值,使之达到最合理水平。

  4. 使用训练好的神经网络来预测未知数据(推理),这里训练好的网络就是指权重达到最优的情况。

具体的训练过程

  1. 选择样本集合的一个样本(Ai,Bi),Ai为数据、Bi为标签(所属类别)

  2. 送入网络,计算网络的实际输出Y,(此时网络中的权重应该都是随机量)

  3. 计算D=Bi−Y(即预测值与实际值相差多少) (此步骤做误差,使用具体的损失函数)

  4. 根据误差D调整权重矩阵W

  5. 对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围

更具体的过程

  1. 参数的随机初始化

  2. 前向传播计算每个样本对应的输出节点激活函数值

  3. 计算损失函数

  4. 反向传播计算偏导数

  5. 使用梯度下降或者先进的优化方法更新权值

4.3.1 参数的随机初始化

  • 对于所有的参数我们必须初始化它们的值

    注意:它们的初始值不能设置成一样,比如都设置成0或1。 如果设置成一样那么更新后所有参数都会相等。即所有神经元的功能都相等,造成了高度冗余。所以我们必须随机化初始参数。

  • 特别的,如果神经网络没有隐藏层,则可以把所有参数初始化为0。(但这也不叫深度神经网络了)

  • 标准化(Normalization) 原因:由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行标准化处理,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

    • 归一化处理,即将数据统一映射到[0,1]区间上。(最典型)
      y = x − m i n m a x − m i n y=\frac{x-min}{max-min} y=maxminxmin

    • z-score标准化(零均值归一化zero-mean normalization): 经过处理后的数据均值为0,标准差为1(正态分布) 其中μ是样本的均值, σ是样本的标准差
      y = x − μ σ y=\frac{x-μ}{σ} y=σxμ

4.3.2 损失函数

损失函数用于描述模型预测值与真实值的差距大小

以下是两种常见的算法——均值平方差(MSE)和交叉熵。

  • 均值平方差(Mean Squared Error,MSE),也称“均方误差”:
    M S E = ∑ i = 1 n 1 n ( f ( x i ) − y i ) 2 MSE=\sum_{i=1}^{n}\frac{1}{n}(f(x_i)-y_i)^2 MSE=i=1nn1(f(xi)yi)2

  • 交叉熵(cross entropy)也是loss算法的一种,一般用在分类问题上。

    表达意思为预测输入样本属于哪一类的概率。值越小,代表预测结果越准。

    y代表真实值分类(0或1),a代表预测值
    C = − 1 n ∑ x [ y l n a + ( 1 − y ) l n ( 1 − a ) ] C=-\frac{1}{n}\sum_{x}[ylna+(1-y)ln(1-a)] C=n1x[ylna+(1y)ln(1a)]

损失函数的选取取决于输入标签数据的类型:

  1. 如果输入的实数、无界的值,损失函数使用MSE。

  2. 如果输入标签是位矢量(分类标志),使用交叉熵会更适合。

4.3.3 梯度下降法

  • 梯度∇f=(∂x1∂f;∂x2∂f;…;∂xn∂f):函数关于变量x的导数,梯度的方向表示函数值增大的方向,梯度的模表示函数值增大的速率。

  • 不断将参数的值向着梯度的反方向更新一定大小,就能得到函数的最小值(全局最小值或者局部最小值)。

  • 一般利用梯度更新参数时会将梯度乘以一个小于1的学习速率(learning rate),这是因为往往梯度的模还是比较大的,直接用其更新参数会使得函数值不断波动,很难收敛到一个平衡点(这也是学习率不宜过大的原因)。
    θ t + 1 = θ t − α t ∇ f ( θ t ) θ_{t+1}=θ_t-α_t∇f(θ_t) θt+1=θtαtf(θt)

学习率的相关知识点补充:

  • 学习率是一个重要的超参数,它控制着我们基于损失梯度调整神经网络权值的速度(也就是学习步伐)

  • 学习率越小,我们沿着损失梯度下降的速度越慢。

  • 从长远来看,这种谨慎慢行的选择可能还不错,因为可以避免错过任何局部最优解,但它也意味着我们要花更多时间来收敛,尤其是如果我们处于曲线的至高点。

  • 新权值 = 当前权值 - 学习率 × 梯度

∂ E ∂ w j k = − ( t k − o k ) ⋅ s i g m o i d ( ∑ j w j k ⋅ o j ) ( I − s i g m o i d ( ∑ j w j k ⋅ o j ) ) ⋅ o j \frac{∂_E}{∂_{w_{jk}}}=-(t_k-o_k)\cdot sigmoid(\sum_{j}w_{jk}\cdot o_j)(I-sigmoid(\sum_{j}w_{jk}\cdot o_j))\cdot o_j wjkE=(tkok)sigmoid(jwjkoj)(Isigmoid(jwjkoj))oj

-(t_k-o_k):正确结果与节点输出结果的差值,也就是误差;

sigmoid(\sum_{j}w_{jk}\cdot o_j):节点的激活函数,所有输入该节点的链路把经过其上的信号与链路权重做乘积后加总,再把加总结果进行激活函数运算;

o_j:链路w(jk)前端节点输出的信号值。

4.3.4 泛化能力分类

  • 欠拟合:模型没有能够很好的表现数据的结构,而出现的拟合度不高的情况。模型不能在训练集上获得足够低的误差;
  • 拟合:测试误差与训练误差差距较小;
  • 过拟合:模型过分的拟合训练样本,但对测试样本预测准确率不高的情况,也就是说模型泛化能力很差。训练误差和测试误差之间的差距太大;(过分的学习到了不重要的东西,也就是对噪声太敏感)
  • 不收敛:模型不是根据训练集训练得到的。

在这里插入图片描述

过拟合缺点
  • 过拟合:给定一堆数据,这堆数据带有噪声,利用模型去拟合这堆数据,可能会把噪声数据也给拟合了。

  • 缺点:造成模型比较复杂; 模型的泛化性能太差了,遇到了新的数据,用所得到的过拟合的模型,正确率是很差。

在这里插入图片描述

过拟合出现的原因
  1. 建模样本选取了错误的选样方法、样本标签等,或样本数量太少,所选取的样本数据不足以代表预定的分类规则
  2. 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则
  3. 假设的模型无法合理存在,或者说是无法达到假设成立的条件
  4. 参数太多导致模型复杂度过高
  5. 对于神经网络模型:a)对样本数据可能存在分类决策面不唯一,随着学习的进行,BP算法使权值可能收敛过于复杂的决策面;b)权值学习迭代次数足够多,拟合了训练数据中的噪声和训练样例中没有代表性的特征。
过拟合的解决方法
  1. 减少特征:删除与目标不相关特征,如一些特征选择方法 (也就是去除噪声)

  2. Early stopping

    • 在每一个Epoch(迭代)结束时,计算validation data的accuracy(有效数据的准确度),当accuracy不再提高时,就停止训练。
    • 那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。
    • 一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。
    • 这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30
  3. 更多的训练样本

  4. 重新清洗数据 (降噪)

  5. Dropout (最新的算法):通过修改神经网络本身结构来实现的

    • Dropout步骤

      1. 在训练开始时,随机删除一些(可以设定为1/2,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变。

      2. 然后按照BP学习算法对ANN中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。这样一直进行,直至训练结束。

    • Dropout方法是通过修改ANN(人工神经网络)中隐藏层的神经元个数来防止ANN的过拟合。在这里插入图片描述

    • Dropout能减少过拟合的原因:

      1. Dropout是随机选择忽略隐层节点,在每个批次的训练过程,由于每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以当做一个“新”模型;

      2. 隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现。

      这样权值的更新不再依赖有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其他特定特征下才有效果的情况。

    • 总结:Dropout是一个非常有效的神经网络模型平均方法,通过训练大量的不同的网络,来平均预测概率。不同的模型在不同的训练集上训练(每个epoch的训练数据都是随机选择),最后在每个模型用相同的权来“融合”。经过交叉验证,隐藏节点dropout率等于0.5的时候效果最好。

    • Dropout其它用法:可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)

    • Dropout缺点:训练时间是没有dropout网络的2-3倍。

4.4 手推训练过程实例

面试会问整个过程,不需要计算,要能详细说出原理

如下图参数解释

  1. 第一层是输入层,包含两个神经元:i1,i2 和偏置b1;

  2. 第二层是隐藏层,包含两个神经元:h1,h2 和偏置项b2;

  3. 第三层是输出:o1,o2。

  4. 每条线上标的 wi是层与层之间连接的权重。

  5. 激活函数是 sigmod 函数。

  6. 我们用 z 表示某神经元的加权输入和;用 a 表示某神经元的输出。

在这里插入图片描述

步骤一:前向传播

(输入层→隐藏层)神经元h1的输入加权和zh1:在这里插入图片描述

然后带入激活函数输出ah1,同理可得神经元h2的输出ah2

(隐藏层→输出层)同理根据h1,h2计算输出层神经元o1和o2的值:在这里插入图片描述

步骤二:反向传播

计算损失函数
E t o t a l = ∑ 1 2 ( t a r g e t − o u t p u t ) 2 E_{total}=\sum\frac{1}{2}(target-output)^2 Etotal=21(targetoutput)2
但是有两个输出,所以分别计算o1和o2的损失值,总误差为两者之和

在这里插入图片描述

(隐藏层→输出层)权值更新

以权重参数w5为例,用整体损失对w5求偏导得出w5对整体损失产生的影响

在这里插入图片描述

在这里插入图片描述

然后分别计算出每个式子的值,最后三者相乘,这样就算出整体损失E_total对w5的偏导值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

最后更新w5的值[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

同理可更新w6w7w8

(隐藏层→隐藏层)权值更新在这里插入图片描述

与上一步的权值更新步骤一样,区别是h1h2影响Eo1Eo2两个,所以要两个加起来

这样,反向传播算法就完成了,最后我们再把更新的权值重新计算,不停地迭代。

在这个例子中第一次迭代之后,总误差0.298371109下降至0.291027924。

迭代10000次后,总误差为0.000035085。输出为:[0.015912196, 0.984065734]

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
dlib是一个强大的C++机器学习,其中包含了许多深度学习算法,包括深度卷积神经网络(DCNN)。下面是对dlib的DCNN算法的具体分析: 1. 网络结构:dlib的DCNN算法采用了经典的卷积神经网络结构,包括卷积层、池化层、全连接层等。可以根据具体任务需求来设计网络结构。 2. 卷积层:卷积层是DCNN中最重要的组成部分之一。它通过使用一组可学习的卷积核对输入数据进行卷积操作,提取出图像的特征。dlib的DCNN支持不同大小和数量的卷积核,并可以通过调整参数来控制卷积操作的步长和填充方式。 3. 池化层:池化层用于减小特征图的尺寸,并保留最显著的特征。dlib的DCNN支持最大池化和平均池化两种常见的池化方式。 4. 激活函数:激活函数在DCNN中起到引入非线性的作用,帮助网络学习更复杂的特征。dlib的DCNN支持多种激活函数,如ReLU、Sigmoid和Tanh等。 5. 全连接层:全连接层将卷积层和池化层的输出连接起来,并通过学习权重来进行分类或回归任务。dlib的DCNN可以根据具体任务需求设置全连接层的大小和数量。 6. 损失函数:损失函数用于衡量网络输出与真实标签之间的差异。dlib的DCNN支持多种常见的损失函数,如交叉熵损失和均方误差损失等。 7. 优化算法:优化算法用于更新网络中的参数,使得损失函数最小化。dlib的DCNN支持多种优化算法,如随机梯度下降(SGD)和Adam等。 8. 训练推理:使用dlib的DCNN进行训练时,可以通过提供训练数据和标签来进行网络参数的学习。而在推理阶段,可以使用已经训练好的网络模型对新的数据进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃_早餐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值