欢迎大家来到IT世界,在知识的湖畔探索吧!
深度学习框架(1)- 各显神通提升Tensor效率,让Tensor流动还靠深度学习框架
深度学习框架(2)- 了解TensorFlow,安装TensorFlow
深度学习框架(3)- TensorFlow中张量创建和转化,妙用“稀疏性”提升效率
我们在 深度学习框架(3)-TensorFlow中张量创建和转化,妙用“稀疏性”提升效率 中讨论了如何创建张量并实现张量类型转化。今天我们一起在TensorFlow中执行张量的计算,并重点讨论一下不同的激活函数。
1、了解不同的激活函数,根据应用选择不同的激活函数
机器学习中的函数(1)-激活函数和感知机中
讨论过 激活函数是在神经网络层间输入与输出之间的一种函数变换,目的是为了加入非线性因素,增强模型的表达能力。激活函数的作用类似于人类大脑中基于神经元的模型(参考下图),激活函数最终决定了要发射给下一个神经元的内容。
常用的激活函数有,Sigmoid激活函数,Tan/ 双曲正切激活函数,ReLU激活函数(还有改进后的LeakyReLU和PReLU),Softmax激活函数等。
-
Sigmoid梯度消失问题可以通过Relu解决
机器学习中的函数(3)-“梯度下降”走捷径,”BP算法”提效率
中的描述。我们以Sigmoid为例,看一下“梯度消失”是如何发生的?
Sigmoid的函数公式和图像如下图,从图中可见函数两个边缘的梯度约为0,Sigmoid导数取值取值范围为(0,0.25)。
当我们求激活函数输出相对于权重参数W的偏导时,Sigmoid函数的梯度是表达式中的一个乘法因子。
实际的神经网络层数少则数十多则数百层,由于神经网络反向传播时的“链式反应”,这么多范围在(0,0.25)的数相乘,将会是一个非常小的数字。
而梯度下降算法更新参数W完全依赖于梯度值(如BP算法),
极小的梯度值失去了区分度,无法让参数有效更新,该现象即为“梯度消失”(VanishingGradients)
。
-
Relu神经元死亡问题可以通过“小于0”部分优
ReLU也有缺点,它提升了计算效率,但同样可能阻碍训练过程。通常,激活函数的输入值有一项偏置项(bias),若bias太小,输入激活函数的值总是负的,那么反向传播过程经过该处的梯度总为0,对应的权重和偏置参数无法得到更新。如果对于所有的样本输入,该激活函数的输入都是负的,那么该神经元再也无法学习,称为神经元“死亡”问题(Dying ReLU Problem)。
Relu升级到LeakyReLU就是为了解决神经元“死亡”问题。LeakyReLU与ReLU很相似,仅在输入小于0的部分有差别,ReLU输入小于0的部分值都为0,而LeakyReLU输入小于0的部分,值为负,且有微小的梯度。使用LeakyReLU的好处就是:在反向传播过程中,对于LeakyReLU激活函数输入小于零的部分,也可以计算得到梯度,而不是像ReLU一样值为0,这样就避免了上述梯度方向锯齿问题。超参数α的取值也被研究过,有论文将α作为了需要学习的参数,该激活函数为PReLU(Parametrized ReLU)。
S
i
gmoid和tanh的
将输出限制在(
0
,
1)
和(
–
1,
1
)
之间,
适
合做概率值的处理
,例如LSTM中的各种门;
而Re
LU
无最大值限制,则不适合做这个应用,但是
Relu适合用于深层网络的训练,而Sigmoid和tanh则不行,因为它们会出现梯度消失。
选择激活函数是有技巧的,如“除非在二分类问题中,否则小心使用Sigmoid函数”;“如果你不知道应该使用哪个激活函数, 那么请优先选择ReLU”。尽管ReLU有一些缺点,但参考“奥卡姆剃刀原理”,如无必要、勿增实体,也就是优先选择最简单的方法,ReLU相较于其他激活函数,有着最低的计算代价和最简单的代码实现。如果使用了ReLU,要注意一下DeadReLU问题。如优化Learningrate,防止太高导致在训练过程中参数更新太大,避免出现大的梯度从而导致过多的神经元“Dead”;或者针对输入为负值时,ReLU的梯度为0造成神经元死亡,更换激活函数,尝试一下leakyReLU等ReLU变体,说不定会有很好效果。
实际应用时还是要看具体场景,甚至结合具体模型。比如LSTM中用到Tanh、Transfromer中用到的ReLU、Bert中用到的GeLU,YoLo中用到的LeakyReLU等。不同的激活函数,根据其特点,应用各不相同。
3、如何让张量执行计算?
(1)导入TensorFlow,并建立矩阵a、矩阵b、矩阵c,参考如下代码
import tensorflow as tf
import numpy as np
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[1, 1], [1, 1]])
c = tf.constant([[4.0,5.0], [10.0,1.0]])
欢迎大家来到IT世界,在知识的湖畔探索吧!
(2)执行张量的运算
张量的基本运算包括加法、乘法、获取最大最小值等,常用函数有tf.add()、tf.multiply()、tf.matmul()、tf.reduce_max()等。乘法相关的两个函数,tf.multiply()是两个矩阵中对应元素各自相乘,而tf.matmul()执行的是矩阵乘法,两者有区别。
-
add
欢迎大家来到IT世界,在知识的湖畔探索吧!print(tf.add(a, b), "\n")
打印结果 >>>
tf.Tensor(
[ ]
[2, 2), dtype=int32) ]], shape=(
-
multiply
欢迎大家来到IT世界,在知识的湖畔探索吧!print(tf.multiply(a, b), "\n")
打印结果 >>>
tf.Tensor(
[ ]
[2, 2), dtype=int32) ]], shape=(
-
matrix multiply
print(tf.matmul(a, b), "\n")
打印结果 >>>
tf.Tensor(
[ ]
[2, 2), dtype=int32) ]], shape=(
-
max/min:find the largest/smallest value
print(tf.reduce_max(c))
打印结果 >>>
tf.Tensor(10.0, shape=(), dtype=float32)
(3)应用激活函数
我们以tf.nn.sigmoid()、tf.nn.relu()等常用的激活函数为例,大家可以参考上文分享的公式验计算验证一下,看一下激活效果。
-
sigmoid
print(tf.nn.sigmoid(c))
打印结果 >>>
tf.Tensor(
[ ]
[2, 2), dtype=float32) ]], shape=(
-
relu
print(tf.nn.relu(c))
打印结果 >>>
tf.Tensor(
[ ]
[2, 2), dtype=float32) ]], shape=(
今天我们一起学习了如何在TensorFlow中执行张量的计算,并重点讨论一下不同的激活函数,下一步我们继续学习如何使用TensorFlow
深度学习框架(1)- 各显神通提升Tensor效率,让Tensor流动还靠深度学习框架
深度学习框架(2)- 了解TensorFlow,安装TensorFlow
深度学习框架(3)- TensorFlow中张量创建和转化,妙用“稀疏性”提升效率
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/36249.html