机器学习方法
预测模型
猜测预测数据与已知数据的关系($y = b + wx$)
定义Loss
传入模型作为参数,平均预算误差的绝对值作为输出(MAE)
或误差平方的平均值(MSE)
找最佳化数值
修改模型(sigmoid)
考虑w
$y = b +\displaystyle\sum_{j}w_jx$
考虑模型
$$
y = b + \displaystyle\sum_i c_i sigmoid(b_i + \sum_jw_{ij}x_j)
$$
$$
y = b+ \boldsymbol c^T\sigma(\boldsymbol b+\boldsymbol w\boldsymbol x)
$$
$\eta$为自己设定的leaning rate
实际操作:B(batch size)为自己决定的参数量,将N个参数分为N/B份,每次拿一个B进行一次数值更新(update),用光所有B为一次epoch
模型修改2(ReLU)
两个ReLU可以替换一个sigmoid,故可将原式改为$y = b+\displaystyle\sum_{2i}c_imax(0, b_i+\sum_jw_{ij}x_j)$
这样的函数称为激活函数
进一步修改(增加层数)
对得到的数据a再进行$\sigma$操作得到$a^,$ 不断重复
问题:过拟合


Pytorch
生成tensor
tensor运算操作
减少长度squeeze
升维
unsqueeze
转置transpose
组合cat
其他

驱动
可用torch.cuda.is_available() 检测是否存在可用gpu
grad


数据读取(data)
shuffle:是否乱序
建立神经网络
- 线性模型
激活函数

Loss Functions
MSE
产生神经网络


sequential中依次放入不同层的函数
更新模型(optimization)
lr为learning rate
训练模型
准备
一个epoch的训练
模型评估
测试组

储存/加载模型
代码优化方法
training loss过大
模型太过简单 重新设计模型
解决方法:
- 加入更多features
- 增加neuro/layer
optimization不够好
判断方法:比较不同模型
testing loss过大
overfitting过拟合
解决方法:
增加训练资料
data augmentation
用自己对资料的理解合理增加训练资料
减小模型弹性
- 减少神经数目、共用参数
- 减少features
- early stopping
- regularization
- dropout
Backpropagation
反推出偏微分
optimization
除了局部最小 gradient 为零(critical point)还可能因为处于鞍点
鉴别处于鞍点还是局部最小点:
处于critical point时g为0,故可以通过红色项判断图像趋势
eigen value:特征值 H为由L的二次微分组成的矩阵
通过H也可求出鞍点时能让Loss变小的方向($\theta^,\rightarrow\theta$)
Batch & Momentum
由于GPU平行计算,大batch效率可能会高于小batch
Momentum


自动调整学习率

大体思想:在较平滑的地方lr应较大 反之则较小
- Adagard
RMSProP

最常用的optimization策略:Adam(RMSProp + Momentum)
Learning Rate Scheduling:
由于$\sigma$随着时间累计,在g变化较小的地方步伐减小,可能出现朝着之前记录的无关方向暴增的现象,故
Learning Rate Decay:
将$\eta$设定为随时间减小的变量
Warm Up:
使$\eta$先变大后变小
分类
输出形式为向量,与标准做Loss前(称为logit)要先用Soft-max函数归一化(同时使大小差距更大
而如果只有两种分类一般直接套用sigmoid(实质等价)(判别与生成)
cross-entropy
可以理解为计算两组概率之间的相似度
** 在pytorch中使用cross-entropy时自动对最后一层调用soft-max
改进:
共用同一个$\sum$参数
分界线变为直线,称这种分类模型为linear model
三步骤总结:
逻辑回归(判别)
在共享$\sum$的前提下 经计算可将$P_{w,b}(C_1|x)$化为$f_{w,b}(x)=\sigma(wx+b)$
step2中不使用square error的原因:
判别模型与生成模型找出的w与b并非同一组
由于生成模型有对模型的先行猜测,一般来说判别模型优于生成模型,在少数据量的环境下生成模型也可能占优势
即判别模型受data影响大,生成模型熟data影响小
为什么需要一个好的Training Data:
($\sigma$为自己设定的理想差值)
故增加N(sample出来的训练资料数)或减小H(取参范围)可以减小训练资料和实际资料的差距
但是H不能太小
CNN
很有趣!
专为影像识别设计的学习算法 特点:1.一个特征只要看很小部分就能知道 2.同一个特征可能出现在不同位置
先将图片缩放为统一大小,再用filter进行卷积操作
- 经典设置
- 共享参数
pooling 在横纵轴拿掉一些像素, 识别出的物体不变 降低计算量,但减少精确度
为什么deep learning能减少参数量与运算速度
也可用于alphago(满足最开始的两个特征 去除pooling提高精确度
问题:无法处理缩放、旋转图片
spatial transformer
对原图片进行平移、旋转、缩放等操作,再投入CNN模型方便识别
自注意力
问题:目前输入只能是一维向量,且长度不能改变
经过self-attention的向量是考虑了所有向量后生成的新向量
如何产生新向量?
- 判断一个向量与其他各向量之间的关联性
dot-product:
常用的关联性计算方式 关联性越大值越大 其中soft-max可改为任意激活方程 常用soft-max
再将结果乘上矩阵得到第一个向量
其中$W^v,W^q,W^q$均靠机器学习得到
写成矩阵形式:
multi head
缺点:feature里完全未包含位置资讯
Positional Encoding
将不同的$e^i$加到$a^i$前面 e可由特定函数求出,也可由学习得出
现有的一些positional encoding方法
truncated self-attention
由于有时输入向量长度过大(如语音识别等 经过self-attention时可以不看所有向量,而只看前后数个
for image
实际上,CNN为self-attention的特例
self-attention的filter范围实际通过学习决定,限制更少,弹性更大,更容易过拟合,需要的资料量更大
CNN的filter范围由人为决定,限制更多,弹性更小,小资料量下表现更好
对比RNN
RNN:
- 只考虑当前向量之前的向量(存在双向RNN 故可忽略
- 新参数依赖之前计算的参数,各个参数不能平行计算。
- 参数关联性更难计算,最后一个参数获得第一个参数的关联需将第一个参数一直存在内存中
- 参数顺序有关
for graph(a kind of GNN)
关联性已知,计算关联性与参数时可以指考虑相连的节点
RNN
无关:将词汇表示为vector的方法
Elman Network
例子:
注:三次为同一个network
Jordan Network
将output存入memory,并在下个向量的hidden layer输入
Bidirectional RNN
同时train一个正向、逆向的network,将两者hidden layer参数结合考虑再投入output layer
Long Short-term Memory(LSTM)
四个input中输入的都是同一参数值乘上不同的weight
故lstm network需要的参数量是普通network的四倍
矩阵形式:
真正的LSTM:
(在Keras中,这个结构叫做LSTM,上面的结构为SimpleRNN, 此外,还有个GRU的简化版,只有两个门,少了1/3的参数,不容易过拟合
