神经风格迁移-风格代价函数(Style cost function)

来源:Coursera吴恩达深度学习课程

神经风格迁移(neural style transfer)是神经网络一个有意思的应用,要构建一个神经风格迁移系统,需要为生成的图像定义代价函数(cost function)。上一篇文章定义了内容代价函数(Content cost function),这篇文章我们来了解风格代价函数(style cost function)

你有这样一张彩色图片,现在你选择了某一层l(蓝色框部分)去为图片的风格定义一个深度测量(deep measure),现在我们要做的就是将图片的风格定义为l层中各个通道之间激活项的相关系数(correlation)。如何知道这些不同通道之间激活项的相关系数呢?

如上图,将不同的通道渲染成不同的颜色(这里假设有5个通道(channels),将它们染成了五种颜色)。一般情况下,在神经网络中会有许多通道。在第一个通道中含有某个激活项,第二个通道也含有某个激活项,于是它们组成了一对数字。同理,可以得到很多数字对(pairs)

看这个例子,这个红色的通道对应的第2个神经元,它能找出图片中的特定位置是否含有这些垂直的纹理,而第二个通道也就是黄色的通道,对应第4个神经元,它可以粗略地找出橙色的区域。

什么时候两个通道拥有高度相关性呢?如果它们有高度相关性,那么这幅图片中出现垂直纹理的地方,那么这块地方很大概率是橙色的。如果说它们是不相关的,又是什么意思呢?显然,这意味着图片中有垂直纹理的地方很大概率不是橙色的。而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性。

相关系数这个概念为你提供了一种去测量这些不同的特征的方法,比如这些垂直纹理,这些橙色或是其他的特征去测量它们在图片中的各个位置同时出现或不同时出现的频率。

如果我们在通道之间使用相关系数来描述通道的风格,你能做的就是测量你的生成图像中第一个通道(红色)是否与第二个通道(黄色)相关,通过测量,你能得知在生成的图像中垂直纹理和橙色同时出现或者不同时出现的频率,这样你将能够测量生成的图像的风格与输入的风格图像的相似程度。接下来我们证实这种说法。

如上图,对于这两个图像(风格图像S和生成图像G),需要计算一个风格矩阵(style matrix),说得更具体一点就是用l层来测量风格。其中a^[l]_i,j,k表示隐藏层l中(i,j,k)位置的激活值,i,j,k分别表示该位置的高度、宽度以及对应的通道数。计算一个关于l层和风格图像的矩阵,即G^[l][S],这是一个n_c*n_c的矩阵,这个矩阵的高度和宽度都是l层的通道数。矩阵中的k和k'被用来描述k通道和k'通道之间的相关系数。矩阵具体表现为:

解释:用符号i,j表示下届,对i,j,k位置的激活值乘以同样位置的激活值,然后i和j分别加到l层的高度和宽度。严格来说,它是一种非标准的互相关函数(unnormalized cross-covariance),因为我们没有减去平均数,而是将它们直接相乘。这是输入的风格图像构成的风格矩阵,然后对生成图像G做同样的操作:

风格矩阵就是把图中各个高度和宽度的激活项都遍历一遍,并将k和k'通道中对应位置的激活项都进行相乘。现在我们有两个矩阵,分别从风格图像S和生成图像G得到。过程见下图:

最后,上图所示,将S和G代入到风格代价函数中去计算,得到这两个矩阵的误差,这里用的Frobenius范数,实际上是计算两个矩阵对应元素相减的平方的和。把这个式子展开,从k和k'开始作差,然后把所有的结果加起来,作者使用了一个归一化常数(renormalization constant),再在外面加一个平方,但是一般情况下你不用写这么多,一般我们只要将它乘以一个超参数beta就行。

如上图,最后,这是对l层定义的风格代价函数J^[l],实际上,如果你对各层都使用风格代价函数,会让结果变得更好。如果要对各层都使用风格代价函数,你可把各个层的结果(各层的风格代价函数)都加起来,对每个层定义权重,也就是一些额外的(extra)超参数,用lambda^[l]表示。这样将使你能够在神经网络中使用不同的层,包括之前的一些可以测量类似边缘这样的低级特征的层,以及之后的一些能测量高级特征的层,使得我们的神经网络在计算风格时能够同时考虑到这些低级和高级特征的相关系数。这样,在基础的训练中你在定义超参数时,可以尽可能的得到更合理的选择。

把这些东西封装起来,可以定义一个全体代价函数

之后用梯度下降法,或者更复杂的优化算法来找到一个合适的图像G,并计算J(G)的最小值,这样的话,将能够得到非常好看的结果。

以上就是神经风格迁移的内容。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

### 常见的代价函数及其应用场景 在机器学习深度学习领域,代价函数Cost Function)用于衡量模型预测值与真实值之间的差异。通过优化这些代价函数,可以提高模型性能并使其更好地拟合训练数据。 #### 1. **均方误差 (Mean Squared Error, MSE)** 均方误差是最常用的回归问题中的代价函数之一。它计算的是预测值与实际值之间差值平方的平均数。MSE 对于较大的误差更加敏感,因为它会放大较大误差的影响。其定义如下: ```python def mse(y_true, y_pred): return ((y_true - y_pred) ** 2).mean() ``` 该函数广泛应用于线性回归、时间序列预测以及其他连续数值预测的任务中[^3]。 --- #### 2. **交叉熵损失 (Cross-Entropy Loss)** 交叉熵损失常用于分类问题,尤其是多类别分类任务。对于二分类问题,通常使用二元交叉熵;而对于多分类问题,则采用 softmax 和对应的交叉熵组合形式。它的作用在于最大化模型对正确类别的置信度。 公式表示为: \[ \text{Loss} = -\frac{1}{N}\sum_{i=1}^{N}[y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)] \] 适用于图像分类、自然语言处理等场景[^4]。 --- #### 3. **Hinge 损失 (Hinge Loss)** Hinge 损失主要用于支持向量机(SVM)算法中,尤其是在解决二分类问题时表现良好。这种损失函数的目标是使正负样本间的间隔尽可能大。 表达式为: \[ L(y,\hat{y})=\max(0,1-t\cdot s), t \in \{-1,+1\},s=f(x;\theta) \] 适合于需要高精度边界的分类任务,比如垃圾邮件过滤或异常检测[^5]。 --- #### 4. **KL 散度 (Kullback-Leibler Divergence)** KL 散度用来测量两个概率分布之间的距离,在生成对抗网络(GAN)、变分自编码器(VAE)中有重要应用。尽管严格意义上不是一种传统意义上的“损失”,但在某些情况下可作为目标函数的一部分来最小化。 具体实现方式如下所示: ```python import tensorflow.keras.backend as K def kl_divergence(p, q): p = K.clip(p, K.epsilon(), None) q = K.clip(q, K.epsilon(), None) return K.sum(p * K.log(p / q)) ``` 此方法特别适配涉及复杂分布建模的工作流,例如风格迁移或者超分辨率重建[^6]。 --- #### 5. **Huber 损失 (Huber Loss)** Huber 损失是一种折衷方案,结合了 MSE 的平滑性和绝对误差的鲁棒性特点。当残差较小时表现为二次型曲线,而当残差增大到一定程度后则转为线性增长模式。因此非常适合存在离群点的数据集分析场合。 数学描述如下: \[ L_\delta(a)= \begin{cases} \frac {1}{2}(a)^2 & |a|<\delta \\ \delta(|a|-\frac{\delta }{2})& otherwise. \end{cases} \] 典型用途包括强化学习状态价值估计以及金融数据分析等领域[^7]。 --- ### 总结表对比 | 名称 | 主要适用范围 | 特点 | |--------------|-----------------------|----------------------------------------------------------------------| | 均方误差 | 连续变量预测 | 易受极端值影响 | | 交叉熵 | 多类别/二分类 | 提升分类准确性 | | Hinge | 边界清晰的分类 | 支持向量机专属 | | KL 散度 | 分布匹配 | 衡量两分布间差距 | | Huber 损失 | 含有噪声或异常值情况 | 平衡 MSE 和 MAE |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值