什麼?神經網路還能創造新知識?

dicksonjyl560101發表於2019-06-28


什麼?神經網路還能創造新知識?

圖片來源:Unsplash


神經網路(NNs)可以在不知道用顯式演算法執行工作的情況下被設計和訓練於特定的任務,很多人都對此表示驚歎。例如,著名的手寫體數字識別教程很容易執行,但其背後的邏輯還是隱藏在神經網路下,僅能透過層次化結構、權值和啟用函式略知一二。


本文透過神經網路透明原則來揭示其“黑盒知識”,為此來檢驗一個布林異或函式的神經網路。首先,利用已知異或屬性過程構造了一個自底向上的神經網路,即清晰包含已知的代數關係。在第二步中使用TensorFlow Keras從簡易圖形化程式設計工具到異或邏輯運算訓練神經網路。


最後比較兩種方法。將Keras神經網路分解為布林元件,發現邏輯設定與第一步中構造的神經網路不同。被訓練的神經網路發現了使用不同布林函式的另一種異或運算表示方法。


這另一種異或公式在數學領域不是未知的,但至少很新奇。這或許表明神經網路可以創造新的知識。但要提取它,必須能夠將神經網路的設定和引數轉化為 顯式 規則。


什麼?神經網路還能創造新知識?

自底向上構造異或運算神經網路(XOR NN)

異或運算是由對映定義的布林函式,


XOR (0,0) = XOR (1,1) = 0

XOR (1,0) = XOR (0,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。


可以用以下異或運算的表示來建構其他的神經網路:


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) ) )


然而這些標識列導致了更復雜的網路。


此外,由於異或運算不能透過線性可分(且啟用函式嚴格單調),因此,不可能建立兩層的神經網路。


但也許還有其他方法可以構建異或運算的神經網路呢?下一節將透過訓練神經網路來尋找另一種解決方案。


什麼?神經網路還能創造新知識?

使用TensorFlow Keras構建異或神經網路


Keras是一個功能強大且易於使用的神經網路庫。上一節中建立了一個三層的2-2-1模型,並與之前建構的神經網路進行了比較。


使用梯度下降最佳化器與學習率1和均方誤差損失函式的誤差反向傳播,這是建構神經網路的標準方法。


以下是Python的程式碼片段:



# Generate NN for XOR operation

# input layer: <NODES> nodes, one for each bit (0 = false and +1 = true)
# output layer: 1 node for result (0 = false and +1 = true)
# Use sigmoid activation function, gradient descent optimizer and mean squared error loss function
# Last update: 28.05.2019

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# Define model
nodes = 2
model = 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()

# Generate train & test data
epochs = 10000
data_in = np.array([[0,0],[0,1],[1,0],[1,1]])
data_out = np.array([0,1,1,0])

# Train model
history = model.fit(data_in, data_out, epochs=epochs, verbose=0)

# Analysis of training history
for key in history.history.keys():
plt.scatter(range(epochs), history.history[key], s=1)
plt.ylabel(key)
plt.xlabel('epochs')
plt.show()

# Predict with model
result = model.predict(data_in)

# Print results
def printarray(arr):
return np.array2string(arr).replace(' ','')

print()
print('input', printarray(data_in))
print('output (calculation)', printarray(data_out))
print('output (prediction) ', printarray(result))
print('output (pred. norm.)', printarray(np.round(result)))

# Get weights of model
print()
print(model.get_weights())


異或運算的好處是可以訓練整個引數空間,因為只有四種可能的配置可以教。然而,需要一些在神經網路中傳遞資料集的過程來驅動模型達到零損耗和100%精準,即輸出趨向於一個分別是(0,1)、(1,0)和(0,0)、(1,1)的零。


什麼?神經網路還能創造新知識?

異或運算神經網路的Loss和epochs對比



什麼?神經網路還能創造新知識?

異或運算神經網路的Accuracy 和epochs對比


然而,訓練期也可能陷入停滯,無法銜接。接著精準度停止在75%甚至50%,即一個或兩個二元元組的對映是不正確的。在這種情況下就要重新構建神經網路,直到得到合適的解決方案。


什麼?神經網路還能創造新知識?

分析和結論


現在驗證Keras神經網路是否與建構的具有相似結構。透過返回權值(參見程式碼片段的末尾),得到了權值和偏差值。


什麼?神經網路還能創造新知識?

Python的指令碼輸出


使用這些引數來重建神經網路(再次使用Excel)。由三個運算子組成。


什麼?神經網路還能創造新知識?

基於Keras訓練的異或運算神經網路


透過輸入所有可能的配置,可以識別與H1、H2和O運算子關聯的布林函式。


什麼?神經網路還能創造新知識?

Keras在異或運算神經網路中的布林函式


有趣的是,本以為Keras 神經網路與所建構的邏輯是一樣的,但它卻建立了另一種解決方案。使用OR,AND和(相對沒人知道的)INH,而非運算子NAND, OR 和AND,即神經網路找到的公式。


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


這表明神經網路可以獲得以前沒有的知識!當然“新知識”是相對的,並且取決於知道的程度。也就是說,若一個人知道異或運算的所有表示形式,Keras 神經網路就不會有其他價值。


此外,對於更復雜的神經網路,將權值轉換為顯式演算法或公式並不容易。但也許這種專業知識是未來人工智慧專家必須具備的能力。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2649094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章