建议书籍

实战书籍

  • 《机器学习实战(原书第2版)》

基于sklearn、Tesnsorflow

https://book.douban.com/subject/35218199/

  • 动手学深度学习》

(书籍、代码、视频-沐神出品,可以关注沐神的知乎和b站,经常会发干货)

http://zh.d2l.ai/chapter_preface/index.html

  • 漫画机器学

https://book.sciencereading.cn/shop/book/Booksimple/onlineRead.do?id=BBFFD36F5A94C6D7DE053010B0A0AB613000&readMark=0

理论书籍

  • 《机器学习》

(西瓜书-周志华-比较通俗易懂)

https://book.douban.com/subject/26708119/

  • 《统计学习方法(第2版)》

(大量公式-比较难啃,但是知识点非常全面,类似于知识清单)

https://book.douban.com/subject/33437381/

*《深度学习》

(花书-深度学习三巨头鸿篇巨制)

https://book.douban.com/subject/27087503/

NLP相关

  • 《文本数据挖掘》

nlp-领域大佬新做

https://book.douban.com/subject/34441323/

  • 《Speech and Language Processing (3rd ed. draft)》

斯坦福大佬著作,不断更新中。中文译名,《自然语言处理综述》,对应版本为第二版。

https://web.stanford.edu/~jurafsky/slp3/

参考资料:

https://llmbook-zh.github.io/LLMBook.pdf

标量、向量、张量

标量: 一个单独的数字

向量 :一个向量是一列数。词向量就是一列数字。

张量:

从视觉角度:

一阶张量是一个一维数组,即一组数,我们可以将一组数表示为一个矢量

二阶张量是一个矩阵,因此我们可以将张量作为矢量和矩阵概念的推广。

三阶张量 对于 RGB 图片,我们可以理解为由三张分别表示 R,G,B 分量的图片堆叠而成,如下

对于每个分量图片,我们都可以看成一个矩阵,那么一张 RGB 图片就可以用三阶的张量进行表示。

四阶张量 对于多张 RGB 图片,我们可以用四阶张量进行表示,可以看作是三阶张量(单张RGB图像)的数组(多张 RGB 图片)。

五阶张量 视频是由多张图片组成的,因此每个视频可以用一个四阶张量表示,显然,多个视频可以用五阶张量表示。

从NLP角度:

一阶张量一个字或词

二阶张量是一句话。

三阶以上的张量:一段话或者一篇文章,或者是将大量的语句分成若干个批次。



分词与词向量

参考链接:AI大模型基础:1.分词_大模型分词-CSDN博客

为什么要分词?

自然语言类任务的流程中分词是重要一环

分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词问题。但中文不同,天然缺少分隔符,需要读者自行分词和断句。故在做中文自然语言处理时,需要先进行分词。





分词就是将句子、段落、文章这种长文本,分解为以字词甚至更小单位的数据结构



中文分词难点

中文分词不像英文那样,天然有空格作为分隔。而且中文词语组合繁多,分词很容易产生歧义。因此中文分词一直以来都是NLP的一个重点,也是一个难点。难点主要集中在分词标准,切分歧义和未登录词三部分。

中文分词算法

传统的分词方法:

主要分为两类,基于词典的规则匹配方法,和基于统计的机器学习方法。

基于词典的分词算法

基于词典的分词算法,本质上就是字符串匹配。将待匹配的字符串基于一定的算法策略,和一个足够大的词典进行字符串匹配,如果匹配命中,则可以分词。根据不同的匹配策略,又分为正向最大匹配法,逆向最大匹配法,双向匹配分词,全切分路径选择等。

最大匹配法主要分为三种:

正向最大匹配法 ,从左到右对语句进行匹配,匹配的词越长越好。比如“商务处女干事”,划分为“商务处/女干事”,而不是“商务/处女/干事”。这种方式切分会有歧义问题出现,比如“结婚和尚未结婚的同事”,会被划分为“结婚/和尚/未/结婚/的/同事”。

逆向最大匹配法 ,从右到左对语句进行匹配,同样也是匹配的词越长越好。比如“他从东经过我家”,划分为“他/从/东/经过/我家”。这种方式同样也会有歧义问题,比如“他们昨日本应该回来”,会被划分为“他们/昨/日本/应该/回来”。

双向匹配分词 ,则同时采用正向最大匹配和逆向最大匹配,选择二者分词结果中词数较少者。但这种方式同样会产生歧义问题,比如“他将来上海”,会被划分为“他/将来/上海”。由此可见,词数少也不一定划分就正确。

全切分路径选择 ,将所有可能的切分结果全部列出来,从中选择最佳的切分路径。分为两种选择方法

n最短路径方法。将所有的切分结果组成有向无环图,切词结果作为节点,词和词之间的边赋予权重,找到权重和最小的路径即为最终结果。比如可以通过词频作为权重,找到一条总词频最大的路径即可认为是最佳路径。

n元语法模型。同样采用n最短路径,只不过路径构成时会考虑词的上下文关系。一元表示考虑词的前后一个词,二元则表示考虑词的前后两个词。然后根据语料库的统计结果,找到概率最大的路径。

子词分词

BPE:

在 1994 年,BPE 算法被提出,最早用于通用的数据压缩 [137]。随后,自然 语言处理领域的研究人员将其进行适配,并应用于文本分词 [138]。BPE 算法从一 组基本符号(例如字母和边界字符)开始,迭代地寻找语料库中的两个相邻词元, 并将它们替换为新的词元,这一过程被称为合并。合并的选择标准是计算两个连 续词元的共现频率,也就是每次迭代中,最频繁出现的一对词元会被选择与合并。 合并过程将一直持续达到预定义的词表大小。

算法逻辑:

  1. 准备足够大的训练语料
  2. 确定期望的subword词表大小
  3. 将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么我们将其改写为“ l o w </ w>”:5
  4. 统计每一个连续字节对的出现频率,选择最高频者合并成新的subword
  5. 重复第4步直到达到第2步设定的subword词表大小或下一个最高频的字节对出现频率为1

停止符"</w>“的意义在于表示subword是词后缀。举例来说:“st"字词不加”</w>“可以出现在词首如"st ar”,加了”</w>“表明改字词位于词尾,如"wide st </w>",二者意义截然不同。

每次合并后词表可能出现3种变化:

  • +1,表明加入合并后的新字词,同时原来的2个子词还保留(2个字词不是完全同时连续出现)
  • +0,表明加入合并后的新字词,同时原来的2个子词中一个保留,一个被消解(一个字词完全随着另一个字词的出现而紧跟着出现)
  • -1,表明加入合并后的新字词,同时原来的2个子词都被消解(2个字词同时连续出现)

实际上,随着合并的次数增加,词表大小通常先增加后减小。



论文地址:

https://aclanthology.org/P18-1007.pdf

https://zhuanlan.zhihu.com/p/86965595



WordPiece :

WordPiece 是谷歌内部非公开的分词算法,最初是由谷歌研究人员在开发语音 搜索系统时提出的 [140]。随后,在 2016 年被用于机器翻译系统 [141],并于 2018 年被 BERT 采用作为分词器 [13]。WordPiece 分词和 BPE 分词的想法非常相似,都 是通过迭代合并连续的词元,但是合并的选择标准略有不同。在合并前,WordPiece 分词算法会首先训练一个语言模型,并用这个语言模型对所有可能的词元对进行 评分。然后,在每次合并时,它都会选择使得训练数据的似然性增加最多的词元 对。 由于谷歌并未发布 WordPiece 分词算法的官方实现,这里我们参考了 Hugging Face 在线自然语言课程中给出的 WordPiece 算法的一种实现。与 BPE 类似,WordPiece 分词算法也是从一个小的词汇表开始,其中包括模型使用的特殊词元和初始 词汇表。由于它是通过添加前缀(如 BERT 的##)来识别子词的,因此每个词的初 始拆分都是将前缀添加到词内的所有字符上。举例来说,“word”会被拆分为:“w ##o ##r ##d”。与 BPE 方法的另一个不同点在于,WordPiece 分词算法并不选择最 频繁的词对,而是使用下面的公式为每个词对计算分数:

Unigram:

BPE存在的问题:一个词可能有多个分法

与 BPE 分词和 WordPiece 分词不同,Unigram 分词方法 [142] 从语料库的一 组足够大的字符串或词元初始集合开始,迭代地删除其中的词元,直到达到预期 的词表大小。它假设从当前词表中删除某个词元,并计算训练语料的似然增加情 况,以此来作为选择标准。这个步骤是基于一个训练好的一元语言模型来进行的。 为估计一元语言模型,它采用期望最大化(Expectation–Maximization, EM)算法: 在每次迭代中,首先基于旧的语言模型找到当前最优的分词方式,然后重新估计 一元概率从而更新语言模型。这个过程中一般使用动态规划算法(即维特比算法, Viterbi Algorithm)来高效地找到语言模型对词汇的最优分词方式。采用这种分词 方法的代表性模型包括 T5 和 mBART。

论文地址:

https://aclanthology.org/P16-1162.pdf

[UIM]论文解读:subword Regularization: Multiple Subword Candidates_unigram language model论文-CSDN博客



Byte-level BPE(BBPE)

基础知识:

Unicode: Unicode 是一种字符集,旨在涵盖地球上几乎所有的书写系统和字符。它为每个字符分配了一个唯一的代码点(code point)用于标识字符。Unicode 不关注字符在计算机内部的具体表示方式,而只是提供了一种字符到代码点的映射。Unicode 的出现解决了字符集的碎片化问题,使得不同的语言和字符能够在一个共同的标准下共存。然而,Unicode 并没有规定如何在计算机内存中存储和传输这些字符。

UTF-8: UTF-8(Unicode Transformation Format-8)是一种变长的字符编码方案,它将 Unicode 中的代码点转换为字节序列。UTF-8 的一个重要特点是它是向后兼容 ASCII 的,这意味着标准的 ASCII 字符在 UTF-8 中使用相同的字节表示,从而确保现有的 ASCII 文本可以无缝地与 UTF-8 共存。在 UTF-8 编码中,字符的表示长度可以是1到4个字节,不同范围的 Unicode 代码点使用不同长度的字节序列表示,这样可以高效地表示整个 Unicode 字符集。UTF-8 的编码规则是:

  • 单字节字符(ASCII 范围内的字符)使用一个字节表示,保持与 ASCII 编码的兼容性。
  • 带有更高代码点的字符使用多个字节表示。UTF-8 使用特定的字节序列来指示一个字符所需的字节数,以及字符的实际数据。

例如,英文字母 “A” 的 Unicode 代码点是U+0041,在 UTF-8 中表示为 0x41(与 ASCII 编码相同);而中文汉字 “你” 的 Unicode 代码点是U+4F60,在 UTF-8 中表示为0xE4 0xBD 0xA0三个字节的序列。

所以简单的来说:

  • Unicode 是字符集,为每个字符分配唯一的代码点。
  • UTF-8 是一种基于 Unicode 的字符编码方式,用于在计算机中存储和传输字符。

Byte(字节) :计算机存储和数据处理时,字节是最小的单位。一个字节包含8个(Bit)二进制位,每个位可以是0或1,每位的不同排列和组合可以表示不同的数据,所以一个字节能表示的范围是256个。

言归正传:

Byte-level BPE(BBPE)和Byte-Pair Encoding (BPE)区别就是BPE是最小词汇是字符级别,而BBPE是字节级别的,通过UTF-8的编码方式这一个字节的256的范围,理论上可以表示这个世界上的所有字符。

所以实现的步骤和BPE就是实现的粒度不一样,其他的都是一样的。

  1. 初始词表:构建初始词表,包含一个字节的所有表示(256)。
  2. 构建频率统计:统计所有子词单元对(两个连续的子词)在文本中的出现频率。
  3. 合并频率最高的子词对:选择出现频率最高的子词对,将它们合并成一个新的子词单元,并更新词汇表。
  4. 重复合并步骤:不断重复步骤 2 和步骤 3,直到达到预定的词汇表大小、合并次数,或者直到不再有有意义的合并(即,进一步合并不会显著提高词汇表的效益)。
  5. 分词:使用最终得到的词汇表对文本进行分词。

获取词向量:

独热表示(Onehotrepresentation)

在自然语言处理的各项任务中,需要将字、词进行编码,形成数字表达的向量的形式,以便进行运算。常见的一种编码方式是独热表示(Onehotrepresentation)。这种编码方式是很多编码方式的基础。具体做法是首先有一个词汇表V,并按指定规则对词汇进行排序。定义一个向量用来表示词汇,向量大小同词汇表大小。词汇w的向量表示为c(w),其在词汇表中的次序是i。c(w)的值第i位为1,其他位置是0。以‘我爱NLP’未例,具体表示如下:

w= ‘我‘,在词表中的次序是1;

c(w) =[0,1,0,0,…,0,0,0];

W = ‘爱‘,在词表中的次序是3;

c(w) =[0,0,0,1,…,0,0,0];

W = ‘NLP‘,在词表中的次序是2;

c(w)=[0,1,0,0,…,0,0,0];

独热表示存在如下的问题:

  • 独热向量中的每一个位置都表示一个单词,但词汇之间没有相关性;
  • 向量大小受词表的大小影响,词汇量大时便造成维数爆炸问题;
  • 该词向量也无法表示未出现的词;

分布表示(DistributedRepresentation)

另外一种词汇的表示是Hinton提出的[49]分布表示(DistributedRepresentation)。主要做法是基于大量的文本数据学习,将语言中每个词汇对应到固定大小的向量。其长度一般远远小于词表大小。每个词汇可以再空间中映射成某一点,从而将距离概念引入词的表达,可以便捷地计算词汇之间在句法、语义上的相似性。

在文本的表示方面,主要有两种不同的表示方式:上下文无关的文本表示和上下文相关的文本表示。上下文无关的文本表示以Word2vec为代表,每个词映射成固定的词向量;上下文相关的文本表示以ELMO为发端,每个词汇表示为动态的词向量,根据上下文的不同,词向量不同。Word2vec不能解决一词多义的问题,而且存在词表之外词的表示问题(OOV)。

  • NNLM时代
  • Word2Vec时代
  • ELMO-基于上下文的动态词向量

ELMO[55]是一种基于语境的词汇表达模型,不但可以解决一词多义的问题,而且可以挖掘出词汇的复杂特征,如词性特征、语法特征等。模型的核心思想是将句子来作为上下文,来训练词向量,学习当前上下文环境下的词汇表征。

  • 大模型时代的词向量,以Bert为开端

额外补充:目前中文词嵌入效果最好的模型之一:bge:

https://arxiv.org/pdf/2309.07597

https://www.modelscope.cn/models/AI-ModelScope/bge-large-zh#usage



需要掌握的神经网络结构:RNN、LSTM、Seq2Seq

大模型之前的NLP模型、算法都在尝试解决的问题:更好的表示输入,更好地利用知识(记忆)

RNN与Bi-RNN:

NLP的某些任务如机器翻译、语音识别等都属于序列生成任务,每一时刻都输出都依赖与上一时刻以及之前的输出。RNN(RecurrentNeuralNetworks)是一种处理序列任务的神经网络[6]。

循环神经网络由数据获取层、数据流出层、隐藏层构成,与前馈神经网络相似。不同的是,RNN的隐藏层之间相互连接,使得RNN有了记忆之前输入内容的能力。隐藏层包含着之前每个时刻的信息,因此使得输出能够获得充分的信息。RNN的基本结构示意如图2.1:

在实际的应用中,只考虑输入的从左到右,并不能完全利用输入的信息。例如在文本摘要的任务重,某一时刻的输入不但与之前的输入信息有关,也与未输入的词汇有关。双向的神经网络从两个方向来考虑输入,能够对信息进行更充分的抽取和编码。其结构也比较简单,在原有的从左到右的隐藏层之上加上了一层从右到左的隐藏层,并将两者链接。双向神经网络可以获取两个方向的文本表示,增强了隐藏层的信息表达。图2.2是双向神经网络的示意图。ho层是从左到右的网络层,g0层是从由到左的网络层。这两层的信息拼接,作为下一层隐藏层的输入。



[流程图]### LSTM

RNN模型存在两个问题:长期依赖问题和梯度消失问题[45]。长期依赖问题是指RNN网络无法记忆较长的输入内容,只能记住最近的内容,这是链式求导数导致的问题[7]。长短期记忆模型与标准的循环神经网络的差别是体现在隐藏层。LSTM通过隐藏单元的门控机制来筛选信息,从而减弱了长期依赖和梯度小时问题。LSTM的门控主要包括输入门,遗忘门,输出门三部分,具体的计算如下

序列到序列(Seq2Seq)

DNN(深度神经网络,多层神经网络的叠加)是非常强大的机器学习工具,在自然语言处理的多个任务上取得了不错成绩。但是DNN只能处理输入和输出维度为固定的任务[34]。但是如翻译,摘要等任务的输出的长度是不定的,这类问题需要输入与输出是域无关的方案。这类的任务需要解决数据对齐的问题。序列到序列(SequencetoSequence)便是这样一套方案。

序列到序列结构的主要分为两部分:编码器和解码器。编码器和解码器一般都是用RNN。编码器通过RNN网络将数据编码为指定的维度的输出,解码器从编码器的输出中解码为需要的维度,从而解决了输入与输出的对齐问题。



以一个对话系统为例,主要的结构如图3.1。

图3.1Seq2Seq结构示意图

输入的句子是“我爱NLP”,经过编码器的序列,编码器的隐藏层链接输出层的隐藏层。<S>为输出的开始。“<S>”经过隐藏层,输出第一个预测:“Me”,输出值“Me”作为下一刻的输入,再进入隐藏层。当输出为 </S>表示输出的结束。这时候整个输入输出的流程就结束了。

循环神经网络因其本身的时序特性和前后依赖特性,适合用来做生成式任务。但是因为循环神经网络自身存在的长期依赖性问题,在某一时刻的预测若与该时刻较远的输入有很大相关关系时,RNN可能是不包含这些信息的,导致预测不准确。因此,在Seq2Seq的机构中,通常使用长短期记忆模型(LSTM)通过输入门、遗忘门和输出门来控制RNN要记住的内容,从而提升了对长距离内容的记忆效果。

图3.1是最基本的Seq2Seq结构,在实际的使用中通常会在编码器和解码器之间有一个存储区域(context),用来存储编码器的所有隐藏层信息,而不是解码器仅仅依赖最后一层隐藏层。此时,编码器将输入映射为固定长度,解码器根据编码器的(context)来生成内容输出。户保田[75]等人的论文中证明,使用了context的Seq2Seq模型相比不使用context,生成的摘要在R-1,R-2,R-L都有较大幅度的提升。

Seq2Seq结构有效地解决了源输入数据与输出数据的对齐问题。文本摘要的长度通常都小于文本的长度。但是仅仅依赖与循环神经网络的Seq2Seq模型的信息的编码能力仍有待加强。特别是解码器不考虑长度,将输入内容压缩为固定的长度带来信息的丢失。输入是特别长的文章时,这种信息的丢失将会更加明显。在输入的文本中,不同的句子对最终的摘要重要性是不同的,但在编码器中被压缩的文本并没有权重上的分别。

注意力机制:注意力、自注意力、多头注意力

注意力

基本的序列到序列模型的编码器会把输入内容压缩到固定的长度,但是在输入的内容比较长的时候,就不能有效地记住足够的信息了,这是序列到序列模型的一个重要问题。Bahdanau等人[46]在2015年发表了一篇机器翻译的文章提到了一种注意力机制。注意力机制在编码器的部分,对输入的不同部分建立一个索引,在输出阶段可以随时来回看与输入相关的输入片段,这样编码器在输出时就不需要存储所有的信息了。加入注意力机制的序列到序列模型可以有效地解决这个问题。其基本的结构如图3.2。

这里编码器使用了一个双向的LSTM模型,Attention机制主要是在解码器进行解码时产生作用。其中涉及到的公式如下:

**$a_t=attn(hs,s_i), i =t-1$**

**$a_s = Softmax(a)_t$**



解码器在t时刻时,根据编码器的隐藏层输出h,和当前的解码器的隐藏层输出s_t,来计算在不同的输入i(i表示输入的次序,h_i表示第i个输入的隐藏层输出,包括正反两个方向)的得分e_i^t。然后将得分归一化,生成Attention的权重a^t。Attention的权重与对应的编码器的隐藏层相乘,得到t时刻输出应该关注的输入内容h_t^*,进而根据输入h_t^*和解码器的隐藏层输出s_t得到当前的输出P_t (w)。

注意力机制去掉了编码器与解码器之间的数据压缩过程,直接数据流通,可以使得Seq2Seq结构不必再映射成为一个固定的长度。同时解码器的每一时刻都直接关注与当前输出有关的编码端信息,不但加速了信息的流动速度,也增强了获取信息的质量。Nallapati[36]等人的实验也证明了注意力机制在文本摘要任务中的有效性。

但是注意力机制的运用也使得另一个问题愈发明显:内容重复生成。这是因为注意力机制使得生成内容时,会重点关注输入中某一部分重点内容,从使得生成的句子冲出现重复的单词。

深度学习笔记:如何理解激活函数?(附常用激活函数)_什么是激活函数?举例说明几种常见的激活函数及其用途-CSDN博客

自注意力

注意机制关注的是t时刻的输出与输入序列各部分的关系,而自注意力机制关注的是输入序列中各个部分的相互关系。根据这些相互关系来重新表示每个词汇。如句子:“我爱自然语言处理,学习它我能得到很高的成就感”。句子中的“它”指的是“自然语言处理”,两者具有很强的关系;“我”和“自然语言处理”分别是“学习”的执行者和执行对象,也都有一定的关系。自注意力机制便是要挖掘词汇中的这些关系。具体的计算如下:

https://0809zheng.github.io/2020/04/24/self-attention.html

自注意力和注意力机制的区别:

  • 注意力机制的权重参数是一个全局可学习参数,对于模型来说是固定的;而自注意力机制的权重参数是由输入决定的,即使是同一个模型,对于不同的输入也会有不同的权重参数。
  • 注意力机制的输出序列长度与输入序列长度可以是不同的;而自注意力机制的的输出序列长度与输入序列长度必须是相同的。
  • 注意力机制在一个模型中通常只使用一次,作为编码器和解码器之间的连接部分;而自注意力机制在同一个模型中可以使用很多次,作为网络结构的一部分。
  • 注意力机制擅长捕捉两个序列之间的关系,如机器翻译任务中将一个序列映射为另一个序列;而自注意力机制擅长捕捉单个序列内部的关系,如作为预训练语言模型的基本结构。

编码器与解码器

Transformer(一)–论文翻译:Attention Is All You Need 中文版-CSDN博客

位置编码

自注意力机使得模型可以有效地并行计算,但是却没有RNN的输入序列信息。为了解决这一问题,在输入词汇性自注意力计算之前加上一层位置编码,再进行运算,使得位置信息也能参与到自注意力的表示中。Transformers中使用使用正弦函数和余弦函数来构造位置编码:

编码器

编码器由输入层和若干个叠加的编码层构成。输入层包括合并词向量和位置编码。每个编码层中又顺序包括自注意力层、正则化层、全连接的前馈神经网络层、正则化层。输入层的词向量首先进入自注意力层获取由相关关系表示的输入,进入正则化层进行处理,再进入前馈网络层,再进行正则化,最后输出,进入下一个编码层,直到最后输出。具体流程如图2.4所示

  • 残差链接层&归一化层(add &normalize)



参考链接:

https://developer.volcengine.com/articles/7389519960881496075

基本上所有的归一化技术,都可以概括为如下的公式:

对于隐层中某个节点的输出,即激活值a,进行非线性变换(如ReLU、tanh等)后得到h。

****层归一化的过程就是先计算这一层所有激活值的均值μ和方差σ²,然后使用这些统计量对h进行分布调整。****这种调整就是把“高瘦”和“矮胖”的都调整回正常体型(深粉色),把偏离x=0的拉回中间来(淡紫色)。

解码器:

类似于编码器,解码器也包含若干个叠加的解码层,最后通过一个线性连接层和输出层输出预测。在每个编码层中,首先是解码器的输入转化为输入向量(词向量+位置编码),通过注意力层和正则化层。这时候,需要将编码器的输出映射成为K,和V,来计算输入层在此刻输出的权重,并对输入进行加权计算。然后再进入一个正则化层,前向网络层,再进入一个正则化层,输出到下一个解码层。在所有的解码器层顶端通过线性连接层和softmax层输出结果。编码器到解码器的具体的流程如图2.5。

综合自注意力机制、位置编码、编码器和解码器,Transformer的整体的模型结构如





Transformer模型的计算量评估

万字长文解析:大模型需要怎样的硬件算力

Transformer模型可视化

https://bbycroft.net/llm





理解Transformer_从0到1.pdf

使用 Hugo 构建
主题 StackJimmy 设计