《动手学深度学习》3.1 线性回归
1前言
从零开始学习ai文章系列计划是个人在《动手学深度学习》和《磨菇书》两本书的学习中的个人笔记,文章也会以课本中的章节分开,即每个章节一片笔记。我会尽量的把主要内容以及遇到的难点进行记录与解决,如果哪里有错误的欢迎指正。或者不清晰的可以直接查看原文部分。
《动手学深度学习》原文(课本):https://tangshusen.me/Dive-into-DL-PyTorch/#/
《动手学深度学习》代码:https://github.com/ShusenTang/Dive-into-DL-PyTorch
(由于有时候公式太多,可能会直接贴图片)
2 线性回归模型
线性回归,是一段连续值模型,即提供任意的(x1,x2,x3...),都有其对应的唯一结果y
线性回归(Linear Regression)的核心思想就是找到一条最优的直线来拟合一堆数据点,使得预测值和真实值之间的误差最小。
假设y是房价,房屋面积是x1,房龄是x2。
其中 w1 和 w2 是权重(weight),b 是偏差(bias),且均为标量。它们是线性回归模型的参数(parameter)。
\[ \hat{y}{}^{(i)}={x}^{(i)}_{1}{w}_{1}+{x}^{(i)}_{2}{w}_{2}+b \] 假设y是房价,房屋面积是x1,房龄是x2。
其中 \({w}_{1}\) 和 \({w}_{2}\) 是权重(weight),\(b\) 是偏差(bias),且均为标量。它们是线性回归模型的参数(parameter)。
3.模型训练的概念
3.1 收集训练数据
采集的样本数为 n,索引为 i 的样本 \[ \hat{y}{}^{(i)}={x}^{(i)}_{1}{w}_{1}+{x}^{(i)}_{2}{w}_{2}+b \]
3.2 损失函数
所谓的损失,就是模型预测值\(\hat{y}\)与实际值y之间的误差。
即我们当前的$ ({w}{1},{w}{2},b)\(固定情况下,输入\){x}{1},{x}{2}\(经过模型计算获得的估计值\)$ 和 样本中 \(({x}_{1},{x}_{2},y)\)中已经有实际的y 之间的误差。
损失函数有许多, 这里使用的平方误差函数也称为平方损失(square loss) \[ {L}^{(i)}({w}_{1},{w}_{2},b)=\frac {1} {2}(\hat{y}^{(i)}−y(i))^2 \] 由于有n个样本,我们选平均值作为整体的损失函数 \[ {L}({w}_{1},{w}_{2},b) = \frac {1} {n}\sum ^{n}_{i=1} {L}^{(i)}({w}_{1},{w}_{2},b) = \frac {1} {n}\sum ^{n}_{i=1} {\frac {1} {2}(\hat{y}^{(i)}−y^{(i)})^{2} } \] 在线性回归中使用平方差作为损失函数有很多好处,最重要的一点在于它是一个凸函数,这意味着它只有一个最小值,确保了我们可以通过优化算法(如梯度下降)找到最优解。它的导数是连续且容易计算的,这使得求解优化问题变得更简单。
这样我们就能求出最优的参数 \(({w}_{1},{w}_{2},b)\)
3.3 优化算法
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)
然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
这里我们通过偏导数对 \(({w}_{1},{w}_{2},b)\) 进行优化,使得模型的 \(({w}_{1},{w}_{2},b)\) 越来越接近实际的 \(({w}_{1},{w}_{2},b)\) ,也就是说我们在此通过模型求出它的数值解
3.3.1 对偏导的解释
我们知道一元方程中 \(y=a{x}^{2}\),x的导数是\(2ax\),同时也代表着该点\((x,y)\)的斜率是\(2ax\)

在 \(x=0\) 处,斜率/导数 \(ax=0\)。这也是该函数最低点。
我们随机在\(x>0\)处选取点\(({x}_{1},{y}_{1})\),此时的斜率 \(2a{x}_{1}>0\),那么优化更新\({x}_{1}\)的时候 \(({x}_{1})' = {x}_{1} - 2a{x}_{1}\) 的话,$({x}{1})' 必定在x\(1的左侧,即\){x}{1}$减去该处的导数会向最低点的x==0移动。
在\(x<0\)处取值也是同理,\(2a{x}_{1}<0\),那么\(({x}_{1})' = {x}_{1} - 2a{x}_{1}\) 的话,相当于\({x}_{1}\)向右边移动。
那么这里说明一个问题,我们所求出来的偏导实际上要的只是这个值的正负,其数值大小并不重要(当然这里y=ax²中,x越大斜率越大的特点能加快到达最小值,但其它函数就不一定了)
倘若该 \(({x}_{1},{y}_{1})\) 并非处于最低点的斜率k=0的位置的话,就会不断移动,最终到达该点(收敛)
(当然这就引出局部最优或者未到达局部最优但是斜率为0的位置等问题,应该以后其他课程会解决)
3.3.2 继续
重新回到本章节的损失函数中,我们的目的是让模型预测的y尽可能接近真实数据\(\hat{y}\),因此损失越小越好。 \[ {L}({w}_{1},{w}_{2},b) = \frac {1} {n}\sum ^{n}_{i=1} {L}^{(i)}({w}_{1},{w}_{2},b) = \frac {1} {n}\sum ^{n}_{i=1} {\frac {1} {2}(\hat{y}^{(i)}−y^{(i)})^{2} } \] 再解析y获得如下完整w参数的loss函数(手打公式打麻了)

上面公式举例对\({w}_{1}\)进行求导,利用链式法则 \[ E=L^{(i)}={x}^{(i)}_{1}{w}_{1}+{x}^{(i)}_{2}{w}_{2}+b−y^{(i)} \]
\[ J=E^2 \]
\[ \frac {∂J} {∂{w}_{1}}= \frac {∂J} {∂E}*\frac {∂E} {∂{w}_{1}}=2E*{x}^{(i)}_{1}=2{x}^{(i)}_{1}({x}^{(i)}_{1}{w}_{1}+{x}^{(i)}_{2}{w}_{2}+b−y^{(i)}) \]
因此得到如下更新公式(2是常数所以去掉了)

在上式中,\(∣B∣\) 代表每个小批量中的样本个数(批量大小,batch size),\(η\) 称作学习率(learning rate)并取正数。
4 线性回归的表示方法
4.1 神经网络图
线性回归是一个单层神经网络

输入\({x}_{1},{x}_{2}\)等参数,接受并输出层o的内部的每个节点计算都类似 \(y={x}_{1}{w}_{1}+{x}_{2}{w}_{2}+b\) ,然后该节点的输出为y。
4.2 矢量计算表达式
举例3个数据,每个数据2个特征,进行如下计算获得3个输出 \[ \hat{y}^{(1)}=x^{(1)}_{1}w_{1}+x^{(1)}_{2}w_{1}+b \\ \hat{y}^{(2)}=x^{(2)}_{1}w_{1}+x^{(2)}_{2}w_{1}+b \\ \hat{y}^{(3)}=x^{(3)}_{1}w_{1}+x^{(3)}_{2}w_{1}+b \] 现在,我们将上面3个等式转化成矢量计算。设 \[ \mathbf{\hat{y}} = \begin{bmatrix} \hat{y}^{(1)} \\ \hat{y}^{(2)} \\ \hat{y}^{(3)} \end{bmatrix} \quad \mathbf{X} = \begin{bmatrix} x^{(1)}_{1}&x^{(1)}_{2} \\ x^{(2)}_{1}&x^{(2)}_{2} \\ x^{(3)}_{1}&x^{(3)}_{2} \end{bmatrix} \quad \mathbf{w} = \begin{bmatrix} w_1 \\ w_2 \end{bmatrix} \]
行列式计算为 \[ \mathbf{\hat{y}}=\mathbf{X}\mathbf{w}+b \] 原本的损失函数变成矢量如下

小批量随机梯度下降的迭代步骤将相应地改写为

