[PyTorch][chapter 4][李宏毅深度学习][Gradient Descent]

前言:

    

目录:

      1:  梯度下降原理

      2:  常见问题

      3: 梯度更新方案

      4: 梯度下降限制


一  梯度下降原理

       机器学习的目标找到最优的参数,使得Loss 最小

          

        

  为什么顺着梯度方向loss 就能下降了。主要原理是泰勒公式。

  假设损失函数为h(x) 

h(x_{t+1})=h(x_t)+h^{'}(x_t)(x_{t+1}-x_t)+\frac{h^{"}(x_t)(x_{t+1}-x_t)^2}{2}+...

 忽略二阶导数, 当x_{t+1}-x_t=-h^{'}(x_t) 时候

 h(x_{t+1})=h(x_t)-h^{'}(x_t)^2 \leq h(x_t)

因为要考虑二阶导数,所以损失函数一般都选凸函数,二阶为0,一阶导数有驻点的函数.


二  常见问题

      1: 学习率learning rate

            红线: 学习率太小,收敛速度非常慢

            绿线 :  学习率太大,无法收敛.

             有什么自动调整学习率的算法?


三  梯度更新方案

     3.1   vanilla gradient descent

    \eta^{t}=\frac{\eta}{\sqrt{t+1}}

      学习率除以时间的开方:

     训练开始:loss 远离极小值点,所以使用大的学习率
     几次迭代后,我们接近极小值点,所以使用小的学习率

      3.2 Adagrad

      不同参数不同的学习率,设置不同的学习率,假设w 是权重系数里面的一个参数。

            w^{t+1}=w^t-\frac{\eta^t}{\sigma^t}g^t

                 =w^t-\frac{\eta}{\sqrt{\sum_{i=0}^{t}(g^i)^2}}g^t

其中

                 \eta^{t}=\frac{\eta}{\sqrt{t+1}}

                \sigma^t=\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}(g^i)^2}

  

例:

   为什么要不同参数设置不同的学习率:

   如下图,不同维度的梯度是不一样的,如果使用同一个学习率会使得

某些维度出现学习率过大或者过小问题,导致收敛速度过慢或者网络震荡问题.


 

      

   问题2: 为什么要除以\sqrt{\sum_{i=0}^{t}(g^i)^2}

      这个参数相当于二次微分。

     如下图:

                     一次微分小的我们希望学习率大一点,能够快速收敛.

                    一次微分大的我们希望其学习率小一点,防止网络震荡.

                    我们通过采样历史微分结果相加,学习率除以该参数就达到该效果。

3.3   stochastic gradient descent(随机梯度下降法)

     假设我们有20个样本

    每轮迭代:

    梯度下降法: 计算20个样本,计算20个样本的梯度,通过平均值更新梯度

    随机梯度下降法: 随机选取一个样本,计算1个样本梯度,更新梯度

    优点: 速度快

   3.4  batchnormalization

       作用:

            使得不同维度上面数据分布一致。

            常用方案 batchnormalization:

              数据集 假设有m个样本,每个数据的维度为n

                \begin{bmatrix} x_1^1 & x_2^1 &... &x_n^1 \\ x_1^2 & x_2^2 &... &x_n^2 \\ & & & \\ x_1^m & x_2^m &... &x_n^m \end{bmatrix}

             对每个维度求其均值u_i,,以及方差\sigma_i

              x_i^{r}=\frac{x_i^{r}-u_i}{\sigma_i}

             

      如下图: y=w_1x_1+w_2x_2+b

         

    主要作用:

例子:

  假设

     y=w_1x_1+w_2x_2+b

      l=\frac{1}{2}(\hat{y}-y)^2

     则

      \bigtriangledown w_1=(y-\hat{y})x_1

      \bigtriangledown w_2=(y-\hat{y})x_2

    如x_1,x_2 相差很大的时候,同样的loss,会导致不同维度

梯度变化相差非常大,当使用随机梯度下降时候,不同的出发点

收敛速度会相差很大。但是使用batchnormalization 方案后,

无论从哪个出发点出发,都不会影响收敛速度.

    

     


四  梯度下降限制

   4.1  任务说明:

    根据前9小时的数据,预测下一个小时的PM2.5值

    

4.2 数据集

   

    


使用丰原站的观测记录,分成 train set 跟 test set,train set 是丰原站每个月的前 20 天所有资料。test set 则是从丰原站剩下的资料中取样出来。
train.csv: 每个月前 20 天的完整资料。
test.csv : 从剩下的资料当中取样出连续的 10 小时为一笔,前九小时的所有观测数据当作 feature,第十小时的 PM2.5 当作 answer。一共取出 240 笔不重複的 test data,请根据 feature 预测这 240 笔的 PM2.5。
Data 含有 18 项观测数据 AMB_TEMP, CH4, CO, NHMC, NO, NO2, NOx, O3, PM10, PM2.5, RAINFALL, RH, SO2, THC, WD_HR, WIND_DIREC, WIND_SPEED, WS_HR。

 

工程两个文件:

dataLoader.py

main.py


import pandas as pd
import numpy as np
import mathdef get_testData(mean_x,std_x):#[4320 个数据,18个fetature 为一组,所有共有240个testData]print("\n mean_x",mean_x)testdata = pd.read_csv('data/test.csv',header=None, encoding = 'big5')test_data = testdata.iloc[:, 2:]test_data = test_data.copy()test_data[test_data == 'NR'] = 0test_data = test_data.to_numpy()#print("\n ---",test_data[0])test_x = np.empty([240, 18*9], dtype = float)for i in range(240):a = test_data[18 * i: 18* (i + 1), :].reshape(1, -1)#print("\n i ",i, a.shape)test_x[i, :] = test_data[18 * i: 18* (i + 1), :].reshape(1, -1)for i in range(len(test_x)):for j in range(len(test_x[0])):if std_x[j] != 0:test_x[i][j] = (test_x[i][j] - mean_x[j]) / std_x[j]test_x = np.concatenate((np.ones([240, 1]), test_x), axis = 1).astype(float)print("\n test_x",test_x.shape)return test_xdef load_data():data = pd.read_csv('data/train.csv', encoding='big5')#提取第三列后面的资料data = data.iloc[:,3:]data[data=='NR']=0raw_data = data.to_numpy() #[4320,24]#print(raw_data.shape)#print(data.head(18))return raw_datadef extract_traindata(month_data):'''用前9小时的18个特征预测 预测第10小时的PM2.5----------month_data : TYPEkey:   monthitem:  day1[24小时],data2[24小时],...data20[24小时]Returns-------x : TYPEDESCRIPTION.y : TYPEDESCRIPTION.'''#每个月480小时(20天),每9小时形成一个data,共有471data,所以训练集有12*471各数据#因为作业要求用前9小时,前9小时有18各featurex = np.empty([12*471,18*9],dtype=float)y = np.empty([12*471,1],dtype=float)for month in range(12):for day in range(20):for hour in range(24):if day ==19 and hour>14: continueelse:#每个小时的18项数据data_start = day*24+hourdata_end = data_start+9x[month*471+data_start,:]=month_data[month][:,data_start:data_end].reshape(1,-1)#前9小时# pm标签值y[month*471+data_start,0]=month_data[month][9,data_end] #第10个小时return x,ydef  data_normalize(x):# 4.归一化mean_x = np.mean(x, axis = 0) #求列方向的均值std_x = np.std(x, axis = 0) #1列方向的方差print("\n shape ",x.shape)m,n =x.shapefor i in range(m): #12 * 471for j in range(n): #18 * 9 if std_x[j] != 0:x[i][j] = (x[i][j] - mean_x[j]) / std_x[j]return x,mean_x,std_xdef train_load(x,y):x_train_set = x[: math.floor(len(x) * 0.8), :]y_train_set = y[: math.floor(len(y) * 0.8), :]x_validation = x[math.floor(len(x) * 0.8): , :]y_validation = y[math.floor(len(y) * 0.8): , :]print(x_train_set)(y_train_set)print(x_validation)print(y_validation)print(len(x_train_set))print(len(y_train_set))print(len(x_validation))print(len(y_validation))def extract_features(raw_data):'''Parameters----------raw_data : TYPE行:12个月,每月20天,每天18个特征。 [AMB_TEMP,CH4,CO,NMHC,NO,NO2,NOx,O3,PM10,PM2.5,RAINFALL,RH,SO2,THC,WD_HR,WIND_DIREC,WIND_SPEED,WS_HR]列:24小时 Returns-------month_data : TYPE12个月的词典比如针对AMB_TEMP 特征: 原来分成20行(每行24小时), 现在放在一行: 20(天)*24(小时)'''month_data ={}for month in range(12):#sample = np.empty([18,480])    for day in range(20):sample[:, day * 24 : (day + 1) * 24] = raw_data[18 * (20 * month + day) : 18 * (20 * month + day + 1), :]month_data[month] = samplereturn month_datadef  load_trainData():#原始的数据集[ 12个月:每个月20天: 每天24小时,18个特征 ]raw_data = load_data()month_data  = extract_features(raw_data)x,y = extract_traindata(month_data)x,mean_x,std_x = data_normalize(x)return x,y,mean_x,std_x
# -*- coding: utf-8 -*-
"""
Created on Fri Dec  1 16:36:16 2023@author: chengxf2
"""# -*- coding: utf-8 -*-
"""
Created on Thu Nov 30 17:49:04 2023@author: chengxf2
"""import numpy as np
import csv
from  dataLoader import load_trainData
from  dataLoader import  get_testDatadef predict(test_x):w = np.load('weight.npy')y = np.dot(test_x, w)with open('submit.csv', mode='w', newline='') as submit_file:csv_writer = csv.writer(submit_file)header = ['id', 'value']print(header)csv_writer.writerow(header)for i in range(240):row = ['id_' + str(i), y[i][0]]csv_writer.writerow(row)#print(row)submit_file.close()def train(x,y):#w=[b,w]  #y = Xwdim = 1+18 * 9 #加上1个偏置w = np.zeros([dim, 1])x = np.concatenate((np.ones([12 * 471, 1]), x), axis = 1).astype(float)learning_rate = 1e-4iter_time = 1000adagrad = np.zeros([dim, 1])eps = 1e-6for t in range(iter_time):bias = np.dot(x, w) - yloss = np.sqrt(np.sum(np.power(bias, 2))/471/12)#rmseif(t%100==0):print("\n \n %d"%t,"\t loss: %6.3f"%loss)gradient = 2 * np.dot(x.transpose(), bias) #dim*1adagrad += gradient ** 2w = w - learning_rate * gradient / np.sqrt(adagrad + eps)np.save('weight.npy', w)if __name__ == "__main__":x,y,mean_x,std_x = load_trainData()train(x,y)test_x =get_testData(mean_x,std_x)predict(test_x)

参考:

Hung-yi Lee

https://blog.csdn.net/Sinlair/article/details/127100363

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

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

相关文章

分享几个电视颜色测试图形卡

介绍 本文分享几个常见的电视颜色测试图形卡和一段matlab程序,完成JPG转FPGA烧写文件,便于把彩色图片预装载到FPGA内。 电视颜色测试图形卡 一种专业检测电视显示效果的工具。它通常由一张卡片和一些色块组成,可以根据标准色彩空间和颜色渐…

语义分割网络FCN

语义分割是一种像素级的分类,输出是与输入图像大小相同的分割图,输出图像的每个像素对应输入图像每个像素的类别,每一个像素点的灰度值都是代表当前像素点属于该类的概率。 语义分割任务需要解决的是如何把定位和分类这两个问题一起解决&…

嘉里大荣物流与极智嘉再度携手,合作助力物流服务高效升级

近日,全球仓储机器人引领者极智嘉(Geek)与3PL知名企业嘉里大荣物流联合宣布,双方再度携手,6周内共建全新自动化订单履行中心,赋能国际时尚运动品牌New Balance加速B2B和B2C订单交付,为其客户提供更高效便捷的物流服务。…

江科大STM32学习笔记(上)

STM32F103xx 前言外设篇GPIO输出GPIO位结构GPIO模式外设的GPIO配置查看实战1: 如何进行基本的GPIO输入输出 OLED显示屏及调试Keil的调试模式演示 EXTI外部中断NVIC基本结构EXTI结构代码实战2:如何使用中断和对射式红外传感器&旋转编码器 TIM&…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter

Flink 系列文章 1、Flink 专栏等系列综合文章链接 文章目录 Flink 系列文章一、Flink的23种算子说明及示例1、maven依赖2、java bean3、map4、flatmap5、Filter 本文主要介绍Flink 的3种常用的operator(map、flatmap和filter)及以具体可运行示例进行说明…

Mysql的索引详解

1.索引的分类 1.按照功能来分,可以分为主键索引、唯一索引、普通索引、全文索引 2.按照索引字段个数来分,可以分为单列索引、联合索引 3.按照物理实现方式来分,可以聚簇索引、非聚簇索引 2.适合添加索引的场景 1.具有唯一性约束的字段。 2…

医药行业:轻松学会超低温冰箱技能

超低温冰箱在医疗、科研和生物领域中扮演着至关重要的角色,用于存储和保护对温度极为敏感的样品和药品。 然而,由于这些冰箱内的温度波动可能导致样品的损坏,因此对超低温冰箱的监控变得至关重要。 客户案例 医疗研究机构 上海某医疗研究机…

YOLOv7独家原创改进:创新自研CPMS注意力,多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM

💡💡💡本文自研创新改进:自研CPMS, 多尺度通道注意力具+多尺度深度可分离卷积空间注意力,全面升级CBAM 1)作为注意力CPMS使用; 推荐指数:五星 CPMS | 亲测在多个数据集能够实现涨点,对标CBAM。 收录 YOLOv7原创自研 https://blog.csdn.net/m0_63774211/ca…

外包干了4年,技术退步太明显了。。。。。

先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

Docker容器(一)概述

一、虚拟化概述 1.1引⼊虚拟化技术的必要性 服务器只有5%的时间是在⼯作的;在其它时间服务器都处于“休眠”状态. 虚拟化前 每台主机⼀个操作系统; 软硬件紧密结合; 在同⼀个主机上运⾏多个应⽤程序通常会遭遇冲突; 系统的资源利⽤率低; 硬件成本⾼昂⽽且不够灵活…

金蝶云星空单据体明细权限和表单插件操作事件的先后顺序

文章目录 金蝶云星空单据体明细权限和表单插件操作事件的先后顺序顺序说明结论 金蝶云星空单据体明细权限和表单插件操作事件的先后顺序 顺序说明 先分录菜单单击事件EntryBarItemClick 再验权 后表单操作执行事件BeforeDoOperation 结论 如果是需要鉴权通过才允许操作的逻辑…

万界星空科技仓库管理wms系统

企业在管理库存时,尤其是生产制造企业,使用传统方式比如纸笔、Excel 管理库存,由于工具和信息化存在局限,导致在管理库存时出现如下问题: 1、通过纸笔记录出入库申请,人为手动计算易出错,数据易…

全球与中国HDPE管道市场:增长趋势、竞争格局与前景展望

快速成长的人口、快速的经济成长和工业发展增加了对可靠供水系统的需求。工业需要为制造流程、冷却系统和卫生目的提供可靠的水供应。随着国家的发展,它们更加重视基础设施,包括供水系统,以支持工业成长。HDPE管道广泛应用于饮用水和灌溉的配…

医院不良事件报告系统源码带鱼骨图分析

医院不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件…

CentOS系列:【Linux】CentOS7操作系统安装nginx实战(多种方法,超详细)

CentOS7操作系统安装nginx实战(多种方法,超详细) 一. 实验环境二. 使用yum安装nginx2.1 添加yum源2.1.1 使用官网提供的源地址(方法一)1. 找到官网的源2. 使用rpm -ivh 进行安装3. 安装完成之后查看源: 2.1…

三十七、XA模式

目录 一、XA模式原理 在XA模式中,一个事务通常被分为两个阶段: 二、Seata的XA模式 RM一阶段的工作: TC一阶段的工作: RM二阶段的工作: 1、优点: 2、缺点: 三、实现XA模式 1、修改yml文…

数据结构实验任务六 :基于 Dijsktra 算法的最短路径求解

本次代码为实验六:基于 Dijsktra 算法的最短路径求解实现。本实验的重点在于对于Dijsktra算法的理解。有关Dijsktra的资料可以参考有关博文: 图论:Dijkstra算法——最详细的分析,图文并茂,一次看懂!-CSDN博客 以下附上…

Vision Transformer

Vision Transformer详解-CSDN博客 视频:11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili Vision Transformer学习笔记_linear projection of flattened patches-CSDN博客 一、embedding 层 对于标准的Transformer模块,要求输入的是token (向量…

win10使用copilot(尝试中)

一、 Microsoft account | Sign In or Create Your Account Today – Microsoft 一路next全部点好【1】 二、 查看当前win10的版本,cmd输入命令winver 三、 修改区域为美国 四、更新和安全 Reference 【1】完美|在 Win10 强行开启 Win11 的独有功能…

蓝桥杯每日一题2023.12.4

题目描述 竞赛中心 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用树型DP,蓝桥杯官网出现了一个点的错误,但实际答案是正确的 状态表示:f[u]:在以u为根的子树中包含u的所有联通块的权值的最大值 假设s1,s2,…sk 是u的…