使用2位二進位制輸入的異或邏輯閘人工神經網路
介紹
人工神經網路 (ANN) 已成為機器學習領域中有效的工具,使我們能夠解決傳統計算方法曾認為具有挑戰性的複雜問題。其中一個問題是異或邏輯閘,這是一個基本示例,突出了某些邏輯運算的非線性特性。異或門有兩個二進位制輸入,並且只有當輸入不同時才產生真輸出。在本文中,我們將探討如何實現一個專門設計用於解決具有 2 位二進位制輸入的異或問題的人工神經網路。
理解異或邏輯閘
異或 (XOR) 邏輯閘對兩個二進位制輸入進行運算,如果輸入不同則產生真輸出,如果輸入相同則產生假輸出。
2 位異或門的真值表如下所示
輸入 A |
輸入 B |
輸出 |
---|---|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
從真值表可以看出,異或門的輸出無法用單個線性方程表示。這種非線性特性使得它成為傳統計算方法的一個具有挑戰性的問題。然而,人工神經網路擅長解決此類非線性問題。
異或邏輯閘人工神經網路的實現
演算法
步驟 1: 初始化輸入並比較異或邏輯閘的輸出。
步驟 2: 定義 sigmoid 啟用函式及其導數 sm_derivative(x)。
步驟 3: 隨機初始化權重,均值為 0。權重是連線不同層神經元的矩陣。
步驟 4: 設定訓練迭代次數。
步驟 5: 開始 epoch 範圍內的訓練迴圈。
步驟 6: 執行前向傳播
將 l0 設定為輸入層。
計算 l1,它是將 sigmoid 啟用函式應用於 l0 和 w0 的點積的結果。
計算 l2,它是將 sigmoid 啟用函式應用於 l1 和 w1 的點積的結果。
步驟 7: 執行反向傳播
計算預測輸出和實際輸出之間的誤差。
透過將 layer2_error 與應用於 l2 的 sigmoid 函式的導數相乘來計算 layer2_delta。
透過取 layer2_delta 和 w1 的轉置的乘積來計算隱藏層的誤差。
透過將 layer1_error 與應用於 l1 的 sigmoid 函式的導數相乘來計算 layer1_delta。
步驟 8: 更新權重
透過新增 l1 的轉置和 layer2_delta 的點積來更新 w1。
透過新增 l0 的轉置和 layer1_delta 的點積來更新 w0。
透過向訓練好的網路提供測試輸入來測試神經網路。
步驟 9: 透過使用訓練好的權重對 test_input 執行前向傳播來計算 predicted_output。將 sigmoid 函式應用於 predicted_output 並四捨五入值以獲得最終的預測輸出。
步驟 10: 透過突出顯示測試輸入並比較預測輸出,列印每個輸入的預測輸出。
示例
#import the required module import numpy as np #define a sigmoid function def sm(x): return 1 / (1 + np.exp(-x)) def sm_derivative(x): return x * (1 - x) inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) outputs = np.array([[0], [1], [1], [0]]) np.random.seed(42) w0 = 2 * np.random.random((2, 4)) - 1 w1 = 2 * np.random.random((4, 1)) - 1 epochs = 10000 for epoch in range(epochs): l0 = inputs l1 = sm(np.dot(l0, w0)) l2 = sm(np.dot(l1, w1)) layer2_error = outputs - l2 layer2_delta = layer2_error * sm_derivative(l2) layer1_error = layer2_delta.dot(w1.T) layer1_delta = layer1_error * sm_derivative(l1) w1 += l1.T.dot(layer2_delta) w0 += l0.T.dot(layer1_delta) ti = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) pr = sm(np.dot(sm(np.dot(ti, w0)), w1)) pr = np.round(pr) for i in range(len(ti)): print(f"Input: {ti[i]}, Estimated Output: {pr[i]}")
輸出
Input: [0 0], Estimated Output: [0.] Input: [0 1], Estimated Output: [1.] Input: [1 0], Estimated Output: [1.] Input: [1 1], Estimated Output: [0.]
結論
異或神經網路為理解非線性問題提供了基礎,其應用範圍超出了二進位制邏輯閘。它們能夠處理影像識別和自然語言處理等任務。但是,它們的效能在很大程度上取決於訓練資料的質量和多樣性。此外,在設計和訓練異或網路時,必須考慮問題的複雜性和可用的計算資源。隨著對神經網路模型的研究和進步的繼續,我們可以預期未來會出現更先進的模型來處理日益複雜的問題。