激活函数

一、激活函数的引入

从感知机中我们了解了下面的式子。

y = { 0 b + w 1 x 1 + w 2 x 2 ≤ 0 1 b + w 1 x 1 + w 2 x 2 > 0 y=\left\{ \begin{matrix}0\qquad b+w_1x_1+w_2x_2\leq0 \\ \\ 1\qquad b+w_1x_1+w_2x_2>0\\ \end{matrix} \right. y=0b+w1x1+w2x201b+w1x1+w2x2>0

现在将上式改写成更加简洁的形式,我们用一个函数来表示这种分情况的动作(超过 0 则输出 1,否则输出 0)。引入新函数 h ( x ) h(x) h(x),将上式改写成下式:

y = h ( b + w 1 x 1 + w 2 x 2 ) y=h(b+w_1x_1+w_2x_2) y=h(b+w1x1+w2x2)
y = { 0 x ≤ 0 1 x > 0 y=\left\{ \begin{matrix}0\qquad x\leq0 \\ \\ 1\qquad x>0\\ \end{matrix} \right. y=0x01x>0

输入信号的总和会被函数 h ( x ) h(x) h(x)转换,转换后的值就是输出 y y y。然后上式所表示的函数 h ( x ) h(x) h(x),在输出超过 0 时返回 1,否则返回 0。

上面登场的 h ( x ) h(x) h(x)函数会将输入信号的总和转换为输出信号,这种函数一般称为激活函数。

现在将式子 y = h ( b + w 1 x 1 + w 2 x 2 ) y=h(b+w_1x_1+w_2x_2) y=h(b+w1x1+w2x2)进一步改写,分成两个阶段进行处理,先计算输入信号加权的总和,然后用激活函数转换这一总和。因此,可改写成下列式子:

a = b + w 1 x 1 + w 2 x 2 a=b+w_1x_1+w_2x_2 a=b+w1x1+w2x2
y = h ( a ) y=h(a) y=h(a)
激活函数_第1张图片

如图所示,表示神经元的O中明确显示了激活函数的计算过程,即信号的加权总和为节点 a a a,然后节点 a a a被激活函数 h ( ) h() h()转换成为节点 y y y

二、激活函数的实现

1、sigmoid 函数

神经网络中经常使用的一种激活函数就是表示的sigmoid 函数

h ( x ) = 1 1 + e − x h(x)=\frac{1}{1+e^{-x}} h(x)=1+ex1

神经网络中用sigmoid 函数作为激活函数,进行信号的转换,转换后的信号被传送到下一个神经元。

阶跃函数的实现

我们用 Python 画出阶跃函数的图形。阶跃函数用下式表示,当输入超过 0 时输出 1,否则输出 0.

y = { 0 x ≤ 0 1 x > 0 y=\left\{ \begin{matrix}0\qquad x\leq0 \\ \\ 1\qquad x>0\\ \end{matrix} \right. y=0x01x>0

可以通过下面这样简单的实现阶跃函数

def step_function(x):
	if x>0:
		return 1
	else:
		return 0

通过原理,在 Python 中调用 matplotlib 库。

import numpy as np                      #调用numpy函数
import matplotlib.pylab as plt          #调用matplotlib函数
def function(x):                        #定义function函数
    y = x > 0
    y = y.astype(np.int)
    return y
x = np.arange(-5.0,5.0,0.1)             #输入x的取值
y = function(x)
plt.plot(x,y)
plt.show()

激活函数_第2张图片

sigmoid 函数的实现

通过Python 来实现sigmoid 函数。

def sigmoid(x):
	return 1/(1+np.exp(-x))

将该代码片段与上面的阶跃函数的代码进行替换。可得:

import numpy as np                      #调用numpy函数
import matplotlib.pylab as plt          #调用matplotlib函数
def sigmoid(x):                         #定义sigmoid函数
    y = 1/(1+np.exp(-x))
    return y
x = np.arange(-5.0,5.0,0.1)             #输入x的取值
y = sigmoid(x)
plt.plot(x,y)
plt.show()

激活函数_第3张图片

sigmoid 函数与阶跃函数的比较

激活函数_第4张图片

相同点

输入的信号小时,输出接近 0;输入的信号大时,输出接近 1

不同点

1、“平滑性”的不同,sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以 0 为界限,输出发生急剧性变化。

2、感知机流动的是 0 或 1 的二元信号,而神经网络流动的是连续的实数值信号。

2、ReLu 函数

ReLu 函数在输入大于 0 时,直接输出该值;在输入小于等于 0 时,输出为 0。

ReLu 函数可以用下式进行表示:

y = { x x > 0 1 x ≤ 0 y=\left\{ \begin{matrix}x\qquad x>0 \\ \\ 1\qquad x\leq0\\ \end{matrix} \right. y=xx>01x0

python代码如下:

import numpy as np                      #调用numpy函数
import matplotlib.pylab as plt          #调用matplotlib函数
def ReLu(x):                            #定义ReLu函数
    y = np.maximum(0,x)
    return y
x = np.arange(-5.0,5.0,0.1)             #输入x的取值
y = ReLu(x)
plt.plot(x,y)
plt.show()

激活函数_第5张图片

你可能感兴趣的:(激活函数)