neural networks and deep learning 学习笔记

neural networks and deep learning 文章链接:http://neuralnetworksanddeeplearning.com/index.html

neural network and deep learning主要包含了神经网络工作的方式、BP算法的推倒和理解、神经网络的改进和深度神经网络,也包含有python代码实现。我觉得这一系列的文章最大的优点不在于文章讲了那些方法和概念,而在与文章中提供的分析问题进而解决问题的思路,包括对BP算法来源、代价函数饱和问题分析、交叉熵函数的得出的思路、深度神经网络训练的难点等非常重要。

神经网络中的权重的引入直观上理解就是对于输入向量数据中每个属性重要度的表示,Wi越大代表这个属性在这一层越重要,而越重要的东西慢慢变为重心,重心便是我们所主要看到的东西,也就是在提取特征了。而神经网络中的偏置值b则是有其特殊作用的,就像直角坐标系中的直线,如果将其想象成超平面可能也是一样的,与直线相关的可以看做是斜率和截距,实际上也可以将直线的位置看做它以一个点为圆心转动到一定的角度,圆心的位置在坐标轴上由b决定,而方向有w决定。

感知机使用的是0/1阶跃函数,同时仅有一层,仅有一个输出值,MLP变为多层感知机。这种使用0/1阶跃函数的网络的缺点在于权重w和偏置b改变了很小的数值也可能导致输出从0变为1,使用了sigmoid等S型连续的函数的网络可以通过改变w和b而使得输出经过函数的加工仅仅改变很小,输出值的改变量可以表示为w和b改变量的线性函数,因此可以得到任意改变量。

loss function代价函数需要满足的两个假设:代价函数可以写成在每个训练样本x上的代价函数Cx的均值,因为参数调整的梯度计算是基于总体的平均值的;loss function必须是神经网络输出值a的函数。

BP反向传播的时候,基于链式法则,需要用到求导、矩阵加法、矩阵乘法、Hadamard矩阵乘法等。反向传播算法中,某一条路径的变化率因子即某一个权重的该变量对最终代价函数的影响大小就是这条路径上所有层与层之间变化率因子的乘积,而该权重的改变对代价函数的总体影响是从初始权重到最终输出的代价函数的所有路径的变化率因子之和。对于BP算法的推倒需要从第L层开始往底层推倒,而理解则是可以从变动的权重或偏置值的层往输出层推倒。

sigmoid函数在输出值接近1或0的时候饱和,导致导数很小,进而使得权重w和偏置b更新很慢,不过前提是loss  function是二次代价函数,源头在于loss function对权重或偏置的偏导数中含有sigmoid函数的偏导数,导致学习缓慢,解决方法是采用交叉熵函数作为loss function。而交叉熵函数能够作为loss function一是非负二是符合代价度量的标准,同时他对权重或偏置的偏导数式子中没有sigmoid导数,而是σ(z)-y,这说明实际值与计算值差值越大则学习越快。神经元饱和问题是神经元训练的关键的问题。而之所以选中交叉熵函数,根源在与对训练速度缓慢的分析,分析到由于偏导数中有sigmoid函数导数的存在,进而硬式的在偏导数中去掉这个导数,通过积分的形式逆推出loss function应有的形式,所以此处应该有其他出发点和路径进而推倒出其他的loss function。

softmax函数作为输出层的函数相比于sigmoid函数,他的输出值和为1,可以看做输出激活值作为一种概率分布。softmax函数与log-likehood代价函数配合效果与sigmoid函数与交叉熵代价函数配合相似。

过匹配或过度训练在神经网络训练中是常见的问题,来源于权重和偏置参数非常多,表现为实际到达一定训练迭代次数之后准确率不再提升或提升很少而仍然在训练迭代。文章中提到减轻过匹配的方法可以是增加训练样本的量,就像增加基底一样,或者采用规范化的方法,规范化方法有很多,权重下降即L2规范化方法通过在代价函数中增加规范化项,规范化可以当做一种寻找小的权重和最小化原始的代价函数之间的折中。这两部分之前相对的重要性就由 的值来控制了: 越小,就偏向于最小化原始代价函数,反之,倾向于小的权重。这种技巧似乎在很多式子中都由应用,通过一个变量来调整式子中两项的重要度,而问题就落在了如何选择该变量。规范化导致参数变小,参数变小导致对训练数据中的噪音反应减小,而且模型变得简单,规范化网络受限于根据训练数据中常见的模式来构造相对简单的模型,而能够抵抗训练数据中的噪声的特性影响,噪声对于大权重的影响结果要大于小权重,这就使得神经网络模型有更好的泛化性能,因为在训练的时候受到噪声数据的影响小。另外文中提到的其他规范化方法包括l1规范化、dropout方法和人工增加训练样本方法也都是缓解过匹配问题的方法,这些方法正在研究中。

深度神经网络采用的梯度下降训练方法,本身存在着内在不稳定性。这种不稳定性使得先前或者后面的层的学习过程阻滞。这种问题根源于链式法则的多项乘积的作用,表现为梯度消失和梯度爆炸。根本的问题其实并非是消失的梯度问题或者爆炸的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。唯一让所有层都接近相同的学习速度的方式是所有这些项的乘积都能得到一种平衡。如果没有某种机制或者更加本质的保证来达成平衡,那网络就很容易不稳定了。而梯度下降和梯度爆炸只是深度学习难以训练的问题之一,还有其他问题正在研究中。


文中没有过多的讨论网络参数初始值的设定会带来哪些影响和问题。

猜你喜欢

转载自blog.csdn.net/ingwfj/article/details/77920099