Abstract
使用LLM辅助的multimodal工作的架构特点以及运用。
Architecture
- Modality Encoder:
使用pre-aligned encoder将其他模态和LLM tokens对齐。
大分辨率[图像尺寸]图像训练出的encoder可以达到更好的效果
→\rightarrow→ 如何保证大分辨率输入?
→\rightarrow→ 1 direct scaling:将image变为新encoder对应的高分辨率后输入;2 patch division:将高分辨率图像切分成多个不同块,将各个块和压缩后低分辨率的整张图用于低分辨率的encoder上
对于encoder而言,参数量和训练数据并没有分辨率那么重要
- Pretrained LLM
增大LLM的参数量会带来一定程度的收益
- Modality Connector
LLM只接受语言类token
→\rightarrow→ 将其他模态和语言对齐
→\rightarrow→ 1 加入可学习的connector在Modality Encoder和LLM之间。
- token-level[在进入LLM前操作]:将encoder输出的特征使用connector转译成tokens然后直接和text tokens拼接输入给LLM。
- feature-level[在LLM内操作]:在LLM内部添加新的模块,让不同模态之间深度fusion。
connector的参数量一般和整个
→\rightarrow→ 2 使用expert model将其他模态转换成语言后直接交给LLM。将其他模态的输入直接转化为语言描述形式,然后输入给LLM。
Training Strategy
- Pretrain
需要大量的多模态数据对,旨在对齐不同模态并学习知识。
常见的pretrain方法:将encoder和LLM参数冻结,训练modality connector。
→\rightarrow→ 在不丢失pretrain知识的情况下,进行模态间的对齐。
对于short/noisy的数据,pretrain会使用低分辨率来加快训练过程;对于long/clean的数据,pretrain会使用高分辨率来减少幻觉(分辨率低 →\rightarrow→ 模态对应token数少 →\rightarrow→ 遐想空间大 →\rightarrow→ 发生幻想)。高质量数据pretrain时,解冻encoder参数可能会带来更好的对齐效果。
→\rightarrow→ 根据数据集的质量,来手动选择输入数据和encoder所对应的分辨率。高分辨率输入时,分割出的patch数目多[因为分割窗口大小不变],encoder输出的token数越多。
注意:每个patch使用的encoder参数是共享的,所以不会增大参数量。LLM每个token计算时使用的参数也共享,所以也不会增大参数量。
- Instruction Tuning (在LLM后加下游)
Supervised Finetune:需要成对的下游任务数据集;
Prompting:通过few-shot提高模型在某一特定任务上的能力;
Instruction Tuning:用一堆不同的任务去微调模型,让模型学会如何理解没有见过的任务,并在所有下游任务上都具备良好性能。[有点像agent]
每条训练数据分为三大块:1 描述任务的instruction(optional);2 input;3 output
训练目标类似LLM的auto-regression,和ground truth output靠近。
训练数据集收集方法:
-
data adaption:将已有高质量数据集拼凑在一起。Instruction由人工书写或GPT生成。
-
self-instruction:仅仅拼凑数据集无法模拟现实生活中人们多轮对话的需求。使用一些数据集给GPT,生成模拟的上下文数据。
-
Alignment Tuning
将模型和人类的喜好对齐。RLHF / DPO[不再需要训练额外的reward model]。
数据集:收集人类对于模型回复的feedback
Evaluation
- closed-set
问题的答案可以被预测,并且局限在有限的空间内。 - open-set
问题的答案非常灵活,细分为:manual score,GPT score和case study。case study是比较两个模型的回答之间的区别,来看是否有一个模型性能更佳。
HALLUCINATION
- pre-correction:数据集中加入幻觉数据,让模型在学习的过程中减少幻觉情况。
- in-process-correction:找出模型幻觉根源,修改模型架构
- post-correction:在output生成后修正存在的幻觉。