梯度优化、LR【原理+推导】

1   线性目标的梯度优化

  损失函数:

              

算法1 : 批量梯度下降BGD

  每次迭代使用所有样本来对参数进行更新。

  损失函数:

代数形式:

矩阵形式:

更新:

代数形式伪代码:

    

矩阵形式伪代码:

算法2:随机梯度下降SGD

每次迭代使用一个样本来对参数进行更新。

一个样本的损失函数:

代数形式伪代码:

矩阵形式伪代码

#  python

  n_batch = 1

  batch = np.random.choice(X.shape[0],n_batch)

  X_batch,y_batch = X[batch], y[batch]

算法3:小批量梯度下降法

每次迭代使用n_batch个样本对参数进行更新

代数形式伪代码:

矩阵形式伪代码

        n_batch = m

batch = np.random.choice(X.shape[0],n_batch)

  X_batch,y_batch = X[batch], y[batch]

  1. 线性目标的sgd优化,写出伪代码。mini_batch怎么更新?

  2. SGD并行实现?

2   LR回归原理推导

  假设数据服从伯努利分布,通过极大似然函数的方法,用梯度下降来求解参数,来达到将数据分类,一般是二分类。

2.1 对率回归推导

  1. sigmoid函数推导

  逻辑回归解决的是二分类问题,首先通过训练模型来学习x和y的映射关系,有了映射关系就容易对x和y进行预测分类。如何定义这种映射关系,这里假定y的取值为0或者1(也可以是其他类),两种可能,自然而然服从伯努利分布,这种映射关系就可以通过条件概率p(y|x)来表示。p(y=1|x)和p(y=0|x),对于二分类就可设定一个阈值,0.5。

  如何通过条件概率来描述x和y之间的关系呢?对率回归是线性模型,但是无法直接表示成,那么就可以通过广义线性模型来实现。一般广义线性模型的一般形式, ,其中g(y)为单调函数,g(y)就可被作为联系函数。(为什么选择sigmoid函数,一般先考虑的是单位阶跃函数将任意的实数转换为0/1的概率值,用它来当成联系函数来判断属于哪个类。但是单位阶跃函数的一个缺点就是在零点不连续也不单调,而联系函数需要单调连续。)而sigmoid能够将(-无穷,+无穷)的值域映射到(0,1),这样就可以得到合理的概率值,而且单调连续,可以作为联系函数。

  这样就得到了,将代入,得到

  用条件概率表示就是

  得到

  2. 广义线性模型推导

  指数族分布:是一类分布的总称,它的概率密度函数一般形式是:

其中,称为该分布的自然参数;T(y)为充分统计量,通常为y本身;为配分函数,保证概率表达式加和为1,保证式子是合格的概率密度函数;b(y)是关于随机变量y的函数。常见伯努利和正态均为指数族分布。

证明:伯努利分布是指数族分布?                              

化成指数族的一般形式:                                         

对应指数族分布的一般形式,

   广义线性模型三假设

  1. 给定x的条件下,假设随机变量y服从指数族分布

  2. 给定x条件下,目标是得到一个模型h(x)能预测出T(y)的期望值。

   3. 假设该指数族分布中的自然参数和x呈线性关系,即

  满足这三条假设即为广义线性模型。

  对数几率回归是在对一个二分类进行建模,并假设被建模的随机变量y取值为0或1,可以很自然地假设y服从伯努利分布。如果想要构建一个线性模型来预测在给定x的条件下y取值的话,可以考虑使用广义线性模型来建模。

  假设1:伯努利分布服从指数族分布。

  假设2:,得到

  假设3:

                 

2.2 损失函数推导

损失函数: 

由式子,

假设数据都是独立的,由伯努利分布,得到一个样本发生的条件概率表示为:

进而得到它们一起发生的概率(似然函数):

取对数,取负,得到损失函数

  为什么用似然函数

  我们的目标是预测为某一类的出现概率最大,每个样本预测都要得到最大的概率。前面我们得到了一个样本的条件概率,极大似然估计就会将所有的样本考虑进去,来使得观测到的样本的出现概率最大,所以有了累乘形式的似然函数。 (为什么累乘?)基于条件独立的假设,总的条件概率就可以表示为每一个条件概率的累乘形式。

  为什么用极大似然函数(交叉熵)作为损失函数而不用最小二乘(欧氏距离,均方损失)?

                  

  均方损失:假设误差是正态分布,适合线性的输出(回归问题),特点是对于与真实值差别越大,惩罚力度越大,不适合分类问题。

  交叉熵损失:假设误差是伯努利分布,可以视为预测概率分布与真实概率分布的相似程度。多应用在分类的问题。

  均方误差对参数的偏导的结果都乘以了 sigmoid的导数,而sigmoid导数在其变量值很大或很小时趋近于0,所以均方误差的偏导可能接近于0。

  而参数更新公式: 参数 = 参数 – 学习率 * 损失函数对参数的偏导

  在偏导很小时,参数更新速度会变得很慢,而在接近于0时,参数几乎不更新,出现梯度消失的情况。反观交叉熵对参数的偏导就没有sigmoid导数,所以不存在梯度消失的问题。

均方损失:

使用梯度下降法的条件损失函数时凸函数。而对最小二乘的损失函数求导,

可以知道,J(w)对w不是凸函数,不能用代价函数。

交叉熵:

当越接近于1,越接近于0。预测值与真实值完全相同,其损失函数为0。

当越接近于0,越接近于。

    当越接近于1,越接近于。

    当越接近于0,越接近于0。预测值与真实值完全相同,其损失函数为0。

写成矩阵形式:

2.3  梯度下降法

代数形式伪代码:

矩阵形式伪代码:



  写在后,这是第一次写博客,平常喜欢在word或txt记录,也习惯了word的公式,就不打latex了,公式直接截图了。发出来的初衷有两个,一个是怕万一本地的文档像上个电脑突然去世,里面的资料都丢失了。还一个也是希望,对上述公式或者知识点是以个人的见解来总结或者直接拿过来,希望能够看到大家的看法,以及纠正,在这也对直接拿过来的这些原出处没办法做引用说明说声抱歉。

  也是在自学的路上,更新会比较慢,这也是对自己的一种鞭挞吧。

  后续,还会有想对牛顿法,拟牛顿法进行补充,在能够认为掌握之后。

  愿正在阅读的你,以及仍热爱的你,共勉。

p(y|x)
=
wTx+b

原文地址:https://www.cnblogs.com/bhc12/p/12203296.html

时间: 2024-10-31 05:31:49

梯度优化、LR【原理+推导】的相关文章

word2vec原理推导

word2vec作为神经概率语言模型的输入,其本身其实是神经概率模型的副产品,是为了通过神经网络学习某个语言模型而产生的中间结果.具体来说,“某个语言模型”指的是“CBOW”和“Skip-gram”.具体学习过程会用到两个降低复杂度的近似方法——Hierarchical Softmax或Negative Sampling.两个模型乘以两种方法,一共有四种实现. 一.CBOW 1.一个单词上下文 2.参数更新 3.多个单词上下文 二.Skip-gram 1.网络结构 2.参数更新 三.优化 原始的

ANDROID内存优化以及原理(大汇总——上)

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(R

【深度学习系列】DNN中梯度消失和梯度爆炸的原因推导

DNN中梯度消失和梯度爆炸的原因推导 因为手推涉及很多公式,所以这一截图放出. 原文地址:https://www.cnblogs.com/Elaine-DWL/p/11140917.html

梯度优化算法总结(转载)以及solver中相关参数解释

原文地址:http://sebastianruder.com/optimizing-gradient-descent/ 如果熟悉英文的话,强烈推荐阅读原文,毕竟翻译过程中因为个人理解有限,可能会有谬误,还望读者能不吝指出.另外,由于原文太长,分了两部分翻译,本篇主要是梯度下降优化算法的总结,下篇将会是随机梯度的并行和分布式,以及优化策略的总结. 梯度下降是优化中最流行的算法之一,也是目前用于优化神经网络最常用到的方法.同时,每个优秀的深度学习库都包含了优化梯度下降的多种算法的实现(比如, las

网络编程(七):CAP原理推导和应用

在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点: 一致性 (Consistency)(等同于所有节点访问同一份最新的数据副本) 可用性(Availability)(对数据更新具备高可用性) 网络分区容忍性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求.系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A

梯度下降法的向量化推导

$第二周的向量化一节中,关于梯度下降法的向量化过程,开始不是很明白,后来自己推导了一下,记录到这里. 如下是梯度下降法的参数递归公式(假设n=2): 公式1: $\theta_0 := \theta_0 - \alpha \frac{1}{m}\sum_{i=1}^{m}(h_\theta (x^{(i)}) - y^{(i)})x^{(i)}_0$ $\theta_1 := \theta_1 - \alpha \frac{1}{m}\sum_{i=1}^{m}(h_\theta (x^{(i)

【转】性能测试设计和LR原理的探讨

做了4个迭代的性能测试, 在没有需求的情况下步步艰辛,把代码和框架独立开发从0到一万多行代码的测试工具(脚本),作为性能测试工具佼佼者Lr,我时而拿他作参考,山寨了它很多 东西,同时带有很多疑问对它实现性能测试的原因渡过了为期3个月的性能测试之旅.以下是我对比测试脚本和LR所得出的详细问题: 1.如何计算每秒处理包的数量 我针对这个曾经研究了很久.在多线程的情况下,压服务器的时候,是专门建立一个线程去采集这些信息,还是说在每个线程里面实现这个时间.后来我采取了后者.因为在到达了某项瓶颈之后,这段

SVM数学原理推导

//2019.08.17 #支撑向量机SVM(Support Vector Machine)1.支撑向量机SVM是一种非常重要和广泛的机器学习算法,它的算法出发点是尽可能找到最优的决策边界,使得模型的泛化能力尽可能地好,因此SVM对未来数据的预测也是更加准确的. 2.支撑向量机SVM有两种:Hard Margin SVM和Soft Margin SVM,对于第一种严格的支撑向量机算法主要解决的是线性可分的数据问题,而第二种SVM是在第一种的基础上改进而来,可以解决普遍的数据问题,对于问题的线性可

flask的local的使用,以及local的原理推导

flask的local的使用以及原理的推导 import time from threading import Thread, local, get_ident # 获取线程的id # 这是使用local对象的写法,下面我们会分析推导local对象的原理 a = local() def task(arg): a.value = arg time.sleep(1) print(a.value) for i in range(10): t = Thread(target=task, args=(i,