梯度下降(学习笔记)

2023-10-26

应用:

梯度下降法(Gradient Descent):又称最速下降法,是迭代法的一种,可用于求解机器学习算法的模型参数(即无约束优化问题)具体来讲可用来求解损失函数的最小值,也可求解最小二乘问题

分类
批量梯度下降 BGD :使用全部样本构建了损失函数(在线性回归中为SSE),再根据损失函数梯度下降求得系数(权值);
随机梯度下降 SGD:每次只使用一个样本点得到损失函数的公式,根据梯度下降求解参数,再随机选择样本进行系数更新;
小批量梯度下降 MBGD:每次使用部分样本计算得到损失函数,根据梯度下降算法求解参数,再不断更新。

损失函数(loss function):在统计学和机器学习中被用于模型的参数估计(线性回归时应用到),用来估测模型的预测值 f(x)真实值 Y的不一致程度,为非负实值函数,用L(Y, f(x) )表示 (这次先不深入了解)

一、相关概念

  1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

  2. 特征(feature):指的是样本中输入部分,比如2个单特征的样本(x(0),y(0)),(x(1),y(1)),则第一个样本特征为x(0),第一个样本输出为y(0)。

  3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)。比如对于单个特征的m个样本(x(i),y(i))(i=1,2,…m),可以采用拟合函数如下: hθ(x)=θ0+θ1x。

  4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本(xi,yi)(i=1,2,…m),采用线性回归,损失函数为:

    J(θ0,θ1)=∑i=1m(hθ(xi)−yi)2

其中xi表示第i个样本特征,yi表示第i个样本对应的输出,hθ(xi)为假设函数。

  1. 梯度(gradient):在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。
    意义:函数变化增加最快的地方

二、直观理解

假设你正处于大山的某一位置,为了下山,每走一步便算一步,算出每次位置的梯度,沿其负梯度,即最陡峭的位置向下走,最终有两种可能的结果,走至一个局部山峰的最低处,或是直接走至山脚。
对应于函数,即求出局部的最优解,或是求出全局的最优解

在这里插入图片描述

三、算法(代数法&矩阵法)

代数:

1. 先决条件: 确认优化模型的假设函数和损失函数

比如对于线性回归,假设函数表示为 hθ(x1,x2,…xn)=θ0+θ1x1+…+θnxn, 其中θi (i = 0,1,2… n)为模型参数,xi (i = 0,1,2… n)为每个样本的n个特征值。这个表示可以简化,我们增加一个特征x0=1
,这样hθ(x0,x1,…xn)=∑i=0nθixi。

同样是线性回归,对应于上面的假设函数,损失函数为:

J(θ0,θ1…,θn)=12m∑j=1m(hθ(x(j)0,x(j)1,…x(j)n)−yj)

2. 算法相关参数初始化: 主要是初始化θ0,θ1…,θn,算法终止距离ε以及步长α。在没有任何先验知识的时候,可将所有的θ初始化为0,
将步长初始化为1。在调优的时候再优化。

3. 算法过程:

1)确定当前位置的损失函数的梯度,对于θi,其梯度表达式如下:

∂∂θiJ(θ0,θ1…,θn)
      2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即α∂∂θiJ(θ0,θ1…,θn)对应于前面登山例子中的某一步。

3)确定是否所有的θi,梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的θi(i=0,1,…n)即为最终结果。否则进入步骤4.

4)更新所有的θ,对于θi,其更新表达式如下。更新完毕后继续转入步骤1.

θi=θi−α∂∂θiJ(θ0,θ1…,θn)
 下面用线性回归的例子来具体描述梯度下降。假设我们的样本是(x(0)1,x(0)2,…x(0)n,y0),(x(1)1,x(1)2,…x(1)n,y1),…(x(m)1,x(m)2,…x(m)n,ym),损失函数如前面先决条件所述:

J(θ0,θ1…,θn)=12m∑j=0m(hθ(x(j)0,x(j)1,…x(j)n)−yj)2。

则在算法过程步骤1中对于θi 的偏导数计算如下:

∂∂θiJ(θ0,θ1…,θn)=1m∑j=0m(hθ(x(j)0,x(j)1,…x(j)n)−yj)x(j)i
    由于样本中没有x0上式中令所有的xj0为1.

步骤4中θi的更新表达式如下:

θi=θi−α1m∑j=0m(hθ(x(j)0,x(j)1,…xjn)−yj)x(j)

从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加1m 是为了好理解。由于步长也为常数,他们的乘机也为常数,所以这里α1m可以用一个常数表示。

还有梯度下降法的变种,他们主要的区别就是对样本的采用方法不同。这里我们采用的是用所有样本

下面是借来的代码。。和上面的步骤稍有不同

# @Time : 2020/6/16 19:42
# @Author : 大太阳小白
# @Software: PyCharm
"""
通过程序理解如何使用梯度下降求解
1、首先程序定义一个样本集,用来代替真实数据的分布
2、计算模型误差,使用均方误差
3、利用均方误差求导,解出关于待定参数w的导数
4、目标函数是误差最小,则关于w的方程求w下降最快方向使目标函数下降最快
5、定义w初始位置,带入导数方程,求得关于初始位置w的导数
6、w根据w位置导数移动lamda倍步长,得到新的w1点,带入导数方程求w1导数,如此迭代
7、当满足一定迭代限制或是误差限制时停止迭代,求得w值
"""
import numpy as np
import matplotlib.pyplot as plt
 
 
def create_sample_set():
    """
    生成样本数据集
    :return:
    """
    x = np.arange(0, 100, 1)
    y = x * 11.8 - np.random.standard_normal(100) * 100
    return x, y
 
 
def loss(weight, x, y):
    """
    损失函数使用均方误差
    :param weight:权重
    :param x:
    :param y:
    :return:
    """
    return (x * weight - y).T * (x * weight - y)
 
 
def gradient(weight, x, y):
    """
    基于损失函数求关于w的导数
    :param weight:
    :param x:
    :param y:
    :return:
    """
    return x.T * (x * weight - y)
 
 
def gradient_descent(x, y, max_iter=10, learning_rate=0.001):
    """
     梯度下降求解
    :param x:
    :param y:
    :param max_iter:
    :param learning_rate:
    :return:
    """
    m, n = np.shape(x)
    weight = np.mat(np.ones((n, 1)))
    loss_arr = []
    weight_arr = np.zeros((max_iter,n))
    for i in range(max_iter):
        g = gradient(weight, x, y)
        weight = weight - learning_rate * g
        error = loss(weight, x, y).T.tolist()[0][0]
        loss_arr.append(error)
        weight_arr[i, :] = weight.T
        print("迭代 {} 损失:{},weight参数:{}".format(i + 1, error, weight.T.tolist()))
 
    return weight,loss_arr,weight_arr
 
 
if __name__ == '__main__':
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    features, labels = create_sample_set()
    X = np.ones((2, 100))
    X[1] = np.mat(features)
    X = X.T
    Y = labels.reshape(100, 1)
    weights,loss_array,weights_array = gradient_descent(X, Y, learning_rate=0.000001)
    # 绘制曲线
    fig = plt.figure()
 
    ax1 = fig.add_subplot(2, 2, 1)
    ax1.set_title("样本数据分布" )
    ax1.scatter(features, labels)
    ax2 = fig.add_subplot(2, 2, 2)
    ax2.set_title("梯度下降拟合效果" )
    ax2.scatter(features, labels)
    ax2.plot(features, (X * weights).T.tolist()[0])
    ax3 = fig.add_subplot(2, 2, 3)
    ax3.set_title("随着迭代次数增加loss走势")
    ax3.plot(range(len(loss_array)), loss_array)
    ax4 = fig.add_subplot(2, 2, 4)
    ax4.set_title("随着迭代数增加学习的参数逐渐稳定")
    ax4.plot(np.array(weights_array))
 
 
    plt.show()

矩阵:

#定义标准化函数
def regulization(X):
	xmat = X.copy()
	x_mean = np.mean(xmat,axis = 0)
	x_std = np.std(xmat,axis = 0)
	x_norm = (xmat-x_mean)/x_std
	return x_norm
	
#批量梯度下降的实现
def bgd(data,alp=0.01,numit=5000):
	# 将数据转化为矩阵形式(分特征矩阵和标签矩阵)
	xMat = np.mat(data.iloc[:,:-1].values)
	yMat = np.mat(data.iloc[:,-1].values).T
	# 将数据标准化
	xMat = regulization(xMat)
	yMat = regulization(yMat)
	m,n = xMat.shape
	# 存储系数
	w = np.zeros((n,1))
	for k in range(numit):
		grad = xMat.T*(xMat*w-yMat)/m
		w -= alp*grad
	return w

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

梯度下降(学习笔记) 的相关文章

  • vs2012远程调试(可用)

    vs2012远程调试功能的改进 分类 vs2012 vs远程调试 2014 01 22 17 49 75人阅读 评论 0 收藏 举报 vs2012 vs 不知道大家有没有遇到过这种情况 刚开发完的程序 明明在本机能够好好的运行 可是部署到服
  • 教你如何搭建一个自动化构建的博客

    前言 记得在1年之前搭建了一个个人主页的博客 但是当时功力尚浅 每次写博客 都是自己手动写html 这样会变得非常的繁琐 现在很多人用主流的wordpress hexo之类的快速搭建一个平台 那些工具确实方便 但是对于主题以及一些额外的排版

随机推荐

  • Fabric搭建错误

    fabric搭建错误解决 在搭建fabric环境时 byfn sh up 时遇到错误Error error getting endorser client for channel endorser client failed to conn
  • 解决:component COMDLG32.OCX or one of…和 MSCOMCTL.OCX or one of...的解决方法

    遇到的问题 在做CTF题目 使用16进制转图片工具 出现了两个报错 解决方法 第一步 下载COMDLG32 OCX 程序 可以去官网 也可也使用我的百度网盘 http 链接 https pan baidu com s 1 1KNgqrxPA
  • 走过2011

    走过2011 时间飞逝 2011不寻常的一年还剩下短短5天 三百天的生活与工作是一份平淡一份快乐 工作需要总结 生活也要总结 日子才会越来越好 2011是进入公司的第二年 公司开发人员有来有离 我没有离开 因为我不喜欢跳槽 但我不跳槽的主要
  • Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from

    程序在编译时报错 在执行合并AndroidMainfest时报Attribute application appComponentFactory value android support v4 app CoreComponentFacto
  • Property ‘xxx‘ does not exist on type ‘xxx‘报错解决

    用ts写一个组件的时候 遇到了Property increment does not exist on type Add 的红点儿报错 但神奇的是竟然还能正常运行 在参考一些正确的代码后 有两个解决方案 在export default cl
  • P1048 采药(C++)---01背包(动态规划)解题

    题目描述 辰辰是个天资聪颖的孩子 他的梦想是成为世界上最伟大的医师 为此 他想拜附近最有威望的医师为师 医师为了判断他的资质 给他出了一个难题 医师把他带到一个到处都是草药的山洞里对他说 孩子 这个山洞里有一些不同的草药 采每一株都需要一些
  • MathJax 3 配置和上手渲染数学公式及在Vue中的使用

    mathjax是一个用于latex mathml和ascimath表示法的开源javascript显示引擎 mathjax的3 0版是对mathjax的彻底重写 实现了组件化 可以实现不同需求的定制 使用和配置与mathjax2版本有很大的
  • 【redis】Redis cluster是AP架构还是CP架构?

    最近刚好在看CAP理论 加上之前分析的redis cluster 就在想redis的cluster是什么模式的 AP还是CP 首先还是简单讲下CAP 具体的可见 CAP分别是 强一致性 Consistency 可用性 Availabilit
  • 地址栏参数隐藏

    1 result type 的redirectAction改为chain 但要注意如果是登录方法 权限拦截器中就可能会影响 2 将参数放到作用域中 比如session 注意 1 这样的注释是没用的
  • 网络编程13——epoll事件模型:ET和LT模、掌握实现epoll的ET模式(非阻塞模式

    epoll是linux下多路复用IO select poll 的增强版本 它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率 因为它会复用文件描述符集合来传递结果为不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文
  • shiro认证机制及认证原理

    转自 shiro认证机制 认证原理 下文笔者将讲述shiro的认证机制及认证原理 如下所示 Shiro认证 验证用户身份的过程 在认证过程中 用户需要提交实体信息 Principals 和凭据信息 Credentials 以检验用户是否合法
  • 【玩转PointPillars】Ubuntu18.04上部署nutonomy/second.pytorch

    系统环境 Ubuntu18 04 cuda10 2 GeForce GTX 1650 今天部署的项目虽然名称上叫做second pytorch 实际上是PointPillars的作者fork自SECOND项目 并作了改动之后形成的Point
  • 词法分析器构造工具Flex基础学习

    Flex是一个生成词法分析器的工具 它可以利用正则表达式来生成匹配相应字符串的C语言代码 其语法格式基本同Lex相同 单词的描述称为模式 Lexical Pattern 模式一般用正规表达式进行精确描述 FLEX通过读取一个有规定格式的文本
  • SVN 服务器发送了意外的返回值(405 Method Not Allowed),在响应 “MKCOL” 的请求

    先转载一段网上说的解决方法 svn 405 Method Not Allowed 在响应 MKCOL 的请求 I managed to solve the problem Delete the parent s directory of t
  • jupyter lab的目录调整及默认浏览器设置为chrome

    Jupyter lab 的目录调整及默认浏览器设置为chrome 1 Jupyter 默认目录调整 首先要找到jupyter生成的配置文件 jupyter notebook config py 如果没有 在 anaconda prompt
  • 在Anaconda中快速安装OpenCV for Python

    一 下载和安装Anaconda Anaconda下载地址 Anaconda Individual EditionAnaconda s open source Individual Edition is the easiest way to
  • 【吐血整理】java程序员推荐轻薄笔记本

    正文 在写这个文章之前 我花了点时间 自己臆想了一个电商系统 基本上算是麻雀虽小五脏俱全 我今天就用它开刀 一步步剖析 我会讲一下我们可能会接触的技术栈可能不全 但是够用 最后给个学习路线 Tip 请多欣赏一会 每个点看一下 看看什么地方是
  • kali Linux自带firefox ESR设置代理

    1 打开kali的火狐浏览器 找到右上角的 三个杠 在点击 preferences 2 general gt network proxy gt setting 3 打开靶场和burp suite工具 注意火狐浏览器的代理是启动状态 靶场地址
  • 双写绕过的原理

    可以看到代码对key进行了过滤 那怎么办呢 可以构造kekeyy 当key被过滤掉时 剩下的字符自动拼接在一起 就形成了key 所以说 这样就可以拿下flag了
  • 梯度下降(学习笔记)

    应用 梯度下降法 Gradient Descent 又称最速下降法 是迭代法的一种 可用于求解机器学习算法的模型参数 即无约束优化问题 具体来讲可用来求解损失函数的最小值 也可求解最小二乘问题 分类 批量梯度下降 BGD 使用全部样本构建了