第十二周:机器学习

news2024/11/16 15:34:52

目录

摘要

Abstract

一、非监督学习

二、word embedding

三、transformer 

1、应用

2、encoder

3、decoder 

四、各类attention

1、最常见的类别

2、其余种类 

3、小结

总结 


摘要

本周继续学习机器学习的相关课程,首先了解了监督学习和非监督学习的概念,以前所做的”分类和回归“任务都属于监督学习,本周主要聚焦非监督学习,并且将其应用于实践——word embedding;接着更进一步了解了transformer的构造,学习了encoder和decoder的具体流程,并且举例了几种能够应用于seq2seq模型的机器学习任务;最后,总结了几种基本的的和组合式的attention类型。

Abstract

This week, we continued to learn about machine learning. First, we learned about the concepts of supervised learning and unsupervised learning, and the “classification and regression” tasks we did before were supervised learning, but this week, we focused on unsupervised learning, and put it into practice--word embedding. This week, we focused on unsupervised learning and put it into practice - word embedding; then we learned more about the construction of transformer, the specific process of encoder and decoder, and gave several examples of machine learning tasks that can be applied to the seq2seq model; finally, we summarized the basic and combinatorial types of attention.

一、非监督学习

1、聚类

聚类:按照某种特定标准把一个数据集划分为不同的类别,同一类别中的数据对象具有较大的相似性,而不在同一类别中的数据对象的差异性较大。如何划分类、划分类的标准是什么在训练之前都是未知的,这些都需要机器自主 学习所得。

2、异常检测

3、降维

二、word embedding

词嵌入:是一种由真实数字组成的稠密向量,每个向量都代表了单词表中的一个单词。

问题:占用空间很大,并且单词之间没有相互联系 

解决:分布式假设distribution hypothesis。可以计算相似语义的句子间的相似性

分布式假设:每个单词的含义由它周围的单词形成,依赖于一种基本的语言假设。那些在相似语句中出现的单词,在语义上也是相互关联的。

问题:每个句子的语义属性有很多,并且它们都有可能与相似性有关。但是,应该如何设置不同属性的值呢?

解决:神经网络可以发掘一些潜在的语义属性 

代码实践:

step1 导入相关库

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

 step2 构建embeds的表

embeds=nn.Embedding(2,5)   #将输入的整数序列转化为密集向量来表示,embeds是一张表.第一个参数代表创建的最大词汇量;第二个参数代表一个单词有几个维度
print(embeds)
word_to_ix={'hello':0,'world':1}
lookup_tensor=torch.tensor([[word_to_ix['hello']],[word_to_ix['hello']]],dtype=torch.long)#把word_to_ix中的value转成tensor格式的数据
embeds(lookup_tensor)

step3 语料实例

test_sentence = """When forty winters shall besiege thy brow,
And dig deep trenches in thy beauty's field,
Thy youth's proud livery so gazed on now,
Will be a totter'd weed of small worth held:
Then being asked, where all thy beauty lies,
Where all the treasure of thy lusty days;
To say, within thine own deep sunken eyes,
Were an all-eating shame, and thriftless praise.
How much more praise deserv'd thy beauty's use,
If thou couldst answer 'This fair child of mine
Shall sum my count, and make my old excuse,'
Proving his beauty by succession thine!
This were to be new made when thou art old,
And see thy blood warm when thou feel'st it cold.""".split()
trigrams=[((test_sentence[i],test_sentence[i+1]),test_sentence[i+2])for i in range(len(test_sentence)-2)]

step4 处理输入格式并测试

vocab=set(test_sentence)#所有单词的集合
# print(vocab)
word_to_ix={word:i for i,word in enumerate(vocab)}#把所有单词和索引一一对应,形成字典的键值对的形式
# print(word_to_ix)
word_to_ix['forty']
print(trigrams[:3])

测试结果如下: 

 

 step5 NGram模型的定义

class NGramLanguageModeler(nn.Module):
        def __init__(self, vocab_size, embedding_dim,context_size):
            super(NGramLanguageModeler, self).__init__()
            self.embeddings = nn.Embedding(vocab_size, embedding_dim)#词汇的数量(词汇的最大值)、词嵌入的维度
            self.linear1 = nn.Linear(context_size * embedding_dim, 128)#context_size=2是指预测下面单词的context
            #输入:context_size个单词*embedding_dim个维度;输出:自定义(hidden layer)
            self.linear2 = nn.Linear(128, vocab_size) #最终的输出也是vocab的维度
            #输入:上一层的hidden layer;输出:词汇表的大小vocab_size(函数的传入参数),也就是集合的长度(无重复单词)

        def forward(self, inputs):
            embeds = self.embeddings(inputs).view((1, -1))#view函数是可以将输入的维度进行重构
            out = F.relu(self.linear1(embeds))#增加一层非线性的激活函数
            out = self.linear2(out)
            log_probs = F.log_softmax(out, dim=1)
            return log_probs#最终返回一个目标单词的概率值

step6 定义损失函数及优化器

loss_function = nn.NLLLoss()#定义损失函数
model=NGramLanguageModeler(len(vocab),10,2)#实例化一个模型对象
optimizer=optim.SGD(model.parameters(),lr=0.001)#定义优化器:参数+学习率

 step7 训练并输出loss值

for epoch in range(5):
    epoch_loss=0
    for tri in trigrams:
        
        model.zero_grad()#由于会累乘梯度,所以要归零
        
        context_idxs=torch.tensor([word_to_ix[w] for w in tri[0]],dtype=torch.long)#构建语法糖:将单词转化为tensor格式
        target=torch.tensor([word_to_ix[tri[1]]],dtype=torch.long)  #将预测的目标单词也转化为tensor格式
        log_probs=model(context_idxs)  #得到单词的概率值
        loss=loss_function(log_probs,target)#计算损失函数
        #反向传播更新梯度
        loss.backward()
        optimizer.step()
        
        epoch_loss+=loss.item()#为了观察更好,item函数是把loss转化为数值格式
    print('Epoch:%d loss:%.4f'%(epoch+1,epoch_loss))

结果如下: 

 

分类:

N-Gram

Word2Vec:skip-gram模型和CBOW模型(next week)

参考文章:

1、Word2Vec:Word2Vec ——gensim实战教程 - 简书

2、Word2Vec数学原理的讲解:word2vec 中的数学原理详解(四)基于 Hierarchical Softmax 的模型_多项式哈希-CSDN博客 

3、词嵌入:词嵌入:编码形式的词汇语义 - PyTorch官方教程中文版 

三、transformer 

实际上transformer是一个seq2seq的模型,前面周报(八)CSDN有提到过该模型的3种形式。

seq2seq模型:由encoder和decoder两个部分组成,在该情况下,输出长度与输出长度不等并且机器无法确定其输出长度。它在自然语言处理方面有很广泛的应用。

1、应用

语音合成TTS(text-to-speech):利用transformer模型实现文字转换语音,输入文字、输出语音信号。以闽南语为例,首先将白话文字转化为闽南语语音,再将其转化为声音讯号。

句法分析(syntactic parsing):输入是一段文字,输出是一个句法的分析树。通过句法树能够了解到deep和learning合起来是一个名词短语,very和powerful合起来是一个形容词短语。

聊天机器人(chatbot):是典型的seq2seq的例子,输入是用户的文本消息、输出是机器的回复文本。训练机器学习输入与输出之间的对应关系,使机器能够生成合理的回复。

多分类标签(muti-label classification):输入是一篇文章,输出是类别,机器来决定输出类别的数量。这种“序列到序列无关“的模型也可以应用seq2seq模型。与“多类别”任务有所不同,同一篇文章可能属于多个不同的类。

目标检测(object detection):输入是一张图片,输出是检测到的目标物体。首先需要自定义目标物体,输入的一张图片中含有多个目标物体,经过预测最终将目标物体框起来并计算是该类别的概率。

2、encoder

任务:输入一排向量,输出一排向量

输入的一组向量,需要经过多个block,每个block含有多个layer(block中做的事情包括self-attention和fully connected)

每个block中的流程:

step1 input进入self-attention

step2 self-attention输出后的向量a与self-attention输出前的向量b进行残差连接residual

step3 layer normalization

step4 fully connected

step5 residual+layer normalization=output

残差连接residual Connection:是一种通过引入跨层的直接连接来优化深度神经网络的方法。允许输入信号直接绕过一些层,并与这些层的输出相加。优点是梯度传播更容易、信息流动更快、网络层次很深时不易梯度消失。

层归一化layer normalization: 是一种神经网络中常用的归一化技能,用于在训练过程中加速收敛、稳定训练,并提高模型的泛化能力。

3、decoder 

(1)autoregressive 

输入的单词是一个个进入decoder的,输入“机”预测“器”、输入“器”预测“学”,以此类推...

实际上,decoder的内部构造相较于encoder来说基本差不多,encoder独有masked muti-head attention,并且还多加了一层muti-head attention和layer normalization。

掩码自注意力机制masked self-attention:输入到模型的单词是一个一个生成的,所以考虑每次输入时,只能考虑到前面的输入,不能考虑到后面的输入。

需要设置一个停止信号“END”,这样decoder的学习才会有结束的时候。就像开始信号“BEGIN”一样。

(2)non-autoregressive 

 

所有单词一次性全部输入,可以考虑一整个输入的所有状态。(next lecture) 

 autoregressive V.S. non-autoregressive 

 

AT decoder必须一个个输入,NAT decoder可以并行输入。NAT decoder的优点是,它不仅可以实现同时输入,还能控制输出的长度。但是,NAT的训练效果不如AT(next lecture)。

(3)cross attention

cross attention:是连接encoder和decoder的纽带。 其输入就是由encoder的输出所提供。

 

cross attention的流程图入下:

 

左侧输入的语音在encoder中的self-attention得到向量a^1、 a^2a^3,从而计算出向量k^iv^i;右侧 在经过decoder中的masked self-attention得到向量q。最终两侧的向量相互应用到self-attention中。

copy mechanism:机器在回答对话的过程中,有些专属词汇不必创造出来 ,而是直接复制问题中的词汇得来。

 

可以应用到chatbot、summarization等方面。(next lecture)

beam search束搜索

束搜索beam search:是一种用于寻找最有可能的输出序列的搜索算法,常用于序列生成任务,比如机器翻译和语音识别

红色path:每次都选择最大的权重的那边,是贪婪算法

绿色path:具有一定的未来性规划,这条path才是权重和最大的,最优解

四、各类attention

 

问题:attention matrix的计算量过大

解决:只计算matrix的一部分数据 

1、最常见的类别

local attention

看左右的邻居

比如在做文本翻译的时候,只需要给出当前token的前后的单词,就可以比较精准的翻译出当前单词。只关注局部值,l类似于CNN。

stride attention 

 

跳着看(3个) 

在上述 local attention的基础上,给出当前token附近相隔两三个位置的单词,这样的话就能联系过去与未来的关系,从而缓解局部的缺陷。 

global attention

 

在一个序列中提前选定某些token作为special token,使得当前token产生序列全局关系。

然而,很多的self-attention都融合了以上三种方式的attention 

2、其余种类 

可以从上图看出,longfomer是组合了以上三种常规的attention;big bird则是在longformer上进一步赋值,以提高计算效率(big bird=longformer+random attention)。

问题:上述方法都是人为决定attention的计算,如何比较有依据的选择参与计算的attention

解决: 比如attention比较小的地方直接赋值为0,采用clustering的方法

clustering 

step1 分组:根据query和key的相近程度进行聚类

step2 设置attention:若是query和key不在一个cluster中,直接设为0

step3 计算:只需要计算attention不为0的地方

问题:是否可以让机器自己学习attention的值

解决:sinkhorn sorting network

可自动学习的模式中,输入是input sequence,输出是相同长度的weight sequence。其中输入经过神经网络的训练得到输出,输出可能会有相同的冗余行或列,采用Linformer来除去冗余(上右图所示)。最后attention matrix就可以由N*N变为n*N

Linformer的具体做法:

改进:attention机制可以变得更加快速,Q、K、V三组向量的内积顺序不同,会导致计算量的大大不同。

从上图的推导可以看出,向量v与向量k先做点乘比向量k与向量q先做点乘的计算量小很多,所以为了简化计算,需要采用下面的做法来做self-attention:

 

问题:计算attention是否一定需要q和k

解决:synthesizer

在 Synthesizer 文献里面,对于 attention matrix 不是通过 q 和 k 得到的,而是作为网络参数学习得到。虽然不同的 input sequence 对应的 attention weight 是一样的,但是 performance 不会变差太多。 

3、小结

下图中,纵轴的 LRA score 数值越大,网络表现越好;横轴表示每秒可以处理多少 sequence,越往右速度越快;圈圈越大,代表用到的 memory 越多(计算量越大) 

参考文章:收藏!各种各样神奇的自注意力机制(Self-attention)-腾讯云开发者社区-腾讯云 

总结 

本周的理论学习主要是transformer架构和各类型attention方面,代码实践主要是非监督学习——word  embedding。并且对self-attention的简化做出了数学推导。下周继续学习本周为解决的问题,代码继续学习Word2Vec。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法——Java实现 9.习题——删除链表倒数节点

目录 19. 删除链表的倒数第 N 个结点 方法1 通过链表长度直接删除 方法2 递归加入哨兵节点 ListNode 方法3 快慢指针法 苦难,区区挫折罢了,而我必定站在幸福的塔尖 —— 24.9.22 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第…

【LeetCode】146. LRU缓存

1.题目 2.思想 3.代码 3.1 代码1 下面这是一版错误的代码。错误的原因在于逻辑不正确导致最后的代码也是不正确的。 class LRUCache:def __init__(self, capacity: int):self.time 0 # 用于全局记录访问的时间self.num2time {} # 数字到时间的映射self.key2val {} # 数字…

第十四章:html和css做一个心在跳动,为你而动的表白动画

💖 让心跳加速,传递爱意 💖 在这个特别的时刻,让爱在跳动中绽放!🌟 无论是初次相遇的心动,还是陪伴多年的默契,我们的心总在为彼此跳动。就像这颗炙热的爱心,随着每一次的跳动,传递着满满的温暖与期待。 在这个浪漫的季节,让我们一同感受爱的律动!无论你是在…

Linux文件IO(七)-复制文件描述符

在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限&#…

自学笔记之TVM编译器框架 ,核心特性,模型优化概述,AI应用落地

最近在学习一些和芯片 AI相关的知识,重点了解了一下TVM,我自己认为TVM在AI应用落地类似的项目中,用途还是非常广泛的,现在把一些重要的笔记贴在下面,有两篇原帖链接也附上,感兴趣的同学可以学习一下。 TVM…

宝塔linux 安装code-server指定对应的端口无法访问

这个一般就是nginx搞的鬼,如果服务正常启动,就是访问不了;大概就是宝塔安装的nginx配置没有代理code-server服务对应的端口,一般就是nginx配置文件的问题 安装默认的nginx会有一个配置文件 直接拉到最后会有一行这个&#xff0c…

(三十二)栈(stack)

文章目录 栈(stack)1.1 操作1.2 关于栈的题目1.2.1 出栈顺序1.2.2 入栈顺序1.3.3 括号匹配 这篇文章将会讲两个不同的数据类型,分别是栈与队列(双向队列是两个的拓展) 栈(stack) 栈是一种特殊的…

自闭症孩子送寄宿学校,给他们成长的机会

在自闭症儿童的教育与康复之路上,选择一种合适的寄宿方式对于孩子的成长至关重要。这不仅关乎到孩子能否获得专业的训练与关怀,还直接影响到他们未来的社交能力、独立生活能力以及心理健康。今天,我们将以广州的星贝育园自闭症儿童寄宿制学校…

stm32单片机个人学习笔记6(EXTI外部中断)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

【动态库的加载】【进程地址空间(三)】

目录 1. 宏观看待动态库的加载2. 进程地址空间第二讲2.1 程序没有加载前的地址2.2 程序加载后的地址 3. 动态库的地址 再谈进程地址空间时,【Linux】动静态库 我们先讲一个关于动态库是如何加载的话题,再引入进程地址空间,再次谈论该话题。 …

在ComfyUI中,Cross-Attention优化方案应该选哪个?

🐱‍🐉背景 在comfyui中,如果你使用了秋叶的启动器,会在高级选项中看到这样一行选项:Cross-Attention优化方案,右边有个下拉框,可以选择的选项有4个,如下图: 那么&#…

设计模式之观察者模式例题

答案:D 知识点: 观察者模式意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 状态模式 意图:允许一个对象在其内部状态改变时改变它的行为

【verilog】4. gtkwave的调用

文章目录 前言实验步骤 前言 进行 数电 FPGA 实验 实验步骤 将 GTKwave 的 bin 文件夹路径添加到 “系统环境变量” 的 “Path” 中 启动 debugger wizard, 设置观测信号 编译选择 2进制 文件 点击 start programming connect debugger 选择触发方式 Run 自动打开 gtkwave&a…

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露

信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…

【若依RuoYi-Vue | 项目实战】帝可得后台管理系统(二)

文章目录 一、人员管理1、需求说明2、生成基础代码(1)创建目录菜单(2)添加数据字典(3)配置代码生成信息(4)下载代码并导入项目 3、人员列表改造(1)基础页面&a…

机器学习算法那些事 | TPAMI 2024.9 | FeatAug-DETR:通过特征增强丰富DETRs的一对多匹配

本文来源公众号“机器学习算法那些事”,仅用于学术分享,侵权删,干货满满。 原文链接:TPAMI 2024.9 | FeatAug-DETR:通过特征增强丰富DETRs的一对多匹配 论文标题:FeatAug-DETR: Enriching One-to-Many Mat…

智能指针:作用 | 使用 | 原理 | 内存泄漏

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

golang学习笔记4-基本数据类型

注:本人已有C,C,Python基础,只写本人认为的重点。 go的数据类型如下 由于bool和c类似,和go的区别是,bool的值只能取true和false,不能取整数,而且有默认值false。 一、整数型 整数型存放整数&…

设计模式之策略模式例题

答案:A 知识点: 策略模式又叫模板方法模式 它的意图是定义一个操作中的算法骨架。而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易,需要大家多多鼓励!您的关注、点赞、收藏就是我的创作动力! 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…