TensorFlow入门学习记录第四天

TensorFlow中常用的激活函数和损失函数

1. 激活函数
在TensorFlow中,激活函数是指如何把激活的神经元特征通过函数保存特征并映射出来(保留特征,去除冗余数据),这是解决非线性问题的关键。实际上激活函数的作用就是给神经网络添加非线性的因素,让它能更好的解决比较复杂的问题。

一个概念:饱和
当一个激活函数g(x)满足

在这里插入图片描述

时,称为右饱和
当满足
在这里插入图片描述

时,称为左饱和

当g(x)同时满足左右饱和的条件时称为饱和。

硬饱和与软饱和
对于任意的x,若存在常数c,在x>c时恒有g’(x) = 0, 则称之为右硬饱和;当x<c时恒有 g’(x) = 0,则称之为左硬饱和。当激活函数同时满足左右硬饱和时,称这种激活函数为硬饱和。当极限状态下偏导数等于0的函数才成为软饱和。

1.1常用的激活函数

①Sigmoid函数

Sigmoid函数也称为S曲线函数,它是使用范围最广的激活函数之一,同时也是神经网络中最常用的激活函数之一。Sigmoid函数由以下公式定义:
在这里插入图片描述

Sigmoid函数具有单调递增和反函数递增等性质,所以常用作阈值函数,函数范围在0~1之间。Sigmoid函数常用于求导,二分等类型的问题。另外因为Sigmoid函数的输出均为大于0,这让输出不是0均值,这称为偏移,将会导致后层的神经元得到上层输出的非0均值作为输入。

优点: 可用于输出层,输出范围有限,单调连续,优化稳定,容易求导,输出映射在0~1之间。
缺点: 容易产生梯度消失,输出不是以0位中心。

#直接调用这个方法使用sigmoid函数
tf.sigmoid()

②Tanh函数

Tanh函数是Sigmoid函数的一种变形,它由以下公式定义:

在这里插入图片描述
推导:
在这里插入图片描述
Tanh函数类似于Sigmoid函数,但它的中心位置是0,范围从-1~1,而且Tanh函数只有在特征相差明显时的效果会比较好,但是在特征相差不大或者相差比较复杂时效果就不会那么明显了。

优点:
Tanh函数输出均值是0,比Sigmoid函数收敛的更快,迭代次数更少。
缺点:
与Sigmoid函数相似,由于饱和性会产生梯度消失。

#直接调用这个方法使用tanh函数
tf.tanh()

③ReLU函数

ReLU函数的收敛速度相对于Sigmoid函数来说会更快,它只需要一个阈值就可以得到激活的值,不需要通过复杂的计算。ReLU函数的取值是max(0,x),即定义公式是:

在这里插入图片描述

实际上ReLU函数是不断的在试探用一个大多数为0的矩阵去表达数据的特征,由于稀疏特性,让它的运算更快,效果更好。ReLU函数类似于线性激活函数,但有一个很大的不同就是对于负的输入值不会激活,输出为0,对于正的输入值输出与输入值相同。
当x<0时,ReLU处于硬饱和状态,当x>0时不存在饱和状态,所以ReLU在x>0时可以保持梯度不衰减,缓解梯度消失的状况。但是随着训练的推进,有些输入会进入硬饱和区,导致对应的权重不能更新,最后导致神经元死亡的现象。针对这种情况一般对ReLU函数做一个相应的改进,改进后的表达式为:

在这里插入图片描述

a是一个很小的常数,它的存在即修正了数据,同时也保留了部分负的值,让这些负值信息不会全部丢失,改进后的函数也称为Leaky-ReLU函数。

优点:
相比于Sigmoid函数和Tanh函数,ReLU收敛更快,也更简单实现,同时可以有效的缓解梯度消失的问题。

缺点:
随着训练的推进有可能出现神经元死亡,权重无法更新的情况,由于存在偏移和神经元死亡现象会对收敛性有一定的影响。

#直接调用这个方法使用ReLU函数
tf.nn.relu()

④Softplus函数

Softplus函数可以看作是一种平滑的ReLU函数,它是Sigmoid函数的原函数,就是说对Softplus函数求导就可以得到Sigmoid函数。显然Softplus函数的表达式为:

在这里插入图片描述

相对于Sigmoid函数来说,Softplus函数在对指数运算时,计算量比较少;进行反向传播求误差梯度时,当求导涉及除法时的计算量更少,而且Softplus函数不容易出现梯度消失的情况。

⑤Softmax函数

Softmax常用于神经网络的最后一层,并作为输出层进行多分类运算。Softmax函数的表达式为:

Softmax函数是一个归一化的指数函数,它的输出取决于输入值,同时也取决于该层中存在的其他神经元的所有输入的总和,这样使得神经元的输出较小,梯度不会过大。

相对于Sigmoid函数,Softmax函数主要解决多分类的问题;Softmax函数基于多项式分布,Sigmoid函数则是基于伯努利分布;

#直接调用这个方法使用Softmax函数
tf.nn.softmax()

2.损失函数

损失函数是用来估算预测值和实际值的不同程度的函数,它是一个非负函数。

一个概念:拟合

拟合是指学习函数和目标函数逼近的吻合程度;
过拟合: 指模型对训练数据拟合过度,将训练数据的细节和噪声都学习进去,导致对新数据的表现变差。

欠拟合: 指模型没有很好的学习到数据特征,不能很好的拟合数据。

总的来说:
模型在训练数据上的误差比较大为欠拟合;
模型在训练数据和测试数据上的误差较小,为适中拟合;
模型在训练数据上的误差较小,在测试数据上的误差较大为过拟合。

常用的损失函数

①0-1损失函数
分类问题中,将分类模型f(x)作为样本x类别的预测值。
假设在二分类问题中, 正类Y=+1,负类Y=-1,对于一个二分类模型f(x)
定义0-1损失函数为:
在这里插入图片描述
等价于:
在这里插入图片描述
因为0-1损失函数只取决于正负,是一个非凸函数,在求解过程中存在很多不足,所以通常使用它的替代函数,如Log损失函数。

②Log损失函数

Log损失函数是0-1损失函数的一个替代函数,也称为交叉熵损失函数,它的表达式为:

在这里插入图片描述
在TensorFlow中,根据分类函数Softmax和Sigmoid将交叉熵分为了Softmax交叉熵和Sigmoid交叉熵。

封装函数:

1. tf.nn.sigmoid_cross_entropy_with_logits(logist,targets)函数
logist:神经网络模型中的W×X矩阵
不需要通过Sigmoid,会在函数中对其进行Sigmoid激活,target上的shape和logist相同,就是正确的label值

2. tf.nn.softmax_cross_entropy_with_logits(logist,targets)
同样是不需要通过Softmax,会在函数中对其进行Softmax激活,但是此函数的每个样本只能属于一个类别,即要求分类结果互斥,所以这个函数只适用于单目标的二分类或多分类问题。

3. tf.nn.sparse_softmax_cross_entropy_with_logits()
这是tf.nn.softmax_cross_entropy_with_logits(logist,targets)的易用版本,主要的区别在于参数不同。tf.nn.sparse_softmax_cross_entropy_with_logits()的第一个输入和之前一样,shape是[batch_size,num_classes],第二个参数以前也是这样,这里改为了[batch_size],但值必须是从0开始编码的int32或int64,范围是[0,num_class),注意步长不能大于1,否者或导致某些label值超出范围然后代码会报错退出。

③Hinge损失函数

Hinge损失函数也是0-1损失函数的一种替代函数,表达式为:
在这里插入图片描述
SVM就是运用Hinge损失函数的一个经典的分类器算法;
当f(x)与y同符号时,hinge loss 为0;当它们符号相反时,L(y,f(x))会根据f(x)线性增加。
④指数损失函数
指数损失函数也是0-1损失函数的一种替代函数,主要运用于AdaBoost算法,具体形式为:
在这里插入图片描述
⑤感知机损失函数
感知机损失函数也是0-1损失函数的一种替代函数,表达形式为:
在这里插入图片描述
运用感知机损失函数的一个经典分类器是感知机算法,感知机算法只要对每个样本判断它是否分类正确,记录分类错误的样本。
感知机损失函数与Hinge损失函数的不同在于Hinge损失对判定边界附近的点的惩罚力度高,而感知机损失函数只要判断样本的类别是否正确,不考虑到边界的距离。

以上几种函数都是0-1损失函数的一种替代函数,主要是这几种替代函数更加平滑,可以提高计算的性能。

⑥平方(均方)损失函数
具体形式为:
在这里插入图片描述
平方损失函数多用于回归任务,它是一种假设样本和噪声都服从高斯分布和连续的函数,计算方便简单,在不同的表示域变换后特征性质不变。
在TensorFlow中计算平方损失一般用tf.pow(x,y)计算,它会返回一个x^y的值。

loos = tf.reduce_mean(tf.pow(x-x_,2))

⑦绝对值损失函数
具体形式为:
在这里插入图片描述
绝对值损失函数与平方损失函数相似,但是相比于平方损失函数来说,平方损失函数会更加平滑,计算更方便简单,所以实际中会更多的运用平方损失函数。

⑧ 自定义损失函数

TensorFlow中可以通过一些计算函数自定义损失函数。
比如预测物品销量,现在假设物品成本为1元,售价10元,如果预测少一个,则利润少了9元,预测多一个则损失1元,现在要利润最大化,这里的损失函数就不能用均方误差。
通过自定义损失函数:
在这里插入图片描述
TensorFlow中可以定义:

loss = tf.reduce_sum(tf.select(tf.greater(v1,v2),a*(v1-v2),b*(v2-v1)))
#tf.greater()比较两个张量的每个元素的大小,返回比较结果
#tf.select()根据第一个输入是否为true来选择第二个参数还是第三个参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值