首页 > 都市小说 > AI时代:码农的涅盘重生 > 第102章 深度学习进阶

第102章 深度学习进阶(1/2)

目录

窗外的鹏城湾在晨曦中泛起粼粼波光,林晨已经坐在电脑前两个小时了。

书桌上摊开着打印出来的论文——《AttentionIsAllYouNeed》。A4纸上用红蓝两色笔画满了圈圈线线,旁边是他密密麻麻的手写笔记。三个月深度学习计划进入第二周,他终于开始啃这块硬骨头。

“注意力机制……”林晨喃喃自语,手指在键盘上敲下一行注释,“就像人读文章时,不会平均关注每个字,而是会把重点放在关键词上”。

这个概念听起来简单,但数学表达却让他头疼。Q(查询)、K(键)、V(值)三个矩阵的运算,缩放点积注意力,多头注意力……他打开JupyterNotebook,决定从最基础的开始实现。

iporttorch

iporttorasnn

iportath

cssScaledDotProductAttention(nn.Module):

def__it__(self,dropout=0.1):

super.__it__

self.dropout=nn.Dropout(dropout)

defforward(self,Q,K,V,ask=None):

#计算注意力分数:Q*K^T/sqrt(d_k)

d_k=K.size(-1)

sres=torch.atul(Q,K.transpose(-2,-1))/ath.sqrt(d_k)

ifaskisnotNone:

sres=sres.asked_fill(ask==0,-1e9)

#Softax归一化

attentios=torax(sres,di=-1)

attentios=self.dropout(attentios)

#加权求和

output=torch.atul(attentios,V)

returnoutput,attentios

写完这段代码,林晨长舒一口气。他创建了几个随机张量进行测试,看着注意力权重矩阵在控制台打印出来——那些数值确实呈现出“聚焦”特征,某些位置的权重明显高于其他位置。

“有点意思”。他嘴角扬起。

接下来的三天,林晨完全沉浸在Transforr架构的世界里。他画了十几张架构图,从编码器到解码器,从位置编码到前馈神经网络。每理解一个组件,他就在PyTorch里实现一遍。

位置编码是他觉得最精妙的设计之一。“既然Transforr没有RNN那样的序列顺序概念,就得通过位置编码告诉模型每个词的位置信息”。他在笔记里写道,“正弦余弦函数的交替使用,既能表示绝对位置,又能捕捉相对位置关系,而且可以扩展到任意长度……”

他翻出那篇着名的《TheAnnotatedTransforr》博客,对照着逐行理解。遇到卡壳的地方,就跑到GitHub上找开源实现参考,或者在StackOverflow上搜索相关问题。

周五晚上十点,苏婉端着一盘切好的水果走进书房。

“还在研究那个什么……变形金刚”?她把水果放在桌角,俯身看向屏幕。

“是Transforr”。林晨笑着纠正,伸手揽住妻子的腰,“不过你说得对,这架构确实像变形金刚——模块化、可组合、威力强大”。

苏婉看着屏幕上那些复杂的数学公式和代码,轻轻摇头:“我看不懂,但能感觉到你很享受这个过程”。

“确实”。林晨叉起一块苹果,“以前做电商后端,大部分时间在堆业务逻辑。现在学这些东西,有种在触碰技术本质的感觉。每个公式、每个设计选择背后,都有一套严密的逻辑”。

他指着屏幕上的多头注意力示意图:“你看,就像这个多头机制。单头注意力可能只关注一种关系,比如‘动词-宾语’。但八个头一起工作,就能同时关注语法、语义、指代等多种关系——这设计多优雅”。

苏婉笑了:“你现在说起技术,眼睛会发光”。

林晨一愣,随即意识到这是真的。失业初期的焦虑和迷茫,已经被一种更扎实的东西取代——对知识的渴求,对理解的成就感。

周末两天,林晨决定挑战自己:实现一个Mi-GPT。

这不是简单的照搬教程。他给自己设定了几个目标:

1.从零实现Transforr解码器架构;

2.用WikiText-2数据集训练;

3.能生成连贯的文本;

4.代码要整洁、模块化、有完整注释。

周日上午,他开始准备数据。

iporttorchtext

frotorchtext.datasetsiportWikiText2

frotorchtext.data.utilsipet_tokenizer

frotorchtext.vocabiportbuild_vocab_fro_iterator

#加载数据集

tra_iter=WikiText2(split=tra)

tokenizer=get_tokenizer(basiglish)

defyield_tokens(data_iter):

fortextdata_iter:

yieldtokeext)

#构建词表

vocab=build_vocab_fro_iterator(yield_tokens(tra_iter),specials=[<unk><pad><bos><eos>])

vocab.set_default_dex(vocab[<unk>])

prt(f词表大小:{len(vocab)})#输出:

三万多词的词表,对于Mi模型来说太大了。林晨决定只保留前个高频词,其余统一映射为<unk>。他知道这会损失一些信息,但训练速度和内存占用会更友好。

本章未完,点击下一页继续阅读。

目录
返回顶部