机器学习周报(8.12-8.18)

news2024/11/17 13:28:12

文章目录

  • 摘要
  • Abstract
  • 1.Transformer的结构
    • 1.1 序列到序列(Seq2seq)的模型
    • 1.2 Transformer 结构
      • 1.2.1 Transformer 编码器(Encoder)
      • 1.2.2 Transformer解码器(Decoder)
      • 1.2.3 编码器-解码器注意力(encoder-decoder attention)
    • 1.3 Transformer 的训练过程
    • 1.4 sequence到sequence Model的训练技巧
    • 总结

摘要

本周跟着李宏毅老师学习了Transformer,从序列到序列模型引入学习Transformer,Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算。学习了Transformer的结构:编码器和解码器,和编码器-解码器注意力;学习了Transformer 的训练过程以及序列到序列模型的训练技巧。

Abstract

This week, I followed Mr. Li Hongyi to learn Transformer, and introduced the sequence-to-sequence model to learn Transformer. Transformer is a serial-to-sequence model based on self-attention, which is different from the serial-to-sequence model based on recurrent neural network, and can be calculated in parallel. Learned the structure of Transformer: encoder and decoder, and encoder-decoder attention; I have learned the training process of Transformer and the training skills of sequence-to-sequence model.

1.Transformer的结构

1.1 序列到序列(Seq2seq)的模型

序列到序列模型输入和输出都是一个序列,输入与输出序列长度之间的关系有两种情况。

  • 输入跟输出的长度一样
  • 机器决定输出的长度.

序列到序列的常见应用:
在这里插入图片描述
对于语音翻译为什么不使用语音识别和机器翻译相结合,因为有些语言是没有具体文字的,所以需要对这些语言做语音翻译,直接将其翻译成文字。

  • 多标签分类(multi-label classification)

例如:有些文章属于多个分类,但是每个文章对应的类别的数量根本不一样,因此需要用序列到序列模型来做(让机器来决定输出几个类别)。
在这里插入图片描述

多分类问题(multi-class classification)是指分类的类别数大于 2。是可以给定一个阈值,只输出概率最高的几个类别

1.2 Transformer 结构

Transformer 是一个基于自注意力的序列到序列模型,与基于循环神经网络的序列到序列模型不同,其可以能够并行计算。

一般的序列到序列模型会分成编码器和解码器
编码器负责处理输入的序列,再把处理好的结果“丢”给解码器,由解码器决定要输出的序列。

在这里插入图片描述

1.2.1 Transformer 编码器(Encoder)

Transformer的编码器使用的是自注意力,输入一排向量,输出另外一个同样长度的向量。
在这里插入图片描述

编码器里面会分成很多的块(block),每一个块都是输入一排向量,输出一排向量。输入一排向量到第一个块,第一个块输出另外一排向量,以此类推,最后一个块会输出最终的向量序列

Transformer 的编码器的每个块并不是神经网络的一层,每个块的结构如下图右边所示。(在每个块里面,输入一排向量后做自注意力,考虑整个序列的信息,输出另外一排向量。接下来这排向量会“丢”到全连接网络网络里面,输出另外一排向量,这一排向量就是块的输出)
在这里插入图片描述

Transformer 里面加入了残差连接(residual connection)

例如:输入向量b到自注意力层后得到向量a并输出,输出向量 a 加上其输入向量 b 得到新的输出,得到残差的结果以后,再做层归一化(layer normalization)

层归一化是对同一个特征、同一个样本里面不同的维度去计算均值跟标准差,接着做个归一化
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于Transformer的编码器,首先,在输入的地方需要加上位置编码。如果只用自注意力,没有未知的信息,所以需要加上位置信息。多头自注意力就是自注意力的块。经过自注意力后,还要加上残差连接和层归一化。接下来还要经过全连接的前馈神经网络,接着再做一次残差连接和层归一化,这才是一个块的输出,这个块会重复 N 次。
在这里插入图片描述

1.2.2 Transformer解码器(Decoder)

  • 自回归(autoregressive)解码器

以语音识别为例:

输入语音“机器学习”通过Encoder输出一排向量,接下来解码器产生语音识别的结果,解码器把编码器的输出先“读”进去。要让解码器产生输出,首先给定一个特殊的标识符表示开始。

解码器会输出一个向量(该长度跟词表vocabulary的大小一样),在产生这个向量之前,跟做分类一样,通常会先进行一个 softmax 操作。这个向量里面的分数是一个分布,该向量里面的值全部加起来总和是 1。这个向量会给每一个中文字一个分,分数最高的中文字就是最终的输出。

如:解码器第一个输出的向量中,“机”的分数最高,所以“机”作为第一个输出

在这里插入图片描述

把“机”和标识符BEGIN继续作为输入,解码器继续输出下一个向量,“器”的分数最高,解码器拿“器”作为输出。
在这里插入图片描述

self-attention

原来的自注意力输入一排向量,输出另外一排向量,这一排中每个向量
都要看过完整的输入以后才做决定。
在这里插入图片描述

在这里插入图片描述

Masked Self-attention

Decoder使用掩蔽自注意力(masked self-attention),其通过一个掩码(mask)来阻止每个位置选择其后面的输入信息。

对于Decoder而言,先有 a 1 a^1 a1才有 a 2 a^2 a2,才有 a 3 a^3 a3才有 a 4 a^4 a4;而原来的自注意力机制中 a 1 到 a 4 a^1到a^4 a1a4是一次整个输入到模型中。
在这里插入图片描述

在这里插入图片描述

同时,实际应用中输入跟输出长度的关系是非常复杂的,无法从输入序列的长度知道输出序列的长度,因此解码器必须决定输出的序列的长度。给定一个输入序列,机器可以自己学到输出序列的长度

解码器就要加上输出特殊标识符END。产生“习”之后,再把“习”作为解码器的输入,解码器就要输出END,整个解码器产生序列的过程就结束。

在这里插入图片描述

  • 非自回归(non-autoregressive)解码器

非自回归不是一次产生一个字,它是一次把整个句子都产生出来。。非自回归的解码器可以输入一整排的特殊标识符BEGIN,一次产生产生一排词元(个数等于输入的标识符BEGIN的个数)。因为输出的长度是未知的,所以当做非自回归解码器输入的 BEGIN 的数量也是未知的,因此有如下两个做法。

  • 用分类器来解决这个问题。用分类器“吃”编码器的输入,输出是一个数字,该数字代表解码器应该要输出的长度。
  • 给编码器一堆输入BEGIN,假设输出有上限,但当输出标识符END时,后面再有输出就当他没输出。

在这里插入图片描述

1.2.3 编码器-解码器注意力(encoder-decoder attention)

编码器和解码器通过编码器-解码器注意力(encoder-decoder attention)传递信息,编码器-解码器注意力是连接编码器跟解码器之间的桥梁。

如图:解码器中编码器-解码器注意力的键和值来自编码器的输出,查询来自解码器中前一个层的输出。

在这里插入图片描述

编码器输入一排向量,输出一排向量 a 1 , a 2 , a 3 a^1,a^2,a^3 a1,a2,a3,首先解码器输入标识符BEGIN,经过掩蔽自注意力得到一个向量,把这个向量乘上一个矩阵,做一个变换(transform),得到一个查询 q, a 1 , a 2 , a 3 a^1,a^2,a^3 a1,a2,a3也都产生键: k 1 , k 2 , k 3 k^1,k^2,k^3 k1,k2,k3,把q跟 k 1 , k 2 , k 3 k^1,k^2,k^3 k1,k2,k3计算注意力分数得到 α 1 , α 2 , α 3 \alpha_1,\alpha_2,\alpha_3 α1,α2,α3,接下来做 softmax,得到 α 1 ′ , α 2 ′ , α 3 ′ \alpha_1',\alpha_2',\alpha_3' α1,α2,α3,通过
v = α 1 ′ × v 1 + α 2 ′ × v 2 + α 3 ′ × v 3 v=\alpha_1'×v^1+\alpha_2'×v^2+\alpha_3'×v^3 v=α1×v1+α2×v2+α3×v3得加权和 v v v,再作为输入到全连接网络。这个步骤 q 来自于解码器,k 跟 v 来自于编码器

在这里插入图片描述

在这里插入图片描述

1.3 Transformer 的训练过程

  • Teacher Forcing:把标准答案(Ground Truth)作为输入。

计算标准答案(Ground Truth)跟分布之间的交叉熵(cross entropy),希望该交叉熵的值越小越好。每一次解码器在产生一个中文字的时候做了一次类似分类的问题。
在这里插入图片描述

1.4 sequence到sequence Model的训练技巧

  • 复制机制(copy mechanism)

对很多任务而言,解码器没有必要自己创造输出,其可以从输入的东西里面复制一些东西。

在这里插入图片描述

  • 引导注意力(Guided Attention)

引导注意力会强迫注意力有一个固定的样貌,注意力的位置都应该由左向右,不如就直接把这个限制放进训练里面,要求机器学到注意力就应该要由左向右。

在这里插入图片描述

  • 束搜索(Beam Search)

这种每次找分数最高的词元来当做输出的方法称为贪心搜索(greedy
search),其也被称为贪心解码(greedy decoding)。红色路径就是通过贪心解码得到的路径。
但贪心搜索不一定是最好的方法,第一步可以先稍微舍弃一点东西,比较下红色路径与绿色路径,红色路径第一步好,但全部乘起来是比较差的,绿色路径一开始比较差,但最终结果其实是比较好的。

在这里插入图片描述

  • 加入噪声

在训练的时候会加噪声,让机器看过更多不同的可能性,这会让模型比较棒,比较能够对抗它在测试的时候没有看过的状况

  • 使用强化学习训练

训练的时候看cross entropy最低,再实际评估的时候看BLEU score

在这里插入图片描述

  • 计划采样(scheduled sampling)

给解码器的输入加一些错误的东西,不要给解码器都是正确的答案,偶尔给它一些错的东西,它反而会学得更好

总结

学习了Transformer的相关结构以及理论,但是只是进行了简单的学习,后面我会继续深入学习。

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

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

相关文章

Java语言程序设计——篇十四(2)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

c++11(二)

一、右值引用 1、区分左值和右值 语法定义,左值可以取地址,右值无法取地址(右值肯定有地址,但是为了和左值区分,语法上不让取地址) 左值:一个表示数据的表达式(变量名或解引用指针…

如何配置ESXI主机的IP地址管理

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

通过python脚本查询自己阿里云账号里的某个域名的A记录解析情况,以及测拨,用于排查未使用的解析

安装sdk pip install aliyun-python-sdk-alidns代码全文 import json import requests from aliyunsdkcore.client import AcsClient from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest# 替换为你的阿里云 AccessKey ID 和 AccessKey Secret acce…

栈与队列 - 逆波兰表达式求值

150. 逆波兰表达式求值 方法一:栈 /*** param {string[]} tokens* return {number}*/ var evalRPN function(tokens) {const stack [];for (const token of tokens) {if (isNaN(Number(token))) { // 非数字const n2 stack.pop(); // 出栈两个数字const n1 s…

假期作业--数据结构

1、顺序表实现学生管理系统(参照顺序表技能)写出菜单界面switch选择,功能1创建顺序表(堆区),2录入学生信息,3插入一个学生信息,4删除一个学生信息,5按照位置修改一个学生…

javaEE中自定义注解以及注解的解析

注解: 就是java代码里的特殊标记,比如Override、Test,作用是:让其它程序根据注解信息来决定怎么执行程序。 自定义注解:自己定义注解 Public interface 注解名称{ Public 属性类型 属性名() default 默认…

写字楼/办公室为什么要建设智慧公厕?有哪些价值?@卓振思众

智慧公厕是指利用先进技术和设备对公共厕所进行智能化管理的系统。这些技术包括物联网(IoT)、传感器技术、大数据分析和自动化系统等。【卓振思众】智慧公厕不仅提升了公厕的使用体验,还实现了更高效的管理和维护。 写字楼/办公室智慧公厕的定…

揭秘RAG与大模型对接:深入探讨9大隐藏挑战

前一段时间,各个大模型在争斗:谁能携带更长、更大的上下文 Prompt,比如 Kimi 说 200 万字,阿里通义千问又说自己能达 1000 万字;大家都知道 Prompt 很重要,但是 RAG 和 长的上下文文本携带 是两个不同的技术…

mac查看jdk安装目录

打开终端,直接输入命令: /usr/libexec/java_home终端即会输出jdk的安装目录:

8.17日学习打卡---Spring Cloud Alibaba(四)

8.17日学习打卡 目录: 8.17日学习打卡分布式流量防护什么是服务雪崩解决方案内部异常治理外部流量控制 SentinelSentinel 基本概念Sentinel 的主要特性Sentinel 是如何工作的Sentinel 与 Hystrix、resilience4j 的对比安装Sentinel控制台将应用接入Sentinel流量控制…

python使用flask实现自动根据url寻找对应目录/文件/方法,实现动态路由

例如访问:/user/index/index_config 则自动访问/user 目录里 index.py文件里的 index_config 方法 实现代码 from flask import Flask,jsonifyapp Flask(__name__)def reg_func(code, data, msg, debugNone, showFalse):return jsonify({code: code,data: data,msg: msg,time…

iPhone照片怎么导入电脑?一键导入毫不费力

随着智能手机的普及,我们越来越依赖手机来记录生活的点点滴滴。iPhone作为其中的佼佼者,其高质量的摄像头为用户捕捉了无数珍贵瞬间。然而,随着照片数量的增多,手机存储空间可能会变得捉襟见肘,此时将照片导入电脑既能…

UniAD_面向规划的自动驾驶

Planning-oriented Autonomous Driving 面向规划的自动驾驶 https://github.com/OpenDriveLab/UniAD Abstract Modern autonomous driving system is characterized as modular tasks in sequential order, i.e., perception, prediction, and planning. In order to perfor…

Python 如何创建和管理虚拟环境?

Python虚拟环境是一个独立的运行环境,能够与系统的全局Python环境相隔离。它允许你在不影响系统其他项目的前提下,为每个项目创建独立的Python环境,并在该环境中安装特定版本的包和依赖项。这在开发多个项目时非常有用,尤其是当这…

EmguCV学习笔记 VB.Net 4.1 颜色变换

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问:EmguCV学习笔记 C# 目录-CSD…

使用Python实现B站自动答题机器人

文章目录 1. 写在前面2. 接口分析3. 点选验证分析4. Python程序实现 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

解密Linux中的通用块层:加速存储系统,提升系统性能

通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响。它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提供固定接口即可。…

【13】即时编译(JIT)

概念 即时编译是用来提升应用运行效率的技术。代码会先在JVM上解释执行,之后反复执行的热点代码会被即时翻译成为机器码,直接运行在底层硬件上。 分层编译模式 HotSpot包含多个即时编译器:C1、C2和Graal(Java 10,实验…

Native开发与逆向第一篇-字符串

开发 Android studio新建项目 Android studio新建一个Native C项目。 默认代码就是调用Native 方法stringFromJNI 返回一个字符串。 public native String stringFromJNI();C 代码 stringFromJNI 函数的代码,默认使用的是静态注册的方式,静态注册是函…