什么?神经网络还能创造新知识?

作者: 读芯术 2019-07-02 13:37:23

神经网络(NNs)可以在不知道用显式算法执行工作的情况下被设计和训练于特定的任务,很多人都对此表示惊叹。例如,著名的手写体数字识别教程很容易执行,但其背后的逻辑还是隐藏在神经网络下,仅能通过层次化结构、权值和激活函数略知一二。

神经网络

图片来源:Unsplash

本文通过神经网络透明原则来揭示其“黑盒知识”,为此来检验一个布尔异或函数的神经网络。首先,利用已知异或属性过程构造了一个自底向上的神经网络,即清晰包含已知的代数关系。在第二步中使用TensorFlow Keras从简易图形化编程工具到异或逻辑运算训练神经网络。

***比较两种方法。将Keras神经网络分解为布尔组件,发现逻辑设置与***步中构造的神经网络不同。被训练的神经网络发现了使用不同布尔函数的另一种异或运算表示方法。

这另一种异或公式在数学领域不是未知的,但至少很新奇。这或许表明神经网络可以创造新的知识。但要提取它,必须能够将神经网络的设置和参数转化为显式规则。

自底向上构造异或运算神经网络(XOR NN)

异或运算是由映射定义的布尔函数,

  1. XOR (0,0) = XOR (1,1) = 0 
  2. XOR (1,0) = XOR (0,1) = 1 

为异或运算构造一个已知的神经网络或谷歌标识列

  1. XOR (x,y) = AND ( NAND (x,y) , OR (x,y) ) 

这很有帮助,因为操作符AND、NAND(而非AND)和OR是众所周知的,并且都可以用简单的神经网络来表示,其中有2个输入和1个输出结点、偏移量和sigmoid激活函数。

神经网络

布尔函数操作符的神经网络

在此基础上可通过连接NAND、AND和OR的NNs来构造异或运算神经网络。所以异或变成了一个三层神经网络。

异或运算的神经网络

异或运算的神经网络

输送可能的输入配置并检查输出(本文使用Excel工作表)。分别得到有效的(0,0)、(1,1)的0.0072以及(0,1)、(1,0)的0.9924。

可以用以下异或运算的表示来建构其他的神经网络:

  1. XOR (x,y) = OR ( AND ( NOT(x) , y ) , AND ( x , NOT(y) ) ) 
  2. XOR (x,y) = NAND ( NAND ( x , NAND ( x,y) ) , NAND ( y , NAND ( x,y) ) ) 

然而这些标识列导致了更复杂的网络。

此外,由于异或运算不能通过线性可分(且激活函数严格单调),因此,不可能建立两层的神经网络。

但也许还有其他方法可以构建异或运算的神经网络呢?下一节将通过训练神经网络来寻找另一种解决方案。

使用TensorFlow Keras构建异或神经网络

Keras是一个功能强大且易于使用的神经网络库。上一节中建立了一个三层的2-2-1模型,并与之前建构的神经网络进行了比较。

使用梯度下降优化器与学习率1和均方误差损失函数的误差反向传播,这是建构神经网络的标准方法。

以下是Python的代码片段:

  1. # Generate NN for XOR operation 
  2. # input layer: <NODES> nodes, one for each bit (0 = false and +1 = true
  3. # output layer: 1 node for result (0 = false and +1 = true
  4. # Use sigmoid activation function, gradient descent optimizer and mean squared error loss function 
  5. # Last update: 28.05.2019 
  6.   
  7. import tensorflow as tf 
  8. import numpy as np 
  9. import matplotlib.pyplot as plt 
  10.   
  11. # Define model 
  12. nodes = 2 
  13. model = tf.keras.Sequential() 
  14. model.add(tf.keras.layers.Dense(nodes, input_dim=2activation=tf.nn.sigmoid)) 
  15. model.add(tf.keras.layers.Dense(1, activation=tf.nn.sigmoid)) 
  16. model.compile(optimizer=tf.train.GradientDescentOptimizer(1), loss=tf.keras.losses.mean_squared_error, metrics=['binary_accuracy']) 
  17. model.summary() 
  18.   
  19. # Generate train & test data 
  20. epochs = 10000 
  21. data_in = np.array([[0,0],[0,1],[1,0],[1,1]]) 
  22. data_out = np.array([0,1,1,0]) 
  23.   
  24. # Train model 
  25. history = model.fit(data_in, data_out, epochsepochs=epochs, verbose=0
  26.   
  27. # Analysis of training history 
  28. for key in history.history.keys(): 
  29.     plt.scatter(range(epochs), history.history[key], s=1
  30.     plt.ylabel(key) 
  31.     plt.xlabel('epochs') 
  32.     plt.show() 
  33.   
  34. # Predict with model 
  35. result = model.predict(data_in) 
  36.   
  37. # Print results 
  38. def printarray(arr): 
  39.     return np.array2string(arr).replace('\n','') 
  40.   
  41. print() 
  42. print('input', printarray(data_in)) 
  43. print('output (calculation)', printarray(data_out)) 
  44. print('output (prediction) ', printarray(result)) 
  45. print('output (pred. norm.)', printarray(np.round(result))) 
  46.   
  47. # Get weights of model 
  48. print() 
  49. print(model.get_weights()) 

异或运算的好处是可以训练整个参数空间,因为只有四种可能的配置可以教。然而,需要一些在神经网络中传递数据集的过程来驱动模型达到零损耗和100%精准,即输出趋向于一个分别是(0,1)、(1,0)和(0,0)、(1,1)的零。

异或运算神经网络的Loss和epochs对比

异或运算神经网络的Loss和epochs对比

异或运算神经网络的Accuracy 和epochs对比

异或运算神经网络的Accuracy 和epochs对比

然而,训练期也可能陷入停滞,无法衔接。接着精准度停止在75%甚至50%,即一个或两个二元元组的映射是不正确的。在这种情况下就要重新构建神经网络,直到得到合适的解决方案。

分析和结论

现在验证Keras神经网络是否与建构的具有相似结构。通过返回权值(参见代码片段的末尾),得到了权值和偏差值。

Python的脚本输出

Python的脚本输出

使用这些参数来重建神经网络(再次使用Excel)。由三个操作符组成。

基于Keras训练的异或运算神经网络

基于Keras训练的异或运算神经网络

通过输入所有可能的配置,可以识别与H1、H2和O操作符关联的布尔函数。

Keras在异或运算神经网络中的布尔函数

Keras在异或运算神经网络中的布尔函数

有趣的是,本以为Keras 神经网络与所建构的逻辑是一样的,但它却创建了另一种解决方案。使用OR,AND和(相对没人知道的)INH,而非操作符NAND, OR 和AND,即神经网络找到的公式。

  1. XOR (x,y) = INH ( OR (x,y), AND (x,y) ) 

这表明神经网络可以获得以前没有的知识!当然“新知识”是相对的,并且取决于知道的程度。也就是说,若一个人知道异或运算的所有表示形式,Keras 神经网络就不会有其他价值。

此外,对于更复杂的神经网络,将权值转换为显式算法或公式并不容易。但也许这种专业知识是未来人工智能专家必须具备的能力。

神经网络 运算 Python
上一篇:JavaScript教程:为Web应用程序添加人脸检测功能 下一篇:求职网站Indeed统计:AI 招工速度放缓,求职者兴趣下降
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

为什么用Go编写机器学习的基础架构,而不是Python?

虽然Python是使用广泛的语言,并用于每个主要的机器学习框架中。然而,你能想象?在Cortex(将机器学习模型部署为API的开放源代码平台之一)代码库中,87.5%的代码都是使用GO编写。

读芯术 ·  2020-02-14 13:13:04
神经网络技术帮自主驾驶汽车识别幻影物体

以色列本古里安大学内盖夫网络安全研究中心的研究人员表示,在道路上投影图像形成幻影物体,可导致行驶中的半自主或全自主驾驶汽车误判并急刹车,从而危及车内驾驶员和乘客的生命。他们正在研究的神经网络技术,将解决自主驾驶汽车无法识别幻影物体的缺陷。

毛黎 ·  2020-02-07 13:33:13
Golang还是Python?哪种语言更适合AI?

Google所开发的Golang正在成为机器学习和AI的主流编程语言,全球已有数百万用户。那么很多IT技术人员肯定会有这样的疑问,前些年火起来的Python在科学计算及AI领域也有广泛应用,那么这两者今后谁才是AI的菜呢?

橘子键盘手 ·  2020-02-07 12:55:29
从事数据科学工作需要掌握哪些技能?

本文通过国外KDnuggets论坛上Simplilearn的统计结果和国内某知名招聘网站的招聘要求信息进行分析,详细介绍在数据科学的工作中,需要掌握哪一些技能以及工具,以及当下数据科学工作中,哪些技能和工具是从业人员的学习首选。

CDA数据分析师 ·  2020-01-09 17:28:39
Python实现识别图片中的所有人脸并显示出来

本文介绍一下使用Python3实现识别图片中的所有人脸并显示出来,让我们一起来看一下。

佚名 ·  2019-12-31 15:20:43
二次元少女生成器、会开车的神经网络...2019年优秀的17个机器学习项目

为了挑选出2019年优秀的开源项目,最近某位Medium网友整理了2019年Reddit机器学习板块热门高赞项目资源汇总,一起来看看都有哪些项目上榜。

猿妹 ·  2019-12-25 14:29:35
避免神经网络过拟合的5种技术

最近一年我一直致力于深度学习领域。这段时间里,我使用过很多神经网络,比如卷积神经网络、循环神经网络、自编码器等等。我遇到的最常见的一个问题就是在训练时,深度神经网络会过拟合。

THU数据派 ·  2019-12-20 09:15:48
诠释图形处理器(GPU)和神经网络加速器芯片如何为汽车应用提供智能优势

汽车行业是推动人工智能(AI)发展的重要行业之一,这是因为该行业致力于自动驾驶汽车和高级驾驶员辅助系统(ADAS)的泛在利益。

Imagination Technologies汽车产品部总监Bryce Johnst ·  2019-12-18 14:00:33
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载