北大慕课Tensorflow实践过程笔记2——神经网络优化

神经网络优化

  • 复杂度
  • 学习率
  • 激活函数
    • 如何寻找一个优秀的激活函数
    • 激活函数输出值的范围/特点:
    • 常用的激活函数
    • 对初学者的建议
  • 损失函数
    • 均方误差损失函数
    • 自定义损失函数
    • 交叉熵损失函数
  • 缓解过拟合
    • 欠拟合与过拟合
    • 欠拟合的解决方法:
    • 过拟合的解决方法
  • 神经网络参数优化器

复杂度

北大慕课Tensorflow实践过程笔记2——神经网络优化_第1张图片

学习率

北大慕课Tensorflow实践过程笔记2——神经网络优化_第2张图片

激活函数

对于线性函数,即使有多层神经元首尾相接,依旧是线性组合,模型的表达力不够。y=f(x*w+b)
f为激活函数,正是由于非线性激活函数的加入,使得多层神经网络不再是输入X的线性组合,使得神经网络可以随层数的增加提升表达能力了。

如何寻找一个优秀的激活函数

  • 非线性: 激活函数非线性时,多层神经网络可逼近所有函数。只有激活函数是非线性时才不会被单层网络替代,使多层网络有了意义。
  • 可微性: 优化器大多用梯度下降更新参数。激活函数不可微无法更新参数。
  • 单调性: 当激活函数是单调的,能保证单层网络的损失函数是凸函数
  • 近似恒等性:当参数初始化为随机小值时,神经网络更稳定。f(x)=x,激活函数的输出值近似等于输入值

激活函数输出值的范围/特点:

  • 激活函数输出为有限值时,权重对特征的影响会更显著,基于梯度的优化方法去更新参数会更稳定。
  • 激活函数输出为无限值时,参数的初始值对模型的影响非常大,建议调小学习率。

常用的激活函数

北大慕课Tensorflow实践过程笔记2——神经网络优化_第3张图片
把输入值变换到0和1之间输出,如果输入值是非常大的负数,输出值就是0;如果输入值是非常大的正数,输出就是1;相当于对输入进行了归一化。
近年来使用sigmoid函数做神经网络的激活函数的已经很少了,因为深层神经网络更新参数时,需要从输出层到输入层逐层进行链式求导,而sigmoid函数的导数输出是0到0.25之间的小数,链式求导需要多层导数连续相乘,会出现多个0-0.25之间的连续相乘,结果将趋近于0,产生梯度消失,使得参数无法继续更新。我们希望输入每层神经网络的特征是以0为均值的小数值,但是过sigmoid激活函数后的数据都是正数,会使收敛变慢。另外,sigmoid函数存在幂运算计算复杂度大,训练时间长。

北大慕课Tensorflow实践过程笔记2——神经网络优化_第4张图片
从函数图像看,这个激活函数的输出值为零均值了,但是依旧存在梯度消失和幂运算问题。
北大慕课Tensorflow实践过程笔记2——神经网络优化_第5张图片
relu函数的输出不是以0为均值的,会使收敛变慢,同时会存在dead relu 问题,也就是送入激活函数的输入特征是负数时,激活函数的输出是0,反向传播得到的梯度是0,导致参数无法更新,造成神经元死亡。
其实造成神经元死亡的根本原因是经过relu函数的负数特征过多导致。我们可以改进随机初始化,避免过多的负数特征送入relu函数,可以通过设置更小的学习率,减少参数分布的巨大变化,避免训练中产生过多的负数特征进入relu函数。
北大慕课Tensorflow实践过程笔记2——神经网络优化_第6张图片
函数是为了解决relu负区间为0,引起神经元死亡问题而设计的。leaky relu负区间引入了一个固定的斜率a,使得leaky relu负区间不再恒等于0。虽然该函数比relu效果好,但是在实际使用中,选择relu做激活函数的网络。会更多

对初学者的建议

  • 首选ReLU激活函数;
  • 学习率设置较小值;
  • 输入特征标准化,即让输入特征满足以0为均值,1为标准差的正态分布;
  • 初始化问题:初始参数中心化,即让随机生成的参数满足以0为均值, 当 前 层 输 入 特 征 个 数 为标准差的正态分布。
  • 如图:在这里插入图片描述

损失函数

损失函数是前向传播计算出的结果y与已知标准答案y_的差距。
神经网络的优化目标就是找到某套参数,使得计算出来的结果y,和已知标准答案y_无限接近,也就是他们的差距loss值最小。主流loss有以下三种计算方法:

均方误差损失函数

北大慕课Tensorflow实践过程笔记2——神经网络优化_第7张图片
用均方误差作为损失函数,魔人认为销量预测的多了或者少了,损失是一样的。
然而真实情况是,预测多了,损失的是成本;预测少了,损失的是利润。利润和成本往往不相等。在这种情况下,使用均方误差作为loss是没办法让利益最大化的。
这时,我们可以使用自定义损失函数。

自定义损失函数

北大慕课Tensorflow实践过程笔记2——神经网络优化_第8张图片

交叉熵损失函数

北大慕课Tensorflow实践过程笔记2——神经网络优化_第9张图片
交叉熵表示两个概率分布之间的距离,交叉熵越大,两个概率分布越远;交叉熵越小,两个概率分布越近。
北大慕课Tensorflow实践过程笔记2——神经网络优化_第10张图片
先用softmax函数让输出结果符合概率分布,再求交叉熵损失函数。

缓解过拟合

欠拟合与过拟合

欠拟合是模型不能有效拟合数据集,是对现有数据集学习得不够彻底,过拟合是模型对当前数据拟合得太好了,但对于从未见过的新数据却难以做出正确判断,模型缺乏泛化力。
北大慕课Tensorflow实践过程笔记2——神经网络优化_第11张图片

欠拟合的解决方法:

1. 增加输入特征项,给网络更多维度的输入特征。
2. 增加网络参数,可以扩展网络规模,增加网络深度,提升模型表达能力
3. 减少正则化参数

过拟合的解决方法

1. 数据清洗,减少数据集中的噪声,使数据集更纯净。
2. 增大训练集,让模型见到更多的数据。
3. 采用正则化,是一种通用的,有效的方法。
4. 增大正则化参数
北大慕课Tensorflow实践过程笔记2——神经网络优化_第12张图片

神经网络参数优化器

北大慕课Tensorflow实践过程笔记2——神经网络优化_第13张图片
优化器就是引导神经网络更新参数的工具。

你可能感兴趣的:(tensorflow,神经网络)