神经网络极简入门
神经网络极简入门
神经网络是深度学习的基础,正是深度学习的兴起,让停滞不前的人工智能再一次取得飞速的发展。本文将带你从零开始了解神经网络的基本概念,并通过一个简单的案例来展示神经网络的工作原理。
神经网络是什么
神经网络就像人脑一样,整体看上去非常复杂,但是其基础组成部分并不复杂。其组成部分中最重要的就是神经元、sigmoid函数和层。
神经元
神经元是神经网络最基本的元素,一个神经元包含3个部分:
- 获取输入:获取多个输入的数据
- 数学处理:对输入的数据进行数学计算
- 产生输出:计算后多个输入数据变成一个输出数据
从上图中可以看出,神经元中的处理有2个步骤。
第一个步骤:从蓝色框变成红色框,是对输入的数据进行加权计算后合并为一个值(N)。
[N = x_1w_1 + x_2w_2]
其中,(w_1,w_2)分别是输入数据(x_1,x_2)的权重。
一般在计算N的过程中,除了权重,还会加上一个偏移参数b,最终得到:
[N = x_1w_1 + x_2w_2+b]
第二个步骤:从红色框变成绿色框,通过sigmoid函数是对N进一步加工得到的神经元的最终输出(M)。
sigmoid函数
sigmoid函数也被称为S函数,因为的形状类似S形。它是神经元中的重要函数,能够将输入数据的值映射到(0,1)之间。最常用的sigmoid函数是(f(x)=\frac{1}{1+e^{-x}}),当然,不是只有这一种sigmoid函数。
至此,神经元通过两个步骤,就把输入的多个数据,转换为一个(0,1)之间的值。
层
多个神经元可以组合成一层,一个神经网络一般包含一个输入层和一个输出层,以及多个隐藏层。
比如上图中,有2个隐藏层,每个隐藏层中分别有4个和2个神经元。实际的神经网络中,隐藏层数量和其中的神经元数量都是不固定的,根据模型实际的效果来进行调整。
网络
通过神经元和层的组合就构成了一个网络,神经网络的名称由此而来。神经网络可大可小,可简单可复杂,不过,太过简单的神经网络模型效果一般不会太好。因为一只果蝇就有10万个神经元,而人类的大脑则有大约1000亿个神经元,这就是为什么训练一个可用的神经网络模型需要庞大的算力,这也是为什么神经网络的理论1943年就提出了,但是基于深度学习的AlphaGO却诞生于2015年。
实现一个神经网络
了解上面的基本概念只能形成一个感性的认知。下面通过自己动手实现一个最简单的神经网络,来进一步认识神经元,sigmoid函数以及隐藏层是如何发挥作用的。
准备数据
数据使用sklearn库中经典的鸢尾花数据集,这个数据集中有3个分类的鸢尾花,每个分类50条数据。为了简化,只取其中前100条数据来使用,也就是取2个分类的鸢尾花数据。
实现神经元
准备好了数据,下面开始逐步实现一个简单的神经网络。首先,实现最基本的单元--神经元。本文第一节中已经介绍了神经元中主要的2个步骤,分别计算出N和M。计算N时,依据每个输入元素的权重((w_1,w_2))和整体的偏移b;计算M时,通过sigmoid函数。
实现神经网络
神经元实现之后,下面就是构建神经网络。我们的输入数据是带有4个属性(花萼的宽度和长度,花瓣的宽度和长度)的鸢尾花数据,所以神经网络的输入层有4个值((x_1,x_2,x_3,x_4))。为了简单起见,我们的神经网络只构建一个隐藏层,其中包含3个神经元。最后就是输出层,输出层最后输出一个值,表示鸢尾花的种类。由此形成的简单神经网络如下图所示:
训练模型
上面的神经网络中各个神经元的中的参数(主要是weights和bias)都是随机生成的,所以直接使用这个神经网络,效果一定不会很好。所以,我们需要给神经网络(MyNeuronNetwork类)加一个训练函数,用来训练神经网络中各个神经元的参数(也就是个各个神经元中的weights和bias)。我们使用随机梯度下降算法来训练模型的参数。
此外,再实现一个预测函数predict,传入测试数据集,然后用我们训练好的神经网络模型来预测测试数据集的标签。
验证模型效果
最后就是验证模型的效果。运行结果可以看出,模型的效果还不错,20条测试数据的预测结果都正确。
总结
本文中的的神经网络示例是为了介绍神经网络的一些基本概念,所以对神经网络做了尽可能的简化,为了方便去手工实现。而实际环境中的神经网络,不仅神经元的个数,隐藏层的数量极其庞大,而且其计算和训练的方式也很复杂,手工去实现不太可能,一般会借助TensorFlow,Keras和PyTorch等等知名的python深度学习库来帮助我们实现。