线性回归
买房简化模型
假设1:影响关键因素:卧室个数x1、卫生间个数x2、居住面积x3
假设2:成交价是关键因素的加权和y=w1x1+w2x2+w3x3+b
权重和偏差的实际值再后面决定
线性模型
给定n维输入x=[x1,…,xn]T
线性模型有一个n维权重和一个标量偏差
w=[w1,…,wn]T,b
输出是输入的加权和
y=w1x1+w2x2+w3x3+…+.wnxn+b
向量版本:y=< w,x >+b
线性模型可以看作是单层的神经网络,input layer x,output layer维度1
衡量预估质量
比较真实值与预估值,例如房屋售价和估价
假设y是真实值,y^是估计值,我们可以比较
L(y,y)=1/2(y-y)^2(平方损失,1/2是为了求导消去方便)
训练数据
收集一些数据点来决定参数值(权重和偏差),例如过去6个月卖的房子
这被称为训练数据,通常越多越好
假设我们有n个样本,记X=[x1,…,xn]T,Y=[y1,…,yn]T,其中每个xi都是一个列向量
训练损失(损失函数)
ℓ
(
X
,
y
,
w
,
b
)
=
1
2
n
∑
i
=
1
n
(
y
i
−
⟨
x
i
,
w
⟩
−
b
)
2
=
1
2
n
∥
y
−
X
w
−
b
∥
2
\ell(\mathbf{X}, \mathbf{y}, \mathbf{w}, b)=\frac{1}{2 n} \sum_{i=1}^{n}\left(y_{i}-\left\langle\mathbf{x}_{i}, \mathbf{w}\right\rangle-b\right)^{2}=\frac{1}{2 n}\|\mathbf{y}-\mathbf{X} \mathbf{w}-b\|^{2}
ℓ(X,y,w,b)=2n1i=1∑n(yi−⟨xi,w⟩−b)2=2n1∥y−Xw−b∥2
1/n求平均,1/2来自loss,<>内积
最小化损失来学习参数,找到w,b最小loss
w
∗
,
b
∗
=
arg
min
w
,
b
ℓ
(
X
,
y
,
w
,
b
)
\mathbf{w}^{*}, \mathbf{b}^{*}=\underset{\mathbf{w}, b}{\arg \min } \ell(\mathbf{X}, \mathbf{y}, \mathbf{w}, b)
w∗,b∗=w,bargminℓ(X,y,w,b)
将偏差加入权重 (x加入一列全1的特征,b放到w后面)
x
←
[
X
,
1
]
w
←
[
w
b
]
\quad \mathbf{x} \leftarrow[\mathbf{X}, \mathbf{1}] \quad \mathrm{w} \leftarrow\left[\begin{array}{c}\mathbf{w} \\ b\end{array}\right]
x←[X,1]w←[wb]
ℓ ( X , y , w ) = 1 2 n ∥ y − X w ∥ 2 ∂ ∂ w ℓ ( X , y , w ) = 1 n ( y − X w ) T X \ell(\mathbf{X}, \mathbf{y}, \mathbf{w})=\frac{1}{2 n}\|\mathbf{y}-\mathbf{X} \mathbf{w}\|^{2} \frac{\partial} {\partial \mathbf{w}} \ell(\mathbf{X}, \mathbf{y}, \mathbf{w})=\frac{1}{n}(\mathbf{y}-\mathbf{X w})^{T} \mathbf{X} ℓ(X,y,w)=2n1∥y−Xw∥2∂w∂ℓ(X,y,w)=n1(y−Xw)TX
损失是凸函数(最优解在梯度=0), 所以最优解满足
∂
∂
w
ℓ
(
X
,
y
,
w
)
=
0
⇔
1
n
(
y
−
X
w
)
T
X
=
0
⇔
w
∗
=
(
X
T
X
)
−
1
X
T
y
(最优解的形式,推导比较蛋疼)
\begin{aligned} & \frac{\partial}{\partial \mathbf{w}} \ell(\mathbf{X}, \mathbf{y}, \mathbf{w})=0 \\ \Leftrightarrow & \frac{1}{n}(\mathbf{y}-\mathbf{X} \mathbf{w})^{T} \mathbf{X}=0 \\ \Leftrightarrow & \mathbf{w}^{*}=\left(\mathbf{X}^{T} \mathbf{X}\right)^{-1} \mathbf{X}^{T} \mathbf{y}(最优解的形式,推导比较蛋疼) \end{aligned}
⇔⇔∂w∂ℓ(X,y,w)=0n1(y−Xw)TX=0w∗=(XTX)−1XTy(最优解的形式,推导比较蛋疼)
总结
- 线性回归是对n维输入的加权,外加偏差(偏置)
- 使用平方损失来衡量预测值和真实值的差异
- 线性回归有显示解
- 线性回归可以看作是单层神经网络
基础优化方法
梯度下降
什么用:更新w和b
没有显示解的时候
-
挑选一个初始值w0
-
重复迭代参数t=1,2,3
-
w t = w t − 1 (上一个时刻) − η (学习率) ∂ ℓ ∂ w t − 1 (梯度) \mathbf{w}_{t}=\mathbf{w}_{t-1}(上一个时刻)-\eta (学习率)\frac{\partial \ell}{\partial \mathbf{w}_{t-1}}(梯度) wt=wt−1(上一个时刻)−η(学习率)∂wt−1∂ℓ(梯度)
-
沿梯度方向将增加损失函数值
-
学习率:步长的超参数
选择学习率不能太小也不能太大,实际中很少使用随机梯度下降
小批量随机梯度下降
在整个训练集上算梯度太贵(一个深度模型可能要数小时)
我们可以随机采样b个样本i1,i2…ib来近似平均损失,b越大越精确
1
b
∑
i
∈
I
b
ℓ
k
(
x
i
,
y
i
,
w
)
\frac{1}{b} \sum_{i \in I_{b}} \ell_{k}\left(\mathbf{x}_{i}, y_{i}, \mathbf{w}\right)
b1i∈Ib∑ℓk(xi,yi,w)
b是批量大小,另一个重要的超参数
选择批量不能太小也不能太大,太小不适合并行计算最大利用计算资源,太大内存消耗增加浪费计算,例如批量中存在很多差不多的样本
总结
- 梯度下降通过不断沿着梯度反方向更新参数求解,不许要知道显示解长什么样,自动求导就行
- 小批量随机梯度下降是深度学习默认的求解算法
- 两个重要的超参数是批量大小和学习率n
实现:
jupyter SGD文件
#函数有yield就会先得到一个生成器,return返回值保存断点,之后从断点地方开始
#next(function)可以获得生成器的值,function.send(x)函数 会让yeild有值
#旧的python使用range(1000)时会直接生成1000个元素的list,占用内存
with no_grad():
#requires_grad默认为False,如果设置为True,则反向传播时,该tensor就会自动求导
#no_grad所有计算得出的tensor的requires_grad都自动设置为False
#sgd里不写sgd会报错a leaf Variable that requires grad is being used in an in-place operation.
原因是:
sgd里的param-=lr*param.grad/batch_size#只是更新w和b,不回去更新梯度,这么做是 in-place operation,对于叶子节点是不允许的
note:叶子节点不能执行in-place(原地)操作,因为在进行前向传播的时候得到的是叶子结点的地址,再进行反向传播的时候这个地址不变才不会报错,地址改变了就会出错
SGD-PYTORCH文件
思考题:
没做,有空补上