从零预训练一个tiny-llama#Datawhale组队学习Task2

news2024/11/20 14:32:19

完整的教程请参考:datawhalechina/tiny-universe: 《大模型白盒子构建指南》:一个全手搓的Tiny-Universe (github.com)

这是Task2的学习任务

目录

Qwen-blog

Tokenizer(分词器)

Embedding(嵌入)

RMS Norm(RMS Layer Normalization)

enumerate函数

Flash Attention介绍

GQA

RoPE(旋转位置编码嵌入)

Tiny-llama

Qwen-blog

因为llama和Qwen的架构类似,所以这里按照Qwen的架构来学习。

Tokenizer(分词器)

Q:什么是Tokenizer?

A:Tokenizer的主要功能是将一段文本分割成更小的有意义的部分,这些部分被称为“tokens”(标记)。

Embedding(嵌入)

Q:什么是Embedding?

A:Embedding是一种将离散的符号(如单词或标记)映射到连续向量空间的技术。这些向量捕捉了词语之间的语义关系,并且可以用来表示词语在向量空间中的位置。

  • Tokenizer 是用来将原始文本转换成分词后的序列,它是文本预处理的一部分。
  • Embedding 则是将分词后的序列进一步转换为数值化的向量表示,以便于机器学习模型理解和处理。

通常先使用Tokenizer对文本进行分词,然后再将得到的tokens通过Embedding转换成向量,最终用于训练模型。

Q:关于Tokenizer好用的库推荐。

A:1)NLTK (Natural Language Toolkit)。NLTK 是一个强大的自然语言处理库,提供了多种分词器和其他NLP工具。2)Transformers (Hugging Face)。Transformers 库提供了多种预训练的Transformer模型,包括分词器。

RMS Norm(RMS Layer Normalization)

Q:什么是RMSNorm?

A:RMS Layer Normalization是对Batch Normalization(BN)和Layer Normalization(LN)的一种改进。RMSNorm针对每一批次中的每一个样本进行归一化处理,计算特征的均方根值,Layer Normalization计算的是每个特征的均值和方差。

enumerate函数

enumerate() 函数是 Python 中的一个内置函数,用于遍历可迭代对象(如列表、元组、字符串等)时同时获取元素及其对应的索引。这对于需要在循环中同时使用元素及其索引的情况非常有用。enumerate() 函数使得在遍历时获取元素的索引变得非常方便,适用于需要索引信息的各种场景。

Flash Attention介绍

Q:什么是Flash Attention?

A:Flash Attention 是一种用于加速Transformer模型中自注意力(self-attention)机制的优化技术。传统自注意力机制的时间复杂度和内存消耗均为 O(N2),其中 N是序列长度。Flash Attention 通过优化注意力计算的方式,能够在保持计算精度的同时显著降低计算成本,特别是内存消耗。

Q:Flash Attention的机制是什么?如何实现这种优化的?

A:Flash Attention 的核心思想在于利用稀疏矩阵运算和近似计算来减少自注意力机制的计算量。Flash Attention 通过稀疏化注意力矩阵,仅保留最重要的注意力权重,从而减少了计算和内存开销。Flash Attention 在计算注意力权重时采用近似方法,允许在一定程度上牺牲精确度以换取更高的计算效率。

Q:对比传统的自注意力机制,Flash Attention的改进体现在哪里?

A:传统的自注意力机制,包括步骤1)查询、键、值计算;2)注意力得分计算;3)Softmax规范化;4)加权求和。laFlash Attention的改进主要体现在第2步:注意力得分计算:不是直接计算所有查询和键之间的点积,而是通过稀疏化和近似计算来估计注意力得分

GQA

Q:什么是GQA?

A:Grouped-query attention(GQA,分组查询注意力)是一种改进的多头注意力机制,旨在提高Transformer模型的效率和效果。这种方法通过减少键和值向量的数量来降低计算复杂度,同时保持模型性能。

Q:计算过程中,对Q,K,V分别进行了transpose操作,解释一下。

A:这里对Q,K,V进行transpose操作是为了转置操作是为了让数据更适合进行多头注意力计算。将输入的query,key,value形状从(B,L,D)(其中 B是批量大小,L是序列长度,D是向量的维度)转换成 (B,H,L,Dh)的格式,计算注意力得分的时候再对key进行transpose,将 key的形状从 (B,H,L,Dh)转换成 (B,H,Dh,L),计算点积。

缩放点积注意力的计算公式如下:

Q:这段代码中,为什么要用expand之后再reshape而不能直接用tensor自带的repeat?

A:在PyTorch中,expand()repeat() 都可以用来复制张量中的元素以改变其形状。expand() 方法不会复制内存中的数据,而是创建一个视图(view),这个视图指向原始张量的存储空间。使用 expand() 不会增加内存负担;repeat() 方法则会真正地复制数据。使用 repeat() 会导致内存使用增加。

RoPE(旋转位置编码嵌入)

Q:什么是位置编码?

A:在自然语言处理任务中,模型需要理解文本中单词的顺序。位置编码(Positional Encoding, PE)是一种在序列模型(如Transformer)中加入位置信息的方法。

Q:Transformer 中的位置编码设计方式?

A:在Transformer的原始论文中,位置编码是通过一个确定性的函数来计算的,该函数根据位置和维度来生成位置编码向量。具体来说,位置编码向量是通过正弦和余弦函数生成的。

Q:这种编码方式的局限性?

A:Transformer 原始位置编码的局限性主要体现在:

1)固定长度限制最大长度限制:原始的位置编码是基于一个预定义的最大序列长度计算的,这限制了模型处理更长序列的能力。非灵活长度:当处理不同长度的序列时,原始的位置编码需要根据序列的实际长度进行截断或填充;

2)计算复杂度:额外计算:在实际应用中,需要将位置编码向量加到词嵌入上,这增加了额外的计算量。参数开销:它们仍然占据了额外的内存空间,尤其是当序列长度较长时。

3)绝对位置信息

  • 缺乏相对位置信息:原始的位置编码提供了绝对位置信息,但缺乏相对位置信息。相对位置信息对于捕捉序列中的局部模式非常重要,特别是在长距离依赖关系中。
  • 位置信息稀疏:在长序列中,位置编码可能不足以提供足够的位置信息来区分远距离的标记。

Q:旋转位置编码(RoPE)做了哪些改进?

A:旋转位置编码(RoPE)的改进主要体现在:

1)灵活处理任意长度的序列

  • 动态适应:RoPE 可以动态地适应任意长度的序列,不需要预先设定一个最大长度,因此可以更好地处理不同长度的输入序列。
  • 无需重新计算:即使序列长度发生变化,也不需要重新计算位置编码,因为旋转矩阵是根据实际位置动态生成的。

2)减少计算和内存开销

  • 无额外参数:RoPE 不需要额外的位置编码参数,减少了模型的参数量。
  • 高效计算:旋转操作相对简单,计算速度快,不会显著增加模型的计算负担。

3)增强相对位置信息

  • 相对位置编码:RoPE 通过旋转查询和键向量来模拟相对位置信息,这有助于模型更好地捕捉序列中的局部模式。
  • 增强长距离依赖:RoPE 可以更好地保留长序列中的位置信息,从而增强模型处理长距离依赖关系的能力。

Q:旋转位置编码(RoPE)通过旋转操作巧妙地结合了绝对位置信息和相对位置信息。如何理解?

A:绝对位置信息:每个位置 i通过旋转矩阵 Ri 被编码进向量中。这意味着每个位置 i 都有一个唯一的旋转矩阵,从而赋予了每个位置的向量一个独特的表示。

相对位置信息:假设我们有两个位置 i 和 j,对应的旋转矩阵分别为 Ri 和 Rj。当 i≠j 时,Ri 和 Rj 之间的差异反映了位置 i 和位置 j 之间的相对位置关系。

Q:代码是如何实现的?

A:代码定义了一个用于生成旋转位置编码(RoPE)的类。它通过预先计算 cossin 缓存来加速旋转操作,并且能够在需要时动态更新缓存以支持更长的序列长度。具体步骤如下:

  1. 初始化:设置必要的参数,并计算逆频率。
  2. 生成缓存:生成 cos 和 sin 缓存数据。
  3. 前向传播:返回旋转矩阵,并在必要时更新缓存
class Qwen2RotaryEmbedding(nn.Module):
    def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):
        super().__init__()
        # 定义初始值
        self.dim = dim
        self.max_position_embeddings = max_position_embeddings
        self.base = base
        # 定义旋转角
        inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2, dtype=torch.int64).float().to(device) / self.dim))
        self.register_buffer("inv_freq", inv_freq, persistent=False)

        # Build here to make `torch.jit.trace` work.
        self._set_cos_sin_cache(
            seq_len=max_position_embeddings, device=self.inv_freq.device, dtype=torch.get_default_dtype()
        )
    # 为seq里面的每个token形成独一无二的旋转角嵌入(外积)
    def _set_cos_sin_cache(self, seq_len, device, dtype):
        self.max_seq_len_cached = seq_len
        t = torch.arange(self.max_seq_len_cached, device=device, dtype=torch.int64).type_as(self.inv_freq)

        freqs = torch.outer(t, self.inv_freq)
        # 生成角度信息(利用注册机制生成self.cos_cached与sin_cached
        emb = torch.cat((freqs, freqs), dim=-1)
        self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False)
        self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False)

    def forward(self, x, seq_len=None):
        # x: [bs, num_attention_heads, seq_len, head_size]
        if seq_len > self.max_seq_len_cached:
            self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype)

        return (
            self.cos_cached[:seq_len].to(dtype=x.dtype),
            self.sin_cached[:seq_len].to(dtype=x.dtype),
        )

Tiny-llama

这块的详细教程可以参考:KMnO4-zx/tiny-llm (github.com)。

按照以下步骤,开跑:

  1. 训练Tokenizer: python train_vocab.py --download True --vocab_size 4096
  2. 数据预处理:python preprocess.py
  3. 训练模型:python train.py
  4. 使用模型生成文本:python sample.py --prompt "One day, Lily met a Shoggoth"

贴一张运行中的图

开跑,等结果,预计要一天吧。

最终结果,可以看到损失还是比较大的,可能是初始的学习率过高了,导致loss缓慢上升。

我们测试一下效果吧。prompt "One day, Lily met a Shoggoth",然后我们看看模型的输出效果吧:

Sample 1:
One day, Lily met a Shoggoth leaves. She was so a friends with dark and playedro must and as help. She looked, starteded old way food on hungry. 
F brave scared in running together all moral outside outside.
The be yummy people. "Tom, looked soon want to the too. both can f them red tail fell. He took other played. She looked they laughed played.
Tom and if having others again gardenate toys and that hurt what over thatw.
The pond made ask all he it!" M put the sky happily we friend. They. They and scared and put ask off himself. They into a water againat. You the be then anymorear if too. He didn't this. They more people and proudd feelr some feel dog.
A listen him feel park, Max when you the that of the mommying friends not out and they not go to go look now. He lots to real pictures, with the little smile. The friends knows. They not funb on for clean. Theyed outing can doing lost.
P, be are know and you she food smile. They became be st. Once upon a time, there was broken hat is truck. Tim was surprised and became good friends. The small
--------------------

Sample 2:
One day, Lily met a Shoggoth was any strange said, "S bed important overr here looking again and delicious as dad that she only.
The soft bird so two?" Sheers hurt high. "OK, hurt feel scary and what was happy and as know proud that in softar over no. Jack ate know dress your truck after fix and hurt and by for like stay. Once upon a time always at know, them should p because need to play bed and askaes. One day, both nodded and playing upch clean and right.
The big headf got need so then asked others backl they said dog. Tim when my all used his man to explore friends you to it toy, inside. She continued going playing who smiled up hurt from this careful than came yummy.
The tree stopped and flew good. The so and he hard into fun. 
S wanted to think know just open as the dog p car. He found bright if though do out toys or set before.
Tim nodded around or singc we he was go for the happened. She and go to the over run and anything tree work could show room. Do going to understand sound and worry into feel do mom no. The fast magic if its w dog their house?"
A pond grabbed her
--------------------

Sample 3:
One day, Lily met a Shoggoth by being rockhil. The foresters was go. He was tired, warm feel put red away by how home. But one day green yummy warm up always?" this grandma thought look sh for their box where.
When something house, two always isly carefulot. Lily anything into it from a eyes. Her it have. She became they still thely and called the small nice. They if things don't sing again games family in the never.
Wheno, they didn't their cat in pictures. F about all around listen to the things and blue. It if hurt idea happily b unexpected as some yard always find what oring p she still.
S until feeling up. He lost his at the story, even toys when and a hat to set look. He is us around they and dad away. That he became ball." He always will comest something thing. Max with youes of best back. He with the park and and toys near going park?"
"Lilyar, moral. Maybe be by her dress. You more tree backit fell with should his sh. Why unexpected for funny he as making highit playinges. He room made toy. The dog idea on my.
Max here running rock people

那么本次笔记就记到这里了,喜欢的小伙伴收藏点赞关注吧。

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

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

相关文章

Wed前端--HTML基础

目录 一、开发工具 二、HTML文档结构 2.1头部head 2.1.1title标记 2.1.2元信息meta标记 具体实例 ​编辑 一、开发工具 最基础的开发工具是:HBuilder 二、HTML文档结构 HTML文档由头部head和主体body组成 头部head标记中可以定义标题样式,头部信…

VR视频怎样进行加密和一机一码的使用?--加密(一)

在视频加密领域,我们常见接触的就是在普通设备上使用的加密视频,如电脑、手机、平板等。Vr的发展和兴起给人们带来最真实的体验感受,不仅在游戏行业应用较广,在一些影院或者元宇宙文旅、展厅等视频场景也备受青睐。 随着VR视频场景…

django的URL配置

1 django如何处理一个请求 首先Django要使用根URLconf模块,通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式,并在匹配所请求的…

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着电子商务的蓬勃发展,物流行业迎来了前所未有的挑战与机遇。传统物流管理方式在应对海…

Acwing 快速幂

1.快速幂 作用:可以快速求出 a k m o d p a^k mod p akmodp的值,时间复杂度是 O ( l o g k ) . O( log k). O(logk). 核心思路:反复平方法 ①预处理出: a 2 0 m o d p 、 a 2 1 m o d p 、 a 2 2 m o d p 、 … 、 a 2 log ⁡ 2…

IOT-research虚拟机的中文语言设置

首先在setting(设置)中找到Region & Langguage 在Input Source中添加Chinese ubuntu 卡在waiting for unattended-upgr to exit的解决 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend …

数据库管理-第245期 主流国产数据库RAC架构概览(20240929)

数据库管理245期 2024-09-29 数据库管理-第245期 主流国产数据库RAC架构概览(20240929)1 DMDSC2 KingBaseES RAC3 PolarDB4 Cantian5 HaloDB DLB/Data Sharding总结 数据库管理-第245期 主流国产数据库RAC架构概览(20240929) 作者…

HDFS不会自动退出安全模式问题

问题说明 Hadoop集群启动之后,HDFS进入了安全模式,并且不会自动退出,提示信息如下 Safe mode is ON. The reported blocks 1223 needs additional 3 blocks to reach the threshold 0.9990 of total blocks 1228. The minimum number of …

探索基于知识图谱和 ChatGPT 结合制造服务推荐前沿

0.概述 论文地址:https://arxiv.org/abs/2404.06571 本研究探讨了制造系统集成商如何构建知识图谱来识别新的制造合作伙伴,并通过供应链多样化来降低风险。它提出了一种使用制造服务知识图谱(MSKG)提高 ChatGPT 响应准确性和完整…

[Python学习日记-32] Python 中的函数的返回值与作用域

[Python学习日记-32] Python 中的函数的返回值与作用域 简介 返回值 作用域 简介 在函数的介绍中我们提到了函数的返回值,当时只是做了简单的介绍,下面我们将会进行详细的介绍和演示,同时也会讲一下 Python 中的作用域,作用域分…

fmql之Linux中断

中断 下半部机制 软中断 softirq_action tasklet 工作队列 设备树 fmql: 代码 目的 使能key对应GPIO的中断,中断服务函数为使用定时器延时15ms;定时器处理函数为检测key的状态 设备树修改 fmql不用把system.dtb放到SD卡。修改设备树后要在…

【RocketMQ】初识

基础概念 Message(消息):Message 是 RocketMQ 传输的基本单元,包含了具体的业务数据以及一些元数据(如消息 ID、主题、标签、发送时间等)。消息可以是文本、二进制数据或其他任何序列化后的对象形式。Topi…

MDIO Frame介绍

在MII管理界面上传输的框架应具有表22-10所示的框架结构。位传输顺序从左到右。 IDLE (IDLE condition) MDIO上的空闲条件是高阻抗状态。所有三个状态驱动器都应被禁用,而PHY的上拉电阻器将把MDIO线拉到一个逻辑线上。 PRE (preamble) 32位前导码,都是 1 ST (start of frame…

基于Springmvc的网上书城的设计与实现

文未可获取一份本项目的java源码和数据库参考 选题意义: 网上书城是以当前商务的网络化、快速化实际需求为背景,实现图书购买的方便、快捷、送货上门等服务为前提综合信息服务系统的设计;实现通过Internet互联网对图书购买的相关信息进行发…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序对象什么是对象对象的创建一、类加载检查二、对象内存分配三、初始化零值四、设置对象头五、执行初始化方法 对象的访问定位 对象与类的关系由类创建对象的顺序 对象的创建 前言 一个程序需要运行&#xff0…

编程语言图书创作要注意的事情有哪些?

编程语言图书的创作是一项复杂且具有挑战性的任务,需要作者深入理解技术、清晰表达,并考虑读者的学习体验。一本优秀的编程书籍不仅能够教授技术知识,更能引导读者逐步深入,激发他们的思考和实际应用能力。以下将详细探讨编程语言…

Python库matplotlib之三

Python库matplotlib之三 小部件(widget)小部件的基类connect_eventdisconnect_events() Buttondisconnecton_clicked应用实列 CheckButtons构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例,并将…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中,执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中,我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1:创建 EmailMessage 类 首先&#xff0c…

工作繁杂,如何防止工作遗漏遗忘?

不知道大家工作中是否有这样的情况: 1.工作过程中工作任务经常被打断,打乱正常的工作节奏; 2.因为不方便统一记录工作及工作要求,经常忘记给领导反馈工作进展; 3.因为工作繁多,经常会出现工作遗漏遗忘的…

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?视频加字幕超简单!

ass字幕文件怎么导入视频mp4?ass字幕怎么编辑?在视频制作和观看过程中,添加字幕是一项常见的需求,特别是对于外语视频或需要辅助阅读的场景。ASS(Advanced SubStation Alpha)字幕文件是一种常用的字幕格式&…