深层神经网络常用方法

深度学习所示深层神经网络的代名词,重要特性:多层、非线性。

若只通过线性变换,任意层的神经网络模型与单层神经网络模型的表达能力没有任何区别,这是线性模型的局限性。对于线性可分的问题中,线性模型可解决,但在现实生活中,绝大部分的问题都是无法线性分割的。
  感知机:单层神经网络。不能处理异或问题。

1、激活函数

将每一个神经元(神经网络的节点)的输出通过一个非线性函数便可使得整个神经网络的模型非线性化,这个非线性函数就是激活函数。
  常用非线性激活函数:tf.nn.relu、tf.sigmoid、tf.tanh;使用方法,例:

tf.nn.relu(tf.matmul(x,w1)+biases1)  

偏置项:可理解为数学中y=ax+b中的b,如果在分类的情况下,两点刚好在经过原点的直线上,如果没有偏置项b的话,无法划分直线将两个点分开。

2、损失函数

概念:用来评价模型的预测值Y^=f(X)与真实值Y的不一致程度,它是一个非负实值函数。通常使用L(Y,f(x))来表示,损失函数越小,模型的性能就越好。

  • 经典损失函数

1.分类问题:将不同的样本分到事先定义好的类别中。常用交叉熵计算;计算方法:

cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
#y_正确结果,y测试结果;y_*tf.log(tf.clip_by_value(y,1e-10,1.0))得到n*m的二维矩阵,
#n为样例的数量,m为分类的类别数量。由于交叉熵一般与softmax回归一起使用,所以tf对其进行统一封装,
cross_entropy=tf.nn.softmax_cross_entropy_with_logits(y,y_)

2.回归问题:对具体数值的预测。常用均方差;计算方法:

mse=tf.reduce_mean(tf.square(y_-y)#y_标准答案,y输出答案
  • 自定义损失函数
      除了分类和回归还有其他问题,所以可以根据具体情况,具体写对应的损失函数。

3、神经网络优化算法

  目的:使损失函数尽可能的小;

    • 反向传播算法(backpropagtion):给出一个高效的方式在所有参数上使用梯度下降算法;是训练神经网络的核心算法,可以根据定义好的损失函数优化神经网络中参数的取值;
    • 梯度下降算法(gradient decent):优化单个参数的取值
        当要求损失函数的值为最小值时,可以根据其偏导来判断其下降方向,梯度便是偏导值;当损失函数未到最小值时,(损失函数-梯度)可变的更小,使用反向传播算法,可一直将损失函数减去其梯度,知道获得最小的损失函数;其中由于梯度可能过大,导致错过最小值,所以可在梯度的值乘以学习率。即:下一个损失函数=损失函数-梯度*学习率(其中梯度便是损失函数的偏导)

      注意:梯度下降算法并不可保证优化的函数能得到全局最优解,只有损失函数为凸函数时才可保证;样例如下图 
    • 随机梯度下降算法(stochastic gradient decent):梯度下降算法中,由于计算的是全部训练数据上最小化最优,所以损失函数是在所有训练数据上的损失和,这样每轮迭代导致时间过长;由此问题引出随机梯度下降算法,随机优化某一条训练数据上的损失函数。该方法虽然达到时间缩短,但是会导致函数无法得到全局最优。下面给出一个损失函数为y=x^2的例子:
    • TRAINING_STEPS=5
      x=tf.Variable(tf.constant(5,dtype=tf.float32),name=‘x‘)
      y=tf.square(x)
      train_op=tf.train.GradientDescentOptimizer(0.3).minimize(y)#实现梯度下降算法的优化器
      with tf.Session() as sess:
          sess.run(tf.global_variables_initializer())
          for i in range(TRAINING_STEPS):
              sess.run(train_op)
              x_value=sess.run(x)
              print(i+1, x_value)
    • 实际采用方法:梯度与随机梯度的折中--每次计算一小部分训练数据的损失函数(batch),该方法可大大减少收敛所需的迭代次数,缩短时间,同时可使收敛到的结果最优。神经网络的训练大都遵循以下过程:
    • batch_size=n
      #读取一小部分数据作为当前训练集
      x=tf.placeholder(tf.float32,shape=[None,2],name=‘x-input‘)
      x=tf.placeholder(tf.float32,shape=[None,1],name=‘y-input‘)
      #定义神经网络结构和优化算法
      loss=...
      train_step=tf.train.AdamOptimizer(0.001).minimize(loss)
      
      with tf.Session() as sess:
          #参数初始化
          ...
          #迭代更新参数
          for i in range(STEPS):
              #将所有随机数据重新打乱之后再选取将会获得更好的优化效果
              X=..
              Y=...
              sess.run(train_step,feed_dict={x:X,y:Y})   

4、神经网络的进一步优化

    • 学习率的设置
        在梯度下降算法中,如果学习率取值过大,可能会出现数值两边震荡的情况,永远都到达不了极值,而若学习率取值过小,则会大大降低优化的速度,TensorFlow提供了学习率设置的方法--指数衰减法,更改上面的梯度例子如下:
    • TRAINING_STEPS=100
      global_step=tf.Variable(1)#初始化为0
      #def exponential_decay(learning_rate, global_step, decay_steps, decay_rate,
      #                      staircase=False, name=None):分别为:初始学习率,经过decay_steps轮计算,学习率乘以decay_rate,staircase为T,学习率阶梯状衰减,否则,连续衰减
      LEA_RATE=tf.train.exponential_decay(0.1,global_step,1,0.96,staircase=False)#获得学习率,指数衰减法,开始较大的衰减率,后来指数变小
      x=tf.Variable(tf.constant(5,dtype=tf.float32),name=‘x‘)
      y=tf.square(x)
      train_op=tf.train.GradientDescentOptimizer(LEA_RATE).minimize(y,global_step=global_step)#实现梯度下降算法的优化器,global_step会自动加1,可当计数器用
      with tf.Session() as sess:
          sess.run(tf.global_variables_initializer())
          for i in range(TRAINING_STEPS):
              sess.run(train_op)
      
              LEA_RATE_value=sess.run(LEA_RATE)
              x_value=sess.run(x)
              print(i+1, i+1, x_value, LEA_RATE_value,sess.run(global_step))
    • 过拟合问题
        概念:当一个模型过为复杂之后,它会很好的‘记忆’每一个训练数据中随机随机噪音的部分而忘记了要去‘学习’训练数据中通用的趋势。意思就是过拟合数据中的随机噪音虽然可得到极小的损失函数,但是对位置数据可能无法做出可靠的判读。   解决方法:正则化--在损失函数中添加刻画模型复杂程度的指标。使用方法:
    • #lambda正则化项的权重,w需要计算正则化损失的参数
      loss=之前的损失函数+tf.contrib.layers.l2_regularizer(lambda)(w)
      
      print(sess.run(tf.contrib.layers.l1_regularizer(0.5)(w)))#w中每个元素的绝对值之和乘0.5,所以值为5
      print(sess.run(tf.contrib.layers.l2_regularizer(0.5)(w)))#w中每个元素的平方和除以2再乘0.5,结果为7.5
      print(sess.run(tf.contrib.layers.l1_l2_regularizer(0.5)(w)))#w中的每个元素之和乘0.5+w中每个元素的平方和乘(1-0.5)

      当神经网络的参数增多时,损失函数也将会增多,若将其写在一个定义中,可读性会很差,容易出错,所以在TensorFlow中可以用一下方法:

    • #losses是集合的名字1,mse_loss是加入集合的内容
      tf.add_to_collection(‘losses‘, mse_loss)
      #get_collection返回的是losses集合,add_n是将集合的中值求和
      loss = tf.add_n(tf.get_collection(‘losses‘))

5、滑动平均模型

作用:在使用随机梯度下降算法训练神经网络时,可只用该方法在一定程度上进行优化。使用方法如下:

v1=tf.Variable(0,dtype=tf.float32)
step=tf.Variable(0,trainable=False)
#定义一个滑动平均模型的类,初始化衰减率为0.99,控制衰减率的变量step
ema=tf.train.ExponentialMovingAverage(0.99,step)
#定义一个更新变量滑动平均的操作,并给定一个列表,每次执行这个操作时,列表更新
maintain_ave_op=ema.apply([v1])

with tf.Session() as sess:
    init_op=tf.global_variables_initializer()
    sess.run(init_op)
    #上面的V1*衰减率+(1-衰减率)*更新变量v1,其中衰减率=min{初始化衰减率,(1+step)/(10+step)}
    print(sess.run([v1,ema.average(v1)]))#结果:[0,0] 

    sess.run(tf.assign(v1,5))
    sess.run(maintain_ave_op)
    print(sess.run([v1,ema.average(v1)]))#0*min{0.99,((1+step)/(step+10))}+(1-min{0.99,((1+step)/(step+10))})*5

    sess.run(tf.assign(step,10000))
    sess.run(tf.assign(v1,10))
    sess.run(maintain_ave_op)
    print(sess.run([v1,ema.average(v1)]))

    sess.run(maintain_ave_op)
    print(sess.run([v1,ema.average(v1)]))

6、常用方法

  • tf.reduce_sum() #和
  • tf.greater(v1,v2)#v1和v2的每个对应元素比较,若v1大于v2,则为True否则为False
  • tf.where(tf.greater(v1,v2),v1,v2)#根据第一个参数的T和F来选择v1和v2,若为False则元素选V2中的值,整个函数相当于选取v1和v2中较大的数组成一个举证
时间: 2024-10-08 16:47:11

深层神经网络常用方法的相关文章

【tensorflow:Google】四、深层神经网络

一.深度学习与深层神经网络 1.线性模型局限性 线性模型无论多少层,表达能力是一致的.可以通过激活函数实现非线性. 2.多层网络可以解决异或运算 二.损失函数定义 1.经典损失函数: 分类问题: 二分类:取0.5作为阈值 多分类:设置n个输出节点,每个对应该类的可能性.神经网络输出向量 ->概率分布:softmax. 两个向量的距离:交叉熵 - sigma  p_x log(q_x),其中p代表y,q代表yHat softmax: 最后加一层 y' = normed(e^y) reduce_me

第四周—深层神经网络

一.深层神经网络 神经网络符号: 输入数据层:layer0,不包括在层数中 n[l]:第l层包含的神经元数目 二.前向和反向传播 z[l] = w[l] * a[l-1] + b[l] a[l] = g[l](z[l]) 向量化: Z[l] = W[l] * A[l-1] + b[l] A[l] = g[l](Z[l]) 第l层反向传播: 输入:da[l] 输出:da[l-1]   dw[l]   db[l] dz[l] = da[l] * g[l]'(z[l]) dw[l] = dz[l] *

第四周:Deep Neural Networks(深层神经网络)----------2.Programming Assignments: Building your Deep Neural Network: Step by Step

Building your Deep Neural Network: Step by Step Welcome to your third programming exercise of the deep learning specialization. You will implement all the building blocks of a neural network and use these building blocks in the next assignment to bui

吴恩达《深度学习》第一门课(4)深层神经网络

4.1深层神经网络 (1)到底是深层还是浅层是一个相对的概念,不必太纠结,以下是一个四层的深度神经网络: (2)一些符号定义: a[0]=x(输入层也叫做第0层) L=4:表示网络的层数 g:表示激活函数 第l层输出用a[l],最终的输出用a[L]表示 n[1]=5:表示第一层有五个神经元,第l层神经元个数用n[l]表示 4.2前向传播和反向传播 (1)前向传播:输入a[l-1],输出是a[l],缓存为z[l],步骤如下:(下面第一个式子应该是a[l-1]) 向量化: (2)反向传播:输入da[

深层神经网络框架的python实现

概述 本文demo非常适合入门AI与深度学习的同学,从最基础的知识讲起,只要有一点点的高等数学.统计学.矩阵的相关知识,相信大家完全可以看明白.程序的编写不借助任何第三方的深度学习库,从最底层写起. 第一,本文介绍了什么是神经网络,神经网络的特点,神经网络中的BP算法,神经网络的训练方法,神经网络的激活函数,损失函数.权值初始化方法.权值的正则化机制等一系列知识. 第二,在此基础上,使用最基础的python语法来实现一个神经网络框架,利用此神经网络框架,可以搭建自己的深度神经网络,同时大家也可以

吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 4 - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络)

Week 4 Quiz - Key concepts on Deep Neural Networks(第四周 测验 – 深层神经网络) \1. What is the "cache" used for in our implementation of forward propagation and backward propagation?(在实现前向传播和反向传播中使用的"cache"是什么?) [ ]It is used to cache the interme

第九节,改善深层神经网络:超参数调试、正则化以优化(下)

一 批标准化 (batch normalization)        部分内容来自: Batch Normalization 批标准化 深度学习Deep Learning(05):Batch Normalization(BN)批标准化 参考论文:http://jmlr.org/proceedings/papers/v37/ioffe15.pdf 2015年Google提出的Batch Normalization 训练深层的神经网络很复杂,因为训练时每一层输入的分布在变化,导致训练过程中的饱和,

改善深层神经网络:超参数调试、正则化及优化

第一周   深度学习的实用层面 1.1 训练.验证.测试集 应用机器学习是个高度迭代的过程:想法--->编码--->实验 (1)神经网络的层数 (2)隐含层神经元个数 (3)学习率 (4)激励函数 小规模数据:训练集70%,验证集30%   或者 训练60% 验证20% 测试20% 大规模数据:训练90%以上 注:可以没有测试集,验证集用于检测各种算法模型,选出最好的,验证集和测试集必须来源于同一分布 1.2 偏差.方差 人眼识别错误率(最优误差,贝叶斯误差)0%左右,训练集验证集来源于同一分

deeplearning.ai 改善深层神经网络 week3 听课笔记

这一周的主体是调参. 1. 超参数:No. 1最重要,No. 2其次,No. 3其次次. No. 1学习率α:最重要的参数.在log取值空间随机采样.例如取值范围是[0.001, 1],r = -4*np.random.rand(), α = 10r. No. 2 Momentum β:0.9是个不错的选择.在1-β的log取值空间随机采样.例如取值范围[0.9, 0.999],则1-β的取值空间[0.001, 0.1]. No. 2 各个隐含层的神经元数量:可以在线性取值空间随机采样. No.