神经网络的发展历史

前言

神经网络是一种模拟人脑神经系统的计算模型,它由大量的人工神经元组成,并通过连接权值调整实现模型的学习和预测。神经网络的发展经历了几个关键的阶段,本文将介绍神经网络的发展历史,并通过代码示例来说明神经网络的基本原理。

早期的神经网络模型

早期的神经网络模型主要受到生物学中神经元的启发。在1943年,心理学家McCulloch和数学家Pitts提出了一种基于二进制逻辑的神经元模型,即McCulloch-Pitts模型。该模型将神经元表示为一个二进制开关,通过输入和权值的运算来产生输出。

def mcculloch_pitts(inputs, weights):
    threshold = 0
    weighted_sum = sum([x * w for x, w in zip(inputs, weights)])
    output = 1 if weighted_sum > threshold else 0
    return output

感知机模型的提出

感知机模型是神经网络发展的重要里程碑之一。在1957年,心理学家Rosenblatt提出了感知机模型,它是一种基于线性分类的神经网络模型。感知机接收多个输入,并通过权值和激活函数的计算来产生输出。

def perceptron(inputs, weights, activation_func):
    weighted_sum = sum([x * w for x, w in zip(inputs, weights)])
    output = activation_func(weighted_sum)
    return output

多层感知机和反向传播算法

1969年,Minsky和Papert发现感知机模型无法解决非线性可分问题,这也导致了神经网络的研究陷入低谷。直到1986年,Rumelhart、Hinton和Williams等人提出了多层感知机(Multi-Layer Perceptron,MLP)以及反向传播算法(Backpropagation),神经网络的研究才重新兴起。

多层感知机是一种具有至少一个隐藏层的神经网络模型,它通过多个神经元层的连接和权值调整来实现复杂的非线性映射。

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def feed_forward(inputs, weights, biases):
    hidden_layer = sigmoid(np.dot(inputs, weights[0]) + biases[0])
    output = sigmoid(np.dot(hidden_layer, weights[1]) + biases[1])
    return output

inputs = np.array([0.5, 0.3, 0.9])
weights = [np.array([[0.2, 0.4, 0.1], [0.3, 0.6, 0.8], [0.5, 0.7, 0.9]]),
           np.array([[0.1], [0.3], [0.5]])]
biases = [np.array([0.5, 0.2, 0.1]), np.array([0.8])]

output = feed_forward(inputs, weights, biases)
print(output)

深度学习的崛起

在2006年,Hinton等人提出了深度学习中的关键技术之一,即深度信念网络(Deep Belief Networks,DBN)。DBN是一种多层堆叠的限制玻尔兹曼机(Restricted Boltzmann Machine,RBM)的神经网络模型,通过无监督预训练和有监督微调来提高模型的性能。

import torch
import torch.nn as nn

class DeepBeliefNetwork(nn.Module):
    def __init__(self, input_dim, hidden_dims, output_dim):
        super(DeepBeliefNetwork, self).__init__()
        self.layers = nn.ModuleList()
        prev_dim = input_dim
        for i, hidden_dim in enumerate(hidden_dims):
            self.layers.append(nn.Linear(prev_dim, hidden_dim))
            self.layers.append(nn.Sigmoid())
            prev_dim = hidden_dim
        self.layers.append(nn.Linear(prev_dim, output_dim))
        self.layers.append