[关于AI] 天天用AI还不知道AI是怎么反馈的?一文了解生成模型常见损失函数Python代码实现+计算原理解析
作者:CC下载站 日期:2024-03-06 18:06:34 浏览:35 分类:涨姿势
前言
损失函数无疑是机器学习和深度学习效果验证的核心检验功能,用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数,但是我们缺少细致的对损失函数进行分类,或者系统的学习损失函数在不同的算法和任务中的不同的应用。因此有必要对整个损失函数体系有个比较全面的认识,方便以后我们遇到各类功能不同的损失函数有个清楚的认知,而且一般面试以及论文写作基本都会对这方面的知识涉及的非常深入。故本篇文章将结合实际Python代码实现损失函数功能,以及对整个损失函数体系进行深入了解。
每篇文章我都会尽可能将简化涉及到垂直领域的专业知识,转化为大众小白可以读懂易于理解的知识,将繁杂的程序创建步骤逐个拆解,以逐步递进的方式由难转易逐渐掌握并实践,欢迎各位学习者关注博主,博主将不断创作技术实用前沿文章。
一、生成模型简述
生成模型大家的认知方面主要还是语言对话模型,比如ChatGPT或者是文心一言,此类模型均为生成式人工智能。判别式人工智能是以“分析-识别”为基础,开拓了目标识别和分类回归等一系列的研究应用,而生成式人工智能则以“重建合成”方式用于生成各种形式的内容。
生成式人工智能是一种人工智能技术,可以学习大量数据并生成与原始数据类似的新数据。生成式人工智能通常使用神经网络或其他机器学习算法来学习数据的模式和规律,并使用这些模式和规律生成新的数据。
与传统的分类或回归任务不同,生成式人工智能的目标是生成新的数据而不是对现有数据进行分类或回归。此处不对生成式人工智能进行展开,要了解生成模型是一类用于生成新的数据样本的统计模型。
它们的目标是通过学习输入数据的分布来生成与训练数据类似但又不完全相同的新样本。
常见的生成模型有:
变分自编码器(Variational Autoencoder,VAE): VAE是一种生成模型,它结合了自编码器和变分推断的思想,通过学习将输入数据映射到潜在空间,并通过采样来生成新的样本。
生成对抗网络(Generative Adversarial Network,GAN): GAN由生成器和鉴别器两部分组成,它们相互对抗,使得生成器的输出能够尽可能地模拟真实数据分布。
自回归模型(Autoregressive Models): 这类模型假设每个维度的特征都是依赖于前面的维度的特征,典型的例子是序列生成模型。
生成式人工智能语言模型:生成式人工智能语言模型是一种人工智能模型,其主要功能是生成与人类自然语言类似的文本。这些模型能够根据输入的上下文或提示,生成连贯、自然的文本段落、句子或短语。
二、生成模型损失函数概述
既然存在生成内容与原有数据之间存在差距,那么有应该有度量二者差距的标量,损失函数就是度量两者直接的差距。总体来说有损失函数主要承担四个功能:
引导模型训练方向: 损失函数的值告诉了优化算法应该如何更新模型的参数,以使模型的预测结果更接近实际数据。
评估生成模型的性能: 生成模型的损失函数值可以作为一个指标,用来评估模型的性能。通常情况下,我们希望损失函数越小越好,因为这意味着模型的预测结果越接近实际数据。
防止过拟合: 通过选择合适的损失函数和正则化项,可以降低模型对训练数据的过拟合程度,提高模型在未见过数据上的泛化能力。
梯度下降优化: 损失函数的梯度是优化算法(如随机梯度下降)的依据,它指导了参数的更新方向和幅度,从而使得模型逐渐收敛到最优解。
生成模型损失函数主要是帮助模型学习到适合任务的参数配置,从而生成更符合实际数据分布的新样本。选择合适的损失函数是训练高质量生成模型的关键一步。
三、常见生成模型损失函数
1.负对数似然损失(Negative Log Likelihood Loss,NLL Loss)
负对数似然损失(Negative Log Likelihood Loss,NLL Loss)是一种常用于概率模型训练的损失函数,特别是在分类和生成模型中。它用于衡量模型的预测概率分布与实际样本分布之间的差异。
在生成模型中,如变分自编码器(VAE)或生成对抗网络(GAN)等,通常使用 NLL Loss 作为训练的损失函数。它帮助模型学习生成符合实际数据分布的新样本。
假设我们有一个概率模型,它给出了样本属于每个类别的概率分布为$p(y|x)$,其中 y 是类别标签, x 是样本。
import torch import torch.nn as nn # 假设模型的输出为 logits,实际类别标签为 targets logits = torch.randn(3, 5) # 3个样本,5个类别 targets = torch.tensor([1, 0, 4]) # 三个样本的实际类别标签 # 使用交叉熵损失函数计算负对数似然损失 criterion = nn.CrossEntropyLoss() nll_loss = criterion(logits, targets) print("负对数似然损失:", nll_loss.item())
输出结果负对数似然损失: 2.210
2.重构误差(Reconstruction Loss)
重构误差(Reconstruction Loss)是指在生成模型或自编码器中,衡量模型重构输入数据的能力的指标。它表示模型在将输入数据编码为潜在空间表示后,再解码回原始输入时产生的误差。
在自编码器中,重构误差通常是训练过程的一个重要组成部分。自编码器的目标是最小化输入数据与重构数据之间的差异,以便学习到一个有效的特征表示。
重构误差可以用来指导模型的训练,使得模型能够在保留关键信息的同时,降低噪声或不必要的细节。通常,重构误差的计算方式取决于所使用的模型和任务。
对于像变分自编码器(Variational Autoencoder,VAE)这样的模型,重构误差通常由负对数似然损失(Negative Log Likelihood Loss)来度量。
在其他生成模型中,可能会使用不同的损失函数来衡量重构误差。
具体的计算方式取决于所使用的模型和任务。以自编码器为例,其重构误差通常由以下公式表示:
其中,x_{i} 是输入数据,\bar{x_{i}} 是模型重构后的输出,n 是样本数量。这里的||⋅||表示某种距离度量,通常为欧氏距离或曼哈顿距离等。
我们可以用Pytorch构建一个简单的自编码器模型,再来实现重构误差:
import torch import torch.nn as nn # 定义一个简单的自编码器模型 class Autoencoder(nn.Module): def __init__(self): super(Autoencoder, self).__init__() self.encoder = nn.Linear(784, 128) self.decoder = nn.Linear(128, 784) def forward(self, x): x = self.encoder(x) x = self.decoder(x) return x # 初始化模型和损失函数 model = Autoencoder() criterion = nn.MSELoss() # 假设输入数据为 input_data input_data = torch.randn(64, 784) # 64个样本,每个样本784维 # 将输入数据通过自编码器前向传播 output_data = model(input_data) # 计算重构误差 reconstruction_loss = criterion(output_data, input_data) print("重构误差:", reconstruction_loss.item())
结果输出重构误差: 1.120
3.KL散度(Kullback-Leibler Divergence,KLD)
KL散度(Kullback-Leibler Divergence,KLD),也称为相对熵,是信息论中用于衡量两个概率分布之间的差异的一种指标。
具体来说,它用于度量在一个概率分布下用第二个概率分布来表示所需的额外信息量。假设有两个概率分布P(x) 和Q(x) (x表示随机变量),它们分别描述了同一个事件的不同观测结果的概率分布。KL散度定义如下:
重要要点:
KL 散度是非对称的:D_{KL}(P||Q)!=D_{KL}(Q||P) 这意味着用 Q 来估计 P 的KL散度与用 P 估计 Q 的KL散度是不同的。
KL 散度非负:D_{KL}(P||Q)≥0 ,当且仅当 P 和 Q 完全相等时,KL散度等于零。
KL 散度的值越大,表示两个分布之间的差异越大。
KL散度的计算通常需要确保分母Q(x)不为零,以避免数值不稳定的情况。
KL散度在许多领域都有重要的应用,包括:
信息理论: 用于衡量在一个概率分布下用另一个分布来表示所需的额外信息量。
机器学习: 在生成模型中,用于衡量生成模型的输出分布与真实分布之间的差异。
优化问题: 在最大似然估计等问题中,KL散度经常用作目标函数的一部分。
在生成模型中,特别是在变分自编码器(Variational Autoencoder,VAE)等模型中,KL散度(Kullback-Leibler Divergence,KLD)通常用于衡量两个概率分布之间的差异。在Python中,可以使用深度学习框架如PyTorch来实现KL散度的计算。
import torch import torch.nn.functional as F def kl_divergence(mu_q, logvar_q, mu_p, logvar_p): # 计算KL散度 kl_div = -0.5 * torch.sum(1 + logvar_q - logvar_p - (logvar_q.exp() + (mu_q - mu_p).pow(2)) / logvar_p.exp(), dim=1) return kl_div.mean() # 假设有两个正态分布的参数 mu_q = torch.randn(64, 10) # 均值 logvar_q = torch.randn(64, 10) # 对数方差 mu_p = torch.randn(64, 10) # 均值 logvar_p = torch.randn(64, 10) # 对数方差 # 计算KL散度 kl_loss = kl_divergence(mu_q, logvar_q, mu_p, logvar_p) print("KL散度:", kl_loss.item())
输出结果:KL散度: 23.193
4.对抗损失(Adversarial Loss)
对抗损失(Adversarial Loss)是一种用于训练生成对抗网络(Generative Adversarial Networks,GANs)的损失函数。它在GAN模型中起到了至关重要的作用。在GAN中,通常包括两个主要的组件:
生成器(Generator): 它试图生成与真实数据样本相似的虚假数据样本。
判别器(Discriminator): 它试图区分真实数据样本和由生成器生成的虚假数据样本。
对抗损失的核心思想是通过将生成器和判别器对抗训练,来达到使生成器生成逼真样本的目的。具体来说,对抗损失由两部分组成:
生成器损失: 这一部分的目标是欺骗判别器,使其将生成器生成的样本误认为是真实数据。
判别器损失: 这一部分的目标是准确地区分真实数据和虚假数据。
数学上,对抗损失可以表示为:
其中,G 是生成器,D 是判别器,p_{data}(x) 是真实数据的分布,p_{z}(z) 是生成器输入 z 的先验分布。
对抗损失的目标是最小化L_{adversarial} ,使得生成器生成的样本能够欺骗判别器,同时使判别器更加准确地区分真实和虚假样本。通过对抗训练,生成器和判别器会相互对抗,最终使得生成器能够生成逼真的样本。对抗损失是GAN模型训练中非常重要的一部分,它使得生成器能够逐渐提升生成样本的质量,从而达到生成真实样本的目的。
我们首先定义了一个简单的生成器(Generator)和判别器(Discriminator),然后初始化了它们以及对抗损失函数(二元交叉熵损失)。接下来,假设生成器生成了假样本和真实样本已经准备好,我们计算了生成器和判别器的输出,然后使用二元交叉熵损失计算了对抗损失。最后,在反向传播过程中,可以使用总的对抗损失来更新生成器和判别器的参数。
import torch import torch.nn as nn # 定义一个简单的生成器和判别器 class Generator(nn.Module): def __init__(self): super(Generator, self).__init__() self.fc = nn.Linear(100, 784) # 假设输入维度是100,输出维度是784(28x28) def forward(self, x): return torch.sigmoid(self.fc(x)) class Discriminator(nn.Module): def __init__(self): super(Discriminator, self).__init__() self.fc = nn.Linear(784, 1) # 假设输入维度是784,输出维度是1 def forward(self, x): return torch.sigmoid(self.fc(x)) # 初始化生成器和判别器 generator = Generator() discriminator = Discriminator() # 定义对抗损失函数(二元交叉熵损失) adversarial_loss = nn.BCELoss() # 假设生成器生成的样本为fake_samples,真实样本为real_samples fake_samples = torch.randn(64, 100) # 假设batch_size是64,输入维度是100 real_samples = torch.randn(64, 784) # 假设batch_size是64,输入维度是784 # 生成器的输出 generated_samples = generator(fake_samples) # 判别器对生成样本和真实样本的预测 discriminator_output_fake = discriminator(generated_samples) discriminator_output_real = discriminator(real_samples) # 计算对抗损失 loss_fake = adversarial_loss(discriminator_output_fake, torch.zeros_like(discriminator_output_fake)) loss_real = adversarial_loss(discriminator_output_real, torch.ones_like(discriminator_output_real)) # 总的对抗损失 total_adversarial_loss = loss_fake + loss_real # 输出损失值 print("总的对抗损失:", total_adversarial_loss.item())
总的对抗损失: 1.528
以上就是本期全部内容。
猜你还喜欢
- 06-29 [涨姿势] 鱼丸批量化生产流程,什么是鱼丸加工流水线?都有哪些设备组成?
- 06-29 [涨姿势] 食为先培训的陷阱和套路?凉菜不是你想卖就能卖?
- 06-29 [涨姿势] 开面馆不是梦,但也不是人人都能驾驭
- 05-13 [摄影] 让手机秒变单反的手机拍摄好物
- 05-11 [摄影] 想挣钱的摄影师建议收藏!
- 05-11 [美食] 选址秘籍:从摆摊到开小店,大数据地图助你找到理想店铺位置
- 05-04 [知识分享] 「科普」不知道电影资源那么长一大串名字是什么意思?看完这个你就明白了!
- 04-30 [摄影] 玩转手机摄影 | 滤镜手机支架
- 04-30 [经验] 摆地摊的八大禁忌
- 04-27 [绘画] 油画棒原创作品【绽放】图文教程来咯~
- 04-17 [涨姿势] 餐饮管理故事:对不起,我订错了雅间,怎么办?(附解决方案)
- 03-29 [摄影课堂] 电光火石间的决定
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[书籍] 【帛书版】合集
[老照片] 一万张珍贵历史老照片【jpg 40.4GB】
[素材] 2024新年春节烟花素材合集【PSD格式+PNG格式】
[美剧] 《生活大爆炸》S01-S12季合集 【1080P 蓝光原盘REMUX】 DTS-HD.MA.5.1 【外挂简英双语字幕】 742.8G
[电影] 茶馆(1982)蓝光原盘REMUX 内封简繁英.简中简繁四字幕【33.9G】本片根据老舍同名原著改编
[电视剧] 永夜星河(2024)【4K 2160P 杜比音效】国语中字【全32集完结】爱情,古装 又名 :黑莲花攻略手册
[影视合集] 《霍比特人》三部曲加长版合集 【4K 蓝光 HDR】 TrueHD.7.1 国语次世代+导评 【国配简繁英特效+导评中字五字幕】134G
[课程] 2024邓诚高三数学视频课【MP4 12.2GB】
[电视剧] 宿敌(2024)【完结】【4K / 臻彩视听 / 杜比音效】【廖凡/朱珠】【17.8G】
[影视合集] 【鹿鼎记 7个版本合集】【1984-2020】【4K、1080P、720P】【中文字幕】【278.5G】
[书籍] 彭子益医书合集 [PDF/DOC]
[动画] 2002《火影忍者》720集全【4K典藏版】+11部剧场版+OVA+漫画 内嵌简日字幕
[剧集] 《斯巴达克斯》1-4季合集 无删减版 1080P 内嵌简英特效字幕
[电影] 《变形金刚系列》七部合集 [4K HDR 蓝光] 国英双语音轨 [内封精品特效字幕]【典藏版】235G
[CG剧情] 《黑神话:悟空》158分钟CG完整剧情合集 4K120帧最高画质
[动画] 收藏版:1996-2024年名侦探柯南全系列1080P,含国配、日配双语版+26部剧场作品
[游戏] 黑神话悟空离线完整版+修改器
[电影] 《神奇动物在哪里三部合集》 4K REMUX原盘 [杜比视界] [国英双语音轨] 特效字幕 [171.1G]
[动画] 西游记 (1999) 动画版 4K 全52集 高清修复版 童年回忆
[电影] 我的阿勒泰 (2024) 4K内封简繁 全8集 9.57G
[电影] 《黄飞鸿》全系列合集
[Android] 开罗游戏 ▎像素风格的模拟经营的游戏厂商安卓游戏大合集
[游戏合集] 要战便战 v0.9.107 免安装绿色中文版
[电影] 【珍藏版】20世纪电影合集从1922年到1990年代,看看爷爷辈的电影是什么样合集约212G
[书籍] 彭子益医书合集 [PDF/DOC]
[系统]【黑果小兵】macOS Big Sur 11.0.1 20B50 正式版 with Clover 5126 黑苹果系统镜像下载
[美图] 【经典收藏美图集合】1500多张韩国美女高清图片让你的收藏夹更加丰富多彩
[瓜] 青岛【路虎女】插队、逆行、追尾、打人未删减【完整版视频】
[电视剧] 灵魂摆渡(1-3季合集)【未删减】【4K.无水印】【剧情/恐怖/惊悚】【豆瓣8.7】
[书籍资料] 《玉房秘诀》《玉房秘典》《古代房中术》
- 最新评论
-
电影很不错谢谢分享贪睡的猫 评论于:11-18 一部不错的经典科幻kelvin 评论于:11-13 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢285552528 评论于:11-09 找了好久的资源bjzchzch12 评论于:11-07 谢谢分享感谢ppy2016 评论于:11-05 谢谢分享感谢ppy2016 评论于:11-05 有靳东!嘻嘻奥古斯都.凯撒 评论于:10-28 流星花园是F4处女作也是4人集体搭配的唯一一部!奥古斯都.凯撒 评论于:10-28 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢AAAAA 评论于:10-26 找了好久的资源,终于在这里找到了。感谢本站的资源和分享。谢谢password63 评论于:10-26
- 热门tag