Tensorflow2.0 激活函数(Relu Sigmoid Tanh)及其梯度

什么是激活函数

激活函数(Activation functions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了,加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。

Sigmoid激活函数

在这里插入图片描述
sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:
优点:平滑、易于求导。
缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
求导过程如下:

σ就是上面的sigmoid函数,在前向传播的过程中,sigmoid函数是已知的,所以sigmoid对参数w的倒数也是很容易就能求出来。

在tensorflow2.0中的使用

import tensorflow as tf
a = tf.linspace(-10., 10., 10)
with tf.GradientTape() as tape:
	tape.watch(a)
	y = tf.sigmoid(a)
grads = tape.gradient(y, [a])
print('x:', a.numpy())
print('y:', y.numpy())
print('grad:', grads[0].numpy()

在这里插入图片描述

Tanh函数(双曲正切函数)

在这里插入图片描述
Tanh是可以通过sigmoid平移等操作变化而来。但它的收敛速度要比sigmoid收敛的要快。其他的优缺点和sigmoid函数类似。
求导过程如下:
在这里插入图片描述

在Tensorflow2.0中的使用

import tensorflow as tf
a = tf.linspace(-10., 10., 10)
with tf.GradientTape() as tape:
	tape.watch(a)
	y = tf.tanh(a)
grads = tape.gradient(y, [a])
print('x:', a.numpy())
print('y:', y.numpy())
print('grad:', grads[0].numpy())

在这里插入图片描述

ReLU激活函数

相比于传统的神经网络激活函数,诸如逻辑函数(Logistic sigmoid)和tanh等双曲函数,tanh函数有着以下几方面的优势:
1.仿生物学原理:相关大脑方面的研究表明生物神经元的信息编码通常是比较分散及稀疏的。通常情况下,大脑中在同一时间大概只有1%-4%的神经元处于活跃状态。使用线性修正以及正则化(regularization)可以对机器神经网络中神经元的活跃度(即输出为正值)进行调试;相比之下,逻辑函数在输入为0时达到,即已经是半饱和的稳定状态,不够符合实际生物学对模拟神经网络的期望。不过需要指出的是,一般情况下,在一个使用修正线性单元(即线性整流)的神经网络中大概有50%的神经元处于激活态。
2.更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题
3.简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响;同时活跃度的分散性使得神经网络整体计算成本下降

在这里插入图片描述
求导过程:
在这里插入图片描述

在Tensorflow2.0中的使用

import tensorflow as tf
a = tf.linspace(-10., 10., 10)
with tf.GradientTape() as tape:
	tape.watch(a)
	y = tf.nn.relu(a)
grads = tape.gradient(y, [a])
print('x:', a.numpy())
print('y:', y.numpy())
print('grad:', grads[0].numpy())

在这里插入图片描述

Leaky ReLU

在输入值为负的时候,带泄露线性整流函数(Leaky ReLU)的梯度为一个常数,而不是0。在输入值为正的时候,带泄露线性整流函数和普通斜坡函数保持一致。换言之,
在这里插入图片描述在这里插入图片描述

在Tensorflow2.0中的使用

import tensorflow as tf
a = tf.linspace(-10., 10., 10)
with tf.GradientTape() as tape:
	tape.watch(a)
	y = tf.nn.leaky_relu(a)
grads = tape.gradient(y, [a])
print('x:', a.numpy())
print('y:', y.numpy())
print('grad:', grads[0].numpy())

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰溪0502

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值