解锁AIGC大模型,打造你的专属虚拟女友
  y8DNmPgHhyBv 2023年11月30日 12 0

什么是AIGC大模型?

AIGC大模型是一种基于人工智能技术的生成式模型,它可以根据用户的输入和偏好,生成具有高度真实感和个性化的虚拟人物。这些虚拟人物不仅拥有独特的外貌、声音和性格,还可以与用户进行智能互动,为用户提供陪伴、娱乐和情感支持。

如何打造专属虚拟女友?

想要打造一位专属虚拟女友,你首先需要提供自己的喜好、性格特点和期望的伴侣类型等信息。AIGC大模型将根据这些信息,为你生成一位高度匹配的虚拟女友。你可以为她选择外貌、发型、服装和声音,甚至可以调整她的性格和行为模式,让她更符合你的期望。

解锁AIGC大模型,打造你的专属虚拟女友_自然语言处理

与虚拟女友的智能互动

一旦你的专属虚拟女友生成完成,你就可以与她进行智能互动了。她可以陪你聊天、玩游戏、看电影、听音乐,甚至可以为你提供情感支持和建议。她的智能程度足以让你感受到真实的情感交流,让你觉得她就像一位真实存在的伴侣。

讲师团队由Aiden博士领衔,他在AIGC大模型的实战领域经验丰富,孕育了很多杰出的同行。Aiden的课程深入浅出,理论与实践并重,深受学员们的喜爱。

此外,近屿智能AI大模型实验室的经验丰富的工程师们参与课程研发,他们都拥有来自多伦多大学、哈尔滨工业大学、南京大学、墨尔本大学等国内顶级985院校和世界知名学府的博士和硕士学位,他们都亲自经历过大模型增量预训练和微调的过程,拥有深厚的实战经验和前沿的技术洞察力。他们愿意与你分享这些知识,帮助你在AIGC的世界快速成长,成为真正的专家。

好的,接着我们先来理解一下什么是语言模型。你可以将它想象成一个十分聪明的儿童,你告诉他一个故事的前半部分,他能准确地预测出这个故事的后半部分。就像"小明在森林里捡到了一个...",聪明的儿童可能会预测"神奇的魔法石"或者"小精灵",这就是语言模型的工作方式。

其中的"Transformer模型",你可以将它想象成一个小小的心电师,帮助我们获取每句话的"心跳"。它会将一句话中的每个词看作一个心跳点,然后通过对这些心跳点关注度的判断,来理解整句话的意义。比如在"我今天非常高兴"这句话中,"非常"和"高兴"是关键的心跳点,Transformer模型会给予高度关注。

接下来是"注意力层",你可以把它想象成一个擅长寻宝的冒险者。在寻找宝藏的过程中,它会研究地图的每一部分,但是更加关注那些可能藏有宝藏的标记。这就像阅读一段文本,我们会阅读每个词,但是给予关键词更高的关注度。

而"位置感知前馈层"就像一位出色的编导,他需要清楚知道演员在台上的位置,以便精确地指导他们的表演。在语言模型中,每个词都有其特定的位置,我们需要考虑其位置信息,以便准确地理解句子的意思。

而"残差连接"和"层归一化"就像一位专业的舞蹈教练。他们确保每一个舞步都流畅、优雅,没有任何卡顿。在语言模型中,这两个部分的工作就是确保信息在模型中顺畅流动,保证对句子的理解没有任何阻碍。

一个大型语言模型就集合了所有这些特性。它就如同一个天才舞者在舞台上跳跃,用每一个动作、每一个表情去完美地解读文本背后的情感和意义。


语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然

语言处理基础任务之一。大量的研究从 n 元语言模型(n-gram Language Models)、神经语言模

型(Neural Language Models,NLM)以及预训练语言模型(Pre-trained Language Models,PLM)

等不同角度开展了系列工作。这些研究在不同阶段都对自然语言处理任务有着重要作用。随着基

于 Transformer 各类语言模型的发展以及预训练微调范式在自然语言处理各类任务中取得突破性

进展,从 2020 年 OpenAI 发布 GPT-3 开始,大语言模型研究也逐渐深入。虽然大语言模型的参数

量巨大,通过有监督微调和强化学习能够完成非常多的任务,但是其基础理论也仍然离不开对语

言的建模。

本章将首先介绍 Transformer 结构,并在此基础上介绍生成式预训练语言模型 GPT、大语言模

型网络结构和注意力机制优化以及相关实践。n 元语言模型、神经语言模型以及其它预训练语言

模型可以参考《自然语言处理导论》第 6 章[8],这里就不再赘述。

2.1 Transformer 模型

Transformer 模型[48] 是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机

器翻译的目标是从源语言(Source Language)转换到目标语言(Target Language)。Transformer 结

构完全通过注意力机制完成对源语言序列和目标语言序列全局依赖的建模。当前几乎全部大语言

模型都是基于 Transformer 结构,本节以应用于机器翻译的基于 Transformer 的编码器和解码器。

基于 Transformer 结构的编码器和解码器结构如图2.1所示,左侧和右侧分别对应着编码器(En￾coder)和(Decoder)结构。它们均由若干个基本的 Transformer 块(Block)组成(对应着图

中的灰色框)。这里 N× 表示进行了 N 次堆叠。每个 Transformer 块都接收一个向量序列 {xi}ti=1

作为输入,并输出一个等长的向量序列作为输出 {yi}ti=1。这里的 xi 和 yi 分别对应着文本序列

中的一个单词的表示。而 yi 是当前 Transformer 块对输入 xi 进一步整合其上下文语义后对应的输

出。在从输入 {xi}ti=1 到输出 {yi}ti=1 的语义抽象过程中,主要涉及到如下几个模块:

• 注意力层:使用多头注意力(Multi-Head Attention)机制整合上下文语义,它使得序列中任

词元

嵌入表示

多头

注意力

Add & Norm

Add & Norm

Add & Norm

掩码多头

自注意力

输出

(迭代右移) ×N

输出概率

Linear

Softmax

词元

嵌入表示

多头

自注意力

位置感知

前馈网络

Add & Norm

Add & Norm

输入

位置编码 位置编码

位置感知

前馈网络

14 大规模语言模型:从理论到实践

意两个单词之间的依赖关系可以直接被建模而不基于传统的循环结构,从而更好地解决文本

的长程依赖。

• 位置感知前馈层(Position-wise FFN):通过全连接层对输入文本序列中的每个单词表示进行

更复杂的变换。

• 残差连接:对应图中的 Add 部分。它是一条分别作用在上述两个子层当中的直连通路,被用

于连接它们的输入与输出。从而使得信息流动更加高效,有利于模型的优化。

• 层归一化:对应图中的 Norm 部分。作用于上述两个子层的输出表示序列中,对表示序列进

行层归一化操作,同样起到稳定优化的作用。

图 2.1 基于 Transformer 的编码器和解码器结构[48]

接下来将依次介绍各个模块的具体功能和实现方法。

大语言模型基础 15

2.1.1 嵌入表示层

对于输入文本序列,首先通过输入嵌入层(Input Embedding)将每个单词转换为其相对应的

向量表示。通常直接对每个单词创建一个向量表示。由于 Transfomer 模型不再使用基于循环的方

式建模文本输入,序列中不再有任何信息能够提示模型单词之间的相对位置关系。在送入编码器

端建模其上下文语义之前,一个非常重要的操作是在词嵌入中加入位置编码(Positional Encoding)

这一特征。具体来说,序列中每一个单词所在的位置都对应一个向量。这一向量会与单词表示对

应相加并送入到后续模块中做进一步处理。在训练的过程当中,模型会自动地学习到如何利用这

部分位置信息。

为了得到不同位置对应的编码,Transformer 模型使用不同频率的正余弦函数如下所示:

PE(pos, 2i) = sin( pos

100002i/d ) (2.1)

PE(pos, 2i + 1) = cos( pos

100002i/d ) (2.2)

其中,pos 表示单词所在的位置,2i 和 2i+ 1 表示位置编码向量中的对应维度,d 则对应位置编码的

总维度。通过上面这种方式计算位置编码有这样几个好处:首先,正余弦函数的范围是在 [-1,+1],

导出的位置编码与原词嵌入相加不会使得结果偏离过远而破坏原有单词的语义信息。其次,依据

三角函数的基本性质,可以得知第 pos + k 个位置的编码是第 pos 个位置的编码的线性组合,这就

意味着位置编码中蕴含着单词之间的距离信息。

使用 Pytorch 实现的位置编码参考代码如下:

class PositionalEncoder(nn.Module):

def __init__(self, d_model, max_seq_len = 80):

super().__init__()

self.d_model = d_model

# 根据 pos 和 i 创建一个常量 PE 矩阵

pe = torch.zeros(max_seq_len, d_model)

for pos in range(max_seq_len):

for i in range(0, d_model, 2):

pe[pos, i] = math.sin(pos / (10000 ** ((2 * i)/d_model)))

pe[pos, i + 1] = math.cos(pos / (10000 ** ((2 * (i + 1))/d_model)))

pe = pe.unsqueeze(0)

self.register_buffer('pe', pe)

def forward(self, x):

# 使得单词嵌入表示相对大一些

x = x * math.sqrt(self.d_model)

# 增加位置常量到单词嵌入表示中

seq_len = x.size(1) x = x + Variable(self.pe[:,:seq_len], requires_grad=False).cuda()

输入

嵌入表示

查询

值向量

Machine

X1q1 k1 v1 WQ WK WV

Learning

X2q2 k2 v2

16 大规模语言模型:从理论到实践 

return x

2.1.2 注意力层

自注意力(Self-Attention)操作是基于 Transformer 的机器翻译模型的基本操作,在源语言的编

码和目标语言的生成中频繁地被使用以建模源语言、目标语言任意两个单词之间的依赖关系。给

定由单词语义嵌入及其位置编码叠加得到的输入表示 {xi ∈

的建模,进一步引入在自注意力机制中涉及到的三个元素:查询 qi(Query),键 ki(Key),值 vi (Value)。在编码输入序列中每一个单词的表示的过程中,这三个元素用于计算上下文单词所对应

的权重得分。直观地说,这些权重反映了在编码当前单词的表示时,对于上下文不同部分所需要的

关注程度。具体来说,如图2.2所示,通过三个线性变换 WQ ∈ Rd×dq,WK ∈ Rd×dk,WV ∈

将输入序列中的每一个单词表示 xi 转换为其对应的 qi ∈ Rdk,ki ∈ Rdk,vi ∈

图 2.2 自注意力机制中的查询、键、值向量

为了得到编码单词 xi 时所需要关注的上下文信息,通过位置 i 查询向量与其他位置的键向量

做点积得到匹配分数 qi · k1, qi · k2, ..., qi · kt。为了防止过大的匹配分数在后续 Softmax 计算过程

中导致的梯度爆炸以及收敛效率差的问题,这些得分会除放缩因子 √d 以稳定优化。放缩后的得

分经过 Softmax 归一化为概率之后,与其他位置的值向量相乘来聚合希望关注的上下文信息,并

最小化不相关信息的干扰。上述计算过程可以被形式化地表述如下:

Z = Attention(Q, K,V ) = Softmax(

QKT √d )V (2.3)

大语言模型基础 17

其中 Q ∈ RL×dq , K ∈ RL×dk ,V ∈

成的矩阵,L 表示序列长度,Z ∈

制聚合上下文信息的能力,提出了多头自注意力(Multi-head Attention)的机制,以关注上下文的不

同侧面。具体来说,上下文中每一个单词的表示 xi 经过多组线性 {WQj WKj WVj }Nj=1 映射到不同

的表示子空间中。公式2.3会在不同的子空间中分别计算并得到不同的上下文相关的单词序列表示

{Zj}Nj=1。最终,线性变换 WO ∈

层最终的输出 {xi ∈

使用 Pytorch 实现的自注意力层参考代码如下:

class MultiHeadAttention(nn.Module):

def __init__(self, heads, d_model, dropout = 0.1):

super().__init__()

self.d_model = d_model

self.d_k = d_model // heads

self.h = heads

self.q_linear = nn.Linear(d_model, d_model)

self.v_linear = nn.Linear(d_model, d_model)

self.k_linear = nn.Linear(d_model, d_model)

self.dropout = nn.Dropout(dropout)

self.out = nn.Linear(d_model, d_model)

def attention(q, k, v, d_k, mask=None, dropout=None):

scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k)

# 掩盖掉那些为了填补长度增加的单元,使其通过 softmax 计算后为 0

if mask is not None:

mask = mask.unsqueeze(1)

scores = scores.masked_fill(mask == 0, -1e9)

scores = F.softmax(scores, dim=-1)

if dropout is not None:

scores = dropout(scores)

output = torch.matmul(scores, v)

return output

def forward(self, q, k, v, mask=None):

bs = q.size(0) # 进行线性操作划分为成 h 个头

k = self.k_linear(k).view(bs, -1, self.h, self.d_k)

q = self.q_linear(q).view(bs, -1, self.h, self.d_k)

v = self.v_linear(v).view(bs, -1, self.h, self.d_k)

18 大规模语言模型:从理论到实践

# 矩阵转置

k = k.transpose(1,2) q = q.transpose(1,2) v = v.transpose(1,2) # 计算 attention

scores = attention(q, k, v, self.d_k, mask, self.dropout)

# 连接多个头并输入到最后的线性层

concat = scores.transpose(1,2).contiguous().view(bs, -1, self.d_model)

output = self.out(concat)

return output

了解大模型,你能获得什么?

提升效率,超越同行,成为产业链中的佼佼者。 开启多面手模式,自己承接项目,打造个人品牌和第二收入来源。 跃升为公司的大模型技术核心,引领技术潮流。 利用大模型解决独特场景问题,实现个人创业梦想。 世界顶尖学府的AI原生产品设计方法论

在这个科技日新月异的时代,我们有幸见证了一项革命性技术的诞生——AIGC大模型。通过学习这项技术并应用于实践项目中(如打造专属虚拟女友),我们不仅可以提升自己的技能水平和职业竞争力还可以获得更加丰富多彩的娱乐体验和生活方式。快来加入我们吧!可以直接私信我哦!


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月30日 0

暂无评论

推荐阅读
y8DNmPgHhyBv