神经网络基础——激活函数的选择、参数初始化

一、神经网络

1、神经网络

        人工神经网络(Artificial Neural Network,即ANN也简称为神经网络(NN是一种模仿生物神经网络结构 和功能的计算模型。

 2、基本部分

        输入层:输入 x

        输出层:输出 y

        隐藏层:输入与输出之间所有层

3、特点

        同一层的神经元之间没有连接

        第 N 层的每个神经元和第 N-1层 的所有神经元相连(full connected),即全连接神经网络

        第 N-1层神经元的输出就是第 层神经元的输入

        每个连接都有一个权重值(w系数和b系数)

二、激活函数

        用于对每层的输出数据进行变换进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种曲线

        1、sigmoid 激活函数

            公式:

             求导公式:

             绘制函数图像:

import torch
import matplotlib.pyplot as plt

# 函数图像
x = torch.linspace(-20,20,1000)
# 输入值x 通过 sigmoid函数 转换成 激活值y
y = torch.sigmoid(x)

# 创建画布、坐标轴
plt.plot(x,y)
plt.grid()
plt.show()

# 导数图像
x = torch.linspace(-20,20,1000,requires_grad=True)
# 自动微分
torch.sigmoid(x).sum().backward()

plt.plot(x.detach(),x.grad)
plt.grid()
plt.show()

        sigmoid 函数可以将任意的输入映射到 (0, 1) 之间,当输入的值大致在 <-6 或者 >6 时,意味着输入任何值 得到的激活值都是差不多的,这样会丢失部分信息。比如:输入 100 和输出 10000 经过 sigmoid 的激活值几乎都是等于 1 的,但是输入的数据之间相差 100 倍的信息就丢失了。

        对于 sigmoid 函数而言,输入值在 [-6, 6] 之间输出值才会有明显差异,输入值在 [-3, 3] 之间才会有比较好的效果

        通过上述导数图像,我们发现 导数 数值范围是 (0, 0.25) ,当输入 <-6 或者 >6 时, sigmoid 激活函数图像的 导数接近为 0 ,此时网络参数 更新 极其 缓慢 ,或者 无法更新
        一般来说, sigmoid 网络在 5 层之内  就会产生 梯度消失 现象。而且,该激活函数并不是以 0 为中心的,所以在实践中这种激活函数使用的很少。sigmoid 函数一般只用于 二分类 输出层
        2、tanh 激活函数

                公式:

                求导公式:

                函数图像:

        Tanh 函数将 输入 映射到 (-1, 1) 之间 ,图像以 0 为中心,在 0 点对称,当输入 大概<-3 或者
>3 时将被映射为 -1 或者 1。 导数值 范围 (0, 1) ,当输入的值大概 <-3 或者 > 3 时,其导数
近似 0。
        与 Sigmoid 相比,它是 以 0 为中心 的,且梯度相对于sigmoid大,使得其收敛速度要比
Sigmoid ,减少迭代次数。然而,从图中可以看出,Tanh 两侧的导数也为 0,同样会造成
梯度消失。
        若使用时可在 隐藏层 使用 tanh函数 ,在 输出层使用sigmoid函数
        3、ReLU 激活函数

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

                求导公式:         f '(x) = 0 或 1

                函数图像:

        ReLU 激活函数将小于 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 就是将网络输出的 logits 通过 softmax 函数,就映射成为(0,1)的值,而这些值的累和 为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)节,作为我们的预测目标类别

scores = torch.tensor([0.2, 0.02, 0.15, 0.15, 1.3, 0.5, 0.06, 1.1, 0.05, 3.75])
probabilities = torch.softmax(scores,dim=0)
print(probabilities)

输出结果: 

        5、其他激活函数

        6、选择方法

        对于 隐藏层

        1. 优先选择 ReLU激活函数

        2. 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。

        3. 如果使用了ReLU, 需要注意Dead ReLU问题, 避免出现大的梯度从而导致过多的神经元死亡。

        4. 少用sigmoid激活函数,可以尝试使用tanh激活函数

        对于 输出层

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

三、参数初始化

        1、均匀分布 初始化

        权重参数初始化从区间均匀随机取值,即在(\frac{-1}{\sqrt{d}}\frac{1}{\sqrt{d}})均匀分布中生成当前神经元的权重(d为每个神经元的输入数量)

import torch
import torch.nn.functional as F
import torch.nn as nn
# 均匀分布 随机初始化
def test01():
    linear = nn.Linear(5, 3)
    # 从 0 ~ 1 均匀分布产生参数
    nn.init.uniform_(linear.weight)
    print(linear.weight.data)
        2、正态分布 初始化

       随机初始化从均值为0标准差为1的高斯分布中取样,使用一些很小的值对参数W进行初始化

# 正态分布随机初始化
def test05():
    linear = nn.Linear(5, 3)
    nn.init.normal_(linear.weight, mean=0, std=1)
    print(linear.weight.data)
        3、全0 初始化

        将神经网络中的所有权重参数初始化为 0

# 全0初始化
def test03():
    linear = nn.Linear(5, 3)
    nn.init.zeros_(linear.weight)
    print(linear.weight.data)
        4、全1 初始化

        将神经网络中的所有权重参数初始化为 1

# 全1初始化
def test04():
    linear = nn.Linear(5, 3)
    nn.init.ones_(linear.weight)
    print(linear.weight.data)
        5、固定值初始化

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

# 固定初始化
def test02():
    linear = nn.Linear(5, 3)
    nn.init.constant_(linear.weight, 5)
    print(linear.weight.data)
        6、kaiming 初始化

        正态化HE初始化:均值为0,stddev(方差)=  \sqrt{\frac{2}{input}}

        均匀分布HE初始化:从 [ -limit,limit ] 的均匀分布中抽取样本,limit =  \sqrt{\frac{6}{input}}

        input:输入神经元的个数

# kaiming 初始化
def test06():
    # kaiming 正态分布初始化
    linear = nn.Linear(5, 3)
    nn.init.kaiming_normal_(linear.weight)
    print(linear.weight.data)
    # kaiming 均匀分布初始化
    linear = nn.Linear(5, 3)
    nn.init.kaiming_uniform_(linear.weight)
    print(linear.weight.data)
        7、xavier 初始化

        正态化Xavier初始化:均值为0,stddev(方差)=  \sqrt{\frac{2}{input+output}}

        均匀分布Xavier初始化:从 [ -limit,limit ] 的均匀分布中抽取样本,limit =  \sqrt{\frac{6}{input+output}}

        input:输入神经元的个数,output:输出神经元的个数

# xavier 初始化
def test07():
    # xavier 正态分布初始化
    linear = nn.Linear(5, 3)
    nn.init.xavier_normal_(linear.weight)
    print(linear.weight.data)
    # xavier 均匀分布初始化
    linear = nn.Linear(5, 3)
    nn.init.xavier_uniform_(linear.weight)
    print(linear.weight.data)
一般我们在使用 PyTorch 构建网络模型时,每个网络层的参数都有默认的初始化方法,优先选择
kaming 的初始化、xavier 初始化方式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DS Wannabe之5-AM Project: DS 30day int prep day20

Q1. Do you have any idea about Event2Mind in NLP? Yes, it is based on NLP research paper to understand the common-sense inference from sentences. Event2Mind: Common-sense Inference on Events, Intents, and Reactions The study of “Commonsense Reasoning”…

为什么json属性名被设计为必须有引号?

JSON——JavaScript Object Notation&#xff0c;直译过来就是JavaScript对象标记法。 这是一种数据交换格式&#xff0c;简单来说&#xff0c;就像我们平时写收发地址一样&#xff0c;规定了一种大家都认同的格式&#xff0c;让数据在不同的系统之间传递得既安全又不会走丢。 …

使用go-llama.cpp 运行 yi-01-6b大模型,使用本地CPU运行,速度挺快的

1&#xff0c;视频地址 2&#xff0c;关于llama.cpp 项目 https://github.com/ggerganov/llama.cpp LaMA.cpp 项目是开发者 Georgi Gerganov 基于 Meta 释出的 LLaMA 模型&#xff08;简易 Python 代码示例&#xff09;手撸的纯 C/C 版本&#xff0c;用于模型推理。所谓推理…

Python之海象运算符

在 Python 3.8 及更高版本中&#xff0c;引入了一种新的语法特性&#xff0c;称为"海象运算符"&#xff08;Walrus Operator&#xff09;&#xff0c;它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…

14. UE5 RPG使用GameplayTag

GameplayTag本来是应用在GAS游戏技能系统里面的&#xff0c;后来UE直接将其抽离出来&#xff0c;作为一个模块&#xff0c;现在可以不在GAS里也可以使用这个模块。比如&#xff0c;我需要判断一个射线拾取的物体&#xff0c;首先我需要判断这个actor是否存在&#xff0c;然后判…

torch.manual_seed(233333)

torch.manual_seed&#xff08;233333&#xff09; 介绍报错信息解决问题总结 介绍 这是在使用GPT-SoVITS时运行缺失pytorch导致报的错 报错信息 Traceback (most recent call last): File “D:\vits\GPT-SoVITS-beta\GPT-SoVITS-beta0217\webui.py”, line 10, in torch.m…

​ 安达发|APS排程软件的动态合并优化详解

在制造业中&#xff0c;为了提高生产效率、降低成本并满足客户需求&#xff0c;企业需要采用先进的人工智能算法APS系统。APS&#xff08;高级计划与排程&#xff09;系统作为一种强大的工具&#xff0c;可以帮助企业实现这一目标。本文将详细介绍APS排程软件的动态合并优化功能…

线阵相机之帧超时

1 帧超时的效果 在帧超时时间内相机若未采集完一张图像所需的行数&#xff0c;则相机会直接完成这张图像的采集&#xff0c;并自动将缺失行数补黑出图&#xff0c;机制有以下几种选择&#xff1a; 1. 丢弃整张补黑的图像 2. 保留补黑部分出图 3.丢弃补黑部分出图

Java线程池ThreadPoolExecutor运行机制和源码解析

线程池简介 线程的每次创建和销毁都会产生的一定的系统资源和时间的开销。正如几乎所有重资源都使用池化技术&#xff08;数据库连接池、redis连接池等&#xff09;进行管理&#xff0c;线程作为操作系统宝贵的资源&#xff0c;对它的使用需要进行控制管理&#xff0c;线程池就…

【前沿】头戴式光场显示技术研究进展

摘要&#xff1a;光场显示器旨在通过重建三维场景在不同方向发出的几何光线来渲染三维场景的视觉感知&#xff0c;从而为人的视觉系统提供自然舒适的视觉体验&#xff0c;解决传统平面立体三维显示器中的聚散调节冲突问题。近年来&#xff0c;多种光场显示方法被尝试应用到头戴…

特征选择、特征降维和特征提取到底有什么区别和联系?这篇文章一次性给你讲清楚!

目录 一、特征选择&#xff1a; 1.最大互信息系数(MIC)&#xff1a; 2.互信息(MI)&#xff1a; 3.最大相关最小冗余算法(mRMR)&#xff1a; 4.支持向量机递归特征消除(SVM_RFE)&#xff1a; 二、特征降维&#xff1a; 1.主成分分析(PCA)&#xff1a; 2.核主成分分析(KP…

【数据结构/c++】求解有向无环图DAG的关键路径

#include<cstring>//memset头文件 #include<algorithm>//fill头文件 #include<vector> #include<stdio.h> #include<stack> #include<queue> using namespace std; const int MAXV510; struct Node{int v,w;Node(int _v,int _w):v(_v),…

【.NET Core】常见C#代码约定

【.NET Core】常见C#代码约定 文章目录 【.NET Core】常见C#代码约定一、概述二、代码预定的目标三、代码约束工具和分析器四、C#语言准则五、字符串约定5.1 使用字符串内插来连接短字符串5.2 插入大文本时&#xff0c;使用System.Text.StringBuilder对象 六、数组约定七、委托…

提升认知水平和防止偏见浅谈

提升认知水平和防止偏见浅谈 《庄子外物》&#xff1a;井蛙不可语海&#xff0c;夏虫不可语冰。 不要跟井底的青蛙谈论大海&#xff0c;因为它的认知只有井底那么大&#xff0c;大海对于它来说是认知盲区&#xff1b;不要与夏虫去谈论冰雪&#xff0c;因为夏虫一生很短没有经历…

springboot203医疗挂号管理系统

医疗挂号管理系统设计与实现 摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对医…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架&#xff0c;flash被一刀切&#xff0c;360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环&#xff0c;洗脑神曲 dream it po…

spring boot3参数校验基本用法

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 前言 导入依赖 使用介绍 配置检验规则 开启校验 使用注意 全局异常捕获返回友好提示信息 常用的校…

Sparse MLP

上图展示了本文网络的整体架构。与ViT、MLP-Mixer和Swin Transformer类似&#xff0c;空间分辨率为HW的输入图像被分割为不重叠的patch。作者在网络中采用了44的patch大小&#xff0c;每个patch被reshape成一个48维的向量&#xff0c;然后由一个线性层映射到一个c维embedding i…

可解决95%以上问题的Linux命令!能用到退休

对于我们程序员来说&#xff0c;我们始终绕不过去要与 Linux 系统打交道。很多人&#xff0c;特别是新手程序员&#xff0c;一看到 Linux 系统那个小黑框&#xff0c;就发怵&#xff0c;其实&#xff0c;如果你真正去深入了解了&#xff0c;然后再学会一些常用的命令&#xff0…

网络入山太困难?看格行随身WiFi如何助力大山教育!

近日&#xff0c;一则关于偏远大山的上网问题冲上了热搜&#xff0c;引发了社会关注。虽然很多山区都已经通了电、通了网&#xff0c;但是在一些贫困的地区&#xff0c;网络基础设施依旧薄弱&#xff0c;村民想要使用固定宽带&#xff0c;仍然十分困难。 而在山区的学生们&…
最新文章