25_动手实现TensorFlow–激活函数Sigmoid()

上节课我们实现了线性变换,使用了np.dot()实现矩阵乘法,得出y=wx+b。但神经网络需要利用交替变换和激活函数来对输出进行更好的分类。在众多激活函数中Sigmoid函数是最常用的。

Sigmoid函数

image

image

线性变换非常适合于简单地移动值,但神经网络需要更加细致的变换。人工神经元的基本单元:感知器就表现出明显的二进制输出行为。感知器将输入加权与阈值比较,当加权输入超过阈值时,感知器被激活并输出1,否则输出0.所以感知器类似于阶跃函数:

image

上图是一个理想的阶跃函数的曲线,y=0与y=1之间是不连续的

二进制输出通常用于归类问题。上图的阶跃函数是理想的。但是由于这个函数是不连续的,这就意味着这个函数是不可求导的,而可求导是我们进行梯度下降的前提。

Sigmoid函数提供了另一种可能,它是S型的曲线,符合阶跃函数的特征,重要的是它是连续的!同时它的导数非常简洁:

image

这里需要注意的是Sigmoid函数只有一个输入参数。

从概念上讲,sigmoid函数可以做出决策。当从某些数据给出加权特征时,它可以将特征分类。以这种方式,在线性变换之后,S形激活很好地起作用。 由于它现在具有随机权重和偏差,sigmoid节点的输出也是随机的。通过反向传播和梯度下降学习的过程,我们将很快实现修改权重和偏置,使得S形节点的激活开始匹配预期输出。

image

我们修改MiniFlow中的代码,增加Sigmoid子类,并将它的forward函数修改:

class Sigmoid(Node):
    """
    You need to fix the `_sigmoid` and `forward` methods.
    """
    def __init__(self, node):
        Node.__init__(self, [node])

    def _sigmoid(self, x):
        """
        This method is separate from `forward` because it
        will be used later with `backward` as well.

        `x`: A numpy array-like object.

        Return the result of the sigmoid function.

        Your code here!
        """
        return 1./(1. + np.exp(-x))

全部代码链接请关注github:

0 回复

发表评论

Want to join the discussion?
Feel free to contribute!

发表评论

邮箱地址不会被公开。 必填项已用*标注