批量梯度下降_推导线性回归损失函数_以及利用代码实现批量梯度下降---人工智能工作笔记0027

文章详细介绍了线性回归中损失函数的导数计算,特别是当参数较多时如何进行偏导数求解,并阐述了批量梯度下降的过程,以及在实际应用中如何用代码实现这一过程。同时,提到了随机梯度下降的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

然后我们来看一下,怎么来求线性回归函数,那个目标函数,也就是损失函数的导数 

 

可以看到之前我们说的那个损失函数,也就是目标函数的公式是右上角的那个

现在转换成了下面的部分:

实际上这个表达方式很右上角的表达方式是一样的,右上角,这里的xi,表示是一个数,而

下面这个x y表示是一组数对吧.这里htheta (x) ,x这里是个矩阵,那么htheta 也是个矩阵,矩阵相乘,得到一个列向量,那么y也是一个列向量,列向量相减是线性代数的表达方式,而右上角是直接代数的表达方式,所以这两个是等价的.

下面是AI回答的:什么是线性代数,什么是直接代数,直接代数解决的问题更加的简单一些,

线性代数,升级到矩阵,向量等.

线性代数和直接代数的区别是一个比较复杂的问题,我尝试用简单的语言来解释一下。

线性代数是研究向量、矩阵、线性方程组、向量空间、线性变换等概念的数学分支1。它主要关注的是变量之间以固定比例变化的关系2,也就是说,如果一个变量增加或减少了一定的量,另一个变量也会按照一定的比例增加或减少。线性代数可以用来描述很多现实中的问题,比如图像处理、数据压缩、密码学等。

直接代数(Direct algebra)是我不太熟悉的一个术语,根据网上的资料3,它似乎是指用直接方法(Direct method)来求解线性方程组或微分方程的一种技巧。直接方法就是把原来复杂的问题转化为简单的问题来求解,比如把微分方程转化为线性代数问题3。直接方法有很多种,比如高斯消元法、克拉默法等。

所以说,线性代数和直接代数并不是同一层次上的概念,而是有所交叉和联系。你可以把直接代数看作是线性代数中的一个应用领域。

 这里的j(theta) 这里我们写一个撇,表示求导,这个我们知道,然后左侧的公式,为什么要写成那种符号呢,是因为

 可以看到是因为这里,theta是一组数值了对吧,这里是theta是一组的数值了,所以这里要求导数,就不能对某个theta求导数了,而是对所有的theta都要求导数,对所有的theta都求导数的话,这里叫做

求偏导,这里的theta其实就是对应的y=ax+b 这里的b是w0 a是w1,当然参数多的时候,还有w2,w3...wn对吧,所以这里的theta就是我们说的w,权重对吧.因为参数多,所以这里就是要求偏导了,对每个theta都要求导数.然后这个时候再做梯度下降的时候,就需要做批量的梯度下降了,因为

求出的导数,有多个,也就是斜率有多个,也就是对应的g有多个对吧.对应g0...gn对吧.

 如果我们的w权重比较多,参数比较多,那么我们的图,可以看到就不能这么画了对吧,这仅仅是针对一个参数一个theta画的.也就是只是考虑了一个维度的. 

而如果参数比较多的话,也就是把上面那个1维的图给叠加起来画图,也就是上面这个样子的

可以看到上面画出了具有两个参数x1,x2的图

实际上上面的那个公式,就是表示了有多个theta的情况,要求导数的时候,也是求出多个导数,可以看到上面就是说,可以同时对多个参数,多个theta求导,得到多个g,斜率对吧.

然后我们来看这里,我们开始对这个公式进行求导

首先我们看这个这个求导的话,可以看到2分之一

的x^2 求导以后是 2分之一 . 2 .x,所以同理,

 

这个1/2 (hthetax - y)^2 就可以拆开,变成下面的对吧,

然后约掉就可以进一步变成这样了,然后为什么右边还需要

. 上一个这个部分,因为这里面的

 这个部分,我们说hthetax是个矩阵,而对应的y也是个列变量,所以,也就是这里1/2(x)^2 对这个求导,

而这里面的x,是个复合函数,所以这里又需要对复合函数,hthetax-y 进行进一步的求导,

也就是对这个部分求导:

 

然后我们再来看一下如何对这个部分来求偏导数

因这个这个部分其实表示的是,里面的hthetax是个矩阵,然后y是个列变量

 这个要明确

 

然后我们再来看一下,这里的x要知道是一个m行n列的矩阵,然后再来看这里的

这个hthetax,其实我们可以写成,yhat = theta T x对吧,然后这个

theta T x 可以写成theta0.x0+theta1.x1...+thetaj.xj+....thetan.xn 对吧,可以把这个写开了

 

然后写开了以后怎么求偏导呢,可以看到,我们先看这个2x+1 的导数 =2 对吧,所以根据这个原理,

我们这个hthetax -y 可以写成 theta0.x0+theta1.x1...+thetaj.xj+....thetan.xn -y对吧,而这里的

跟2x+1 一样,这里对这个求导,就可以看成是 -y 这里就把y忽略就可以了,然后

如果我们把theta看成x的话,因为在之前的,那个正态分布图中,我们就把theta当成是x轴了对吧

求theta点对应的斜率,这里也一样,我们把theta看成x坐标,那么,这个  hthetax -y 可以写成 theta0.x0+theta1.x1...+thetaj.xj+....thetan.xn -y  的导数就是xj对吧

 

可以看到所以这里,为什么是xj呢?这里xj表示一个代表对吧, 因为我们看到这里是用的thetaj对吧,我们说把theta看成了x坐标了,所以这里,

我们那个公式的写法是:hthetax -y 可以写成 theta0.x0+theta1.x1...+thetaj.xj+....thetan.xn -y

如果按照我们之前看的那个正态分布图来看,我们把theta当成x坐标的值,那么对应的

上面的公式就可以写成:hthetax -y = theta0.x0+theta1.x1...+thetaj.xj+....thetan.xn -y

把这个写成:注意这里的X,我们就类似于2x+1 中的2对吧,我们改个名字叫X吧

(hthetax -y)j = x0.X0+...+xj.Xj+....xn.Xn -y 这里因为求的是j对应的导数所以这里的结果

就是Xj了 ,注意这里的x0...其实是theta对吧,然后所以对应的结果就是xj了,体会体会吧..

所可以看到,最后我们就得到了一个J(theta)这的导数了,就是包含,x矩阵和 y列变量的导数

也就是 = (htheta(x) -y).xj 对吧

 

  j(theta)`= (htheta(x) -y).xj 对吧所以这个导数,如果我们输入一个xj,也就是对应时刻的x矩阵,然后再输入那一时刻的theta的所有值,也就是之前我们说的那个正态分布图中的对应的theta值,然后再把对应的y值带入进去,就可以得到那一个时刻的所有的theta的导数了对吧.

然后我们再来明确一下,这里的xj,表示的是某一列对吧,因为x是m行到n列的矩阵,然后

i从0到n,所以这里的j,其实就是x从0列到n列的某一列对吧.

 然后这里我们再来看一下,这里( htheta(x) - y ) xj 这里要知道是如何计算的,

我们知道这里,因为m*n是个矩阵要知道是m行n列的,所以这里的htheta是一个n*1列的列变量,好好考虑,不是太好理解, 其实也好理解,因为我们要知道x是一个m*n的矩阵,m行n列,所以,就需要一个,

1列n行 的数,来与它计算,因为x有n列,所以就要有n行,1列的theta才能进行计算,然后y是一个m行1列的值m*1列的值,也就是m行一列的数据, 所以这个结果,

也就是htheta(x)-y 这个得到也是一个m行一列的数据,然后再去乘以xj,注意,xj 其实是m行中的具体哪一行对吧,也是m行1列的数据,所以他们两个相乘,就需要有一个进行转置,最后得到的gj ,也就是这多个导数了对吧.

然后我们用代码来看一下这里,怎么样,使用代码实现一下

首先import numpy as np 导入 数学集合的的包对吧

然后X= 2 * np.random.rand(100,1) 定义一个 0 到1 的,100行,1列的数据对吧,这里是0到2 ,因为乘以2了对吧

然后定义Y = 4+ 3 * X + np.random.randn(100,1) 这里 是根据X的值得到一组Y的值,这个y是真实值.

然后,然后我们说y = ax+b 这里的b我们 可以认为想x0*b + x1*权重w1+x2*w2... 这里我们让x0 =1 ,

那么加的这个b 就是原值了,所以这里

x_b = np.c_[np.ones((100,1)),X] 将,一个100行1列的1 拼接到我们的X上面去.

这样我们的x数据,就是第一列全部都是1了.符合我们x0 =1的规则.

然后这个learning_rate = 0.1 是学习率,我们指定的,然后

n_iterations = 1000 是迭代次数,比如我们让他迭代1000就停止,在机器学习中,由于计算量过大,如果等着他结果收敛的话,那么可能会等很久,所以这里,我们就指定迭代1000,不管结果准不准,都

不继续进行了.

然后因为我们初始化X值的时候,是100行一列, y值也是100行一列,所以这里我们是100个样本,

m = 100

然后我们继续说,这里这个

theta = np.random.randn(2,1) 这里是获取一个2行 一列的数据 ,其实就是准备了,我们之前说的

正态分布中的,theta对吧,因为这里我们,x是两维度的,所以这里我们也就相当于有,两个

正态分布,然后,这里我们就要输入两个theta了,两个权重对吧,可以看到

然后这里的count = 0 这里我们先不用管

然后我们再来看继续

这里for interation in range(n_iterations);

其实就是循环n_iterations,这个n_iterations是1000对吧所以这里就是从0到999进行循环

对吧

然后我们再看

gradients = 1/m * x_b.T.dot(x_b.dot(theta)-y)

可以看到这个公式其实就是,对应的X_b,这个矩阵包含了两个参数的对吧x1,x2 ,然后 * x_b 再 * theta 然后-y 对吧就是右上那个公式对吧

然后这里的 x_b.dot(theta) - y 其实就是(htheta(x1)-y) 对吧,其实就是套的上面咱们说的那个公式

对吧.

 

 具体我们看,其实就是之前我们这个公式,我们说

(htheta(x) - y) * xj 这里的 htheta(x) - y 我们说是m行1列的矩阵,然后xj,我们说也是m行1列的矩阵

那么,两个m行1列的矩阵相乘,我们说矩阵相乘需要有一方需要转置对吧,所以这里我们就有一个转置对吧,这里我们转置的是xj对吧.

这里.这个就是我们说,两个矩阵相乘,需要将一方进行转置,这里我们转置的是xj,也就是

上面的x_b.T对吧

 

然后我们这里还需要知道,这里我们的xj,我们之前说是一列数据,也就是m行n列中的一列对吧,但是

要注意,我们这里的话,xj,因为是x_b对吧,而这个x_b,我们知道,其实是,有两列对吧,一列是100行,1列的随机出来的0到2的值,一列是,100行1列的1对吧,所以现在我们,这里的,x,实际上是100行2列的数据,然后对应的xj,也是100行2列的数据,然后,这个时候,我们做梯度下降.

也就是这个部分梯度下降,以后得到的值,可以看到是g0 g1 也是两个对吧,

因为我们知道,以前100行1列的数据,这个xj,我们讨论的是一维的...现在是两维的,所以

得到的斜率,也是2个

 下面具体我们再来说说

可以看到,我们说这里xj . (htheta(x) -  y) 实际上是 一个100行1列的值  *  100行1列的值对吧

看右上角,那么由于我们的转置,这里我们的xj,也就是x_b.T 对吧,本来是100两2列的值,现在

应该说是2行100列的值了,因为转置了,那么,2行100列的值  和 100行1列的值进行相乘

这里的这个两行100列,其实就是右边

也就是说左边是

左边是m*n 这里是100行2列对吧,中间那个n*1对吧,

这里为什么说是n*1呢? 因为这里我们的xj,我们写的也是x_b,只不过对x_b进行了,

x_b.T转置对吧,所以如果,x_b是100行2列,那么转置以后就变成了2行100列,是个列向量,而

一个矩阵*2行100列的列向量的话,会,左边矩阵* 列向量的第一行会得到一个值,然后

左边矩阵*列向量第二行又得到一个值,这里要知道这个规则,所以就是得到了

两个g了对吧,也就是g0,g1,也就得到了这两个,正态分布的,对应的我们输入了两个theta的

斜率了对吧.这个需要好好理解一下

 

然后我们再看,这里损失函数我们已经计算出来了

readients = x_b.T.dot(x_b.dot(theta)-y)对吧为什么,前面要 * 1/m 呢?

注意,我们一般来说,现在是100个样本数据对吧,我们说如果样本数据越大,可以知道

loss,这个损失函数越大对吧,那么不对啊.

我们说,样本越大,做出的预测越准确啊...所以这里我们就在前面,写了一个1/m ,*了这个1/m

以后,我们会发现,随着m,样本数增大,我们的损失反而越来越小了对吧,这个就是* 1/m的原因

,也就是相当于这里我们求的是一个平均的损失.让平均损失越小,那么样本数量越大

 

然后我们把批量梯度下降这个注释写上.

然后这里要知道,这里的梯度,我们之前说的,g,在我们这里面就变成了复数了,就有2个了对吧

因为,我们先看这里,我们的theta = np.random.randn(2,1) 是一个两行1列的,什么?

标准正态分布中的值对吧,因为我们,之前也说,theta是符合标准正态分布的,所以我们获取了随机的

一个正态分布中的值,来做为初始值.

然后紧接着,我们得到了g0,g1以后,带入:

theta_t+1 = theta_t - grad * learning_rate 对吧

这里,我们这个grad,这里限制是一个2行1列的列向量对吧,* learning_rate 常数以后,还是一个

列向量对吧,然后这个列向量,再跟原来的theta_t 做减法的话,得到的还是一个列向量,

这样就得到了第二个theta_t+1了,然后就可以继续做批量梯度下降了

 

然后还要注意,实际上我们工作的时候,是不设置阈值的,我们说让他不停的迭代,直到,

结果收敛,也就是找到解析解对吧,但是实际上,要找到解析解,或者是说达到我们需要的阈值,有时候

需要的实际太久,所以我们一般往往,比如我指定,让他迭代1000次就停止,我们就认为已经收敛了.

即使是没有收敛也这么认为.

那么如果没有收敛怎么办?我们有其他的办法来防止它不收敛,后面会说到

然后我们执行,这里执行1000次看看结果,可以看到,得到了

y=3x+4 这里的...参数可以看到b是3.7  a是3.3对吧... 

 

然后我们迭代10000次看看,结果就比较准确了对吧.

然后我们再来看看这个文件的名字,可以看到是batch开头的,也就是说,这个batch是批的意思,

也就是批量的进行梯度下降,因为我们的维度多对吧,如果后面做图像处理什么的,可能会用到

很多的参数,甚至100万个,那么这个时候,都是用这种批量梯度下降来求解问题的.

 

然后我们说随机梯度下降,我们说梯度下降,还叫做SGD对吧

这里s是什么意思呢?

 

我们查一下可以看到是随机的意思对吧.

所以这里梯度下降也就说的是随机的对吧,随机的梯度下降,还给个随机的初始值对吧.

然后再去总结一下去看看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

添柴程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值