z = ∑ i = 0 D w d x d + b z = \sum_{i=0}^D w_dx_d+b z=i=0∑Dwdxd+b
与门:只有两个输入都为1时才输出1,其他情况输出0
与非门:颠倒与门输出情况,只有两个输入都为1时才输出0,否则输出1
或门: 只要有一个输入为1,那么输出1,只有全部输入为0,才输出0
异或门:只有一个输入为1时,才会输入1,如两个输入为1时,输出0,如图1所示
感知机算法不能处理异或门
感知机算法的思想:只要调整感知机的参数即可实现感知机在不同门之间的切换; 参数调整交给计算机来做,让计算机决定是那种门。
def AND(x1,x2):
'''与门的实现'''
w1,w2,theta = 0.5,0.5,0.7
tmp = x1*w1+x2*w2
if tmp<=theta:
return 0
elif tmp>theta:
return 1
# 测试函数
print(AND(1,1)) # 1
print(AND(0,0)) # 0
print(AND(1,0)) # 0
print(AND(0,1)) # 0
# 使用偏置 和numpy实现
def AND(x1,x2):
import numpy as np
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7 # 阈值,调整神经元被激活的容易程度
tmp = np.sum(w*x) +b
if tmp<=0:
return 0
elif tmp>0:
return 1
# 测试 和普通实现一样
print(AND(1,1)) # 1
print(AND(0,0)) # 0
print(AND(1,0)) # 1
print(AND(0,1)) # 1
def NAND(x1,x2):
'''与非门'''
import numpy as np
x = np.array([x1,x2])
w = np.array([-0.5,-0.5])
b = 0.7
tmp = np.sum(w*x)+b
if tmp <=0:
return 0
elif tmp>0:
return 1
# 测试
print(NAND(1,1)) # 0
print(NAND(1,0)) # 1
print(NAND(0,1)) # 1
print(NAND(0,0)) # 1
def OR(x1,x2):
import numpy as np
x = np.array([x1,x2])
w = np.array([0.5,0.5]) # 只要不是两个输入都去0, 就输出1
b = -0.2
tmp = np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
OR(1,1)
OR(0,1)
OR(1,0)
OR(1,1)
def XOR(x1,x2):
s1 = NAND(x1,x2) #与非门
s2 = OR(x1,x2) # 或门
y = AND(s1,s2) # 相当于对两条进行组合
return y
# 测试
XOR(1,1)
XOR(0,0)
XOR(1,0)
XOR(0,1)
基本思想:上一节中,多层感知机即多个线性函数的通过逻辑运算符实现非线性分类,很自然的联想到对线性函数进行非线性变换使其能够解决非线性可分的分类问题。这类非线性变换在神经网络中是激活函数。
神经网络:利用带有激活函数的多层感知机模型来学习非线性特征表达的统计模型。常见的全连接神经网络结构如图2所示:
σ ( x ) = 1 1 + e x p ( − x ) \sigma(x) ={1\over1+exp(-x)} σ(x)=1+exp(−x)1
逻辑分布属于指数分布族
Logstic分布经常用于周期型分析,例如经济的萧条、复苏、繁荣、衰退,开始经济增长缓慢,经济复苏后开始快速增长,繁荣阶段后经济开始停滞不前,增速放缓,最后甚至开始衰退,继续进入萧条阶段,较为符合logistic分布。
分布函数具有0-1的特性,所以其输出可以看作概率分布,用于分类。
分布函数中间激活取值,两边处于抑制状态的特性,符合神经元特点
梯度消失问题
t a n h ( x ) = e x p ( x ) − e x p ( − x ) e x p ( x ) + e x p ( − x ) tanh(x) = {exp(x)-exp(-x)\over exp(x)+exp(-x)} tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)
t a n h ( x ) = 2 σ ( 2 x ) − 1 tanh(x) = 2\sigma(2x)-1 tanh(x)=2σ(2x)−1
R e l u ( x ) = { x , x > 0 0 , x < = 0 Relu(x)=\begin{cases} x ,& x>0 \\ 0,& x<=0 \\ \end{cases} Relu(x)={x,0,x>0x<=0
L e a k y R e l u ( x ) = { x i f x > 0 γ i x i f x < = 0 Leaky Relu(x)=\begin {cases} x & if \space x>0 \\ \gamma_i x & if \space x<=0\\ \end{cases} LeakyRelu(x)={xγixif x>0if x<=0
S o f t p l u s ( x ) = l o g ( 1 + e x p ( x ) ) Softplus(x) = log(1+exp(x)) Softplus(x)=log(1+exp(x))
Swish函数: s w i s h ( x ) = x σ ( β x ) swish(x) = x \sigma(\beta x) swish(x)=xσ(βx)
Gelu函数: G e l u ( x ) = x P ( X < = x ) Gelu(x) = xP(X<=x) Gelu(x)=xP(X<=x)
Maxout单元
参考资料:
1.邱锡鹏:《神经网络与深度学习》
2.李沐:《动手学深度学习》