用pytorch 提供的工具构建线性模型
- forward 前馈:求一组样本的损失
- backward 反向:求损失关于各w的梯度
- update 梯度下降更新w
|
|
输入数据的格式
-
用矩阵一次性计算出一个batch的y_pred 或 loss
-
numpy的广播机制:做运算的两个数组维度不同,把小矩阵(重复)扩充到与大矩阵相同的大小
-
运算:
$$ \begin{aligned} \begin{bmatrix} y_{pred}^{(1)} \\ y_{pred}^{(2)} \\ y_{pred}^{(3)} \end{bmatrix}_{3\times 1} = w \cdot \begin{bmatrix} x^{(1)} \\ x^{(2)} \\ x^{(3)} \end{bmatrix}_{3\times 1} + b \end{aligned} $$
其中 w 和 b 会触发广播机制,变成 $[w\ w\ w]^T_{3\times 1},\ [b\ b\ b]^T_{3\times 1}$
计算损失:
$$ \begin{bmatrix} loss_1 \\ loss_2 \\ loss_3 \end{bmatrix} = \begin{pmatrix} \begin{bmatrix} \hat{y_1} \\ \hat{y_2} \\ \hat{y_3} \end{bmatrix} - \begin{bmatrix} y_1 \\ y_2 \\ y_3 \end{bmatrix} \end{pmatrix}^2 $$
loss 需要是一个标量,所以需求和:$loss = (\frac{1}{N}) \sum_{i}^N loss_i$。向量没法backward
nn.Linear类
-
class torch.nn.Linear(in_features, out_features, bias=True)Docs-Linear对数据数据应用一个线性变换:$y_{1\times n} = w^T_{1\times 3} X_{3\times n}+b$,n条样本,x有3个特征,y有一个特征
-
传入参数:
- in_feature: 每个输入样本的维度(列数,特征)
- out_feature: 输出样本的列数
- bias: 是否需要b,默认为true
-
线性单元包括两个成员Tensors(weight, bias)可以完成w*x+b的运算(同样继承自module,可以反向传播)
magic method __call__()
- callable 对象是一个可以被调用执行的对象
- 如果为一个类编写了__call__()方法,那么在该类的对象后面加括号,就会调用执行 __call__() 方法
|
|
*args 代表没有固定数量和变量名的输入参数,是一个元组;**kwargs表示带变量名的输入参数,是一个字典:
|
|
func(1,2,3, x=3, y=5),*args为(1,2,3),**kwargs为{'x':3, 'y':5},就可以遍历各个参数了
nn.MSELoss类
-
class torch.nn.MSELoss(size_average=True, reduce=True)
-
继承自nn.Module
-
$\hat{𝐲} - 𝐲$,减完之后求平方,求和
-
参数:
- size_average=True 是否最后的损失要求均值,$\frac{1}{N}$没什么用,求导与w无关
- reduce=True 是否降维
SGD类
-
class torch.optim.SGD(params.lr=<object, object>, momentum=0, dampening=0, weight_decay=0, nesterov=False)params 是需要优化的参数。使用
model.parameters(),这个成员函数会检查model中的所有成员,有哪些参数需要用梯度下降更新,加入需要训练的参数集合中。搜索model中的linear成员时,会调用linear.params(),linear有2个参数,