上面两章已经建立了神经网络并使用tf对神经网络进行训练。那么今天来主要看看为什么要使用深度神经网络。
(一)深度学习
所谓深度学习,他的特性在于两点:多层与非线性。
(1)为什么要有非线性的特征呢?因为线性模型有局限性!
线性模型中,我们无论多少层线性的组合,最后推导出来仍然是线性的组合,也就是说,如果我们不添加非线性的激活函数,那么我们一万层网络和一层是没有区别的。
OK,那么问题来了,线性为什么不行!我们用tf的playground测试了一下,如果我们只使用线性的函数组合,那么只能在平面上搞出线性的组合,那么什么是线性的组合呢,比如说在一个二维平面内,我们的两个输入分别是x和y,输出用颜色表示,那么只能把平面通过一条直线分割开来;而宏观的来说,我们神经网络的目的是拟合成为任何函数,线性的组合只能组合成线性的函数,那么就是局限性了!没办法把平面的点很好的区分开,而加入了非线性的函数就可以了。
(2)为什么要有多层呢?
1.有很多特征没有办法通过人工的方法简单提取,所谓人工能提取到的特征都是简易特征,那么多层网络可以对低阶特征进行进一步的组合,组合成更为复杂的特征。
2.当然从整体上而言,由于我们表示出了更为复杂的函数,整体计算量是增加的,但是我们考虑的是相同量级下的计算。我们假设同样是12个神经元,也就是说我们用了12个函数进行组合,如果是单层,那么我们可以吧这12个函数每个给与一个权重,然后对这12个函数进行组合,共12个权重,而如果排列成3层,每层4个神经元,则一共有4*4*4=64个参数,64个参数的组合多于12个,所以可以组合出更复杂的函数。
3.比如异或操作,单层解决不了
(二)损失函数
分类问题:
交叉熵(cross entropy)--刻画了两个概率分布之间的距离
但是如何将我们的输出向量变成一个概率分布,就要使用softmax。softmax本身具有分类能力,但是tf中将softmax的参数去掉了,让他作为一个数据处理层。
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y,y_)
以上这行代码就已经良好的封装了神经网络的输出经过softmax回归后计算交叉熵。挺方便!
回归问题(对具体问题的预测):
1.MSE(均方误差,mean squared error)
mse = tf.reduce_mean(tf.square(y_-y))
(三)神经网络优化算法
反向传播算法:梯度下降(目前应用主要是随机梯度下降和梯度下降的综合运用,一次选取一个batch的数据计算损失函数,然后进行梯度下降的运算过程)
学习率(控制每次参数更新的幅度):指数衰减法(先用较大的学习率得到较优解,然后运用较小的学习率)
过拟合问题:过度关注了训练数据的噪音而忽视了问题的整体规律--剪头发不认识了
正则化:在损失函数中增加了表示模型复杂程度的指标。(我认为这样在最小化损失函数的时候也同时降低了模型的复杂程度,不会让模型过度复杂)
模型的复杂程度一般用参数w表示(因为我理解中w相比b的数量,w的数量远远大于b,而且w是乘法性质,b是加法性质,所以w的影响更大),上图表示了衡量模型复杂程度的3个函数。其中第一个:可以吧更多的参数调整为0,降低了网络的稀疏程度;第二个:不会吧参数调整为0,因为0.01平方后已经很接近0了。此外,L1正则化不可导(因为绝对值的存在,出现了棱角,所以不可导)而L2可导。