Sigmoid, Tanh, RELU, Leaky RELU Activation Functions
Attribution: Andrew Ng
当你建立你的神经网络, 你要做的选择之一是什么
在隐藏层中使用的激活函数,
以及你的神经网络的输出单位是什么。
到目前为止, 我们刚刚使用的是乙状结肠活化功能。
但有时其他选择可以更好地工作。
让我们来看一些例子。
在神经网络正向传递步骤中
我们在这三个步骤中使用了Sigmiod函数
因此, 乙状结肠被称为激活函数。
这是大家都熟知的sigmoid激活函数。
sigmoid(z)会变成(1+ e^(-z) )
所以在一般情况下, 我们可以有不同的功能,
其中 g 可能是一个非线性函数, 可能不是乙状结肠函数。
例如, 乙状结肠函数在零和一, 并且
激活功能, 几乎总是比乙状结肠功能更好地工作
是切线函数或双曲正切函数。
所以这是 z, 这是一个, 这是一个等于 tanh (z),
这介于加1和减去1之间。
tanh 函数的公式是 e 到
z 减去 e 到负 z 超过其总和。
实际上是数学上的乙状结肠功能的移位版本。
也就是一个普通的Sigmoid函数
它现在跨越零零点和 v 刻度, 所以它去15减去1和加1。
如果在隐藏单元中 令关于z的函数g
z 等于 tanh (z),
它几乎总是优于
函数, 因为在加号1和减号1之间的值, 激活的平均值
从你脑子里出来, 他们更接近有0的意思。
所以就像有时当你训练一个学习算法,
您可以将数据居中并
让您的数据有0平均值使用 tanh 而不是乙状结肠函数。
它是一种具有居中数据的效果, 因此
数据的平均值接近0而不是0.5。
这实际上使学习下一层更容易一些。
当我们在第二门课讨论优化算法的时候,
也将会更多的说明这个
但是一种观念是我
几乎从不使用sigmoid 激活函数。
这个 tanh 函数几乎 总是更优的
对于 sigmoid 函数的输出层有一个例外 因为 y 为 0 或者 1
它使得 y_hat 成为一个数字是有意义的。
这个例外的输出介于 0 和 1 之间而不是在 -1 和 1 之间
这个例外就是我愿意使用 sigmoid 函数的原因
当你正在使用二元分类的时候
在这种情况下你应该使用 sigmoid 函数作为输出层的激活函数
所以 g(z^[2]) 等于 σ(z^[2])
所以你在这个例子里看到的是 使用 tanh 函数
作为隐藏层的激活函数 以及 sigmoid作为输出层的激活函数
所以对于不同的网络层来说 激活函数可能不同
有时候为了表示 不同网络层的
激活函数,我们可能会使用方括号“[]”上标
表明 g^[1] 和 g^[2] 是不同的
脚本 [1] 表示这一层,以及
脚本 [2] 表示输出层
sogmoid 函数和 tanh 函数的 一个共同缺点是
如果 z 很大或者很小
那么这个函数的梯度或者导数 或者斜率将会很小
所以如果 z 非常大或者非常小
那么该函数的斜率将最终接近 0
然后会减慢梯度下降的速度
所以另一个非常受欢迎的选择是
在机器学习中称为 整流线性单元的函数
这个 RELU 函数就像这样
公式是 a=max(0, z)
所以导数为 1,只要 a 为正值
当 a 为负值时, 导数或者斜率为 0
如果你实施这个函数,
技术上来说,当 z 接近于 0 的时候的导数并不是好的定义
但是,当你在计算机上执行这个
你得到的结果是 z 等于 0,0,0,0,0,…
这非常小所以在练习的时候不必担心这个问题
当 z 等于 0 时,你可以伪装导数
你可以把它伪装成 0 或 1,然后你的实验就还好
所以实际上,它是不可微的,以及实际上
这里有大致的规则来选择激活函数
如果你的输出为 0 或 1, 即你在使用二元分类,
那么 sigmoid 函数对于输出层是一个非常自然的选择
然后对其他所有的单元, ReLU,
或者线性修正单元,
越来越多地被默认为激活函数的选择
所以, 如果你不确定使用为隐藏单元 使用怎样的激活函数
我推荐使用 RELU 激活函数
它如你所见, 大多数人 都在使用这个函数
虽然有些时候, 有些人也使用 tanh 激活函数
ReLU的一个缺点是导数等于零,
在 z 是负数的时候。
在练习的时候,这很好用
但是这里有另一个版本的 RELU 称为 leaky ReLU
我将在下一个幻灯片中给你们公式
当 z 为负数时, 它的导数不再为 0
它只是略微倾斜, 所以称它为 leaky ReLU
它通常要比 ReLU 表现的要好
虽然它在实践中并没有被使用
但是, 任何一个都应该没问题
如果你必须选择一个, 我通常建议使用 ReLU
ReLU 和 leaky ReLU 的优点是
对于大部分的 z 空间, 激活函数的导数,
或者激活函数的斜率不会为 0
所以, 在练习中使用 ReLU 激活函数
你的神经网络的学习速度 将通常比使用 tanh 函数
或者 sigmoid 函数要快得多
主要的原因是 有较少的有影响的函数的斜率
趋向于 0,这个将会影响学习
我知道在一半的 z 的范围内, ReLU 的斜率为 0
但是在练习中, 有足够的隐藏单元将使 z 大于 0
对于大多数的训练样本来说, 仍旧可以学习得快些
所以, 让我们简单地回顾一下 不同激活函数的优点和缺点
这是一个 sigmoid 激活函数
我将会说, 永远不要使用它, 除非用于输出层
如果你在做二元分类的话, 或者可能几乎永远不会使用它
我几乎从不使用它的原因是 tanh 函数
几乎非常优越
tanh 函数是这个
然后, 默认的
非常普遍的使用的函数是 ReLU 函数, 就是这个
如果你不确定使用什么, 就使用整个
或许也可以随意试试 leaky ReLU
它可能是 (0.01z, z)
是吧? 所以 a 是0.01 倍 z 和
z 中取最大值, 这样可以给你函数中的一些折弯
你可能会说, 为什么是常数 0.01?
好吧, 你也可以使用这个学习算法的另一个参数
有人说会表现得更好
但我很少看到人们这样做
但是, 如果你想要在你的应用中尝试, 请随意这样做
你可以看到它是如何工作的, 以及它表现的如何
坚持下去, 如果它给你一个好结果
所以我希望能让你了解一些激活函数的选择
你可以在神经网络中使用它们
我们在深度学习中经常 会看到的主题之一是你会有很多
不同的选择来编码你的神经网络
从隐藏单元的数量, 激活函数的选择,
到如何初始化这个我们以后将会看到的方法,
很多像这样的选择
事实证明, 有时候很难获得良好的指导方针
对于你的问题来说, 究竟什么是最好的
所以通过这些课程 我继续让你们了解
我所看到的行业内容, 或者更受欢迎的内容
但对于你的应用程序, 与你的应用程序的特质,
实际上很难事先知道究竟哪种方法最有效
所以一个常见的建议将是, 如果你不知道其中哪个
激活函数的效果最好, 就去全部尝试,并评估
在一个验证集上的效果, 或者开发集, 这个我们将在之后提到
然后看看哪个效果好一些, 就使用它
我认为通过测试这些 不同的选择为你的应用程序,
你能够更好地面向未来
调整你问题的特性, 以及算法的演变
而不是我告诉你总是使用 ReLU 激活函数和
不再使用任何其他的函数
这可能不适用于任何问题, 你最终的工作
无论是在不久的将来还是在遥远的未来
好吧, 这些就是激活函数的选择和
你说看到的最流型的一些激活函数
还有一个问题, 你可能会问
也就是说, 为什么需要使用激活函数呢?
为什么不使用它们呢?
那么, 让我们在下节课讨论这个
你将会知道为什么神经网络需要一些非线性的激活函数
Let the dataset change your mindset
Sorry, the comment form is closed at this time.