深度学习笔记

1. 局部连接/权值共享/池化操作/多层次结构

CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。
局部连接使网络可以提取数据的局部特征;
权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;
池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。

2. 全卷积/Local-Conv

如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。

3. 激活函数

激活函数的主要作用是提供网络的非线性建模能力。加入激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。
常见的激活函数有sigmoid函数/ ReLU
sigmoid函数
f(z)=1/(1+exp(-z))
这里写图片描述
输出是在(0,1)这个开区间内
缺陷:
1) 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,我们都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmod函数,这个链条上的微分就很小很小了,况且还可能经过很多个sigmod函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散。
2) 函数输出不是以0为中心的,这样会使权重更新效率降低。
3) sigmod函数要进行指数运算,计算比较慢。
tanh函数
这里写图片描述
这里写图片描述
tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。
一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。
ReLU函数
这里写图片描述
这里写图片描述
相比于sigmod函数和tanh函数,它有以下几个优点:
1) 在输入为正数的时候,不存在梯度饱和问题。
2) 计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)

缺点:
1) 当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。这样在前向传播过程中,还不算什么问题,有的区域是敏感的,有的是不敏感的。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。
2) ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。

4.监督学习和无监督学习

监督学习(supervised learning):通过已有的训练样本(即已知数据以及其对应的输出)来训练,从而得到一个最优模型,再利用这个模型将所有新的数据样本映射为相应的输出结果,对输出结果进行简单的判断从而实现分类的目的,那么这个最优模型也就具有了对未知数据进行分类的能力。

监督学习中只要输入样本集,机器就可以从中推演出制定目标变量的可能结果.如协同过滤推荐算法,通过对训练集进行监督学习,并对测试集进行预测,从而达到预测的目的.

无监督学习(unsupervised learning):事先没有任何训练数据样本,需要直接对数据进行建模。

5. 过拟合

出现原因:

  • 训练数据不够,无法对整个数据的分布进行估计
  • 对模型进行过度训练,导致了模型的过拟合,即模型复杂度比实际数据复杂度还要高

过拟合可以理解为我们的模型对样本量学习的太好了,把一些样本的特殊的特征当做是所有样本都具有的特征。举个简单的例子,当我们模型去训练如何判断一个东西是不是叶子时,我们样本中叶子如果都是锯齿状的话,如果模型产生过拟合了,会认为叶子都是锯齿状的,而不是锯齿状的就不是叶子了。如果此时我们把不是锯齿状的叶子数据增加进来,此时我们的模型就不会再过拟合了。
过拟合使得训练误差很小而测试误差特别大。

避免过拟合的方法:
- Regularization(正则化)
由于模型过拟合极有可能是因为我们的模型过于复杂。因此,需要让模型在训练的时候,在对损失函数进行最小化的同时,也需要对参数添加限制,这个限制就是正则化惩罚项。加入正则项目的是减小权重的幅度。
所谓『惩罚』是指对损失函数中的某些参数做一些限制。
L0正则化的值是模型参数中非零参数的个数。
L1正则化表示各个参数绝对值之和。
L2正则化表示各个参数的平方的和的开方值。
常用的正则化有两种:
L1正则:
L1正则项的表达式为:
L1=∑ki=1||wi||1
其中w代表模型的参数,k代表模型参数的个数。
L2正则:
L2正则项的表达式为:
L1=∑ki=1||wi||22
其中w代表模型的参数,k代表模型参数的个数。

  L1正则与L2正则的思想就是不能够一味的去减小损失函数,还得考虑到模型的复杂性,通过限制参数的大小,来限制其产生较为简单的模型,这样就可以降低产生过拟合的风险。
  L1正则化可以产生稀疏权值矩阵,用于特征选择。
  它们的区别在于L1更容易得到稀疏解,也就意味着求出的参数中含有0较多。因此它自动帮你选择了模型所需要的特征。

-data augmentation(数据增强)

在深度学习中,当数据量不够大时候,常常采用人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批”新”的数据.也就是Data Augmentation
旋转 | 反射变换(Rotation/reflection)
翻转变换(flip)
缩放变换(zoom)
平移变换(shift)
尺度变换(scale)
对比度变换(contrast)
噪声扰动(noise)
颜色变换(color)
- dropout

Hinton认为在神经网络产生过拟合主要是因为神经元之间的协同作用产生的。因此老爷子在神经网络进行训练的时候,让部分神经元失活,这样就阻断了部分神经元之间的协同作用,从而强制要求一个神经元和随机挑选出的神经元共同进行工作,减轻了部分神经元之间的联合适应性。
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
dropout通过随机将部分神经元的输出置零来实现
- Batch Normalization(批正则化)
引入原因:
网络一旦train起来,参数要发生更新,除了输入层的数据外(因为输入层数据,已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。 BN就是用来解决在训练过程中,中间层数据分布发生改变的情况。
使用方法:
由于我们现在在对神经网络进行优化求解时,通常是使用SGD。每次输入一个mini-batch的数据到神经网络中。在某一层输入数据到神经元之前,对神经元的输入做一个归一化的处理,即将数据归一化为均值为0,方差为1。
但仅仅使用上面的归一化公式,对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。可能会使这一层网络所学习到的特征分布被搞坏。使用变换重构,引入了可学习参数γ、β,让网络可以学习恢复出原始网络所要学习的特征分布
作用:
加快模型的收敛速度,提高模型的泛化能力。
关于BN的详细介绍,可参见此文
- weight decay(权值衰减)
在损失函数中,weight decay是放在正则项(regularization)前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
- early stopping(提前终止)
在对模型进行训练时,可以将数据集分为三个部分,训练集、验证集、测试集。我们在训练的过程中,可以每隔一定量的step,使用验证集对训练的模型进行预测。
模型在验证集上的误差在一开始是随着训练集的误差的下降而下降的。当超过一定训练步数后,模型在训练集上的误差虽然还在下降,但是在验证集上的误差却不在下降了。此时我们的模型就过拟合了。因此我们可以观察我们训练模型在验证集上的误差,一旦当验证集的误差不再下降时,我们就可以提前终止我们训练的模型。
附:训练集、验证集、测试集介绍
训练集:学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。
验证集:对学习出来的模型,调整分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。
测试集:主要是测试训练好的模型的分辨能力(识别率等),检验最终选择最优的模型的性能如何

三个集合不能有交集,常见的比例是8:1:1

对于一个模型来说,其参数可以分为普通参数和超参数。在不引入强化学习的前提下,那么普通参数就是可以被梯度下降所更新的,也就是训练集所更新的参数。
另外,还有超参数的概念,比如网络层数、网络节点数、迭代次数、学习率等等,这些参数不在梯度下降的更新范围内。是人工根据验证集来调。
测试集,既不用测试集梯度下降,也不用它来控制超参数,只是在模型最终训练完成后,用来测试一下最后准确率。

6. 损失函数/代价函数

当我们建立一个网络时,网络试图将输出预测得尽可能靠近实际值。我们使用成本/损失函数来衡量网络的准确性。而成本或损失函数会在发生错误时尝试惩罚网络。
我们在运行网络时的目标是提高我们的预测精度并减少误差,从而最大限度地降低成本。最优化的输出是那些成本或损失函数值最小的输出,学习过程围绕最小化成本来进行。
损失函数在统计学中是一种衡量损失和误差程度的函数,它一般包括损失项(loss term)和正则项(regularization term)。
损失项比较常见的有平方损失,常用在回归问题;以及对数损失函数,常用在分类问题。
加入正则项目的是减小权重的幅度,防止过度拟合。常用的有L1-regularization和L2-regularization。

7. softmax

理解:
有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有第二种可能;如果按照softmax来计算取a和b的概率,那a的softmax值大于b的,所以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。
Softmax激活函数通常用于输出层,用于分类问题。Softmax重新定义了多层神经网络的输出层(output layer),注意仅和输出层有关系,和其他层无关。
Softmax输出层输出被归一化为总和为 1 ,输出层全部输出均为正。
终上所述,softmax 层的输出其实为一种概率分布(probability distribution),因此对于一个多 label 的分类任务而言, 对应于最终的分类结果为高的概率。

8.梯度下降

梯度下降法(gradient descent)则是求解无约束最优化问题的一种常用方法。
梯度下降算法是神经网络在每层更新网络权值的一种方法,是一种最小化成本的优化算法。
梯度下降法的核心思想:对每一个样本都执行一次梯度计算,然后朝下降最快的地方更新权值 梯度下降法是迭代算法,每一步需要求解目标函数的梯度向量。

9. 回归

回归在数学上来说是给定一个点集,能够用一条曲线去拟合之,如果这个曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归,回归还有很多的变种,如locally weighted回归,logistic回归,等等.
对于回归问题,解决流程为:
给定数据集中每个样本及其正确答案,选择一个模型函数h(hypothesis,假设),并为h找到适应数据的(未必是全局)最优解,即找出最优解下的h的参数。这里给定的数据集取名叫训练集(Training Set)。不能所有数据都拿来训练,要留一部分验证模型。

10. 线性回归/逻辑回归

线性回归:
y=kx+b,给定一堆数据点,拟合出k和b的值,下次给定X时,就可以计算出y,这就是回归。
使用最小二乘作为损失函数。
线性回归是假设
这里写图片描述
如果把θ和x看作是(列)向量,那么用矩阵的形式可以简写成 y=θTx,然后根据样本去计算最适合的向量θ。
逻辑回归:
它是一种非线性函数,拟合功能颇为强大,而且它是连续函数,可以对其求导,这点很重要。
一般用来做预测,也可以用来做分类,预测是某个类别
逻辑回归使用Sigmoid函数
这里写图片描述
这里写图片描述
sigmoid函数的自变量只有一个Z,假设我们的特征为X=[x0,x1,x2…xn]。令
此时z相当于线性回归的(1)式,z可以写成如下形式:
这里写图片描述
当给定大批的训练样本特征X时,只要找到合适的W=[w0,w1,w2…wn]来正确的把每个样本特征X映射到sigmoid函数的两级上,也就是说正确的完成了类别回归就行了,那么以后来个测试样本,只要和权重相乘后,带入sigmoid函数计算出的值就是预测值。
接下来要计算W,就要进入优化求解阶段咯,用的方法是梯度下降法或者随机梯度下降法。

11. 学习率(Learning Rate)

学习率被定义为每次迭代中成本函数中最小化的量。简单来说,我们下降到成本函数的最小值的速率是学习率。
学习率,即参数到达最优值过程的速度快慢。学习率决定了权值更新的速度,设置得太大会使结果超过最优值,太小会使下降速度过慢,长时间无法收敛。

12. 批次(Batches)/full batch/mini batch

已知在梯度下降中需要对所有样本进行处理过后然后走一步。假如有大量样本走一轮迭代就会非常的耗时。整个数据集一次性馈送到网络的梯度下降叫做full batch。
为了提高效率,不用一次发送整个输入,可以把样本分成等量的子集。 例如我们把100万样本分成1000份, 每份1000个样本, 这些子集就称为mini batch。
在mini batch下的梯度下降中,训练的数据不再是所有的样本,而是一个个的子集。分别用一个for循环遍历这1000个子集。 针对每一个子集做一次梯度下降,然后更新参数w和b的值,接着到下一个子集中继续进行梯度下降。 这样在遍历完所有的mini batch之后相当于在梯度下降中做了1000次迭代。
将遍历一次所有样本的行为叫做一个 epoch,也就是一个世代。周期被定义为向前和向后传播中所有批次的单次训练迭代。这意味着1个周期是整个输入数据的单次向前和向后传递。mini batch在一个epoch中能进行1000次的梯度下降,而在full batch中只有一次。
这里写图片描述
如上图,左边是full batch的梯度下降效果。可以看到每一次迭代成本函数都呈现下降趋势,这是好的现象,说明w和b的设定一直在减少误差。 这样一直迭代下去就可以找到最优解。 右边是mini batch的梯度下降效果,可以看到它是上下波动的,成本函数的值有时高有时低,但总体还是呈现下降的趋势。 这个也是正常的,因为每一次梯度下降都是在min batch上跑的而不是在整个数据集上。 数据的差异可能会导致这样的效果(可能某段数据效果特别好,某段数据效果不好)。但没关系,因为他整体的是呈下降趋势的。

猜你喜欢

转载自blog.csdn.net/daydayup_668819/article/details/79698636