欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 第十周:机器学习笔记

第十周:机器学习笔记

2024/10/24 18:19:52 来源:https://blog.csdn.net/Zcymatics/article/details/141305184  浏览:    关键词:第十周:机器学习笔记

第十周机器学习周报

  • 摘要
  • 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中的反向传播的代码学习、以及优化器的代码实战。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com