深度学习-多层神经网络

文章目录

多层深度神经网络

从单层到多层是神经网络发展史上的重大变化,层的增加彻底将神经网络的性能提升到了另一个高度,正确理解层的意义对于我们自主构建神经网络有很重要的作用,学会利用层是避免浪费计算资源以及提升神经网络效果的关键。

一.黑箱:深层神经网络的不可解释性

在这里插入图片描述
首先从结构上来看,多层神经网络比单层神经网络多出了“中间层”。中间层常常被称为隐藏层(hidden layer),理论上来说可以有无限层,所以在图像表示中经常被省略。层数越多,神经网络的模型复杂度越高,一般也认为更深的神经网络可以解决更加复杂的问题。在学习中,通常我们最多只会设置3~5个隐藏层,但在实际工业场景中会更多。还记得这张图吗?当数据量够大时,现代神经网络层数越深,效果越好。

在一个神经网络中,更靠近输入层的层级相对于其他层级叫做"上层",更靠近输出层的则相对于其他层级叫做"下层"。若从输入层开始从左向右编号,则输入层为第0层,输出层为最后一层。除了输入层以外,每个神经元中都存在着对数据进行处理的数个函数。在我们的例子异或门(XOR)中,隐藏层中的函数是NAND函数和OR函数(也就是线性回归的加和函数+阶跃函数),输出层上的函数是AND函数。 对于所有神经元和所有层而言,加和函数的部分都是一致的(都得到结果 z z z),因此我们需要关注的是加和之外的那部分函数。在隐藏层中这个函数被称为激活函数,符号为 h ( z ) h(z) h(z),在输出层中这个函数只是普通的连接函数,我们定义为是 g ( z ) g(z) g(z)。我们的数据被逐层传递,每个下层的神经元都必须处理上层的神经元中的 h ( z ) h(z) h(z)处理完毕的数据,整个流程本质是一个嵌套计算结果的过程。

在神经网络中,任意层上都有至少一个神经元,最上面的是常量神经元,连接常量神经元的箭头上的参数是截距 b b b,剩余的是特征神经元,连接这些神经元的箭头上的参数都是权重 ω \omega ω。神经元是从上至下进行编号,需要注意的是,常量神经元与特征神经元是分别编号的。和从0开始编号的层数不同,神经元是从1开始编号的。在异或门的例子中,含有1的偏差神经元是1号偏差神经元,含有特征 x 1 x_1 x1的神经元则是1号特征神经元。

除了神经元和网络层,权重、偏差、神经元上的取值也存在编号。这些编号规律分别如下:

在这里插入图片描述

二.多元神经网络: 层与 h ( z ) h(z) h(z)

我们首先想要发问的隐藏层的作用。在之前的XOR函数中,我们提出”多层神经网络能够描绘出一条曲线 作为决策边界,以此为基础处理单层神经网络无法处理的复杂问题“,这可能让许多人产生了“是增加层 数帮助了神经网络”的错觉。实际上并非如此。 在神经网络的隐藏层中,存在两个关键的元素,一个是加和函数 ,另一个是 。除了输入层之外, 任何层的任何神经元上都会有加和的性质,因为神经元有“多进单出”的性质,可以一次性输入多个信 号,但是输出只能有一个,因此输入神经元的信息必须以某种方式进行整合,否则神经元就无法将信息 传递下去,而最容易的整合方式就是加和 。因此我们可以认为加和 是神经元自带的性质,只要增加 更多的层,就会有更多的加和。但是 的存在却不是如此,即便隐藏层上没有 (或 是一个恒 等函数),神经网络依然可以从第一层走到最后一层。让我们来试试看,在XOR中,假设隐藏层上没有 的话, 会发生什么:
在这里插入图片描述


xorgate = torch.tensor([0,1,1,0],dtype=torch.float32) 
def AND(X):    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)    zhat = torch.mv(X,w)    #下面这一行就是阶跃函数的表达式,注意AND函数是在输出层,所以保留输出层的阶跃函数g(z)    andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return andhat def OR(X):    w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里我修改了b的数 值    zhat = torch.mv(X,w)    #注释掉阶跃函数,相当于h(z)是恒等函数    #yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return zhatdef NAND(X):    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)    zhat = torch.mv(X,w)    #注释掉阶跃函数,相当于h(z)是恒等函数    #yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return zhat def XOR(X):    #输入值:    input_1 = X    #中间层:    sigma_nand = NAND(input_1)    sigma_or = OR(input_1)    x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)    #输出层:input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)    y_and = AND(input_2)    #print("NANE:",y_nand)    #print("OR:",y_or)    return y_andXOR(X)

很明显,此时XOR函数的预测结果与真实的xorgate不一致。当隐藏层的 是恒等函数或不存在时,叠 加层并不能够解决XOR这样的非线性问题。从数学上来看,这也非常容易理解。
从输出层到第一层:
Z 1 = W 1 ∗ X + b 1 ∑ 1 = h ( Z 1 ) ∵ h ( z ) 为恒等函数 ∴ ∑ 1 = [ σ 1 1 σ 2 1 ] = [ z 1 1 z 1 2 ] Z^1 = W^1 * X + b^1 \sum^1 = h(Z^1) \\ \because h(z)为恒等函数 \\ \therefore \sum^1 = \begin{bmatrix} \sigma_1^1\\ \sigma_2^1 \end{bmatrix} = \begin{bmatrix} z^1_1\\ z^2_1 \end{bmatrix} Z1=W1X+b11=h(Z1)h(z)为恒等函数1=[σ11σ21]=[z11z12]

从第1层到输出层:
Z 2 = W 2 ∗ ∑ + B 2 [ z 2 1 ] = [ w 1 → 1 1 → 2 w 1 → 2 1 → 2 ] ∗ [ σ 1 1 σ 1 2 ] + [ b 1 → 1 1 → 2 ] . . . = x 1 W 1 + x 2 W 2 + B ,其中 W 1 , W 2 和 B 都是常数 Z^2 = W^2* \sum + B^2 \\ \begin{bmatrix} z^1_2\\ \end{bmatrix}= \begin{bmatrix} w^{1\to2}_{1\to1} w^{1\to2}_{1\to2} \end{bmatrix} * \begin{bmatrix} \sigma_1^1\\ \sigma_1^2 \end{bmatrix} + \begin{bmatrix} b^{1\to2}_{1\to1} \end{bmatrix} \\ ... \\ =x_1W_1 + x_2W_2 + B,其中W1,W2和B都是常数 Z2=W2+B2[z21]=[w1112w1212][σ11σ12]+[b1112]...=x1W1+x2W2+B,其中W1W2B都是常数

不难发现,最终从输出层输出的结果和第一层的输出结果 x 1 w 1 1 + x 2 w 2 2 + b 1 2 x_1w_1^1 + x_2w_2^2 + b_1^2 x1w11+x2w22+b12是类似的,只不过是乘以特征 x 1 , x 2 x_1,x_2 x1,x2的具体数值不同。在没有 h ( z ) h(z) h(z)时,在层中流动的数据被做了仿射变换(affine transformation),仿射变换后得到的依然是一个线性方程,而这样的方程不能解决非线性问题。可见,“层”本身不是神经网络解决非线性问题的关键,层上的h(z)才是。从上面的例子和数学公式中可以看出,如果 h ( z ) h(z) h(z)是线性函数,或不存在,那增加再多的层也没有用。

那是不是任意非线性函数作为 h ( z ) h(z) h(z)都可以解决问题呢?让我们来试试看,在XOR例子中如果不使用阶跃函数,而使用sigmoid函数作为 h ( z ) h(z) h(z) ,会发生什么。


def AND(X):    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)zhat = torch.mv(X,w)    #下面这一行就是阶跃函数的表达式,注意AND函数是在输出层,所以保留输出层的阶跃函数g(z)   andhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return andhatdef OR(X):   w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里我修改了b的数 值    zhat = torch.mv(X,w)    #h(z), 使用sigmoid函数    sigma = torch.sigmoid(zhat)    return sigmadef NAND(X):   w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)   zhat = torch.mv(X,w)    #h(z), 使用sigmoid函数    sigma = torch.sigmoid(zhat)   return sigmadef XOR(X):    #输入值:    input_1 = X    #中间层:    sigma_nand = NAND(input_1)    sigma_or = OR(input_1)   x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)    #输出层:    input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)    y_and = AND(input_2)    #print("NANE:",y_nand)    #print("OR:",y_or)    return y_and XOR(X) 

可以发现,如果将 h ( z ) h(z) h(z)换成sigmoid函数,XOR结构的神经网络同样会失效!可见,即便是使用了 ,也不一定能够解决曲线分类的问题。在不适合的非线性函数加持下,神经网络的层数再多也无法起效。所以, h ( z ) h(z) h(z)是真正能够让神经网络算法“活起来”的关键,没有搭配合适 h ( z ) h(z) h(z)的神经网络结构是无用的,而 h ( z ) h(z) h(z)正是神经网络中最关键的概念之一激活函数(activation function)。

三.激活函数

激活函数
在人工神经网络的神经元上,根据一组输入定义该神经元的输出结果的函数,就是激活函数。激活 函数一般都是非线性函数,它出现在神经网络中除了输入层以外的每层的每个神经元上。

机器学习中常用的激活函数只有恒等函数(identity function),阶跃函数(sign),sigmoid 函数,ReLU,tanh,softmax这六种,其中Softmax与恒等函数几乎不会出现在隐藏层上,Sign、Tanh几乎不会出现在输出层上,ReLU与Sigmoid则是两种层都会出现,并且应用广泛。
在这里,我们将总结性声明一下输出层的g(z)与隐藏层 的h(z)之间的区别,以帮助大家获得更深的理解:

    1. 虽然都是激活函数,但隐藏层和输出层上的激活函数作用是完全不一样的。输出层的激活函数 是为了让神经网络能够输出不同类型的标签而存在的。其中恒等函数用于回归,sigmoid函数用于 二分类,softmax用于多分类。换句说, g ( z ) g(z) g(z)仅仅与输出结果的表现形式有关,与神经网络的效果无关,也因此它可以使用线性的恒等函数。但隐藏层的激活函数就不同了,如我们之前尝试的 XOR,隐藏层上的激活函数 h ( z ) h(z) h(z)的选择会影响神经网络的效果,而线性的 h ( z ) h(z) h(z)是会让神经网络的结构失效的。
    1. 在同一个神经网络中, 与 可以是不同的,并且在大多数运行回归和多分类的神经网络时, 他们也的确是不同的。每层上的 可以是不同的,但是同一层上的激活函数必须一致。

现在我们来试试看,隐藏层上的 h ( z ) h(z) h(z)是阶跃函数,而输出层的 g ( z ) g(z) g(z)是sigmoid的情况。如果XOR网络依然有效,就证明了 g ( z ) g(z) g(z)的变化对神经网络结果输出无影响。反之,则说明 g ( z ) g(z) g(z)也影响神经网络输出结果。

#如果g(z)是sigmoid函数,而h(z)是阶跃函数 
#输出层,以0.5为sigmoid的阈值 
def AND(X):    w = torch.tensor([-0.2,0.15, 0.15], dtype = torch.float32)    zhat = torch.mv(X,w)    sigma = torch.sigmoid(zhat)   andhat = torch.tensor([int(x) for x in sigma >= 0.5],dtype=torch.float32)    return andhat 
#隐藏层,OR与NAND都使用阶跃函数作为h(z) 
def OR(X):   w = torch.tensor([-0.08,0.15,0.15], dtype = torch.float32) #在这里修改了b的数值    zhat = torch.mv(X,w)   yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return yhat def NAND(X):    w = torch.tensor([0.23,-0.15,-0.15], dtype = torch.float32)    zhat = torch.mv(X,w)    yhat = torch.tensor([int(x) for x in zhat >= 0],dtype=torch.float32)    return yhatdef XOR(X):    #输入值:    input_1 = X    #中间层:sigma_nand = NAND(input_1)    sigma_or = OR(input_1)   x0 = torch.tensor([[1],[1],[1],[1]],dtype=torch.float32)    #输出层:    input_2 = torch.cat((x0,sigma_nand.view(4,1),sigma_or.view(4,1)),dim=1)    y_and = AND(input_2)    #print("NANE:",y_nand)    #print("OR:",y_or)    return y_andXOR(X)

从结果可以看出,只要隐藏层的 h ( z ) h(z) h(z)是阶跃函数,XOR网络就一定能有效,这与输出层 g ( z ) g(z) g(z)是什么函数完全无关。从这里开始,若没有特别说明,当我们提到“激活函数”时,特指隐藏层上的激活函数 h ( z ) h(z) h(z)。当需要表达输出层上的激活函数时,我们需称其为“输出层激活函数”(out_activation)。

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

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

相关文章

「Vue3系列」Vue3 Axios详解

文章目录 一、Vue3 Axios二、Vue3 Axios 请求配置项三、Axios 响应结构四、Axios 拦截器请求拦截器响应拦截器拦截器的移除拦截器的应用场景 五、相关链接 一、Vue3 Axios 在 Vue 3 中,你可以使用 axios 来执行 AJAX 请求。axios 是一个流行的基于 Promise 的 HTTP…

Java面向对象详解以及示例解析

Java面向对象详解 文章目录 Java面向对象详解 面向对象编程(Object-Oriented Programming,简称OOP)是一种计算机编程模型。其核心在于围绕数据或对象来组织软件设计,而非仅仅依赖于功能和逻辑。这种编程方式更专注于对象与对象之间…

设计模式之依赖倒转原则

目录 1、 基本介绍 2、 应用实例 3、 依赖关系传递的三种方式 (1) 接口传递 (2) 构造方法传递 (3) setter方式传递 4、 注意事项和细节 1、 基本介绍 依赖倒转原则(Dependence Inversion Principle)是指: 高层模块不应该依赖低层模块,二者都应该依…

文字悬浮下划线动态效果

概览 此篇文章主要介绍文字悬浮下划线的动画效果&#xff0c;主要有从左往右和从中间至两边扩散两种动态效果 一. 从左往右 示例代码如下 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content…

【C语言】C语言编程进阶:异常处理与程序稳定性全攻略

1. 概述 异常处理又称异常错误处理&#xff0c;它提供了处理程序运行时出现任何意外或异常情况的方法。异常处理通常是防止未知错误的发生所采取的处理措施&#xff0c;对于某一类型的错误&#xff0c;异常处理应该提供相应的处理方法。例如&#xff0c;在设计程序时&#xff…

AI智商排名:Claude-3首次突破100

用挪威门萨&#xff08;智商测试题&#xff09;中 35 个问题对chatGPT等人工智能进行了测试&#xff1a; ChatGPT 对ChatGPT进行了两次挪威门萨测试&#xff0c;在 35 个问题中&#xff0c;它平均答对了 13 个&#xff0c;智商估计为 85。 测试方法 每个人工智能都接受了两次…

<商务世界>《第5课 重组、托管是什么?》

1 托管 1.1 案例 2020年10月&#xff0c;国资委决定&#xff0c;由中国宝武钢铁集团有限公司对中国中钢集团有限公司进行托管&#xff0c;这就意味着中钢集团由一个副部级的央企管理了&#xff0c;虽然级别没有变动&#xff0c;但是他的好多决策都不用先汇报给国资委了&#…

MATLAB知识点:循环语句的经典练习题

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 下面我们来看…

springmvc的使用方法及运行原理

Spring MVC 是 Spring 框架中用于开发 Web 应用程序的一部分&#xff0c;它基于 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;提供了一种灵活且强大的方式来构建 Web 应用。 运行原理&#xff1a; 客户端发送请求&#xff1a;浏览器向服务器发送 H…

贷齐乐错误的waf引起的SQL注入漏洞复现

君衍. 一、环境介绍1、第一道WAF2、第二道WAF 二、环境部署1、模拟源码2、连接数据库源码3、数据库创建4、测试 三、源码分析1、模拟WAF2、注入思路3、PHP下划线特性4、完成假设 四、联合查询注入1、测试回显字段2、爆出库名3、爆出表名4、爆出表下的列名4、爆出flag 一、环境介…

CleanMyMac X4.14.7永久免费Mac电脑清理和优化软件

CleanMyMac X 是一款功能强大的 Mac 清理和优化软件&#xff0c;适合以下几类人群使用&#xff1a; 需要定期清理和优化 Mac 的用户&#xff1a;随着时间的推移&#xff0c;Mac 设备上可能会积累大量的无用文件、缓存和垃圾&#xff0c;导致系统运行缓慢。CleanMyMac X 的智能扫…

【Java JVM】Class 文件

Java 的口号 “一次编写, 到处运行 (Write Once, Run Anywhere)” 的基础: JVM 和 所有平台都统一支持的程序存储格式 – 字节码 (Byte Code)。 只要在对应的平台安装对应的 JVM, 将我们编写的源码编译为 Class 文件, 就能达到了一次编写, 导出运行的目标, 中间的所有细节由不同…

形容passwd和shadow区别

/etc/passwd 存账户信息一般不存密码 /etc/shadow主要用来存密码 /etc/passwd默认是任意用户可读只有root用户可修改 /etc/shadow 默认只有root用户可读可写 /etc/passwd 包含系统用户和用户的主要信息 /etc/shadow 用于储存系统中用户的密码&#xff0c;又称为影子文件 /etc/g…

11.WEB渗透测试-Linux系统管理、安全加固(上)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;10.WEB渗透测试-Linux基础知识-Linux用户权限管理&#xff08;下&#xff09;-CSDN博客 进…

【论文笔记】Language Models are Few-Shot Learners

Language Models are Few-Shot Learners 本部分是 GPT-3 技术报告的第一部分&#xff1a;论文正文、部分附录。 后续还有第二部分&#xff1a;GPT-3 的广泛影响、剩下的附录。 以及第三部分&#xff08;自己感兴趣的&#xff09;&#xff1a;GPT-3 的数据集重叠性研究。 回顾…

部署运维 防火墙,进程 常用命令

防火墙: 1. 查看是否安装了firewalld sudo systemctl status firewalld 查看防火墙状态或者sudo systemctl is-active firewalld 查看防火墙是否是开启状态 2. 开放6379port sudo firewall-cmd --add-port6379/tcp --permanent 刷新防火墙 sudo firewall-cmd --reload 3…

ranger的使用

安装 macOS brew install rangerubuntu sudo apt-get install ranger配置 启动之后ranger会创建一个目录~/.config/ranger 可以使用以下命令复制默认配置文件到这个目录 ranger --copy-configallrc.conf-选项设置和快捷键commands.py-能通过:执行的命令commands_full.py-全套…

产品展示型wordpress外贸网站模板

孕婴产品wordpress外贸网站模板 吸奶器、待产包、孕妇枕头、护理垫、纸尿裤、孕妇装、孕婴产品wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4112 床品毛巾wordpress独立站模板 床单、被套、毛巾、抱枕、靠垫、围巾、布艺、枕头、乳胶枕、四件套、浴巾wordpre…

职场中的团队合作与个人成长

在职场中&#xff0c;团队合作和个人成长是两个不可或缺的要素。一个优秀的团队可以带来更高的工作效率和更好的业绩&#xff0c;而个人的成长则是职场成功的关键。本文将探讨如何在职场中实现团队合作与个人成长的平衡。 一、团队合作的重要性 在职场中&#xff0c;团队合作是…

ARM GNU 汇编 “每日读书“

在GNU ARM汇编程序中&#xff0c;如果我们想定义一个浮点数&#xff0c;那么可以使用下面的伪操作来定义。 标签&#xff0c;命令 f: .float 3.14 .equ f,3.1415 我们可以使用.float 伪操作定义一个浮点数f, 并初始化为3.14 如果你想将这个浮点数重新赋值为3.1415&#xff0c;则…