为什么深度神经网络算法适应能力高?

1.1 什么是神经网络

神经元代表了线性修正单元函数

1.2用神经网络进行深度学习

监督学习:已经有数据集,知道相应的输入产生怎样的输出,找出输入输出这种对应的关系

监督学习问题被分成回归和分类两类

CNN通常被用来处理图像;RNN通常被用来处理一维序列数据

结构数据:有确切的意义,而非结构数据没有,比如,音频,文章等等

1.3 为什么深度学习会兴起

数据集增多;计算能力增强;算法优化

神经网络的计算过程通常有正向传播过程和反向传播过程(为什么)

计算机存储一张图片,以红绿蓝三种矩阵

用在监督学习问题;输出y是0或1;

为什么要对wx+b进行sigmoid函数化(因为wx+b等价于线性函数,你不能确保输出是0-1的一个数)

2.3 逻辑回归损失函数

为了训练w和b,提出成本函数;损失函数针对单个训练样本,成本函数基于总体训练样本

为什么使用逻辑回归的特定成本函数(因为是凸函数);梯度下降(从初始点开始往最陡的方向走一步)

函数的导数就是函数的斜率,而函数的斜率在不同的点是不同的

如何利用流程图来计算导数?

2.7 逻辑回归的梯度下降法

 如何使用导数流程图来计算梯度?

运用向量化技术来解决显示使用循环带来的低效

numpy.dot(w, x);经验法则:只要有其他可能,就不要使用显示for循环;尽量使用内置函数或者其他方法去计算循环

对于两个不匹配的矩阵,会拓展其中一个维数少的矩阵,从而实现两个矩阵的运算

在神经网络编程中,不要使用(n,)这样秩为1的数组(和行向量、列向量不一样);可以随意使用assert语句;也可采用reshape()方法

神经元的计算过程先计算z = w*x + b,再将z作为激活函数的输入,然后产生输出;

np.squeeze()函数用法:从数组的形状中删除单维条目,即把shape中为1的维度去掉

pycharm中注释多行代码的快捷键:ctrl + /(取消也是)

1.数据的加载:求得训练集和测试集中图片数量,图片的高度和宽度,而后进行数据的标准化

4.计算正向传播过程(成本函数)和反向传播过程(dw和db)

5.通过优化成本函数来更新w和b

6.预测数据集的标签,通过计算的值,并进行比较来确实是否为1

(i)圆括号代表i样本,[i]方括号代表i层

“隐藏层”:在训练集中,这些中间节点的真正数值我们是不知道的

符号约定中,神经网络的层数是不计入输入层的

3.3 多个例子的向量化

如何将不同训练样本向量化?(如何将训练样本横向堆叠起来构成矩阵X)

a = tanh(z) :有类是数据中心化的效果;tanh函数在大部分情况下都比sigmoid函数优越,一个例外是输出层,当我们希望输出在0,1之间,如二元分类时,sigmoid函数所表现的效果会更好

不同层的激活函数可以不一样;

sigmoid函数和tanh函数共有的缺点如果输入的z非常大或者非常小时,导数的梯度可能就很小(接近于0),而这会拖慢梯度下降算法

Relu函数:尽管不可微,但因为大部分情况下z != 0,且你可以在z = 0 时对导数进行赋值0或1来处理这种特殊情况

选择激活函数的经验法则:

如果你的输出值是0和1,如果你在做二元分类,那么sigmoid函数非常适合输出层的激活函数,然后其他单元的激活函数采用Relu函数

Relu函数比tanh和sigmoid好的一个主要原因:它没有斜率接近于0 的点,从而不会产生减慢学习速度的效应

3.5 为什么神经网络需要非线性激活函数

如果不用激活函数,g[z] = z,有时称为线性激活函数,此时的输出不过是输入特征x的线性组合,此时无论你的神经网络有多少层,一直做的就是计算线性激活函数,而这和去掉所有隐藏层的效果是差不多的

大部分情况下隐藏层不能使用线性激活函数,除了与压缩有关的特殊情况;在回归问题上,如预测房价,可以在输出层尝试线性激活函数

3.6 神经网络的梯度下降法

梯度下降算法的具体实现和如何处理单隐层的神经网络

在训练神经网络时,随机初始化参数很重要,而不是全部初始化0

对于逻辑回归,可以将权重参数初始化为0,在神经网络中如果将权重参数初始为0,则使用梯度下降算法将完全无效(因为无论输入是怎样的,隐藏层的a[1]1和a[1]2是一样的;在计算反向传播时,出于对称性,dz[1]1和dz[1]2也是一样的)

对权重参数的随机初始化尽量小而不是大,因为对一些激活函数而言,会导致落入平缓区域,导致梯度下降算法的效果不太好

x[m, n]引用矩阵中某一段数据集,m代表第m维,n代表在第m维中取第n个数据;

plt.cm.Spectral的作用在于在画图时为不同类别的样本分别分配不同的颜色;

np.random.seed():设置的seed()值仅一次有效;如果使用相同的seed( )值,则每次生成的随即数都相同

1.初始化神经网络的结构(如要几层,隐层单元要几个等等)

8.预测的实现,在主函数实现预测的准确性

什么是深层神经网络和神经网络中的术语表示;

事实上,我们在实现神经网络的过程中,想增加程序无错的概率的其中一个方法是需要非常仔细和系统化的思考矩阵的维数

为什么深度神经网络效果良好?

因为对于一些复杂任务,可以通过层数逐渐提高难度(如人脸识别中,前面的层数可以用来处理边缘探测器的任务,而后逐渐扩大区域,找到鼻子,而后合成脸单独)(从简单到复杂)(如语音识别中,前面的层数可以用来处理音位,而后逐渐处理单词、短语、句子等等)

电路理论:如果要计算m个样本的异或,采取深度神经网络的话,由于有不同的隐层,所有隐层单元数不会很多,采取浅层神经网络的话,单隐层下为了实现目标会导致隐层单元数呈指数级增长

边缘探测器相对来说都是针对照片中非常小块的面积,面部探测器呢则会针对相对较大的区域

numpy数组的属性:

plt.rcParams(rc配置文件来自定义图形的各种默认属性):

}

深度学习之卷积神经网络总结

深度神经网络是普通神经网络的深度化,普通神经网络的结构类似人脑皮层,因为其结构的优越性曾经引起研究的热潮,并成功提出BP算法。

神经网络的强大表征能力依靠其深度,深度越深,表征能力越强,同时训练难度也会越大。传统的BP算法在模型深度加深时会遇到局部最优和梯度扩散等难题,导致其深度模型的研究被搁置。

浅层神经网络表达能力不足,深层网络难以训练,导致神经网络逐渐受到冷落,直到Hinton于2006年使用逐层初始化和全局调优的方法解决了深度网络难以训练的难题,深度网络才重新受到重视。

早在1998年,Lecun就用深度卷积神经网络做手写数字识别,并取得了很好的效果。卷积神经网络因为其权值共享的特点,没有梯度扩散的问题,(也许局部极值点的情况也不严重),可以直接使用BP算法。但是这时候的卷积神经网络只适合做小图片的识别,大图片识别的效果并不好。(为什么?我认为原因是,该网络结构的广度和深度不够,对大图片的表达能力有限。而且,受限于当时的计算能力和数据量大小,无法进一步扩展网络结构。)

2012年,Hinton和他的两个学生使用扩展了广度和深度的卷积神经网络在ImageNet上达到了当时最佳的分类效果,并远远领先第二名,使得卷积神经网络越来越受重视。

2014年,汤小欧团队使用卷积神经网络做人脸特征点检测和人脸识别,达到了比人还高的识别准确率;另外,据说使用卷积神经网络,车型识别的准确度能提高6个百分点。

下面对这几天卷积神经网络的学习做一些总结。

  1. 深度模型是数据驱动的,随着深度的加深,训练所需的样本也急剧增加。深度模型表征能力很强,如果训练样本不足,模型会出现过拟合的问题。Hinton使用人工制造样本(水平平移和镜像、PCA)和dropout方法防止模型过拟合。他们用了多少样本?原始集是160万256*256大小的图片,然后每个样本通过水平平移和镜像做了2048张224*224大小的样本,又通过PCA做了若干张。
  2. 为了提高训练速度,必须使用GPU加速。GPU的强大之处在于其并行计算能力,目前最好的GPU是K80,很贵,其次是GTX Titan,价格在一万到两万之间,再次是GTX 980,4000多,是我目前使用的。经过测试,使用caffe训练CaffeNet,batchzise=256时,需要3.2G显存,使用GTX 980,每20轮迭代大概需要15秒。
  3. 神经元使用ReLU函数一是能避免sigmoid函数饱和(在sigmoid接近1的平缓区域,梯度下降很慢)的问题,提高训练速度,二是能避免梯度扩散(因为sigmoid在残差传播时,前一层最多只能保留后一层的四分之一,导致越往前传播,残差越小,对前几层的权值和偏置的修正能力越弱,而使用ReLU就没有这个问题)。人脸特征点检测那两篇论文使用的都是绝对值修正的双曲正切函数,论文中说这种函数比较好,好像没讲原因,需要验证。
  4. CNN可以使用逐层初始化和全局调优的方法训练,也可以直接使用BP算法进行训练,看的这几篇论文都是直接使用BP,看了Matlab使用BP的CNN实现。BP通过高层偏置的变化对输出误差的影响(即敏感度)向低层的传播来修正权值和偏置,然后使用修正的权值和偏置对新样本前向传播计算新的偏差,继续使用此偏差后向传播,修正权值和偏置,依次迭代,直至收敛或近似收敛。
  1. batchsize增加,可以用更大的base_lr,收敛速度会加快。
  2. 开始时应使用较大的base_lr,提高收敛速度,等到该lr不能进一步提高test accurancy时,将该lr缩小10倍,继续迭代。
  3. fine-tune已经收敛的模型,能提高收敛速度。fine-tune的步骤是:改最后一层的参数(名字、输出数目,增大lr的倍率),降低base_lr,开始fine-tune。

}

我要回帖

更多关于 深度神经网络算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信