当前位置: 首页 > 科技观察

不可多得的深度学习技巧指南

时间:2023-03-19 15:51:14 科技观察

数据预处理(这部分原作者没写,补充个人理解这部分)What:输入神经网络数据的好坏直接关系到网络训练结果,一般需要对数据进行预处理。常用的数据预处理方法包括:去均值:将每个原始数据减去所有数据的均值,即将输入数据的每个维度的数据居中为0;归一化:一种方式是使用均值除以标准差后的数据,另一种方式是将所有数据除以数据的绝对值;PCA/白化:这是另一种形式的数据预处理。一种是降维,一种是方差处理;原因:对数据进行预处理可以使它们对模型的影响具有相同的规模或其他目的。参考:CS231n用于视觉识别的卷积神经网络。InitializationWhat:如果权重初始化得当,可以提高性能,加快训练速度。bias一般设置为0。对于权重,建议统一在一定范围内:对于linearlayer[1]:区间为[-v,v],v=1/sqrt(inputsize),sqrt代表根号;对于卷积层[2]:区间为[-v,v],v=1/sqrt(volume卷积核的宽度x卷积核的高度x输入深度);batchnormalization[3]的应用在某些方面减少了调整权重初始化的需要,一些研究成果页面提出了相应的替代公式。Why:在默认初始化的情况下,随着输入数量的增加,每个神经元都会有一个方差,通过根号缩放每个权重可以保证神经元有一个近似的输出分布。参考资料:1.随机梯度下降技巧,LeonBottou;2.这是Torch中的默认操作;3.批量归一化:通过减少内部协变量偏移加速深度网络训练,S.Ioffe和C.Szegedy;What:对于长短期记忆网络(LSTM),遗忘偏差一般设置为1,可以加快训练过程。原因:直觉是,当训练开始时,您希望信息在细胞之间传播,所以您不希望细胞忘记它的状态。参考:循环网络架构的实证探索,RafalJozefowicz等。What:对于t-distributedfieldembedding算法(t-SNE),原作者建议对于大小在5000~10000之间的数据集,perplexity设置为Between5~50[1],对于更大的数据集,对应的困惑也会增加。Why:perplexity决定了每个点的高斯分布的方差。更小的困惑会得到更多的集群。相反,大的困惑是没有意义的;另外要考虑的是绘制出来的簇不能保留原来的比例,簇间的距离不一定代表原来的空间几何。不同的困惑可以提供数据结构的互补信息,每次运行都会产生不同的结果[2]。参考:1.使用t-SNE可视化高维数据,L.J.P.范德马腾。2.HowtoUset-SNEEffectively,Wattenberg,etal.,Distill,2016.Whattotrain:除了使用groundtruthhardenedtargets之外,还可以使用softenedobjective(softmax输出)来训练网络。参考:在神经网络中提炼知识/暗知识,G.Hinton等。What:学习率可能是调整参数中最重要的参数。一种策略是选择一些具有随机学习率的参数,并在几次迭代后观察测试误差。参考:调整超参数的一些建议。Ref:Goodfellowetal2016BookRegularizationWhat:在RNNs中使用Dropout,它只适用于非循环连接[1],但最近的一些文章提出了一些技巧使Dropout适用于循环连接[2]。参考:1.循环神经网络正则化,WojciechZaremba等人。2.RecurrentDropoutwithoutMemoryLoss,StanislauSemeniutaetal.What:BatchNormalization(BN),增加了一个新的层,作者给出了一些额外的Tips来加速BN层的工作:提高学习率;remove/reducedropout:在不增加过度拟合发生的情况下加速训练;删除/减少L2范数权重的归一化;speedupthelearningratedecay:使网络训练更快;删除本地响应规范化;更彻底地打乱训练样本:防止相同样本总是小批量出现(在验证集上增加1%);减少光度失真;为什么:这里有一些很好的解释。参考:通过减少内部协变量偏移加速深度网络训练,S.Ioffe和C.Szegedy。NetworkStructureWhat:使用skipconnections将中间层直接连接到输入/输出层。Why:作者的观点是通过减少神经网络底部和顶部之间的处理步骤,更容易训练深度网络,缓解梯度消失的问题。When:某些CNN结构或RNN中的一些重要层。参考:使用递归神经网络生成序列,AlexGrave等。What:为LSTM添加窥孔连接(将之前的输出连接到门的输入),根据作者的观点,此操作对于长期依赖性很有用。Ref:LearningPreciseTimingwithLSTMRecurrentNetworks,FelixA.Gersetal.What:大多数深度学习框架都提供了结合SoftMax和Log的函数或者在损失函数中计算SoftMax(在Tensorflow中是softmax_cross_entropy_with_logits,在nn.LogSoftMax中火炬),这些应该更好地使用。Why:Log(SoftMax)有小概率数值不稳定,导致溢出等不良结果。另一种流行的方法是在Log中添加一些小数以避免不稳定。NaturalLanguageProcessing(NLP)What:RNN和seq2seq模型的一些技巧:Embeddingsize:1024或620。更小的维度如256也可以带来良好的性能,但更高的维度并不一定会带来更好的性能;对于解码器:LSTM>GRU>Vanilla-RNN;2-4层好像一般就够了,但是有残差的更深的网络好像很难收敛,多挖多技巧;Resd(密集残差连接)>Res(与上一层几乎相连)>无残差连接;对于编码器:双向>单向(反向输入)>单向;注意(加法)>注意(乘法)>不注意;使用梁会带来更好的结果;参考:神经机器翻译架构的大规模探索,DennyBritz,AnnaGoldie等。内容:对于seq2seq,翻转输入序列的顺序,保持目标序列不变。Why:按照作者的观点,这种简单的数据变换极大的提升了LSTM的性能。参考:使用神经网络进行序列到序列学习,IlyaSutskever等。内容:对于seq2seq,编码器和解码器网络使用不同的权重。参考:使用神经网络进行序列到序列学习,IlyaSutskever等。What:训练时,强制修正解码器的输入;在测试时,使用前面的步骤,这使得训练在开始时非常有效,Samy等人。提出了一种基于模型变换的改进方法[1]。参考:1.SamyBengio等人使用循环神经网络进行序列预测的预定采样内容:以无监督方式训练网络以预测文本的下一个字符(char-RNN),网络将学习监督任务的表示(例如情感分析)。参考:学习生成评论和发现情绪,IlyaSutskever等。强化学习什么:异步:同时训练具有不同探索策略的多个智能体可以提高鲁棒性。Ref:AsynchronousMethodsforDeepReinforcementLearning,V.Mnih.What:跳帧:每4帧计算一次动作,而不是每帧计算一次,并对其他帧重复此动作。原因:在Atari游戏上运行良好,使用此技巧可将训练过程加快约4倍。参考:使用深度强化学习玩Atari,V.Mnih。What:History:不是仅仅将当前帧作为输入,而是将最新的帧叠加在输入上,结合间隔为4的跳帧,这意味着我们有一个包含t,t-4,t-8的帧栈和t-12。原因:这允许网络获得一些动量信息。参考:使用双Q学习的深度强化学习,V.Mnih。What:ExperiencePlayback:为了避免帧间相关性,而不是更新每一帧作为代理,最好在历史过渡期中抽取一些样本,其思想类似于在有监督训练之前对数据集进行洗牌学习。参考:优先体验回放,TomSchaul等人。内容:ParallelAdvantageActorCritic(PAAC):通过代理的经验和使用单个同步更新模型可以简化A3C算法。参考:深度强化学习的高效并行方法,AlfredoV.Clemente等。NetworkCompressionWhat:在推理中,为了减少层数,其他权重可以被batchnormalization(BN)层吸收。这是因为批量归一化在测试时执行简单的线性缩放。