cs231n神经网络NN(或称为人工神经网络ANN或称为多层感知器MLP)基础知识部分集中在PPT的lecture05~lecture07,且有整理的笔记(搜索关键字都能搜到),已经算是非常棒了,此处仅针对个人再做下简化、整理。
神经网络的理解:
神经网络个人理解可以看作是线性函数和非线性函数的组合,所以只要组合得够好在一定程度上可以逼近任意函数?那么重点就在于学习如何线性、如何非线性、如何组合?更多的神经元可以表达更复杂的函数也可能造成对训练数据的过拟合。追求模型的泛化能力,遏制过拟合现象,采取人工干预措施,尽量不通过无脑减少神经元的途径,干预方法有比如施加权重参数惩罚(正则化)、施加前向传播噪声(dropout、data augementation、stochastic pooling)
我们常称某某知名网络多少多少层,比如ResNet152层,那么N层神经网络的意思?:有N-1个有可学习参数的网络层(像inception module里存在并行的层,统一当作一层)(不统计没有参数可学的pool层之类的个数),另加1个输出层,于是称之为N-1+1层神经网络。
目前“对于生物神经元的建模是非常粗糙的:在实际中,有很多不同类型的神经元,每种都有不同的属性。生物神经元的树突可以进行复杂的非线性计算。突触并不就是一个简单的权重,它们是复杂的非线性动态系统。很多系统中,输出的峰值信号的精确时间点非常重要,说明速率编码的近似是不够全面的。鉴于所有这些已经介绍和更多未介绍的简化”【取自知乎翻译】,觉着这些“模仿粗糙之处”将可能成为下一步的神经网络提升点?更加完整真实地复现神经元工作,更好的学习能力,更好的表现效果?
在选择非线性函数(激活函数)时常用sigmoid(饱和特性会使得梯度消失,非零中心影响梯度运作)、tanh(饱和、零中心)、ReLU(正向不饱和、非零中心)、Maxout(是对ReLU和Leaky ReLU的一般归纳,好但复杂),目前ReLU受欢迎程度较高。
神经网络中的计算:
神经元的个数? feature map的每个点都是一个神经元的输出。所以 神经元个数 = 特征图大小。
可学习参数的个数? 卷积层参数计算F*F*Cin*K+K ,其中F是滤波器尺寸,Cin是输入的depth维度(=通道数),K是滤波核个数。 详细的通用的尺寸大小和参数量计算可以看这里。
神经网络的参数更新:
参数更新方法或者称之为深度网络的最优化方法。其中,让学习率lr随着epotch的增加而减小(随步数衰减、指数衰减、1/t衰减、...)是非常有帮助的小技巧,同时还有了随步数衰减的dropout,也就是说让超参数例如lr或噪声例如dropout在学习过程中变化是门有用的研究?
一阶的更新方法:SGD、SGD+Momentum、SGD+Nesterov;二阶方法:牛顿法、L-BFGS、Adagrad、RMSprop、Adam。
准备阶段:
对输入数据x进行类似零中心和归一化(还有PCA/白化、各种norm)的预处理工作(跟介绍激活函数时的评判标准零中心如出一辙,网络在处理零中心的数据表现更好?),对网络权重w进行小随机数等初始化工作,选择使用norm层,对正则化工作进行选择和参数设定,对损失函数的表达形式的选择(折叶损失、平方折叶损失、交叉熵损失...)——可以看出在准备阶段处理思路都是针对“损失函数公式loss=F(w·x+b-y)+regularization”逐项进行初始化工作的,甚至有思路对“·”数学操作做了特殊处理。在网络超参数的选择上,使用随机搜索法优于网格搜索法,从大范围搜索到精细化搜索。
训练阶段:
训练前仍然需要做些检查工作以期网络足够合理能够开始训练,1.检查少量维度上解析梯度是否与数值梯度一致;2.检查在小量输入数据下初始损失函数得到的值是否符合预期,然后再训练观察损失函数是否能归到零。
训练中需要关注些数值或图标的变化以判断超参数是否合理、网络是否拟合、网络是否死亡等信息,1.损失函数曲线;2.训练集和验证集的正确率;3.如果是针对图像的训练,网络第一层的可视化效果;4.权重或梯度的更新比例
训练后有个略微提升测试集正确率的小妙招,即模型集成:1.同一个模型,不同的初始化;2.交叉验证中不同的超参数对应的不同的模型;3一个模型设置多个记录点;4训练时参数备份,跑参数的平均值。