多层感知机与深度学习算法概述

news2024/11/16 17:33:20

多层感知机与深度学习算法概述

读研之前那会儿我们曾纠结于机器学习、深度学习、神经网络这些概念的异同。现在看来深度学习这一算法竟然容易让人和他的爸爸机器学习搞混…可见深度学习技术的影响力之大。深度学习,作为机器学习家族中目前最有价值的一种算法,正在悄悄改变着世界以及我们生活。

本本我们就要搞清楚【深度学习】到底是什么?有哪些技术细节?

1. 多层感知机

请添加图片描述
图1 多层感知机拓扑结构

对于单层神经网络,人们担心它表达能力不足,于是参照仿生结构,想到了带有隐层的神经网络。所有隐藏都可以看成对输入的再次表示,最后的输出层则是一个单层线性神经网络。

2. 从多层感知机到深度学习

2.0 多层感知机的局限

H = X W 1 + b 1 O = H W 2 + b 2 (2-1) H=XW_1+b_1\\ O=HW_2+b_2\tag{2-1} H=XW1+b1O=HW2+b2(2-1)

这是具有单隐层神经网络的输入输出关系。w1、w2、b1、b2分别是隐层、输出层的权重和偏置。这看似参数量比单层神经网络要多,模型的拟合能力应该更好?但如果稍加推导可以发现:
O = ( ( X W 1 + b 1 ) W 2 ) + b 2 = X W 1 W 2 + b 1 W 2 + b 2 = X W 3 + b 3 (2-2) O=((XW_1+b_1)W_2)+b_2\\ =XW_1W_2+b_1W_2+b_2\\ =XW_3+b_3\tag{2-2} O=((XW1+b1)W2)+b2=XW1W2+b1W2+b2=XW3+b3(2-2)
简单的推导可以发现,没有引入非线性单元的多层感知机,就是一个“多层感知鸡”(鸡肋的鸡)。完全可以等效成单层神经网络啊!

那怎么办呢?引入非线性单元啊:每层的输出经过非线性函数后再传给下一层,就没法通过(2-2)的推导转化成单层了。多层感知机+非线性单元——这就是几乎所有深度学习的最基本结构。

2.1 层

  • **输入层:**输入层神经元个数必须和输入特征数一致。
  • **隐藏层:**隐藏层神经元个数一般多于输入层神经元个数,以起到升维映射的作用,可以更好的提取特征。
  • **输出层:**神经元个数应该等于预期输出数目。还可以根据任务不同加上一些激活函数来限制网络输出的值(比如分类问题的softmax)。一般来说,输出层为【全连接层】,全连接层意味着所有的神经元都将由权重建立连接。而输入层和隐藏层一般不是全连接层(比如对于CV这种输入特征非常多的任务)。

当然了,【层,layer】这一概念肯定不止上面3个,但上面3个是所有神经网络共有的层。深度学习发展历程中还出现了一些有关“层”的trick,比如最经典的 卷积层、归一化层、Dropout层等等。。。这些将在深度学习trick中统一梳理。

2.2 块

2.3 非线性单元(激活函数)

激活函数有很多种,但比较常用的就这三种,从此搞明白激活函数的概念。

  • ReLU(Rectified linear unit):

    这是目前最常见的激活函数,可能99%的情况都用这个,因为它能很好的克服反向传播梯度消失的问题。
    R e L U ( x ) = m a x ( x , 0 ) (2-3) ReLU(x)=max(x,0)\tag{2-3} ReLU(x)=max(x,0)(2-3)
    请添加图片描述
    图2 ReLU函数图像

    它的导数什么样很好想象吧,就不画了。有一个小小的问题,x=0时不可导啊?没关系 不差这一个点了,因为权重不可能恒等于0,所以我们令x=0处的导数为0即可。

  • Sigmod:

    在ReLU出现之前,这是最常用的激活函数,但是因为其计算有些复杂,影响训练测试速度;更重要的是其会导致梯度消失问题,导致网络层数无法加深。所以现在几乎不咋用这个了。
    s i g m o d ( x ) = 1 1 + e − x (2-4) sigmod(x)=\frac{1}{1+e^{-x}}\tag{2-4} sigmod(x)=1+ex1(2-4)
    请添加图片描述
    图3 Sigmod函数图像

    导数什么样也很好想象吧…就是中间大,两头小,类似正态分布…

  • Tanh:

    这就是Sigmod函数的极端版,更类似阶跃函数(其实阶跃函数才是最具有仿生意义的)。
    T a n h ( x ) = 1 − e − 2 x 1 + e − 2 x (2-5) Tanh(x)=\frac{1-e^{-2x}}{1+e^{-2x}}\tag{2-5} Tanh(x)=1+e2x1e2x(2-5)
    请添加图片描述
    图4 Tanh函数图像

导数就。。更尖了。
这里没提softmax,softmax看上去是一种非线性单元,但其实可以证明还是起到线性的作用,之前讲过,这里省略了。

2.4 数据集

当你要从零开始做一个预测任务时(可能是CV/NLP,可能是det、seg、ocr…),**你最应该关注的并不是作为算法核心的模型,而是数据。**巧妇难为无米之炊,再nb的模型,没有高质量、高数量的数据,也不会有更好的效果,反而有更差的效果。数据与模型的关系在[2.5]节中讨论。

对于成熟的深度学习搭建框架,一般会把数据集分成三类:

训练集(train dataset)、验证集(validation dataset)、测试集(test dataset)。

然而为了省事,验证集和测试集一般设置成一样的,这一点影响不大。但是你最好应该分清楚训练、验证、测试这3个过程,特别是验证和测试的区别

验证:在训练过程中,每n个epoch跑一次验证集的数据,进行一次验证,用来观察当前选取模型(网络+超参数)的拟合能力和泛化能力。

测试:在完全完成训练之后,最终跑一次测试集数据,用来评估模型训练的最终结果。

2.4 训练与推理

训练和推理是深度学习(也是大部分机器学习算法)最基本的两个动作。

  • 训练过程:一次正向传播(forwad)+一次反向传播(backward),为一次迭代(iteration);一次迭代使用的数据叫一个批量(batch);对训练集全部数据完整迭代过一次,称为一个周期(epoch)
  • 推理过程:比训练过程简单很多,一般来说推理的批量为1,即一次只推理一个数据。推理过程只包括一次正向传播,不需要记录梯度。

以下过程我们按只有一个隐藏层的多层感知机来推导。

网络模型:输入x,标签y,隐藏层前具有一个激活函数φ,输入层参数W1,隐藏层参数W2,输出o,损失函数l,正则项s。

2.4.1 正向传播

沿网络输入,逐层计算到网络输出、目标函数。

  1. 输入层输出:
    z = W 1 x (2-6) z=W_1x\tag{2-6} z=W1x(2-6)

  2. 激活函数输出:
    h = φ ( z ) (2-7) h=φ(z)\tag{2-7} h=φ(z)(2-7)

  3. 输出层输出:
    o = W 2 h (2-8) o=W_2h\tag{2-8} o=W2h(2-8)

  4. 损失:
    L = l ( o , y ) (2-9) L=l(o,y)\tag{2-9} L=l(o,y)(2-9)

  5. 正则项:
    s = ω 2 ( ∣ ∣ W 1 ∣ ∣ 2 2 + ∣ ∣ W 2 ∣ ∣ 2 2 ) (2-10) s=\frac{\omega}{2}(||W_1||_2^2+||W_2||_2^2)\tag{2-10} s=2ω(∣∣W122+∣∣W222)(2-10)

  6. 目标函数:
    J = L + s (2-11) J=L+s\tag{2-11} J=L+s(2-11)

2.4.2 反向传播

反向传播需要计算目标函数关于各个层参数的梯度(偏导),由于多层感知机的拓扑结构,只能从目标函数到损失函数、到输出、到隐藏层。。。到输入,从后向前地计算各层的梯度。

  1. 参照(2-11)、(2-9)计算目标函数关于输出o的梯度:
    ∂ J ∂ o = p r o d ( ∂ J ∂ L , ∂ L ∂ o ) = ∂ L ∂ o (2-12) \frac{\partial J}{\partial o}=prod(\frac{\partial J}{\partial L},\frac{\partial L}{\partial o})=\frac{\partial L}{\partial o}\tag{2-12} oJ=prod(LJ,oL)=oL(2-12)
    J对于L的偏导明显是1,不解释吧…

  2. 参照(2-10)计算正则项关于W1、W2的梯度:
    ∂ s ∂ W 1 = ω W 1 ∂ s ∂ W 2 = ω W 2 (2-13) \frac{\partial s}{\partial W_1}=\omega W_1\\ \frac{\partial s}{\partial W_2}=\omega W_2\tag{2-13} W1s=ωW1W2s=ωW2(2-13)

  3. 参照(2-11)、(2-8)计算目标函数关于隐层参数W2的梯度:
    ∂ J ∂ W 2 = p r o d ( ∂ J ∂ o , ∂ o ∂ W 2 ) + p r o d ( ∂ J ∂ s , ∂ s ∂ W 2 ) = ∂ L ∂ o h T + ω W 2 (2-14) \frac{\partial J}{\partial W_2}=prod(\frac{\partial J}{\partial o},\frac{\partial o}{\partial W_2})+prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial W_2})\\ =\frac{\partial L}{\partial o}h^T+\omega W_2\tag{2-14} W2J=prod(oJ,W2o)+prod(sJ,W2s)=oLhT+ωW2(2-14)
    同样,J对s的偏导是1

  4. 参照(2-8)计算目标函数关于隐藏变量h的梯度:
    ∂ J ∂ h = p r o d ( ∂ J ∂ o , ∂ o ∂ h ) = W 2 T ∂ L ∂ o (2-15) \frac{\partial J}{\partial h}=prod(\frac{\partial J}{\partial o},\frac{\partial o}{\partial h})=W_2^T\frac{\partial L}{\partial o}\tag{2-15} hJ=prod(oJ,ho)=W2ToL(2-15)

  5. 参照(2-7)反向穿过激活函数φ计算目标函数关于输入层输出z的梯度:

∂ J ∂ z = p r o d ( ∂ J ∂ h , ∂ h ∂ z ) = ∂ J ∂ h ⋅ φ ′ ( z ) (2-16) \frac{\partial J}{\partial z}=prod(\frac{\partial J}{\partial h},\frac{\partial h}{\partial z})=\frac{\partial J}{\partial h}\cdotφ^{'}(z)\tag{2-16} zJ=prod(hJ,zh)=hJφ(z)(2-16)

​ 这里的’.'是向量内积,因为激活函数是逐元素计算的,这里计算梯度要用向量内积。

  1. 最后,我们可以得出目标函数关于W1的梯度:
    ∂ J ∂ W 1 = p r o d ( ∂ J ∂ z , ∂ z ∂ W 1 ) + p r o d ( ∂ J ∂ s , ∂ s ∂ W 1 ) = ∂ J ∂ z x T + ω W 1 (2-17) \frac{\partial J}{\partial W_1}=prod(\frac{\partial J}{\partial z},\frac{\partial z}{\partial W_1})+prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial W_1})\\ =\frac{\partial J}{\partial z}x^T+\omega W_1\tag{2-17} W1J=prod(zJ,W1z)+prod(sJ,W1s)=zJxT+ωW1(2-17)

  2. 至此我们就求出了该多层感知机的所有权重梯度。按(2-14)、(2-17)引用优化器策略更新权重即可。

2.5 过拟合与欠拟合

过拟合与欠拟合表示模型在经过训练后的状态,但这种状态与数据情况、模型情况都紧密相关。
请添加图片描述
图5 过拟合与欠拟合

这两种状态直观上可由训练损失与泛化损失界定;背后由模型复杂度和数据规模决定。

直观上:

当泛化损失大于训练损失时,我们就可以称模型此时在该数据集上处于过拟合状态;

当训练损失处于较大时,我们可以称模型此时在数据集上处于欠拟合状态。

背后:

当模型复杂度(参数规模)越高、数据集规模越小,越容易处于过拟合状态。

当模型复杂度(参数规模)越低、数据集规模越大,越容易处于欠拟合状态。

关于此的一些讨论:

  1. 所以你现在知道当你的模型处于欠拟合和过拟合时应该怎么做了吧,是调整模型,还是调整数据?
  2. 欠拟合一定是一件坏事,宁可过拟合也不要欠拟合。
  3. 换个角度看过拟合,模型过拟合了,那一定效果就很差吗?不一定,可能只是泛化损失略高于训练损失,但泛化损失并没有太大,模型也能有非常好的效果(只是离最佳状态稍微过火了一点点)。因此,宁可略微过拟合,也不要欠拟合。
  4. 过拟合一定是坏事吗?表面看上去是的,模型泛化能力不佳,应用时可能就会出问题。但!万一有一种数据集,可以保证它的分布和隐含的数据总体分布一致呢?比如NLP领域的预训练,就是要在预训练数据上让模型达到过拟合状态,因为人类的文字和语言意义就是那些,学完了就了事了。但CV领域并不是这样,似乎很难有某种数据集能和世间图像数据的总体分布达到一致,这也是CV领域预训练技术的难题之一。

总结

本文试图:

  1. 从多层感知机的问题出发,引出深度学习算法。
  2. 对深度学习算法的基本组成介绍明白。
  3. 深度学习实现效果的总体评价方法做一个介绍。

诚然,时至今日 深度学习是一个较大的计算机科学领域了。深度学习领域又可以分为若干小领域。

按应用场景分:CV、NLP、数据分析…(每个应用场景又分出好多细分领域…)

按算法分:CV的卷积神经网络、NLP的transformer/注意力机制、强化学习…(每个算法也有若干细分算法,适用于各种应用场景)

那么多场景,那么多算法;可能对于每个深度学习从业个体而言 不论是做科研还是工程,第一件要做的事情就是搞清楚自己的细分应用场景+适用的几种算法。以此为中心,向下深挖、向周围辐射,加自己在深度学习领域的认识深度和广度,更好地体会深度学习对我们生活的影响和改变。

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

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

相关文章

6.compute部署nova服务

Nova-compute 是一个非常重要的守护进程,负责创建和终止虚拟机实例,即管理着虚拟机实例的生命周期,在计算节点上运行,负责管理节点上的实例Instance,例如:创建、关闭、重启、挂起、恢复、中止、调整大小、迁…

chatgpt赋能python:Python计算圆的周长

Python计算圆的周长 Python是一种简单易学的编程语言,被广泛应用于各种领域,包括科学、数据分析、网站开发等等。在本文中,我们将介绍如何使用Python计算圆的周长。 什么是圆的周长 圆的周长是指圆周的长度,也就是圆内任意两点…

chatgpt赋能python:Python计算加法-简单易学,快速实现

Python计算加法 - 简单易学,快速实现 介绍 Python是一种高级编程语言,因其优雅简洁的语法和强大的功能而备受开发者的喜爱。Python不仅可以应用于数据科学领域,也广泛用于Web开发、网络编程、图形界面和游戏等领域。在这篇文章中&#xff0…

Java之异常

Java之异常 异常 抛出异常 所有标准异常类都有两个构造器:一个是默认构造器,另一个是接收字符串作为参数的构造器。使用throw关键字来抛出异常对象。可以抛出任何类型的Throwable对象,它是异常类型的根类。但是通常来说,我们对于…

【IC设计】数字IC设计读书笔记

文章目录 《专用集成电路设计实用教程》集成电路系统的组成集成电路的设计流程综合转化逻辑优化映射同步电路和异步电路亚稳态单时钟同步设计的时序约束目标库和初始环境设置DC如何计算每个逻辑单元的延迟(Cell Delay)?target librarylink li…

举个栗子~Tableau 技巧(255):文本表中高亮最新日期的数据

对于需要每天查看业务数据的分析用户来说,在刷新工作簿的数据之后,如果能高亮显示当天的数据(如下图),就可以事半功倍了! 那么,在 Tableau 中该如何高亮文本表最新的数据呢?今天的栗…

什么是HMI和SCADA?两者有什么区别

前言 几十年来,工业控制系统在工业自动化中发挥了重要作用,它允许过程制造商从生产车间采集、分析、处理数据。 在当今瞬息万变的工业环境中,制造商和公用事业公司必须采用现代HMI/SCADA和数字化转型,以跟上变化的步伐&#xff0…

阿里云云主机:ECS/轻量/虚拟主机/GPU/云电脑详解

阿里云云主机分为云虚拟主机、云服务器ECS、轻量应用服务器、GPU云服务器、弹性裸金属服务器、专有宿主机、FPGA云服务器、高性能计算E-HPC、无影云电脑等,阿里云百科来详细说下阿里云云主机详解: 目录 阿里云云主机 云服务器ECS 轻量应用服务器 云…

Java之面向对象

Java之面向对象 一切皆对象。 编译型语言:编译器会将我们编写的源码一次性地编译成计算机可识别的二进制文件,然后计算机直接执行。如c、c等。 解释型语言:在程序运行时,解释器会一行行读取我们的代码,然后实时地将这…

重学图结构

图 图的描述 G (V, E),一个偶对V:顶点(数据元素)组成的有穷非空集合{E}:边的有穷集合、图的逻辑结构:多对多 相关术语 无向图:每条边都是无方向的,如下图1 有向图:…

信息技术专业标准体系框架设计研究与思考

为了支撑企业数字化转型智能化发展工作,近期对信息技术专业标准体系进行了简单的梳理,借助ChatGPT进行分类设计分析,并对国际、行业及其他公司的信息技术专业标准体系进行了调研学习,最终形成了信息技术专业标准体系框架的思考建议…

【备战秋招】每日一题:4月23日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第三题-农村大亨 在线评测链接:P1247 题目内容 塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时也可以锻炼他的…

MYSQL中 find_in_set() 函数用法详解

MYSQL中 find_in_set() 函数用法详解 官方涵义(MySQL手册中语法说明) FIND_IN_SET(str,strlist) : str 要查询的字符串,strlist 需查询的字段,参数以”,”分隔,形式如 (1,2,6,8,10,22);该函数的…

分布式存储与并行处理环境配置:Hadoop、HBase和Spark等

本文介绍Linux系统中配置Hadoop、HBase和Spark环境,包括安装Java运行环境、下载安装包、进行配置和测试。通过这种方式,可以搭建一个强大的分布式计算环境,用于处理大规模数据集。为了成功配置Hadoop、HBase和Spark环境,需要理解它…

chatgpt赋能python:Python实现输出在同一行的技巧

Python实现输出在同一行的技巧 介绍 在Python中,我们经常需要将一些文本或者变量输出到控制台上,以便查看或者进行交互式调试。但是默认情况下,每次输出都会换行展示,这在某些情况下可能会让输出显得比较混乱,尤其是…

Ubuntu安装及使用教程

Ubuntu安装及使用教程 一、基本介绍二、vmware下安装ubuntu系统三、ubuntu系统使用 回到目录   回到末尾 一、基本介绍 对于ubuntu而言,就是linux操作系统的具体,而linux对于ubuntu来说就是他的抽象;在linux操作系统中,因为应用…

SSD202D-挂载根文件系统

参考链接: 启明云端分享|SSD20X 如何使用SD卡根文件系统_sudo./make_sd.sh_启明智显的博客-CSDN博客 启明云端分享|SSD202D核心板使用NFS_lx_mem=0x3f00000 mma_heap=mma_heap_name0,miu=0,sz=_启明智显的博客-CSDN博客 然后思路: 1.要在kernel打开文件系统格式支持 CONFIG_…

chatgpt赋能python:Python计算圆面积方法教程

Python计算圆面积方法教程 你是否想过如何用Python计算圆面积?圆形是一个基本的几何形状,计算圆的面积是一个必要的技能。Python作为一种流行的编程语言,可以帮助我们更轻松地计算圆的面积。本教程将介绍如何使用Python计算圆的面积。 什么…

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】

【Red Hat7.9安装Oracle11g--调用图形化界面的几种方式】 🔻 一、续上一篇[【Red Hat 7.9---详细安装Oracle 11g---图形化界面方式】](https://blog.csdn.net/qq_41840843/article/details/131198718?spm1001.2014.3001.5501)⛳ 1.1 前言⛳ 1.2 方式一、使用Xmanag…

Mock和Vite-plugin-Mock的区别是什么?

简介 我不知道大家和我是否有一样的疑问,之前Mock.js用的挺好,为啥又出现了一个vite-plugin-mock,而且这个插件还依赖于Mock.js.那么他的优势到底是什么呢?如果你也有这样的疑问,本文最后会给出答案解开这个谜底 前言 我之前已经…