1、为什么使用深层表示
1、深度神经网络的多层隐藏层中,前几层能学习一些低层次的简单特征,后几层能把前面简单的特征结合起来,去学习更加复杂的东西。比如刚开始检测到的是边缘信息,而后检测更为细节的信息。
2、深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果则需要指数级增长的单元数量才能达到。
2、如何寻找超参数的最优值?
常见设 置超参数的做法有:
1、猜测和检查:根据经验或直觉,选择参数,一直迭代。
2、网格搜索:让计算机尝试在一定范围内均匀分布的一组值。
3、随机搜索:让计算机随机挑选一组值。
4、贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数 的困难。
5、在良好初始猜测的前提下进行局部优化:这就是 MITIE 的方法,它使用 BOBYQA 算 法,并有一个精心选择的起始点。由于 BOBYQA 只寻找最近的局部最优解,所以这个方法是 否成功很大程度上取决于是否有一个好的起点。在 MITIE 的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种 方法非常适合寻找局部最优解。稍后我会再讨论这一点。
6、最新提出的 LIPO 的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。
超参数搜索一般过程?
1、将数据集划分成训练集、验证集及测试集。
2、在训练集上根据模型的性能指标对模型参数进行优化。
3、在验证集上根据模型的性能指标对模型的超参数进行搜索。4、步骤 2 和步骤 3 交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型 的优劣。
其中,搜索过程需要搜索算法,一般有: 网格搜索、随机搜过、启发式智能搜索、贝叶斯搜索。
3、 为什么需要非线性激活函数?
1、激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
2、激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、 音频、语音等。
3、激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
4、假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。 这样就做不到用非线性来逼近任意函数。
5、使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性 激活函数,能够从输入输出之间生成非线性映射。
4、常见的激活函数及图像
5、 常见激活函数的导数计算
6、激活函数有哪些性质
7、如何选择激活函数
8、Softmax 函数如何应用于多分类
9、 Batch_Size
为什么需要 Batch_Size?
Batch 的选择,首先决定的是下降的方向。 如果数据集比较小,可采用全数据集的形式,好处是:
1、由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
2、由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。
对于更大的数据集,采用全数据集的形式,坏处是: 1、随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。2、以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互 抵消,无法修正。这才有了后来 RMSProp 的妥协方案。
在合理范围内,增大 Batch_Size 有何好处?
1、内存利用率提高了,大矩阵乘法的并行化效率提高。
2、跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一 步加快。
3、在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大 Batch_Size 有何坏处?
1、内存利用率提高了,但是内存容量可能撑不住了。
2、跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费 的时间大大增加了,从而对参数的修正也就显得更加缓慢。
3、Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
调节 Batch_Size 对训练效果影响到底如何?
1、Batch_Size 太小,可能导致算法不收敛。
2、随着 Batch_Size 增大,处理相同数据量的速度越快。
3、随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
4、由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
5、由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
10、为什么要归一化
(1)为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
(2)为了程序运行时收敛加快。 下面图解。
(3)同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是 应用层面的需求。
(4)避免神经元饱和。啥意思?就是当神经元的激活在接近 0 或者 1 时会饱和,在这些 区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死” 梯度。
(5)保证输出数据中数值小的不被吞食。
11、 1x1 卷积作用
1×1 的卷积大概有两个方面的作用:
1. 实现跨通道的交互和信息整合。
2. 进行卷积核通道数的降维和升维。
12、卷积层和池化层有什么区别
首先可以从结构上可以看出,卷积之后输出层的维度减小,深度变深。但池化层深度不变。同时池化可以把很多数据用最大值或者平均值代替。目的是降低数据量。降低训练的参数。对于输入层,当其中像素在邻域发生微小位移时,池化层的输出是不变的,从而能提升鲁棒性。而卷积则是把数据通过一个卷积核变化成特征,便于后面的分离。
(1)每个卷积核都有RGB三个通道,每个卷积核的权重一致,符合参数共享原理
(2)不同卷积核之间的权重不一样,表示提取不同的特征。
(3)输入图像的深度是3即RGB三个通道,也可以是1即灰度通道
池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次 的特征,从而对整个图片进行表示。
13、CNN 的参数经验设置
对于卷积神经网络的参数设置,没有很明确的方法,这只是众多学者的一些经验。
1、learning-rate 学习速率:学习速率越小,模型收敛花费的时间就越长,但是可以提高模型精确度。一般初始设置为 0.1,然后每次除以 0.2 或者 0.5 来改进,得到最终值;
2、batch-size 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小 来设置,具体问题具体分析;
3、weight-decay 权重衰减:用来在反向传播中更新权重和偏置,一般设置为 0.005;
4、epoch-number 训练次数:包括所有训练样本的一个正向传递和一个反向传递,训练至 模型收敛即可;(注:和迭代周期 iteration 不一样)
CNN 的演化路径可以总结为以下几个方向:
进化之路一:网络结构加深
进化之路二:加强卷积功能
进化之路三:从分类到检测
进化之路四:新增功能模块
14、梯度消失、爆炸原因
两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如 sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下,下面分别从这两个角度分析梯度消失和爆炸的原 因。
(1)深层网络角度
对激活函数进行求导,如果此部分大于 1,那么层数增多的时候,最终的求出的梯度更新 将以指数形式增加,即发生梯度爆炸,如果此部分小于 1,那么随着层数增多,求出的梯度更 新信息将会以指数形式衰减,即发生了梯度消失。从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的 情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始 化的值差不多。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
梯度消失、爆炸的解决方案:
方案 1-预训练加微调
此方法来自 Hinton 在 2006 年发表的一篇论文,Hinton 为了解决梯度的问题,提出采取无 监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输 入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training); 在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton 在训练深度信念网络(Deep BeliefNetworks 中,使用了这个方法,在各层预训练完成后,再利用 BP 算法对整个网络进行 训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处, 但是目前应用的不是很多了。
方案 2-梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更 新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯 度爆炸。 另外一种解决梯度爆炸的手段是采用权重正则(weithtsregularization)比较常见的是 l1l1 正则,和 l2l2 正则,在各个深度框架中都有相应的 API 可以使用正则化。
方案 3-relu、leakrelu、elu 等激活函数 Relu 思想也很简单,如果激活函数的导数为 1,那么就不存在梯度消失爆炸的问题了,每层的 网络都可以得到相同的更新速度,relu 就这样应运而生。 relu 函数的导数在正数部分是恒等于 1 的,因此在深层网络中使用 relu 激活函数就不会导 致梯度消失和爆炸的问题。 relu 的主要贡献在于:
(1)解决了梯度消失、爆炸的问题
(2)计算方便,计算速度快
(3)加速了网络的训练
同时也存在一些缺点:
(1)由于负数部分恒为 0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
(2)输出不是以 0 为中心的
leakrelu
leakrelu 就 是 为 了 解 决 relu 的 0 区 间 带 来 的 影 响 , 其 数 学 表 达 为 : leakrelu=max(k∗ x,0)leakrelu=max(k∗ x,0)其中 k 是 leak 系数,一般选择 0.01 或者 0.02,或者 通过学习而来。
方案 4-batchnorm
Batchnorm 是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了 各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm 本质上是解决反向传播过程中的梯度问题。batchnorm 全名是 batch normalization,简称 BN,即批规范化,通过 规范化操作将输出信号 x 规范化到均值为 0,方差为 1 保证网络的稳定性。
方案 5-残差结构
事实上,就是残差网络的出现导致了 image net 比赛的终结,自从残差提出后,几乎所有 的深度网络都离不开残差的身影,相比较之前的几层,几十层的深度网络,在残差网络面前都 不值一提,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题, 原因就在于残差的捷径(shortcut)部分 。
方案 6-LSTM
LSTM 全称是长短期记忆网络(long-short termmemorynetworks),是不那么容易发生梯度消失的,主要原因在于 LSTM 内部复杂的“门”(gates)。
15、 提升算法性能思路
1. 通过数据提升性能
2. 通过算法提升性能
3. 通过算法调参提升性能
4. 通过嵌套模型提升性能
1. 通过数据提升性能
以下是我将要提到的思路: 获取更多数据、创造更多数据、重放缩你的数据、转换你的数据、特征选取、重架构你的问题
1) 获取更多数据
你的模型的质量通常受到你的训练数据质量的限制。为了得到最好的模型,你首先应该想 办法获得最好的数据。你也想尽可能多的获得那些最好的数据。 有更多的数据,深度学习和其他现代的非线性机器学习技术有更全的学习源,能学得更好, 深度学习尤为如此。
2) 创造更多数据
有些时候你可能无法合理地获取更多数据,那你可以试试创造更多数据。 如果你的数据是数值型向量,可以随机构造已有向量的修改版本。 如果你的数据是图片,可以随机构造已有图片的修改版本(平移、截取、旋转等)。 如果你的数据是文本,类似的操作…… 这通常被称作数据扩增(dataaugmentation)或者数据生成(datageneration)。 你可以利用一个生成模型。你也可以用一些简单的技巧。例如,针对图片数据,你可以通 过随机地平移或旋转已有图片获取性能的提升。如果新数据中包含了这种转换,则提升了模型 的泛化能力。 这也与增加噪声是相关的,我们习惯称之为增加扰动。它起到了与正则化方法类似的作用, 即抑制训练数据的过拟合。
3) 重缩放(rescale)你的数据
如果你在使用 sigmoid 激活函数,重缩放你的数据到 0 和 1 的区间里。如果你在使用双曲 正切(tanh)激活函数,重缩放数据到-1 和 1 的区间里。
4) 数据变换
猜测每一列数据的单变量分布。 列数据看起来像偏斜的高斯分布吗?考虑用 Box-Cox 变换调整偏态。 列数据看起来像指数分布吗?考虑用对数变换。 列数据看起来有一些特征,但是它们被一些明显的东西遮盖了,尝试取平方或者开平方根 来转换数据 你能离散化一个特征或者以某种方式组合特征,来更好地突出一些特征吗? 依靠你的直觉,尝试以下方法。 你能利用类似 PCA 的投影方法来预处理数据吗? 你能综合多维特征至一个单一数值(特征)吗? 你能用一个新的布尔标签去发现问题中存在一些有趣的方面吗? 你能用其他方法探索出目前场景下的其他特殊结构吗?
5) 特征选择
有许多特征选择的方法和特征重要性的方法,这些方法能够给你提供思路,哪些特征该保 留,哪些特征该剔除。最简单的方式就是对比所有特征和部分特征的效果。
6) 重新架构你的问题
有时候要试试从你当前定义的问题中跳出来,想想你所收集到的观察值是定义你问题的唯一方式吗?或许存在其他方法。或许其他构建问题的方式能够更好地揭示待学习问题的结构。
看看能够在一个时间窗(时间周期)内对已有的特征/数据做一个合并。 或许你的分类问题可以成为一个回归问题(有时候是回归到分类)。 或许你的二元输出可以变成 softmax 输出? 或许你可以转而对子问题进行建模。 仔细思考你的问题,最好在你选定工具之前就考虑用不同方法构建你的问题,因为此时你 对解决方案并没有花费太多的投入。除此之外,如果你在某个问题上卡住了,这样一个简单的 尝试能释放更多新的想法。
2. 通过算法提升性能
下面是一个简要列表: 对算法进行抽样调查 借鉴已有文献 重采样方法
3. 通过算法调参提升性能
诊断(Diagnostics)
权重初始化(WeightInitialization)
学习速率(LearningRate)
激活函数
网络拓扑(NetworkTopology)
批次和周期(BatchesandEpochs)
正则化
优化和损失
早停法