1- 金融,比如预测股票(股市有风险,入市需谨慎),纯用K线做,我个人不太推荐

     2- 天气,比如预测云图,天气预报啥的

     3- 交通,早晚高峰,堵车啥的,车啥时候加油,啥时候充电之类的

     4- 医疗,看你病史和喝酒的剂量建模,看你会不会得痛风啥的。

     反正很多很多吧,应用的场合也是比较广的。

     RNN,一般来讲时序LLM,其实天然和RNN,LSTM这些玩意契合,因为有本身RNN就有时间步的概念,也能部分解决长距离依赖,缺点训练费劲,也做不大,要不咋干不过Transformer呢?

emporal Convolutional Networks ,使用卷积网络处理时序数据,具有更好的并行计算能力,但是为啥不用它呢,其实和它对NLP的道理差不多,通过野去做东西不适合序列化的任务。上下文和长距离它也不太行,想让它行就得做得更深,更复杂,效果还不一定好

      剩下就Transformer了,历史重担一肩挑,然后爱折腾人的黑手,又把时间序列任务强加给了Transformer...

      本次小周带你读论文就讲一下ICLR2024的一篇新论文

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_模态

     首先介绍这论文的主旨:

     1- Transformer啥都能干

     2- 能NLP,能ASR,还能VQA 

     3- 既然能整这么多的多模态,也不差加一个时间序列了吧?

     其实主旨真就是我介绍的这么3点

    我们看一下时间序列和Transformer不搭调的地方

    比如我随便找个时间序列曲线

    

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_数据_02

     随便拿几个点来训练行吗?那肯定不行啊,因为点和点要有相对关系的,那拿一些段来训练呢?

      拿一段来提取特征是可以的,但是如何把NLP里的东西和一段走势做mapping呢,一个最简单的办法就是给个文字描述对应一个波段或者几个波段

   

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_模态_03

    就单单框住着一个小波段可能就包含很多解,比如波峰,最高点,次高点,上升中,下降之类的。

    不多模态,不改网络架构,直接拿时间序列硬往Transformer里灌来训练行不行?

 

  1. 顺序信息的处理:在NLP中,Transformer通过位置编码来引入序列中的位置信息。但对于时序数据,特别是时间序列数据,时间步之间的依赖关系往往比文本中的单词顺序更复杂和多样化。标准的位置编码可能不足以捕捉这些复杂的时间依赖关系。
  2. 长序列处理:(才发现长序列这个系列,我还没写完,我都忘了...), 金融市场的高频交易数据或传感器数据通常非常长,这对标准Transformer来说是一个挑战。
  3. 是序列长度。这在处理特别长的时序数据时会导致计算和内存资源的极大消耗。例如,金融市场的高频交易数据或传感器数据通常非常长,这对标准Transformer来说是一个挑战。

  4. 数据稀疏性:时序数据通常具有较强的稀疏性和不规则性。例如,一些传感器数据可能在某些时间段没有记录或记录不完整,这在标准Transformer模型中处理起来较为复杂。

     那我们就另辟蹊径按着多模态来训练。

   

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_04

     我们知道如果训练Blip2(上图)训练的时候是不折腾LLM的,采用了一个Q-Former来做文本和图像的模态对齐,其实Time-LLM用的也是类似这样的一个思想。

     

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_05

    如上图所示,也是冻住LLM(下面那个其实是Embedding,不是LLM,论文这块应该是画错图了)

     我们按着图里的流程走一遍

    先把一个长周期的时序数据,分成不同的patches,分的逻辑参考下面的式子

     

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_数据_06

     通道长度为T,Lp为一小块,S是重叠的部分,代入上式就可以把一段T的时序数据分成P个。

     

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_07

     每个patch给过一下线性层,就给做变型

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_08

    dm是转换后的维度,就是P个dm维度的向量乘起来的矩阵

     接着过一个论文里重点强调的线性层Patch Reprogramming了

      我们知道一般来讲现在的LLM基本都动不动就5万10万的字库,然而我们要做的是跟时序相关的任务,比如"狗",“外星人”,“俄乌战争”这些字段跟时序预测有关系吗?那必然没关系,所以我们要用一些先验的知识,去把LLM的字库从V维度,降为到V'的维度(我查了一下代码最后大概选了1000个和时序有关的词)

     然后经过了一个指针映射


多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_09

),这个就是Patch Reprogramming的含义。

      所以你的词表的表征矩阵也从(D就是embedding的维度,比如768)


多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_模态_10

     变为了

     

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_模态_11

      V'<<V,缩小到原来的50分之1甚至百分之1,极大的节省了算力和复杂度。

     字又少,又能描述好这段时序patch所处的时间态势,比如"短暂上升之后缓慢下降",然后就把模态拉齐

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_12

      文字描述和patch 的time series进入到QKV里算去了

     

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_模态_13

 

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_14

     这块应该不用讲了,对Transformer有疑问的同学可以看我之前Transformer的文章系列。

 小周带你读论文-2之"草履虫都能看懂的Transformer老活儿新整"Attention is all you need(1) (qq.com)

     为了有更好的训练效果

 它提出了一个重要的思想叫做Prompt-as-prefix(PAP),可以认为是对于某一段趋势的描述的语义增强,比如下图



多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_15

     这个图就是对ETT数据的一段,描述,整个prompt分为3个大块

    第一块是描述这段时序数据属于什么领域的【Domain】,为啥要这么干呢,因为你在训练的时候很可能一个模型要有多重数据,Domain作为分类不同的时序数据的tag,防止不同的数据阈值的不同(最后肯定得做Norm)

    第二块是【Instruction】,描述这个训练任务要预测几步(H),和给了几步的时序数据(T)

    第三块就是对这段给过去的数据的一个描述,主要是最大最小,均值方差,MAE,MSE啥的,普通的时序预测咋算,这个就咋描述

    其实从这一步就可以看出来虽然这个方法可行,但是挺难的,就是训练数据预处理这块,至少针对不同的patch进行不同的描述就够折腾一阵的,虽然可以用一些时序库来做预处理,但是后期校验也是麻烦事。

     有了语义增强的PAP加上刚才融合了QKV生成的关于这段时间序列的描述

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_16

     把这两段一起拼接放进一个标准LLM去预测,预测的结果再经过一个output的project来生成后续的时序序列,是的,监督学习,然后求LOSS

     讲完了,总体看其实思路并不难,冻住LLM,只用少量的时序数据就可以快速训练,但是其实我刚才也讲了,前期的数据准备工作,包括PAP是很复杂的,需要有很好的数据工程基础。

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_时间序列_17

    

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_数据_18

      论文里给出的Zeroshot和fewshot的结果都还成,当然他没选sota,比如timemix,time-Gen啥的一起来对比,要发论文,也可以理解

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_数据_19

      Googgle其实Timefm也发了,如果大家有兴趣可以看一下,总体大抵是类似的,等其他的模态都卷完了,估计会有更多人入坑Transformer的时序模态预测的生意里面。

      本节完。

   

多模态MLLM都是怎么实现的(9)-时序LLM是怎么个事儿?_数据_20