神经网络中神经元的权重更新

· 浏览次数 : 26

小编点评

神经网络是现代深度学习的基础,其训练过程的核心在于优化神经元之间的连接权重,以便网络能够从输入数据中准确地预测输出结果。本文将简要介绍神经网络的基本概念、前向传播和反向传播的过程,以及如何使用梯度下降法来优化权重。 一、神经网络基本概念 神经网络是一种模拟人脑神经元结构的计算模型,由多个神经元相互连接而成。每个神经元接收来自其他神经元的输入信号,通过激活函数进行非线性变换,然后输出信号到下一个神经元。神经网络的层数和每层的神经元数量决定了网络的复杂性和学习能力。 二、前向传播过程 在前向传播过程中,输入数据依次通过神经网络的各层,每一层中的神经元根据上一层的输出和权重进行计算,通过激活函数后,得到下一层的输出信号。这个过程一直持续到网络的输出层,输出层根据最终的权重和输入数据进行计算,得到网络的预测结果。 三、反向传播过程 反向传播是一种监督学习算法,它通过计算损失函数关于网络参数的梯度来更新参数值,以最小化损失函数。在反向传播中,首先计算输出层的误差梯度,然后通过链式法则,逐层向前计算每一层的误差梯度。这些梯度用于指导权重更新,使得网络在训练过程中逐渐学习到从输入到输出的映射关系。 四、梯度下降法优化权重 梯度下降法是一种常用的优化算法,它通过迭代地调整网络参数来最小化损失函数。在梯度下降法中,权重更新的方向和步长由损失函数的梯度决定。为了提高收敛速度和避免陷入局部最优解,通常会使用动量法、自适应学习率等方法来优化梯度下降法的参数。 在实际应用中,神经网络的训练过程通常包括以下几个步骤: 1. 初始化网络参数,可以选择随机初始化或根据经验选择合适的初始化方法。 2. 前向传播输入数据,计算输出结果。 3. 计算损失函数,即预测结果与真实标签之间的差异。 4. 反向传播误差,根据损失函数的梯度更新网络参数。 5. 使用学习率等超参数调整权重更新的步长。 6. 迭代执行前向传播、反向传播和权重更新操作,直到满足停止条件(如损失函数收敛、达到最大迭代次数等)。 通过以上步骤,神经网络能够逐渐学习到从输入到输出的映射关系,并在训练集上获得较好的预测性能。

正文

前段时间写过一篇介绍神经网络的入门文章:神经网络极简入门
那篇文章介绍了神经网络中的基本概念和原理,并附加了一个示例演示如何实现一个简单的神经网络。

不过,在那篇文章中并没有详细介绍神经网络在训练时,是如何一步步找到每个神经元的最优权重的。
本篇介绍神经网络训练时,常用的一种权重更新的方式--梯度下降

1. 回顾神经网络

首先,回顾一下神经网络模型主要包含哪些部分:
image.png
如上图所示,核心部分有:

  • 神经元:图中黑色圆圈部分,接受输入,产生输出
  • 层:神经元的集合,图中蓝色,绿色框,一个层一般包含一个或多个神经元

image.png
神经元对输入进行两步计算:

  • 对各个输入按照权重求和
  • 求和的结果再经过一个激活函数,得到一个输出值

神经网络的训练过程,就是给每个神经元找到一个合适的权重
使得神经网络最后的输出(\(Output\))与目标值相差最小。

神经网络的结构不难,难点在于神经元和层多了之后,计算量暴增,需要强大的硬件支持。

2. 初始权重分配

下面回归本篇的主题,也就是神经网络中权重是如何更新和确定的。

我们知道,神经网络之所以如此流行,是因为基于它的模型,准确度远远好于传统的机器学习模型。
而神经网络模型的好坏取决于每个神经元的权重是否合理。

先假设做一个简单的神经网络,看看神经网络模型如何从输入值计算出输出值的。
image.png
这个网络中,假设我们的激活函数用\(y=\frac{1}{(1+e^x)}\)
那么,根据神经元的计算方法,先求和\(x_1w_{1,1}+x_2w_{2,1}\)
再用激活函数得到:\(y_1=\frac{1}{1+e^{(x_1w_{1,1}+x_2w_{2,1})}}\)
同理可得:\(y_2=\frac{1}{1+e^{(x_1w_{1,2}+x_2w_{2,2})}}\)\(y_2=\frac{1}{1+e^{(x_1w_{1,3}+x_2w_{2,3})}}\)

最终可得输出:\(z_1=\frac{1}{1+e^{(y_1 w^{'}_{1,1}+y_2 w^{'}_{2,1}+y_3 w^{'}_{3,1})}}\)
从上面的计算过程可以看出,\(x_1,x_2\)是输入值,无法改变;
\(y_1,y_2,y_3\)\(z_1\)是计算产生的,也无法改变。
在神经网络中,我们能够调整优化的就是权重值\(w_{1,1},...,w_{2,3}\)以及\(w^{'}_{1,1},...,w^{'}_{3,1}\)

理论上,初始化神经网络时,可以设置任意的权重,通过不断的训练最终得到合适的权重。
但实际情况下,模型的训练并不是万能的,初始权重设置的不好,对于训练花费的时间和训练结果都会造成不利的影响。

比如,初始权重设置的太大,会导致应用在数据上的激活函数总是处于斜率非常平缓的位置(如下图虚线红框处),
从而降低了神经网络学习到更好权重的能力。。
image.png

此外,还有一个问题是不要设置零值的权重,这也会导致神经网络丧失学习更好权重的能力。

所以,设置初始权重时:

  • 选择随机的,值比较小权重,常见的范围是0.01~0.99-1.0~1.0(不要选择0)
  • 权重的分配最好与实际问题关联,比如实际问题中,知道某些输入值的重要性高,可以初始较大的权重

3. 误差的反向传播

训练神经网络,除了设置初始权重之外,另一个重要的部分就是计算误差。
误差就是根据训练结果与实际结果的差距。
image.png
比如上图,训练结果是\(o_1\),实际结果是\(t_1\),误差就是\(e=t_1-o_1\)
根据这个误差\(e\),来计算上一层中各个神经元计算后的误差。

误差一般是根据神经元权重所占的比例来分配的。
比如,假设上图的神经网络中,最后一层的初始权重\(w^{'}_{1,1}=0.58, w^{'}_{2,1}=0.21, w^{'}_{3,1}=0.36\)
最后的误差为\(e=2\)
image.png

那么,根据\(w^{'}_{1,1}, w^{'}_{2,1}, w^{'}_{3,1}\)的权重在这一层所占的比例来更新这一层的误差:
\(e_{y1}=e\times \frac{w^{'}_{1,1}}{w^{'}_{1,1}+w^{'}_{2,1}+w^{'}_{3,1}}=2\times \frac{0.58}{0.58+0.21+0.36}\approx 1.01\)
同理可得:\(e_{y2}\approx 0.37\)\(e_{y3}\approx 0.63\)

然后再根据\(e_{y1},e_{y2}, e_{y3}\)去更新上一层的误差。
image.png
这样,从后往前,就得到了每个神经元的计算所产生的误差。
因为误差是从后往前计算的,所以也成为误差的反向传播

4. 优化权重的思路

通过误差的反向传播计算出每个神经元的误差,目的就是基于这个误差来更新神经元的权重值。

  • 当神经元的误差较大时,尝试减小神经元的权重值;
  • 当神经元的误差较小时,尝试增加神经元的权重值。

这也就是梯度下降算法的思路。

那么权重每次更新多少合适呢?
每次更新步长太小,将导致计算量过大,经过很长时间的迭代才能找到最优值,如下:
image.png
而且,更新步长太小,还会导致找到次优值之后,就以为已经找到最优值,如下:
image.png

不过,每次权重更新步长过大,也会有问题,有可能会错过最优值,在最优值附近来回横跳,如下:
image.png

所以,计算出误差之后,更新权重不是一次就能完成的。
一般来说,会尝试用多种不同的步长来更新权重,看看哪种步长更新的权重会使得最后的误差最小。

5. 总结

总的来说,神经网络的训练,关键点主要有:

  1. 确定初始权重
  2. 误差反向传播
  3. 尝试不同步长更新权重,尽量找出最优值(也就是使得最终误差最小的权重)

整个训练过程大致如下:
image.png
上图中,结束训练的条件是误差<阈值,有的时候,可能会出现很长时间之后误差始终都大于阈值,无法结束训练。
这时,可以加一个条件,误差<阈值或者迭代次数到达1000次(可以任意次数),就结束训练。

与神经网络中神经元的权重更新相似的内容:

神经网络中神经元的权重更新

前段时间写过一篇介绍神经网络的入门文章:神经网络极简入门。那篇文章介绍了神经网络中的基本概念和原理,并附加了一个示例演示如何实现一个简单的神经网络。 不过,在那篇文章中并没有详细介绍神经网络在训练时,是如何一步步找到每个神经元的最优权重的。本篇介绍神经网络训练时,常用的一种权重更新的方式--梯度下降

算法金 | 读者问了个关于深度学习卷积神经网络(CNN)核心概念的问题

​大侠幸会,在下全网同名[算法金] 0 基础转 AI 上岸,多个算法赛 Top [日更万日,让更多人享受智能乐趣] 读者问了个关于卷积神经网络核心概念的问题,如下, 【问】神经元、权重、激活函数、参数、图片尺寸,卷积层、卷积核,特征图,平均池化,全家平均池化,全连接层、隐藏层,输出层 【完整问题】神

本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT

OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿、130亿、330亿和650亿这4种参数规模的模型,参数是指神经网络中的权重和偏置等可调整的变量,用于训练和优化神经网络

实践Pytorch中的模型剪枝方法

摘要:所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差的模型压缩技术。 本文分享自华为云社区《模型压缩-pytorch 中的模型剪枝方法实践》,作者:嵌入式视觉。 一,剪枝分类 所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差(weigths/bias)的模型压缩技术。关于什

机器学习笔记(3): 神经网络初步

神经网络应该由若干神经元组成。 前面的每一个神经元都会给到一个参数,将传递的所有参数看作一个向量 \(\vec x\),那么此神经元的净输入为: \[z = x \omega + b \]其中 \(\omega\) 称为权重向量。 这里认为 \(x\) 是行向量,而 \(\omega\) 是列向量。

LeViT:Facebook提出推理优化的混合ViT主干网络 | ICCV 2021

论文提出了用于快速图像分类推理的混合神经网络LeVIT,在不同的硬件平台上进行不同的效率衡量标准的测试。总体而言,LeViT在速度/准确性权衡方面明显优于现有的卷积神经网络和ViT,比如在80%的ImageNet top-1精度下,LeViT在CPU上比EfficientNet快5倍 来源:晓飞的算

MATLAB神经网络工具箱使用介绍

本文介绍MATLAB软件中神经网络拟合(Neural Net Fitting)工具箱的具体使用方法。 在MATLAB人工神经网络ANN代码这篇文章中,我们介绍了MATLAB软件中神经网络(ANN)的纯代码实现;而在MATLAB软件中,其实基于神经网络拟合工具箱,就可以点点鼠标实现神经网络的回归。本文

神经网络极简入门

神经网络是深度学习的基础,正是深度学习的兴起,让停滞不前的人工智能再一次的取得飞速的发展。 其实神经网络的理论由来已久,灵感来自仿生智能计算,只是以前限于硬件的计算能力,没有突出的表现,直至谷歌的AlphaGO的出现,才让大家再次看到神经网络相较于传统机器学习的优异表现。 本文主要介绍神经网络中的重

深度学习(八)——神经网络:卷积层

主要介绍神经网络中的卷积层操作,包括构建卷积层、处理图像、可视化

深度学习(九)——神经网络:最大池化的作用

主要介绍神经网络中的最大池化操作,以及最大池化的作用