从零学习大模型(十三)-----LayerDrop 和 Layer Pruning

news2024/11/4 21:37:42

LayerDrop 和 Layer Pruning 都是神经网络模型简化技术,目的是通过减少网络中的层数来提高效率和降低计算开销,但它们在实现方法上有所不同。

LayerDrop

Transformer 模型以及其他深层神经网络由于其层数深、参数众多,容易导致过拟合,并且训练时间和推理时间成本都很高。为了减少这些问题,同时让模型更具弹性,研究者们提出了 LayerDrop 技术,它可以让网络学习如何应对不同层的丢失情况,进而提高模型在缺失信息条件下的能力。LayerDrop 可以让模型具备“简化结构”的能力,而不影响模型的整体性能。

基本概念

LayerDrop 的核心思想是对网络中的层进行“Dropout”,类似于在训练过程中对神经元进行随机丢弃。不同之处在于,LayerDrop 是在模型的宏观结构上起作用,随机跳过一些完整的层,而不是 Dropout 那样对层内部的神经元进行操作。

具体来说,LayerDrop 的执行包含以下几个方面:

  • 随机丢弃网络层:在训练过程中,每次前向传播时会随机跳过一些层,而非完整遍历所有层。这种随机性会在每次训练中构建出不同的模型路径。
  • 保持模型的整体目标不变:LayerDrop 训练时虽然随机跳过部分层,但模型的训练目标保持不变,模型仍然被训练来优化原本的目标函数。
  • 增强网络弹性:通过强制模型学会在缺失某些层时依然要保持性能,LayerDrop 增强了网络的弹性和泛化能力,这样在推理阶段,即使模型由于部署需要而进行层的裁剪,也能保持较好的性能。

LayerDrop 的实现步骤

  1. 层的选择和丢弃
    • 在模型训练的每次前向传播中,LayerDrop 会以某个概率(例如 10% 或 15%)随机选择某些层并跳过它们。
    • 选择的策略可以是“随机丢弃”,也可以是“均匀丢弃”,即确保每几层中都有某个层被丢弃。通常的做法是在多层 Transformer 或 RNN 这样的模型中,以一定概率丢弃某些层。
  2. 在残差连接(Residual Connections)中的应用
    • 对于 Transformer 这种包含大量残差连接的模型,LayerDrop 的设计还必须考虑残差连接的机制。因为丢弃某些层后,残差路径必须保持有效,以免出现维度不匹配的问题。
    • LayerDrop 丢弃某一层时,残差连接将直接跳过该层,将输入数据直接传递给后面的层。
  3. 概率控制与分布
    • LayerDrop 丢弃层的概率可以根据模型的深度进行调节。例如,模型越深,可以设置更高的丢弃概率来减少训练负担。
    • 这种基于深度的概率控制方式保证了网络的关键层不被丢弃,降低了由于重要层丢失导致模型性能下降的风险。

LayerDrop 的代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F
import math

def get_device():
    # 检测是否有 GPU 可用,否则使用 MPS(Mac 上的 Metal 支持)或 CPU
    if torch.cuda.is_available():
        return torch.device("cuda")
    elif torch.backends.mps.is_available():
        return torch.device("mps")
    else:
        return torch.device("cpu")

# 定义 Transformer 编码层,加入 LayerDrop
class LayerDropTransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, layerdrop_prob=0.2):
        super(LayerDropTransformerEncoderLayer, self).__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout)
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.linear2 = nn.Linear(dim_feedforward, d_model)

        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.dropout2 = nn.Dropout(dropout)

        self.activation = F.relu
        self.layerdrop_prob = layerdrop_prob

    def forward(self, src, src_mask=None, src_key_padding_mask=None):
        # 判断是否要丢弃该层
        if self.training and torch.rand(1).item() < self.layerdrop_prob:
            return src  # 直接跳过该层,返回输入

        # Self-attention 操作
        src2 = self.self_attn(src, src, src, attn_mask=src_mask, key_padding_mask=src_key_padding_mask)[0]
        src = src + self.dropout1(src2)
        src = self.norm1(src)

        # Feedforward 网络
        src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))
        src = src + self.dropout2(src2)
        src = self.norm2(src)
        return src

# 定义一个包含多个编码层的 Transformer 编码器
class LayerDropTransformerEncoder(nn.Module):
    def __init__(self, encoder_layer, num_layers):
        super(LayerDropTransformerEncoder, self).__init__()
        self.layers = nn.ModuleList([encoder_layer for _ in range(num_layers)])
        self.num_layers = num_layers

    def forward(self, src, mask=None, src_key_padding_mask=None):
        output = src

        for layer in self.layers:
            output = layer(output, src_mask=mask, src_key_padding_mask=src_key_padding_mask)

        return output

# 定义完整的 Transformer 模型
class LayerDropTransformerModel(nn.Module):
    def __init__(self, ntoken, d_model, nhead, num_encoder_layers, dim_feedforward, dropout, layerdrop_prob):
        super(LayerDropTransformerModel, self).__init__()
        self.embedding = nn.Embedding(ntoken, d_model)
        encoder_layer = LayerDropTransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout, layerdrop_prob)
        self.encoder = LayerDropTransformerEncoder(encoder_layer, num_encoder_layers)
        self.d_model = d_model
        self.fc_out = nn.Linear(d_model, ntoken)

    def forward(self, src, src_mask=None, src_key_padding_mask=None):
        src = self.embedding(src) * math.sqrt(self.d_model)
        output = self.encoder(src, mask=src_mask, src_key_padding_mask=src_key_padding_mask)
        output = self.fc_out(output)
        return output

# 测试模型的运行
if __name__ == "__main__":
    # 模型参数定义
    ntoken = 1000  # 词汇表大小
    d_model = 512  # 嵌入维度
    nhead = 8  # 多头注意力头数
    num_encoder_layers = 6  # 编码层数
    dim_feedforward = 2048  # 前馈网络的维度
    dropout = 0.1  # Dropout 概率
    layerdrop_prob = 0.2  # LayerDrop 概率

    # 创建模型
    device = get_device()
    model = LayerDropTransformerModel(ntoken, d_model, nhead, num_encoder_layers, dim_feedforward, dropout, layerdrop_prob).to(device)

    # 创建输入数据(假设序列长度为 10,batch 大小为 32)
    src = torch.randint(0, ntoken, (10, 32)).to(device)

    # 前向传播
    output = model(src)
    print(output.shape)  # 输出形状应为 (序列长度, batch 大小, 词汇表大小)

LayerDrop 在训练中的作用

LayerDrop 通过强制模型在不同深度的网络结构上学习,让模型适应不同的网络路径。在模型训练阶段随机丢弃某些层可以起到以下几个作用:

  • 降低过拟合:LayerDrop 可以看作是对层的正则化,防止模型对特定层的参数过度依赖,降低过拟合的可能性。
  • 增强模型的鲁棒性:通过随机丢弃层,LayerDrop 让模型在推理时更能够适应不同的深度变化,这对深度模型的压缩和部署非常有帮助。
  • 提高泛化能力:由于模型需要在每次前向传播中应对不同的层被丢弃的情况,它会被训练得更具泛化能力,从而对未知数据的适应性更强。

LayerDrop 与 Dropout 的对比

  • Dropout:在训练过程中随机丢弃神经元(即某一层中的部分节点),主要针对细粒度的神经元层级。
  • LayerDrop:在训练过程中随机丢弃整个网络层,作用于宏观结构层面,主要用于深层次的 Transformer 或 RNN 之类的模型。

两者的目标都是为了减少模型的过拟合并提高模型的鲁棒性,但作用的粒度不同。LayerDrop 适合用于非常深的模型,尤其是当整个层的作用可能存在冗余时,而 Dropout 则通常应用于全连接层或卷积层中来提高细粒度的正则化效果。

Layer Pruning

基本概念

Layer Pruning 的目标是通过确定网络中对最终输出影响不大的层,将其剪除,以此来简化模型的结构。它可以在训练结束后对模型进行后处理,以减少参数量和计算复杂度。通过移除网络中某些层,可以达到以下效果:

  • 降低推理时间:通过减少不必要的层,可以降低推理时的计算成本,加快推理速度。
  • 减少存储需求:剪枝后的模型参数变少,所需存储资源也相应降低。
  • 提高在资源受限设备上的可用性:如移动设备或嵌入式设备,这些设备具有有限的计算能力和内存。

Layer Pruning 的具体过程

层的重要性评估

Layer Pruning 的第一步是评估每个层对模型整体性能的贡献。重要性评估有多种方法,常见的有:

  • 基于梯度的评估:利用梯度来计算每一层对损失函数的敏感性。梯度较小的层被认为对模型贡献较低,可以考虑剪除。
  • 基于激活值的评估:衡量层输出的激活值大小。如果某些层的激活值长期接近零或者变化不大,表明它们对最终输出的贡献较小,可以被剪除。
  • 基于信息增益:通过信息论的方法,评估层对模型整体表现的影响。如果层在信息增益上贡献较少,也可以被视为可剪除层。
选择性移除不重要的层

根据上述评估结果,确定哪些层可以被移除。通常有以下策略:

  • 直接移除不重要层:将评估得分较低的层直接从网络中移除。
  • 逐步移除:为了避免模型性能的大幅下降,可以选择逐步移除不重要的层,并在每一步移除后重新微调模型,以保证性能不会显著下降。
模型微调(Fine-tuning)

在移除不重要的层之后,模型需要进行微调(Fine-tuning),以恢复剪枝过程中造成的性能损失。微调是至关重要的一步,通过在原始训练数据上进行再训练,调整剩余层的参数,使得模型在减少层的情况下仍然可以有效地完成任务。

Layer Pruning的代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F
import math
import time
import matplotlib.pyplot as plt

# 获取可用设备
def get_device():
    if torch.cuda.is_available():
        return torch.device("cuda")
    elif torch.backends.mps.is_available():
        return torch.device("mps")
    else:
        return torch.device("cpu")

# 定义 Transformer 编码层
class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1):
        super(TransformerEncoderLayer, self).__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout)
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.linear2 = nn.Linear(dim_feedforward, d_model)

        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.dropout2 = nn.Dropout(dropout)

        self.activation = F.relu

    def forward(self, src, src_mask=None, src_key_padding_mask=None):
        # Self-attention 操作
        src2 = self.self_attn(src, src, src, attn_mask=src_mask, key_padding_mask=src_key_padding_mask)[0]
        src = src + self.dropout1(src2)
        src = self.norm1(src)

        # Feedforward 网络
        src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))
        src = src + self.dropout2(src2)
        src = self.norm2(src)
        return src

# 定义 Transformer 编码器
class TransformerEncoder(nn.Module):
    def __init__(self, encoder_layer, num_layers):
        super(TransformerEncoder, self).__init__()
        self.layers = nn.ModuleList([encoder_layer for _ in range(num_layers)])
        self.num_layers = num_layers

    def forward(self, src, mask=None, src_key_padding_mask=None):
        output = src
        for layer in self.layers:
            output = layer(output, src_mask=mask, src_key_padding_mask=src_key_padding_mask)
        return output

    def prune_layers(self, prune_count):
        # 使用 L1 范数评估每层的重要性并移除指定数量的层
        importance_scores = []
        for i, layer in enumerate(self.layers):
            with torch.no_grad():
                # 计算每个编码层的 L1 范数来衡量其重要性
                score = torch.sum(torch.abs(layer.self_attn.in_proj_weight))
                importance_scores.append((i, score.item()))

        # 按重要性分数从低到高排序
        importance_scores.sort(key=lambda x: x[1])
        # 选择要剪枝的层的索引
        prune_indices = [index for index, _ in importance_scores[:prune_count]]

        # 移除指定的层
        self.layers = nn.ModuleList([layer for i, layer in enumerate(self.layers) if i not in prune_indices])
        self.num_layers = len(self.layers)

# 定义完整的 Transformer 模型
class TransformerModel(nn.Module):
    def __init__(self, ntoken, d_model, nhead, num_encoder_layers, dim_feedforward, dropout):
        super(TransformerModel, self).__init__()
        self.embedding = nn.Embedding(ntoken, d_model)
        encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout)
        self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers)
        self.d_model = d_model
        self.fc_out = nn.Linear(d_model, ntoken)

    def forward(self, src, src_mask=None, src_key_padding_mask=None):
        src = self.embedding(src) * math.sqrt(self.d_model)
        output = self.encoder(src, mask=src_mask, src_key_padding_mask=src_key_padding_mask)
        output = self.fc_out(output)
        return output

# 测试 Transformer 模型并实现 Layer Pruning
if __name__ == "__main__":
    # 模型参数定义
    ntoken = 1000  # 词汇表大小
    d_model = 512  # 嵌入维度
    nhead = 8  # 多头注意力头数
    num_encoder_layers = 24  # 初始编码层数
    dim_feedforward = 2048  # 前馈网络的维度
    dropout = 0.1  # Dropout 概率

    # 创建模型
    device = get_device()
    model = TransformerModel(ntoken, d_model, nhead, num_encoder_layers, dim_feedforward, dropout).to(device)

    # 创建输入数据(假设序列长度为 10,batch 大小为 32)
    src = torch.randint(0, ntoken, (10, 32)).to(device)

    # 打印原始模型层数
    print(f"Original number of layers: {model.encoder.num_layers}")

    # 评估每一层的重要性并剪枝
    prune_count = 6  # 要剪枝的层数量
    model.encoder.prune_layers(prune_count)

    # 打印剪枝后的模型层数
    print(f"Number of layers after pruning: {model.encoder.num_layers}")

    # 测试剪枝后的模型
    model.eval()
    with torch.no_grad():
        output = model(src)
        print(f"Output shape after pruning: {output.shape}")

    # 比较剪枝前后的前向传播时间
    times_before_pruning = []
    times_after_pruning = []
    num_iterations = 50

    # 剪枝前的模型
    model_before_pruning = TransformerModel(ntoken, d_model, nhead, num_encoder_layers, dim_feedforward, dropout).to(device)
    model_before_pruning.eval()
    for _ in range(num_iterations):
        start_time = time.time()
        with torch.no_grad():
            model_before_pruning(src)
        end_time = time.time()
        times_before_pruning.append(end_time - start_time)

    # 剪枝后的模型
    for _ in range(num_iterations):
        start_time = time.time()
        with torch.no_grad():
            model(src)
        end_time = time.time()
        times_after_pruning.append(end_time - start_time)

    # 计算平均时间
    avg_time_before_pruning = sum(times_before_pruning) / num_iterations
    avg_time_after_pruning = sum(times_after_pruning) / num_iterations

    # 打印前向传播时间比较结果
    print(f"Average forward pass time before pruning: {avg_time_before_pruning:.6f} seconds")
    print(f"Average forward pass time after pruning: {avg_time_after_pruning:.6f} seconds")

    # 绘制比较图表
    labels = ['Before Pruning', 'After Pruning']
    avg_times = [avg_time_before_pruning, avg_time_after_pruning]

    plt.figure(figsize=(6, 4))
    plt.bar(labels, avg_times, color=['blue', 'green'])
    plt.ylabel('Average Forward Pass Time (seconds)')
    plt.title('Layer Pruning Forward Pass Time Comparison')
    plt.show()

Layer Pruning 的应用场景

Layer Pruning 通常用于深度神经网络,尤其是在以下场景中:

  • 模型部署:在移动端或嵌入式设备上部署模型时,计算资源和存储资源有限,Layer Pruning 是有效的模型压缩手段。
  • 减少推理时间:在实时应用(如自动驾驶、实时翻译)中,减少推理时间至关重要。通过 Layer Pruning,可以有效减少计算负担。
  • 加速训练:Layer Pruning 还可以在训练过程中减少计算量,从而加快训练速度,尤其是在一些迭代训练的任务中。

Layer Pruning 的优势与比较

优势

  • 降低计算复杂度:通过移除冗余层,显著减少网络的计算量,特别是在深度非常大的网络中效果显著。
  • 减少模型大小:剪枝后的模型具有更少的参数,存储需求更低,非常适合在资源受限的设备上部署。
  • 结构化剪枝的高效性:与非结构化剪枝(如移除单个神经元或权重)相比,层剪枝保持了模型结构的完整性,易于实现硬件加速。

与其他剪枝方法的比较

  • 非结构化剪枝:如剪掉单个权重或神经元,虽然可以显著减少参数量,但对硬件加速支持不友好,因为其剪枝结果通常是稀疏的张量。而 Layer Pruning 是一种结构化剪枝,减少了整个层,使得网络更适合硬件加速。
  • 通道剪枝(Channel Pruning):通道剪枝和 Layer Pruning 类似,也属于结构化剪枝,但它是在卷积神经网络的通道层级上进行的。Layer Pruning 则是在网络整体层级上操作,影响更大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序数据库是什么:概念、特点与分类简析

时序数据与时序数据库的“保姆级”科普&#xff01; 作为将数据价值转化为产能能效的“核心大脑”&#xff0c;数据库的发展依然处于加速期&#xff0c;面向不同数据类型的数据库类型也在不断增加。 在众多细分领域数据库类型中&#xff0c;伴随制造业数字化转型的行业趋势和多…

【创建型】单例模式

单例模式使用的场景&#xff1a;需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即&#xff1a;重量级对象)&#xff0c;但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等) 1. 饿汉式&#xff08;静态常量&#xf…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

工业通信网关的各项功能解析-天拓四方

在工业自动化和智能制造的浪潮中&#xff0c;工业通信网关作为连接工业现场与互联网的重要桥梁&#xff0c;发挥着至关重要的作用。它不仅实现了不同网络协议之间的转换&#xff0c;还在数据采集、设备控制、网络管理等方面展现出强大的功能。 一、协议转换功能 工业通信网关…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

高亮无惧烈日,强力巨彩租赁屏点亮户外“视”界

在户外显示领域&#xff0c;一款性能出色、适应性强、维护便捷的租赁屏无疑是众多主办方和广告商的首选。强力巨彩旗下的幻云系列租赁屏具备画面清晰、无水波纹、性能稳定、高亮度等诸多优势&#xff0c;可应用于各大户外显示场所&#xff0c;是户外租赁屏市场的明星产品。   …

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…

Mysql开发规范

开发规范 对象命名 命名规范的对象&#xff0c;是指数据库SCHEMA、表TABLE、字段COLUMN、索引INDEX、约束CONSTRAINTS等 【强制】凡是需要命名的对象&#xff0c;其标识符不能超过30个字符【强制】名称必须以英文字母开头&#xff0c;不得以 _(下划线) 作为起始和终止字母【…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

(57)MATLAB使用迫零均衡器和MMSE均衡器的BPSK调制系统仿真

文章目录 前言一、仿真测试模型二、仿真代码三、仿真结果四、迫零均衡器和MMSE均衡器的实现1.均衡器的MATLAB实现2.均衡器的性能测试 总结 前言 本文给出仿真模型与MATLAB代码&#xff0c;分别使用具有ISI的三个不同传输特性的信道&#xff0c;仿真测试了使用迫零均衡器和MMSE…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

MySQL FIND_IN_SET 函数详解

文章目录 1. 基本语法2. 使用场景3. 实战示例3.1 基础查询示例3.2 与其他函数结合使用3.3 动态条件查询 4. 性能考虑5. 常见问题和解决方案5.1 大小写敏感问题5.2 空值处理5.3 模糊匹配 6. 总结 1. 基本语法 FIND_IN_SET 函数的基本语法如下&#xff1a; FIND_IN_SET(str, st…

「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件

Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入&#xff0c;如音量调节&#xff1b;Progress 显示任务的完成状态&#xff0c;如下载进度。本文通过代码示例展示如何使用这些组件&#xff0c;并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更…

ZDH权限-扩展支持数据权限

目录 项目源码 预览地址 安装包下载地址 ZDH权限模块 ZDH权限扩展更细粒度方案 第一种方案&#xff1a; 第二种方案&#xff1a; ZDH权限扩展支持数据权限-新增属性 总结 感谢支持 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后…

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

Java 用户随机选择导入ZIP文件,解压内部word模板并入库,Windows/可视化Linux系统某麒麟国防系统...均可适配

1.效果 压缩包内部文件 2.依赖 <!--支持Zip--><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.11.5</version></dependency>总之是要File类变MultipartFile类型的 好像是…

论文笔记(五十四)pi0: A Vision-Language-Action Flow Model for General Robot Control

π0: A Vision-Language-Action Flow Model for General Robot Control 文章概括摘要I. INTRODUCTIONII. RELATED WORKIII. OVERVIEWIV. π 0 \pi_0 π0​模型V. 数据收集和培训配方A. 预训练和后训练B. 语言和高级策略C. 机器人系统细节 VI. 实验评估A. 基础模型评估B. 遵循语…

《AI产品经理手册》——解锁AI时代的商业密钥

在当今这个日新月异的AI时代&#xff0c;每一位产品经理都面临着前所未有的挑战与机遇&#xff0c;唯有紧跟时代潮流&#xff0c;深入掌握AI技术的精髓&#xff0c;才能在激烈的市场竞争中独占鳌头。《AI产品经理手册》正是这样一部为AI产品经理量身定制的实战宝典&#xff0c;…

论文略读:Self-Knowledge Guided Retrieval Augmentation for Large Language Models

2023 emnlp findings RAG 召回的辅助信息不总是有用&#xff0c;甚至可能起负作用 原本对“德牧能不能进机场”这样的问题&#xff0c;ChatGPT是高度认可德牧作为导盲犬的但是检索模块召回了一段“老德牧是一类 balabala 某种狗的争议性名称”的百科介绍作为额外上文输入后&am…