ChatGPT从入门到深入

描述

 

ChatGPT从入门到深入(持续更新中)

循环记忆输入

Recurrent Memory Transformer (RMT)

ChatGPT

总体思想:将长文本分段之后得到嵌入向量与记忆向量拼接,得到新的记忆向量之后与下一段再循环输入transformer。

注意:此论文实验结果在bert-base-cased(encoder-only上进行实验)

ChatGPT

CoLT5达到64K,GPT-4达到32K长度,而RMT在实验结果中长度加到4096个分段2048000词汇,效果依然强劲。

用提示词

Self-Controlled Memory (SCM)

ChatGPT

如上图所示,此方法号称可以将输入延申至无限长,具体流程为:

  1. 用户输入

  2. 判断是否需要从历史会话中获得记忆,提示词如下:

    给定一个用户指令,判断执行该指令是否需要历史信
    息或者上文的信息,或者需要回忆对话内容,只需要
    回答是(A)或者否(B),不需要解释信息:
    指令:[用户输入]
    
  3. 如果需要获取记忆,通过相关性(余弦相似度)、近期性分数相加对历史记忆进行排序

  4. 将记忆摘要

    以下是用户和人工智能助手的一段对话,请分
    别用一句话写出用户摘要、助手摘要,分段列
    出,要求尽可能保留用户问题和助手回答的关
    键信息。
    对话内容:
    用户:[用户输入]
    助手:[系统回复]
    摘要:
    
  5. 将记忆和输入拼接输入模型

    以下是用户和人工智能助手的对话,请根据历史
    对话内容,回答用户当前问题:
    相关历史对话:
    [历史轮对话内容]
    上一轮对话:
    [上一轮对话内容]
    ###
    用户:[用户问题]
    助手:
    
  6. 回复

注意:此论文中只进行了定性分析,没有定量实验。以下是效果图:

ChatGPT

词汇压缩

VIP-token centric compression (Vcc)

ChatGPT

该方法使得模型输入延申至128K,并在Encoder-Only、Encoder-Decoder两种模型架构上都进行了实验。

一句话描述思想:使模型输入长度独立于文本长度。

具体一点:

  1. 将当前问句视为vip-token
  2. 利用当前问句与历史记忆的关系,压缩历史记忆到模型输入长度,无论历史记忆有多长
  3. transformer层输出之后再进行解压缩

Encoder-Only架构表现:

ChatGPT

Encoder-Decoder表现:

ChatGPT

检索+交叉注意力

Unlimited Length Input Transformers (Unlimiformer)

ChatGPT

此方法只试用于Encoder-Decoder架构,其也称可以将输入长度延申至无限长。

思路如下:

  1. 将长文本分成多个部分,将每一段进行编码
  2. 利用query KNN检索长文本topN
  3. 解码器对相关段落编码后的隐藏状态进行交叉注意力
  4. 得到输出

可以看到此方法在长文本摘要任务上都取得了优异的结果

ChatGPT

 

累加

ALiBi(attention with linear biases),输出累加

ChatGPT

简单介绍一下ALiBi:

  1. 不再输入层保留位置向量
  2. 而在每层注入线性的偏移量,注意力分数从:
 

变成了:

可以看到ALiBi比Sinusoidal、Rotary、T5 Bias在长距离输入上效果都要好得多。

ChatGPT

mosaicml/mpt-7b模型利用ALiBi将输入长度扩展至了84k,核心的思想为一下几行代码:

all_hidden_states = () if output_hidden_states else None
for (b_idx, block) in enumerate(self.blocks):
    if output_hidden_states:
        assert all_hidden_states is not None
        all_hidden_states = all_hidden_states + (x,)
    past_key_value = past_key_values[b_idx] if past_key_values is not None else None
    (x, past_key_value) = block(x, past_key_value=past_key_value, attn_bias=attn_bias, attention_mask=attention_mask, is_causal=self.is_causal)
    if past_key_values is not None:
        past_key_values[b_idx] = past_key_value

即MPT会对上次得到隐藏状态与本次的输入进行相加。


审核编辑 :李倩


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分