机器学习的最终目标就是获得泛化能力,而什么是泛化能力呢,就是指处理未被观察过的数据(非训练数据)的能力。

一、为何要引入损失函数

损失函数就是评估一个学习器“恶劣程度”的指标——即描述了当前学习器对训练数据在多大程度上不拟合、不一致。所谓让机器通过“学习”数据信息从而产生一个学习器的过程,就是去寻找最优参数,使得损失函数达到极小甚至最小的过程。
而这一过程如何实现?——答案就是求导,而导数就是所谓的“梯度”。

举个例子:假设 y k y_k yk​ 表示一个学习器的预测结果, t k t_k tk​ 表示该数据的实际值,假设以均方误差为损失函数,那么损失函数可以表示为: E = 1 2 ∑ k = 1 n ( y k − t k ) 2 E=\frac{1}{2}\sum^{n}_{k=1}(y_k-t_k)^2 E=21​k=1∑n​(yk​−tk​)2
而 y k y_k yk​是由训练数据和模型参数 β , α \beta,\alpha β,α共同决定的,可以表示为 y k = f ( x ; β , α ) y_k = f(x;\beta,\alpha) yk​=f(x;β,α)
因此,损失函数可以表示为
L ( x ; β , α ) = 1 2 ∑ k = 1 n ( f ( x ; β , α ) − t k ) 2 L(x;\beta,\alpha)=\frac{1}{2}\sum^{n}_{k=1}( f(x;\beta,\alpha)-t_k)^2 L(x;β,α)=21​k=1∑n​(f(x;β,α)−tk​)2
训练的任务就是要找到最优的 β , α \beta,\alpha β,α的值,使得 L ( x ; β , α ) L(x;\beta,\alpha) L(x;β,α)达到极小或最小,数学上如何求极小值/最小值?答案就是求导。
那么求导得到的“导数”(即梯度)是什么意义呢?它表示“如果稍稍改变权重参数的值,损失函数的值会如何变化”。如果导数的值为负,那么通过使模型参数正向变化,可以减小损失函数的值;如果导数的值为正,那么通过使模型参数负向变化,可以减小损失函数的值。而当导数为0时,无论模型的参数往什么方向变化,损失函数的值都不会改变。

那么问题来了,机器学习的最终目的是获得泛化性,也就是要提高预测或识别的精度,为什么不以精度为学习的目标,反而整一个损失函数为目标函数呢?
试想这样一个场景,假设有100条训练数据(测试数据也行~),如果有目前的预测精度为0.32,那么表示当前有32条数据预测正确。这时,如果我们微调模型参数,会有什么结果呢?
(1)调节的幅度过于微小,预测精度没有任何改善,还是0.32.
(2)预测精度有所改善,本来能预测对32个,现在预测对了33个,精度变为了0.33.
显然,精度对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续的、突然的变化。就好比,当前精度是0.32,我们没法通过调参使其达到0.325;而如果当前损失函数是0.32,我们可以让其达到值域内的任意值,0.325, 0.3256,0.32567…
总结一下就是——精度是不连续的函数,而损失函数是连续型的函数;如果用精度最为目标,绝大多数地方的导数都将为0,参数将无法更新。

二、梯度和学习率

上文已经提及,梯度就是对损失函数求导的导数值,它表示“如果稍稍改变权重参数的值,损失函数的值会如何变化”。我们想要损失函数往最小的方向走,那么梯度的方向就是各点处函数值减小最多的方向。注意,梯度的方向并不一定指向最小值,但在每一点处,沿着梯度可以最大限度地减小损失函数的值。
像这样,通过不断沿着梯度方向前进,逐渐减小函数值的过程,就是梯度法。梯度法是解决机器学习最优化问题的常见方法。我们通过公式来描述梯度法,参数的迭代过程可以描述为
β = β − η ∂ f ∂ β \beta=\beta-\eta\frac{\partial{f}}{\partial{\beta}} β=β−η∂β∂f​ α = α − η ∂ f ∂ α \alpha=\alpha-\eta\frac{\partial{f}}{\partial{\alpha}} α=α−η∂α∂f​
其中, η \eta η表示每次迭代的更新量,被称为学习率。它决定在一次学习中应该学习多少,以及在多大程度上更新参数。学习率是一个超参数(不能通过数据训练得到,而需要人工设定的参数),一般这个值过大或过小都无法抵达一个“好的位置”。

三、用Python简单实现一个梯度下降算法

【例】使用梯度法求解 f ( x 0 , x 1 ) = x 0 2 + x 1 2 f(x_0, x_1)=x_0^2+x_1^2 f(x0​,x1​)=x02​+x12​的最小值。
【求解】
step 1、首先定义一个求梯度的函数

import numpy as np
def gradient(f,x):h = 1e-4 #h是求导时自变量的差值,设为很小的常数即可grad = np.zeros_like(x) #for idx in range(x.size):tmp_val = x[idx]x[idx] = tmp_val + h fxh1 = f(x) #计算f(x+h)x[idx] = tmp_val - h fxh2 = f(x) #计算f(x-h)grad[idx] = (fxh1 - fxh2)/(2*h)x[idx] = tmp_val #还原return grad

step 2、定义一个函数用于实现梯度下降的过程

def descent(f, init_x, lr = 0.01, step_num = 100): x = init_xfor i in range(step_num): #step_num为迭代次数grad = gradient(f, x) #求梯度x -= lr*grad #每次迭代用学习率乘以梯度return x

step 3、定义待求解函数并初始化输出 x 0 x_0 x0​和 x 1 x_1 x1​的最小值

def func(x):return x[0]**2 + x[1]**2init_x = np.array([-3.0, 4.0])
descent(func, init_x = init_x, lr = 0.1, step_num = 100)

最终的输出结果为

array([-6.11110793e-10,  8.14814391e-10])

最终结果非常接近于0,这是正确的。这里可以做一个实验,如果学习率过大或过小,都不会得到接近于0的结果:

print(descent(func, init_x = init_x, lr = 10, step_num = 100))
print(descent(func, init_x = init_x, lr = 1e-10, step_num = 100))

输出结果如下,可见学习率过大的话,最终会发散成一个很大的值;而学习率过小的话,基本上没怎么更新就结束了。

[-2.58983747e+13   -1.29524862e+12]
[-2.99999994   3.99999992]

本文参考了《深度学习——基于python的理论与实践》
欢迎指正!

损失函数、梯度和学习率的理解及用python实现梯度下降法相关推荐

  1. [ML]--梯度下降 GD 的理解和探究

    文章目录 1. Content 2. References 1. Content 2. References 深度理解机器学习"梯度下降" jianshu 一文读懂梯度下降算法 c ...

  2. 深度学习100问之深入理解Vanishing/Exploding Gradient(梯度消失/爆炸)

    这几天正在看梯度消失/爆炸,在深度学习的理论中梯度消失/爆炸也是极其重要的,所以就抽出一段时间认真地研究了一下梯度消失/爆炸的原理,以下为参考网上的几篇文章总结得出的. 本文分为四个部分:第一部分主要 ...

  3. 梯度下降学习率的设定策略

    发现一篇写的很好的关于学习率的文章 本文转载自卢明冬的博客-梯度下降学习率的设定策略 1.学习率的重要性 1)学习率设置太小,需要花费过多的时间来收敛 2)学习率设置较大,在最小值附近震荡却无法收敛到 ...

  4. 【学习率】梯度下降学习率的设定策略

    转载 卢明冬 参考 学习率和batchsize如何影响模型的性能? - yumoye - 博客园 学会使用顶级算法的秘诀是什么?如何找到合适的学习率?-电子发烧友网 深度学习论文 - Cyclical ...

  5. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

    批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...

  6. 『深度概念』度量学习中损失函数的学习与深入理解

    『深度概念』度量学习中损失函数的学习与深入理解 0. 概念简介 度量学习(Metric Learning),也称距离度量学习(Distance Metric Learning,DML) 属于机器学习的 ...

  7. 梯度下降学习率的影响

    梯度下降-学习率的影响 调试梯度下降. 绘制一个在x轴上具有迭代次数的图. 现在在梯度下降的迭代次数上绘制成本函数J(θ). 如果J(θ)增大,则可能需要减小α. 自动收敛测试. 如果在一次迭代中J( ...

  8. 关于多标签分类任务的损失函数和评价指标的一点理解

    关于多标签分类任务的损失函数和评价指标的一点理解 之前有接触到多标签分类任务,但是主要关注点都放在模型结构中,最近关于多标签分类任务进行了一个讨论,发现其中有些细节不是太清楚,经过查阅资料逐渐理解,现 ...

  9. 策略梯度学习整合与理解

    强化学习是一个通过奖惩来学习正确行为的机制. 家族中有很多种不一样的成员, 有学习奖惩值, 根据自己认为的高价值选行为, 比如 Q learning, Deep Q Network(value bas ...

最新文章

  1. model存数据_Jepsen 测试框架在图数据库 Nebula Graph 中的实践
  2. C时间函数ctime返回值的探讨
  3. linux下面子目录绑定域名的方法,.htaccess绑定子域名到子目录方法
  4. 1.1 Java包装类、装箱和拆箱
  5. android socket io和服务器_Java socket通讯服务器和客户端教学版
  6. 【Python】module ‘tensorflow_core._api.v2.config’ has no attribute ‘experimental_list_devices’
  7. gitlab 使用配置
  8. 第十一篇 面向对象进阶
  9. Oracle数据库中序列用法讲解(转)
  10. Adaptive调度器
  11. UE4多人 mysql_UE4 添加多人联机功能
  12. 这一篇说明大多数SQL优化的面试问题
  13. 吃透Chisel语言.33.Chisel进阶之硬件生成器(二)——Chisel组合逻辑电路生成:以BCD编码表为例
  14. 使用命令行浏览器在 Linux 终端上网浏览
  15. Python高校学生档案管理系统毕业设计源码071528
  16. 【Python】安装pip
  17. 苹果交管局反馈信曝光 首次官方披露自动驾驶相关计划
  18. 使用PHPWord把html转成word文档并支持下载
  19. webapp开发—手机屏幕分辨率和浏览器分辨率不要混淆
  20. 一个 Go 语言实现的数据库

热门文章

  1. 《Large scale GAN training for high fidelity natural image synthesis》论文阅读记录
  2. js获取 url 参数值的方法总结
  3. 【图像配准】SIFT算法原理及二图配准拼接
  4. Windows系统解决谷歌翻译不能用的问题
  5. [AHK]自动运行一键选股
  6. Linux上C语言程序编译过程详解
  7. 每日新闻:今日头条正式发布小程序;甲骨文云服务营收未达预期
  8. C# 语言程序设计笔记
  9. 怎样用matlab把视频转gif动画,Matlab制作视频并转换成gif动态图的两种方法
  10. Android框架排行榜,上百项资源汇总不容错过