理解神经网络:11行Python代码实现与反向传播

需积分: 9 3 下载量 139 浏览量 更新于2024-09-08 收藏 261KB PDF 举报
"11行Python代码实现神经网络,详细介绍了反向传播的数学推导。适合对求导有一定了解的初学者学习。" 在神经网络的领域中,理解和实现一个简单的模型对于初学者来说至关重要。这篇文档通过11行Python代码展示了如何构建一个单层神经网络,并详细阐述了反向传播的过程。该网络使用了Sigmoid激活函数,并针对给定的输入数据集进行训练。 首先,我们来看代码中的关键部分。`nonlin` 函数代表了Sigmoid激活函数,它在神经网络中用于非线性转换。当`deriv=True`时,该函数返回Sigmoid的导数值,这在反向传播中用于计算梯度。 ```python def nonlin(x, deriv=False): if(deriv == True): return x * (1 - x) return 1 / (1 + np.exp(-x)) ``` 接下来,我们有输入数据集 `X` 和期望输出数据集 `y`。这些数据被用来训练网络。这里使用了4个二进制输入样本和相应的输出值。 ```python X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) y = np.array([[0, 0, 1, 1]]).T ``` 网络的权重初始化为随机值,平均值为0。 ```python syn0 = 2 * np.random.random((3, 1)) - 1 ``` 接下来的循环是训练过程,执行了10000次迭代。在这个过程中,前向传播计算当前输入到输出的预测值,然后反向传播计算误差并更新权重。 ```python for iter in range(10000): # 前向传播 l0 = X l1 = nonlin(np.dot(l0, syn0)) # 计算误差(损失函数) l1_error = y - l1 # 计算梯度(反向传播) l1_delta = l1_error * nonlin(l1, True) # 更新权重 syn0 += np.dot(l0.T, l1_delta) ``` 损失函数在这里使用的是均方误差(MSE),定义为:ℒ𝑦,𝑦=(𝑦′−𝑦)²/2,其中`𝑦′`是网络的预测输出,`𝑦`是实际输出,`𝑙1`是隐藏层的激活值。这个损失函数衡量了预测值与实际值之间的差异。 通过不断迭代,网络会逐渐调整权重以最小化损失函数,从而更准确地预测输出。在训练结束后,`l1`的输出将作为训练数据的预测结果。 这个简单的单层神经网络模型,虽然简单,但包含了神经网络学习的基本原理。它可以帮助初学者理解神经网络的运作机制,以及如何使用Python和NumPy实现这些概念。对于想要深入学习深度学习的读者来说,这是一个很好的起点。