神经网络模型的统计学具现
之前写过一篇文章,把神经网络模型定义为就是对数据的多维度、多层次的统计学曲线计算过程,本文将具现一个简单的例子来描述这个过程。
目前有A、B、C、D四个物体,已知如下信息,这些信息其实可以看作是训练的数据。
D + A = 3
D + B = 5
D + C = 4
A + C = 5
B + C = 7
训练之后,期待模型能够自动计算任意两个字母相加等于几?
为了更好的说明这个过程,上面并没有给出冗余的和错误的学习信息量,从方程式来看,它其实具有唯一解A=2、B=4、C=3、D=1,但本文不从逻辑思维来解答这个题目,而是从统计学方法上来解答这个题目。
假设每个字母只有一个纬度的信息量,假设A=1、B=2、C=3、D=4,这个类似神经网络模型,对输入的信息进行信息纬度的分类。
而后采用神经网络的一层算法,我们知道D+A在已有的属性数值下,不可能等于3,所以要对属性数值进行变化,先简单的采用一个二次函数进行变化,定义本层如下的变换函数:
from scipy.optimize import curve_fitdef func_2(X, a, b, c):x, y = X return (a*x*x+b*x+c)+(a*y*y+b*y+c)x=[4,4,4,1,2]
y=[1,2,3,3,3]
z=[3,5,4,5,7]popt, pcov = curve_fit(func_2, (x,y), z, p0=[1,1,1])print(popt)
运行上面的代码,能够得到统计学上最小结果误差的a,b,c的值:[-1. 4.69230767 -1.76923074]
所以这一层的转换函数为z=-(x*x+y*y)+4.69230767*(x+y)-2*1.76923074
把已知的几个xy代入可得如下结果:
3=z=-(4*4+1*1)+4.69230767*(4+1)-2*1.76923074=2.923
5=z=-(4*4+2*2)+4.69230767*(4+2)-2*1.76923074=4.615
4=z=-(4*4+3*3)+4.69230767*(4+3)-2*1.76923074=4.307
5=z=-(1*1+3*3)+4.69230767*(1+3)-2*1.76923074=5.230
7=z=-(2*2+3*3)+4.69230767*(2+3)-2*1.76923074=6.923
评估计算:6=A+B=-(1*1+2*2)+4.69230767*(1+2)-2*1.76923074=5.538
可以看到,通过统计学评估出来的参数,能够让答案和真实接近,但是无法完全正确,那么具体往下的介绍,才是神经网络模型的核心。
如何选择合适的函数,也就是把信息量如何进行变换,才能让结果更接近真实,下面我们更换一个函数:
from scipy.optimize import curve_fitdef func_3(X, a, b, c, d):x, y = X return a*(x*x*x+y*y*y)+b*(x*x+y*y)+c*(x+y)+2*dx=[4,4,4,1,2]
y=[1,2,3,3,3]
z=[3,5,4,5,7]popt, pcov = curve_fit(func_3, (x,y), z, p0=[1,1,1,1])print(popt)
运行上面的代码,能够得到统计学上最小结果误差的a,b,c的值:[ 0.33333333 -3.5 10.16666667 -5. ]
那么转换函数为z=0.33333333*(x*x*x+y*y*y)-3.5*(x*x+y*y)+10.16666667*(x+y)-2*5
把已知的几个xy代入可得如下结果:
3=z=0.33333333*(4*4*4+1*1*1)-3.5*(4*4+1*1)+10.16666667*(4+1)-2*5=2.9999997
5=z=0.33333333*(4*4*4+2*2*2)-3.5*(4*4+2*2)+10.16666667*(4+2)-2*5=4.9999997
4=z=0.33333333*(4*4*4+3*3*3)-3.5*(4*4+3*3)+10.16666667*(4+3)-2*5=3.9999997
5=z=0.33333333*(1*1*1+3*3*3)-3.5*(1*1+3*3)+10.16666667*(1+3)-2*5=4.99999992
7=z=0.33333333*(2*2*2+3*3*3)-3.5*(2*2+3*3)+10.16666667*(2+3)-2*5=6.9999999
评估计算:6=A+B=0.33333333*(1*1*1+2*2*2)-3.5*(1*1+2*2)+10.16666667*(1+2)-2*5=5.99999998
可以看到,通过这个三次函数统计学评估出来的参数,能够让答案和真实基本一致。
所以,如何定义函数,取决了定义模型的人,对数据维度信息和意义的了解,并且能够把这种了解转换到函数,是模型定义的根本。
以上只是描述了连续函数和单一信息量,而对于现实中的实际模型,还会出现非连续函数以及多信息纬度(上百上千的维度)的情况,在这种情况下,作为一个神经网络模型定义师,需要能够有效的定义函数,并定义这个函数的输入信息量。
如果采用非连续函数,只需要对数字1234到对应数字的转换,一个非连续函数即可,数据准确度可以达到100%。
以上是通过一个简单二元曲线,通过一个三次函数,模拟了一个简单的神经网络层,通过统计函数完成了训练,并使用训练参数,对新的预期计算得到了正确的结果。
希望本文能让各位对神经网络模型有进一步的认识。虽然真实使用会更复杂,但它的核心其实就是最优的函数统计系数。
神经网络模型师,划分输入信息维度,定义各层的计算函数,通过训练,把这个函数的几万到几亿个的参数统计优化出来,而模型的推理,则是基于这些系数和函数,把输入转化到输出,从而得到结果。