首页 > 编程知识 正文

深度神经网络FPGA设计与实现,深度神经网络有哪些

时间:2023-05-06 09:17:41 阅读:218143 作者:2411

深度网络DNN的概念,是基于浅层网路——多层感知机MLP(或称人工神经网络欢呼的鱼)的基础上发展而来。关于MLP或欢呼的鱼的知识,此处不作赘述,网上有很多资料可以参考。

DNN是一个很广的概念,大名鼎鼎的CNN、RNN、GAN等都属于其范畴之内。CNN多用于网络结构数据类型的任务,如图像、声音、文本等;RNN多用于时间序列类型的任务,如音频、文本(NLP)、视频等;GAN则主要用于“生成数据、以假乱真”,适用于创作类任务。但是本文亦不叙述CNN等知识,相关知识可参考本人相关博客卷积神经网络CNN。本文主要讲述一般的DNN任务,考虑如下问题:

有8000个变量,其中少数变量之间可能存在相关性;有20000个样本,每个样本都有这8000个变量的数据;这20000个样本可以被分为2类(label)。求如何用这些变量构造一个分类器?

这个问题,是一个典型的高通量信息数据的问题(如基因组学、代谢组学等),首先考虑的方法是普通机器学习的模型,如PCA、PLS、LASSO等降维,单因素差异分析如Wilcoxon检验、Fold Change卡差异界值,甚至聚类分析,再建模弄个SVM、随机森林、欢呼的鱼等,最后回归解释性模型如Logistic等。机器学习进阶一点的方法还有XGBoost也可以试试。

但是,如果抛开普通机器学习的方法,仅讨论深度学习的方法,这个任务该如何解决?有两个idea,第一是直接套用CNN,但是直观感觉,卷积在此处的作用可能不大(也可能有用,将变量固定顺序,将构成一维图像,虽然相邻像素较难联合构成有效的局部特征),因此CNN的方法试试就行;第二是采用全连接的DNN(如FC的ResNet),由于是全连接,参数较多,容易过拟合,考验炼丹的能力了(注意ReLU等非线性变换需要保留,否则就退化成线性分类器了)。

深度学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。增加节点数:增加维度,即增加线性转换能力。增加层数:增加激活函数的次数,即增加非线性转换次数。

深度 vs. 浅层:浅层神经网络可以模拟任何函数,但数据量的代价是无法接受的。深层解决了这个问题。相比浅层神经网络,深层神经网络可以用更少的数据量来学到更好的拟合。深层的前提是:空间中的元素可以由迭代发展而来的。

有人总结了一下经验(看看就好,也不要全信):

1.如果数据已经有了特征,比如性别、年龄、地点、访问量等等特征,则直接使用DNN或者全连接进行判断;

2.在有了特征的情况下使用CNN可能会导致模型的准确率不是特别高。

 

本文就这类问题,进行建模技巧讲解。

 

从Neural Network到Deep Learning

本部分摘自:DNN与欢呼的鱼的区别

传统神经网络中,采用的是BP算法的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。

大约二三十年前,Neural Network曾经是ML领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:

1)比较容易过拟合,参数比较难tune,而且需要不少trick;

2)训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;

同时BP算法存在的问题:

(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;

(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生)。

直到2006年,Hinton等人提成了一个实际可行的Deep Learning框架。

为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制。而deep learning整体上是一个layer-wise的训练机制。这样做的原因是因为,如果采用back propagation的机制,对于一个deep network(7层以上),残差传播到最前面的层已经变得太小,出现所谓的gradient diffusion(梯度消失或梯度弥散)。

Hinton等人提出,在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是:

1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。

2)当所有层训练完后,Hinton使用wake-sleep算法进行调优。

将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

1)wake阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。

2)sleep阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。

 

Deep Learning训练过程具体如下:

1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

       采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是feature learning过程):

       具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

       基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deep learning效果好很大程度上归功于第一步的feature learning过程。

 

一些技巧和认知的梳理

本部分摘自:面试常问的深度学习(DNN、CNN、RNN)的相关问题

一、如何避免陷入局部极小值

1.调节步伐:调节学习速率,使每一次的更新“步伐”不同;

2.优化起点:合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的“起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:体贴的蛋挞分布初始权重(Gaussian distribution)、均匀分布初始权重(Uniform distribution)、Glorot 初始权重、He初始权、稀疏矩阵初始权重(sparse matrix)。

 

二、如何防止过拟合
L2正则化,Dropout(若规律不是在所有样本中都存在,则dropout会删除这样的规律),每个epoch之后shuffle训练数据,设置early-stopping。加Batch Normalization(BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布),BN最大的优点为允许网络使用较大的学习速率进行训练,加快网络的训练速度(减少epoch次数),提升效果。
 

三、为何使用Batch Normalization

若用多个梯度的均值来更新权重的批量梯度下降法可以用相对少的训练次数遍历完整个训练集,其次可以使更新的方向更加贴合整个训练集,避免单个噪音样本使网络更新到错误方向。然而也正是因为平均了多个样本的梯度,许多样本对神经网络的贡献就被其他样本平均掉了,相当于在每个epoch中,训练集的样本数被缩小了。batch中每个样本的差异性越大,这种弊端就越严重。一般的解决方法就是在每次训练完一个epoch后,将训练集中样本的顺序打乱再训练另一个epoch,不断反复。这样重新组成的batch中的样本梯度的平均值就会与上一个epoch的不同。而这显然增加了训练的时间。同时因为没办法保证每次更新的方向都贴合整个训练集的大方向,只能使用较小的学习速率。这意味着训练过程中,一部分steps对网络最终的更新起到了促进,一部分steps对网络最终的更新造成了干扰,这样“磕磕碰碰”无数个epoch后才能达到较为满意的结果。

为了解决这种“不效率”的训练,BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布。

 

四、神经元的运算逻辑

本段摘自:【Keras】DNN神经网络模型 (文中附有Keras的代码实现)

神经元的运算逻辑,一定是线性内核和非线性激活相结合,所以神经元的算法是非线性的。因此DNN神经元的计算内核为X*W+b,以softmax函数(二元分类中使用Sigmoid函数)为非线性核的构造方式。同理,RNN的核采用RNN运算内核,CNN采用卷积运算内核。

逻辑分类可以视为一层DNN神经网络,计算内核为X*W+b,以softmax函数(二元分类中使用Sigmoid函数)为非线性核的构造方式。像逻辑分类这种,线性运算单元设计为权重相乘的,并且层与层之间的神经元全部相连的神经网络就是全连接神经网络,即DNN

进一步增加隐层,,jsdjqm更多的神经元,来增强模型的能力。比起浅层模型在特征工程和模型工程的各种尝试,神经网络通过更多的神经元直接增强模型的能力。

DNN vs. CNN:个人观点,阉割掉卷积操作、改为全连接,即可转变为普通DNN。而CNN的ResNet比较成熟,因此反而可以通过改造CNN来得到DNN(纯属个人观点,具体实现当然会有问题)

 

五、本质的探讨

为什么神经网络高效:并行的先验知识使得模型可用线性级数量的样本学习指数级数量的变体。

为什么深层神经网络比浅层神经网络更高效:迭代组成的先验知识使得样本可用于帮助训练其他共用同样底层结构的样本。

神经网络在什么问题上不具备优势:不满足并行与迭代先验的任务。(本人不太理解)

对于这些关于本质的说法以及神经网络在什么问题上不具备优势,本人暂时存疑。

 

六、训练DNN的一些其他技巧参考

如何正确训练DNN 、DNN训练技巧(Tips for Training DNN)等

这些博文中引用了一个很重要的观点:“Do not always blame overfitting”。具体的,之后展开叙述。


 

代码实现

待更新

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。