【机器学习】神经网络 | 神经网络基础知识全梳理,神经网络组成,优化及其常见的神经网络

文章目录

  • 1 神经网络组成
  • 2 神经网络的优化
    • 2.1 反向传播算法 BP算法
    • 2.2 梯度下降算法
    • 2.3 训练中可能会遇到的问题
      • 2.3.1 如何避免过拟合?
      • 2.3.2 如何避免到局部最小?
      • 2.3.3如何避免梯度消失和梯度爆炸 ?
  • 3 常见的一些神经网络
    • 3.1 感知机(Perceptron):
    • 3.2 多层前馈神经网络:
    • 3.3 其他

神经网络是一种模仿人脑神经元网络结构和功能的数学模型,其中非常重要的一部分是有激活函数。

激活函数模拟了生物神经元的兴奋性质。在生物神经系统中,神经元接收到足够的刺激时会被激活并产生电信号传递给其他神经元。激活函数在神经网络中的作用类似,它根据输入信号的加权和是否超过了某个阈值来决定神经元是否被激活,以及激活的程度。这种非线性的激活特性使得神经网络能够学习和表示复杂的非线性关系,增强了神经网络的表达能力。

有了激活函数从某种意义来说就可以解决非线性问题了。这在实际中有着非常重要的意义

1 神经网络组成

神经网络被广泛应用于机器学习和人工智能领域。神经网络由多个神经元组成,这些神经元分布在不同的层中,每一层都可以包含多个神经元。

神经元是神经网络的基本组成单元,模仿人类大脑中的神经元。每个神经元接收来自其他神经元的输入信号,并产生一个输出信号,这个输出信号可以传递到其他神经元。神经元包括三个主要部分:

  • 输入权重(Weights):每个输入都与一个权重相关联,权重决定了输入信号的重要性。

  • 求和器(Summation):输入和对应的权重相乘后求和,加上一个偏置项(bias)。

  • 激活函数(Activation Function):对求和结果进行非线性转换,产生神经元的输出。

对于激活函数,我们常见的有阶跃函数,但由于它不连续,不光滑,所以更常用的是Sigmod函数,Relu函数,

  1. Sigmoid 函数:将输入值压缩到 (0, 1) 范围内,常用于输出层。
    $\sigma(x) = \frac{1}{1 + e^{-x}} $

  2. ReLU 函数(Rectified Linear Unit):当输入大于 0 时输出等于输入,否则输出为 0。
    ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

  3. Tanh 函数:将输入值压缩到 (-1, 1) 范围内,比 Sigmoid 函数具有更陡的曲线。
    tanh ( x ) = e x − e − x e x + e − x \text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex

多个神经元组成神经网络的输入层、隐藏层和输出层。

  • 输入层(Input Layer):接收外部输入的数据,将数据传递给下一层神经元。
  • 隐藏层(Hidden Layer):在输入层和输出层之间的层,负责对输入数据进行加工和处理,提取数据的特征。
  • 输出层(Output Layer):输出最终的结果,可以是分类、回归等任务的输出。

2 神经网络的优化

网络基本搭建好之后就会有参数

我们该如何去对这些参数进行调整呢?

2.1 反向传播算法 BP算法

反向传播(backward propagation,简称 BP)指的是计算神经网络参数梯度的方法。其原理是基于微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络,依次计算每个中间变量和参数的梯度。

反向传播往往需要基于正向传播一起使用

2.2 梯度下降算法

梯度下降算法的基本思想是沿着函数梯度的反方向调整参数,以达到函数的最小值。如果是求最大值,则沿着梯度的方向调整参数。梯度表示函数在某一点的变化率,梯度的反方向即函数下降最快的方向。

就是向着负梯度的方向下降,而这个梯度我们已经通过2.1BP算法算出来了

算法步骤

  1. 初始化参数:选择合适的初始参数值。

  2. 计算梯度:计算损失函数关于参数的梯度。

  3. 更新参数:沿着梯度的反方向更新参数。
    θ = θ − α ∇ J ( θ ) \theta = \theta - \alpha \nabla J(\theta) θ=θαJ(θ)
    其中, θ \theta θ 是参数, a l p h a alpha alpha 是学习率(控制参数更新的步长), ∇ J ( θ ) \nabla J(\theta) J(θ) 是损失函数关于参数的梯度。

    学习率是梯度下降算法中一个重要的超参数,控制参数更新的步长。如果学习率过大,可能会导致参数在最优值附近震荡,无法收敛;如果学习率过小,可能会导致收敛速度过慢,需要更多的迭代次数。

  4. 重复迭代:重复步骤 2 和步骤 3,直到满足停止条件(如达到最大迭代次数、损失函数变化小于阈值等)。

基于这个的常见的变种

  • 随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代随机选择一个样本计算梯度,用于大规模数据集。
  • 批量梯度下降(Batch Gradient Descent):在整个数据集上计算梯度,适用于小规模数据集。
  • 小批量梯度下降(Mini-batch Gradient Descent):综合了批量梯度下降和随机梯度下降的优点,每次迭代随机选择一小部分样本计算梯度。

2.3 训练中可能会遇到的问题

2.3.1 如何避免过拟合?

  1. 数据集扩增(Data Augmentation):增加训练数据的多样性,可以通过旋转、翻转、缩放等方式对数据进行扩充,使模型更加鲁棒。

  2. 正则化(Regularization):在损失函数中加入正则化项,限制模型参数的大小,防止模型过于复杂。常见的正则化方法包括 L1 正则化和 L2 正则化。

  3. 早停(Early Stopping):在训练过程中监控模型在验证集上的表现,当验证集上的性能不再提升时停止训练,防止模型在训练集上过拟合。

2.3.2 如何避免到局部最小?

想要避免局部最小,基本思想是从局部最小跳出或者增大随机性

  1. 使用随机化:随机化初始参数值或随机选择样本顺序,可以使算法更有可能跳出局部最小值。

  2. 模拟退火(Simulated Annealing):模拟退火算法通过在早期接受更大的跳跃来避免陷入局部最小值,随着优化过程的进行,逐渐减小跳跃的幅度,使得算法更趋向于在全局范围内搜索最优解。

  3. 遗传算法(Genetic Algorithm):遗传算法通过模拟生物进化的过程,使用交叉、变异等操作来生成新的解,并根据适应度函数选择优秀的解,可以有效地避免陷入局部最小值。

2.3.3如何避免梯度消失和梯度爆炸 ?

  1. 使用合适的激活函数:选择合适的激活函数可以缓解梯度消失和梯度爆炸问题。常用的激活函数如ReLU、Leaky ReLU、ELU等可以在一定程度上缓解梯度消失问题。
  2. 使用批量归一化(Batch Normalization):批量归一化可以将每一层的输入归一化到均值为0、方差为1的分布,有助于缓解梯度消失和梯度爆炸问题,同时加速网络的收敛速度。
  3. 使用梯度裁剪(Gradient Clipping):在反向传播过程中,对梯度进行裁剪,限制梯度的大小,可以避免梯度爆炸问题。
  4. 使用适当的权重初始化方法:合适的权重初始化可以帮助避免梯度消失和梯度爆炸问题。比如使用Xavier初始化、He初始化等。
  5. 减小网络深度:过深的网络容易出现梯度消失和梯度爆炸问题,可以考虑减小网络深度或者使用残差连接(Residual Connection)来缓解这个问题。
  6. 使用梯度检查:在训练过程中可以定期检查梯度的大小,如果发现梯度出现异常值,可以及时调整学习率或采取其他措施。

3 常见的一些神经网络

3.1 感知机(Perceptron):

感知机是一种简单的神经网络模型,由美国科学家 Frank Rosenblatt 在 1957 年提出。它由单个神经元组成,只包含输入层和输出层,没有隐藏层。感知机的工作原理是将输入的特征值和对应的权重相乘后求和,再经过激活函数处理,最终输出结果。感知机适用于简单的线性分类问题。

但是由于,感知机只有输出层神经元进行激活处理,即只拥有一层功能神经网络,因而不能很好处理非线性问题,所以更多使用的是多层前馈神经网络

3.2 多层前馈神经网络:

其实比起感知机,多层前馈无非就是多了一些隐藏层

它包含一个输入层、一个或多个隐藏层以及一个输出层,每个层都由多个神经元组成,神经元之间没有同层连接,只有跨层连接。信息在网络中从输入层经过隐藏层逐层传递,最终到达输出层,每一层的输出作为下一层的输入,没有反馈回路。

3.3 其他

上面两种应用比较多,但实际上还有

RBF网络(换了一个激活函数,启发我们在激活函数上选取可能有不同的更优的结果)

ART网络和SOM网络(他们都是一种竞争性的无监督学习的网络,竞争性很有启发性)

级联相关网络(即自适应地产生网络结构,我觉得这个思想也非常厉害)

Elman神经网络(允许网络中出现环形结构,可以有反馈哈哈哈,这个也很有趣)

但是以上几种网络说实话最近都不怎么见了,只能说我们汲取他们的结构思考,看看可不可以给我们后面网络结构的改进做出一些启发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​​​​​​​ARCGIS API for Python进行城市区域提取

ArcGIS API for Python主要用于Web端的扩展和开发,提供简单易用、功能强大的Python库,以及大数据分析能力,可轻松实现实时数据、栅格数据、空间数据等多源数据的接入和GIS分析、可视化,同时提供对平台的空间数据管理和组织管理功能…

Mac提示Could not set environment: 150如何进入恢复模式

原因是系统集成保护 (SIP) 的 macOS 安全功能会影响磁盘权限和操作,需要访问 macOS 恢复窗口以输入一组命令并禁用 SIP。 如何关闭SIP? Intel芯片 1、重启电脑并常摁commandR,直到看到APPLE图标 2、从菜单栏转到Utilities > Terminal。…

docker-compose这下会用了吗?

概要 默认的模板文件是 docker-compose.yml,其中定义的每个服务可以通过 image 指令指定镜像或 build 指令(需要 Dockerfile)来自动构建。 注意如果使用 build 指令,在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, V…

LeetCode 2044.统计按位或能得到最大值的子集数目

给你一个整数数组 nums ,请你找出 nums 子集 按位或 可能得到的 最大值 ,并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素(或不删除)得到,则认为数组 a 是数组 b 的一个 子集…

vue如何优化首页加载速度

优化 Vue.js 应用的首页加载速度是提升用户体验的关键之一。以下是一些优化 Vue.js 应用首页加载速度的常见方法: 代码分割(Code Splitting): 将应用代码拆分成多个小块,并按需加载。可以使用 Vue Router 的懒加载功能…

ElasticSearch 与java的结合使用(一)

引入依赖 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.15.2</version><exclusions><!-- 排除自带的logback依赖 --><exclusion><groupId>org.apac…

docker的安装与使用

1.打开启动或关闭windows功能 2.勾选Hyper-V、适用于Linux的Windows子系统&#xff0c;虚拟机平台三项 若没有Hyper-V&#xff0c;以管理员身份执行以下文件 创建Hyper-V Installer.cmd&#xff0c;然后写入 pushd "%~dp0" dir /b %SystemRoot%\servicing\Package…

51单片机基础篇系列-51单片机基础开发流程和基本I/O口

&#x1f308;个人主页: 会编程的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” 51开发平台的组成 单片机应用系统&#xff08;也叫目标系统&#xff09; 硬件&#xff1a; 用户可以自己设计制作&#xff0c;也可以采用现成的开发板快捷搭建 软件&#xff1a; …

扁平数据转树形结构,让数据管理更清晰

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

LangChain原理深度解析:构建高效语言模型应用的关键框架

LangChain原理介绍 摘要&#xff1a; 本文将详细介绍LangChain的基本原理&#xff0c;包括其设计思路、核心组件、工作流程以及在语言模型应用开发中的应用。通过通俗易懂的语言&#xff0c;本文旨在让读者对LangChain有一个全面的了解。 关键词&#xff1a; LangChain&#…

1.初学docker

这是在centos7上的基本操作用法。 一、基本操作 # 安装yum源 yum install -y yum-utils # 配置yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装docker yum install -y docker-ce-cli containerd.io docker-buildx-plu…

数学计算器

1 问题 该代码提供了一个简单的数学计算器&#xff0c;可以让用户输入一个数学表达式并计算结果。这个计算器可以用于执行各种基本数学运算&#xff0c;如加法、减法、乘法、除法、幂运算等&#xff0c;也可以处理更复杂的表达式&#xff0c;如三角函数、对数、指数等。 2 方法…

C语言——函数指针——函数指针数组 (详解)

函数指针数组 函数指针数组的作用 函数指针数组是一个数组&#xff0c;其中的每个元素都是一个函数指针。函数指针是指向函数的指针变量&#xff0c;可以用来调用相应的函数。函数指针数组的作用是可以根据需要动态地选择并调用不同的函数。 函数指针数组的使用场景有很多&…

MIT 6.858 计算机系统安全讲义 2014 秋季(四)

译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 污点跟踪 注意&#xff1a; 这些讲座笔记是从 2014 年 6.858 课程网站上发布的笔记上稍作修改的。 安卓安全策略 这篇论文试图解决什么问题&#xff1f; 应用程序可以外泄用户的私人数据并发送到某个服务器。 高层次…

Linux bzip2命令教程:文件压缩与解压缩实战(附案例详解和注意事项)

Linux bzip2命令介绍 bzip2是一个基于命令行的文件压缩器&#xff0c;它使用Burrows-Wheeler块排序文本压缩算法和哈夫曼编码来进行压缩。它的主要功能是压缩和解压缩文件&#xff0c;将多个文件绑定成一个单一的文件&#xff0c;这样可以减少原始文件所占用的存储空间。 Lin…

微服务day06-Docker

Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题 开发、测试、生产环境有差异 1.什么是Docker? 大型项目组件很多&#xff0c;运行环境复杂&#xff0c;部署时会遇到各种…

WatchBird: 新一代纯PHP防火墙

WatchBird: 新一代纯PHP防火墙 工具安装 广大研究人员可以使用下列命令直接将项目源码克隆至本地 git clone https://github.com/leohearts/awd-watchbird.git工具部署 1.进入下载好的文件夹目录 2.编译waf.c生成.so文件,参考命令:gcc waf.c -shared -fPIC -o waf.so 3.将w…

大数(long long 也存不下)求余数

现在有一个数n为&#xff1a;12345678901234567890123456789012345678901234567890&#xff0c;要你求 n / 2023 和 n % 2023 的数值 模拟长除法 平时我们在进行除法时&#xff0c;用的是长除法&#xff0c;我们可以用代码来模拟这种思路 #include<iostream> #include<…

Beans模块之工厂模块BeanFactory

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

SDK集群模式数据库中,ETCD起什么作用?

在云计算中&#xff0c;数据库使用 ETCD 和 SDK 集群模式可以提高数据库的可用性、可扩展性和灵活性。具体来说&#xff0c;可以使用 ETCD 来存储和管理数据库的配置信息、状态信息、元数据等&#xff0c;然后使用 SDK 集群模式来开发和部署数据库应用程序。 在使用 ETCD 和 SD…