在上一篇博客感知机的学习当中,我们发现单层感知机有一个非常严重的问题,即对一些稍微复杂的函数无能为力(如最为典型的“异或”操作)。所以才会有多层感知机的出现,它由一个输入层,一个输入层和多个隐藏层组成。神经网络和前面介绍的感知机有很多共同点。这里,我们主要以两者 的差异为中心,来介绍神经网络的结构 。
在观察神经网络中信号的传递方法之前,我们先复习一下感知机。假设感知机只接收两个信号x1和x2,输出Y。我们用数学表达式来表示这个感知机:
b是被称为偏置的参数,由于控制神经元被激活的容易程度,而w1和w2是表示各个信号的权重的参数,用于控制各个信号的重要性。如果我们添加了权重为b的输入信号1.那么这个感知机将x1,x2,1三个信号作为神经元的输入,将其和各自的权重相乘后,传送至下一个神经元。下图可以直观看出:
我们将上面的数学表达式用一个函数来表示这种分情况的动作,引入新函数h(x),则可表示为:
在这个式子中,输入信号的总和会被h(x)转换,转换后的值就是输出y.这里我们将h(x)称之为激活函数,激活函数的作用在于如何来激活输入信号的总和。上面这个激活函数是一个阶跃函数。接下来我们将上面的式子写的更详细一点就可以分成这么两个式子:
a为加权输入信号和偏置的总和,然后用激活函数h(x)转换为输出y.
下面,我们将仔细介绍激活函数。激活函数是连接感知机和神经网络的 桥梁。。一 般而言,“朴素感知机”是指单层网络,指的是激活函数使用了阶 跃函数的模型。“多层感知机”是指神经网络,即使用sigmoid 函数(后述)等平滑的激活函数的多层网络。
(1)sigmoid函数
神经网络中用sigmoid函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。实际上,前面介绍的感知机和神经网络的主要区别就在于这个激活函数。
神经网络中经常使用的一个激活函数是sigmoid函数:
(2)阶跃函数:
(3)RELU函数:
上述三种激活函数的代码实现:
import numpy as np
import matplotlib.pylab as plt
#def step_function(x):#阶跃函数
# return np.array(x > 0, dtype=np.int)
#def step_function(x):
# y = x > 0
# return y.astype(np.int)
#x = np.arange(-5.0, 5.0, 0.1)
#y = step_function(x)
#plt.plot(x, y)
#plt.ylim(-0.1, 1.1) # 指定y轴的范围 plt.show()
#def sigmoid(x):#sigmoid函数
# return 1/(1+np.exp(-x))
#x=np.arange(-4.0,4.0,0.1)
#y=sig(x)
#plt.plot(x,y)
#plt.ylim(0,1)
#def relu(x):#relu函数
# return np.maximum(0, x)
#print(relu(1))
#x=np.arange(-2.0,2.0,0.1)
#y=relu(x)
#plt.plot(x,y)
#plt.ylim(-0.2,1)
#plt.imshow