首页 > 其他分享 >《鞋匠的AI之旅》- 5. Transformer【上】

《鞋匠的AI之旅》- 5. Transformer【上】

时间:2024-06-12 19:32:51浏览次数:17  
标签:Transformer 鞋匠 AI 矩阵 嵌入 64 维度 输入

5.Transformer

鞋匠回顾了这一路走来形成的成果:

  • 人工神经网络提供了一种模拟现实世界或者学习现实世界处理问题模式的一种方法;
  • 人类通过对这个世界的观察,体验到了支配这个世界运行的自然规律,并把这些规律及自身体会表达出来,最后通过语言符号物化下来,这些符号堆积在一起就是人类的知识积累,是人类智慧的体现。而词嵌入把所有人类所总结的代表着一定含义的语言符号进行了量化,这就为AI模型处理或者理解人类语言符号提供了原材料。这些原材料以一定的形式堆积在一起,支撑其堆积在一起的模式就是人类的知识体系,而AI模型所擅长的就是从大量的原材料里(原始数据里)学习到其背后的模式;
  • 自注意力机制是一种处理词嵌入这种原材料的方法,通过这个方法,AI模型不仅可以关注到这些原材料本身所携带的信息还可以关注到更多的相互关联的信息。

有了原材料和对原材料处理的方法,鞋匠觉得接下来就需要构建一个工厂,或者说一个作业流水线,按照一定的工艺流程,让工厂生产出鞋匠想要的产品,如,输入一个问句生成一个答复,输入一些信息给出一些归类,输入一段话给出情感分析,输入一篇文章给出一个摘要,输入中文给出英文翻译,输入一个命题给出一篇作文等等。令人欣喜的是,在现实世界里,一夜春风来,万树梨花开。各大“工厂”不断涌现,百家争鸣,共同推动着每个风口浪尖的起落。这些工厂是如何建成的呢?鞋匠相信真理应该藏在这风浪之下。

朦胧间,鞋匠觉得在朦胧的尽头,大模型的世界又变得些许清晰。鞋匠怀着敬畏之心伸手又敲开了大模型世界的第三扇门 --- Transformer。

编码与解码

在地球这个大大的生态圈内,最伟大的观察、感知、信息处理模型莫过于人脑了,鞋匠仍然记得当年老师在生物课上讲授的人类大脑那神秘的信息处理过程。鞋匠静静地思考着,自己是怎么看到这个丰富多彩的大千世界的呢?首先,当外部光线照射到物体上,物体会反射光。这些反射的光子(这是目前为止人类给予的最好的命名了)通过眼睛的角膜、晶状体和玻璃体被聚焦在视网膜上。视网膜包含大量的视觉感受器,称为视觉细胞,它们能够感知光线的强度和颜色。视觉细胞将光信号转化为神经冲动。这些神经冲动本质上是神经元中传递的生物电信号,这些电信号会沿着神经细胞的轴突传播,最终到达神经元的末端,并释放化学物质(神经递质)来影响与其相连的神经元细胞。这些释放的神经递质被其它神经元的受体结合,从而转化为电信号,继续传递神经信号。就这样,这些神经冲动通过视神经传输到大脑的视觉皮层中。接下来,这些神经冲动会在视觉皮层中进行处理。这个处理过程非常复杂,包括了对颜色、形状、运动等信息的分析和整合。于是,这些神经冲动在大脑中形成了视觉图像。最终,这个由视觉皮层处理的视觉图像被传递到大脑中更高级的区域---额叶和颞叶。这些区域会对图像进行更深层次的理解和解释,以便我们能够认识物体、理解场景等。在这个过程里,眼睛接收到的光子,被层层传递,并在传递过程中提取特征,不同层级提取的特征不同,最后形成抽象的大脑对所看见的现实世界的理解,比如一辆运动的火车,一座巍峨的雪山,一首诗词,一只小鸟,一个可食用的苹果等等。这个特征提取的过程就是一个在更高层级注意到更高级细节的过程。

按照上面的视觉过程,如果把词嵌入看作反射到眼睛里的光子,那么自注意力机制就是关注到细节的方法,而不同视觉层级的特征提取过程,自然而然可以对应到自注意力机制的不同层级的叠加,每次处理的都是上一次的输出,即在上一层的基础上提取到(注意到)本层级的更高级的特征。这个过程中,AI模型把词嵌入表示的原始输入转化成了高层级信息表示的对原文本的理解。这就有点类似于信息学上的编码过程。这些编码会被发送给接收方,并在那里进行解码,输出和原始输入一致的信息,这些信息的表示方法和原始输入一致,比如原始输入是视频,接收方解码后的输出就是视频,原始输入是图像,接收方解码后的输出就是图像。鞋匠知道,这里的AI模型和信息学中信息的编码、传递、解码过程还是有些区别的。AI模型一般要求产生不同于原始输入的输出,就像人脑一样,基于层层处理形成对输入的视觉信息的理解,人类会说“啊,这是一个多么美妙的世界啊, 你看那里有海,那里有蓝天、白云、红瓦、绿树”。鞋匠认为这种由深层次的视觉理解转化为一句感叹的话的过程严格来说也是解码的过程。

想到这里,鞋匠觉得似乎找到了工厂的建设方案:让AI模型把输入信息进行层层编码,也就是层层提取不同的特征,最终形成一个对输入信息的高级别理解,这些理解是经过量化的、输入信息的新的表示。之后层层处理这些理解,逐步转化为期望的输出。这个过程可以理解为一种转换过程,就像变形金刚一样,由一辆车逐步变形成擎天柱。鞋匠觉得这可能是这类AI模型被称之为Transformer的原因之一吧。

提到Transformer,鞋匠想起来了由谷歌的科学家们撰写的《Attention Is All You Need》这篇论文,坊间一直流传着它是Transformer创世之作的传说。这篇论文里给出了Transformer模型的架构,如图18。后面章节中统一用“Transformer论文”来指代《Attention Is All You Need》这篇论文。

图18,Transformer架构图

图中左侧部分就是前面提到的编码过程,科学家们称之为编码器,而右侧即是解码过程,科学家们称之为解码器。这个架构图形象地绘出了刚刚通过与人脑的类比所想象出的编解码过程。左侧的编码器有多个编码器层对输入信息进行多层级编码,即注意到多层级的细节,也就是进行多层级的特征提取。右侧解码器也有多个解码器层,逐层对编码器输出的高层级信息进行“变形”,最终转换成期望的输出。

有了这样一个宏观想象,鞋匠觉得接下来就是从下到上沿着架构的各组件逐一去感受Transformer的魅力了。

位置编码

鞋匠仔细琢磨着前面章节里的例子,他想继续使用这个例子来研究Transformer。“你我之间天涯咫尺”,形容的是两个人的情感关系,即便是相隔甚远,远在天涯,但只要两个人心灵相通,便彼此感觉就像在咫尺之遥。还是这几个字,调换一下顺序呢?“你我之间咫尺天涯”则表达了完全相反的情感关系。这里的关键因素是顺序,或者说每个字词的位置,对整句话的意思有着很大的影响。

所以要完整的理解一句话,除前面章节讲的自注意力层输出的信息外,还需要考虑每个词嵌入的位置!自注意力机制可以帮助AI模型提取到词自身以及词与词之间的两两关系信息,但并没有体现一个词的绝对和相对位置信息。鞋匠觉得这一点也可以从注意力分值矩阵的计算中看到端倪。不论一个词出现在输入序列的什么位置,这种计算过程都会不偏不倚地计算出每一个词对于其它所有词,包括自身,应该如何配置自己的注意力,或者注意到什么。而这个计算过程中没有一个量来标识一个词的位置信息,计算结果里自然也就没有位置信息被“注意”到。

想到这里,鞋匠觉得接下来首先要做的就是要找到一种方法来表示一个词嵌入在输入序列中的位置,以便在编码过程中提取到输入序列中完整的细节信息,包括位置。

像这样用1,2,3…对一个输入序列中各词的位置进行编码。可以吗?还是以前面256维的词嵌入为例。如果让一个词嵌入输入序列带上位置信息,一种比较直观的方法就是给每个词嵌入贴上一个标签表示其在输入序列中的位置,比如,增加一个词嵌入维度来代表这个词的所在序列中的位置。鞋匠觉得是个方案,但不够好。还记得对词嵌入的训练吗?鞋匠和专家们的设想很好,第1个维度代表词性,第2个维度情感,等等,但AI模型实际训练出来的结果如何呢?人类已经很难对各个维度做出有意义的解释。同样,这里鞋匠的原意是增加一个维度,赋值为1,2,3…等代表一个序列中词嵌入的先后位置,表示它们之间的先后顺序,但AI模型可能不这样理解,它可能对1,2,3…做出不同于设计初衷的、高维度层面的解释,并学习到了这种解释背后的人类很难觉察到的模式。这不是鞋匠希望看到。另外,一个词嵌入在输入序列中的位置不是固定的,在一个上下文中token1可能位于第一个位置,但在另一个上下文中token1可能在第3个位置上,这会导致同一个token在不同的上下文中其位置维度的值不一样。鞋匠觉得这种变化的特征值给AI模型的训练带来了更多的不确定性,AI模型很难捕捉到这个变化的维度值背后与位置的关系。

标记一个输入序列各个词嵌入的位置就一定要给每个词增加一个位置属性,并且让这个属性随着这个词的位置变化而变化吗?鞋匠想到一个小游戏,教室里有一排座椅,靠近讲台的编号为1,远离讲台的按照座次进行编号,得到一排编号为1,2,3,4,5,7的座椅。10个学生依次按照编号坐好,显然前7位有座位,后3位只能依次站在后面。假设小明同学坐在编号为6的座位,此时可以说小明的编号是6。现在同学们起身各自向前移动一个座位,最前面的同学移出这排座位,其他同学依次前移一位,原来第8位同学补位到座号为7的座位。现在小明同学的编号就是5了。但其实小明同学本身在这个过程中没有什么变化,只是自己的座位变化了。对于有座位的7位同学来说,他们的先后顺序,绝对位置,相对位置都可以被明确的确定下来,而不需要在他们身上贴上一个位置标签。如果把这7个座椅影射成AI模型的长度为7的输入,那么很自然的就可以想到,把输入本身的位置进行编码,那么词嵌入在输入序列的位置就和输入位置本身相关了。鞋匠觉得这个方法不错,但怎么给每个输入的位置进行编码呢?

仔细考虑下,其实每个位置的输入原本要输入的都是一个词嵌入,而这个词嵌入有256个维度(继续使用前面的例子),也就是对应这个位置有256个数值需要输入。所以这个位置编码应该是对这个位置的256个分量的独立的而且唯一的编码,并能体现该输入的绝对位置和相对位置(相对距离),即位置编码本身也是一个类似于词嵌入的向量,一个256维度的向量,如果用矩阵表示,其形状就是1 ×  256。

鞋匠研究了Transformer论文中引用的位置编码,觉得这是一个很好的编码方式。每个位置的每个维度都是按照不同频率的正弦函数和余弦函数计算所得。如果用PE(Position Encoding的缩写)来代表某个输入位置的编码函数,那么第pos个输入位置的第i个维度的数值可由以下表达式来计算:

当i是从0开始的偶数时,比如0,2,4,6,8,…,对应维度值为:

当i是从1开始的奇数时, 比如1,3,5,7,9,…,对应维度值为:

其中 是词嵌入的维度,在前面的例子中  = 256.

鞋匠觉得这种位置编码的好处有三:

  1. 在一定程度上,某一位置编码的各维度在所用函数周期内两两正交。这是一种很好的维度关系,就像人类生活的3维空间一样,是正南正北、正东正西的平面加上与这个平面垂直的高度维度,这种正交的结构有利于被AI模型捕获到,可以有效区分位置编码和训练所得的词嵌入向量;
  2. 各个不同的输入位置之间,一个位置可以被另一个位置线性的度量。比如位置150可以用位置100线性表示,这在一定程度上度量了相对位置;
  3. 这些正弦和余弦函数虽然频率不同,但幅度是一样的,这就保证了各位置的各维度的值被限定在这个幅度范围内,避免了大的波动。

鞋匠看到前两点都有着严格的数学证明,不过他觉得没有必要在这里详细展开了。

鞋匠按照以上公式举了个例子,输入序列的第6个位置的编码可以写成:

 

​有了每个输入位置的编码,当从这个位置输入一个词嵌入时,就相当于把这个词嵌入放到这个“座位”上,总的输入量就是位置编码的各维度值与词嵌入对应维度值相加而得的一个新的256维的向量。这个新的向量汇集了位置信息和词嵌入本身的信息。每个输入位置都会按照这个规则得到一个新的256维的向量作为输入,输入到AI模型中进行训练,或者输入到已经训练完成的AI模型中进行生成。这也是图18的Transformer架构图中,编码器最下面的加号的意思。如图19.

图19,词嵌入与位置编码相加

按此方式,如果要计算前面例子中输入词嵌入序列中第6个位置的新的输入,那么有

 

= [a(6)(1)+  , a(6)(2)+ ,…, a(6)(256)+  ]

这是一个1 ×  256的矩阵。如果把 , , , , , , , 这8个新的增加了位置编码信息的向量放到一起,就形成了输入矩阵X 的新的表示:

 = [    [ ]

[ ]

[ ]

[ ]

[ ]

[ ]

[ ]

[ ]  ]

这里的新的向量矩阵 的形状与X 是一样的,都是一个形状为8 ×  256的矩阵。 , , 等都是1 ×  256的矩阵。

仔细看了下图18的架构图,鞋匠意识到自己好像并没有从最下面的部分来观察这个Transformer架构,下图20所标识的才是真正的开始节点。

图20,原始输入

这里的“Inputs”才是架构图的起点,表示的最原始的输入。沿用前一章节的例子就是“你我之间天涯咫尺”这句话。上面的“Input Embedding”就是要对这句话做词嵌入,形成一个词嵌入序列作为输入,即形成前面的输入向量矩阵X 。好在鞋匠在前面的章节中已经训练好了一个词汇表 。这里“Input Embedding”这个功能块要做的就是在词汇表 里找到这句话各个token对应的词嵌入,并最终形成输入向量矩阵X 。前面章节里,鞋匠是自己查找词汇表并抄录下来对应词嵌入的,这里他觉得谷歌的科学家们可以选择已经训练好的词汇表,或者选择更为优化的办法,也就是把词嵌入过程作为Transformer模型的一部分,在整个模型的训练过程中把每个token嵌入到词嵌入空间,形成与该模型的编码器和解码器结合的最为紧密的、原生的词汇表。

好了,位置信息有了,起点也补上了,那继续向上攀登吧!

多头自注意力

在前一个章节中,生成Q、K、V矩阵时,对于每个词嵌入来说,其所有维度都是被一视同仁地对待的。没有哪个维度比另一个维度地位更高。而现实情况是,一个词嵌入的所有维度可能是可以分类的。还是以前面8 ×  256的输入序列为例,想让AI模型捕捉到不同维度间可能的潜在的不同程度的复杂关系,分类是个不错的选择。以人类社会来举例,前面章节里注意力分值的计算方式就像是把所有中国人都以同样的维度来细化、区分,并在此基础上,计算人与人之间的关系,其实,这些关系可能再次经过细分才能表达更为真实的关系,比如说,山东人可能注重朋友关系,把和朋友相关的维度放到一起,而后在这些维度上单独计算人与人之间的关系,可能会找到一些更为准确的关系;东北人一般比较乐观,把态度相关的维度放到一起,而后在这些维度上再单独计算人与人之间的关系,可能会找到另一些更为准确的关系。对应到输入词嵌入序列的自注意力计算上,就是把维度进行分类,在分类的基础上分别计算注意力分值,捕捉更为细节的关联关系。如何分类呢?每个分类代表着什么呢?类似的问题已经被问过了,比如,词嵌入应该划分为几个维度?Q、K、V代表了什么实际意义?鞋匠认为人类以其对现实以及现实问题的深刻理解和深切体会找到了可能的有效方法来指导AI模型的构建,但AI模型在实际的训练过程中最终学习到了什么,构想那些模型设计所依赖的现实依据所代表的现实意义可能已经在训练过程中发生了巨大的变化。所以这里重要的不是找个什么现实意义来做维度分类的划分,而是认为进行分类划分是有意义的,并用实际行动把维度划分开来,以实验效果来验证这种模型的构建方式是否有效。于是,鞋匠把词嵌入的256个维度分成了4份,每份64个维度,当然也可以每份包含的维度数不同,很多时候都是依赖于设计者对问题的深度探索和对分类的实际验证,最终确定一个合适的分类的。鞋匠把这种分为多个类别,以便不同分类单独计算注意力分值,最终达到不同分类注意到不同细节的方法称为多头自注意力机制。图18中Multi-Head Attention表达的就是这里分类的意思,如图21所示。

图21,多头自注意力

以4个分类为例,鞋匠在纸上演算着最终的上下文向量C应该是如何计算的。在前面的章节中,WQ、WK和WV都是256 ×  256的矩阵,它们是整体计算上下文向量矩阵的Q权重矩阵、K权重矩阵和V权重矩阵。现在维度分成了4份,即每一份有64个维度,那么对应的WQ、WK和WV的行与列都应该被分别分成4份,即每一份的形状为:256/4 ×  256/4,即64 ×  64。鞋匠用以下符号来代表各自的4份小矩阵:

WQ1, WQ2, WQ3, WQ4

 WK1, WK2, WK3, WK4

WV1, WV2, WV3, WV4

以上矩阵的形状都为64 ×  64。鞋匠觉得这里需要说明下,前面章节中的WQ不等于这里WQ1, WQ2, WQ3, WQ4 4个小矩阵拼接在一起的形状,即

WQ  [WQ1, WQ2, WQ3, WQ4]

[256 ×  256]  [[64 ×  64], [64 ×  64], [64 ×  64], [64 ×  64]]

[256 ×  256]  [64 ×  256]

这是因为Q、K、V的权重矩阵都是方形矩阵,而其行数和列数都与词嵌入的维度相同(列数可以与词嵌入维度不同,见前一章节里关于升维和降维的解释说明),当词嵌入的维度分成4份而每一份缩成64维时,Q、K、V的权重矩阵行和列都缩成了64维,即都缩小了4倍,对方形来说就是缩了16倍。

相应的 中的各词嵌入的256个维度也应该被分为4份,每一份64维:

 = [    [ ]

[ ]

[ ]

[ ]

[ ]

[ ]

[ ]

[ ]  ]

= [ [x1(1), x1(2), x1(3), x1(4)]

    [x2(1), x2(2), x2(3), x2(4)]

    [x3(1), x3(2), x3(3), x3(4)]

    [x4(1), x4(2), x4(3), x4(4)]

    [x5(1), x5(2), x5(3), x5(4)]

    [x6(1), x6(2), x6(3), x6(4)]

    [x7(1), x7(2), x7(3), x7(4)]

    [x8(1), x8(2), x8(3), x8(4)]    ]

这里x1(1), x1(2), x2(1), x2(2)等的维度都是64维,矩阵形状为1 × 64。鞋匠把上面的每一列分别用x(1), x(2), x(3), x(4)来表示,则得到4个形状为8 × 64的矩阵。

按照前一章节计算上下文向量矩阵的算法,可以对每个小份进行如下计算,得出针对这一小份的上下文向量矩阵,最终把所有的小份拼接在一起,就可以得出 的新的表示,即 的新的上下文向量矩阵C。以x(1)为例,计算过程为:

Q1 = x(1)·WQ1 = [8 × 64]·[64 × 64] = [8 × 64]

K1 = x(1)·WK1 = [8 × 64]·[64 × 64] = [8 × 64]

V1 = x(1)·WV1 = [8 × 64]·[64 × 64] = [8 × 64]

可见,Q1,K1,和V1都是8 ×  64的矩阵。针对x (1)的注意力分值矩阵按照同样的算法可得:

Ascore1 = (Q1·K1^{T})/  = [8 × 64]·[64 × 8] = [8 × 8]

这里 =64代表K矩阵的列数或者维度,Ascore1是一个形状为[8 × 8]的矩阵。应用softmax函数,可得如下x(1)的注意力权重矩阵:

A1 = softmax(Ascore1) = softmax((Q1·K1^{T})/ ) = [8 × 8]

这里A1是一个形状为[8 × 8]的矩阵。继续运用前一章节的算法,得到x(1)的值矩阵,即x(1)的新的向量矩阵表示:

C1 = A1·V1 = [8 × 8]·[8 × 64] = [8 × 64]

同理,鞋匠得出了C2, C3, C4。它们都是形状为[8 × 64]的矩阵。将这些矩阵按照首尾相连的顺序拼接起来,就可以得到 的新的向量矩阵表示:

C = Concat(C1, C2, C3, C4)

= [[8 × 64]  [8 × 64]  [8 × 64]  [8 × 64]]

= [8 × 256]

Concat()在这里表示拼接函数,它是一种串行的首尾相连的连接方式。显然,这里的C和前一章节里计算的C的形状是一致。但两者所注意到的细节不一样,这里是通过分成4份分别计算注意力而得到的,而前一章节是作为一个整体计算统一的注意力而得到的。鞋匠在想,如果把这两个C加起来,是不是一种创新呢?这样,既体现了从整体层面“注意”到一些整体的全局细节,又“注意”到了一些分类的局部细节,即多头自注意力能够关注局部的依赖关系,而整体的单一自注意力可能捕捉到了全局依赖关系,两者结合则可以促进模型理解更深层次的语境信息。鞋匠不打算拘泥于这些细节,继续攀登是他的主要目标。

>>下一章节预告:《鞋匠的AI之旅》- 5. Transformer【中】

<<上一章节:《鞋匠的AI之旅》- 4. 自注意力

<<内容总章:《鞋匠的AI之旅》- 总章

标签:Transformer,鞋匠,AI,矩阵,嵌入,64,维度,输入
From: https://blog.csdn.net/derekhao/article/details/139633881

相关文章

  • CF717G Underfail
    传送门传说之下欧耶题意:给出一个长度\(n\)的字符串\(s\)。有\(m\)个单词\(p_1\simp_m\),每一个有价值\(a_i\)。用这\(m\)个单词和\(s\)中的一些子串匹配,要求\(s\)的每个字符匹配次数\(\lex\),每个子串最多匹配一次。每匹配上一个单词,总收益加上对应的价值。问......
  • 项目经理,你正在被AI取代
     在科技日新月异的今天,人工智能(AI)正以前所未有的速度渗透进我们的生活和工作,其影响无远弗届。从自动驾驶汽车到个性化推荐系统,AI的应用场景日益丰富。项目经理,这个被视为核心领导力的角色,如今正面临着前所未有的挑战——AI的崛起是否意味着项目经理的角色正在被取代?答案是......
  • etcd错误:Failed to defragment etcd member[127.0.0.1:2379] (context deadline excee
    etcd版本#etcdctlversionetcdctlversion:3.5.1APIversion:3.5问题在执行etcdctl--endpoints=http://127.0.0.1:2379defrag命令时,可能遇到错误:{"level":"warn","ts":"2024-06-12T18:20:17.444+0800","logger":"et......
  • 用ChatmoneyAI打造模拟面试服务
    引言想要跟上时代潮流,那就利用ChatmoneyAI在模拟面试行业赚钱吧!通过智能机器人提供个性化的面试辅导服务,帮助他人事半功倍地备战面试,同时也实现自己的财务自由。这个创新的商机不仅切合时代需求,还让你在激烈的市场竞争中脱颖而出。心动了吗?赶紧了解如何在这个领域实现赚钱梦想吧!......
  • 苹果WWDC24一文总结,携手OpenAi,开启Ai新篇章
    北京时间6月11日凌晨1点,苹果2024年全球开发者大会(WWDC)正式开幕。按照往年惯例,每年的WWDC大会,苹果都会将重心放在对新版系统的介绍上,本次也不例外,苹果发布了包括iOS18、iPadOS18、macOS15以及visionOS2等在内的一系列软件更新。除了例行的系统更新,发布会的最重头大戏就是AI......
  • 图片和视频都可以去水印啦,ai去水印的简单两种方法
    有时候我们希望移除视频中的水印,但又不擅长使用专业软件,结果反而花费了很多时间和精力。这种情况下该怎么办呢?今天给大家推荐两个方法:一.在线去水印Photopea是一款在线图像编辑器,界面和功能与Photoshop相似,无需下载软件即可使用。其强大的AI去水印功能使得去除图片水印变得非常......
  • 最新AI系统+ChatGPT网站H5源码+AI绘画系统,DALL-E3文生图,详细图文搭建教程/文档分析/识
    目录一、文章前言系统文档 二、系统演示三、系统功能模块3.1AI全模型支持/插件系统AI模型提问文档分析​识图理解能力3.2GPts应用3.2.1GPTs应用3.2.2GPTs工作台3.2.3自定义创建预设应用3.3AI专业绘画3.3.1文生图/图生图(垫图)3.3.2 局部编辑重绘3.3.3 ......
  • 贝壳找房: 为 AI 平台打造混合多云的存储加速底座
    贝壳机器学习平台的计算资源,尤其是GPU,主要依赖公有云服务,并分布在不同的地理区域。为了让存储可以灵活地跟随计算资源,存储系统需具备高度的灵活性,支持跨区域的数据访问和迁移,同时确保计算任务的连续性和高效性;此外,随着数据量的增长,元数据管理的压力也在逐渐加大。贝壳机器学习平......
  • mybatis的mapper中的sql涉及嵌套且外部引用导致的问题:XML fragments parsed from prev
    假设xxx.xml中有类似下方的sql嵌套:<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.xx......
  • 『SD』人脸修复-ADetailer(智能检测人脸并修复好)
    本文简介如果图片上有多张人脸,用局部重绘的方式来修复工作量就有点大了。那么有没有一种方法让AI自动识别人脸进行修复呢?有有有,这个插件叫ADetailer。安装ADetailer要使用ADetailer修复人脸需要3步:安装ADetailer插件下载识别人脸的模型在图生图里用它第1步,安装......