机器学习V1.0—人工神经网络算法(ANN)

本文深入解析了人工神经网络(ANN)的关键概念,包括感知器、梯度下降、反向传播算法及隐藏层的作用。介绍了ANN如何逼近实数值、离散值或向量的目标函数,并详细阐述了单个感知器与多层网络的区别,以及反向传播算法如何解决非线性决策面的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ANN对于逼近实数值、离散值或向量的目标函数提供了一种健壮性很强的方法,即对于训练数据中的错误健壮性很好。
在这个算法中包含几个主要的概念:

1 感知器

一种类型的ANN系统是以被称为感知器的单元为基础的,如下图所示:
在这里插入图片描述
感知器以一个实数值向量作为输入,计算这些输入的线性组合,若结果大于某个阈值,就输入1,否则输出-1。
在这里插入图片描述
当训练样例线性可分时,感知器法则可以成功的找到一个权向量,否则不能收敛。

2 梯度下降和delta法则

如果训练样本不是线性可分,delta法则会收敛到目标概念的最佳近似,可以理解为训练一个无阈值的感知器,也就是一个线性单元。
delta法则的关键思想:使用梯度下降来搜索可能的权向量的假设空间,以找到最佳拟合训练样例的权向量。
梯度下降的意义是找到曲面最低的那个点,为全局最优点。
在这里插入图片描述
梯度下降的算法如下所示:
在这里插入图片描述
上述算法存在的缺点:1. 收敛过程缓慢;2. 若误差曲面上存在多个局部极小值,不能保证这个过程会找到全局最小值。
解决方法:采用增量梯度下降或随机梯度下降,过程为:
删除算法中(4.9),修改(4.8)为
在这里插入图片描述

3 反向传播算法

单个感知器仅能表示线性决策面,反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面。如下图,多层网络可以表示高度非线性的决策面:
在这里插入图片描述
sigmod单元:是一种非常类似于感知器的单元,基于一个平滑的可微阈值函数。它的输出是输入的非线性函数,输出是输入的可微函数。
sigmod函数也称为logistics函数,输出范围为0到1,因为可以把非常大的输入值域映射到一个小范围的输出,经常被称为sigmod单元的挤压函数。它的导数很容易用它的输出表示。
双曲正切函数 tanh 也有这样的功能。
sigmod函数:
在这里插入图片描述
sigmod导数:
在这里插入图片描述
在这里插入图片描述
反向传播算法的如下所示:
在这里插入图片描述
反向传播算法的权值更新迭代会被重复上千次,终止判据的选择很重要,迭代太少可能无法有效的降低误差,迭代太多会导致对训练数据的过渡拟合。常见的解决方法有以下两种:

  1. 增加冲量项:
    在这里插入图片描述
  2. 学习任意的无环网络:
    在这里插入图片描述

4 隐藏层

在多层神经网络中,存在隐藏层,其在神经网络中的功能和步骤可以用下图展示:
在这里插入图片描述

5 总结

ANN感觉是在解多元组方程。
定义函数,权值(可以看做多元方程组的常量的值)。通过不断调整权值,得到最终的权重值,该过程有点像动态规划的过程。
我认为ANN的本质是通过定义函数,找到最终的权重。

[1]: 机器学习(第四章 人工神经网络)
[2]: https://zhuanlan.zhihu.com/p/47519999
[3]: https://www.cnblogs.com/ranjiewen/p/6115272.html
[4]: https://zhuanlan.zhihu.com/p/29683837

人工神经网络(Artificial Neural Networks, ANNs)的概念最早可追溯到20世纪40年代,由 Warren McCulloch 和 Walter Pitts 提出的一种简单的神经元模型[^5]。然而,现代意义上的人工神经网络算法的奠基工作是由 Frank Rosenblatt 在1958年提出的感知器(Perceptron)模型完成的。Rosenblatt 的研究奠定了单层神经网络的基础,并首次尝试通过机器学习的方式模拟人类大脑的工作机制[^6]。 尽管如此,真正使得人工神经网络成为一种通用计算工具的关键突破发生在20世纪80年代中期。David Rumelhart、Geoffrey Hinton 和 Ronald J. Williams 等人在反向传播算法(Backpropagation Algorithm)方面的贡献标志着多层前馈神经网络训练方法的重大进步。他们在1986年的论文《Learning representations by back-propagating errors》中详细介绍了如何有效地使用梯度下降法调整权重以最小化误差[^7]。这篇经典文献被认为是当代深度学习发展的起点之一。 以下是基于Python实现的一个简化版本反向传播算法示例代码: ```python import numpy as np class NeuralNetwork: def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate): self.inodes = input_nodes self.hnodes = hidden_nodes self.onodes = output_nodes # 初始化权重矩阵 self.wih = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.hnodes, self.inodes)) self.who = np.random.normal(0.0, pow(self.onodes, -0.5), (self.onodes, self.hnodes)) self.lr = learning_rate self.activation_function = lambda x: 1 / (1 + np.exp(-x)) # sigmoid function def train(self, inputs_list, targets_list): inputs = np.array(inputs_list, ndmin=2).T targets = np.array(targets_list, ndmin=2).T hidden_inputs = np.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = np.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) output_errors = targets - final_outputs hidden_errors = np.dot(self.who.T, output_errors) # 更新权重 self.who += self.lr * np.dot((output_errors * final_outputs * (1.0 - final_outputs)), np.transpose(hidden_outputs)) self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), np.transpose(inputs)) def query(self, inputs_list): inputs = np.array(inputs_list, ndmin=2).T hidden_inputs = np.dot(self.wih, inputs) hidden_outputs = self.activation_function(hidden_inputs) final_inputs = np.dot(self.who, hidden_outputs) final_outputs = self.activation_function(final_inputs) return final_outputs ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮姑娘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值