目录
神经网络是模仿人脑神经元工作原理而设计的一种算法模型。在一个基本的神经网络中,存在多个“神经元”或称为“节点”,这些节点被组织成多个层次。每个节点都接收前一层的输入,进行加权求和,并通过一个激活函数产生输出。
神经网络主要由以下几个部分组成:
深度神经网络(DNN)基本上是一个有很多隐藏层的神经网络。这些额外的层使得DNN能够学习和表示更复杂的特征和模式。简而言之,一个“深”的网络意味着它有更多的层次和更多的能力,但同时也意味着它需要更多的数据和计算资源来进行训练。
深度学习的兴起归功于几个关键因素:
下面利用神经网络来解决XOR问题。
XOR问题是指异或逻辑运算,对于两个二进制输入,XOR运算的定义如下:

从上面的表格可以看出,只有当两个输入不同时,输出才为1;如果两个输入相同,则输出为0。
XOR问题在神经网络领域的重要性在于:单个感知机(或称为线性单元)不能解决XOR问题,因为XOR函数不是线性可分的。这意味着你不能画一条直线来区分输出为1和输出为0的数据点。但是,使用一个具有至少一个隐藏层的多层神经网络可以解决XOR问题,这证明了引入隐藏层的重要性和多层神经网络的能力。
首先绘制XOR数据点:
- import matplotlib.pyplot as plt
-
- # XOR 数据
- X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
- y = np.array([[0], [1], [1], [0]])
-
- plt.scatter(X[y[:,0] == 0][:, 0], X[y[:,0] == 0][:, 1], color='blue', label='0')
- plt.scatter(X[y[:,0] == 1][:, 0], X[y[:,0] == 1][:, 1], color='red', label='1')
- plt.xlabel('Input A')
- plt.ylabel('Input B')
- plt.legend()
- plt.title('XOR Data Points')
- plt.show()
结果图;

接下来利用神经网络进行预测:
- import numpy as np
- import matplotlib.pyplot as plt
-
- # 定义Sigmoid函数及其导数
- def sigmoid(x):
- return 1 / (1 + np.exp(-x))
-
- def sigmoid_derivative(x):
- return x * (1 - x)
-
- # 定义神经网络结构
- input_neurons = 2
- hidden_neurons = 4
- output_neurons = 1
-
- # 初始化权重和偏置
- np.random.seed(0)
- input_hidden_weights = np.random.rand(input_neurons, hidden_neurons)
- hidden_output_weights = np.random.rand(hidden_neurons, output_neurons)
- hidden_bias = np.random.rand(1, hidden_neurons)
- output_bias = np.random.rand(1, output_neurons)
-
- # 定义训练数据 (XOR problem)
- X = np.array([
- [0, 0],
- [0, 1],
- [1, 0],
- [1, 1]
- ])
- y = np.array([
- [0],
- [1],
- [1],
- [0]
- ])
-
- learning_rate = 0.5
- epochs = 10000
- errors = []
-
- # 训练神经网络
- for epoch in range(epochs):
- # 前向传播
- hidden_layer_input = np.dot(X, input_hidden_weights) + hidden_bias
- hidden_layer_output = sigmoid(hidden_layer_input)
- output_layer_input = np.dot(hidden_layer_output, hidden_output_weights) + output_bias
- predicted_output = sigmoid(output_layer_input)
-
- # 计算误差
- error = y - predicted_output
-
- # 记录MSE
- mse = np.mean(np.square(error))
- errors.append(mse)
-
- # 反向传播
- d_predicted_output = error * sigmoid_derivative(predicted_output)
- error_hidden_layer = d_predicted_output.dot(hidden_output_weights.T)
- d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output)
-
- # 更新权重和偏置
- hidden_output_weights += hidden_layer_output.T.dot(d_predicted_output) * learning_rate
- output_bias += np.sum(d_predicted_output, axis=0, keepdims=True) * learning_rate
- input_hidden_weights += X.T.dot(d_hidden_layer) * learning_rate
- hidden_bias += np.sum(d_hidden_layer, axis=0, keepdims=True) * learning_rate
-
- print(predicted_output)
-
- # 绘制误差曲线
- plt.plot(errors)
- plt.title('Error (MSE) over Epochs')
- plt.xlabel('Epochs')
- plt.ylabel('Mean Squared Error (MSE)')
- plt.show()
预测结果:
[[0.01707759] [0.98487483] [0.98482722] [0.01675426]]
误差曲线如下;

可见,随着迭代次数的增加, 均方误差MSE越来越小,最终收敛到0。