跟我一起学PyTorch-07:嵌入与表征学习

前面介绍了深度神经网络和卷积神经网络,这些神经网络有个特点:输入的向量越大,训练得到的模型越大。但是,拥有大量参数模型的代价是昂贵的,它需要大量的数据进行训练,否则由于缺少足够的训练数据,就可能出现过拟合的问题。尽管卷积神经网络能够在不损失模型性能的情况下减少模型参数,但是仍然需要大量带有标签的数据进行训练。半监督学习通过进一步学习未标签数据来解决这个问题,具体思路是:从未标签数据上学习数据的表征,用这些表征来解决监督学习问题。

本章介绍的非监督学习中的嵌入方法,又称为低维度表征。非监督学习不用自动特征选取,只用少量数据学习一个相对较小的嵌入模型来解决学习问题,如下图所示。

image.png

为了更好地理解嵌入学习,需要探索其他的低维度表征算法,比如可视化和PCA。如果考虑到所有的重要信息都包含在原始的输入时,嵌入学习就等同于一个有效的压缩算法。本章首先介绍经典的降维算法PCA,然后介绍基于强大神经网络的嵌入学习算法。

1.PCA算法

主成分分析(Principal Component Analysis,PCA),是一种分析、简化数据的常用技术。PCA能够减少数据的维度,同时保持数据集中的对方差贡献较大的特征。这种方法是通过保留低阶主成分、忽略高阶主成分做到的。

1.PCA原理

PCA的基本原理是从大量数据中找到少量的主成分变量,在数据维度降低的情况下,尽可能地保留原始数据的信息。比如,假设一个d维的数据,找到一个新的m维数据,其中m<d,这个新的数据尽量保留原始数据有用的信息。简化起见,设d=2,m=1,PCA原理如下图所示。对于xy坐标系中的二维数据(左图),u坐标方向就是就是第一轴方向,即主成分方向,z坐标方向为第二轴方向,u和z相互垂直。数据在第一轴方向上的离散程度最大,即方差最大,意味着数据点在第一轴的投影代表了原始数据的绝大部分信息。首先把第一坐标轴移向横坐标轴(中图),接着把所有数据点沿着第二轴向第一轴投影(右图)。这样PCA就实现了数据降维,由二维降为一维。如果是多维的数据,可以通过迭代过程来执行这个PCA转换。首先沿着这个数据集有最大方差的方向计算一个单位矢量。由于这个方向包含了大部分的信息,选择这个方向作为第一个轴。然后从与这个第一轴正交的矢量集合中,选择一个新的单位矢量,使数据具有最大的方差。这是第二轴。继续这个过程,直到找到代表新轴的d个新向量,将数据投影到这组新的坐标轴上。确定好m个向量,抛弃m个向量外的其他向量,这样主成分向量就保留最多的重要信息。

image.png

从数学上看,PCA可以看做是输入数据X在向量空间W上的投影,向量空间W由输入数据的协方差矩阵的前m个特征向量扩展得到。假设输入数据是一个维度为n * d的矩阵X,需要创建一个尺寸为n * m的矩阵T(PCA变换),可以使用公式T=WX得到。其中,W的每列对于矩阵XX^T的特征向量。

PCA用于数据降维已经很多年了,但是对于分段线性和非线性问题是不起作用的。如下图所示。原始数据是两个同心圆,如果做PCA变换操作,变换后结果还是两个同心圆。作为人来说,可以直观地将两个同心圆进行区分,只要做极坐标变换,两个同心圆就会变成两个竖向量,这样数据就变成线性可分的了。

image.png

上图表示了PCA算法在处理复杂数据时的局限。通常的数据集合(比如图片、文本)都是非线性的,因此有必要找到新的方法来处理非线性的数据降维。采用深度神经网络模型就是一个不错的思路。

2.PCA的PyTorch实现

前面介绍的PCA算法使用了协方差矩阵,下面代码中的PCA计算过程使用SVD。基于PyTorch的PCA方法如下:

from sklearn import datasets
import torch
import numpy as np
import matplotlib.pyplot as plt

def PCA(data, k=2):
    X = torch.from_numpy(data)
    X_mean = torch.mean(X, 0)
    X = X - X_mean.expand_as(X)
    # SVD
    U,S,V = torch.svd(torch.t(X))
    return torch.mm(X,U[:,:k])

iris = datasets.load_iris()
X = iris.data
y = iris.target
X_pca = PCA(X)
pca = X_pca.numpy()

plt.figure()
color = ['red','green','blue']
for i,target_name in enumerate(iris.target_names):
    plt.scatter(pca[y == i, 0], pca[y == i, 1], label=target_name, color=color[i])

plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

image.png

从图中可以看出,对比原始数据和进行PCA的数据,PCA对数据有聚类的作用,有利于数据分类。

2.自编码器

1986年Rumelhart提出了自编码器的概念,并将其用于高维复杂数据的降维。自编码器是一种无监督学习算法,使用反向传播,训练目标是让目标值等于输入值。需要指出,这时的自编码器模型网络的层比较浅,只有一个输入层、一个隐含层、一个输出层。Hinton和Salakhutdinov于2006年在《Reducing the dimensionality of data with neural networks》一文中提出了深度自编码器。其显著特点是,模型网络的层较深,提高了学习能力。一般的,没有特殊说明,常见的自编码器都是深度自编码器。

1.自编码器原理

在前向神经网络中,每一个神经网络层都能够学习更深刻的表征输入。在卷积神经网络中,最后一个卷积层能用作输入图片的低维度表征。但在非监督学习中,就不能用这种前向神经网络来做低维度表征。这些神经网络层的确包含输入数据的信息,但是这些信息是当前神经网络训练得到的,也只对当前的任务或目标函数有效。这样可能会导致一个结果,即一些对当前任务不那么重要的信息丢掉了,但是这些信息对其他分类任务至关重要。

在非监督学习中,提出了新的神经网络。这种新的神经网络叫做自编码器。自编码器的结构如下图所示。输入数据经过编码压缩得到低维度向量,这个部分称为编码器,因为它产生了低维度嵌入或者编码。网络的第二部分不同于在前向神经网络中把嵌入映射为输出标签,而是把编码器逆化,重建原始输入,这个部分称为解码。

image.png

自编码器是一种类似PCA的神经网络,它是无监督学习方法,目标输出就是其输出。尽管自编码器和PCA都能对数据进行压缩,但是自编码器比PCA灵活和强大得多。在编码过程中,自编码器能够表征线性变换,也能够表征非线性变换;而PCA只能表征线性变换。自编码器能够用于数据的压缩和恢复,还可以用于数据的去噪。

2.自编码器的PyTorch实现

为了展示自编码器的性能,本节用PyTorch实现一个自编码器,并用其进行MNIST图片分类。相对于PCA而言,自编码器性能更加优越。为了对比分析,分别用PyTorch实现自编码器来进行MNIST图片分类,自编码器的嵌入维度是2维。自编码器的结构如下图所示。

image.png

基于PyTorch的自编码器如下。
(1)加载库和配置参数

import os
import pdb
import torch
import torchvision
from torch import nn
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import MNIST
from torchvision.utils import save_image
from torchvision import datasets
import matplotlib.pyplot as plt

torch.manual_seed(1)
batch_size = 128
learning_rate = 1e-2
num_epochs = 10

(2)下载数据和预处理

train_dataset = datasets.MNIST(root='./data',train=True,transform=transforms.ToTensor(),download=True)
test_dataset = datasets.MNIST(root='./data',train=False,transform=transforms.ToTensor())

train_loader = DataLoader(train_dataset, batch_size=batch_size,shuffle=True)
test_loader = DataLoader(test_dataset,batch_size=10000,shuffle=False)

(3)自编码器模型</

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值