机器学习
什么是机器学习
- 图灵的这个问题引出了一种新的编程- 范式。
- 机器学习中,输入的是数据和预期的答案,系统输出的是规则。
- 机器学习系统是训练出来的,而不是明确地用程序编写出来的。
机器学习与数理统计的关系
机器学习三要素
- 输入数据点。例如,你的任务是语音识别,那么这些数据点可能是记录人们说话的声音文件。如果你的任务是为图像添加标签,那么这些数据点可能是图像。
- 预期输出的示例。对于语音识别任务来说,这些示例可能是人们根据声音文件整理生成的文本。对于图像标记任务来说,预期输出可能是“狗”“猫”之类的标签。
- 衡量算法效果好坏的方法。这一衡量方法是为了计算算法的当前输出与预期输出的差距。衡量结果是一种反馈信号,用于调节算法的工作方式。这个调节步骤就是我们所说的学习。
机器学习到深度学习
深度学习是机器学习的一个分支,深度学习的层数它强调从连续的层(layer)中进行学习模型中包含多少层,这被称为模型的深度(depth)。现代深度学习包含数十个甚至上百个层,全都是从训练数据中自动学习的。
其他机器学习方法往往仅仅学习一两层的数据表示,因此有时也被称为浅层学习(shallow learning)。
神经网络的核心组件
权重
神经网络中每层对输入数据所做的具体操作保存在该层的权重(weight)中,其本质是一串数字。
-
有些层是无状态的,但大多数的层是有状态的,即层的权重,可以被训练。
-
权重是利用随机梯度下降学到的,其中包含网络的知识。
层:基础组件
神经网络的基本数据结构是层。层是一个数据处理模块。
不同的张量格式与不同的数据处理类型需要用到不同的层。
-
简单的向量 (samples, features),通常用密集连接层(也叫全连接层,densely/fully connected layer)。
-
序列数据 (samples, timesteps, features) ,通常用循环层(recurrent layer,比如 Keras 的 LSTM 层)。
-
图像数据保存在 4D 张量中,通常用二维卷积层(Keras 的 Conv2D)。
损失函数
-
在训练过程中,需要能够衡量该输出与预期值之间的距离,将其最小化。这是神经网络损失函数(loss function)的任务,该函数也叫目标函数(objective function)。
-
损失函数的输入是网络预测值与真实目标值(即你希望网络输出的结果),然后计算一个距离值,衡量该网络在这个示例上的效果好坏(见图 1-8)
对于常见问题,可以遵循简单的原则来选择损失函数。
-
二分类问题,用二元交叉熵(binary crossentropy)损失函数;
-
多分类问题,用分类交叉熵(categorical crossentropy)损失函数;
-
回归问题,用均方误差(mean-squared error)损失函数;
优化器
-
深度学习的基本技巧是利用这个距离值作为反馈信号来对权重值进行微调。这种调节由优化器(optimizer)来完成。执行的是随机梯度下降(SGD)的某个变体
-
一开始对神经网络的权重随机赋值,但随着网络处理的示例越来越多,权重值也在向正确的方向逐步微调,损失值也逐渐降低。这就是训练循环(training loop)
张量
-
前面例子使用的数据存储在多维 Numpy 数组中,也叫张量(tensor)
-
张量的核心在于:它是一个数据容器。它包含的数据几乎总是数值数据
-
矩阵是二维张量。张量是矩阵向任意维度的推广
-
张量的维度(dimension)通常叫作轴(axis),张量轴的个数也叫作阶(rank)
标量(0D张量)
仅包含一个数字的张量叫作标量(scalar,也叫标量张量、零维张量、0D 张量)
-
Numpy中可以用 ndim 属性来查看一个 Numpy 张量的轴的个数。
-
标量张量有 0 个轴(ndim == 0)
>>> import numpy as np
>>> x = np.array(12)
>>> x
array(12)
>>> x.ndim
0
向量(1D张量)
可以根据上面来推,比如[1,2,3,5,7]一组数据就是标量
矩阵(2D张量)
学过线性代数的应该都知道吧
数据批量
-
通常来说,深度学习中张量的第一个轴(0 轴,因为索引从 0 开始)都是样本轴 (samples axis,有时也叫样本维度)。
-
此外,一般不会同时处理整个数据集,而是将数据拆分成小批量。下 面是 MNIST 数据集的一个批量,
批量大小为 128。batch = train_images[:128]
-
然后是下一个批量。
batch = train_images[128:256] -
第 n 个批量。
batch = train_images[128 * n:128 * (n + 1)] -
对于这种批量张量,第一个轴(0 轴)叫作批量轴(batch axis)或批量维度(batch dimension)
深度学习中数据几乎总是以下几种
-
向量数据:2D 张量,形状为 (samples, features)。
-
时间序列数据或序列数据:3D 张量,形状为 (samples, timesteps, features)。
-
图像:4D 张量,形状为 (samples, height, width, channels) 或 (samples, channels, height,width)。
-
视频:5D 张量,形状为 (samples, frames, height, width, channels) 或 (samples, frames,channels, height, width)
张量运算
keras.layers.Dense(512, activation="relu")
-
Dense可以理解为一个函数,输入一个 2D 张量,返回另一个 2D 张量
-
具体操作如下:
output = relu(dot(W, input) + b),其中W 是一个 2D 张量,b 是一个向量 -
这里有三个张量运算:
-
输入张量和张量W 之间的点积运算(dot)
-
得到的 2D 张量与向量 b 之间的加法运算(+)
-
最后的 relu 运算。relu(x) 是 max(x, 0)
广播(Broadcast)
较小的张量会被广播(broadcast),以匹配较大张量的形状。广播包含以下两步。
(1) 向较小的张量添加轴(叫作广播轴),使其 ndim 与较大的张量相同。
(2) 将较小的张量沿着新轴重复,使其形状与较大的张量相同。
构建神经网络的基本步骤
- 对N个类之间的数据点进行分类,则您的网络应以大小为 N 的
Dense层结尾。 - 在单标签、多类分类问题中,您的网络应以
softmax激活结束,以便输出N个输出类的概率分布。 - 分类交叉熵几乎总是您应该用于此类问题的损失函数。它使网络输出的概率分布与目标的真实分布之间的距离最小。
- 在多类分类中,有两种方法可以处理标签:通过 “分类编码” (也称为 “one-hot encoding”) 对标签进行编码,并使用
categorical_crossentropy作为损失函数。** 将标签编码为整数并使用sparse_categorical_crossentropy损失函数。 - 如果需要将数据分类为大量类别,则应通过中间层太小来避免在网络中造成信息瓶颈。
中间层将使用
relu作为他们的“激活函数”,最后一层将使用 sigmoid 激活以输出概率(分数在 0 到 1 之间,表示样本具有目标“1”的可能性,即评论为正面的可能性)。relu(修正线性单位) 是一个用于将负值归零的函数,而 sigmoid 将任意值 “挤压” 到[0, 1]区间中,从而输出可以解释为概率的东西。