一、神经网络介绍
深度学习是从神经网络发展而来的,深度学习其实就是深层神经网络。神经网络借鉴了生物学中神经元处理信号的原理和结构。神经元(神经细胞)的功能是接受信号并对其做出反应、传导兴奋、处理并储存信息以及发生细胞之间的联结等,有这些功能,生物才能迅速对环境的变化做出整合性的反应。神经元之间相互连接,当某一神经元处于“兴奋”状态时,其相连神经元的电位将发生改变,若神经元电位改变量超过了一定的数值(也称为阈值),则相连的神经元被激活并处于“兴奋状态”,向下一级连接的神经元继续传递电位改变信息。信息从一个神经元以电传导的方式跨过细胞之间的联结(即突触),传给另一个神经元,最终使肌肉收缩或腺体分泌。
神经元是一个多输入、单输出的信息处理单元,并且对信息的处理是非线性的。把神经元抽象为一个简单的数学模型,模拟生物神经元形式,可证明神经元能够执行逻辑功能,开创了人工神经网络研究的时代。
二、感知机
感知机是最简单的人工神经网络模型,虽然结构简单,但能解决复杂问题。
上图是一个有
n
n
n维度输入的单层感知机,
x
1
x_1
x1到
x
2
x_2
x2是
n
n
n个输入分量,
w
1
w_1
w1到
w
2
w_2
w2是乘以对应输入分量的权值。
θ
\theta
θ是阈值,信号强度(
w
1
∗
x
1
+
w
2
∗
x
2
+
.
.
.
+
w
n
∗
x
n
=
x
w
T
w_1*x_1+w_2*x_2+...+w_n*x_n={x}{w^T}
w1∗x1+w2∗x2+...+wn∗xn=xwT)超过了阈值才会触发神经动作,
f
f
f为激活函数(一般是阶跃函数或者sigmoid函数),
y
y
y为输出量。数学模型为:
y
=
f
(
∑
i
=
1
n
w
i
x
i
−
θ
)
y = f(\sum_{i=1}^nw_ix_i-\theta)
y=f(i=1∑nwixi−θ)
感知机通过调整权值
w
i
w_i
wi,以产生合适的输出响应
y
y
y。这个过程是生物学习的过程,一个神经元接收到各类信号输入
x
i
x_i
xi,对不同的信号施加不同的权重
w
i
w_i
wi,对敏感信号加的权重就大,加权累加后超过一定阈值
θ
\theta
θ后再经过激活函数
f
(
)
f()
f()的判决产生一个标量信号
y
y
y,可能是一个神经电信号控制肌肉收缩以躲避危险,也可能是一次腺体的分泌以消化食物。
三、梯度下降法
感知机中的输出
y
y
y是否符合要求需要有评价,反应到生物领域就是神经元经过输入信号处理后的反应是否能趋利避害,保持生存。用
Y
Y
Y表示感知机正确的输出,
Y
−
y
Y- y
Y−y就是误差,评价误差的大小一般使用
1
2
∥
Y
−
y
∥
2
{\frac {1} {2}}\left\|Y-y\right\|^2
21∥Y−y∥2。感知机的设计目标就是调整权重
w
i
w_i
wi,使得误差最小化,即
min
1
2
∥
Y
−
y
∥
2
=
min
w
i
1
2
∥
Y
−
f
(
∑
i
=
1
n
w
i
x
i
−
θ
)
∥
2
\min{\frac {1} {2}}\left\|Y-y\right\|^2=\min \limits_{w_i}{\frac {1} {2}}\left\|Y-f(\sum_{i=1}^nw_ix_i-\theta)\right\|^2
min21∥Y−y∥2=wimin21∥Y−f(∑i=1nwixi−θ)∥2。学习得到合适的
w
w
w的过程就转换成最小化问题。解决最小化问题的办法之一是梯度下降法,具体推导过程可以参考这里。一句话解释梯度下降法,像下山一样找下降最快的方向调整变量。
最小化
Z
=
1
2
∥
Y
−
f
(
∑
i
=
1
n
w
i
x
i
−
θ
)
∥
2
Z ={\frac {1} {2}}\left\|Y-f(\sum_{i=1}^nw_ix_i-\theta)\right\|^2
Z=21∥Y−f(∑i=1nwixi−θ)∥2中调整
w
w
w的调整量
Δ
w
=
−
α
∇
Z
=
α
(
Y
−
X
W
)
X
\Delta w=-\alpha \nabla Z =\alpha (Y-XW)X
Δw=−α∇Z=α(Y−XW)X
四、案例实战
以一个4维输入的感知机为例,输入5个4维度的信号,并给出5个输出的标签 Y Y Y(正确输出),训练得到权重 w w w,以输出合适的 y y y与 Y Y Y接近。从图像上看就是画出一条线,分割5个点到两边。从生物意义上看,这个例子就是一个细胞在从4个信号中学习5次判断环境中的利害(1战, -1逃)。
#coding:utf8
import numpy as np
import matplotlib.pyplot as plt
n = 0 #迭代次数
lr = 0.10 #学习速率,对应梯度下降法中alpha
# 输入数据
X = np.array([[1,1,2,3],
[1,1,4,5],
[1,1,1,1],
[1,1,5,3],
[1,1,0,1]])
# 标签
Y = np.array([1,1,-1,1,-1])
# 权重初始化,取值范围-1到1
W = (np.random.random(X.shape[1])-0.5)*2
def get_show():
# 正样本
all_x = X[:, 2]
all_y = X[:, 3]
# 负样本
all_negative_x = [1, 0]
all_negative_y = [1, 1]
# 计算分界线斜率与截距,以x[0]w[0]+x[1]w[1]+x[2]w[2]+x[3]w[3] = 0的超平面分割点x到两个空间区域,由于x[0]和x[1]恒为1,超平面退化为(x[2], x[3])平面中的一条直线w[0]+w[1]+x[2]w[2]+x[3]w[3] = 0,斜率和截距如下:
k = -W[2] / W[3]
b = -(W[0] +W[1])/ W[3]
# 生成x刻度
xdata = np.linspace(0, 5)
plt.figure()
plt.plot(xdata,xdata*k+b,'r')
plt.plot(all_x, all_y,'bo')
plt.plot(all_negative_x, all_negative_y, 'yo')
plt.show()
#更新权值函数
def get_update():
#定义所有全局变量
global X,Y,W,lr,n
n += 1
#计算符号函数输出
new_output = np.sign(np.dot(X,W.T))
#更新权重
new_W = W + lr*((Y-new_output.T).dot(X))/int(X.shape[0])
W = new_W
def main():
for _ in range(100):
get_update()
new_output = np.sign(np.dot(X, W.T))
if (new_output == Y.T).all():
print("迭代次数:", n)
break
get_show()
if __name__ == "__main__":
main()