感谢:
1.Introduction
Regression 回归:输出标量
Classification 分类 :输出类别,如猫狗分类
Structured Learning 结构化学习,结构化输出,如图像、文档等
Youtuber收益分析
1. 使用三部进行数据的训练
-
建立未知参数函数
y = w x + b y = wx + b y=wx+b
先建立模型:y = b + w x 1 y=b+wx_1y=b+wx ,其中x xx是已知的特征feature;w ww是权重weight,b bb是偏置bias,都是未知的参数,需要从数据中学习。 -
通过训练数据定义损失L
对每一个训练样本,计算模型输出值和真实值(label)之间的误差(e),L(b,w),L越小说明参数越好。
不同的误差计算方式:MAE / MSE / Cross-entropy
L = 1 / N ∗ Σ e n L = 1/N* \Sigma e_n L=1/N∗Σen
e = ∣ y − y ^ ∣ e =| y-\hat{y}| e=∣y−y^∣ -
优化Optimization
优化目标是找到使L最小的参数,即求解 w ∗ , b ∗ w^*,b^* w∗,b∗优化方法:梯度下降gradient descend
1. 当只有一个参数w时,随机选取一个初始 w 0 w^0 w0
然后计算他的梯度,移动w位置受学习率learning rate和斜率决定,学习率是提前设定的超参数
计算w对Loss的微分
w 1 = w 0 − η ∗ ∂ L ∂ ω ∣ w w^1 = w^0 - \eta*\frac{\partial L}{\partial \omega}|_w w1=w0−η∗∂ω∂L∣w
反复同样操作进行多次迭代更新w(停止条件:迭代次数达到阈值或微分趋近于0即到达局部最优点- 推广到两个参数时:随机选初始参数,计算其偏微分,利用梯度下降方式同时更新两个参数,多次迭代至停止
经过训练可以得到
w
∗
w^*
w∗=0.97,
b
∗
b^*
b∗=0.1k,即通过2017-2020的数据得到了函数关系
自此,三步训练任务完成
4. 使用得到的函数进行测试2021年的数据情况
- 通过函数对2021年的数据进行隔天测试:得到损失值为0.58k
- 通过数据的比对可以看出数据是每隔7天近似一个循环,因此假设用7天的数据进行预测是否效果会更好
可以看出通过使用前7天,前28天的数据对后一天的数据进行预测可以降低损失值,但是再提高使用的时间对预测值没有有效的提高
以上这样的模型称为线性模型
2. 从线性模型到神经网络
-
线性模型太过简陋,无论如何调参都无法匹配出红色这种折线,因此我们需要使用一个更复杂更有弹性的函数来表示
-
可以看到,通过使用多个piecewise function可以拟合出红色函数
-
任何分段线性函数都可以如此通过一个常值加一堆蓝色的折线拟合,不是分段线性函数也可以近似成这样
-
而这条蓝色的线可以用sigmoid函数来表示
-
通过更改c,b,w的数值,可以拟合出不同形式的图形
-
因此,通过更改w,b,c拟合出不同图形,进而相加得到红色函数
-
模型也因此有了更多的参数
-
用直观的方法解释这个模型
-
同时也可以用矩阵表示
-
整个流程就可以用这个图来表示
-
返回机器学习框架,得到新的函数关系
-
使用新的模型进行后续优化,和原先方式相同,只是参数数量增加
-
在实际运行中不会一次性使用所有数据进行梯度更新,而是将数据分成多个batch,每次拿出一组batch进行更新,将所有数据使用一次称为一个epoch
-
从sigmoid到relu
hard sigmoid可以看成是两个relu加起来
-
因此sigmoid也可以换成relu
相同情况下relu的效果更好! -
深度神经网络:实验证明加层后效果会更好
-
一个激活函数就是一个神经元neuron,很多的neuron就组成了neural network神经网络,neuron层叫layer,除输入输出以外的层叫hidden layer
2. PyTorch Tutorial
2.1 PyTorch Tutorial 1
-
PyTorch是什么
- 开源机器学习框架
- 两大优势:支持GPU加速的张量(Tensor)运算,基于tape-based autograd(就像磁带一样,正向传播时autograd记录操作,反向传播时重现操作,可以高效计算微分)
-
PyTorch深度神经网络训练流程图
-
Tensor:张量,可理解成多维数组
-
Data Type
-
Tensor的形状shape(维度dim)
-
创建Tensor
-
常用操作
squeeze()
去掉长度为1的维度
unsqueeze()
新增长度为1的维度
注意squeeze
和unsqueeze
这两个不是互逆的命令,squeeze
是只有序号是1维时才会删除,而unsqueeze
是在序号维度添加维度transpose()
转置
cat()
串接
- 加减、幂、求和、求均值
- PyTorch v.s. Numpy
- Tensor和Module都默认在CPU上运行
- 为什么要用GPU?
并行运算需要更多的核心进行算术计算,GPU内有很多小核心,每个小核心可以进行小运算,全加到一块可以达到并行处理
-
如何计算梯度?
-
创建数据集,加载数据
训练时shuffle=True,测试时shuffle=False
-