神经网络之父Hinton介绍及其论文介绍

本文介绍了计算机学家Geoffrey Hinton在神经网络领域的贡献,包括反向传播算法、玻尔兹曼机、深度信念网络等重要成果。此外还提到了AlexNet和胶囊网络等模型。

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

1简介

杰弗里·埃弗里斯特·辛顿(Geoffrey Everest Hinton),计算机学家、心理学家,被称为“神经网络之父”、“深度学习鼻祖”。他研究了使用神经网络进行机器学习、记忆、感知和符号处理的方法,并在这些领域发表了超过200篇论文。他是将(Backpropagation)反向传播算法引入多层神经网络训练的学者之一,他还联合发明了波尔兹曼机(Boltzmann machine)。他对于神经网络的其它贡献包括:分布特征(distributed representation)、时延神经网络、专家混合系统(mixtures of experts)、亥姆霍兹机(Helmholtz machines)等。

2 论文

2.1 玻尔兹曼机

1985年Hinton等人写的《A learning algorithm for Boltzmann machines》,即玻尔兹曼机的学习算法。玻尔兹曼机是第一个能够学习不属于输入或输出的神经元内部表征的神经网络。

热量均衡下,系统在任一全局状态的概率服从玻尔兹曼分布。玻尔兹曼分布有非常好的数据特性,它与信息理论密切相关。特别地,两个全局状态的log 概率的微分在温度1下刚好等于它们能量的微分。这样容易求偏导数,容易采用梯度下降算法

文中提出模型4-2-4 Encoder,第一个4表示4个可见单元,可以代表输入,2是隐藏单元,最后一个4代表可见单元,可以代表输出。

参考下面文章:

1.1985年 玻尔兹曼机的学习算法–Hinton论文系列《A learning algorithm for Boltzmann machines》
https://blog.csdn.net/zephyr_wang/article/details/120391250
2.2010年Hinton写的《A practical guide to training Restricted Boltzmann Machines》。RBMs(Restricted Boltzmann Machines)的最重要的使用是作为形成深度信念网络的构成模块。RBMs通常采用对比散度(contrastive divergence)的学习过程进行训练
https://blog.csdn.net/zephyr_wang/article/details/120498709

2.2 反向传播

反向传播由下面这些人分别独立发现:(Bryson and Ho, 1975; Werbos, 1974; Parker, 1985; LeCun, 1985; Rumelhart et al., 1986)。反向传播是第一个有效的学习神经网络的方法,神经网络可以拥有一个或多个自适应隐藏单元层。

1986年Hinton等人写的《Learning representations by back-propagating errors》。输入与输出之间隐藏单元的引入,使得计算复杂,采用反向传播。

深度学习的开篇:2006年. G.E. Hinton 和R. R. Salakhutdinov的《Reducing the dimensionality of data with neural networks》
只从1980年代开始,通过深度autoencoder的反向传播(backpropagation)是处理非线性维度下降的一个非常有效分方法,但需要满足3个条件(1)计算机速度足够快;(2)数据集足够大;(3)初始权重有一个好的办法。而现在刚好就满足这三个条件了。
该文提出的模型:(1)第一步预训练,迭代训练很多RBMs,即训练完一个RBM后,将其学到的特征用于训练下一个RBM;(2)接着是Unroll(展开),构成一个深度autoencoder;(3)最后使用反向传播fine-tuning。

参考下面文章:

  1. 1986年,反向传播-Hinton论文系列《Learning representations by back-propagating errors》https://blog.csdn.net/zephyr_wang/article/details/120190585
  2. Hinton论文系列-Reducing the dimensionality of data with neural networks,2006年。https://blog.csdn.net/zephyr_wang/article/details/119878836

2.3 wake-sleep算法

wake-sleep算法,该算法有两个通路,一个是从下到上的识别连接,一个是从上到下的生成连接.

参考下面文章:
wake-sleep算法-Hinton论文系列《To Recognize Shapes, First Learn to Generate Images》2006年
https://blog.csdn.net/zephyr_wang/article/details/120157174

2.4 deep belief nets

2006年Hinton等人写的《A fast learning algorithm for deep belief nets》显示了是有可能学习一个深度、紧密相连的信念网络,一次学习一层。进行如此学习方式的一种是假定当学习低层时,较高的层不存在;但这与简单的因子化相似(替换难处理的后验分布)不相容。为了使这些相似起作用,我们需要真的后验尽可能逼近因子化。所以不是忽略较高层,而是假定他们存在,只是有捆绑的权重,他们满足互补先验分布(Complementary Prior),以使真后验分布可以因子化。这就相当于拥有了一个无向模型,可以使用对比散度(contrastive divergence)有效的学习。

参考下面文章:
Hinton 论文系列《A fast learning algorithm for deep belief nets》2006年
https://blog.csdn.net/zephyr_wang/article/details/120007607

2.5 其他模型

  1. AlexNet .是2012年ImageNet竞赛冠军获得者Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。

  2. 胶囊网络CapsNet,2017年
    https://blog.csdn.net/zephyr_wang/article/details/118863203
    现在卷积网络在物体识别领域占据了主导地位,其是否也存在指数性无效率。卷积网络不能很好的处理仿射变换,比如我们可能需要指数级的增加训练样本。
    而本文说的胶囊网络(capsule)可以避免指数性无效率,其将像素强度转换成识别片段的实例参数的向量,然后应用转换矩阵来预测更大片段的实例化参数。转换矩阵是学习部分和整体间的内在关系。

<think>嗯,用户想找HAL_TIM_PeriodElapsedCallback函数的定义位置和用法。首先,我需要回忆一下STM32的HAL库结构。这个回调函数应该和定时器中断相关,对吧?当定时器的周期到了,就会触发这个回调函数。 根据用户提供的引用资料,特别是引用[3],里面提到使用HAL_TIM_Base_Start_IT来启动定时器并开启中断,然后实现中断服务程序中的任务。所以HAL_TIM_PeriodElapsedCallback应该是在用户代码中定义的,用来处理周期性的中断事件。HAL库通常采用回调机制,用户需要自己实现这些回调函数,比如这个函数可能是在定时器更新事件时被调用。 接下来,关于定义的位置,HAL库中的弱定义应该在某个头文件或源文件中,比如stm32xx_hal_tim.h或者对应的.c文件中。用户需要在自己的代码中重新定义这个函数,覆盖弱符号。例如,在main.c或者专门的定时器处理文件中定义。 用法方面,用户需要在初始化定时器并启动中断后,编写这个回调函数的内容,比如翻转LED或者处理数据。同时要注意定时器实例的判断,如果有多个定时器的话,需要用htim的参数来选择正确的定时器。 可能用户遇到的问题是没有正确实现回调函数,或者没有启动中断。需要检查是否调用了正确的启动函数,比如HAL_TIM_Base_Start_IT而不是HAL_TIM_Base_Start,后者可能不会开启中断。 另外,用户可能需要知道如何查找HAL库中的弱定义,这通常是在HAL的源文件中,使用__weak关键字修饰。例如在stm32xx_hal_tim.c中会有这个函数的弱定义,用户在自己的代码中重新实现即可。 还需要提醒用户,中断服务函数的名字可能和CubeMX生成的有关,确保中断向量表正确,以及中断优先级设置合理。如果有多个定时器,回调函数中需要通过htim->Instance来判断是哪个定时器触发的,从而执行不同的操作。 总结一下,回答应该包括回调函数的定义位置在用户代码中,需要覆盖HAL的弱定义,用法是在定时器中断发生时执行用户代码,并注意定时器实例的判断。同时提供示例代码和常见问题解答,帮助用户正确使用。</think>### HAL_TIM_PeriodElapsedCallback 函数解析 #### 1. 函数定义位置 `HAL_TIM_PeriodElapsedCallback` 是STM32 HAL库中定时器更新事件(周期中断)的**弱定义回调函数**,其默认实现位于HAL库的定时器驱动文件中(例如:`stm32xx_hal_tim.c`),但用户需要在工程中**重新实现该函数**以覆盖默认的弱定义[^3]。 具体来说: - **弱定义位置**:`stm32xx_hal_tim.c`(例如`stm32h7xx_hal_tim.c`) - **用户实现位置**:用户代码中(如`main.c`或自定义的定时器处理文件) #### 2. 函数作用 当定时器的计数器溢出(或达到预设周期值)时,触发更新事件中断,此时`HAL_TIM_PeriodElapsedCallback` 会被调用,用于执行用户自定义的周期性任务,例如:LED闪烁、传感器数据采集等[^3]。 #### 3. 函数原型 ```c __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // 默认空实现(需用户覆盖) } ``` #### 4. 使用步骤 1. **定时器初始化** 配置定时器参数(预分频系数、计数周期等),例如: ```c TIM_HandleTypeDef htim3; htim3.Instance = TIM3; htim3.Init.Prescaler = 8399; // 84MHz/(8400) = 10kHz htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 9999; // 10kHz/10000 = 1Hz HAL_TIM_Base_Init(&htim3); ``` 2. **启动定时器中断** 使用 `HAL_TIM_Base_Start_IT` 启动定时器并开启中断[^3]: ```c HAL_TIM_Base_Start_IT(&htim3); ``` 3. **实现回调函数** 在用户代码中重新定义函数: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM3) // 判断触发源 { HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 示例:翻转LED } } ``` #### 5. 注意事项 - 若使用多个定时器,需在回调函数中通过 `htim->Instance` 判断具体触发源[^3]。 - 必须调用 `HAL_TIM_Base_Start_IT`(而非 `HAL_TIM_Base_Start`)以启用中断功能。 - 确保中断服务函数 `TIMx_IRQHandler` 已正确关联到定时器(通常由CubeMX自动生成)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI强仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值