准备知识
数据库
我们基于几个基本数据库来验证算法:MNIST 手写字体数据集,CIFAR10 与 CIFAR100 图像分类数据集。
使用 keras 的 datasets 模块来方便地导入数据库:
from keras.datasets import mnist, cifar10, cifar100
# mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
# cifar100
(X_train, y_train), (X_test, y_test) = cifar100.load_data(label_mode='fine')
第一次运行时会自动从网站下载数据库到本地的 ~/.keras/datasets
路径下。导入的数据为 numpy array 类型。可以看看它们的尺寸和数据类型:
print X_train.shape, y_train.shape, X_test.shape, y_test.shape
print X_train.dtype, y_train.dtype, X_test.dtype, y_test.dtype
MNIST 图片大小为 28x28,共有 10 个类别(数字 0 到 9 的手写字体),训练集共有 60000 张图片,测试集共有 10000 张图片。
CIFAR10 共有 10 类图像,每个图像大小为 32x32x3,训练集有 50000 幅图片,测试集有 10000 幅图片。
CIFAR100 图像数目与大小和 CIFAR10 相同,但它的图像包括 100 个类别(所以平均每个类别只有 500+100 幅图)。
三种数据库的数据类型都是 uint8,标签(y_train 和 y_test)的数据类型为 int64。
机器学习算法结构
机器学习算法通常由三部分组成:得分函数(score function)、损失函数(loss function)和优化算法(optimization)。
得分函数定义了模型结构,例如线性分类器、核分类器和神经网络就属于完全不同的模型结构。
相同的模型结构,不同的损失函数也可能定义截然不同的算法模型。例如,线性回归和支持向量机(SVM)的得分函数都是 y=wTx+b ,但线性回归的损失函数是最小平方误差(MSE),而支持向量机的损失函数是合页损失(hinge loss),二者的作用和效果完全不同。
常见算法的得分函数、损失函数和优化算法如下:
算法名称 | 得分函数 | 损失函数 | 优化算法 |
---|---|---|---|
线性回归 | y=wTx+b | MSE: ∑i(yi−(wTx+b))2 | LS 闭合解 |
SVM | y=wTx+b | hinge loss: ∑imax(0,1−t⋅yi ) | SMO, QP, LS |
逻辑回归 | y=11+exp(−wTx) | cross entropy loss: ∑ipilog(qi) | 梯度下降,L-BFGS |
MLP | 多层神经网络 | cross entropy loss: ∑ipilog(qi) | 反向传播 |
其中 MLP 的得分函数为: y=σ(WL⋅...σ(W2⋅σ(