深度学习总结(stage1)

2023-10-18 14:10
文章标签 学习 总结 深度 stage1

本文主要是介绍深度学习总结(stage1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.线性分类与感知机

1 线性回归问题

(1) 回归定义: 回归是能为⼀个或多个⾃变量与因变量之间关系建模的⼀类⽅法。在机器学习领域中的⼤多数任务通常都与预测有关。当我们想预测⼀个数值时,就会涉及到回归问题。常⻅的例⼦包括:预测价格(房屋、股票等)、预测住院时间(针对住院病⼈等)、预测需求(零售销量等).

(2) 回归要素:训练集输出数据假设函数,举一个实际例子,我们希望根据房屋的⾯积和房龄来估算房屋价格,为此需要收集一个真实的数据集,这个数据集包括了房屋的销售价格、面积和房龄。这个数据集就是训练集,训练集中的每一行数据称为样本,我们把试图预测的房屋价格称为输出数据,这个例子中的假设函数可以表征为下面的式子:

(3) 问题拓展:在机器学习中,通常使用的是高维数据,建模时采用线性代数表示方法会比较方便。当我们的输入包含d个特征时预测结果通常可以表示为:

将所有的特征放到向量x中,并将所有的权重放到向量w中,可以采用点积的形式来简洁的表示模型:

(4) 损失函数:损失函数就是用来确定模型拟合数据的度量。损失函数能够量化目标的实际值与预测值之间的差距,通常选择非负数作为损失函数,且数值越小表示损失越小,完美预测时的损失为0.在回归问题中常用的损失函数时平方误差损失函数(MSELoss)。当样本i的预测值为yˆ(i),其相应的真实标签为y(i),平方误差可以定义为以下公式:

找到一组权重w使得损失函数最小就是我们的目标,这样模型的预测值可以达到比较精确的程度。

2 线性二分类问题

(1) 定义:线性分类器通过特征的线性组合来做出分类决定,以达到此种目的。简单说,样本通过直线可分。以苹果分类为例:

其中有两个特征,横轴是苹果的直径,纵轴是苹果的外观评价。对于线性分类器来说,输入的是特征向量,输出的是类别,如果是二分类问题,则输出为0或1,或者是属于某类的概率,即0-1之间的数

(2) 与线性回归的区别:

输出意义不同:属于某类的概率<->回归具体值

参数意义不同:最佳分类直线<->最佳拟合直线

(3) sigmoid函数:在二分类问题中,为了最终获得0-1之间的概率,我们构造了sigmoid函数如下:

其中z就是输入的线性组合,不难看出sigmoid函数的值域在0-1之间,模型输出的z越大,经过sigmoid的映射后输出越接近1。

(4) 二分类问题的损失函数:对于二分类问题一般使用交叉熵当损失函数,交叉熵简化为Binary Cross Entropy即:

同时采用sigmoid对输出z进行映射,并且损失函数选择为BCELoss,此时的二分类模型称为Logistic Regression(逻辑回归),虽然叫做回归,但实际上是一种分类模型。

3 多分类问题

对于多分类问题,模型的输出单元一下变成了多个,通过引入softmax运算使得输出更适合离散值的预测和训练。如果不使用softmax,直接使用输出有两个问题。一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。另一方面,由于真实的标签值都是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。因此softmax的使用很有必要。softmax的运算如下式:

其中o代表模型的输出值,经过softmax的映射变为y,并且根据下面这个式子可以知道softmax运算是不改变预测类别的输出的

损失函数的选择上依然选择交叉熵损失函数,此时多分类的模型就叫softmax回归,虽然名字依然是回归,但是是一种分类模型,可以看到与Logistic Regression(逻辑回归)的区别是,对模型输出之后映射函数的选择不同,二分类模型使用sigmoid,而多分类模型使用softmax

4 多层感知机

上文介绍了线性回归、logistic回归和softmax回归,但它们都是单层的神经网络,这些模型能通过单个的仿射变换将我们的输入映射到输出,如果我们的标签通过仿射变化后确实与我们的输入相关,那么这种方法确实足够了。但是,仿射变换中的线性是一个很强的假设,在很多时候,线性假设是荒谬的。我们可以在网络中加入一个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型,这种架构通常称为多层感知机(MLP),如下图:

这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。输入层不涉及任何计算,因此使用此网络产⽣输出只需要实现隐藏层和输出层的计算。因此,这个多层感知机中的层数为2。注意,这两个层都是全连接的。每个输入都会影响隐藏层中的每个神经元,而隐藏层中的每个神经元⼜会影响输出层中的每个神经元。为了发挥这种架构的潜力,还需要一个额外的关键要素,在仿射变换之后对每个隐藏单元应用非线性的激活函数,有了激活函数之后,我们的多层感知机就不会退化成线性模型,通过这种一层又一层的堆叠隐藏层,就可以获得更有表达能力的模型。

二. BP网络

1 多层前馈网络及BP算法概述

(1) BP算法简介:多层前馈网络的反向传播(BP)学习算法,简称BP算法,他是梯度下降法在多层前馈网络中的应用。

(2) BP神经网络结构:见图,u、y是网络的输入、输出向量,神经元用节点表示,网络由输入层、隐层和输出层节点组成,隐层可一层,也可多层(图中是单隐层),前层至后层节点通过权联接。由于用BP学习算法,所以常称BP神经网络.

(3) 反向传播和正向传播:正向传播是输入信号从输入层经隐藏层,传向输出层,若输出层得到了期望的输出,则学习算法结束,否则转至反向传播。反向传播是将误差(样本与网络输出之差)按原连接通路反向计算,由梯度下降法调整各层节点的权值,使误差减小。

2 BP算法详细介绍

BP算法基本思想:

BP算法的基本流程:

BP算法评述:

优点:学习完全自主,可以逼近任意的非线性函数

缺点:算法非全局收敛,收敛速度比较慢,学习率的选择以及神经网络的设计都是问题。

三.性能优化(优化器)

上面介绍了通过BP算法获得了梯度信息,接下来就要使用梯度实现对各层权重的更新,这也正是优化器的作用,一言以蔽之,优化器就是在深度学习反向传播过程中,指引损失函数(目标函数)的各个参数往正确的方向更新合适的大小,使得更新后的各个参数让损失函数(目标函数)值不断逼近全局最小。接下来介绍常见的优化器。

1 SGD优化器

随机梯度下降法(SGD)每次从训练集随机选择一个样本来进行学习,SGD没有动量的概念,SGD的参数更新公式如下:

优点:由于每次只用一个样本更新模型参数,更新速度快;SGD所带来的波动有利于优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,最终收敛于一个较好的局部极值点,甚至全局极值点。

2 动量法(Momentum算法)

Momentum算法在原有的梯度下降法中引入了动量,从物理学上看,引入动量比起普通梯度下降法主要能够增加两个优点。首先,引入动量能够使得物体在下落过程中,当遇到一个局部最优的时候有可能在原有动量的基础上冲出这个局部最优点;并且,普通的梯度下降法方法完全由梯度决定,这就可能导致在寻找最优解的过程中出现严重震荡而速度变慢,但是在有动量的条件下,物体运动方向由动量和梯度共同决定,可以使得物体的震荡减弱,更快地运动到最优解。

更新公式如下:

3 自适应梯度算法(AdaGrad算法)

我们使用自适应的学习率就可以帮助算法在梯度大的参数方向减缓学习速率,而在梯度小的参数方向加快学习速率,这就可以促使神经网络的训练速度的加快。

参数更新公式如下:

4 RMSProp算法

RMSProp算法主要是用来改进AdaGrad算法在训练后期,学习率过小的问题。先来看参数更新公式:

可以看到,对于一个变换较大的方向其dw会很大,导致dw2很大,所以分母会变大,所以整个分式会变小,可以减缓这种变化,同理,若变换较小的方向,dw很小,可以加速这种变化。

5 Adam算法

Adam算法就是结合了momentum梯度下降法和RMSprop梯度下降法的方法,更加的适用于大多数的情况,参数更新过程如下:

一般的,让β1=0.9,β2=0.999即可。当然学习率α要自己调整。

这篇关于深度学习总结(stage1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233081

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO