AIGC时代,大模型微调如何发挥最大作用?

人工智能的快速发展推动了大模型的广泛应用,它们在语言、视觉、语音等领域的应用效果已经越来越好。但是,训练一个大模型需要巨大的计算资源和时间,为了减少这种资源的浪费,微调已经成为一种流行的技术。微调是指在预训练模型的基础上,通过在小数据集上的训练来适应新的任务。AIGC(AI芯片)的出现进一步加快了大模型的推广,它可以提供更快的计算速度和更大的存储容量。本文将介绍AIGC下大模型微调的方法,包括微调所有层、微调顶层、冻结底层、逐层微调和迁移学习。我们将使用PaddlePaddle这个开源框架,以自然语言处理和计算机视觉为例,来说明这些方法的原理和实现步骤。

在AIGC大模型下,我们目前最熟知一个大模型就是Chatgpt,目前国外大佬也正在研究能否在计算机视觉角度,做到上传一个图片或一个视频,我告诉他做视觉上的任务,就可以实现相应的视觉需求。

这样的大模型,我们虽然暂时没办法用到开源的模型,而且模型涉及到的参数也太大了,如果自己训练累死机器,在面对不同业务的情况下, 我们更多的方法是基于大模型进行模型微调的方法来实现我们的应用

微调的方法

在深度学习中,微调是一种重要的技术,用于改进预训练模型的性能。除了微调ChatGPT之外,还有许多其他预训练模型可以进行微调。以下是一些微调预训练模型的方法:

  • 微调所有层:将预训练模型的所有层都参与微调,以适应新的任务。
  • 微调顶层:只微调预训练模型的顶层,以适应新的任务。
  • 冻结底层:将预训练模型的底层固定不变,只对顶层进行微调。
  • 逐层微调:从底层开始,逐层微调预训练模型,直到所有层都被微调。
  • 迁移学习:将预训练模型的知识迁移到新的任务中,以提高模型性能。这种方法通常使用微调顶层或冻结底层的方法。

对于模型的参数微调,我认为可以这样理解,以原始的chatgpt为例,它像是一个通用的大模型,

像是一个在大学学习到所有专业的知识的大学生,基于过往的学习经验以及对生活中的一些事情,已经有了属于自己的一套学习方法思维逻辑**(这个就是模型的参数)**

现在这个大学生毕业后从事某一种行业的工作,那他就要开始学习工作上的内容,来产出工作的成果。那在他学习的过程,他以往在大学学到专业知识学习方法是不是也可以拿来应用呢,是不是可以用同样的学习方法学习工作的东西呢**(这个就是微调)**

微调,通过我过去积累学到东西,来应用到现在新的内容中来产出新的结果。

回到对不同层进行微调,如何选择那些层需要微调?就需要知道模型这些层在原始数据集上学习到了什么经验? 那些经验是我们可以拿来复用到另一个数据集中的?

在神经网络中,那些层是在学经验?

在计算机视觉中,卷积神经网络 (Convolutional Neural Networks, CNNs) 通常会学习到如下经验:

  • 局部感知:CNNs 通过卷积操作和池化操作可以学习到局部特征,如边缘、纹理等,从而实现对图像的局部感知。
  • 平移不变性:CNNs可以学习到特征对平移的不变性,这样对于同一物体的不同部分,CNNs 可以生成相似的特征表示。
  • 分层抽象:CNNs可以通过多层卷积操作学习到越来越抽象的特征,从低级别特征如边缘到高级别特征如物体的部分或整体。

此外,近年来也出现了一些基于注意力机制的模型,如自注意力模块(Self-Attention Model)、transformer模块可以通过学习到的注意力权重来对图像中的特征进行加权和,从而更加精细地提取特征

在自然语言处理中,循环神经网络 (Recurrent Neural Networks, RNNs) 和 Transformer 网络通常会学习到如下经验:

  • 时序依赖关系:RNNs 和 Transformer 网络可以学习到文本序列中的时序依赖关系,从而实现对文本的序列化处理。
  • 分层抽象:RNNs 和 Transformer 网络可以通过多层神经网络实现对文本的分层抽象,从而学习到更高级别的文本特征表示。
  • 上下文依赖:RNNs 和 Transformer 网络可以学习到上下文依赖关系,从而可以生成基于上下文的文本特征表示,从而提高模型的性能。

可以说对于处理计算机视觉和自然语言处理任务,模型上游的部分都是在一个学习经验的过程

但计算机视觉和自然语言处理在做微调模型时,区别:

对于计算机视觉,不同的图像,学习到的经验,可能完全是不同的,但是对于自然语言处理不同的文本,可能学习到的经验是一样的,因为文本的数据,特征更多是从上下文依赖,语言时序性。这些特征在不同内容的文本中是可以套用的。(比如说写论文和写作文,写作上很大的相似地方)

用paddle实现模型微调

以下是使用PaddlePaddle框架对上述五种微调方法的示例代码:

python代码解读复制代码import paddle
from paddle import nn# 加载预训练的Transformer模型
pretrained_model = paddle.vision.models.Transformer()# 1. 微调所有层
for param in pretrained_model.parameters():param.trainable = True# 2. 微调顶层
for param in pretrained_model.decoder.parameters():param.trainable = True# 3. 冻结底层
for param in pretrained_model.encoder.parameters():param.trainable = False# 4. 逐层微调
for i, layer in enumerate(pretrained_model.encoder.layers):if i >= 6:  # 只微调第6层及以上的层for param in layer.parameters():param.trainable = Trueelse:for param in layer.parameters():param.trainable = False# 5. 迁移学习
# 加载预训练的模型
pretrained_model = paddle.vision.models.ResNet50(pretrained=True)# 新建分类器
num_classes = 10
classifier = nn.Linear(2048, num_classes)# 冻结预训练模型的所有层
for param in pretrained_model.parameters():param.trainable = False# 微调新建分类器的参数
for param in classifier.parameters():param.trainable = True# 将预训练模型和新建分类器组合成新的模型
model = nn.Sequential(pretrained_model, classifier)

上述代码中,我们首先通过paddle.vision.models.Transformer()加载了预训练的Transformer模型。然后根据不同的微调方法,分别对模型的不同层进行微调或冻结。最后,我们使用迁移学习的方法将预训练模型和新建分类器组合起来,形成一个新的模型。

使用Paddle实现ChatGPT模型的五种微调方法

微调所有层
python代码解读复制代码import paddle
from paddlenlp.transformers import GPT2Model, GPT2ForPretraining, GPT2PretrainingCriterion# 加载预训练模型
model = GPT2ForPretraining.from_pretrained('gpt2-medium-en')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2-medium-en')# 定义新的分类头
class_num = 2
cls = paddle.nn.Linear(model.config["hidden_size"], class_num)# 将新的分类头添加到模型中
model.cls = cls# 通过微调所有层来适应新任务
optimizer = paddle.optimizer.Adam(learning_rate=1e-5, parameters=model.parameters())
criterion = GPT2PretrainingCriterion()
微调顶层
python代码解读复制代码import paddle
from paddlenlp.transformers import GPT2Model, GPT2ForPretraining, GPT2PretrainingCriterion# 加载预训练模型
model = GPT2ForPretraining.from_pretrained('gpt2-medium-en')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2-medium-en')# 固定模型底层,只微调顶层
for param in model.parameters():param.trainable = False# 定义新的分类头
class_num = 2
cls = paddle.nn.Linear(model.config["hidden_size"], class_num)# 将新的分类头添加到模型中
model.cls = cls# 通过微调顶层来适应新任务
for param in model.cls.parameters():param.trainable = True
optimizer = paddle.optimizer.Adam(learning_rate=1e-5, parameters=model.cls.parameters())
criterion = paddle.nn.CrossEntropyLoss()
冻结底层
python代码解读复制代码import paddle
import paddle.nn.functional as F
from paddlenlp.transformers import GPTForPretraining, GPTChineseTokenizer# 加载预训练模型和分词器
model = GPTForPretraining.from_pretrained('gpt-cpm-large-cn')
tokenizer = GPTChineseTokenizer.from_pretrained('gpt-cpm-large-cn')# 构造数据集和数据加载器
train_ds = [['今天天气不错'], ['明天要下雨'], ['这个季节很适合旅游']]
train_ds = [{'text': text} for text in train_ds]def batch_iter(data, batch_size):num_batches = len(data) // batch_sizeif len(data) % batch_size != 0:num_batches += 1for i in range(num_batches):batch = data[i * batch_size: (i + 1) * batch_size]yield batchbatch_size = 2
train_loader = paddle.io.DataLoader(train_ds, batch_size=batch_size, shuffle=True, drop_last=True)# 构造优化器和损失函数
optimizer = paddle.optimizer.AdamW(parameters=model.parameters(), learning_rate=1e-4)
criterion = F.cross_entropy# 冻结底层
for layer in model.layers[:6]:layer.eval()for param in layer.parameters():param.trainable = False# 微调模型
for epoch in range(3):for batch in train_loader:texts = [example['text'] for example in batch]encoded_inputs = tokenizer(texts, return_attention_mask=True, return_length=True, padding=True)input_ids = paddle.to_tensor(encoded_inputs['input_ids'])attention_mask = paddle.to_tensor(encoded_inputs['attention_mask'])logits = model(input_ids, attention_mask=attention_mask)[0]loss = criterion(logits.reshape(-1, logits.shape[-1]), input_ids.reshape(-1))loss.backward()optimizer.step()optimizer.clear_grad()print(f'Epoch {epoch + 1}: loss={loss.numpy():.4f}')# 保存微调后的模型
paddle.save(model.state_dict(), 'gpt-cpm-large-cn-finetuned
逐层微调
python代码解读复制代码import paddle
import paddle.nn.functional as F
from paddlenlp.transformers import GPTForPretraining, GPTChineseTokenizer# 加载预训练模型和分词器
model = GPTForPretraining.from_pretrained('gpt-cpm-large-cn')
tokenizer = GPTChineseTokenizer.from_pretrained('gpt-cpm-large-cn')# 构造数据集和数据加载器
train_ds = [['今天天气不错'], ['明天要下雨'], ['这个季节很适合旅游']]
train_ds = [{'text': text} for text in train_ds]def batch_iter(data, batch_size):num_batches = len(data) // batch_sizeif len(data) % batch_size != 0:num_batches += 1for i in range(num_batches):batch = data[i * batch_size: (i + 1) * batch_size]yield batchbatch_size = 2
train_loader = paddle.io.DataLoader(train_ds, batch_size=batch_size, shuffle=True, drop_last=True)# 构造优化器和损失函数
optimizer = paddle.optimizer.AdamW(parameters=model.parameters(), learning_rate=1e-4)
criterion = F.cross_entropy# 迁移学习微调模型
for epoch in range(3):for batch in train_loader:texts = [example['text'] for example in batch]encoded_inputs = tokenizer(texts, return_attention_mask=True, return_length=True, padding=True)input_ids = paddle.to_tensor(encoded_inputs['input_ids'])attention_mask = paddle.to_tensor(encoded_inputs['attention_mask'])logits = model(input_ids, attention_mask=attention_mask)[0]loss = criterion(logits.reshape(-1, logits.shape[-1]), input_ids.reshape(-1))loss.backward()optimizer.step()optimizer.clear_grad()print(f'Epoch {epoch + 1}: loss={loss.numpy():.4f}')# 保存微调后的模型
paddle.save(model.state_dict(), 'gpt-cpm-large-cn-finetuned-transfer-learning.pdparams')

在上面的代码中,我将模型微调的方法从逐层微调改为了迁移学习微调。具体来说,我将原来的逐层微调中的隐藏状态计算和获取每一层的输出等相关代码去掉了,并直接将输入和注意力掩码传入模型,获取最后一层的输出,并计算损失进行反向传播和优化。

同时,我将保存模型时的文件名从 gpt-cpm-large-cn-finetuned-layer-wise.pdparams 改为了 gpt-cpm-large-cn-finetuned-transfer-learning.pdparams,以便于区分逐层微调和迁移学习微调两种方法。

迁移学习
python代码解读复制代码import paddle
import paddle.nn.functional as F
from paddlenlp.transformers import GPTForPretraining, GPTChineseTokenizer# 加载预训练模型和分词器
model = GPTForPretraining.from_pretrained('gpt-cpm-large-cn')
tokenizer = GPTChineseTokenizer.from_pretrained('gpt-cpm-large-cn')# 构造数据集和数据加载器
train_ds = [['今天天气不错'], ['明天要下雨'], ['这个季节很适合旅游']]
train_ds = [{'text': text} for text in train_ds]def batch_iter(data, batch_size):num_batches = len(data) // batch_sizeif len(data) % batch_size != 0:num_batches += 1for i in range(num_batches):batch = data[i * batch_size: (i + 1) * batch_size]yield batchbatch_size = 2
train_loader = paddle.io.DataLoader(train_ds, batch_size=batch_size, shuffle=True, drop_last=True)# 构造优化器和损失函数
optimizer = paddle.optimizer.AdamW(parameters=model.parameters(), learning_rate=1e-4)
criterion = F.cross_entropy# 训练模型
epochs = 3
for epoch in range(epochs):for batch in train_loader:texts = [example['text'] for example in batch]encoded_inputs = tokenizer(texts, return_attention_mask=True, return_length=True, padding=True)input_ids = paddle.to_tensor(encoded_inputs['input_ids'])attention_mask = paddle.to_tensor(encoded_inputs['attention_mask'])logits = model(input_ids, attention_mask=attention_mask)[0]loss = criterion(logits.reshape(-1, logits.shape[-1]), input_ids.reshape(-1))loss.backward()optimizer.step()optimizer.clear_grad()print(f'Epoch {epoch + 1}: loss={loss.numpy():.4f}')# 保存微调后的模型
paddle.save(model.state_dict(), 'gpt-cpm-large-cn-finetuned.pdparams')

在上面的代码中,我们首先加载了预训练的 GPT 模型和分词器,然后构造了一个简单的数据集和数据加载器。接着,我们使用 AdamW 优化器和交叉熵损失函数来训练模型,训练完后保存微调后的模型。

如何学习AI大模型 ?

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

😝有需要的小伙伴,可以VX扫描下方二维码免费领取🆓
在这里插入图片描述

👉1.大模型入门学习思维导图👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
在这里插入图片描述

👉2.AGI大模型配套视频👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

在这里插入图片描述
在这里插入图片描述

👉3.大模型实际应用报告合集👈

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

在这里插入图片描述

👉4.大模型落地应用案例PPT👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(全套教程文末领取哈)

在这里插入图片描述

👉5.大模型经典学习电子书👈

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
img

在这里插入图片描述

👉6.大模型面试题&答案👈

截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)

在这里插入图片描述
👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习

这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

在这里插入图片描述

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

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

相关文章

DVWA | File Inclusion(文件包含)渗透测试

概念: 漏洞产生原因: 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如,如果一个 Web 应用程序接受用户输入的文件路径,然后使用这个路径进行文件包含,而没有对用户输入进行任何检查&#xff0c…

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结,这里记录一下。 知识点汇总 2013年408应用题41 解决方法: 方法一 (1)算法思想 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:3112 标注数量(txt文件个数):3112 标注类别数:1 标注类别名称:qrcode 数据集下载:二维码数据集 图片示例 数据集图片: 数据集…

yolov8/9/10模型在垃圾分类检测中的应用【代码+数据集+python环境+GUI系统】

yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 背景意义 随着计算机视觉技术和深度学习算法的快速发展,图像识别、对象检测、图像分割等技术在各个领域得到了广泛…

C++类和对象(下) 初始化列表 、static成员、友元、内部类等等

1.再探构造函数 之前使用构造函数时都是在函数体内初始化成员变量,还有一种构造函数的用法,叫做初始化列表;那么怎么使用呢? 使用方法用冒号开始(" : ")要写多个就用逗号(" , ")隔开数据成队列每个成员变量后…

谷歌收录批量查询,如何批量查询谷歌收录以及提交网站进行收录的方法

在SEO优化过程中,了解并监控网站在谷歌搜索引擎中的收录情况至关重要。本文将详细介绍如何批量查询谷歌收录以及提交网站进行收录的方法,帮助网站管理员和SEO专家更有效地管理和优化网站。 一、谷歌收录批量查询方法 1.使用搜索引擎的site指令 …

前端考核总结

目录 JavaScript的基本数据类型有哪些?JavaScript中数据类型的检测方法JavaScript如何判断对象中的属性存在自身还是原型链上flex布局HTML5新标签Vue的基本概念Vue生命周期JavaScript中闭包的基本概念防抖节流双等号与三等号的区别显式转换 JavaScript的基本数据类型…

fastadmin搜索刷新列表,怎么限制用户频繁点击?

文章目录 fastadmin搜索刷新列表,怎么限制用户频繁点击?解决方案fastadmin事件方法实现完结 fastadmin搜索刷新列表,怎么限制用户频繁点击? fastadmin目前有个很致命的问题,就是用户可以频繁的点击搜索等按钮&#xf…

Qt --- 界面优化 --- QSS和绘图API

界面优化 》美化 一个程序的界面是否好看,是否重要呢。 有些面向专业领域的程序,界面好看与否,不是看关键,更关键的是实际的效果。有些面向普通用户领域的程序,界面好看,还是很大的加分项。 界面优化 Qt…

奖金高达 110 万元,Spatial Joy 2024 全球 AR 应用开发大赛启动

今年是AR应用开发大赛第三届,恰逢Rokid成立十周年,我们推出全新的大赛品牌“Spatial Joy”,引领开发者享受开发乐趣,为其打造充满挑战和惊喜的开发之旅,逐渐成为空间计算时代全球最大AR应用开发大赛。回顾大赛发展&…

PCB敷铜敷不了相同网络的线怎么办?

图片上的情况就是今天需要讲的内容,可以看出出来的线头是GND,敷的铜也是GND但是相同网络就是不能连在一起。 解释: 这是因为我们敷铜的时候属性选的是连接相同的net,如图所示: 解决办法: 只需要设置改为相同的Object就可以了&…

STM32+ADC+扫描模式

1 ADC简介 1 ADC(模拟到数字量的桥梁) 2 DAC(数字量到模拟的桥梁),例如:PWM(只有完全导通和断开的状态,无功率损耗的状态) DAC主要用于波形生成(信号发生器和音频解码器) 3 模拟看门狗自动监…

高效的视频压缩标准H.264介绍,以及H.264在视频监控系统中的应用

目录 一、概述 二、 工作原理 三、技术特点与优势 1、高效压缩率 2、高质量视频 3、错误恢复能力 4、灵活性 四、编解码过程 1、编码过程 2、解码过程 五、帧类型与结构 1、I帧 2、P帧 3、B帧 六、应用与优势 1、节省存储空间和带宽 2、提高视频质量 3、适应…

2024大二上js高级+ES6学习9.29(深/浅拷贝,正则表达式,let/const,解构赋值,箭头函数,剩余参数)

9.29.2024 1.浅拷贝和深拷贝 Es6的语法糖:用assign将obj对象浅拷贝给o对象。 把数组写在前面是因为数组也是对象 2.正则表达式 创建和检测正则表达式 正则表达式的使用直接跳过,等要用时现查现用 3.ES6 4.let关键字 块级作用域是指在一个{}l里 变量提…

File 和 Blob两个对象有什么不同

Blob 在 JavaScript 中,Blob(Binary Large Object)对象用于表示不可变的、原始的二进制数据。它可以用来存储文件、图片、音频、视频、甚至是纯文本等各种类型的数据。Blob 提供了一种高效的方式来操作数据文件,而不需要将数据全…

招联金融内推-2025校招

【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

【springboot】使用thymeleaf模板

1. 导入依赖 首先&#xff0c;创建一个Spring Boot项目&#xff0c;并添加Thymeleaf依赖。在pom.xml文件中添加以下依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifa…

组合逻辑元件与时序逻辑元件

组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块&#xff0c;但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入&#xff0c;而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括&#xff1a; 与门 (AND…

美图AI短片创作工具MOKI全面开放 支持生成配乐、细节修改

人工智能 - Ai工具集 - 集合全球ai人工智能软件的工具箱网站 美图公司近日宣布&#xff0c;其研发的AI短片创作工具MOKI已正式向所有用户开放。这款专注于AI短片创作的工具&#xff0c;提供了包括动画短片、网文短剧等多种类型视频内容的生成能力&#xff0c;致力于为用户带来…

文件防泄密措施有哪些?6个方法有效防止文件泄密

想象一下&#xff0c;一群穿着黑衣的神秘人在电影中潜入高保安办公室&#xff0c;绕过各种高科技安保装置&#xff0c;只为偷走里面存放的饱含机密的文件&#xff01; 听起来是不是很刺激&#xff1f; 但如果这种情况发生在现实中&#xff0c;而且发生在你的企业或个人数据上…