内容是本人通过查阅网上资料和阅读相关书籍以及自己的思考整理的一些东西,其中可能会存在一些不足的地方
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的初始化?
以简单的前馈神经网络为例进行说明(参考:https://zhuanlan.zhihu.com/p/75879624)
结合以上具体公式进行详细的分析
一、把W都初始化为0的影响
1)以都使用的为sigmoid激活函数为前提,偏置值也都为0,
以上初始化带来的问题是,所有的W尽管能够得到更新,但是最终值都相等,只能抽取单一的特征,一层相当于只有一个神经元。
相关延伸:
W都初始化为0,b都初始为相同的值,和上述问题相同。
W,b都初始化为0,但是选用的激活函数为tanh,relu等这些在0处值为0的激活函数,那么参数W都得不到更新,一直为0。若偏置值不为0且都相等还是会带来所有的W尽管能够得到更新,但是最终值都相等,只能抽取单一的特征,一层相当于只有一个神经元这一问题。
2)偏置值b随机初始化
也就是尽管W都为0,但是偏置值b是随机初始化的不同值,所以W都能得到更新也不会全部相同,只不过这种更新方式较为缓慢,容易梯度消失等。
二、参数W都初始化为相同的值(不是都为0了)
若偏置值都相等(无论是都为0还是都为某一非0常数),会带来所有的W尽管能够得到更新,但是最终值都相等,只能抽取单一的特征,一层相当于只有一个神经元这一问题。
若偏置值是随机初始化的不是都相等的,不会造成抽取的特征单一,但是可能会训练缓慢。
多层的神经网络从下向上也是对表征不断的进行组合,随机初始化参数以通过训练组合获得泛化更好的更多样的表征。
三、如何有效的进行参数的初始化
参考:https://blog.csdn.net/xxy0118/article/details/84333635
https://blog.csdn.net/victoriaw/article/details/73000632
https://blog.csdn.net/VictoriaW/article/details/73166752
参数初始化的目的:
参数初始化的目的是为了让神经网络在训练过程中学习到有用的信息,这意味着参数梯度不应该为0。而我们知道在全连接的神经网络中,参数梯度和反向传播得到的状态梯度以及入激活值有关——激活值饱和会导致该层状态梯度信息为0,然后导致下面所有层的参数梯度为0;入激活值为0会导致对应参数梯度为0。所以如果要保证参数梯度不等于0,那么参数初始化应该使得各层激活值不会出现饱和现象且激活值不为0。我们把这两个条件总结为参数初始化条件:
初始化必要条件一:各层激活值不会出现饱和现象。
初始化必要条件二:各层激活值不为0。
优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中的方差保持一致。不然更新后的激活值方差发生改变,造成数据的不稳定。
常用的参数初始化有Xavier初始化和He初始化以及Kaiming初始化,具体介绍看上文链接
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的值通过bp网络用链式求导法则进行相关参数的调整。
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