当前位置: 首页 > news >正文

深度学习——神经网络1

一、神经网络

1.神经网络

  • 定义:人工神经网络(Artificial Neural Network,ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。人脑可以看作是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。

  • 神经网络中信息只向一个方向移动,即从输入节点向前移动,通过隐藏节点,再向输出节点移动。其中基本部分是:

    • 输入层:即输入x的那一层
    • 输出层:即输出y的那一层
    • 隐藏层:输入层和输出层之间都是隐藏层
  • 特点:

    • 同一层神经网络之间没有连接
    • 第N层的每个神经元和第N-1层的所有神经元相连,这就是全连接神经网络(full connected,fc)
    • 第N-1层神经元的输出就是第N层神经元的输入
    • 每个连接都有一个权重值(w系数和b系数)

2.激活函数

  • 激活函数用于对每层的输出数据(加权和数据)进行变换,进而为整个网络注入了非线性因素。此时,神经网络就可以拟合各种曲线
    • 没有引入非线性因素的网络等价于使用一个线性模型来拟合
    • 通过给网络输出增加激活函数,实现引入非线性因素,使得网络模型可以逼近任意函数,提升网络对复杂问题的拟合能力

(1)sigmiod函数

  • 公式:f(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+ex1

  • 求导公式:KaTeX parse error: {equation} can be used only in display mode.

  • 缺点:当神经网络的激活处于0, 1位置时,其梯度几乎为0,容易导致梯度消失,此时网络参数将更新极其缓慢,或者无法更新

  • 一般来说,sigmoid网络在5层之类就会产生梯度消失现象。而且,该激活函数并不是以0为中心,所以在实践中很少使用这种激活函数,sigmoid函数一般只用于二分类的输出层

(2)tanh激活函数

  • 公式:f(x)=1−e−2x1+e−2xf(x) = \frac{1-e^{-2x}}{1+e^{-2x}}f(x)=1+e2x1e2x
  • 求导公式:KaTeX parse error: {equation} can be used only in display mode.
  • 其输出值域是(-1, 1),值域范围更大,使之更适合于神经网络的输入层和隐藏层
  • 与sigmoid相比,它是以0为中心的,且梯度相对于sigmoid大,使得其收敛速度要比sigmoid快,减少迭代次数,但当输入值较大时,会导致梯度消失的问题
  • 使用时:可在隐藏层使用tanh函数,在输出层使用sigmoid函数

(3)ReLU激活函数

  • 是目前使用最多的一种激活函数

  • 公式:f(x)=max(0,x)f(x)=max(0, x)f(x)=max(0,x)

  • 求导公式:KaTeX parse error: {equation} can be used only in display mode.

  • 激活函数将小于0的值映射为0,而大于0的值则保持不变,它更加重视正信号,而忽略负信号,这种激活函数运算更为简单,能够提高模型的训练效率

  • 当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0的区域,导致对应权重无法更新,这种现象被称为“神经元死亡”

  • ReLU是目前最常用的激活函数。与sigmoid相比,ReLU的优势是:采用sigmoid函数,计算量大(指数运算),反向传播球误差梯度时,计算量相对大,而采用ReLU激活函数,整个过程的计算量节省很多。sigmoid函数反向传播时,很容易出现梯度消失的情况,从而无法完成深度网络的训练。ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性(网络变得简单),并且减少了参数的相互依存关系,缓解了过拟合问题的发生

(4)Softmax函数

  • softmax用于多分类过程中,它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率形式呈现出来

  • 公式:softmax(zi)=ezi∑jejzsoftmax(z_i)=\frac{e^{z_i}}{\sum_je^z_j}softmax(zi)=jejzezi

    • ziz_izi:输出层中每个神经元加权和(logits)
  • Softmax就是将网络输出logits通过softmax函数,就映射成为(0,1)的值,而这些值的累和为1,那么我们将它理解成概率,选取概率最大(也就是值对应最大的节点),作为我们的预测目标类别

(5)激活函数的选择方法

对于隐藏层

  1. 优先选择ReLU激活函数
  2. 如果ReLU效果不好,那么尝试其他激活,如Leaky ReLU等
  3. 如果你使用了ReLU,需要注意一下Dead ReLU问题,避免出现大的梯度导致过多的神经元死亡
  4. 少使用sigmoid激活函数,可以尝试使用tanh激活函数

对于输出层

  1. 二分类问题选择sigmoid激活函数
  2. 多分类问题选择softmax激活函数
  3. 回归问题选择identity激活函数(恒等激活)

3.参数初始化

优先选择kaiming和xavier初始化方式

(1)初始化www

  • 均匀分布初始化:权重参数初始化从区间均匀随机取值。即在(−1d,1d)(-\frac{1}{\sqrt d}, \frac{1}{\sqrt d})(d1,d1)均匀分布中生成当前神经元的权重,其中d为每个神经元的输入数量
  • 正态分布初始化:随机初始化从均值为0,标准差是1的高斯分布中取样,使用一些很小的值对参数W进行初始化

(2)初始化bbb

  • 全0初始化:将神经网络中的所有权重参数初始化为0
  • 全1初始化:将神经网络中的所有权重参数初始化为1
  • 固定值初始化:将神经网络中的所有权重参数初始化为某个固定值

(3)初始化方法改进

  1. kaiming初始化,也叫做HE初始化
    • HE初始化分为正态分布的HE初始化,均匀分布的HE初始化
      • 正态分布的HE初始化:stddev=2fan_instddev = \sqrt{\frac{2}{fan\_in}}stddev=fan_in2
      • 均匀分布的HE初始化:从[-limit, limit]中的均匀分布中抽取样本,limit是6fan_in\sqrt{\frac{6}{fan\_in}}fan_in6
      • fan_infan\_infan_in输入神经元个数
  2. xavier初始化,也叫做Glorot初始化
    • Glorot初始化分为正态分布的xavier初始化,均匀分布的xavier初始化
      • 正态化的xavier初始化:stddev=2fan_in+fan_outstddev=\sqrt{\frac{2}{fan\_in+fan\_out}}stddev=fan_in+fan_out2
      • 均匀分布的Xavier初始化:从[-limit, limit]中的均匀分布中抽取样本,limit是6fan_in+fan_out\sqrt{\frac{6}{fan\_in+fan\_out}}fan_in+fan_out6
      • fan_infan\_infan_in是输入神经元个数,fan_outfan\_outfan_out是输出的神经元个数

4.神经网络搭建和参数计算

(1)模型搭建

  • 在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法
    • _init\_ 方法中定义网络中的层结构,主要是全连接层,并进行初始化
    • forward方法,在实例化模型的时候,底层会自动调用该函数。该函数中可以定义学习率,为初始化定义的layer传入数据等。

(2)网络参数量的统计方法

  • 统计每一层中的权重w和偏置b的数量
from torchsummary import summary
……
summary(my_modelll, input_size=(3, ), batch_size = 8)for name, para in my_model.named_parameters():print(name)print(para)

5.神经网络优缺点

  • 优点
    • 精度高,性能优于其他机器学习方法,甚至在某些领域超过了人类
    • 可以近似任意的非线性函数随之计算机硬件的发展
    • 近年来在学界和业界受到了热捧,有大量的框架和库可调
  • 缺点
    • 黑箱,很难解释模型是怎么工作的
    • 训练时间长,需要大量的算力
    • 网络结构复杂,需要调整超参数
    • 小数据集上表现不佳,容易发生过拟合
http://www.dtcms.com/a/269962.html

相关文章:

  • JK触发器Multisim电路仿真——硬件工程师笔记
  • HMI安全设计规范:ISO 26262合规的功能安全实现路径
  • python2.7/lib-dynload/_ssl.so: undefined symbol: sk_pop_free
  • 查询依赖冲突工具maven Helper
  • 常见的网络攻击方式及防御措施
  • 人工智能与人工智障———仙盟创梦IDE
  • Go HTTP 调用(上)
  • LeetCode 1248.统计优美子数组
  • cocos2dx3.x项目升级到xcode15以上的iconv与duplicate symbols报错问题
  • 云原生时代的日志管理:ELK、Loki、Fluentd 如何选型?
  • C++11 算法详解:std::copy_if 与 std::copy_n
  • UVC(USB Video Class,USB 视频类)协议
  • 代码详细注释:ARM-Linux字符设备驱动开发案例:LCD汉字输出改进建议开发板断电重启还能显示汉字,显示汉字位置自定义
  • 高版本的MacOS如何降级?
  • 数据库|达梦DM数据库配置实例步骤
  • npm 包 scheduler 介绍
  • 黑马点评系列问题之P37商户点评缓存作业,用了string和list两种方法,可以直接复制粘贴
  • K8s-配置管理
  • 【web安全】SQLMap 参数深度解析:--risk 与 --level 详解
  • linux网络编程之IO多路复用模型
  • 车载以太网-TC8测试-UT(Upper Tester)
  • Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?
  • 2025年微软mos备考攻略-穷鬼版
  • 3.2 ASPICE的项目监控
  • 内网服务器怎么设置公网远程访问? windows桌面连接和Linux自带SSH外网异地跨网用完整步骤教程
  • K8s——配置管理(2)
  • 基于springboot的非遗传承宣传平台
  • Spring 框架实现账户转账功能全解析
  • 开疆智能Profinet转DeviceNet网关连接掘场空气流量计配置案例
  • 时序数据库:高效处理时间序列数据的核心技术