深度学习总结(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

相关文章

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security