人工神经网络 (ANN) 是一种受大脑启发的信息处理范式。 ANN 和人一样,通过实例学习。通过学习过程,ANN 被配置用于特定应用,例如模式识别或数据分类。学习主要涉及对神经元之间存在的突触连接的调整。
大脑由数千亿个称为神经元的细胞组成。这些神经元通过突触连接在一起,突触只不过是一个神经元可以向另一个神经元发送脉冲的连接。当一个神经元向另一个神经元发送兴奋信号时,该信号将被添加到该神经元的所有其他输入中。如果它超过给定的阈值,那么它将导致目标神经元向前发射动作信号——这就是思维过程在内部运作的方式。
在计算机科学中,我们通过使用矩阵在计算机上创建“网络”来模拟这个过程。这些网络可以理解为神经元的抽象,没有考虑所有的生物复杂性。为了简单起见,我们将只对一个简单的 NN 进行建模,其中有两层能够解决线性分类问题。
假设我们有一个问题,我们想在给定一组输入和输出作为训练示例的情况下预测输出,如下所示:
请注意,输出与第三列直接相关,即输入 3 的值是图 3 中每个训练示例中的输出。 2. 所以对于测试示例,输出值应该是 1。
训练过程包括以下步骤:
- 前向传播:
取输入,乘以权重(只需使用随机数作为权重)
令 Y = W i I i = W 1 I 1 +W 2 I 2 +W 3 I 3
将结果通过一个 sigmoid 公式来计算神经元的输出。 Sigmoid函数用于将结果归一化在 0 和 1 之间:
1/1 + e -y - 反向传播
计算误差,即实际输出和预期输出之间的差异。根据误差,通过将误差乘以输入并再次乘以 Sigmoid 曲线的梯度来调整权重:
Weight += Error Input Output (1-Output) ,这里输出 (1-Output) 是 Sigmoid 曲线的导数。
注意:重复整个过程数千次迭代。
让我们用Python编写整个过程。我们将使用 Numpy 库来帮助我们轻松地进行矩阵的所有计算。您需要在系统上安装 numpy 库才能运行代码
安装numpy的命令:
sudo apt -get install python-numpy
执行:
from joblib.numpy_pickle_utils import xrange
from numpy import *
class NeuralNet(object):
def __init__(self):
# Generate random numbers
random.seed(1)
# Assign random weights to a 3 x 1 matrix,
self.synaptic_weights = 2 * random.random((3, 1)) - 1
# The Sigmoid function
def __sigmoid(self, x):
return 1 / (1 + exp(-x))
# The derivative of the Sigmoid function.
# This is the gradient of the Sigmoid curve.
def __sigmoid_derivative(self, x):
return x * (1 - x)
# Train the neural network and adjust the weights each time.
def train(self, inputs, outputs, training_iterations):
for iteration in xrange(training_iterations):
# Pass the training set through the network.
output = self.learn(inputs)
# Calculate the error
error = outputs - output
# Adjust the weights by a factor
factor = dot(inputs.T, error * self.__sigmoid_derivative(output))
self.synaptic_weights += factor
# The neural network thinks.
def learn(self, inputs):
return self.__sigmoid(dot(inputs, self.synaptic_weights))
if __name__ == "__main__":
# Initialize
neural_network = NeuralNet()
# The training set.
inputs = array([[0, 1, 1], [1, 0, 0], [1, 0, 1]])
outputs = array([[1, 0, 1]]).T
# Train the neural network
neural_network.train(inputs, outputs, 10000)
# Test the neural network with a test example.
print(neural_network.learn(array([1, 0, 1])))
预期输出:经过 10 次迭代后,我们的神经网络预测值为 0.65980921。看起来不太好,因为答案实际上应该是 1。如果我们将迭代次数增加到 100,我们会得到 0.87680541。我们的网络越来越智能!随后,对于 10000 次迭代,我们得到 0.9897704,这非常接近并且确实是令人满意的输出。
参考:
- Christos Stergiou 和 Dimitrios Siganos 的神经网络
- 深度学习基础——从人工神经网络开始
- 在浏览器中修改神经网络
- 揭开神经网络的神秘面纱