神经网络(NN)令人惊奇的是,在不知道执行工作的明确算法的情况下,它们如何针对特定任务进行设计和训练。比如著名的手写数字识别教程实现起来很简单,但是其背后的逻辑仍然隐藏在神经网络之下,只能通过层级结构、权重和激活函数知道一点点。图片来源:Unsplash本文通过神经网络透明性原理揭示其“黑盒知识”,考察一个布尔异或函数的神经网络。首先,使用已知的XOR属性过程构建自下而上的神经网络,即明确包含已知的代数关系。第二步,使用TensorFlowKeras训练神经网络,从简单的图形化编程工具到XOR逻辑运算。***比较两种方法。将Keras神经网络分解为布尔组件表明逻辑设置与第一步构建的神经网络不同。经过训练的神经网络使用不同的布尔函数发现了异或运算的替代表示。这个异或公式在数学领域并不陌生,但至少是新颖的。这可能表明神经网络可以创造新知识。但要提取它,必须能够将神经网络的设置和参数转化为明确的规则。自下而上构建异或神经网络(XORNN)异或运算是通过映射定义的布尔函数,XOR(0,0)=XOR(1,1)=0XOR(1,0)=XOR(0,1)=1为XOR(x,y)=AND(NAND(x,y),OR(x,y))构造一个已知的神经网络或googleidentity列这很有用,因为运算符AND,NAND(notAND)和OR是众所周知的,都可以用具有2个输入和1个输出节点、偏移量和sigmoid激活函数的简单神经网络来表示。布尔函数运算符的神经网络可以在此基础上连接NAND、AND、OR的神经网络,构建异或运算神经网络。所以异或就变成了一个三层神经网络。XORed神经网络提供可能的输入配置并检查输出(本文使用Excel工作表)。(0,0)、(1,1)的有效值为0.0072,(0,1)、(1,0)的有效值为0.9924。可以使用以下XOR表示构造其他神经网络:XOR(x,y)=OR(AND(NOT(x),y),AND(x,NOT(y)))XOR(x,y)=NAND(NAND(x,NAND(x,y)),NAND(y,NAND(x,y)))但是,这些标识列会导致更复杂的网络。另外,由于异或运算不能线性可分(并且激活函数是严格单调的),因此无法构建两层神经网络。但也许还有其他方法可以构建XORed神经网络?下一节将通过训练神经网络寻找另一种解决方案。使用TensorFlowKeras构建XOR神经网络Keras是一个功能强大且易于使用的神经网络库。在上一节中,建立了一个三层的2-2-1模型,并与之前构建的神经网络进行了比较。使用学习率为1的梯度下降优化器和均方误差损失函数的误差反向传播,这是构建神经网络的标准方法。以下是Python的代码片段:#GenerateNNforXORoperation#inputlayer:nodes,oneforeachbit(0=falseand+1=true)#outputlayer:1nodeforresult(0=falseand+1=true)#Usesigmoidactivationfunction,gradientdescentoptimizerandmeansquarederrorlossfunction#Lastupdate:28.05.2019importmatlibploastpitensorflow.pyplotasplt#Definemodelnodes=2model=tf.keras.Sequential()model.add(tf.keras.layers.Dense(nodes,input_dim=2,activation=tf.nn.sigmoid))model.add(tf.keras.layers.Dense(1,activation=tf.nn.sigmoid))model.compile(optimizer=tf.train.GradientDescentOptimizer(1),loss=tf.keras.losses.mean_squared_error,metrics=['binary_accuracy'])model.summary()#Generatetrain&testdataepochs=10000data_in=np.array([[0,0],[0,1],[1,0],[1,1]])data_out=np.array([0,1,1,0])#Trainmodelhistory=model.fit(data_in,data_out,epochsepochs=epochs,verbose=0)#Analysisoftraininghistoryforkeyinhistory.history.keys():plt.scatter(range(epochs),history.history[键],s=1)plt.ylabel(键)plt.xlabel('epochs')plt.show()#Predictwithmodelresult=model.predict(data_in)#Printresultsdefprintarray(arr):returnnp.array2string(arr).replace('\n','')print()print('输入',printarray(data_in))print('output(calculation)',printarray(data_out))print('output(prediction)',printarray(result))print('output(pred.norm.)',printarray(np.round(result)))#Getweightsofmodelprint()print(model.get_weights())XOR操作的好处是可以训练整个参数空间,因为只有四种可能的配置可以教但是,一些传递的数据是神经网络中需要设置过程来驱动模型达到零损失和100%的准确率,即输出趋于零即(0,1)、(1,0)和(0,0),(1,1)分别。XOR神经网络的损失和epochsvs.XOR神经网络的Accuracy和epochs然而,训练周期也可能停滞和无法连接。那么准确率就停在了75%甚至50%,也就是说,一两个dyads的映射是不正确的。在这种情况下,需要重建神经网络,直到得到合适的解。分析与结论现在验证Keras神经网络是否与构建的神经网络具有相似的结构。通过返回权重(见代码片段末尾),得到权重值和偏差值。Python脚本输出使用这些参数重建神经网络(再次使用Excel)。由三个运算符组成。Keras训练的XOR神经网络通过输入所有可能的配置来识别与H1、H2和O运算符关联的布尔函数。XOR神经网络中的Keras布尔函数有趣的是,Keras神经网络应该与构建的逻辑相同,但它创建了另一个解决方案。使用OR、AND和(相对未知的)INH代替运算符NAND、OR和AND,神经网络找到的公式。XOR(x,y)=INH(OR(x,y),AND(x,y))这说明神经网络可以获得之前没有的知识!当然“新知”是相对的,要看知道的程度。也就是说,如果知道异或运算的所有表示,Keras神经网络将没有其他价值。此外,对于更复杂的神经网络,将权重转化为明确的算法或公式并不容易。但也许这种专业知识是未来AI专家的必备技能。