合肥建设干部学校网站,青岛网站建设方案书,什么软件可以自主建设网站,wordpress 新特性在找工作的过程中发现好多公司没有专门的、传统的图像处理岗位#xff0c;所以只能参加算法类的笔试甚至AI类的笔试。在AI的笔试中几乎全是关于神经网络的问题#xff0c;其实也都是很基础的一些问题#xff0c;如果事先做了准备#xff0c;可以从容应对。而对于我这种从传…在找工作的过程中发现好多公司没有专门的、传统的图像处理岗位所以只能参加算法类的笔试甚至AI类的笔试。在AI的笔试中几乎全是关于神经网络的问题其实也都是很基础的一些问题如果事先做了准备可以从容应对。而对于我这种从传统图像处理算法向深度学习靠拢的新手不失为一种很好的入门方法。
既然是考察神经网络激活函数activation function作为模拟人脑中神经元之间的激活/抑制的关键经常会被考察。问常用的激活函数有什么各自有什么特点。关于这个问题可以从网上找到很多答案比如参考链接1和2主要讲了常见的激活函数Sigmoid、tanh、ReLu、Leaky ReLus。Sigmoid范围在0~1这也是具有压缩数据功能的原因所以Tanh2*Sigmoid(2x)-1的范围在[-1,1]tanh读作Hyperbolic Tangent解决了Sigmoid的均值非0的问题这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入但是梯度消失的问题更加严重红色梯度曲线下降得更快参数的学习要靠梯度的后向传播。而ReLUmax(0,x),在输入很大的情况下梯度也不会像Sigmoid一样饱和且由于计算简单利用SGD随机梯度下降算法收敛速度更快但缺点是在输入为复数的时候激活函数直接为0造成所谓的神经元坏死不能给之后的神经元传递信息这时就必须十分小心learning Rate的选取步长不能太大也可以使用adagrad自动调节learningrate,同时参数的初始化也很重要一般使用Xavier初始化。Leaky ReLU是为了解决ReLU神经元坏死的问题的在输入小于0时输出不再是0而是一条斜率较小a的通过原点的直线。但是现在还没有足够的理论证明Leaky ReLU一定好于ReLU。也可以将斜率a也作为参数进行训练即PReLUkaiming He在2015年的论文中就使用了Parametric ReLU。 Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是在训练过程中a是从一个高斯分布中随机出来的然后再在测试过程中进行修正。
这么多的激活函数都有一个共同点就是他们都是非线性的。抛开用激活函数去模拟神经元的仿生想法激活函数的作用在数学上到底有什么意义呢从网上资料看就是为了加入非线性因素。因为感知机其实是最原始的神经网络同时感知机是一个判别模型可用于分类如果没有激活函数我们就无法实现线性不可分问题包括简单的异或XOR问题。如果没有激活函数多个感知机的组合得到的仍然是一个线性分类器仍然无法解决非线性问题。 参考链接2中知乎有人的回答中提到Google的论文Batch normalization: Accelerating deep network training by reducing internal covariate shift尽可能保证每一层网络的输入具有相同的分布解决了Sigmoid的saturate的问题但效果仍然没有ReLU好。正好笔试过程中也遇到了Batch Normalization的问题那么接下来就看一下它到底为何物。
先来说归一化归一化是对于输入特征来说的特征可能是多维的同时他们之间的量纲可能不一样就会造成不同维度的大小存在很大的差异这对于训练来说不太友好因为我们设置的learning rate不可能适应所有的维度会导致训练过慢。 归一化不仅能加快训练速度最快梯度下降法的求解有时候还可以提高精度。比如KNN分类器中要求样本之间的距离归一化使得不同维度对距离造成的影响大小相同而不会使得结果主要取决于某一维度。
归一化常用方法有最大最小归一化线性归一化max和min值不稳定时可以取常数z-score标准化均值方差标准化归一化后的数据符合标准正态分布即进行白化whiten函数转化非线性归一化函数可使用对数、正切等。
其实之前提到的归一化是相对于机器学习领域说的。在深度学习中由于涉及到了多层的网络模型归一化会显得更加重要因为机器学习中有一个数据之间是独立同分布IID的假设这样才能通过训练样本预测新的数据而神经网络中由于底层参数的更新会影响之后高层的输入这在paper中被称为Internal Covariate ShiftICS问题。所以我们就需要对每一层的输出都进行归一化。但是底层的输出被归一化也意味着之前学到的特征分布被破坏了所以batch NormalizationBN又加入了变换重构引入了可学习参数缩放因子和平移因子。
这里简单介绍一下batch的概念。首先我们的训练数据集是有限的我们会使用这一训练数据集训练多次相对于巩固学习但训练太多次又会导致过拟合。每次训练后参数完成一次更新称这一过程是一个epoch。而在每次epoch中我们把训练数据集分成几个较小的子集这就是batch子集的大小是batch_size。数据集较大不利于通过训练网络分成子集有利于加快训练。训练数据集分成子集epoch也分成了几个iteration。根据batch_size的选择可以把训练情况分成三种第一种是batch取最大值即Full Batch Learning一次性将训练数据通过训练网络这只适用于训练数据少的情况。第二种是另外一个极端batch_size取1即Online Learning在线学习/Stochastic随机学习这种情况难以收敛因为每次梯度方向以各自样本的梯度方向收敛。我们看到batch_size其实是在内存利用率和内存容量之间的平衡增大了batch_size相对于通过并行化提高了内存利用率但占用的内存也变大。第三种是Mini-batch在之前两个极端情况下选择一个平衡点。BN就是基于了Mini-batch SGD。BN适用于mini-batch样本量较大且与各mini-batch分布相近似的场景下训练前需进行充分的shuffle。不适用于动态网络结构和RNN。 结合前面讲到的激活函数BN在归一化的同时还可以解决Sigmoid函数的梯度饱和的问题。因为经过BN后通过激活函数的输入是标准正态分布经过非线性变换时的输入大概率保持在0均值附近反向传播时梯度值较大从而避免了梯度消失。BN增加scale和shift的原因也可以通过对激活函数的输入的处理来说明。因为在进入激活函数之前进行了归一化将输入集中在了Sigmoid中心附近而Sigmoid函数虽然本身是非线性函数但是中心附近是接近线性的这样一来我们就失去了非线性函数的优势而补救措施就是增加scale和shift元素。BN的细节还是要看论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》。
总结一下BN的优势1.提升了训练速度避免了梯度双端饱和保证了IID2.类似于Dropout可以防止过拟合加入了随机性的scale、shift3.对初始化的要求没有那么高因为不必使用ReLU即使使用ReLU也可以避免梯度为0可以使用较大的学习率。
除了BN还有其他的归一化方式。BN针对的是单一的神经元Layer Normalization考虑一层的信息并将该层的均值和方差作为归一化标准。weight normalization则将参数也进行了规范化。
Reference
面面观https://blog.csdn.net/cyh_24/article/details/50593400神经网络激励函数的作用是什么有没有形象的解释 - 论智的回答 - 知乎https://www.zhihu.com/question/22334626/answer/465380541https://blog.csdn.net/yangdashi888/article/details/78015448激活函数的作用https://blog.csdn.net/program_developer/article/details/78704224DeeplearningAI实用层面https://www.cnblogs.com/cloud-ken/p/7709447.html归一化优点和方法和结构https://blog.csdn.net/qq_28618765/article/details/78221571Batch_size知乎https://www.zhihu.com/question/32673260深度学习29https://blog.csdn.net/hjimce/article/details/50866313Normalization方式https://blog.csdn.net/qq_24153697/article/details/79880202