码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 神经网络中神经元的权重更新


    合集 - scikit-learn(39)
    1.【scikit-learn基础】--概述2023-12-022.【scikit-learn基础】--『数据加载』之玩具数据集2023-12-043.【scikit-learn基础】--『数据加载』之真实数据集2023-12-064.【scikit-learn基础】--『数据加载』之样本生成器2023-12-085.【scikit-learn基础】--『数据加载』之外部数据集2023-12-096.【scikit-learn基础】--『预处理』之 标准化2023-12-137.【scikit-learn基础】--『预处理』之 数据缩放2023-12-158.【scikit-learn基础】--『预处理』之 正则化2023-12-189.【scikit-learn基础】--『预处理』之 分类编码2023-12-2010.【scikit-learn基础】--『预处理』之 离散化2023-12-2111.【scikit-learn基础】--『预处理』之 缺失值处理2023-12-2212.【scikit-learn基础】--『监督学习』之 线性回归2023-12-2513.【scikit-learn基础】--『监督学习』之 岭回归2023-12-2614.【scikit-learn基础】--『监督学习』之 LASSO回归2023-12-2815.【scikit-learn基础】--『监督学习』之 支持向量机回归2023-12-3116.【scikit-learn基础】--『监督学习』之 决策树回归01-0217.【scikit-learn基础】--『监督学习』之 随机森林回归01-0318.【scikit-learn基础】--『监督学习』之 K-近邻分类01-0419.【scikit-learn基础】--『监督学习』之 逻辑回归分类01-0520.【scikit-learn基础】--『监督学习』之 贝叶斯分类01-0821.【scikit-learn基础】--『监督学习』之 决策树分类01-0922.【scikit-learn基础】--『监督学习』之 随机森林分类01-1023.【scikit-learn基础】--『监督学习』之 支持向量机分类01-1224.【scikit-learn基础】--『监督学习』之 均值聚类01-1425.【scikit-learn基础】--『监督学习』之 层次聚类01-1526.【scikit-learn基础】--『监督学习』之 谱聚类01-1827.【scikit-learn基础】--『监督学习』之 空间聚类01-2028.【scikit-learn基础】--『回归模型评估』之误差分析01-2229.【scikit-learn基础】--『回归模型评估』之偏差分析01-2430.【scikit-learn基础】--『回归模型评估』之可视化评估01-2631.【scikit-learn基础】--『回归模型评估』之准确率分析01-2832.【scikit-learn基础】--『回归模型评估』之损失分析01-3033.【scikit-learn基础】--『分类模型评估』之系数分析01-3134.【scikit-learn基础】--『分类模型评估』之评估报告02-0435.【scikit-learn基础】--模型持久化02-0836.神经网络极简入门05-07
    37.神经网络中神经元的权重更新07-15
    38.机器学习的数学基础--向量,矩阵08-0839.机器学习的数学基础--微积分08-18
    收起

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

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

    1. 回顾神经网络

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

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

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

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

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

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

    2. 初始权重分配

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

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

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

    最终可得输出:z1=11+e(y1w′1,1+y2w′2,1+y3w′3,1)
    从上面的计算过程可以看出,x1,x2是输入值,无法改变;
    y1,y2,y3和z1是计算产生的,也无法改变。
    在神经网络中,我们能够调整优化的就是权重值w1,1,...,w2,3以及w′1,1,...,w′3,1。

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

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

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

    所以,设置初始权重时:

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

    3. 误差的反向传播

    训练神经网络,除了设置初始权重之外,另一个重要的部分就是计算误差。
    误差就是根据训练结果与实际结果的差距。
    image.png
    比如上图,训练结果是o1,实际结果是t1,误差就是e=t1−o1。
    根据这个误差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的权重在这一层所占的比例来更新这一层的误差:
    ey1=e×w′1,1w′1,1+w′2,1+w′3,1=2×0.580.58+0.21+0.36≈1.01
    同理可得:ey2≈0.37,ey3≈0.63。

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

    4. 优化权重的思路

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

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

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

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

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

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

    5. 总结

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

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

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

  • 相关阅读:
    输出比较功能中的pwm以及其他功能的区分
    【python】Python生成GIF动图,多张图片转动态图,pillow
    sentinel源码分析-资源
    PyTorch 二维多通道卷积运算方式
    taro 兼容支付宝小程序和微信小程序<六>-- 自定义密码或验证码输入框组件的input 自动获取焦点(ios支付宝小程序怎么隐藏input的光标)
    分享|5G+智慧工业园区解决方案(附PDF)
    [自学记录08*]LDR、HDR与ToneMapping
    【沥血整理】灰度(二值)图像重构算法及其应用(morphological reconstruction)。
    Stable Diffusion算法、结构全流程概述
    数据结构与算法(C语言版)P3.2---链表之带头双向循环链表的实现
  • 原文地址:https://www.cnblogs.com/wang_yb/p/18302955
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号