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

一、神经网络

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.mzph.cn/news/693660.shtml

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

相关文章

国际章真厉害,离婚后仍带汪峰继女小苹果赴日滑雪。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 在如今这个纷繁复杂的社会中&#xff0c;家庭关系和亲子关系的…

由于 vscode 版本更新为 1.86.1引起的相关问题。

通过vscode ssh来远程连接linux服务器的代码&#xff0c;由于vscode 1.86.1的更新&#xff0c;在连接服务器时就开始报 两个错误了&#xff1a; Missing GLIBCXX > 3.4.25! Missing GLIBC > 2.28! lwd192.168.66.148s password: 075b6e8e3a87: runningMissing GLIBCXX &g…

Java Spring面试题解析(上)

1.Spring MVC工作流程&#xff1f;【重点】 用户发送请求至前端控制器DispatcherServlet&#xff1b; DispatcherServlet收到请求调用HandlerMapping处理器映射器&#xff1b; 处理器映射器根据请求URL找到具体的处理器&#xff0c;生成处理器对象及处理器拦截器&#xff08;如…

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18 * 3, maxm 4e4 …

python语言常见面试题:什么是Python中的鸭子类型(Duck Typing)?

鸭子类型&#xff08;Duck Typing&#xff09;是Python中一个非常重要的概念&#xff0c;它强调的是对象的行为&#xff0c;而不是对象的类型。鸭子类型的核心思想是&#xff1a;“如果它走起路来像鸭子、叫起来也像鸭子&#xff0c;那么它就是鸭子”。换句话说&#xff0c;只要…

开源CMS Drupal本地快速部署并实现无公网ip环境远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

Masonry源码

浅谈 这篇文章是 Masonry 框架源码的解析和笔记。学习Masonry之前&#xff0c;先了解这个框架设计的初衷—传统的利用系统API进行纯代码布局的不足。然后&#xff0c;根据Masonry常见的几个链式语法中&#xff0c;顺藤摸瓜地了解Masonry的调用栈。最后&#xff0c;学习并思考这…

阿里云幻兽帕鲁服务器操作系统Linux和Windows哪个好?

使用阿里云服务器搭建幻兽帕鲁操作系统类型选Windows还是Linux&#xff1f;如果对Linux熟悉就选择Linux&#xff0c;相对于windows&#xff0c;Linux更少占用系统资源&#xff1b;如果对Linux不熟悉&#xff0c;首选Windows。事实上&#xff0c;阿里云提供的幻兽帕鲁服务器通过…

Qt的跨平台开发

自从最初发布以来&#xff0c;Qt就以其跨平台的能力而闻名——这是创建这个框架背后的主要愿景。您可以在自己喜欢的桌面平台(如Windows、Linux和mac OS)上使用Qt Creator&#xff0c;并使用相同的代码库或稍加修改&#xff0c;创建流畅、现代、触摸友好的图形用户界面(GUI)和桌…

MySql重要知识梳理

文章目录 一.索引1.索引概述2.索引优缺点3. 索引结构为什么InnoDB存储引擎选择使用Btree索引结构? 4.索引分类思考InnoDB主键索引的Btree高度为多高? 5. 索引语法1.索引语法2.sql性能分析1.SQL执行频率2.慢查询日志3.explain执行计划 3.索引使用规则1.最左前缀法则2.索引失效…

把excel模版保存到文件夹里不走接口进行下载的方法

把excel保存到文件夹不走接口进行下载&#xff0c;一定要注意&#xff0c;需要放到public下的static文件夹下&#xff0c;如果没有static文件夹&#xff0c;就新建一个 &#xff01;&#xff01;&#xff01;不放在static文件夹下可能会报错&#xff0c;提示&#xff1a;无法从…

MyBatis-获取参数

1. 创建MyBatis配置文件模板 编辑完Mybatis核心配置文件和properties文件后&#xff0c;打开IDEA的设置界面&#xff0c;找到Editor中的File and Code Templates&#xff0c;点击加号新增模板。接着将编辑好的核心配置文件中的内容复制粘贴到空白框中&#xff0c;设置好模板名…

Android为现有的应用工程设置 Compose

点击查看&#xff1a;Compose 快速入门 点击查看&#xff1a;Jetpack Compose 与 Kotlin 的兼容性对应关系 要开始使用 Compose&#xff0c;您需要先向项目中添加一些 build 配置。将以下定义添加到应用的 build.gradle 或者build.gradle.kts 文件中&#xff1a; build.gradle…

嵌入式学习day23 Linux

时间获取: 1.time time_t time(time_t *tloc); 功能: 返回1970-1-1到现在的秒数&#xff08;格林威治时间&#xff09; 参数: tloc:存放秒数空间首地址 返回值: 成功返回秒数 失败返回-1 2.localtime str…

计算机专业有关的几部电影

推荐几部计算机专业必看的几部电影&#xff1a; 《黑客帝国》&#xff08;The Matrix&#xff09; 这部电影是科幻电影的经典之作&#xff0c;它展示了一个由机器控制的虚拟现实世界。影片中的计算机特效和对虚拟现实的描绘&#xff0c;对于理解计算机图形学和人工智能的概念…

力扣(leetcode)第485题最大连续1的个数(Python)

485.最大连续1的个数 题目链接&#xff1a;485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#x…

代码随想录第二十一天 701.二叉搜索树中的插入操作 108.将有序数组转换为二叉搜索树

701.二叉搜索树中的插入操作 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&a…

RESTful 风格是指什么

RESTful&#xff08;Representational State Transfer&#xff09;是一种基于 HTTP 协议的软件架构风格&#xff0c;用于设计网络应用程序的接口。它的设计理念是利用 HTTP 协议中的方法&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;来对资源进行 CRUD&#xff0c;使得…

目前最新的基于Debian12的树莓派系统换源方式

前言 树莓派目前最新为debian12系统&#xff0c;网上有很多旧的换源方式&#xff0c;随着系统更新不一定有效 流程 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup 备份旧的数据 sudo nano /etc/apt/sources.list编辑sources.list文件 deb http://mirrors.…

上传代码到云效

1.获得邀请链接&#xff0c;加入工作台 > 点击代码管理 2.创建代码库后 > 点击克隆下载 > 复制https链接 3.如果未安装git客户端先安装 > 选择一个本地文件夹右击鼠标点击Git Bash Here打开git命令窗 4.克隆时提示输入账号密码&#xff0c;在云效个人设置页面Ht…