构建一个简单的人工神经网络

140 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

人工神经网络是进行机器学习的基础,模仿生物神经元的工作方式构建神经网络,让计算机拥有“自我学习“的能力。人工神经网络的诞生具有革命性的意义,”自我学习“是其最大的优点,通过适当的训练,它语音识别、图像识别、人机对话、大数据方面发挥的了巨大的作用。

神经网络的概念早在数十年前就已经提出来了,但限于当时计算机的计算能力,还无法应用。近些年来,随着计算机的计算能力大幅提升,机器学习兴起,导致神经网络的使用日益广泛。

目前最常用的构建神经网络的方法就是反向传播,当程序运算过一遍后,查看计算出的结果与理想结果之间的误差,通过反向传播算法让计算机优化人工神经元之间的权值(连接强度),然后再次计算结果,不断循环这一过程,经过一定次数的循环后,获得解将非常接近理想结果。

20200610115231940.png

这是一个非常简单的神经网络,分为三层,输入层(包含两个神经元i1、i2,截距项b1),隐含层(包含两个神经元h1、h2,截距项b2),输出层(o1,o2)。假设输入3对应输出映射0.2,输入8对应的是输出映射0.9。

20200610115252182.png

令i1=3,i2=8

o1=0.2,o2=0.9

我们把权值用w表示,通常我们会随机初始化权值。

初始化权值w1=0.15,w2=0.2,w3=0.25,w4=0.3,w5=0.4,w6=0.45,w7=0.5,w8=0.55。

初始化b1=0.35,b2=0.6

首先进行前向传播:

输入层——》隐含层——》输出层,下图为本例中神经元h1的结构:

20200610115310730.png

隐含层计算net:

neth1=w1i1+w2i2+b1

neth2=w3i1+w4i2+b1 计算out: outh1=sigma(neth1) outh2=sigma(neth2)

(其中sigma函数是常用的激活函数之一,此外还有tanh(),sigma(x)=1/(1+e^(-x)))

输出层计算net:

neto1=w5outh1+w6outh2+b2

neto2=w7outh1+w8outh2+b2 计算out: outo1=sigma(neto1)

outo2=sigma(neto2)

计算总误差:

Eo1=0.5*(o1-outo1)*(o1-outo1)

Eo2=0.5*(o2-outo2)*(o2-outo2)

Etotal=Eo1+Eo2

(其中Etotal代表总误差,Eo1代表神经元o1输出的值与理想值o1得误差,Eo2代表神经元o2输出的值与理想值o2得误差)

反向传播:

delta_o1=-(o1-outo1)*sigma_da(outo1)

delta_o2=-(o2-outo2)*sigma_da(outo2)

(delta_o1,delta_o2分别为neth1,neth2值对整体的误差)

dw1=sigma_da(outh1)i1(delta_o1w5+delta_o2w7)

dw2=sigma_da(outh1)i2(delta_o1w5+delta_o2w7)

dw3=sigma_da(outh2)i1(delta_o1w6+delta_o2w8)

dw4=sigma_da(outh2)i2(delta_o1w6+delta_o2w8)

(dw1,dw2,dw3,dw4分别是w1~w4对整体的偏导)

w1-=alpha*dw1

w2-=alpha*dw2

w3-=alpha*dw3

w4-=alpha*dw4

(w1~w4为更新后的权值,alpha是学习率,自定义)

dw5=delta_o1*outh1

dw6=delta_o1*outh2

dw7=delta_o2*outh1

dw8=delta_o2*outh2

(dw5-dw8为w5-w8对整体的偏导)

w5-=alpha*dw5

w6-=alpha*dw6

w7-=alpha*dw7

w8-=alpha*dw8

(w5~w8为更新后的权值)

循环一次:

outo1=0.802745098356

outo2=0.830938316533

(训练一次后,结果与理想值还有很大误差,理想值:o1=0.2,o2=0.9)

循环40次:

outo1=0.222343700362

outo2=0.879218779053

(训练40次后,结果已经比较接近理想值了,理想值:o1=0.2,o2=0.9)

循环200次:

outo1=0.199989353333

outo2=0.898828168138

(训练200次后,结果变得极其接近理想值,最大误差不超过0.002,理想值:o1=0.2,o2=0.9)

现在,这个简单的神经网络已可以根据输入值3、8, 预测出输出值0.2、0.9。如果还想要处理更加复杂的神经网络,就需要增加更多的隐含层,这就叫深度学习,通过更多层的神经网络来实现机器学习。目前国际上的一些神经网络已经达到了一千多层。

下面是其中一些公式的推导:

20200610115332175.jpg

20200610115336718.jpg