减少多层的维度是否允许在最终表示中存储更多细节?
Does the reduction of the dimensions over multiple layers allow more details to be stored within the final representation?
发件人:https://debuggercafe.com/implementing-deep-autoencoder-in-pytorch/
定义了以下自动编码器
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
# encoder
self.enc1 = nn.Linear(in_features=784, out_features=256)
self.enc2 = nn.Linear(in_features=256, out_features=128)
self.enc3 = nn.Linear(in_features=128, out_features=64)
self.enc4 = nn.Linear(in_features=64, out_features=32)
self.enc5 = nn.Linear(in_features=32, out_features=16)
# decoder
self.dec1 = nn.Linear(in_features=16, out_features=32)
self.dec2 = nn.Linear(in_features=32, out_features=64)
self.dec3 = nn.Linear(in_features=64, out_features=128)
self.dec4 = nn.Linear(in_features=128, out_features=256)
self.dec5 = nn.Linear(in_features=256, out_features=784)
def forward(self, x):
x = F.relu(self.enc1(x))
x = F.relu(self.enc2(x))
x = F.relu(self.enc3(x))
x = F.relu(self.enc4(x))
x = F.relu(self.enc5(x))
x = F.relu(self.dec1(x))
x = F.relu(self.dec2(x))
x = F.relu(self.dec3(x))
x = F.relu(self.dec4(x))
x = F.relu(self.dec5(x))
return x
net = Autoencoder()
从Autoencoder
class可以看出,784个特征经过一系列的变换,转化为16个特征。
每一层的转换(in_features
到 out_features
)是:
784 to 256
256 to 128
128 to 64
64 to 32
32 to 16
我们为什么要执行这一系列操作?例如,我们为什么不执行以下操作序列呢?
784 to 256
256 to 128
或者也许
784 to 512
512 to 256
256 to 128
或者只是分两层编码:
784 to 16
减少多层(而不是单层)的维度是否允许在最终表示中存储更多细节?例如,如果我们仅使用 $784 \rightarrow 16$ 转换,这是否会导致某些细节未被编码?如果是,为什么会这样?
嗯,是的。减少多层的维度允许模型学习比其他方式更多的信息。你也可以用它做一个实验;将自动编码器更改得更浅,看看它学到了什么表示!
无论如何,请用更简单的术语来考虑:假设您有一个回归系统。与像 y = a0 + a1.x 这样的简单线性变换相反,使用更高阶多项式来逼近任务的回归具有更多 逼近能力 ,因为缺乏更好的条款。这就是为什么它们容易过度拟合的原因;他们过于完美地逼近训练数据,因此以后难以概括。然而,根据经验,过度拟合模型可能被认为是比欠拟合模型更可取的场景:因为您可以对过度拟合模型进行正则化以更好地泛化,但欠拟合模型可能根本无法逼近您的任务。
现在让我们考虑一个深度神经网络。就其核心而言,神经网络也是一个高度复杂的函数,可帮助您近似完成一项任务。如果你有一个线性层将 784 个输入特征映射到 16 个输出特征,它基本上是在做一个简单的转换:ReLU(X.W+B)
。但是如果你穿过多层,你的转换就会变成像 ReLU((ReLU((ReLU(X.W1+B1)).W2+B2)).W3+B3)
等等。这是一个更复杂的函数,具有更高的逼近能力,这意味着它可以更好地逼近您的任务,并学习更好的表示。这个概念一般适用于深度学习,尤其适用于卷积层。您会注意到大多数深度学习模型架构基本上都是层层或块层层叠叠。
发件人:https://debuggercafe.com/implementing-deep-autoencoder-in-pytorch/ 定义了以下自动编码器
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
# encoder
self.enc1 = nn.Linear(in_features=784, out_features=256)
self.enc2 = nn.Linear(in_features=256, out_features=128)
self.enc3 = nn.Linear(in_features=128, out_features=64)
self.enc4 = nn.Linear(in_features=64, out_features=32)
self.enc5 = nn.Linear(in_features=32, out_features=16)
# decoder
self.dec1 = nn.Linear(in_features=16, out_features=32)
self.dec2 = nn.Linear(in_features=32, out_features=64)
self.dec3 = nn.Linear(in_features=64, out_features=128)
self.dec4 = nn.Linear(in_features=128, out_features=256)
self.dec5 = nn.Linear(in_features=256, out_features=784)
def forward(self, x):
x = F.relu(self.enc1(x))
x = F.relu(self.enc2(x))
x = F.relu(self.enc3(x))
x = F.relu(self.enc4(x))
x = F.relu(self.enc5(x))
x = F.relu(self.dec1(x))
x = F.relu(self.dec2(x))
x = F.relu(self.dec3(x))
x = F.relu(self.dec4(x))
x = F.relu(self.dec5(x))
return x
net = Autoencoder()
从Autoencoder
class可以看出,784个特征经过一系列的变换,转化为16个特征。
每一层的转换(in_features
到 out_features
)是:
784 to 256
256 to 128
128 to 64
64 to 32
32 to 16
我们为什么要执行这一系列操作?例如,我们为什么不执行以下操作序列呢?
784 to 256
256 to 128
或者也许
784 to 512
512 to 256
256 to 128
或者只是分两层编码:
784 to 16
减少多层(而不是单层)的维度是否允许在最终表示中存储更多细节?例如,如果我们仅使用 $784 \rightarrow 16$ 转换,这是否会导致某些细节未被编码?如果是,为什么会这样?
嗯,是的。减少多层的维度允许模型学习比其他方式更多的信息。你也可以用它做一个实验;将自动编码器更改得更浅,看看它学到了什么表示!
无论如何,请用更简单的术语来考虑:假设您有一个回归系统。与像 y = a0 + a1.x 这样的简单线性变换相反,使用更高阶多项式来逼近任务的回归具有更多 逼近能力 ,因为缺乏更好的条款。这就是为什么它们容易过度拟合的原因;他们过于完美地逼近训练数据,因此以后难以概括。然而,根据经验,过度拟合模型可能被认为是比欠拟合模型更可取的场景:因为您可以对过度拟合模型进行正则化以更好地泛化,但欠拟合模型可能根本无法逼近您的任务。
现在让我们考虑一个深度神经网络。就其核心而言,神经网络也是一个高度复杂的函数,可帮助您近似完成一项任务。如果你有一个线性层将 784 个输入特征映射到 16 个输出特征,它基本上是在做一个简单的转换:ReLU(X.W+B)
。但是如果你穿过多层,你的转换就会变成像 ReLU((ReLU((ReLU(X.W1+B1)).W2+B2)).W3+B3)
等等。这是一个更复杂的函数,具有更高的逼近能力,这意味着它可以更好地逼近您的任务,并学习更好的表示。这个概念一般适用于深度学习,尤其适用于卷积层。您会注意到大多数深度学习模型架构基本上都是层层或块层层叠叠。