我们知道使用线性回归和逻辑回归可以解决线性可分问题,对于有些线性不可分的问题,也可以通过增加多项式来解决,但是对于决策边界较为复杂的情况:
此时,往往需要引入较多的多项式,对于变量较多的情况极为复杂,甚至容易出现过拟合。
由于大量数据的涌入和收集(大数据的驱动)我们有了新的算法:人工神经网络(ANN),它的研究是由试图模拟生物神经系统而激发的。
人的大脑主要由称为神经元(节点)的神经细胞组成,神经元通过突触的纤维丝连在一起。当神经元受到刺激时,神经脉冲(输入)通过轴突从一个神经元传到另一个神经元。一个神经元的树突连接到其他神经元的轴突,其连接点称为神经建(权重)。
神经学家发现,人的大脑通过在同一个脉冲(输入)反复刺激下改变神经元之间的神经建连接强度(权值)来进行学习
。
PS.以一个例子来看人工神经网络的运作方式:
这里借用朱江老师上课所讲的例子——《甄嬛传》高潮部分:滴血认亲
看过甄嬛传的同学应该不会忘了这一集,剧情是相当刺激~内容是这样的,祺嫔张罗一群人来指认甄嬛腹中双生子并非皇上的,而是太医温实初的。
(PS.图片为博主原创,转载请注明出处,谢谢!)
如上图,开始有祺嫔、丫鬟佩儿、侍女玢儿、尼姑净白被幕后主使召集起来,分别指认甄嬛腹中并非龙种,此时,这四个人作为信息的输入(input)
作为幕后主使的皇后,和当事人甄嬛分别对输入信息加权汇总
找出对自己有利的信息,并适当为收集信息“添油加醋”
。上图连接线的粗细表示信息的权重(Weights)
,作为皇上,自然担心自己孩子血统是否纯正,因此对于皇后观点权重较大,此时皇上作为对全部信息的汇总输出,可能得出结论:孩子不是自己的。但是根据不断的信息涌入和转换,对权重进行调整,最终的结果是皇上认为:孩子是自己的。
以上就是一个人工神经网络传递信息的例子。由上可知,人工神经网络的一些组成是: { 输 入 I n p u t : x 1 , x 2 , . . . , x n ( n 个 特 征 ) 权 值 W e i g h t s : w 1 , w 2 , . . . , w 3 激 活 函 数 f ( x ) [ 可 想 象 为 皇 后 对 输 入 信 息 “ 添 油 加 醋 ” ] 输 出 O u t p u t : 对 加 权 和 套 用 激 活 函 数 的 结 果 \begin{cases}输入Input:x1,x2,...,xn(n个特征)\\权值Weights:w1,w2,...,w3\\激活函数f(x)[可想象为皇后对输入信息“添油加醋”]\\输出Output:对加权和套用激活函数的结果\end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧输入Input:x1,x2,...,xn(n个特征)权值Weights:w1,w2,...,w3激活函数f(x)[可想象为皇后对输入信息“添油加醋”]输出Output:对加权和套用激活函数的结果
下面,我们从最简单的神经网络:感知机出发,详细捋一捋神经网络的知识。
感知机是二分类的线性分类模型,其输入是实例的特征向量,输出为实例的类别。感知器是最简单的神经网络,它只有输入层和输出层两层结构,没有中间层。
如上图,每个神经元都是多输入,单输出的信息处理单元,输入信号通过带权重的连接传递,和阈值对比后得到总输入值,再通过激活函数的处理产生单个输出。
PS.激活函数的意义就是通过进行映射,解决非线性可分问题,激活函数有:
其中,常用的激活函数为:sigmoid函数、tanH函数和强大的ReLU函数。
此时,从激活函数到输出有:
输入: w 1 x 1 + w 2 x 2 + x 3 x 3 w_1x_1+w_2x_2+x_3x_3 w1x1+w2x2+x3x3
输出: O = f ( w 1 x 1 + w 2 x 2 + x 3 x 3 + 阈 值 ) O=f(w_1x_1+w_2x_2+x_3x_3+阈值) O=f(w1x1+w2x2+x3x3+阈值)
为了方便计算,我们常将偏置因子b作为 w 0 w_0 w0,引入偏置神经元: x 0 = − 1 x_0=-1 x0=−1
将阈值也看做加权和的一部分—— w 0 x 0 w_0x_0 w0x0(+阈值或-阈值),即引入了 x 0 x_0 x0列
x0:取值1或-1
w0:阈值
输出: f ( w 0 x 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n ) f(w_0x_0+w_1x_1+w_2x_2+...+w_nx_n) f(w0x0+w1x1+w2x2+...+wnxn)
和我们刚才所说人脑的神经网络系统一样,我们的人工神经网络也是:输入一定,通过调整权重来影响输出。下面,我们看一看感知器的权值更新计算过程。
感知器是怎样更新权值的呢?它通过输入信息的加权汇总,带入激活函数中,计算的输出值与target目标值(原本的标签)进行对比,若有差异,则调整权重,直到满足一定的迭代次数或者达到预设的最小误差值时停止。
简要理解感知器的权值更新过程(具体的推导请参考:《统计学习方法》第二章)
首先,我们要明了,感知机的权值更新同样采用梯度下降
的方法:
当感知机采用sigmoid函数作为激活函数时,此时相当于逻辑回归!采用同样的决策边界,可以得到:
O j = { − 1 , X w < 0 1 , X w > 0 O_j=\begin{cases} -1 ,&Xw<0\\1, &Xw>0\end{cases} Oj={−1,1,Xw<0Xw>0 注意:此时采用双极性阈值,取值在-1~1!
i)当 t = O = s i g n ( X w ) t=O=sign(Xw) t=O=sign(Xw)时,无需更新权值;
ii)当 t ≠ O = s i g n ( X w ) t\not=O=sign(Xw) t=O=sign(Xw)时, { O < 0 , X w < 0 , Δ w = η ( t − O ) X = 2 η X > 0 , O 不 断 向 t = 1 靠 近 O > 0 , X w > 0 , Δ w = η ( t − O ) X = − 2 η X < 0 , O 不 断 向 t = − 1 靠 近 \begin{cases}O<0,&Xw<0,\Delta w=\eta(t-O)X=2\eta X>0,O不断向t=1靠近\\O>0,&Xw>0,\Delta w=\eta(t-O)X=-2\eta X<0,O不断向t=-1靠近\end{cases} {O<0,O>0,Xw<0,Δw=η(t−O)X=2ηX>0,O不断向t=1靠近Xw>0,Δw=η(t−O)X=−2ηX<0,O不断向t=−1靠近
从而实现权值更新。
下面,我们用一个例子来说明感知机的计算过程:
某计算节点感知器有3个输入。给定样本: X 1 = ( 1 , − 2 ) T , X 2 = ( 0 , 1.5 ) T , X 3 = ( − 1 , 1 ) T X^1=(1,-2)^T,X^2=(0,1.5)^T,X^3=(-1,1)^T X1=(1,−2)T,X2=(0,1.5)T,X3=(−1,1)T输入向量中需要加入第一个恒等于-1的分量。期望输出向量 d = ( − 1 , − 1 , 1 ) T d=(-1,-1,1)^T d=(−1,−1,1)T。初始权向量 w = ( 0.5 , 1 , − 1 ) T w=(0.5,1,-1)^T w=(0.5,1,−1)T,学习率η=0.1,激活函数采用双极性阈值函数。
解:
引入:本文一开始“滴血认亲”的例子就是属于含有一层隐层的神经网络。隐层的甄嬛和皇后这两个“神经元”对输入层信息进行加权汇总并带入激活函数,所得的输出作为输出层的输入。
(PS.图片为博主原创,转载请注明出处,谢谢!)
没有隐层的神经网络可以看做对输入信息的线性组合。单层感知机即是其中一个例子,但是单层感知机的局限是:它只能解决线性可分的“与”,“或”,“非”问题,不能解决线性不可分的"异或"问题。这个时候,增加隐层相当于相当于在第一次sigmoid变换的基础上再次进行sigmoid转换,对数据进行两次映射,可以转换为线性可分问题。可以推广到:通过增加隐层可以解决各种情形的线性不可分问题。有如下图:
PS.关于“或”,“与”,“非”问题大家可以自行百度,或者直接理解为:线性可分问题。
BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的
实际输出值和期望输出值的误差均方差为最小
。
δ学习规则是一种利用梯度下降法的一般性的学习规则。
首先,BP神经网络的损失函数(Cost Function): E = 1 2 ( t − O ) 2 E=\frac{1}{2}(t-O)^2 E=21(t−O)2其中,t为数据原始标签,即为target。O为我们的预测输出。delta学习规则即是通过梯度下降法,使我们的预测输出和目标标签的误差平方和最小。
使用梯度下降法来最小化E的值: Δ w = − η ∂ E ∂ w = − η X T ( t − O ) ∂ f ( X w ) ∂ w = η X T δ , ( δ = − ( t − y ) ∂ f ( X w ) ∂ w ) \Delta w=-\eta \frac{\partial E}{\partial w}=-\eta X^T(t-O)\frac{\partial f(Xw)}{\partial w}=\eta X^T\delta ,(\delta=-(t-y)\frac{\partial f(Xw)}{\partial w}) Δw=−η∂w∂E=−ηXT(t−O)∂w∂f(Xw)=ηXTδ,(δ=−(t−y)∂w∂f(Xw)) w ≔ w + Δ w w≔w+\Delta w w:=w+Δw
对于三层网络,推导输出层和隐层权值更新公式。(实质是基于delta规则的链式法则)
具体推导如下:
例:下图为三层神经网络,隐层三节点,使用激活函数为sigmoid函数。
PS.在进行后续运算前,对数据向量化处理。输入数据为矩阵: X X X,第一层权重为向量: W ( 1 ) W^{(1)} W(1),第二层权重为向量: W ( 2 ) W^{(2)} W(2),隐层输出矩阵: Z ( 2 ) Z^{(2)} Z(2),输出层输入矩阵: a ( 2 ) a^{(2)} a(2)。
已知, E = 1 2 ( t − O ) 2 E=\frac{1}{2}(t-O)^2 E=21(t−O)2在本例(上图)中可得 E = 1 2 ( t − a 1 ( 3 ) ) 2 E=\frac{1}{2}(t-a_1^{(3)})^2 E=21(t−a1(3))2
S t e p 1 ′ Step 1' Step1′输出层—>隐层权值更新: ∂ E ∂ w ( 2 ) = ∂ E ∂ a 1 ( 3 ) ⋅ ∂ a 1 ( 3 ) ∂ z 1 ( 3 ) ⋅ ∂ z 1 ( 3 ) ∂ w ( 2 ) = − ( t − a 1 ( 3 ) ) ⋅ a 1 ( 3 ) ( 1 − a 1 ( 3 ) ) ⋅ a ( 2 ) \frac{\partial E}{\partial w^{(2)}}=\frac{\partial E}{\partial a_1^{(3)}}·\frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}·\frac{\partial z_1^{(3)}}{\partial w^{(2)}}=-(t-a_1^{(3)})·a_1^{(3)}(1-a_1^{(3)})·a^{(2)} ∂w(2)∂E=∂a1(3)∂E⋅∂z1(3)∂a1(3)⋅∂w(2)∂z1(3)=−(t−a1(3))⋅a1(3)(1−a1(3))⋅a(2) 记: δ L = − ( t − a 1 ( 3 ) ) ⋅ a 1 ( 3 ) ( 1 − a 1 ( 3 ) ) \delta_L=-(t-a_1^{(3)})·a_1^{(3)}(1-a_1^{(3)}) δL=−(t−a1(3))⋅a1(3)(1−a1(3))
梯度下降更新权值: w : = w + Δ w = w + η ⋅ δ L ⋅ a ( 2 ) w:=w+\Delta w=w+\eta·\delta_L·a^{(2)} w:=w+Δw=w+η⋅δL⋅a(2)
S t e p 2 ′ Step2' Step2′隐层—>输入层权值更新: ∂ E ∂ w ( 1 ) = ∂ E ∂ a 1 ( 3 ) ⋅ ∂ a 1 ( 3 ) ∂ z 1 ( 3 ) ⋅ ∂ z 1 ( 3 ) ∂ a ( 2 ) ⋅ ∂ a ( 2 ) ∂ z ( 2 ) ⋅ ∂ z ( 2 ) ∂ w ( 1 ) \frac{\partial E}{\partial w^{(1)}}=\frac{\partial E}{\partial a_1^{(3)}}·\frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}·\frac{\partial z_1^{(3)}}{\partial a^{(2)}}·\frac{\partial a^{(2)}}{\partial z^{(2)}}·\frac{\partial z^{(2)}}{\partial w^{(1)}} ∂w(1)∂E=∂a1(3)∂E⋅∂z1(3)∂a1(3)⋅∂a(2)∂z1(3)⋅∂z(2)∂a(2)⋅∂w(1)∂z(2) = − ( t − a 1 ( 3 ) ) ⋅ a 1 ( 3 ) ( 1 − a 1 ( 3 ) ) ⋅ w ( 2 ) ⋅ a ( 2 ) ( 1 − a ( 2 ) ) ⋅ X =-(t-a_1^{(3)})·a_1^{(3)}(1-a_1^{(3)})·w^{(2)}·a^{(2)}(1-a^{(2)})·X =−(t−a1(3))⋅a1(3)(1−a1(3))⋅w(2)⋅a(2)(1−a(2))⋅X = δ L ⋅ w ( 2 ) ⋅ a ( 2 ) ( 1 − a ( 2 ) ) ⋅ X =\delta_L·w^{(2)}·a^{(2)}(1-a^{(2)})·X =δL⋅w(2)⋅a(2)(1−a(2))⋅X 记: δ l = − ( t − a 1 ( 3 ) ) ⋅ a 1 ( 3 ) ( 1 − a 1 ( 3 ) ) ⋅ w ( 2 ) ⋅ a ( 2 ) ( 1 − a ( 2 ) ) \delta_l=-(t-a_1^{(3)})·a_1^{(3)}(1-a_1^{(3)})·w^{(2)}·a^{(2)}(1-a^{(2)}) δl=−(t−a1(3))⋅a1(3)(1−a1(3))⋅w(2)⋅a(2)(1−a(2))
梯度下降更新权值: w : = w + Δ w = w + η ⋅ δ L ⋅ w ( 2 ) ⋅ a ( 2 ) ( 1 − a ( 2 ) ) ⋅ X w:=w+\Delta w=w+\eta·\delta_L·w^{(2)}·a^{(2)}(1-a^{(2)})·X w:=w+Δw=w+η⋅δL⋅w(2)⋅a(2)(1−a(2))⋅X
基本BP算法包括信号的前向传播和误差的反向传播两个过程,我们通过一个例子详细计算BP神经网络的信号前向传播
、误差反向反馈
过程。
以上图为例,
S t e p 1 ′ 信 号 向 前 传 播 Step 1' 信号向前传播 Step1′信号向前传播
第一层——数据输入为: X 1 , X 2 , X 3 即 a 1 ( 1 ) , a 2 ( 1 ) , a 3 ( 1 ) X_1,X_2,X_3即a_1^{(1)},a_2^{(1)},a_3^{(1)} X1,X2,X3即a1(1),a2(1),a3(1)
中间层—— a 1 ( 2 ) = g ( z 1 ( 2 ) ) , z 1 ( 2 ) = w 01 ( 1 ) x 0 + w 11 ( 1 ) x 1 + w 21 ( 1 ) x 2 + w 31 ( 1 ) x 3 a_1^{(2)}=g(z_1^{(2)} ),z_1^{(2)}=w_{01}^{(1)} x_0+w_{11}^{(1)} x_1+w_{21}^{(1)} x_2+w_{31}^{(1)} x_3 a1(2)=g(z1(2)),z1(2)=w01(1)x0+w11(1)x1+w21(1)x2+w31(1)x3 a 2 ( 2 ) = g ( z 2 ( 2 ) ) , z 2 ( 2 ) = w 02 ( 1 ) x 0 + w 12 ( 1 ) x 1 + w 22 ( 1 ) x 2 + w 32 ( 1 ) x 3 a_2^{(2)}=g(z_2^{(2)} ),z_2^{(2)}=w_{02}^{(1)} x_0+w_{12}^{(1)} x_1+w_{22}^{(1)} x_2+w_{32}^{(1)} x_3 a2(2)=g(z2(2)),z2(2)=w02(1)x0+w12(1)x1+w22(1)x2+w32(1)x3 a 3 ( 2 ) = g ( z 3 ( 2 ) ) , z 3 ( 2 ) = w 03 ( 1 ) x 0 + w 13 ( 1 ) x 1 + w 23 ( 1 ) x 2 + w 33 ( 1 ) x 3 a_3^{(2)}=g(z_3^{(2)} ),z_3^{(2)}=w_{03}^{(1)} x_0+w_{13}^{(1)} x_1+w_{23}^{(1)} x_2+w_{33}^{(1)} x_3 a3(2)=g(z3(2)),z3(2)=w03(1)x0+w13(1)x1+w23(1)x2+w33(1)x3 输出层—— O = h w ( x ) = a 1 ( 3 ) = g ( z 1 ( 3 ) ) , z 1 ( 3 ) = w 01 ( 2 ) a 0 ( 2 ) + w 11 ( 2 ) a 1 ( 2 ) + w 21 ( 2 ) a 2 ( 2 ) + w 31 ( 2 ) a 3 ( 2 ) O=h_w (x)=a_1^{(3)}=g(z_1^{(3)}),z_1^{(3)}=w_{01}^{(2)}a_0^{(2)}+w_{11}^{(2)}a_1^{(2)}+w_{21}^{(2)}a_2^{(2)}+w_{31}^{(2)}a_3^{(2)} O=hw(x)=a1(3)=g(z1(3)),z1(3)=w01(2)a0(2)+w11(2)a1(2)+w21(2)a2(2)+w31(2)a3(2)
S t e p 2 ′ 误 差 反 向 反 馈 Step 2'误差反向反馈 Step2′误差反向反馈
输出层—>隐层 δ L = − ( t − a 1 ( 3 ) ) ⋅ a 1 ( 3 ) ( 1 − a 1 ( 3 ) ) \delta_L=-(t-a_1^{(3)})·a_1^{(3)}(1-a_1^{(3)}) δL=−(t−a1(3))⋅a1(3)(1−a1(3)) 隐层—>输入层 δ l = δ L ⋅ w ( 2 ) ⋅ a ( 2 ) ( 1 − a ( 2 ) ) \delta_l=\delta_L·w^{(2)}·a^{(2)}(1-a^{(2)}) δl=δL⋅w(2)⋅a(2)(1−a(2))
S t e p 3 ′ 权 值 更 新 Step 3'权值更新 Step3′权值更新 W ( 2 ) : = W ( 2 ) + η ⋅ δ L ⋅ a ( 2 ) W^{(2)}:=W^{(2)}+\eta·\delta_L·a^{(2)} W(2):=W(2)+η⋅δL⋅a(2) W ( 1 ) : = W ( 1 ) + η ⋅ δ l ⋅ X W^{(1)}:=W^{(1)}+\eta·\delta_l·X W(1):=W(1)+η⋅δl⋅X
① 感知机+sigmoid/logit函数——>逻辑回归
② 感知机+f(x)=wx+b线性函数——>线性回归
③ 三层网络+sigmoid/logit函数——>非线性回归
本文主要介绍了神经网络入门必须要了解的两个算法:感知机和BP神经网络。从人工神经网络的由来到感知机算法的原理、BP算法的原理及推导。
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split #用于数据分割
from sklearn.preprocessing import StandardScaler #做数据标准化
from sklearn.metrics import classification_report,confusion_matrix
import numpy as np
data = np.genfromtxt('data/wine_data.csv', delimiter=',')
data
x_data = data[:,1:]
y_data = data[:,0] #第一列是标签值
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
mlp = MLPClassifier(hidden_layer_sizes=(100, 50),max_iter=500)
mlp.fit(x_train, y_train)
predictions = mlp.predict(x_test)
print(classification_report(y_test, predictions))
print(confusion_matrix(y_test,predictions))