⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

第28章 生成对抗网络

习题28.1

  GAN的生成网络的学习可以定义为以下的最小化问题:

minθ{EzPseed (z)[log(1D(G(z;θ);φ¯))log(D(G(z;θ);φ¯))]}

比较与式(28.2)的不同,并考虑其作用。

解答:

解答思路:

  1. 给出式(28.2)定义的生成网络学习的最小化目标函数
  2. 比较题中公式和式(28.2)定义的生成网络学习的最小化目标函数函数
  3. 分析题中的最小化问题的目标函数的作用

解答步骤:

第1步:给出式(28.2)定义的生成网络学习的最小化目标函数

  根据书中第28.1.1节的公式(28.2):

  假设已给训练数据D遵循分布Pdata(x),其中x是样本。生成网络用 x=G(z;θ)表示,其中z是输入向量(种子),x 是输出向量(生成数据),θ是网络参数。判别网络是一个二类分类器,用P(1|x)=D(x;θ)表示,其中x是输入向量,P(1|x)1P(1|x)是输出概率,分别白哦是输入x来自训练数据和生成数据的概率,φ是网络参数。种子z遵循分布Pseed(z),生成网络生成的数据分布表示为Pgen(x),由Pseed(z)x=G(z;θ)决定。
  如果判别网络参数 φ 固定,可以通过最小化以下目标函数学习生成网络参数θ。

(28.2)minθ{EzPseed (z)[log(1D(G(z;θ);φ¯))}

第2步:比较题中公式和式(28.2)定义的生成网络学习的最小化目标函数

  题中GAN的生成网络的学习可以定义为以下的最小化问题:

minθ{EzPseed (z)[log(1D(G(z;θ);φ¯))log(D(G(z;θ);φ¯))]}

与式(28.2)比较,式中多减去了一项:

minθ{EzPseed(z)[log(D(G(z;θ);φ¯))}

第3步:分析题中的最小化问题的目标函数的作用

  令x=D(G(z;θ);φ¯),则最小化问题可表示为

minθ{EzPseed (z)[log(1x)logx]}

  题中最小化问题的目标函数的作用:

  1. 加速目标函数优化过程的收敛速度:对于log(1x)logx,其求导结果为1(1x)x,可以有效防止x取值时导致的梯度减小而难以训练的情况。
  2. 防止出现在学习的初始情况,由于生成网络较弱,判别网络很容易区分生成数据和判别数据,导致生成网络的学习难以进行下去的情况。

习题28.2

  两个人进行零和博弈,参与人XY可选择的策略分别是X={1,2}Y={1,2}。在博弈中,若参与人XY分别选择iXjY,则X的损失或Y的收益是aij。整体由矩阵A=(aij)表示,矩阵A定义为:

A=[1241]

针对这个博弈求 minimaxjaijmaxjminiaij,并验证这时maxjminiaijminimaxjaij成立。

解答:

解答思路:

  1. 给出零和博弈的概念
  2. 结合零和博弈的概念,给出题中的求解方法
  3. 自编程对该博弈进行求解
  4. 验证这时maxjminiaijminimaxjaij的关系

解答步骤:

第1步:零和博弈的概念

  根据维基百科中的零和博弈
(参考资料:https://zh.wikipedia.org/wiki/零和博弈

  零和博弈,又称零和游戏或零和赛局(Zero-sum game)与非零和博弈相对,是博弈论的一个概念,属非合作博弈。零和博弈表示所有博弈方的利益之和为零或一个常数,即一方有所得,其他方必有所失。在零和博弈中,博弈各方是不合作的。

第2步:结合零和博弈的概念,给出题中的求解方法

  结合第1步给出的零和博弈概念,该博弈的收益矩阵为:

A=[1241]

  考虑最小最大化原则,即如果参与人X先选择策略,此时参与人X会选择使自己最小收益最大化的策略,即对应maxjminiaij
  而对应计算过程,则是先按行计算每一行最小值,然后在每一行的最小值中选择最大值,得到maxjminiaij

  考虑最大最小化原则,即如果参与人Y先选择策略,此时参与人Y会选择使对方最大收益最小化的策略,即对应minimaxjaij
  而对应计算过程,则是先按列计算每一行最大值,然后在每一行的最大值中选择最小值,得到minimaxjaij

第3步:自编程对该博弈进行求解

python
import numpy as np
python
def minmax_function(A):
    """
    从收益矩阵中计算minmax的算法
    :param A: 收益矩阵
    :return: 计算得到的minmax结果
    """
    index_max = []
    for i in range(len(A)):
        # 计算每一行的最大值
        index_max.append(A[i,:].max())
    
    # 计算每一行的最大值中的最小值
    minmax = min(index_max)
    return minmax
python
def maxmin_function(A):
    """
    从收益矩阵中计算maxmin的算法
    :param A: 收益矩阵
    :return: 计算得到的maxmin结果
    """
    column_min = []
    for i in range(len(A)):
        # 计算每一列的最小值
        column_min.append(A[:,i].min())
        
    # 计算每一列的最小值中的最大值
    maxmin = max(column_min)
    return maxmin
python
# 创建收益矩阵
A = np.array([[-1,2],[4,1]])
# 计算maxmin
maxmin = maxmin_function(A)
# 计算minmax
minmax = minmax_function(A)
# 输出结果
print("maxmin =", maxmin)
print("minmax =", minmax)
maxmin = 1
minmax = 2

第4步:验证这时maxjminiaijminimaxjaij的关系

  由上步可得:

maxjminiaij=1minimaxjaij=2

这时maxjminiaijminimaxjaij成立。

习题28.3

  计算以下两个概率分布的Jessen-Shannon散度,设0log0=0

0.10.70.10.10
0.2000.80

解答:

解答思路:

  1. 给出Jessen-Shannon散度的定义
  2. 写出题中数据的Jessen-Shannon散度数值计算过程
  3. 使用自编程实现并验证计算结果

解答步骤:

第1步:Jessen-Shannon散度的定义

  根据维基百科的Jessen-Shannon散度
(参考Wiki:https://en.wikipedia.org/wiki/Jensen–Shannon_divergence

给出两个概率分布PQ,其Jessen-Shannon散度为:

JS(PQ)=12D(PM)+12D(QM)

其中M=12(P+Q)D()表示为KL散度。

  根据书中附录E的KL散度的定义:

KL散度是描述两个概率分布Q(x)P(x)相似度的一种度量,记作D(QP)。对离散随机变量,KL散度定义为

D(QP)=iQ(i)logQ(i)P(i)

对连续随机变量,KL散度定义为

D(PQ)=Q(x)logQ(x)P(x)dx

第2步:写出题中数据的Jessen-Shannon散度数值计算过程

  由于题中数据是离散值,采用对离散随机变量的KL散度公式进行计算,得到:

P=[0.1,0.7,0.1,0.1,0]Q=[0.2,0,0,0.8,0]M=12(P+Q)=[0.15,0.35,0.05,0.45,0]

  则对应KL散度为:

D(PM)=iP(i)lnP(i)M(i)=ln20.3ln3D(QM)=iQ(i)lnQ(i)M(i)=3.6ln21.8ln3

计算JS散度,得到:

JS(PQ)=12D(PM)+12D(QM)=12(4.6ln22.1ln3)=2.3ln21.05ln3=0.440696

第3步:使用自编程实现并计算结果

  通过调用scipy.statsentropy函数,根据题目中的两个概率分布进行计算,得到两个分布的Jessen-Shannon散度。

python
from scipy.stats import entropy
import numpy as np
python
# 加载数据
P = [0.1, 0.7, 0.1, 0.1, 0]
Q = [0.2, 0, 0, 0.8, 0]

# 计算z=(x+y)/2
M =[(P[i] + Q[i]) / 2 for i in range(min(len(P),len(Q)))]

# 计算P和M之间的KL散度,Q和M之间的KL散度
DL_P_M = entropy(P, M)
DL_Q_M = entropy(Q, M)

# 计算JS散度
result = (DL_P_M + DL_Q_M) / 2

# 输出结果
print("Jessen-Shannon Distance = {:f}".format(result))
Jessen-Shannon Distance = 0.440696

可得到两个概率分布的Jessen-Shannon散度为0.440696。

习题28.4

  证明两个概率分布 PQ 之间的 Jessen-Shannon 散度满足以下关系,当且仅当 PQ 相同时取最小值 0,设对数是自然对数。

0JS(PQ)ln2

解答:

解答思路:

  1. 给出两个概率分布PQ之间的Jessen-Shannon散度
  2. 证明当且仅当PQ相同时,Jessen-Shannon散度取最小值0
  3. 证明Jessen-Shannon散度取最大值 ln2(设对数是自然对数)
  4. 结合上述证明,得到 JS(PQ) 关系式

解答步骤:

第1步:两个概率分布 𝑃 和 𝑄 之间的Jessen-Shannon散度

  根据维基百科的Jessen-Shannon散度
(参考Wiki:https://en.wikipedia.org/wiki/Jensen–Shannon_divergence

给出两个概率分布PQ,其Jessen-Shannon散度为:

JS(PQ)=12D(PM)+12D(QM)

其中M=12(P+Q)D()表示为KL散度。

第2步:证明当且仅当 PQ 相同时,Jessen-Shannon散度取最小值0

  首先,将两个概率分布PQ的Jessen-Shannon散度展开为Kullback–Leibler散度形式:

JS(PQ)=12D(PM)+12D(QM)

  根据书中附录E的KL散度的性质:

KL散度具有性质:$ D(P | Q) \geqslant 0$。当且仅当 Q=P 时,D(PQ)=0

  将上述KL散度的性质带入两个概率分布P和Q的Jessen-Shannon散度展开式可知:当且仅当PM相同,且QM相同时,则有

JS(PQ)=0

根据M的定义可知,则有

P=Q=M=12(P+Q)

  综上所述,可证得当前仅当PQ相同时,Jessen-Shannon散度取最小值0。

第3步:证明Jessen-Shannon散度取最大值 ln2(设对数是自然对数)

  可知两个概率分布PQ的Jessen-Shannon散度可表示为:

JS(PQ)=12D(PM)+12D(QM)
  1. 假设PQ是连续型随机变量的概率分布

  将连续随机变量的KL散度公式带入展开,并且将M=12(P+Q)代入:

JS(PQ)=12P(x)ln(P(x)P(x)+Q(x)2)dx+12Q(x)ln(Q(x)P(x)+Q(x)2)dx=12P(x)ln(2P(x)P(x)+Q(x))dx+12Q(x)ln(2Q(x)P(x)+Q(x))dx=12[P(x)ln(P(x)P(x)+Q(x))+Q(x)ln(Q(x)P(x)+Q(x))]dx+ln2

可知:

ln(P(x)P(x)+Q(x))0ln(Q(x)P(x)+Q(x))0

可得:

12[P(x)ln(P(x)P(x)+Q(x))+Q(x)ln(Q(x)P(x)+Q(x))]dx0

所以:

JS(PQ)=12[P(x)ln(P(x)P(x)+Q(x))+Q(x)ln(Q(x)P(x)+Q(x))]dx+ln2ln2

当且仅当概率分布PQ完全不重叠时,Jessen-Shannon散度的最大值为ln2

  1. 假设PQ是离散型随机变量的概率分布

  将离散随机变量的KL散度公式带入展开,并且将M=12(P+Q)代入:

JS(PQ)=12D(PM)+12D(QM)=12iP(i)ln(P(i)P(i)+Q(i)2)+12iQ(i)ln(Q(i)P(i)+Q(i)2)=12iP(i)ln(2P(i)P(i)+Q(i))+12iQ(i)ln(2Q(i)P(i)+Q(i))=12i[P(i)ln(P(i)P(i)+Q(i))+Q(i)ln(Q(i)P(i)+Q(i))]+ln2

可知:

ln(P(i)P(i)+Q(i))0ln(Q(i)P(i)+Q(i))0

可得:

12i[P(i)ln(P(i)P(i)+Q(i))+Q(i)ln(Q(i)P(i)+Q(i))]0

所以:

JS(PQ)=12i[P(i)ln(P(i)P(i)+Q(i))+Q(i)ln(Q(i)P(i)+Q(i))]+ln2ln2

当且仅当概率分布PQ完全不重叠时,Jessen-Shannon散度的最大值为ln2

故,可得:

JS(PQ)ln2

第4步:结合上述证明,得到 JS(PQ) 关系式

  根据第2步和第3步,两个概率分布 PQ 之间的 Jessen-Shannon 散度满足以下关系,当且仅当 PQ 相同时取最小值 0,设对数是自然对数。

0JS(PQ)ln2

习题28.5

  考虑一维卷积运算,其输入是5维的向量 x,输出是3维向量 z。卷积核是 w=(w1,w2,w3),步幅为1,填充为0。写出该卷积运算的矩阵表示,给出对应的转置卷积,并且验证原始卷积核 w 和转置卷积核 w 之间有 w=rot180(w) 成立。

解答:

解答思路:

  1. 写出该卷积运算的矩阵表示
  2. 写出对应的转置卷积
  3. 证明原始卷积核 w 和转置卷积核 w 满足 w=rot180(w)

解答步骤:

第1步:写出该卷积运算的矩阵表示

  假设输入的5维向量 x 表示为$[ x_1, x_2, x_3, x_4, x_5 ]^T $,输出的3维向量 z 表示为$[ z_1, z_2, z_3]^T $

  根据书中第28.2.1节的卷积运算的矩阵表示,可构建矩阵C

C=[w1w2w3000w1w2w3000w1w2w3]

  根据书中第28.2.1节关于矩阵 C 的线性变换描述:

  考虑基于矩阵 C 的线性变换,其输入是输入矩阵展开的向量,输出是输出矩阵展开的向量。这个线性变换对应神经网络前一层道后一层的信号传递(正向传播),而以上卷积运算表示在这个线性变换中。

可得卷积运算的矩阵表示:

[w1w2w3000w1w2w3000w1w2w3][x1x2x3x4x5]=[z1z2z3]

第2步:写出对应的转置卷积

  根据书中第28.2.1节的转置卷积的描述,可构建矩阵CT

CT=[w100w2w10w3w2w10w3w200w3]

  根据书中第28.2.1节关于矩阵CT的线性变换描述:

考虑基于转置矩阵CT的线性变换。这个线性变换对应神经网络后一层到前一层的信号传递(反向传播)。

可得对应的转置卷积为

[w100w2w10w3w2w10w3w200w3][z1z2z3]=[x1x2x3x4x5]

这个转置卷积是核矩阵为w=(w3,w2,w1)、填充为2、步幅为1的卷积运算。

第3步:证明原始卷积核 w 和转置卷积核 w 满足 w=rot180(w)

  因为原始卷积核w=(w1,w2,w3),而转置卷积核w=(w3,w2,w1),可得:

w=rot180(w)

习题28.6

  写出图28.8中转置卷积的大小和原始卷积的大小之间的关系,转置卷积有输入矩阵尺寸 I^、卷积核尺寸 K、步幅 S、填充尺寸 P、输出矩阵尺寸 O

28-6.png

解答:

解答思路:

  1. 给出转置卷积的大小计算
  2. 写出图中转置卷积的大小
  3. 写出图中原始卷积的大小
  4. 写出图中转置卷积的大小和原始卷积的大小之间的关系

解答步骤:

第1步:给出转置卷积的大小计算

  根据书中第28.2.1节的转置卷积的大小计算:

首先,计算原始卷积的大小。这里考虑简单的情况。假设输入矩阵是方阵,卷积核矩阵也是方阵。设 I 是输入矩阵的尺寸,K 是卷积核的尺寸,P 是填充的尺寸,S 是步幅。输出矩阵的尺寸 O 满足

(28.13)O=I+2PKS+1

这里考虑可以整除的情况,式(28.13)可以改为对应的形式:

I=[O+(O1)(S1)]+2(KP1)K1+1

接着,计算转置卷积的大小。设 I 是输入矩阵的尺寸,K 是卷积核的尺寸,P 是填充的尺寸,S 是步幅。输出矩阵的尺寸O 满足

O=I+2PKS+1

这里也考虑可以整除的情况。转置卷积的输出矩阵尺寸 O 与原始卷积的输入矩阵尺寸 I 相同。因此,可以推算,当 $S = 1, P = 0 $时,转置卷积的大小和原始卷积的大小之间有以下关系:

I=O,P=K1,K=K,S=1O=O+K1

第2步:写出图中转置卷积的大小

  根据图中的信息,转置卷积的输入矩阵(插入0向量后)尺寸为5,卷积核尺寸为3,步幅为1,填充尺寸为1, 输出矩阵尺寸为5,即 I^=5,K=3,S=1,P=1,O=5

第3步:写出图中原始卷积的大小

  根据图中的信息,原始卷积输入矩阵尺寸为5,卷积核尺寸为3,步幅为1,填充尺寸为0,输出矩阵尺寸为3,即 I=5,K=3,S=1,P=0,O=3

第4步:写出图中转置卷积的大小和原始卷积的大小之间的关系

  当 S=1,P=0 时,转置卷积的大小和原始卷积的大小之间有以下关系成立:

I^=O+(O1)P=K2K=KS=1O=O+K1

参考文献

【1】零和博弈(来源于Wiki百科):https://zh.wikipedia.org/wiki/零和博弈
【2】Jessen-Shannon散度(来源于Wiki百科):https://en.wikipedia.org/wiki/Jensen–Shannon_divergence