属性 = 特征,特征越多所需要的数据就越多
维度越高(特征越多)对数据的需求就越大,
比如一维特征 只需要10个数据,那么二维特征想要达到相同的数据密度就需要 102 个数据,N维特征就需要10N 个数据。
由于数据集需要人工标注,所以我们需要降低维数,将高维数据映射成低维数据
可以通过线性代数的方式
比如有一个 N 维特征的数据,需要降低为 3 维特征的数据,那么我们找到一个 3 * N 的矩阵即可。
这一过程为降维,也是表示学习
反向传播一般使用链式法则来求导,如果有不同路径则需要求导相加
在训练集上表现很好,但是在测试集上表现很差,原因是把训练集的噪声也给学进去
即预测值和真实值的差的平方和,也称为loss
平均平方误差 MSE
左走为负,右走为正,那么参数应该往偏导数的负方向走,α是学习率,这是一种贪心算法
非凸函数
在一个平面上看是最大值,在另一个平面上看是最小值
一般来说在机器学习中,梯度下降用得还是比较少的,用得最多的是随机梯度下降
梯度下降是用N个loss的偏导数求平均来计算梯度值方向,而随机梯度下降则是任挑一个loss的偏导数而不是全部求平均
梯度下降是把所有样本的偏导均值求出来后再更新参数,而随机梯度下降则是一个训练样本计算完后更新参数,下一个训练样本的参数依赖上一个训练样本,故时间复杂度高;
梯度下降速度快,但不能决绝鞍点问题,随机梯度下降依赖随机噪声可以解决鞍点问题
由于全部一起训练,性能低,而分开一个一个训练时间开销会多,故折中引入batch的概念!
如果没有对输出结果进行非线性变化,则最终结果都可以简化为一层,增加层数就显得没有必要。
故我们需要对每一层的结果进行非线性转化,sigmoid函数,然后该表达式就不能被化简
反向传播过程:
走完前馈过程,再返回走反向传播的过程,以此来更新梯度,
先算损失(loss)再更新梯度
在pytorch中,基本单位是tensor,里面保存权重本身的值和loss对该权重的偏导数,
tensor包含 data 和 grad
import torch
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = torch.tensor([1.0])
w.requires_grad = True
def forward(x):
return x*w
def loss(x,y):
y_head=forward(x)
return (y_head-y)**2
print("predict befor training",4,forward(4).item())
for epoch in range(100):
for x,y in zip(x_data,y_data):
l = loss(x,y) #此时执行了前馈运算,保存进变量l
l.backward() #l已完成前馈运算,此时调用方法执行反向传播,同时释放计算图,只要做完反向传播就释放计算图
#输出时用.item() , 加减乘除时用 .data
#w.grad.item() 的item() 是取w的标量,防止产生计算图,tensor在做+-时会产生计算图
print('\tgrad:',x,y,w.grad.item())
#此处要写 w.data 只对w做纯数值的修改,否则会重新建立计算图,就乱套了
w.data = w.data - 0.01*w.grad.data
#对当前输入数据的梯度值清零,再计算下一个数据的梯度,注意数值还在
w.grad.data.zero_()
print("progress:",epoch,l.item())
print("predict after training",4,forward(4).item())
作业