Tensorflow之深层神经网络
1,深度学习与深层神经网络
维基百科对深度学习的定义:一类通过多层非线性变换对高复杂性数据建模算法的合集。
深层神经网络是实现多层非线性变换的最常用方法,因此实际中深度学习成为深层神经网络的代名词。深度学习有两个重要特性:多层和非线性。
1.1 线性模型的局限性
y = (xw_1)w_2 = x(w_1w_2) = xw_1
从上面这个推理可以看出线性的两层神经网络与单层的网络并没有区别。以此类推,只通过
线性变换,任意层的全连接神经网络和单层神经网络模型的表达能力没有任何区别,而且它们都是线性模型,而线性模型能够解决的问题是有限的。
1.2 激活函数实现去线性化
常用激活函数:
TensorFlow提供了7种不同的非线性激活函数,tf.nn.relu、tf.sigmod和tf.tanh是最常用的三个激活函数。
1.3 多层网络解决异或运算
1958年Frank Rosenblatt提出了感知机(perceptron)模型,从数学上完成了对神经网络的精确建模。1969年,Marvin Minsky和Seymour Papert提出感知机无法模拟异或运算。
当神经网络加入隐藏层之后,异或问题可以得到很好解决。深层神经网络实际上有组合特征提取的功能,这个特性对于解决不易提取特征向量的问题(比如图片识别、语音识别)有很大帮助。
2,损失函数定义
2.1 经典损失函数
交叉熵,softmax回归
均方误差:
Mse = tf.reduce_mean(tf.square(y_ - y))
2.2 自定义损失函数
3,神经网络优化算法
深度学习中主要使用反向传播算法(backpropagation)和梯度下降算法(gradient decent)来调整神经网络中参数的取值。
神经网络的优化过程可以分为两个阶段,第一个阶段先通过前向传播算法计算得到预测值,并将预测值和真实值作对比得出两者之间的差距。然后第二个阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
4,神经网络进一步优化
4.1 学习率的设置
学习率决定了参数每次更新的幅度;过大可能导致无法收敛,过小导致训练次数过多。
TensorFlow提供了一种更加灵活的学习率设置方法—指数衰减法。tf.train.exponential_decay函数实现了指数衰减学习率。
Decayed_learning_rate = learning_rate * decay_rate ^(global_step/decay)
Decayed_learning_rate为每一轮优化时使用的学习率,learning_rate为事先设定的初始学习率,decay_rate为衰减系数,decay_steps为衰减速度。
4.2 过拟合问题
所谓过拟合,指的是当一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据的通用的趋势。过拟合虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。
Tensorflow可以优化任意形式的损失函数,以下为一个简单的带L2正则化的损失函数的定义:
当网络结构复杂之后,损失函数的定义变得复杂,可读性差,容易出错。为了解决这个问题,可以使用TensorFlow中提供的集合(collection),它可以在一个计算图中保存一组实体。
4.3 滑动平均模型
小结:
设计神经网络的两个总体原则–非线性结构和多层结构,这也是解决复杂问题的必要方法。神经网络是一个优化问题,而损失函数就刻画了神经网络需要优化的目标,不同的损失函数对神经网络参数优化结果影响很大。最常用的优化算法是梯度下降算法和反向传播算法。还有随机梯度下降和batch对训练速度的优化。设置学习率和正则化可以解决神经网络优化过程中遇到的部分问题。滑动平均模型可以让最后得到的模型在未知数据上更加健壮。