第十周机器学习周报
- 摘要
- Abstract
- 机器学习——self-attention(注意力机制)
- 1. 为什么要用self-attention
- 2. self-attention 工作原理
- 2.1 求α的两种方式
- 2.2 attention-score(关联程度)
- Pytorch学习
- 1. 损失函数代码实战
- 1.1 L1loss(绝对值平均差)
- 1.2 MSELoss(均方误差)
- 1.3 CrossEntropyLoss(交叉熵损失)
- 2. 反向传播算法代码实战
- 总结
摘要
这一周作者主要对注意力机制进行了学习,其中了解了引入注意力机制的原因、注意力机制的使用场景以及注意力机制的原理,此外在pytorch的学习中,作者对三种计算损失函数的方式,比如,绝对平均值误差、均方误差、交叉熵损失进行了代码实战学习。
Abstract
During this week, attention mechanisms were studied. The reasons for introducing attention mechanisms, the scenarios in which they are utilized, and the principles of attention mechanisms were understood. Additionally, in the study of PyTorch, practical coding exercises were conducted on three approaches to calculating loss functions, namely, absolute mean error, mean squared error, and cross-entropy loss.
机器学习——self-attention(注意力机制)
1. 为什么要用self-attention
我们之前学习的案例的输入都是只有1个vector
但是世界那么复杂
总会有多个很长的vector或者每次input的vector的个数不是固定的时候
2. self-attention 工作原理
2.1 求α的两种方式
2.2 attention-score(关联程度)
Pytorch学习
1. 损失函数代码实战
前面的学习周报我们学习了损失函数,所以这周我们需要在Pytorch中学习它,顺便做一个复习。
损失函数就是用来衡量误差的,因为我们在训练的时候,有实际值和训练出来的值。我们要知道模型训练出来的结果的好坏,就需要用损失函数来进行衡量,从而不断优化我们的模型参数,使其效果更好。
例如,拿我们平时的做试卷的答题来说,output就是答题结果;而target为卷面分数。
因此LOSS告诉我们离满分还有70分的差距。
其功能一就是:告知我们输出结果与目标之间差距
经过损失函数我们知道了我们需要提升的地方(例如:加强解答题的训练),于是我们下一次解答题提高了10分。
其功能二就是:为模型的改进提供依据,其是通过反向传播完成的
常见的损失函数如下
其中大多数都在我们之前的周报内容中学习过,如下图所示:
1.1 L1loss(绝对值平均差)
MAE,之前的周报有说过,就不详细说了
详情如下:
其中要注意reduction
为mean就是求所有的L(误差)平均值,为sum就所有的L(误差)求和
默认为mean
其中特别要注意这里的shape,target要与input一致
import torchfrom torch import nninputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))loss = nn.L1Loss()
result = loss(inputs, targets)print(result)
1.2 MSELoss(均方误差)
就是求差再平方
reduction意义同上
代码如下:
import torchfrom torch import nninputs = torch.tensor([1, 2, 3], dtype=torch.float32)
targets = torch.tensor([1, 2, 5], dtype=torch.float32)inputs = torch.reshape(inputs, (1, 1, 1, 3))
targets = torch.reshape(targets, (1, 1, 1, 3))# 均方误差
loss2 = nn.MSELoss()
result2 = loss2(inputs, targets)print(result2)
1.3 CrossEntropyLoss(交叉熵损失)
这个比较复杂,但是之前的周报中也有讲过
常用于分类问题中,分类问题有C个类(如CIFAR-10有10个类别)
计算公式如下:
公式解释如下:
比如有3分类问题,dog、person、cat
log主要是为了增强分类效果
因为当为[0.8,0.9,0.7]的时候,不加入log就差距不大,分类效果就差
代码如下:
import torch
from torch import nn
# 交叉熵损失
x = torch.tensor([0.1, 0.2, 0.3])
y = torch.tensor([1])
x = torch.reshape(x, (1, 3))
loss_cross = nn.CrossEntropyLoss()result_cross = loss_cross(x, y)
print(result_cross)
在计算器中的结果一致,证明我们的理解没有偏差
log函数默认以自然对数10为底,而在matlab中log函数默认以自然对数e为底
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdatasets = torchvision.datasets.CIFAR10(root='./datasets', train=False, transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(datasets, batch_size=1)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.model1 = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model1(x)return xnet = Net()
for data in dataloader:images, labels = dataoutputs = net(images)print(outputs)print(labels)
回顾一下CIFAR-10数据集:
FAR-10是一个更接近普适物体的彩色图像数据集。
CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever整理的一个用于识别普适物体的小型数据集。
一共包含10 个类别的RGB 彩色图片:
飞机( airplane )
汽车( automobile )
鸟类( bird )
猫( cat )
鹿( deer )
狗( dog )
蛙类( frog )
马( horse )
船( ship )
卡车( truck )。CIFAR-10数据集中每个图片的尺寸为32 × 32 ,每个类别有6000个图像,数据集中一共有50000 张训练图片和10000 张测试图片。
其索引以及其种类对应关系如下:
上代码输出结果:
可以发现这种形式的输出十分符合我们CrossEntropy的形式
输入如下代码:
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdatasets = torchvision.datasets.CIFAR10(root='./datasets', train=False, transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(datasets, batch_size=1)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.model1 = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model1(x)return x# 引入交叉熵损失函数
loss_cross = nn.CrossEntropyLoss()net = Net()
for data in dataloader:images, labels = dataoutputs = net(images)print(outputs)print(labels)# 让结果经过一次损失函数result_loss = loss_cross(outputs, labels)print(result_loss)
其中某一张图片的结果如下:
经过交叉熵损失后,其结果为2.3372
2. 反向传播算法代码实战
反向传播复习:
原理:基于链式求导法则
所谓反向传播,就如下图所示:
因为我们计算L对y的偏导很难计算,所以我们要从结果往前推导
import torch
import torchvision
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdatasets = torchvision.datasets.CIFAR10(root='./datasets', train=False, transform=torchvision.transforms.ToTensor(),download=True)dataloader = DataLoader(datasets, batch_size=1)class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.model1 = nn.Sequential(nn.Conv2d(3, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 32, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Conv2d(32, 64, 5, 1, 2),nn.MaxPool2d(2, 2),nn.Flatten(),nn.Linear(1024, 64),nn.Linear(64, 10),)def forward(self, x):x = self.model1(x)return x# 引入交叉熵损失函数
loss_cross = nn.CrossEntropyLoss()net = Net()
for data in dataloader:images, labels = dataoutputs = net(images)print(outputs)print(labels)# 让结果经过一次损失函数result_loss = loss_cross(outputs, labels)# 反向传播result_loss.backward()print(result_loss)
可以看到,这里的grad(梯度)属性是有数值的。
总结
这一周因为开学,人在学校途中的原因,所以学习的内容相比之下少了很多。
作者主要对注意力机制进行了学习,其中了解了引入注意力机制的原因、注意力机制的使用场景以及注意力机制的原理,还学会了计算关联系数α的两种方法,分别是点积和additive,并学会了求attention-score(关联程度)与soft-max求出α‘,结合参数v,最后求和得到b
此外在pytorch的学习中,作者对三种计算损失函数的方式,比如,绝对平均值误差、均方误差、交叉熵损失进行了代码实战学习,对三种常用的loss function进行回顾,并代码实战。
希望开学后要加快学习的进度,继续学习注意力机制和李宏毅机器学习后面的视频以及pytorch中的反向传播的代码学习、以及优化器的代码实战。