神经网络有着强大的函数表示能力,只要它具有合适的层数。神经网络可以拟合任何线性或者非线性的函数,而且可以通过学习或者自身一系列所需的参数。我们都知道,神经网络的输入层输入的是数据的原始特征,经过中间隐藏层一系列的近似于“黑盒”的计算,其中每一层都是利用前一层的特征进行计算得到新的特征,最终我们在输出层可以得到对应的结果。我们可以用几个简单例子来更好的理解神经网络的一些工作原理。
神经网络中,单层神经元(无隐含层)的计算可用来表示逻辑运算,比如逻辑与AND和逻辑或OR,输入层的特征为要计算的两个逻辑值,输出层自然是运算后的逻辑值。
我们可以用这样的一种神经网络模型来计算逻辑与AND:
其中,x1和x2取值于集合{ 0, 1 },函数Y = x1 AND x2 。
我们可以使用这样的一组参数 θ0 =-30, θ1 =20, θ2 =20来表示训练后的神经网络参数,于是,我们的输出函数为hθ(x) = g(-30 + 20 * x1 + 20 * x2 ),其中g(x)为sigmoid函数。
我们可以做一个实验,尝试一下每一种的逻辑与运算的结果是否和实际情况相符合。设x1为0,x2为0,那么y=g(-30)结果趋近于0,二分之后归为类别0;设x1为0,x2为1,那么y=g(-10)结果同上;设x1为1,x2也为1,那么y=g(10)结果趋近于1,二分之后归为类别1。我们可以看到这样一来,完全实现了一个逻辑运算与AND。
同样我们可以实现逻辑运算或OR,简单起见我们只将上述的θ0 =-30的值改为-10,那么同理,我们可以验证出这种模型实现了一个逻辑或OR运算。我们也可以通过更改参数实现一个逻辑非NOT运算,只需要θ0 =10,θ1 =-20。
二元逻辑运算通过输入布尔值(0或1)作为特征,使用一个单一的激活层就可以实现逻辑运算,对于不同的运算符,我们只需要选择不同的权重即可。
当然,没有隐含层的神经网络不能很好的表示异或运算或者更复杂的逻辑运算式,但是这个不是问题,我们只需要构造含有隐含层的神经网络即可。比如异或运算XOR,逻辑表达式可以用AND、OR和NOT来实现:( x1 AND x2 )OR ( ( NOT x1 ) AND ( NOT x2 ) ),我们可以通过上述表达式模型进行组合而成。按照这种方法,我们可以构造出越来越复杂的函数,解决一些更复杂的问题,这就是神经网络的厉害之处。
当我们要实现一些多类别的分类问题的时候,仅有一个神经元的神经网络是不能满足要求的,我们需要根据要分类的数量设定满足这一数量的神经网络模型。如果我们要实现一个图像识别,识别是猫还是狗或者是车子和房子等,我们就需要至少4个输出层的神经元,每一个单元代表一种类别,输入层可以是图像的像素点的灰度值。如果输入图像是20*20尺寸那么我们需要400个输入层神经元,外加每层500单元的2个隐含层,然后进行模型训练,最终我们可以得到一个训练好的机器学习模型,当然模型的效果怎么样就需要我们多方面地去做一些检验了。
参考资料:
【机器学习-斯坦福大学|Couresra】
写在最后:
鉴于本人水平有限,如果文章中有什么错误之处,欢迎指正,非常感谢。
版权声明本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。本文地址: https://blog.ailemon.net/2017/03/04/machine-learning-neural-network-samples/ All articles are under Attribution-NonCommercial-ShareAlike 4.0 |