别再死记硬背了!用Python手把手复现神经网络经典算法(从Hebb到Hopfield)
用Python从零实现神经网络五大经典算法从Hebb到Hopfield神经网络作为人工智能的核心技术之一其发展历程中涌现出许多奠基性算法。本文将带您用Python从零实现五种里程碑式的神经网络算法Hebb规则、感知机、Delta规则、竞争学习和Hopfield网络。不同于直接调用现代深度学习框架我们将从数学原理出发通过代码实现深入理解这些算法的本质。1. 神经网络基础与Hebb学习规则1.1 神经元模型构建让我们从最基本的McCulloch-Pitts神经元模型开始。这个1943年提出的模型虽然简单却包含了现代神经网络的核心思想import numpy as np class MPNeuron: def __init__(self, threshold0): self.threshold threshold self.weights None def activate(self, inputs): McCulloch-Pitts激活函数 total np.dot(inputs, self.weights) return 1 if total self.threshold else 0这个简单的二元神经元已经可以完成基本的逻辑运算。例如我们可以实现一个AND逻辑门and_neuron MPNeuron(threshold1.5) and_neuron.weights np.array([1, 1]) # 设置权重 print(and_neuron.activate([0, 0])) # 输出0 print(and_neuron.activate([1, 0])) # 输出0 print(and_neuron.activate([1, 1])) # 输出11.2 Hebb学习规则实现Hebb规则是Donald Hebb在1949年提出的生物学习理论核心思想是一起激活的神经元会加强连接。数学表达式为Δwᵢⱼ η·xᵢ·xⱼ其中η是学习率xᵢ和xⱼ分别是前后神经元的激活值。让我们用Python实现这个规则def hebbian_learning(input_patterns, learning_rate0.1, epochs100): Hebb规则学习实现 n_features input_patterns.shape[1] weights np.zeros(n_features) for _ in range(epochs): for pattern in input_patterns: # Hebb规则更新 weights learning_rate * pattern * pattern.T return weights我们可以用这个规则训练一个简单的模式识别器# 输入模式已中心化 patterns np.array([ [1, -1, 1, -1], [-1, 1, -1, 1] ]) # 训练权重 weights hebbian_learning(patterns) print(学习后的权重:, weights)注意原始Hebb规则没有权重衰减机制长期训练可能导致权重无限增大。实践中常加入正则化项。Hebb学习的特点完全无监督不需要目标输出学习过程基于输入的相关性适合特征提取和模式关联任务2. 感知机与Delta规则2.1 感知机模型感知机是Frank Rosenblatt在1957年提出的第一个可学习神经网络模型。与MP神经元不同感知机可以通过训练自动调整权重class Perceptron: def __init__(self, input_size, learning_rate0.1): self.weights np.random.rand(input_size) self.bias np.random.rand() self.lr learning_rate def predict(self, inputs): summation np.dot(inputs, self.weights) self.bias return 1 if summation 0 else 0 def train(self, X, y, epochs100): for _ in range(epochs): for inputs, label in zip(X, y): prediction self.predict(inputs) error label - prediction # 权重更新 self.weights self.lr * error * inputs self.bias self.lr * error2.2 感知机训练过程让我们用感知机解决一个简单的线性可分问题# 线性可分数据 X np.array([ [0, 0], [0, 1], [1, 0], [1, 1] ]) y np.array([0, 0, 0, 1]) # AND逻辑 p Perceptron(input_size2) p.train(X, y, epochs10) # 测试 print(0 AND 0:, p.predict([0, 0])) print(1 AND 1:, p.predict([1, 1]))感知机的局限性在于只能解决线性可分问题。对于XOR等非线性问题单层感知机无法收敛。2.3 Delta规则Widrow-Hoff规则Delta规则是感知机规则的连续版本使用梯度下降最小化误差def delta_rule(X, y, learning_rate0.01, epochs100): n_samples, n_features X.shape weights np.zeros(n_features) bias 0 for _ in range(epochs): for i in range(n_samples): # 线性输出 output np.dot(X[i], weights) bias error y[i] - output # Delta规则更新 weights learning_rate * error * X[i] bias learning_rate * error return weights, biasDelta规则与感知机规则的关键区别特性感知机规则Delta规则输出类型离散(0/1)连续值误差计算目标-预测类别目标-实际输出适用问题线性分类线性回归收敛性有限步收敛(线性可分)渐进收敛3. 竞争学习与Kohonen网络3.1 竞争学习原理竞争学习是一种无监督学习范式核心思想是赢家通吃(Winner-Takes-All)。在神经网络中多个神经元竞争对输入模式的响应权只有获胜的神经元会更新其权重。数学表达式寻找获胜神经元c argminⱼ‖x - wⱼ‖更新获胜神经元权重Δw_c η(x - w_c)3.2 Python实现class CompetitiveLearning: def __init__(self, n_units, input_dim, learning_rate0.1): self.weights np.random.rand(n_units, input_dim) self.lr learning_rate def find_winner(self, x): distances np.linalg.norm(self.weights - x, axis1) return np.argmin(distances) def train(self, X, epochs100): for _ in range(epochs): for x in X: winner self.find_winner(x) # 只更新获胜神经元 self.weights[winner] self.lr * (x - self.weights[winner])3.3 应用示例颜色聚类# 随机RGB颜色数据 np.random.seed(42) colors np.random.rand(100, 3) # 训练竞争网络 cl CompetitiveLearning(n_units5, input_dim3) cl.train(colors, epochs50) # 查看学习到的代表色 print(学习到的颜色中心:) print(cl.weights)竞争学习的特点完全无监督自动发现数据特征输出神经元形成输入空间的特征地图可用于聚类、向量量化和特征提取提示竞争学习常面临死神经元问题即某些神经元从未获胜。可通过泄漏学习或频率敏感竞争解决。4. Hopfield网络与联想记忆4.1 Hopfield网络原理Hopfield网络是一种全连接递归神经网络可用作内容可寻址的记忆系统。其主要特性二元神经元±1激活对称连接权重wᵢⱼ wⱼᵢ异步更新规则能量函数保证收敛能量函数定义 E -½∑ᵢ∑ⱼ wᵢⱼ sᵢ sⱼ ∑ᵢ θᵢ sᵢ4.2 Python实现class HopfieldNetwork: def __init__(self, size): self.size size self.weights np.zeros((size, size)) def train(self, patterns): 存储模式Hebb规则 for pattern in patterns: self.weights np.outer(pattern, pattern) np.fill_diagonal(self.weights, 0) # 自连接设为0 def predict(self, input_pattern, max_iter100): 异步更新恢复模式 pattern input_pattern.copy() for _ in range(max_iter): for i in range(self.size): # 随机选择神经元更新 j np.random.randint(self.size) activation np.dot(self.weights[j], pattern) pattern[j] 1 if activation 0 else -1 return pattern4.3 联想记忆演示# 定义几个简单模式字母形状 pattern1 np.array([1,1,1,1, -1,-1,-1,-1, 1,1,1,1]) # H pattern2 np.array([1,1,1,1, 1,-1,-1,1, 1,1,1,1]) # O # 创建并训练Hopfield网络 hn HopfieldNetwork(size12) hn.train([pattern1, pattern2]) # 测试噪声输入 noisy_input np.array([1,1,-1,1, -1,1,-1,-1, 1,1,-1,1]) # 损坏的H recovered hn.predict(noisy_input) print(恢复的模式:, recovered)Hopfield网络的容量限制可存储约0.14N个随机模式N为神经元数量模式间应有较低相关性存在伪吸引子问题5. 算法比较与应用场景5.1 五大算法特性对比算法学习类型网络结构典型应用优点局限性Hebb规则无监督单层模式关联、特征提取生物合理、简单权重无界、无纠错能力感知机有监督单层线性分类可证明收敛(线性可分)仅解决线性问题Delta规则有监督单层线性回归连续输出、梯度下降仅线性映射竞争学习无监督单层聚类、向量量化自组织、发现特征死神经元问题Hopfield网络无监督递归联想记忆内容寻址、纠错有限容量、伪状态5.2 现代神经网络中的传承这些经典算法在现代深度学习中仍有重要影响Hebb规则启发了现代神经网络中的相关性学习感知机是多层感知机(MLP)的基础Delta规则发展为反向传播算法的核心竞争学习在自编码器和GAN中有类似机制Hopfield网络与现代记忆网络有概念联系5.3 可视化工具为了更好理解这些算法的工作过程我们可以使用Matplotlib创建训练动态可视化import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation def visualize_learning(weights_history): fig, ax plt.subplots() line, ax.plot([], [], b-) def init(): ax.set_xlim(0, len(weights_history)) ax.set_ylim(min(weights_history)-0.1, max(weights_history)0.1) return line, def update(frame): line.set_data(range(frame), weights_history[:frame]) return line, ani FuncAnimation(fig, update, frameslen(weights_history), init_funcinit, blitTrue, interval100) plt.show()在实际项目中我发现将经典算法与现代框架结合往往能获得新的洞见。例如用PyTorch重新实现这些算法可以更高效地利用GPU加速同时保持算法的原始思想。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2432020.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!