3.1 线性回归

发布时间 2023-05-26 11:53:23作者: AncilunKiang

3.1.1 线性回归的基本元素

整节理论知识,详见书本。

3.1.2 向量加速化

%matplotlib inline
import math
import time
import numpy as np
import torch
from d2l import torch as d2l
# 以后常用的计时器

class Timer:  #@save
    """记录多次运行时间"""
    def __init__(self):
        self.times = []
        self.start()

    def start(self):
        """启动计时器"""
        self.tik = time.time()

    def stop(self):
        """停止计时器并将时间记录在列表中"""
        self.times.append(time.time() - self.tik)
        return self.times[-1]

    def avg(self):
        """返回平均时间"""
        return sum(self.times) / len(self.times)

    def sum(self):
        """返回时间总和"""
        return sum(self.times)

    def cumsum(self):
        """返回累计时间"""
        return np.array(self.times).cumsum().tolist()

在训练模型时为了实现同时处理整个小批量样本需要对计算进行向量化,从而利用线性代数库,而不是使用开销巨大的 for 循环。

以下比较两种方法的时间开销:第一种方法用 for 循环逐个执行加法,第二种方法使用重载的 + 运算符(向量加法)。

n = 100000
a = torch.ones(n)
b = torch.ones(n)
c = torch.zeros(n)
timer = Timer()
for i in range(n):
    c[i] = a[i] + b[i]
f'{timer.stop():.5f} sec'
'1.73559 sec'
timer.start()
d = a + b
f'{timer.stop():.5f} sec'  # 按书上一万位的话向耗时甚至显示为0,向量化带来数量级级别的明显加速。
'0.00100 sec'

3.1.3 正态分布与平方损失

正态分布(normal distribution)概率密度函数:

\[p(x)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp{\left(-\frac{1}{2\sigma^2}(x-\eta)^2\right)} \]

def normal(X, mu, sigma):  # 计算正态分布
    p = 1 / math.sqrt(2 * math.pi * sigma**2)
    return p * np.exp(-0.5 / sigma**2 * (X - mu)**2)

正态分布改变均值会产生沿 X 轴的偏移,增加方差会分散分布并降低峰值。

x = np.arange(-7, 7, 0.01)

params = [(0, 1), (0, 2), (3, 1)]  # 均值和标准差对
d2l.plot(x, [normal(x, mu, sigma) for mu,sigma in params],
         xlabel='x', ylabel='p(x)', figsize=(4.5, 2.5),
         legend=[f'mean {mu}, std {sigma}' for mu,sigma in params])


image

在高斯噪声(正态分布)的假设下,最小化均方误差等价与对线性模型的极大似然估计。(具体推到详见课本)

3.1.4 从线性回归到深度网络

整节理论知识,详见书本。

练习

(1)假设我们有一些数据 \(\boldsymbol{\boldsymbol{\boldsymbol{x}}}_1,x_2,\dots,x_n\in\mathbb{R}\)。我们的目标是找到一个常数 \(b\),使得最小化 \(\sum_i(x_i-b)^2\)

a. 找到最优值的解析解。

b. 这个问题及其解与正态分布有什么关系?

a. 令 \(l(b)=\sum^n_{i=0}(x_i-b)^2\),对 \(b\) 求导得:

\[\frac{\mathrm{d}l(b)}{\mathrm{d}b}=-2\sum^n_{i=0}(x_i-b)=-2\sum^n_{i=0}x_i+2nb \]

令导数等于 0,则:

\[2nb=2\sum^n_{i=0}x_i \]

\(b\) 的解析解为:

\[b=\frac{1}{n}\sum^n_{i=0}x_i \]

b. 此问题实际为最小化均方误差,在正态分布中其等价于对线性模型的极大似然估计,即若 \(x_1,x_2,\dots,x_n\in N(\mu,\sigma^2)\)\(b=\sigma\)


(2)推导出使用平方误差的线性回归优化问题的解析解。为了简化问题,可以忽略偏置 \(b\)(我们可以通过向 \(\boldsymbol{X}\) 添加所有值为 1 的一列来做到这一点)。

a. 用矩阵和向量表示法写出优化问题(将所有数据视为单个矩阵,将所有目标值视为单个向量)。

b. 计算损失对 \(\boldsymbol{w}\) 的梯度。

c. 通过将梯度设为 0 并求解矩阵方程来找到解析解。

d. 什么时候可能比使用随机梯度下降更好?这种方法何时会失效?

a. 令 \(\hat{\boldsymbol{y}} = \boldsymbol{XW}\),则

\[L(\boldsymbol{X},\boldsymbol{W})=\frac{1}{2}||\boldsymbol{y}-\hat{\boldsymbol{y}}||_2=\frac{1}{2}(\boldsymbol{y}-\boldsymbol{XW})^T(\boldsymbol{y}-\boldsymbol{XW}) \]

b.

\[\begin{align} L(\boldsymbol{X},\boldsymbol{W})&=\frac{1}{2}(\boldsymbol{y}-\boldsymbol{XW})^T(\boldsymbol{y}-\boldsymbol{XW})\\ &=\frac{1}{2}(\boldsymbol{y}^T-\boldsymbol{W}^T\boldsymbol{X}^T)(\boldsymbol{y}-\boldsymbol{XW})\\ &=\frac{1}{2}(\boldsymbol{y}^T\boldsymbol{y}-\boldsymbol{y}^T\boldsymbol{XW}-\boldsymbol{W}^T\boldsymbol{X}^T\boldsymbol{y}+\boldsymbol{W}^T\boldsymbol{X}^T\boldsymbol{XW})\\ &=\frac{1}{2}(\boldsymbol{y}^T\boldsymbol{y}-2Y^T\boldsymbol{XW}+\boldsymbol{W}^T\boldsymbol{X}^T\boldsymbol{XW}) \end{align} \]

则求导得:

\[\frac{\partial L(\boldsymbol{X},\boldsymbol{W})}{\partial \boldsymbol{W}}=-\boldsymbol{X}^T\boldsymbol{y}+\boldsymbol{X}^T\boldsymbol{XW} \]

c. 令梯度等于 0 得:

\[\boldsymbol{X}^T\boldsymbol{X}W=X^T\boldsymbol{y} \]

\(\boldsymbol{X}^T\boldsymbol{X}\) 可逆则:

\[\boldsymbol{W}=(\boldsymbol{X}^T\boldsymbol{X})^{-1}X^T\boldsymbol{y} \]

d. 由上式可知,若 \(\boldsymbol{X}^T\boldsymbol{X}\) 不可逆则解析解方法失效。


(3)假定控制附加噪声 \(\epsilon\) 的噪声模型呈指数分布,也就是 \(p(\epsilon)=\frac{1}{2}\exp{\left(-|\epsilon|\right)}\)

a. 写出模型 \(-\log{P(\boldsymbol{y}|\boldsymbol{X})}\) 下数据的负对数似然。

b. 请试着写出解析解。

c. 提出一种随机梯度下降算法来解决这个问题,哪里可能出错?(提示:当我们不断更新参数时,在驻点附近会发生什么情况)请尝试解决这个问题。

a. 令 \(y=\boldsymbol{w}^T\boldsymbol{x}+b+\epsilon\)

噪声模型呈指数分布则:

\[P(y|\boldsymbol{x})=\frac{1}{2}\exp{\left(-\left|y-\boldsymbol{w}^T\boldsymbol{x}-b\right|\right)} \]

\[\begin{align} P\left(\boldsymbol{y}|\boldsymbol{X}\right)&=\prod^n_{i=1}P\left(y^{(i)}|\boldsymbol{x}^{(i)}\right)\\ &=\prod^n_{i=1}\frac{1}{2}\exp{\left(-\left|y^{(i)}-\boldsymbol{w}^T\boldsymbol{x}^{(i)}-b\right|\right)}\\ &=(\frac{1}{2})^n\exp{\left(-\sum^n_{i=1}\left|y^{(i)}-\boldsymbol{w}^T\boldsymbol{x}^{(i)}-b\right|\right)} \end{align} \]

\[-\log{P\left(\boldsymbol{y}|\boldsymbol{X}\right)}=n\log{2}+\sum^n_{i=1}\left|y^{(i)}-\boldsymbol{w}^T\boldsymbol{x}^{(i)}-b\right| \]

b. 有绝对值,应该是不可导得

c. 取平方就可导了