「多模态大模型」解读 | 突破单一文本模态局限
编者按:理想状况下,世界上的万事万物都能以文字的形式呈现,如此一来,我们似乎仅凭大语言模型(LLMs)就能完成所有任务。然而,理想很丰满,现实很骨感——数据形态远不止文字一种,大多数数据也不是以文本的形式呈现的,我们日常接触到的数据涵盖了图像、视频、音频、语音(images or video, audio, speech)等多种形态,形式丰富多元。因此,能够同时理解和处理多种数据形式的多模态大语言模型(Multimodal Large Language Model,MLLM)应运而生。
构建 MLLM 的关键在于将大语言模型与各种模态的编码器(如图像编码器)相结合,实现跨模态的语义一致性映射。著名的 CLIP 模型就是一个典范,它能将语义相似的图像和文本映射到向量空间中的相邻位置。通过这种方式,机器不仅能够“读懂”图像、视频的内容,更能在多模态数据的基础上展开复杂的推理、创作等高级认知活动。
本文阐述了多模态技术的重要意义,深入剖析了 MLLM 的核心架构和运作原理,并盘点了三种主流的多模态系统构建方式。无疑,这是一篇观点透彻,内容丰富,极具科普价值的佳作。相信通过这篇文章,各位读者一定能够对 MLLM 有更加全面深入的了解。
作者 | Ignacio de Gregorio
编译 | 岳扬
尽管 AGI 可能不会很快出现,但大语言模型确实正通过一种名为“多模态”的形式迎来革新。这一进展使前沿模型从单一的文字处理模型进化为能够同时处理多种数据类型的全能模型,即所谓的多模态大语言模型(MLLMs)。
当下,诸如 ChatGPT、Gemini、Claude 等许多模型,已不再局限于大语言模型(LLMs)范畴,而是升级为多模态大语言模型(MLLMs),因为它们具备处理文本、图像的能力,甚至部分情况下还能处理视频。
然而,在进一步探讨之前,我们有必要思考:我们为什么需要多模态模型?
01 为何我们需要多模态?
理想状况下,世界上的万事万物都能以文字的形式呈现,如此一来,我们似乎仅凭大语言模型(LLMs)就能完成所有任务。然而,理想很丰满,现实很骨感——数据形态远不止文字一种,大多数数据也不是以文本的形式呈现的,我们日常接触到的数据涵盖了图像、视频、音频、语音(images or video, audio, speech)等多种形态,形式丰富多元。
事实上,使用 AI 解决那些最具挑战性的问题时,恰恰需要依赖多模态的处理能力。
试想一下,当我们使用虚拟助手(virtual assistant)时,可能希望它能识别并解答手部新出现的划痕或炎症问题;或是当我们在亚洲旅行途中偶遇一道陌生美食,期待它能生动描述这道佳肴的具体细节。

source: https://github.com/kohjingyu/gill?tab=readme-ov-file
那么,究竟如何才能搭建出一个多模态大语言模型(MLLM)呢?
02 深入解析多模态模型架构
简而言之,目前大多数多模态大语言模型(MLLMs)的核心构成包括两大部分:大语言模型(LLM)及另一种模态的编码器。让我们逐步揭开其神秘面纱。
2.1 大语言模型(LLMs),AI 领域的中流砥柱
LLMs 这类模型属于 sequence-to-sequence 架构,其工作原理为接收文本输入,然后输出统计学上最有可能的后续序列。
换言之,它们通过不断预测下一个词汇,生成流畅且文采斐然的文本。自 2022 年 ChatGPT 发布以来,大语言模型迅速成为了全球逾 2 亿用户手中的生产力利器,同名应用程序也一举创下了史上增长速度最快的 C 端应用记录。
尤其值得一提的是,它们卓越的模拟逻辑推理(imitate reasoning)和激发创新思维(enhance creative processes)的能力,激起了业界关于能否将此类系统作为基础架构,应用于更为复杂多变、不局限纯文本处理场景的广泛讨论。
然而,要实现这一目标,还需引入一个关键的辅助模块。
2.2 编码器:连接至多元数据世界的桥梁
大语言模型(LLMs)主要处理文本(在某些情况下也会处理代码,因其与自然语言有相似的性质)。因此,要处理图像甚至视频等其他数据类型,模型需引入另一个新部件 —— 编码器(encoder)。
其原因在于,LLMs 属于纯解码器架构的 Transformer,意味着它们会采用一种特殊手法来对数据进行编码。
但,“对数据进行编码”是什么意思呢?
无论处理的是文本里的字词(words)或是图像中的像素点(pixels),对输入序列进行编码的核心思想是将其转化为一系列数字,即所谓的向量嵌入(vector embeddings)。这种向量形式的表征(representation),能够捕捉输入序列的语义信息。
特别是 LLMs 拥有 embedding look-up matrices(译者注:就像是一个巨大的字典,每个词汇对应着一个在高维空间中的向量表征。例如,假设有一个包含 10000 个词汇的词汇表,每个词汇都有一个 50 维的向量表征,那么这个 embedding look-up matrices 就会是一个 10000 行、50 列的矩阵。每一行对应词汇表中的一个词,存储了该词的 50 维向量。在模型处理文本时,它会根据输入内容的词汇索引在这个矩阵中查找相应的向量,作为该词的嵌入表征。)。这些矩阵的作用是从输入序列的令牌中,提取出对应的词嵌入。换言之,模型在训练阶段会学习如何将输入的词(或tokems)转换为向量表征(即嵌入),这一过程是通过优化模型参数完成的,在推理阶段,当新的输入序列传入模型时,模型会直接使用已学习到的参数来产生相应的嵌入向量,而不需要再经历一个单独的、显式的编码步骤。
这是一种经济高效的数据编码方式,无需每次处理都启动编码网络(encoder network)。
对数据进行编码(Encoding data)有两种基本形式:独热编码(one-hot)或稠密编码(dense)。独热编码(One-hot encoding)的原理是,把每个词汇转换成一串数字,其中大部分数字为‘0’,而唯一的一个数字标记为‘1’:

source: https://medium.com/intelligentmachines/word-embedding-and-one-hot-encoding-ad17b4bbe111
但就 MLLMs 而言,嵌入是 “稠密(dense)” 的,这意味着,现实生活中相近的概念在向量空间中也会拥有相近的向量表征,包括向量的大小和方向,反之亦然:

source: https://arize.com/blog-course/embeddings-meaning-examples-and-how-to-compute/
为了达成目标,我们需要编码器 —— 一种基于 Transformer 设计的工具,它的任务是接收各种输入数据,并巧妙地将其转化为向量嵌入。举个例子,当编码器面对的是图像时,它能够将图像信息转换为“图像嵌入(image embedding)”形式。
不管处理的是何种数据模态,我们的目标始终一致:构建出一个向量空间,在这里,现实中意义相近的概念会被映射为接近的向量,而意义迥异的概念则会转化成相距甚远的向量。 通过这种方式,我们把对世界语义的理解转变成了一项数学问题;向量间的距离越短,意味着它们代表的概念含义越接近。
最关键的是,这种处理方法并不局限于文本领域,图像等其他数据模态也同样适用,这正是其独特魅力所在。

Encoding images. Image generated by author
但对于图像来说,事情就变得棘手了。
我们不仅希望图像的嵌入过程(image embedding)能将相似的图像(比如哈士奇的图像)归类到相似的向量类别中,而且还希望这些向量与同一图像的文字描述也保持相似性。例如,如下图所示,一幅描绘波浪的图像和一段描述相同场景的文本,尽管来自不同的模态,但应该具有相似的向量嵌入。
为了达到这一目的,OpenAI 等实验室开发了像 CLIP 这样的模型,这些模型创建了 mixed embedding spaces(译者注:在 mixed embedding spaces 中,不同模态的输入数据通过特定的编码器映射到同一向量空间内,这样即使数据的原始模态不同,也可以基于其内在的语义相似性进行比较。),在这个向量空间中,描述语义(text describing semantically)上概念相似的图像和文本会被赋予相似的向量,从而实现了跨模态的语义一致性。

source: https://blog.dataiku.com/leveraging-joint-text-image-models-to-search-and-classify-images
由于 CLIP 这类模型的出现,如今的机器已经具备了处理图像并洞察其含义的能力。
Masked AutoEncoders(MAEs)是另一种训练图像编码器(image encoders)的主流方法。在这种情况下,模型接收到的是一幅部分信息被掩盖的图像,模型需要重建完整图像。这些编码器之所以强大,是因为它们必须学会从残缺的信息中推断出“遮挡之下”的真相(what’s hiding behind the masked parts),即识别出“被隐藏的部分”是什么(what’s missing)。
不过,对于多模态语言模型(MLLMs)而言,CLIP 编码器的应用更为广泛,主要是由于其与文本处理之间存在着天然的联系。
然而,如果我们希望建立一个像 ChatGPT 那样,能够同时处理图像和文本的模型,我们又该如何着手搭建这样一个系统呢?
03 多模态系统的主要类型
创建多模态系统主要有三种方法。
3.1 从通过工具实现多模态系统到真正的多模态大语言模型(MLLM)
有三类方法构建 MLLM 系统,但仅两类可称得上是真正的多模态大语言模型。
- Tool-Augmented LLMs:这类方案是将大语言模型(LLMs)与可以处理其他类型数据的外部系统相结合。这些系统并不算作多模态大语言模型,因为我们仅仅是通过集成另一个模型或工具来扩展大语言模型的功能。以 ChatGPT 的语音/音频处理功能为例,实际上它是将大语言模型与语音转文本(Speech-to-Text)及文本转语音(Text-to-Speech)两个独立模型相连。这样,每当模型接收到音频,就将其转交给这些系统处理,而非真正的多模态大语言模型直接处理数据。
- Grafting:该方法是指将两个已经训练完成的组件 —— 编码器(encoder)和大语言模型(LLMs) —— 拼接起来形成多模态大语言模型。因为它具有很高的成本效益比,这种方法在开源社群中极为流行,通常只需训练一个适配器(adapter)来连接这两个预训练模型。
- Native MLLM(Generalist Systems):此途径为那些最热门且财力充足的人工智能研究机构所采纳。其核心在于一开始就将大语言模型和编码器连接在一起,从零开始进行训练。虽然这种方式能带来最优效果,但同时也是最烧钱的。GPT-4V(ChatGPT)、Grok 1.5V、Claude 3 与 Gemini 等皆属此类方法的应用实例。
我们或许还可以考虑另一种方法,那就是在不使用 separate encoder(译者注:在多模态或多任务学习架构中独立处理不同类型输入数据的编码器。) 的情况下构建MLLM,Adept 的 MLLMs 就属于这种情况。不过,使用这种方法构建的多模态模型相当罕见。
不论是选择第二种还是第三种方案(再次强调一次,第一种方案其实并非纯粹的 MLLM 模型,而是一套 MLLM 系统),它们的工作原理是什么呢?
3.2 The MLLM pipeline
我们将重点讨论最常见的 MLLM 方案(即结合图像编码器(image encoder)和 LLMs 的第二种方案)构建能同时处理图像与文本的多模态模型。有一点需要在此强调,这种方案只要更换编码器,也能处理其他模态的数据,比如使用音频编码器处理音频信号。 LLMs 因其具备与用户交流及在某些特定情形下处理复杂问题的能力,始终是不可或缺的组成部分。
向 MLLM 输入数据,通常遵循两种模式:
- 纯文本:在这种情况下,我们仅向模型输入文本信息,因此我们只希望让模型如同常规 LLM 一样运行。若想深入了解这一过程的具体细节,请阅读此处有关 Transformers 的博文(https://thewhitebox.ai/transformers-the-great-paradigm-shift/ )。
- 图文并茂:在此情形下,模型接收到的是一张图片及其相关的文本描述。接下来,我们将重点探讨这种情况。
以 Sphinx 为例,这是一个开源的多模态 LLM,让我们以此为参照。

source: https://arxiv.org/pdf/2311.07575.pdf
- 目前,我们手头的数据是一幅描绘狮身人面像的卡通图像,以及对该图像的文本描述,我们希望 MLLM 能够同时解析这两部分内容,并能够描述图像所描绘的内容。
- 随后,图像被划分为若干小块(本例中,他们还额外生成了一个低分辨率的小块(patch),以较低的分辨率表示完整的图像)
- 这些小块随后被送入图像编码器,由其进行处理并生成相应的嵌入向量(patch embeddings)。每一项嵌入都精准地反映了其所代表图像区域的含义。
此时,会有两种情况发生。如果采用的是先分别预训练图像编码器和 LLM,后续再结合的方法,一般会使用一个适配器(adapter),将图像嵌入转化为与 LLM 嵌入空间相匹配的形式。而如果使用的是通用方法,图像编码器在设计之初就已具备为 LLM 生成有效嵌入的能力。
- 与此同时,图像的文本描述同样被输入至模型中。在本例中,文本序列(text sequences)遵循了我们之前在介绍 Transformer LLMs 时所述的流程(分词、查找嵌入向量、拼接位置嵌入(positional embedding)以及执行插入(insertion)操作)
- 至此,LLM 将所有输入整合为单一序列,并依据图像与文本输入共同提供的信息,生成新的序列。
04 Final Thoughts
多模态大语言模型(Multimodal Large Language Models,简称 MLLMs)是当前生成式人工智能最先进技术的重要组成部分。MLLMs 凭借单一模型即可实现多种模态数据的处理,开启了以前只能想象的许多前景广阔的应用场景。
多模态也拉近了机器与人类的距离,因为人类生来就是通过多种感官实现多模态的。所以,机器迟早会模仿人类的这一特性。
在追求构建通用人工智能(Artificial General Intelligence,简称 AGI)或超人工智能(Artificial Super Intelligence,简称 ASI)的过程中,多模态起着至关重要的作用。因为人类之所以能够成为今天的智能生物,很大程度上归功于我们具备处理和理解多种模态数据的能力,这让我们能够适应并驾驭周遭的生存环境。
因此,多模态对于机器人而言是进入物理世界的关键要素,它使得机器能够像人类一样观察、感知、聆听并和我们所处的物理世界进行互动。
Thanks for reading!
Ignacio de Gregorio
I break down frontier AI systems in easy-to-understand language for you. Sign up to my newsletter here: https://thetechoasis.beehiiv.com/subscribe
END
原文链接:
https://thewhitebox.ai/mllm-multiple-modalities-one-model/
相关文章:
「多模态大模型」解读 | 突破单一文本模态局限
编者按:理想状况下,世界上的万事万物都能以文字的形式呈现,如此一来,我们似乎仅凭大语言模型(LLMs)就能完成所有任务。然而,理想很丰满,现实很骨感——数据形态远不止文字一种&#…...
Redis深度解析:核心数据类型与键操作全攻略
文章目录 前言redis数据类型string1. 设置单个字符串数据2.设置多个字符串类型的数据3.字符串拼接值4.根据键获取字符串的值5.根据多个键获取多个值6.自增自减7.获取字符串的长度8.比特流操作key操作a.查找键b.设置键值的过期时间c.查看键的有效期d.设置key的有效期e.判断键是否…...
C语言 指针和数组——指针的算术运算
目录 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针的算术运算 指针加上一个整数 指针减去一个整数 指针相减 指针的关系比较运算 小结 指针变量 – 指针类型的变量,保存地址型数据 指针变量与其他类型…...
[C++][CMake][CMake基础]详细讲解
目录 1.CMake简介2.大小写?3.注释1.注释行2.注释块 4.日志 1.CMake简介 CMake是一个项目构建工具,并且是跨平台的 问题 – 解决 如果自己动手写Makefile,会发现,Makefile通常依赖于当前的编译平台,而且编写Makefile的…...
CCD技术指标
CCD尺寸,即摄象机靶面。原多为1/2英寸,现在1/3英寸的已普及化,1/4英寸和1/5英寸也已商品化。CCD像素,是决定了显示图像的清晰程度,。CCD是由面阵感光元素组成,每一个元素称为像素,像素越多&…...
SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存
文章目录 1. 前言2. 缓存2.1 什么是缓存2.2 使用缓存的好处2.3 缓存的成本2.4 Spring Cache和Redis的优点 3. Spring Cache基础知识3.1 Spring Cache的核心概念3.2 Spring Cache的注解3.2.1 SpEL表达式3.2.2 Cacheable3.2.3 CachePut3.2.4 CacheEvict 4. 实现查询数据缓存4.1 准…...
【算法】(C语言):冒泡排序、选择排序、插入排序
冒泡排序 从第一个数据开始到第n-1个数据,依次和后面一个数据两两比较,数值小的在前。最终,最后一个数据(第n个数据)为最大值。从第一个数据开始到第n-2个数据,依次和后面一个数据两两比较,数值…...
iOS项目怎样进行二进制重排
什么是二进制重排 ? 在iOS项目中,二进制重排(Binary Reordering 或者 Binary Rearrangement)是一种优化技术,主要目的是通过重新组织应用程序的二进制文件中的代码和数据段,来提高应用程序的性能ÿ…...
CentOS中使用SSH远程登录
CentOS中使用SSH远程登录 准备工作SSH概述SSH服务的安装与启动建立SSH连接SSH配置文件修改SSH默认端口SSH文件传输 准备工作 两台安装CentOS系统的虚拟机 客户机(192.168.239.128) 服务器(192.168.239.129) SSH概述 Secure S…...
spring @Autowire注解作用
终于有人把Autowired注解讲清楚了,赞!!!_autowired-CSDN博客...
密码学原理精解【5】
这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密: e k ( x ) ( x k ) m o d 26 解密: d k ( x ) ( x − k ) m o d 26 以z_{…...
Unity3D 资源管理YooAsset原理分析与详解
引言 Unity3D 是一款广泛应用于游戏开发、虚拟现实(VR)、增强现实(AR)等领域的强大游戏开发引擎。在开发过程中,资源管理是一项至关重要的任务,它直接影响到游戏的性能和用户体验。YooAsset 是一个基于 Un…...
npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法
npm install puppeteer 报错如下: npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated. Use PUPPETEER_DOWNLOAD_BASE_URL instead. npm ERR! Error: ERROR: Failed to set up Chrome v126.0.6478.126! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to sk…...
浙大版PTA《Python 程序设计》题目集 参考答案
浙大版PTA《Python 程序设计》题目集 参考答案 本答案配套详解教程专栏,欢迎订阅: PTA浙大版《Python 程序设计》题目集 详解教程_少侠PSY的博客-CSDN博客 01第1章-1 从键盘输入两个数,求它们的和并输出 aint(input()) # 输入a的值 bint(…...
“拆分盘投资:机遇与风险并存
一、引言 随着互联网技术的日新月异,金融投资领域迎来了前所未有的变革,其中拆分盘作为一种新兴的投资模式,正逐渐进入公众的视野。其独特的价值增长逻辑和创新的投资机制,为投资者开辟了新的财富增值渠道。本文旨在深入探讨拆分…...
Java面试题系列 - 第2天
题目:Java中的线程池模型及其配置策略 背景说明:在Java多线程编程中,线程池是一种高效的线程复用机制,能够有效管理和控制线程的创建与销毁,避免频繁创建和销毁线程带来的性能开销。理解和掌握线程池的配置策略对于优…...
AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!
一、前言 2017年,谷歌团队推出一篇神经网络的论文,首次提出将“自注意力”机制引入深度学习中,这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时,Transformer也随之进入大众视野。一夜之间&…...
QT+OpenCV在Android上实现人脸实时检测与目标检测
一、功能介绍 在当今的移动应用领域,随着技术的飞速发展和智能设备的普及,将先进的计算机视觉技术集成到移动平台,特别是Android系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…...
常见网络攻击方式及防御方法
1. DDOS攻击(分布式拒绝服务攻击) 概念:借助于C/S(客户端/服务器)技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDOS攻击,从而成倍地提高拒绝服务攻击的威力。防护方…...
使用 ESP32 实现无线对讲机功能涉及音频采集、音频传输以及音频播放等多个方面。实现无线对讲机功能的基本步骤和示例代码。
硬件准备 两个 ESP32 开发板两个 MAX9814 麦克风模块(或其他兼容的模拟麦克风模块)两个 MAX98357A DAC 模块(或其他兼容的音频放大器模块)扬声器 接线 麦克风模块 -> ESP32 ADC 引脚ESP32 DAC 引脚 -> 音频放大器模块 -&…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
