时间: 2020-09-03 00:08:26 人气: 2272 评论: 0
这是《使用腾讯云GPU学习深度学习》系列文章的第一篇。本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主。
近年来,深度学习的概念十分火热,人工智能也由于这一技术的兴起,在近几年吸引了越来越多的关注。我们这里,将结合一些基本的用例,简要的介绍一下这一新的技术。
我们首先需要明确人工智能、机器学习以及深度学习三者之间的关系。如NVIDIA官网所述,人工智能是一个非常大的概念,而机器学习只是人工智能的一种实现方法。深度学习是同样也是一种实现机器学习的方法,是在机器学习的基础上建立起来的。这体现在,首先从字面上看,二者都是在“学习”,因此在评价深度学习训练出的模型好坏时,同样直接来源于机器学习的评价方法。其次,深度学习最常见的形式,深度神经网络,直接脱胎于机器学习中的神经网络模型。
因此,本文主要将从评价方法以及模型实现这两个方面,基于传统机器学习的概念,谈一谈深度学习。
我们首先讲一下评价方法问题。为了让本文看起来更加有趣,我们不妨把“机器”理解为“学生”。我们知道,学生有所谓的“好学生”,通常我们搞应试教育,学习成绩好的是“好学生”,不好的就不是“好学生”,但现在流行素质教育,从素质教育的角度看,可能有的学生学习成绩中等,但是团结同学、体育优秀、能歌善舞,这样也算是好学生。
这就涉及到了不同评价标准的问题——应试教育和素质教育。机器学习同样有这两种评价方式,应试教育、唯分数论的监督学习,和素质教育、综合考量并不明确打分的非监督学习。注意这里有一个误区,即可能现在认为素质教育优于应试教育,近期大牛们也一再强调非监督算法的重要意义。但实际上如果拿到一个学习任务,具体使用哪一种方式去分析,还是需要考虑应用场景。通常我们不了解这个学习任务的目的性、需要找线索时,会用非监督找线索,方法包括聚类、降维。而如果明确了学习的目的性,追求高准确率,这时候就需要使用监督学习的方法。
具体举一个鸢尾花分类的例子。我们使用 费雪鸢尾花卉数据集(Fisher's Iris data set),它最初是埃德加·安德森从加拿大加斯帕半岛上的鸢尾属花朵中提取的地理变异数据,包含了150个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾(0)、变色鸢尾(1)和维吉尼亚鸢尾(2)。四个特征被用作样本的定量分析,它们分别是花萼(Sepal)和花瓣(Petal)的长度和宽度:
Sepal Length | Sepal Width | Petal Length | Petal Width | Species |
|---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | 0 |
4.9 | 3.0 | 1.4 | 0.2 | 0 |
4.7 | 3.2 | 1.3 | 0.2 | 0 |
… | … | … | … | … |
7.0 | 3.2 | 4.7 | 1.4 | 1 |
6.4 | 3.2 | 4.5 | 1.5 | 1 |
6.9 | 3.1 | 4.9 | 1.5 | 1 |
… | … | … | … | … |
6.5 | 3.0 | 5.2 | 2.0 | 2 |
6.2 | 3.4 | 5.4 | 2.3 | 2 |
5.9 | 3.0 | 5.1 | 1.8 | 2 |
于是,我们就想,是否可以用鸢尾花数据集里面包含的四个特征,去预测花的种类?如果要这么做,我们首先应该明确不同种类的鸢尾花,这四个特征是否真的有区别(非监督学习),如果确实有所区别,我们就可以在此基础上,用这几个特征去追求高的分类准确性(监督学习)。下面部分我们逐个执行这些步骤。
首先展示不同种类鸢尾花四个数据两两组合的情况,如下:
import matplotlib.pyplot as plt from sklearn import datasets import seaborn as sns %matplotlib inline data = datasets.load_iris() X = data.data color = data.target sns.set_style("white") # compatibility matplotlib < 1.0 df = sns.load_dataset("iris") sns.pairplot(df, hue="species")[/amalthea_sample_code]
这些特征的两两组合,起来确实和花的种类有关。但实际上我们总共有四个维度,这里只能看见两个,我们能否将四个维度换成两个维度、展示在一个平面上呢?这里使用了多种非监督的降维方法,尝试去从非监督的角度,展示不同种类之间的区别:
import matplotlib.pyplot as plt from sklearn import datasets import seaborn as sns %matplotlib inline data = datasets.load_iris() X = data.data color = data.target sns.set_style("white") from sklearn import decomposition from sklearn import manifold from matplotlib.ticker import NullFormatter from time import time n_components = 2 n_neighbors = 10 data = datasets.load_iris() X = data.data color = data.target fig = plt.figure(figsize=(15, 4)) t0 = time() Y = manifold.Isomap(n_neighbors, n_components).fit_transform(X) t1 = time() print("Isomap: %.2g sec" % (t1 - t0)) ax = fig.add_subplot(151) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Set1) plt.title("Isomap (%.2g sec)" % (t1 - t0)) ax.xaxis.set_major_formatter(NullFormatter()) ax.yaxis.set_major_formatter(NullFormatter()) plt.axis('tight') t0 = time() mds = manifold.MDS(n_components, max_iter=100, n_init=1) Y = mds.fit_transform(X) t1 = time() print("MDS: %.2g sec" % (t1 - t0)) ax = fig.add_subplot(152) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Set1) plt.title("MDS (%.2g sec)" % (t1 - t0)) ax.xaxis.set_major_formatter(NullFormatter()) ax.yaxis.set_major_formatter(NullFormatter()) plt.axis('tight') t0 = time() se = manifold.SpectralEmbedding(n_components=n_components, n_neighbors=n_neighbors) Y = se.fit_transform(X) t1 = time() print("SpectralEmbedding: %.2g sec" % (t1 - t0)) ax = fig.add_subplot(153) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Set1) plt.title("SpectralEmbedding (%.2g sec)" % (t1 - t0)) ax.xaxis.set_major_formatter(NullFormatter()) ax.yaxis.set_major_formatter(NullFormatter()) plt.axis('tight') t0 = time() pca = decomposition.PCA(n_components=n_components) pca.fit(X) Y = pca.transform(X) t1 = time() print("PCA: %.2g sec" % (t1 - t0)) ax = fig.add_subplot(154) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Set1) plt.title("PCA (%.2g sec)" % (t1 - t0)) ax.xaxis.set_major_formatter(NullFormatter()) ax.yaxis.set_major_formatter(NullFormatter()) plt.axis('tight') t0 = time() tsne = manifold.TSNE(n_components=n_components, init='pca', random_state=0, perplexity=40) Y = tsne.fit_transform(X) t1 = time() print("t-SNE: %.2g sec" % (t1 - t0)) ax = fig.add_subplot(155) plt.scatter(Y[:, 0], Y[:, 1], c=color, cmap=plt.cm.Set1) plt.title("t-SNE (%.2g sec)" % (t1 - t0)) ax.xaxis.set_major_formatter(NullFormatter()) ax.yaxis.set_major_formatter(NullFormatter()) plt.axis('tight') plt.show()
我们可以看到基于花萼(Sepal)和花瓣(Petal)的长度和宽度特征,可以通过非监督的数学方法,在降维后,将三种鸢尾花分开。由此,我们明确了学习的目的性(根据花萼和花瓣的长度和宽度特征,对三种鸢尾花分类)。其中第一类和其他两类可以很好区分,而第二类、第三类之间区分度并不好,这也是一个潜在的问题。
明确目的之后,我们就可以采用监督学习的方法,使用模型进行分类。监督学习有很多模型,包括深度学习中的神经网络模型。监督学习的基础,是我们已知一部分数据以及其对应的结果,对这些已知结果的数据进行建模,使模型预测的结果和已知的结果越接近越好。这种接近的程度用损失函数来表示,进而通过最小化这个损失函数,得到最优模型。
经典的机器学习方法,可以基于高斯过程:
也可以使用基于核方法的支持向量机:
更可以通过决策树的集成:
同时也可以使用 Tensorflow ,建立一个包含三个隐藏层深度神经网络。以下例子来自 Tensorflow 官网:
from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import urllib import tensorflow as tf import numpy as np IRIS_TRAINING = "iris_training.csv" IRIS_TEST = "iris_test.csv" # 下载数据 for infile in [IRIS_TRAINING, IRIS_TEST]: if not os.path.exists(infile): raw = urllib.urlopen("http://download.tensorflow.org/data/%s" % IRIS_TRAINING_URL).read() with open(infile,'w') as f: f.write(raw) training_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32) test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TEST,