神经网络原理&一个简单的神经网络模型搭建

神经网络基本原理


前言

神经网络是一门重要的机器学习技术,它是目前最为火热的研究方向----深度学习的基础。本文以一个生活中的小场景切入,不去调用别人训练好的神经网络模型,手撸每一行代码,详细的介绍了人工神经网络的本质基本原理。


一、神经网络是什么?

神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

1.1 神经网络的分类

  • 前馈神经网络:在网络中,当前层的输入只依赖于前一层的节点输出,与更早的网络输出状态无关;
  • 反馈神经网络:将输出经过一步时移再接入到输入层,输入不仅仅取决于上一层节点的输出

在这里插图片描述

图1-1 神经网络的分类

1.2 神经网络结构图

一个经典的神经网络,一般包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是中间层(也叫隐藏层)。输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。

图1-2 神经网络结构图

几点说明:

1️⃣ 设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
2️⃣ 神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
3️⃣ 结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。

1.3 神经元

下图为生物神经网络中一个神经元。
在这里插入图片描述

图1-3 生物神经元基本结构图

我们的人工神经网络也可以类比生物神经网络,神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。

下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。中间的箭头线称为“连接”,每个箭头线上都有一个“权值”。一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。

在这里插入图片描述

图1-4 神经元计算

我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成aw,因此在连接的末端,信号的大小就变成了aw,最终神经元计算得到的输出信号z=g(a1w1+a2w2+a3*w3)。

1.4 为什么神经网络能预测?

从宏观上来理解:根据历史数据(即训练集),利用神经网络,建立从输入到输出之间的映射关系,并且假定该映射关系在未知的预测集上也同样成立,从而在给定预测集输入的基础上给出输出,实现预测。

具体到上图的神经元模型就是利用三个已知属性的值a1,a2,a3,通过神经元计算公式,计算出未知属性的值z。这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3(训练集训练得到的)。那么,在遇到未知数据集时,我们就可以输入未知数据集的特征(已知属性a1,a2,a3),通过神经元模型预测新样本的目标(未知属性z)。

二、 一个最简单的神经网络模型

人脑中的神经网络是一个非常复杂的组织,成人的大脑中估计有1000亿个神经元之多。今天我们只用一个神经元对案例中的问题进行信息处理。

1.去不去爬山?

为了能说清楚神经网络的本质和实际意义,我们首先引入生活中的一个场景——去不去爬山?
小A、小B、小C、小D是登山爱好者,经常相约一起去爬山。我们用数字“1”表示去爬山了,数字“0”表示没去爬山,前五次的结果如下表:

小A小B小C小D
0101
1101
1010
0010
0111

今天四个人又相约去爬山,结果如下:

小A小B小C小D
010

现在我们根据上面的几组数据找一下规律,预测下小D今天去不去爬山呢?

我们可能已经发现了,小D是不是喜欢小B呢?因为每次小B去,小D也会去。今天小B决定去爬山,所以我们预测小D也会去爬山。刚刚我们动用了1000亿个神经元的人脑神经网络对上述问题进行信息收集、处理和计算,最终得到小D会去爬山的结果,待会我们用只有一个神经元的人工神经网络对上述问题进行预测。

2.案例代码

针对上述问题,我们构建一个最简单的神经网络对小D今天是否去爬山做个预测。

2.1 引入类库

from numpy import array,exp,random,dot

2.2 创建数据

然后创建一个矩阵X,将小A、小B、小C三个人前五次的数据放到矩阵中去;创建一个装置矩阵y,将小D前五次的数据放到矩阵中去。注意矩阵X是3x5的,所以这里需要将1x5的矩阵y转置一下成5x1的矩阵,才能进行矩阵运算。

X = array([[0,1,0],[1,1,0],[1,0,1],[0,0,1],[0,1,1]])
y = array([[1,1,0,0,1]]).T

2.3 初始假设

下面利用随机数做一个假设,假设小D去不去爬山与小A、小B、小C三人去不去爬山的相关关系的数值(权重)为weights。

random.seed(1)
weights = 2 * random.random((3,1))-1

2.4 神经元计算

接下来进入循环,使用假设的weights算出output(output数值越接近“0”,代表小D去不去爬山的可能性越大,output数值越接近“1”,代表小D去爬山的可能性越大),前五次小D的数据y - 利用假设关系得到的output数值=得到误差 error,通过循环不断调整假设关系weights,减小误差,最终得到误差最小的一组关系系数weights。

for it in range(100000):
    output = 1/(1+exp(-dot(X,weights)))
    error = y - output
    delta = error * output *(1-output)
    weights += dot(X.T,delta)

2.5 运行结果

为了便于理解中间数据的计算过程,这里我们可以打印下“error”和“weights”的计算结果
最后根据上面得到的关系系数weights,预测今天(第六次)小D去爬山的概率

print("误差为:\n",error)
print("相关系数为:\n",weights)
climbing_probability = 1/(1+exp(-dot([[0,1,0]],weights)))
print("小D会去爬山的概率为:\n",climbing_probability)

运行结果如下:
在这里插入图片描述

图2-1 运行结果图

可以看出小D去不去爬山与小A去不去爬山的相关系数为-1.5662,与小B去不去爬山的相关系数为11.31693,与小C去不去爬山的相关系数为-5.56755,小D今天(第六次)去爬山的概率为0.999。

2.6 小结

上述过程可以概述为以下几个步骤:
在这里插入图片描述

图2-2 代码流程

3.神经网络的自我学习

对于上述问题,我们经过简单的分析我们也可以写下面一段程序,同样也可以准确预测小D今天(第六次)去不去爬山。

if(小B去)
	小D去
else
	小D不去

这样一看,好像这种方法更简单呢。但是这种代码是死的,不会根据数据的变化自我学习。如果数据集变成下面这样的:

小A小B小C小D
0100
1101
0001
0010
1011
010

通过我们人脑神经网络分析,小D好像移情别恋喜欢上小A了,因为小D去不去爬山跟小A去不去爬山的关系非常大,跟小B去不去爬山几乎没什么关系,而今天(第六次)小A不去爬山,从而我们预测今天(第六天)小D也不去爬山。所以上述简单的if,else判断程序很显然就不适用于新场景了,那么神经网络是如何自我学习的呢?

我们把数据集替换下,新数据集下神经网络预测的结果是否和我们人脑预测的一致呢?

from numpy import array,exp,random,dot
X = array([[0,1,0],[1,1,0],[0,0,0],[0,0,1],[1,0,1]])
y = array([[0,1,1,0,1]]).T
random.seed(1)
weights = 2 * random.random((3,1))-1
for it in range(100000):
    output = 1/(1+exp(-dot(X,weights)))
    error = y - output
    delta = error * output *(1-output)
    weights += dot(X.T,delta)
climbing_probability = 1/(1+exp(-dot([[0,1,0]],weights)))
print("误差为:\n",error)
print("相关系数为:\n",weights)
print("小D会去爬山的概率为:\n",climbing_probability)

预测结果如下:

在这里插入图片描述

图2-3 新数据集预测结果图

可以看出,即使替换了数据集,神经网络因为具有自我学习的能力,所以仍然具有很好的预测效果。

总结

各位的鼓励就是我创作的最大动力,如果哪里写的不对的,欢迎评论区留言进行指正,如有收获请给博主一个免费的赞鼓励下呗📝

————————————————
版权声明:本文为CSDN博主「放点花椒~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/N2O_666/article/details/113992551

  • 25
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放点花椒~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值