第十二周:机器学习

目录

摘要

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=0for 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.rhkb.cn/news/429752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink Task 日志文件隔离

Flink Task 日志文件隔离 任务在启动时会先通过 MdcUtils 启动一个 slf4j 的 MDC 环境,然后将 jobId 添加到 slf4j 的 MDC 容器中,随后任务输出的日志都将附带 joid。 MDC 介绍如下: MDC ( Mapped Diagnostic Contexts ),它是一个…

文件操作和InputStream,OutputStream的用法

“他越拧巴,我越喜欢!” 文件: 此处谈到的文件,本身有很多的含义。 狭义上的文件,特指 硬盘上的文件(以及保存文件的目录)。 广义上的文件,计算机上的很多硬件设备,软…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支,切换到该分支下面,输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支,因为刚刚提交的分支在dev环境,所以master是没有 3、合并分支 点击push,将dev里面的代码合并到…

【Web】御网杯信息安全大赛2024 wp(全)

目录 input_data admin flask 如此多的FLAG 一夜醒来之全国CTF水平提升1000倍😋 input_data 访问./.svn后随便翻一翻拿到flag admin dirsearch扫出来 访问./error看出来是java框架 测出来是/admin;/路由打Spring View Manipulation(Java)的SSTI https:/…

C++容器list底层迭代器的实现逻辑~list相关函数模拟实现

目录 1.两个基本的结构体搭建 2.实现push_back函数 3.关于list现状的分析(对于我们如何实现这个迭代器很重要) 3.1和string,vector的比较 3.2对于list的分析 3.3总结 4.迭代器类的封装 5.list容器里面其他函数的实现 6.个人总结 7.代码附录 1.两…

Selenium with Python学习笔记整理(网课+网站持续更新)

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记 官方学习网站在这获取: https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

Fyne ( go跨平台GUI )中文文档- 架构 (八)完结

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

《深度学习》PyTorch 手写数字识别 案例解析及实现 <下>

目录 一、回顾神经网络框架 1、单层神经网络 2、多层神经网络 二、手写数字识别 1、续接上节课代码,如下所示 2、建立神经网络模型 输出结果: 3、设置训练集 4、设置测试集 5、创建损失函数、优化器 参数解析: 1)para…

ArcGIS10.2/10.6安装包下载与安装(附详细安装步骤)

相信从事地理专业的小伙伴来说,应该对今天的标题不会陌生。Arcgis是一款很常用的地理信息系统软件,主要用于地理数据的采集、管理、分析和展示。目前比较常见的版本有ArcGIS 10.2和ArcGIS 10.6。 不可否认,Arcgis具有强大的地图制作、空间分…

DataGrip在Windows和MacOS平台上的快捷键

0. 背景信息 No.说明1测试DataGrip版本号 : 2024.2.2 1. Windows下快捷键 2. MacOS下快捷键

CentOS Stream 9部署Redis

1、安装Redis sudo dnf install redis 2、启动Redis服务 sudo systemctl start redis 3、设置Redis开机自启 sudo systemctl enable redis 4、打开Redis配置文件: sudo vi /etc/redis/redis.conf 在配置文件中找到并修改以下两行,确保密码验证功能已启…

Docker 容器技术:颠覆传统,重塑软件世界的新势力

一、Docker简介 什么是docker Docker 是一种开源的容器化平台,它可以让开发者将应用程序及其所有的依赖项打包成一个标准化的容器,从而实现快速部署、可移植性和一致性。 从功能角度来看,Docker 主要有以下几个重要特点: 轻量…

数据结构——串的模式匹配算法(BF算法和KMP算法)

算法目的: 确定主串中所含子串(模式串)第一次出现的位置(定位) 算法应用: 搜索引擎、拼写检查、语言翻译、数据压缩 算法种类: BF算法(Brute-Force,又称古典的…

web基础—dvwa靶场(七)SQL Injection

SQL Injection(SQL注入) SQL Injection(SQL注入),是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致…

『功能项目』QFrameWorkBug关联Slot(插槽)【67】

我们打开上一篇66QFrameWorkBug拖拽功能的项目, 本章要做的事情是关联插槽Slot 修改脚本:UISlot.cs 修改脚本:UGUICanvas.cs 此时关联Slot已经完成 接下来的文章内容: 1.QFrameWork扔到地上UGUI 2.位置存储功能 3.点击名称寻…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:https://sysin.org/blog/vmware-esxi-8-u3-sysin/,查看最新版…

10.3拉普拉斯金字塔

实验原理 拉普拉斯金字塔(Laplacian Pyramid)是一种图像表示方法,常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式,主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。 高…

【优选算法之二分查找】No.5--- 经典二分查找算法

文章目录 前言一、二分查找模板:1.1 朴素二分查找模板1.2 查找区间左端点模板1.3 查找区间右端点模板 二、二分查找示例:2.1 ⼆分查找2.2 在排序数组中查找元素的第⼀个和最后⼀个位置2.3 搜索插⼊位置2.4 x 的平⽅根2.5 ⼭脉数组的峰顶索引2.6 寻找峰值…

实现人体模型可点击

简化需求:实现项目内嵌人体模型,实现点击不同部位弹出部位名称 一:优先3d, 方案:基于three.js,.gltf格式模型,vue3 缺点:合适且免费的3d模型找不到,因为项目对部位有要…

【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案

人话说在前:这篇的内容是2022年5月写的,当时碰到了要批量处理数据的情况,但是又不知道数据为啥一直报错报错报错,说不允许我操作,最终发现是因为存在隐藏的列或行,于是就很无语地写了博客,但内容…