# 判别器标签平滑

标签平滑方法能够一定程度优化DCGAN的训练效果。在训练判别器时，我们鼓励判别器对输入样本的判别值接近设定的标签值，比如生成样本的判别值应接近0，真实样本的判别值应接近1。在二分类问题中，二元交叉熵损失函数的表达式为：

$$
BCELoss=-[y \log \ \hat y + (1-y) \log(1- \hat y)] \tag {4-13}
$$

其中，y为真实标签，$\hat y$为预测值。

判别器最后一层使用的是Sigmoid激活函数，其表达式为：

$$
S(x) = \frac {1} {1+e^{-x}} \tag {4-14}
$$

其中 x 为经过判别器特征提取层提取的输入到Sigmoid激活函数的特征。

在对真实样本进行判别时，随着模型的迭代，判别值和标签值的交叉熵损失逐渐趋于最小值，判别器对于真实样本的判别值越来越接近1。因为要使判别值接近1，Sigmoid激活函数的输入必须趋近于正无穷。模型逐渐向着这个使趋近于正无穷的方向学习。这时，一些判别值较小的样本便会受到影响。因为模型参数已经向趋近于正无穷的方向更新，原本判别值较小的样本在新模型参数的影响下，判别值就会变得更大并向1接近。随着参数的更新，导致判别器对于自己的预测过于“自信”，而忽略样本之间细节的差别，仅仅对样本进行简单直接的判别。所以0或1这类硬标签可能会导致模型过拟合，并削弱模型的学习能力。标签平滑后，可避免模型对硬标签的偏好，使得判别器重视一些判别值与硬标签值差距较小的样本，模型因此有更多学习的空间。同时，标签平滑可以减少标签在计算损失时的权重，起到抑制模型过拟合的作用。因此，我们尝试使用标签平滑方法改进DCGAN的训练。

标签平滑的实现较为简单，仅需将对应的0或1标签替换为设定的浮点数标签。例如训练判别器时，将真样本的标签1替换为(0.9,1)之间的值，将假样本的标签0替换为(0,0.1) 之间的值。标签平滑只对判别器使用，生成器不使用。示例代码如下所示，完整代码可扫描二维码下载。

:::{todo}
待适配
:::

:::{literalinclude} ../codes/chapter_4_3_1_01.py
:caption: chapter_4_3_1_01.py
:language: python
:linenos:
:::

使用判别器标签平滑后的模型训练时间约为200分钟，训练结果为图4-9右图，图4-9左图为未使用改进方法的训练结果。可以看到经过标签平滑后，部分生成结果的真实度有所提高。

:::::{grid} 2 2 2 2

::::{grid-item}
:::{figure} ../../_static/4/4.3/4-9-a.png
:::
::::
::::{grid-item}
:::{figure} ../../_static/4/4.3/4-9-b.png
:::
::::
:::::
<div class="show-mid">图4-9 改进方法前后的建筑立面效果对比</div>
<br>
<br>
