神经网络基础
一 前馈神经网络
前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。研究从20世纪60年代开始,目前理论研究和实际应用达到了很高的水平。
前馈神经网络结构简单,应用广泛,能够以任意精度逼近任意连续函数及平方可积函数.而且可以精确实现任意有限训练样本集。从系统的观点看,前馈网络是一种静态非线性映射.通过简单非线性处理单元的复合映射,可获得复杂的非线性处理能力。从计算的观点看.缺乏丰富的动力学行为。大部分前馈网络都是学习网络,其分类能力和模式识别能力一般都强于反馈网络。
下图为一个多层神经网络的简单示意图:
每个神经元的表达式如下:
所以可知前向传播的步骤如下,就是一步一步对节点对应的值进行计算:
二 感知机及其实现
1,超平面的定义
令w1,w2,…wn,v都是实数® ,其中至少有一个wi不为零,由所有满足线性方程w1x1+w2x2+…+wnxn=v
的点X=[x1,x2,…xn]组成的集合,称为空间R的超平面。
从定义可以看出:超平面就是点的集合。集合中的某一点X,与向量w=[w1,w2,…wn]的内积,等于v
特殊地,如果令v等于0,对于训练集中某个点X:
wX=w1x1+w2x2+…+wnxn>0,将X标记为一类
wX=w1x1+w2x2+…+wn*xn<0,将X标记为另一类
2,数据集的线性可分
对于数据集T={(X1, y1),(X2, y2)…(XN, yN)},Xi belongs to Rn,yi belongs to {-1, 1},i=1,2,…N
若存在某个超平面S:wX=0
将数据集中的所有样本点正确地分类,则称数据集T线性可分。
所谓正确地分类,就是:如果wXi>0,那么样本点(Xi, yi)中的 yi 等于1
如果wXi<0,那么样本点(Xi, yi)中的 yi 等于-1
因此,给定超平面 wX=0,对于数据集 T中任何一个点(Xi, yi),都有yi(w*Xi)>0,这样T中所有的样本点都被正确地分类了。
如果有某个点(Xi, yi),使得yi(wXi)<0,则称超平面wX对该点分类失败,这个点就是一个误分类的点。
3,感知机模型
f(X)=sign(wX+b),其中sign是符号函数。
感知机模型,对应着一个超平面wX+b=0,这个超平面的参数是(w,b),w是超平面的法向量,b是超平面的截距。
我们的目标是,找到一个(w,b),能够将线性可分的数据集T中的所有的样本点正确地分成两类。
如何找到(w,b)?—感知机学习算法做的事
4, 感知机实现
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)
sess = tf.InteractiveSession()
in_units = 784
#隐含层节点数
h1_units = 300
"""
初始化参数
"""
# 随机生成正太分布
#tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差。
W1 = tf.Variable(tf.truncated_normal([in_units,h1_units],stddev = 0.1))
b1 = tf.Variable(tf.zeros([h1_units]))
W2 = tf.Variable(tf.zeros([h1_units,10]))
b2 = tf.Variable(tf.zeros([10]))
x =tf.placeholder(tf.float32,[None,in_units])
keep_prob = tf.placeholder(tf.float32)
#隐含层计算
hidden1 = tf.nn.relu(tf.add(tf.matmul(x,W1),b1))
#随即将一部分节点设为0
hidden_drop = tf.nn.dropout(hidden1,keep_prob)
#输出层计算
y = tf.nn.softmax(tf.matmul(hidden_drop,W2)+b2)
y_ = tf.placeholder(tf.float32,[None,10])
#计算损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y),reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)
#初始化所有变量
tf.global_variables_initializer().run()
"""
训练集进行训练
"""
for i in range(3000):
batch_xs,batch_ys = mnist.train.next_batch(100)
train_step.run({x:batch_xs,y_:batch_ys,keep_prob:0.75})
# 测试集进行测试
#tf.argmax(input, axis=None, name=None, dimension=None)
#此函数是对矩阵按行或列计算最大值
correct_prediction = tf.equal(tf.arg_max(y,1),tf.arg_max(y_,1))
#cast(x, dtype, name=None) 将x的数据格式转化成dtype.
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print(accuracy.eval({x:mnist.test.images,y_:mnist.test.labels,keep_prob:1.0}))
三 常用激活函数
激活函数(Activation functions)对于人工神经网络模型、机器学习、模式识别等学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到所构造的网络中,换句话说激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。此外,若激活函数具有稀疏性,则可以更好的从有效的数据维度上,学习到相对稀疏的特征,起到特征自动解耦的作用。
四 深度学习中的正则化
1, L2参数正则化
权重衰减(weight decay)的L2参数范数惩罚。这个正则化策略通过向目标函数添加一个正则项Ω(θ)=1/2‖w‖22,使权重更加接近原点。
为了简单起见,我们假定其中没有偏置参数,因此θ就是w。这样一个模型具有以下总的目标函数:
与之对应的梯度为: 使用单步梯度下降更新权重,即执行以下更新:
可以看到,加入权重衰减后会引起学习规则的修改,即在每步执行通常的梯度更新之前先收缩权重向量(将权重向量乘以一个常数因子)。这是单个步骤发生的变化。
L2正则化能让学习算法”感知”到具有较高方差的输入x,因此与输出目标的协方差较小(相对增加方差)的特征的权重将会收缩。
2, L1参数正则化:
对模型参数w的L1正则化被定义为:即各个参数的绝对值之和。
与L2权重衰减类似,我们也可以通过缩放惩罚项Ω的正超参数α来控制L1权重衰减的强度。因此,正则化的目标函数J’(w;X,y)如下所示:J’(w;X,y)=α‖w‖1+J(w;X,y)。 相比L2正则化,L1正则化会产生更稀疏(sparse)的解。此处稀疏性指的是最优值中的一些参数为0。和L2正则化相比,L1正则化的稀疏性具有本质的不同。由L1正则化导出的稀疏性质以及被广泛地用于特征选择(feature selsection)机制。特征选择从可用的特征子集选择出有意义的特征,化简机器学习问题。
五 模型的优化
1, 随机梯度下降算法
随机梯度下降算法和批量梯度下降的不同点在于其梯度是根据随机选取的训练集样本来决定的,其每次对theta的更新,都是针对单个样本数据,并没有遍历完整的参数。当样本数据很大时,可能到迭代完成,也只不过遍历了样本中的一小部分。因此,其速度较快,但是其每次的优化方向不一定是全局最优的,但最终的结果是在全局最优解的附近。
2, MBGD小批量梯度下降
MBGD小批量梯度下降:(1)降低在SGD中高方差的问题,能使得收敛更加稳定;(2)可以利用深度学习中最先进的库进行矩阵优化的操作,加速操作;(3)一般的小批量介于50~256,但是当适用很小的批量时,有时也统称为SGD。
核心思想:在每次迭代时考虑一小部分样本,比如考虑10个样本,同时计算在这10个样本点上的每个参数的偏导数,对于每个优化参数,将该参数在这10个样本点的偏导数求和。
3, momentum
上述SGD和MBGD算法都存在样本选择的随机性,因此含有较多的噪声,而momentum能解决上述噪声问题,尤其在面对小而较多噪声的梯度时,它往往能加速学习速率。
核心思想:Momentum借用了物理中的动量概念,即前几次的梯度也会参与运算。为了表示动量,引入了一个新的变量v(velocity)。v是之前的梯度的累加,但是每回合都有一定的衰减。
4, RMSProp
RMSProp通过引入一个衰减系数,让r每回合都衰减一定比例,类似Momentum中的做法。
具体实现:
需要:全局学习速率 ϵ, 初始参数 θ, 数值稳定量δ,衰减速率ρ
中间变量: 梯度累计量r(初始化为0)
每步迭代过程:
1.从训练集中的随机抽取一批容量为m的样本{x1,…,xm},以及相关的输出yi
2.计算梯度和误差,更新r,再根据r和梯度计算参数更新量
5, Adam
Adam(Adaptive Moment Estimation)是另外一种给每个参数计算不同更新速率的方法,其本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。它和上述的adadelta和RMSprop一样,都存储了以前的偏导平方衰减平均值,此外,它还存储以前的偏导衰减平均值。
参考:
1 https://www.cnblogs.com/jackzone/p/7448698.html
2 https://www.cnblogs.com/hapjin/p/6714526.html
3 https://blog.csdn.net/kangyi411/article/details/78969642
4 https://blog.csdn.net/fengbingchun/article/details/79910284
5 https://blog.csdn.net/qq_21460525/article/details/70146665
6 https://blog.csdn.net/qq_21460525/article/details/70146665