深度学习之基础篇

内容是本人通过查阅网上资料和阅读相关书籍以及自己的思考整理的一些东西,其中可能会存在一些不足的地方

1.什么是深度学习(深度学习与深(多)层神经网络)?

基维百科解释为:一类通过多层非线性变换对高复杂性数据建模算法的合集。(注意深度学习的两个重要特征:多层、非线性)。因为深层神经网络是实现“多层非线性变换”最常用的一种方法,所以在实际中基本可以认为深度学习就是深(多)层神经网络的代名词。

深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数 f(x)(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数

我们最终的目的是希望这个多元函数可以很好的完成输入到输出之间的映射

提到非线性这就牵扯到激活函数的问题,因为线性模型的局限性很大,因此深度学习中在隐藏层使用激活函数是必须的,它可以使得模型变得非线性化。TensorFlow中常用的激活函数有:tf.nn.relu,tf.sigmoid,tf.tanh等

深度学习的本质:是通过一系列的线性和非线性变换学习数据的数据结构特性以及数据的分布特性。

2.向量的内积

3.深度学习与机器学习的区别与联系

 

深度学习是目前较为主流的实现机器学习的技术之一。它俩的区别主要是深度学习与传统机器学习的区别。

 

从模型的构建上来说,机器学习往往不需要多层,一般是通过集成来提高模型的泛化性能,而深度学习的特性之一就是多层。对于特征方面,机器学习方法往往需要人为的抽取一些特征,而深度学习的特征是自动抽取的。从数据方面而言,在数据量较小时深度学习模型会失去其优势,这时机器学习模型会表现更好,深度学习在数据量大且数据存在局部相关性的层级结构的数据上表现较好。

 

4.什么样的数据适用于深度学习

 

1)数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。

 

2数据集具有局部相关特性(说的应该就是组合)目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。

 

深度学习的强大有个前提,即数据具有composition(组合)与hierarchy(层级结构)两个基本特性,比如多个局部明暗相间的像素组合了edges,多个相互交叉的edges组合了corners。对应于这类数据的两个基本特性,深度学习作为表示学习的一种,有两个基本特点,分布表示(distributed representation) 与 深层/多层,前者对应composition,后者对应hierarchy。  因为组合的特性,所以测试集和训练集具有数据同分布的特性效果才能更好。图像的层级结构更加明显更需要多层。

5.什么是张量?

从功能角度来看,张量可以被简单的理解为多维数组。

6.深度学习w参数的初始化

随机初始化包括高斯分布以及Xavier[‘zeɪvɪr]初始化。

7.为什么每层的W是随机初始化的且不能设置为相同的值,W的直观化的作用?

网络模型的训练就是对网络模型中的参数不断调节更新的过程,这些参数表述着每一层的特征(W的直观化的作用)。那么,回到题主的问题,如果一个layer中的参数完全一样,那么就相当于在该layer中它们表述的特征是相同的,即使在这个layer有多个节点,这跟在这个layer中只用一个节点没有差别。如果每一个layer中的参数都是一样的,这个极端就使得模型退化为线性的了(不再是网络,而是一条点线点线相连的形状了)同时也是为了打破对称性。

总结:

因为每个隐藏层代表着一个特征层次,隐藏层中的每个节点代表一个特征属性。若所有的W都初始化为相同的值,那么每个节点所抽取的特征都将相同,整个网络层将只能抽取出单一的特征。

8.偏置值b的作用(它不需要正则化)

直观展示:

https://blog.csdn.net/xwd18280820053/article/details/70681750

偏置值b仿生于神经元中不透明的细胞体。

神经网络是一个函数簇,加入偏置项b使得神经网络所拟合的函数能够通过移动适应更多的情况。

偏置的大小度量了神经元产生正(负)激励的难易程度。神经网络可以看成是多个函数组成的簇,Bias的好处是使得神经网络通过移动能适应(Fit)更多的情况,能拟合更多的函数,进而增加模型的拟合能力https://www.zhihu.com/question/68247574

同时对于偏置需要注意的点是:偏置是不需要正则化的,并且正则化偏置的话会导致欠拟合。我们从意义上去理解话,若对偏置正则化(惩罚),会导致激活变得更加简单,偏差就会上升,学习的能力就会下降!

 

9.深度学习中的学习率

 

优化过程中参数更新的步长,朝负梯度方向变化的大小。参数更新需要有技巧地设置步长。也叫学习率。如果步长太小,进度稳定但是缓慢,如果步长太大,进度快但是可能有风险。

 

10.学习率的设定与调节

 

学习率对于模型而言很重要,一般对于学习率的设定是从大到小多次实验,刚开始训练时:学习率以 0.01 ~ 0.001 为宜(0.01和0.001是个很好的选择)。

对于学习率最好通过指数衰减进行调节,具体用法如下:global_step = tf.Variable(0)

learning_rate = tf.train.exponential_decay(FLAGS.init_learning_rate, global_step, FLAGS.num_steps,0.09)  # 学习率递减

train_step = tf.train.AdamOptimizer(learning_rate).minimize(losses, global_step=global_step)

步数的维护传入minimize是自动维护的(已实验通过这种方法学习率会不断下降)

注意:tf.train.exponential_decay()的用法,decay_steps以及decay_rate这两个参数,表示经过decay_steps步学习率衰减decay_rate,它还有个参数staircase默认值是False表示对学习率每一步都进行更新,若设置为True则经过decay_steps步之后才更新decay_rate。

其中,decayed_learning_rate为每一轮优化时使用的学习率;

learning_rate为事先设定的初始学习率;

decay_rate为衰减系数;

decay_steps为衰减速度。

如何更新的?

decayed_learning_rate=learining_rate*decay_rate^(global_step/decay_steps)

为什么要这样做?

1.首先使用较大学习率(目的:为快速得到一个比较优的解);

2.然后通过迭代逐步减小学习率(目的:为使模型在训练后期更加稳定);

合适的学习率可以保证每轮完整训练之后,loss都减小,且能在一段时间后降到一个较小的程度。太小的学习率下loss减小的速度很慢,如果太激进,设置太高的学习率,开始的loss减小速度非常可观,可是到了某个程度之后就不再下降了,在离最低点一段距离的地方反复,无法下降了。

11.神经网络中损失函数和优化函数的作用

训练出一个网络模型之后如何对模型进行评估?往往是衡量预测值与真实值之间的差异程度,这就是通过损失函数来完成的。另外损失函数也是神经网络中优化的目标函数,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数越小,说明模型的预测值就越接近真实值,模型的准确性也就越好。那么为了最小化损失函数则需要对网络模型的参数进行更新,确定如何更新参数这时则需要选择合适的优化函数(用以确定对网络模型参数进行更新的方法)。我们都知道,神经网络模型训练得以实现是经过前向传播计算LOSS,根据LOSS的值进行反向推到,进行相关参数的调整。这个过程需要在loss值的指导下进行,因此在优化时需要传入loss值(其源码自动的求导过程中需要用到loss,具体如何计算的没看懂)。

12.训练中batch_size相关的问题

batch_size设的小一些,收敛得慢,而且可能准确率来回震荡,所以还要把基础学习速率降低一些;但是实际使用起来精度较高。

batch_size设的大一些,收敛得快,也就是需要训练的次数少,准确率上升得也很稳定,但是实际使用起来精度不高。

2)batch_size的大小如何选择?

如果数据集在2000以下直接一次都投入训练,若数据较大了batch_size一般选为64,128,256,512等这些2的次方数。

3)为什么batch_size一般设置为2的n次方

考虑到计算机的内存,计算机的计算是2进制的,这样设置可以使得计算更快。

4)一个batch_size大小的数据是如何参与训练的?

一个batch_size的数据会并行的进行训练,相当于一次通过一个batch_size条数据对参数进行优化因此batch_size设的大一些对参数的优化就会快一些,因为batch_size越大相当于模型获得的数据越多,学得的东西更多,因此对参数的优化会更快,但是一次batch_size的大小如果太大,总的训练次数就会减少,有可能一些更优的参数无法获得,进而导致模型没有那么精确,故理论而言一次训练一条数据可能更优,但是太费时间,当数据量很大时显然不可行。

5)为什么要设置一个batch_size?

理论上而言大小设置为1最好,但是这样难以达到收敛,而且会使得训练速度过慢。同时还有一个极端就是把所有样本一次都放入训练,因为训练模型往往需要的数据量很大,这样容易使内存爆掉

 

按批来更新参数,这样,一个批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为批的样本数与整个数据集相比小了很多,计算量也不是很大,同时对内存也进行了充分的利用
链接:http://www.imooc.com/article/37069

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/dyl222/p/10946716.html
今日推荐