25_动手实现TensorFlow–激活函数Sigmoid()
上节课我们实现了线性变换,使用了np.dot()实现矩阵乘法,得出y=wx+b。但神经网络需要利用交替变换和激活函数来对输出进行更好的分类。在众多激活函数中Sigmoid函数是最常用的。
Sigmoid函数
线性变换非常适合于简单地移动值,但神经网络需要更加细致的变换。人工神经元的基本单元:感知器就表现出明显的二进制输出行为。感知器将输入加权与阈值比较,当加权输入超过阈值时,感知器被激活并输出1,否则输出0.所以感知器类似于阶跃函数:
上图是一个理想的阶跃函数的曲线,y=0与y=1之间是不连续的
二进制输出通常用于归类问题。上图的阶跃函数是理想的。但是由于这个函数是不连续的,这就意味着这个函数是不可求导的,而可求导是我们进行梯度下降的前提。
Sigmoid函数提供了另一种可能,它是S型的曲线,符合阶跃函数的特征,重要的是它是连续的!同时它的导数非常简洁:
这里需要注意的是Sigmoid函数只有一个输入参数。
从概念上讲,sigmoid函数可以做出决策。当从某些数据给出加权特征时,它可以将特征分类。以这种方式,在线性变换之后,S形激活很好地起作用。 由于它现在具有随机权重和偏差,sigmoid节点的输出也是随机的。通过反向传播和梯度下降学习的过程,我们将很快实现修改权重和偏置,使得S形节点的激活开始匹配预期输出。
我们修改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:
发表评论
Want to join the discussion?Feel free to contribute!