深度学习

时间:2024-05-31 07:30:58

第一节 **函数

1.基本情况

深度学习
深度学习
权重,激励函数,损失函数,反向传播,优化函数,5个任务。

2.全连接层网络

以34的照片为例:
深度学习
首先将图片展开为一维向量,如下所示:
深度学习
每个像素值配有权重,每设置12个参数值,与12个像素值进行计算,然后输入下一层的神经元当中,设置权重的数目由第二层的神经元个数决定。即:若第二层神经元有4个,则可以表示为矩阵的运算,4
12的权重矩阵乘以121的像素值,最后得到41的矩阵,作为下一层的输入值。
深度学习

3.**函数

深度学习
深度学习
sigmoid和tanh**函数缺点:
当网络加深时,由于**函数两端和中间梯度变化巨大,当如何当数据处于某个端点指时,经过多层训练之后,可能会把这些这些数据归为同一类。所以在深层神经网络中常见的网络是relu。
pytorch中调用**函数:
首先**函数都是由封装的类构成,所以在调用的时候需要先赋值给一个实例,然后通过实例来进行来添加参数。
导入:
深度学习
调用:
深度学习

第二节 损失函数

1.回归损失函数

L1loss和L2loss表达式:
深度学习

pytorch中的损失函数:
L1_loss = torch.nn.L1Loss()
L2_loss = torch.nn.MSELoss()#L2loss并不叫做L2Loss
深度学习

2.分类损失函数

在分类任务中,当分类的对象为非数字类的数据格式时,需要对数据进行数据格式的转化,如下采用独热编码。

(1)独热编码转化

LabelEncoder:标签编码
OneHotEncoder:独热编码
LabelEncoder和OneHotEncoder 在特征工程中的应用:
参考博客链接:https://blog.****.net/accumulate_zhang/article/details/78510571

在分类和聚类运算中我们经常计算两个个体之间的距离,对于连续的数字(Numric)这一点不成问题,但是对于名词性(Norminal)的类别,计算距离很难。即使将类别与数字对应,例如{‘A’,‘B’,‘C’}与[0,1,2]对应,即LableEncoder,但我们也不能认为A与B,B与C距离为1,而A与C距离为2。独热编码正是为了处理这种距离的度量,该方法认为每个类别之间的距离是一样的。

例1.如数据集有三个参数:性别,地区,浏览器。
性别:[“male”,“female”]
地区:[“Europe”,“US”,“Asia”]
浏览器:[“Firefox”,“Chrome”,“Safari”,“Internet Explorer”]。
从数据中可以得到,性别只有2个类别,地区有3个类别,浏览器有4个类别。
对于某一个样本(3特征),如[“male”,“US”,“Internet Explorer”],我们需要将这个分类值的特征数字化,最直接的方法,我们可以采用序列化的方式:[0,1,2]。(LableEncoder)。但是这样的特征处理并不能直接放入机器学习算法中。我们可以采用One-Hot编码的方式对上述的样本“[“male”,“US”,“Internet Explorer”]”编码,“male”则对应着[1,0],(2类)。同理“US”对应着[0,1,0],(3类)。“Internet Explorer”对应着[0,0,0,1],(4类)。则完整的特征数字化的结果为:[1,0,0,1,0,0,0,0,1]。这样导致的一个结果就是数据会变得非常的稀疏。
注:上述0/1编码并不符合二进制。
例2
import numpy as np from sklearn.preprocessing
import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
print “enc.n_values_ is:”,enc.n_values_
print “enc.feature_indices_ is:”,enc.feature_indices_
print enc.transform([[0, 1, 1]]).toarray()

enc.n_values_ is: [2 3 4]
enc.feature_indices_ is: [0 2 5 9]
[[ 1. 0. 0. 1. 0. 0. 1. 0. 0.]]
解释:
首先由四个样本数据[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2],共有三个属性特征,也就是三列。比如第一列,有0,1两个属性值,第二列有0,1,2三个值…

那么enc.n_values_就是每个属性列不同属性值的个数,所以分别是2,3,4

再看enc.feature_indices_是对enc.n_values_的一个累加。

再看[0, 1, 1]这个样本是如何转换为基于上面四个数据下的one-hot编码的。
第一列:0->10
第二列:1->010
第三列:1->0100

简单解释一下,在第三列有,0,1,2,3四个值,分别对应1000,0100,0010,0001.

(2)损失函数

深度学习

Hinge Loss:合页损失函数

参考:https://blog.****.net/fendegao/article/details/79968994
深度学习
y是正确预测的得分,y′是错误预测的得分,两者的差值可用来表示两种预测结果的相似关系,margin是一个由自己指定的安全系数。我们希望正确预测的得分高于错误预测的得分,且高出一个边界值 margin,换句话说,y越高越好,y′ 越低越好,(y–y′)越大越好,(y′–y)越小越好,但二者得分之差最多为margin就足够了,差距更大并不会有任何奖励,即margin+(y’-y)的当太小时,loss为0,所以不会下降,损失函数没用。这样设计的目的在于,对单个样本正确分类只要有margin的把握就足够了,更大的把握则不必要,过分注重单个样本的分类效果反而有可能使整体的分类效果变坏。分类器应该更加专注于整体的分类误差。
例,假设有3个类cat、car、frog:
深度学习
数据表解释:对于三个类:cat,car,frog.每一列是对这三个目标的预测打分情况,如第一列,对于目标cat,分类器经过预测,ca预测为cat的打分为3.2,cat预测为car的打分为5.1,cat预测为frog的打分为-1.7。然后对于目标car,接着第二列进行打分。
计算每个目标的损失函数:
深度学习
以此类推,然后求和然后平均,即为总的损失函数:
深度学习

Cross Entropy loos:交叉熵损失函数

-log§可以表示为传输该信息的bit数目,如50%的天气,计算出得到为1,说明只需要1个bit就可传输该信息。当概率为25%时,则需要2个bit来传输这个信息
深度学习
深度学习
交叉熵损失函数:
深度学习
首先理一下熵的概念,现有关于样本集的2个概率分布p和q,其中p为真实分布,q非真实分布。按照真实分布p来衡量识别一个样本的所需要的编码长度的期望(即平均编码长度)为:
深度学习
如果使用错误分布q来表示来自真实分布p的平均编码长度,则应该是:
深度学习
其中第一个期望为信息熵,反应的是香农信息量的期望,第二个为交叉熵。信息熵代表的是随机变量或整个系统的不确定性,熵越大,随机变量或系统的不确定性就越大。

补充:
1.一个事件x的信息量是:
深度学习
解释:表示的是一件事发生的概率大小,如果一个事件发生的概率越大,那么信息量就越小,即包括的其他信息量少,该事件更容易发生。如果一件事的发生概率是1,也就是100%发生,那么它的信息量为0。

2.熵
就是对信息量求期望值。
深度学习
**解释:**即每个事件的信息量的期望值,能代表所有事件的信息量大小。所以交叉熵损失函数代表的是所有事件的信息量大小,信息量越小,则说明越准确,损失函数越小。
3.交叉熵
假设有两个分布p,q,则它们在给定样本集上的交叉熵定义如下:
深度学习
4.KL散度
相对熵(relative entropy)又称为KL散度(Kullback-Leibler divergence),KL距离,是两个随机分布间距离的度量。当p=q的时候,散度为0.
深度学习
解释:很明显,KL散度由两项组成,第一项为熵(负的),可以看成和自身的交叉熵(负的)。第二项为交叉熵。所以交叉熵=熵+KL散度。交叉熵为什么可以做损失函数呢?从这个等式可以看出来,当交叉熵损失函数越小时,熵为定值,所以需要KL散度更小,此时交叉熵与熵越接近,即交叉熵越接近于真实值。

举例:
我们以MNIST多分类为例,通常Label会编码为One-Hot,最后一层输出会使用Softmax函数进行概率化输出,如下表所示:
深度学习
对于第一个样本,交叉熵损失为: -1log(0.6)
对于第二个样本,交叉熵损失为: -1
log(0.5)
对于第三个样本,交叉熵损失为: -1*log(0)
从上面的计算可以知道,预测越准,损失越小。

**总结:**交叉熵是指两个或者多个事件的相似程度。即可以作为损失函数来判定预测值与真实值之间的差异性,从而可以作为损失函数。在信息论中的定义,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布,在相同的一组事件中,其中,用非真实分布q来表示某个事件发生所需要的平均比特数。

第三节 反向传播

深度学习

第四节 优化函数

深度学习
超参数:训练过程不会被优化,非超参数:训练过程中会被优化。

1.Batch Gradient Descent

Batch Gradient Descent:批梯度下降法。在每一轮的训练过程中,Batch Gradient Descent算法用整个训练集的数据计算cost fuction的梯度,并用该梯度对模型参数进行更新,即每次求偏导数时,都会求所有数据样本的偏导数,然后求他们的平均值。
深度学习

优点:

  • cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值

缺点:

  • 由于每轮迭代都需要在整个数据集上计算一次,所以批量梯度下降可能非常慢
  • 训练数较多时,需要较大内存
  • 批量梯度下降不允许在线更新模型,例如新增实例。

2.mini-batch Gradient Descent

mini-batch Gradient Descent:小批量梯度下降法。在上述的批梯度的方式中每次迭代都要使用到所有的样本,对于数据量特别大的情况,如大规模的机器学习应用,每次迭代求解所有样本需要花费大量的计算成本。是否可以在每次的迭代过程中利用部分样本代替所有的样本呢?基于这样的思想,便出现了mini-batch的概念。

假设训练集中的样本的个数为1000,则每个mini-batch只是其一个子集,假设,每个mini-batch中含有10个样本,这样,整个训练数据集可以分为100个mini-batch。伪代码如下:
深度学习
即每次只选择mini-batch大小的样本来计算梯度值。

3.Stochastic Gradient Descent

Stochastic Gradient Descent:随机梯度下降法,可以看成是mini-batch gradient descent的一个特殊的情形,即在随机梯度下降法中每次仅根据一个样本对模型中的参数进行调整,等价于mini-batch中只有一个训练样本。
随机梯度下降法的优化过程为:
深度学习

4.SGD+Momentum

SGD方法的一个缺点是,其更新方向完全依赖于当前的batch,因而其更新十分不稳定。解决这一问题的一个简单的做法便是引入momentum。momentum即动量,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:
深度学习
如图下图所示,红色为SGD+Momentum。黑色为SGD。可以看到黑色为典型Hessian矩阵病态的情况,相当于大幅度的徘徊着向最低点前进。 而由于动量积攒了历史的梯度,如点P前一刻的梯度与当前的梯度方向几乎相反。因此原本在P点原本要大幅徘徊的梯度,主要受到前一时刻的影响,而导致在当前时刻的梯度幅度减小。直观上讲就是,要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。
深度学习

5.Nesterov

Nesterov(牛顿动量)方法
深度学习
深度学习

  • 蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
  • 而 Nesterov 会先在前一步的累积梯度上有一个大的跳跃(棕色)。然后衡量一下梯度做一下修正(红色),这种预期的更新可以避免我们走的太快。
  • 深度学习

6.Adagrad

上述方法中,对于每一个参数θ 的训练都使用了相同的学习率α。Adagrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此,Adagrad非常适合处理稀疏数据。
深度学习

7.RMSprop

Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
深度学习

8.Adam

Adam(Adaptive Moment Estimation)是另一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
深度学习
最后两张动图从直观上展现了算法的优化过程。第一张图为不同算法在损失平面等高线上随时间的变化情况,第二张图为不同算法在鞍点处的行为比较:
深度学习
深度学习
参考:https://blog.****.net/u010089444/article/details/76725843

第五节 深度学习卷积基础

dropout 的作用:是为了提高模型泛化能力,当模型过拟合严重时,采取的措施,即忽略掉某些特征,删除某些神经元。当模型预测效果不好时,则不需要进行dropout。