#|Tensorflow 笔记(神经网络优化(1))

转载于人工智能实践:Tensorflow笔记

  • 神经元模型:用数学公式表示为:?(∑????? + ?),f 为激活函数。神经网络是以神经元为基本单元构成的。
  • 激活函数:引入非线性激活因素,提高模型的表达力。
    常用的激活函数有 relu、sigmoid、tanh 等。
  • ① 激活函数 relu: 在 Tensorflow 中,用 tf.nn.relu()表示
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

  • ② 激活函数 sigmoid:在 Tensorflow 中,用 tf.nn.sigmoid()表示
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

  • ③ 激活函数 tanh:在 Tensorflow 中,用 tf.nn.tanh()表示
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

  • 神经网络的复杂度:可用神经网络的层数和神经网络中待优化参数个数表示
  • 神经网路的层数:一般不计入输入层,层数 = n 个隐藏层 + 1 个输出层
  • 神经网路待优化的参数:神经网络中所有参数 w 的个数 + 所有参数 b 的个数
例如:
#|Tensorflow 笔记(神经网络优化(1))
文章图片

  • 在该神经网络中,包含 1 个输入层、1 个隐藏层和 1 个输出层,该神经网络的层数为 2 层。
  • 【#|Tensorflow 笔记(神经网络优化(1))】在该神经网络中,参数的个数是所有参数 w 的个数加上所有参数 b 的总数,第一层参数用三行四列的二阶张量表示(即 12 个线上的权重 w)再加上 4 个偏置 b;第二层参数是四行两列的二阶张量()即 8 个线上的权重 w)再加上 2 个偏置 b。总参数 = 34+4 + 42+2 = 26。
  • 损失函数(loss):用来表示预测值(y)与已知答案(y_)的差距。在训练神经网络时,通过不断改变神经网络中所有参数,使损失函数不断减小,从而训练出更高准确率的神经网络模型。
  • 常用的损失函数有均方误差、自定义和交叉熵等。
    均方误差 mse:n 个样本的预测值 y 与已知答案 y_之差的平方和,再求平均值。
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

    在 Tensorflow 中用 loss_mse = tf.reduce_mean(tf.square(y_ - y))
    自定义损失函数:根据问题的实际情况,定制合理的损失函数。
    自定义损失函数为:loss = ∑??(y_, y)
    其中,损失定义成分段函数:
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

    用 Tensorflow 函数表示为:
    loss = tf.reduce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))

    交叉熵(Cross Entropy):表示两个概率分布之间的距离。交叉熵越大,两个概率分布距离越远,两个概率分布越相异;交叉熵越小,两个概率分布距离越近,两个概率分布越相似。
    交叉熵计算公式:?(?_ , ?) = ?∑?_ ? ??? ?
    用 Tensorflow 函数表示为 ce= -tf.reduce_mean(y_* tf.log(tf.clip_by_value(y, 1e-12, 1.0)))
  • softmax 函数:将 n 分类的 n 个输出(y1,y2…yn)变为满足以下概率分布要求的函数。
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片
    - softmax 函数应用:在 n 分类中,模型会有 n 个输出,即 y1,y2…yn,其中 yi 表示第 i 种情况出现的可能性大小。将 n 个输出经过 softmax
    函数,可得到符合概率分布的分类结果。
  • 在 Tensorflow 中,一般让模型的输出经过 sofemax 函数,以获得输出分类的概率分布,再与标准
    答案对比,求出交叉熵,得到损失函数,用如下函数实现:
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1)) cem = tf.reduce_mean(ce)

  • 学习率
    学习率 learning_rate:表示了每次参数更新的幅度大小。学习率过大,会导致待优化的参数在最小值附近波动,不收敛;学习率过小,会导致待优化的参数收敛缓慢。
    在训练过程中,参数的更新向着损失函数梯度下降的方向。参数的更新公式为:W?+? = W? ? ????????_?????
    学习率过大,会导致待优化的参数在最小值附近波动,不收敛;学习率过小,会导致待优化的参数收敛缓慢。
    学习率计算公式如下:
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

    用 Tensorflow的函数表示 函数表示 为:
global_step = tf.Variable(0, trainable=False) learning_rate = tf.train.exponential_decay( LEARNING_RATE_BASE, global_step, LEARNING_RATE_STEP, LEARNING_RATE_DECAY, staircase=True/False)

  • 其中,LEARNING_RATE_BASE 为学习率初始值,LEARNING_RATE_DECAY 为学习率衰减率,global_step 记录了当前训练轮数,为不可训练型参数。学习率 learning_rate 更新频率为输入数据集总样本数除以每次喂入样本数。若 staircase 设置为 True 时,表示 global_step/learning rate step 取整数,学习率阶梯型衰减;若 staircase 设置为 false 时,学习率会是一条平滑下降的曲线。
  • 滑动平均:记录了一段时间内模型中所有参数 w 和 b 各自的平均值。利用滑动平均值可以增强模
    型的泛化能力。
  • 滑动平均值(影子)计算公式:
    影子 = 衰减率 * 影子 +(1 - 衰减率)* 参数
    #|Tensorflow 笔记(神经网络优化(1))
    文章图片

    用 Tesnsorflow 函数表示为:
    ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
    其中,MOVING_AVERAGE_DECAY 表示滑动平均衰减率,一般会赋接近 1 的值,global_step 表示当前训练了多少轮。
    ema_op = ema.apply(tf.trainable_variables())
    其中,**ema.apply()函数实现对括号内参数求滑动平均,tf.trainable_variables()**函数实现把所有待训练参数汇总为列表。
with tf.control_dependencies([train_step, ema_op]): train_op = tf.no_op(name='train')

? 其中,该函数实现将滑动平均和训练过程同步运行。 查看模型中参数的平均值,可以用 **ema.average()**函数。

    推荐阅读