This commit is contained in:
yinkanglong_lab
2020-10-28 21:56:43 +08:00
parent 084f319032
commit 974b0f2026
9 changed files with 496 additions and 499 deletions

View File

@@ -0,0 +1,221 @@
卷积神经网络
## 1 计算机视觉
* **计算机视觉Computer Vision**的高速发展标志着新型应用产生的可能,例如自动驾驶、人脸识别、创造新的艺术风格。人们对于计算机视觉的研究也催生了很多机算机视觉与其他领域的交叉成果。一般的计算机视觉问题包括以下几类:
* 图片分类Image Classification
* 目标检测Object detection
* 神经风格转换Neural Style Transfer
* 应用计算机视觉时要面临的一个挑战是数据的输入可能会非常大。例如一张 1000x1000x3 的图片,神经网络输入层的维度将高达三百万,使得网络权重 W 非常庞大。这样会造成两个后果:
1. 神经网络结构复杂,数据量相对较少,容易出现过拟合;
2. 所需内存和计算量巨大。
* 因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用 **卷积神经网络Convolutional Neural Network, CNN**
## 2 边缘检测
### 卷积运算
* 我们之前提到过,神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到最后面的一层就可以根据前面检测的特征来识别整体面部轮廓。这些工作都是依托卷积神经网络来实现的。
* **卷积运算Convolutional Operation** 是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。
### 边缘检测
* 图片最常做的边缘检测有两类:**垂直边缘Vertical Edges检测**和**水平边缘Horizontal Edges检测**。
![Different-edges](Different-edges.png)
* 图片的边缘检测可以通过与相应滤波器进行卷积来实现。以垂直边缘检测为例,原始图片尺寸为 6x6中间的矩阵被称作**滤波器filter**,尺寸为 3x3卷积后得到的图片尺寸为 4x4得到结果如下数值表示灰度以左上角和右下角的值为例
![Vertical-Edge-Detection](Vertical-Edge-Detection.jpg)
* 可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。下图对应一个垂直边缘检测的例子:
![Convolutional-operation-example](Convolutional-operation-example.jpg)
* 如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。这里有另一个卷积运算的动态的例子,方便理解:
![Convolutional-operation](Convolutional-operation.jpg)
* 图中的`*`表示卷积运算符号。在计算机中这个符号表示一般的乘法,而在不同的深度学习框架中,卷积操作的 API 定义可能不同:
* 在 Python 中,卷积用`conv_forward()`表示;
* 在 Tensorflow 中,卷积用`tf.nn.conv2d()`表示;
* 在 keras 中,卷积用`Conv2D()`表示。
## 3 更多边缘检测的例子
* 如果将灰度图左右的颜色进行翻转,再与之前的滤波器进行卷积,得到的结果也有区别。实际应用中,这反映了由明变暗和由暗变明的两种渐变方式。可以对输出图片取绝对值操作,以得到同样的结果。
![Another-Convolutional-operation-example](Another-Convolutional-operation-example.jpg)
* 垂直边缘检测和水平边缘检测的滤波器如下所示:
![Convolutional-operation](Vertical-and-Horizontal-Filter.png)
* 其他常用的滤波器还有 Sobel 滤波器和 Scharr 滤波器。它们增加了中间行的权重,以提高结果的稳健性。
![Sobel-Filter-and-Scharr-Filter](Sobel-Filter-and-Scharr-Filter.png)
* 滤波器中的值还可以设置为**参数**,通过模型训练来得到。这样,神经网络使用反向传播算法可以学习到一些低级特征,从而实现对图片所有边缘特征的检测,而不仅限于垂直边缘和水平边缘。
## 4 填充padding
### 存在的问题
* 假设输入图片的大小为 $n \times n$,而滤波器的大小为 $f \times f$,则卷积后的输出图片大小为 $(n-f+1) \times (n-f+1)$。
* 这样就有两个问题:
* 每次卷积运算后,输出图片的尺寸缩小;
* 原始图片的角落、边缘区像素点在输出中采用较少,输出图片丢失边缘位置的很多信息。
### 解决办法
* 为了解决这些问题,可以在进行卷积操作前,对原始图片在边界上进行**填充Padding**,以增加矩阵的大小。通常将 0 作为填充值。
![Padding](Padding.jpg)
* 设每个方向扩展像素点数量为 $p$,则填充后原始图片的大小为 $(n+2p) \times (n+2p)$,滤波器大小保持 $f \times f$不变,则输出图片大小为 $(n+2p-f+1) \times (n+2p-f+1)$。
* 在进行卷积运算时,我们有两种选择:
* **Valid 卷积**:不填充,直接卷积。结果大小为 $(n-f+1) \times (n-f+1)$
* **Same 卷积**:进行填充,并使得卷积后结果大小与输入一致,这样 $p = \frac{f-1}{2}$。
* 在计算机视觉领域,$f$通常为奇数。原因包括 Same 卷积中 $p = \frac{f-1}{2}$能得到自然数结果,并且滤波器有一个便于表示其所在位置的中心点。
## 5 卷积步长
* 卷积过程中,有时需要通过填充来避免信息损失,有时也需要通过设置**步长Stride** 来压缩一部分信息。
* 步长表示滤波器在原始图片的水平方向和垂直方向上每次移动的距离。之前,步长被默认为 1。而如果我们设置步长为 2则卷积过程如下图所示
![Stride](Stride.jpg)
* 设步长为 $s$,填充长度为 $p$,输入图片大小为 $n \times n$,滤波器大小为 $f \times f$,则卷积后图片的尺寸为:
$$\biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor$$
* 注意公式中有一个向下取整的符号,用于处理商不为整数的情况。向下取整反映着当取原始矩阵的图示蓝框完全包括在图像内部时,才对它进行运算。
> 目前为止我们学习的“卷积”实际上被称为 **互相关cross-correlation** ,而非数学意义上的卷积。真正的卷积操作在做元素乘积求和之前,要将滤波器沿水平和垂直轴翻转(相当于旋转 180 度)。因为这种翻转对一般为水平或垂直对称的滤波器影响不大,按照机器学习的惯例,我们通常不进行翻转操作,在简化代码的同时使神经网络能够正常工作。
## 6 高维卷积
* 如果我们想要对三通道的 RGB 图片进行卷积运算那么其对应的滤波器组也同样是三通道的。过程是将每个单通道RGB与对应的滤波器进行卷积运算求和然后再将三个通道的和相加将 27 个乘积的和作为输出图片的一个像素值。
![Convolutions-on-RGB-image](Convolutions-on-RGB-image.png)
* 不同通道的滤波器可以不相同。例如只检测 R 通道的垂直边缘G 通道和 B 通道不进行边缘检测,则 G 通道和 B 通道的滤波器全部置零。当输入有特定的高、宽和通道数时,滤波器可以有不同的高和宽,但通道数必须和输入一致。
* 如果想同时检测垂直和水平边缘,或者更多的边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。设输入图片的尺寸为 $n \times n \times n_c$$n_c$为通道数),滤波器尺寸为 $f \times f \times n_c$,则卷积后的输出图片尺寸为 $(n-f+1) \times (n-f+1) \times n'_c$$n'_c$为滤波器组的个数。
![More-Filters](More-Filters.jpg)
## 7 单层卷积网络
### 卷积层实例
![One-Layer-of-a-Convolutional-Network](One-Layer-of-a-Convolutional-Network.jpg)
* 与之前的卷积过程相比较,卷积神经网络的单层结构多了激活函数和偏移量;而与标准神经网络:
$$Z^{[l]} = W^{[l]}A^{[l-1]}+b$$
$$A^{[l]} = g^{[l]}(Z^{[l]})$$
* 相比,滤波器的数值对应着权重 $W^{[l]}$,卷积运算对应着 $W^{[l]}$与 $A^{[l-1]}$的乘积运算,所选的激活函数变为 ReLU。
* 对于一个 3x3x3 的滤波器,包括偏移量 $b$在内共有 28 个参数。不论输入的图片有多大,用这一个滤波器来提取特征时,参数始终都是 28 个,固定不变。即**选定滤波器组后,参数的数目与输入图片的尺寸无关**。因此,卷积神经网络的参数相较于标准神经网络来说要少得多。这是 CNN 的优点之一。
### 符号总结
* $l$ 层为卷积层
* $f^{[l]}$**滤波器的高(或宽)**
* $p^{[l]}$**填充长度**
* $s^{[l]}$**步长**
* $n^{[l]}_c$**滤波器组的数量**
* **输入维度**$n^{[l-1]}_H \times n^{[l-1]}_W \times n^{[l-1]}_c$ 。其中 $n^{[l-1]}_H$表示输入图片的高,$n^{[l-1]}_W$表示输入图片的宽。之前的示例中输入图片的高和宽都相同,但是实际中也可能不同,因此加上下标予以区分。
* **输出维度**$n^{[l]}_H \times n^{[l]}_W \times n^{[l]}_c$ 。其中
$$n^{[l]}_H = \biggl\lfloor \frac{n^{[l-1]}_H+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor$$
$$n^{[l]}_W = \biggl\lfloor \frac{n^{[l-1]}_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor$$
* **每个滤波器组的维度**$f^{[l]} \times f^{[l]} \times n^{[l-1]}_c$ 。其中$n^{[l-1]}_c$ 为输入图片通道数(也称深度)。
* **权重维度**$f^{[l]} \times f^{[l]} \times n^{[l-1]}_c \times n^{[l]}_c$
* **偏置维度**$1 \times 1 \times 1 \times n^{[l]}_c$
> 由于深度学习的相关文献并未对卷积标示法达成一致,因此不同的资料关于高度、宽度和通道数的顺序可能不同。有些作者会将通道数放在首位,需要根据标示自行分辨。
## 8 简单卷积网络示例
* 一个简单的 CNN 模型如下图所示:
![Simple-Convolutional-Network-Example](Simple-Convolutional-Network-Example.jpg)
* 其中,$a^{[3]}$的维度为 7x7x40将 1960 个特征平滑展开成 1960 个单元的一列然后连接最后一级的输出层。输出层可以是一个神经元即二元分类logistic也可以是多个神经元即多元分类softmax。最后得到预测输出 $\hat y$。
* 随着神经网络计算深度不断加深,图片的高度和宽度 $n^{[l]}_H $、$n^{[l]}_W$一般逐渐减小,而 $n^{[l]}_c$在增加。
* 一个典型的卷积神经网络通常包含有三种层:**卷积层Convolution layer**、**池化层Pooling layer**、**全连接层Fully Connected layer**。仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络还是会添加池化层和全连接层,它们更容易设计。
## 9 池化层
* **池化层**的作用是缩减模型的大小,提高计算速度,同时减小噪声提高所提取特征的稳健性。
* 采用较多的一种池化过程叫做**最大池化Max Pooling**。将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:
![Max-Pooling](Max-Pooling.png)
* 池化过程类似于卷积过程,上图所示的池化过程中相当于使用了一个大小 $f=2$的滤波器,且池化步长 $s=2$。卷积过程中的几个计算大小的公式也都适用于池化过程。如果有多个通道,那么就对每个通道分别执行计算过程。
* 对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好。
* 另一种池化过程是**平均池化Average Pooling**,就是从取某个区域的最大值改为求这个区域的平均值:
![Average-Pooling](Average-Pooling.png)
池化过程的特点之一是,它有一组超参数,但是并**没有参数需要学习**。池化过程的超参数包括滤波器的大小 $f$、步长 $s$,以及选用最大池化还是平均池化。而填充 $p$则很少用到。
池化过程的输入维度为:
$$n_H \times n_W \times n_c$$
输出维度为:
$$\biggl\lfloor \frac{n_H-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n_W-f}{s}+1 \biggr\rfloor \times n_c$$
## 卷积神经网络示例
![CNN-Example](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/CNN-Example.jpg)
在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。整个神经网络各层的尺寸与参数如下表所示:
| Activation shape | Activation Size | #parameters
:-: | :-: | :-: | :-:
**Input:** | (32, 32, 3) | 3072 | 0
**CONV1(f=5, s=1)** | (28, 28, 6) | 4704 | 158
**POOL1** | (14, 14, 6) | 1176 | 0
**CONV2(f=5, s=1)** | (10, 10, 16) | 1600 | 416
**POOL2** | (5, 5, 16) | 400 | 0
**FC3** | (120, 1) | 120 | 48120
**FC4** | (84, 1) | 84 | 10164
**Softmax** | (10, 1) | 10 | 850
个人推荐[一个直观感受卷积神经网络的网站](http://scs.ryerson.ca/~aharley/vis/conv/)。
## 使用卷积的原因
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
* **参数共享Parameter sharing**:特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
* **稀疏连接Sparsity of connections**:在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。

View File

@@ -1,222 +0,0 @@
<h1 align="center">卷积神经网络</h1>
## 计算机视觉
**计算机视觉Computer Vision**的高速发展标志着新型应用产生的可能,例如自动驾驶、人脸识别、创造新的艺术风格。人们对于计算机视觉的研究也催生了很多机算机视觉与其他领域的交叉成果。一般的计算机视觉问题包括以下几类:
* 图片分类Image Classification
* 目标检测Object detection
* 神经风格转换Neural Style Transfer
应用计算机视觉时要面临的一个挑战是数据的输入可能会非常大。例如一张 1000x1000x3 的图片,神经网络输入层的维度将高达三百万,使得网络权重 W 非常庞大。这样会造成两个后果:
1. 神经网络结构复杂,数据量相对较少,容易出现过拟合;
2. 所需内存和计算量巨大。
因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用**卷积神经网络Convolutional Neural Network, CNN**。
## 卷积运算
我们之前提到过,神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到最后面的一层就可以根据前面检测的特征来识别整体面部轮廓。这些工作都是依托卷积神经网络来实现的。
**卷积运算Convolutional Operation**是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。
### 边缘检测
图片最常做的边缘检测有两类:**垂直边缘Vertical Edges检测**和**水平边缘Horizontal Edges检测**。
![Different-edges](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Different-edges.png)
图片的边缘检测可以通过与相应滤波器进行卷积来实现。以垂直边缘检测为例,原始图片尺寸为 6x6中间的矩阵被称作**滤波器filter**,尺寸为 3x3卷积后得到的图片尺寸为 4x4得到结果如下数值表示灰度以左上角和右下角的值为例
![Vertical-Edge-Detection](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Vertical-Edge-Detection.jpg)
可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。
下图对应一个垂直边缘检测的例子:
![Convolutional-operation-example](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Convolutional-operation-example.jpg)
如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。
这里有另一个卷积运算的动态的例子,方便理解:
![Convolutional-operation](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Convolutional-operation.jpg)
图中的`*`表示卷积运算符号。在计算机中这个符号表示一般的乘法,而在不同的深度学习框架中,卷积操作的 API 定义可能不同:
* 在 Python 中,卷积用`conv_forward()`表示;
* 在 Tensorflow 中,卷积用`tf.nn.conv2d()`表示;
* 在 keras 中,卷积用`Conv2D()`表示。
### 更多边缘检测的例子
如果将灰度图左右的颜色进行翻转,再与之前的滤波器进行卷积,得到的结果也有区别。实际应用中,这反映了由明变暗和由暗变明的两种渐变方式。可以对输出图片取绝对值操作,以得到同样的结果。
![Another-Convolutional-operation-example](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Another-Convolutional-operation-example.jpg)
垂直边缘检测和水平边缘检测的滤波器如下所示:
![Convolutional-operation](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Vertical-and-Horizontal-Filter.png)
其他常用的滤波器还有 Sobel 滤波器和 Scharr 滤波器。它们增加了中间行的权重,以提高结果的稳健性。
![Sobel-Filter-and-Scharr-Filter](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Sobel-Filter-and-Scharr-Filter.png)
滤波器中的值还可以设置为**参数**,通过模型训练来得到。这样,神经网络使用反向传播算法可以学习到一些低级特征,从而实现对图片所有边缘特征的检测,而不仅限于垂直边缘和水平边缘。
## 填充
假设输入图片的大小为 $n \times n$,而滤波器的大小为 $f \times f$,则卷积后的输出图片大小为 $(n-f+1) \times (n-f+1)$。
这样就有两个问题:
* 每次卷积运算后,输出图片的尺寸缩小;
* 原始图片的角落、边缘区像素点在输出中采用较少,输出图片丢失边缘位置的很多信息。
为了解决这些问题,可以在进行卷积操作前,对原始图片在边界上进行**填充Padding**,以增加矩阵的大小。通常将 0 作为填充值。
![Padding](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Padding.jpg)
设每个方向扩展像素点数量为 $p$,则填充后原始图片的大小为 $(n+2p) \times (n+2p)$,滤波器大小保持 $f \times f$不变,则输出图片大小为 $(n+2p-f+1) \times (n+2p-f+1)$。
因此,在进行卷积运算时,我们有两种选择:
* **Valid 卷积**:不填充,直接卷积。结果大小为 $(n-f+1) \times (n-f+1)$
* **Same 卷积**:进行填充,并使得卷积后结果大小与输入一致,这样 $p = \frac{f-1}{2}$。
在计算机视觉领域,$f$通常为奇数。原因包括 Same 卷积中 $p = \frac{f-1}{2}$能得到自然数结果,并且滤波器有一个便于表示其所在位置的中心点。
## 卷积步长
卷积过程中,有时需要通过填充来避免信息损失,有时也需要通过设置**步长Stride**来压缩一部分信息。
步长表示滤波器在原始图片的水平方向和垂直方向上每次移动的距离。之前,步长被默认为 1。而如果我们设置步长为 2则卷积过程如下图所示
![Stride](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Stride.jpg)
设步长为 $s$,填充长度为 $p$,输入图片大小为 $n \times n$,滤波器大小为 $f \times f$,则卷积后图片的尺寸为:
$$\biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n+2p-f}{s}+1 \biggr\rfloor$$
注意公式中有一个向下取整的符号,用于处理商不为整数的情况。向下取整反映着当取原始矩阵的图示蓝框完全包括在图像内部时,才对它进行运算。
目前为止我们学习的“卷积”实际上被称为**互相关cross-correlation**,而非数学意义上的卷积。真正的卷积操作在做元素乘积求和之前,要将滤波器沿水平和垂直轴翻转(相当于旋转 180 度)。因为这种翻转对一般为水平或垂直对称的滤波器影响不大,按照机器学习的惯例,我们通常不进行翻转操作,在简化代码的同时使神经网络能够正常工作。
## 高维卷积
如果我们想要对三通道的 RGB 图片进行卷积运算那么其对应的滤波器组也同样是三通道的。过程是将每个单通道RGB与对应的滤波器进行卷积运算求和然后再将三个通道的和相加将 27 个乘积的和作为输出图片的一个像素值。
![Convolutions-on-RGB-image](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Convolutions-on-RGB-image.png)
不同通道的滤波器可以不相同。例如只检测 R 通道的垂直边缘G 通道和 B 通道不进行边缘检测,则 G 通道和 B 通道的滤波器全部置零。当输入有特定的高、宽和通道数时,滤波器可以有不同的高和宽,但通道数必须和输入一致。
如果想同时检测垂直和水平边缘,或者更多的边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。设输入图片的尺寸为 $n \times n \times n\_c$$n\_c$为通道数),滤波器尺寸为 $f \times f \times n\_c$,则卷积后的输出图片尺寸为 $(n-f+1) \times (n-f+1) \times n'\_c$$n'\_c$为滤波器组的个数。
![More-Filters](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/More-Filters.jpg)
## 单层卷积网络
![One-Layer-of-a-Convolutional-Network](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/One-Layer-of-a-Convolutional-Network.jpg)
与之前的卷积过程相比较,卷积神经网络的单层结构多了激活函数和偏移量;而与标准神经网络:
$$Z^{[l]} = W^{[l]}A^{[l-1]}+b$$
$$A^{[l]} = g^{[l]}(Z^{[l]})$$
相比,滤波器的数值对应着权重 $W^{[l]}$,卷积运算对应着 $W^{[l]}$与 $A^{[l-1]}$的乘积运算,所选的激活函数变为 ReLU。
对于一个 3x3x3 的滤波器,包括偏移量 $b$在内共有 28 个参数。不论输入的图片有多大,用这一个滤波器来提取特征时,参数始终都是 28 个,固定不变。即**选定滤波器组后,参数的数目与输入图片的尺寸无关**。因此,卷积神经网络的参数相较于标准神经网络来说要少得多。这是 CNN 的优点之一。
### 符号总结
设 $l$ 层为卷积层:
* $f^{[l]}$**滤波器的高(或宽)**
* $p^{[l]}$**填充长度**
* $s^{[l]}$**步长**
* $n^{[l]}\_c$**滤波器组的数量**
* **输入维度**$n^{[l-1]}\_H \times n^{[l-1]}\_W \times n^{[l-1]}\_c$ 。其中 $n^{[l-1]}\_H$表示输入图片的高,$n^{[l-1]}\_W$表示输入图片的宽。之前的示例中输入图片的高和宽都相同,但是实际中也可能不同,因此加上下标予以区分。
* **输出维度**$n^{[l]}\_H \times n^{[l]}\_W \times n^{[l]}\_c$ 。其中
$$n^{[l]}\_H = \biggl\lfloor \frac{n^{[l-1]}\_H+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor$$
$$n^{[l]}\_W = \biggl\lfloor \frac{n^{[l-1]}\_W+2p^{[l]}-f^{[l]}}{s^{[l]}}+1 \biggr\rfloor$$
* **每个滤波器组的维度**$f^{[l]} \times f^{[l]} \times n^{[l-1]}\_c$ 。其中$n^{[l-1]}\_c$ 为输入图片通道数(也称深度)。
* **权重维度**$f^{[l]} \times f^{[l]} \times n^{[l-1]}\_c \times n^{[l]}\_c$
* **偏置维度**$1 \times 1 \times 1 \times n^{[l]}\_c$
由于深度学习的相关文献并未对卷积标示法达成一致,因此不同的资料关于高度、宽度和通道数的顺序可能不同。有些作者会将通道数放在首位,需要根据标示自行分辨。
## 简单卷积网络示例
一个简单的 CNN 模型如下图所示:
![Simple-Convolutional-Network-Example](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Simple-Convolutional-Network-Example.jpg)
其中,$a^{[3]}$的维度为 7x7x40将 1960 个特征平滑展开成 1960 个单元的一列然后连接最后一级的输出层。输出层可以是一个神经元即二元分类logistic也可以是多个神经元即多元分类softmax。最后得到预测输出 $\hat y$。
随着神经网络计算深度不断加深,图片的高度和宽度 $n^{[l]}\_H $、$n^{[l]}\_W$一般逐渐减小,而 $n^{[l]}\_c$在增加。
一个典型的卷积神经网络通常包含有三种层:**卷积层Convolution layer**、**池化层Pooling layer**、**全连接层Fully Connected layer**。仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络还是会添加池化层和全连接层,它们更容易设计。
## 池化层
**池化层**的作用是缩减模型的大小,提高计算速度,同时减小噪声提高所提取特征的稳健性。
采用较多的一种池化过程叫做**最大池化Max Pooling**。将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:
![Max-Pooling](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Max-Pooling.png)
池化过程类似于卷积过程,上图所示的池化过程中相当于使用了一个大小 $f=2$的滤波器,且池化步长 $s=2$。卷积过程中的几个计算大小的公式也都适用于池化过程。如果有多个通道,那么就对每个通道分别执行计算过程。
对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好。
另一种池化过程是**平均池化Average Pooling**,就是从取某个区域的最大值改为求这个区域的平均值:
![Average-Pooling](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/Average-Pooling.png)
池化过程的特点之一是,它有一组超参数,但是并**没有参数需要学习**。池化过程的超参数包括滤波器的大小 $f$、步长 $s$,以及选用最大池化还是平均池化。而填充 $p$则很少用到。
池化过程的输入维度为:
$$n\_H \times n\_W \times n\_c$$
输出维度为:
$$\biggl\lfloor \frac{n\_H-f}{s}+1 \biggr\rfloor \times \biggl\lfloor \frac{n\_W-f}{s}+1 \biggr\rfloor \times n\_c$$
## 卷积神经网络示例
![CNN-Example](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Convolutional_Neural_Networks/CNN-Example.jpg)
在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。整个神经网络各层的尺寸与参数如下表所示:
| Activation shape | Activation Size | #parameters
:-: | :-: | :-: | :-:
**Input:** | (32, 32, 3) | 3072 | 0
**CONV1(f=5, s=1)** | (28, 28, 6) | 4704 | 158
**POOL1** | (14, 14, 6) | 1176 | 0
**CONV2(f=5, s=1)** | (10, 10, 16) | 1600 | 416
**POOL2** | (5, 5, 16) | 400 | 0
**FC3** | (120, 1) | 120 | 48120
**FC4** | (84, 1) | 84 | 10164
**Softmax** | (10, 1) | 10 | 850
个人推荐[一个直观感受卷积神经网络的网站](http://scs.ryerson.ca/~aharley/vis/conv/)。
## 使用卷积的原因
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
* **参数共享Parameter sharing**:特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
* **稀疏连接Sparsity of connections**:在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。

View File

@@ -0,0 +1,131 @@
机器学习ML策略1
> 对于一个已经被构建好且产生初步结果的机器学习系统,为了能使结果更令人满意,往往还要进行大量的改进。鉴于之前的课程介绍了多种改进的方法,例如收集更多数据、调试超参数、调整神经网络的大小或结构、采用不同的优化算法、进行正则化等等,我们有可能浪费大量时间在一条错误的改进路线上。想要找准改进的方向,使一个机器学习系统更快更有效地工作,就需要学习一些在构建机器学习系统时常用到的策略。
## 正交化
正交化定义和例子
* **正交化Orthogonalization** 的核心在于每次调整只会影响模型某一方面的性能,而对其他功能没有影响。这种方法有助于更快更有效地进行机器学习模型的调试和优化。
* 电视旋钮的例子,可以用来调整宽度、高度、梯度、位置的旋钮,互相独立,互不影响。
* 汽车行驶的例子,汽车的方向和汽车的速度分别通过方向盘与油门刹车控制,互不影响。
在机器学习(监督学习)系统中,可以划分四个“功能”:
1. 建立的模型在训练集上表现良好;
2. 建立的模型在验证集上表现良好;
3. 建立的模型在测试集上表现良好;
4. 建立的模型在实际应用中表现良好。
对于不同的目的,采取不同的方法:
* 对于第一条,如果模型在训练集上表现不好,可以尝试训练更大的神经网络或者换一种更好的优化算法(例如 Adam
* 对于第二条,如果模型在验证集上表现不好,可以进行正则化处理或者加入更多训练数据;
* 对于第三条,如果模型在测试集上表现不好,可以尝试使用更大的验证集进行验证;
* 对于第四条,如果模型在实际应用中表现不好,可能是因为测试集没有设置正确或者成本函数评估指标有误,需要改变测试集或成本函数。
> 面对遇到的各种问题,正交化能够帮助我们更为精准有效地解决问题。一个反例是[早停止法Early Stopping](http://kyonhuang.top/Andrew-Ng-Deep-Learning-notes/#/Improving_Deep_Neural_Networks/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AE%9E%E7%94%A8%E5%B1%82%E9%9D%A2?id=%e5%85%b6%e4%bb%96%e6%ad%a3%e5%88%99%e5%8c%96%e6%96%b9%e6%b3%95)。如果早期停止,虽然可以改善验证集的拟合表现,但是对训练集的拟合就不太好。因为对两个不同的“功能”都有影响,所以早停止法不具有正交化。虽然也可以使用,但是用其他正交化控制手段来进行优化会更简单有效。
## 单值评价指标
### 单评价指标的意义
* 构建机器学习系统时,通过设置一个量化的**单值评价指标**single-number evaluation metric可以使我们根据这一指标比较不同超参数对应的模型的优劣从而选择最优的那个模型。
### 精确率和召回率
* 例如,对于二分类问题,常用的评价指标是**精确率Precision**和**召回率Recall**。假设我们有 A 和 B 两个分类器,其两项指标分别如下:
| 分类器 | 精确率 | 召回率 |
| :---: | :---: | :---: |
| A | 95% | 90% |
| B | 98% | 85% |
* 精确率:$\frac{预测为正类的正类数量}{预测为正类的数量} * 100\%$
* 召回率:$\frac{预测为正类的正类数量}{正类数量} * 100\%$
* 实际应用中,我们通常使用综合了精确率和召回率的单值评价指标 F1 Score 来评价模型的好坏。F1 Score 其实就是精准率和召回率的**调和平均数Harmonic Mean**,比单纯的平均数效果要好。因此,我们计算出两个分类器的 F1 Score。可以看出 A 模型的效果要更好。
$$F1 = \frac{2}{\frac{1}{P}+\frac{1}{R}} = \frac{2PR}{P+R}$$
| 分类器 | 精确率 | 召回率 | F1 Score |
| :---: | :---: | :---: | :---: |
| A | 95% | 90% | 92.4% |
| B | 98% | 85% | 91.0% |
* 通过引入单值评价指标,我们可以更方便快速地对不同模型进行比较。
## 优化指标和满足指标
* 如果我们还想要将分类器的运行时间也纳入考虑范围,将其和精确率、召回率组合成一个单值评价指标显然不那么合适。这时,我们可以将某些指标作为**优化指标Optimizing Matric**,寻求它们的最优值;而将某些指标作为**满足指标Satisficing Matric**,只要在一定阈值以内即可。
* 在这个例子中,准确率就是一个优化指标,因为我们想要分类器尽可能做到正确分类;而运行时间就是一个满足指标,如果你想要分类器的运行时间不多于某个阈值,那最终选择的分类器就应该是以这个阈值为界里面准确率最高的那个。
## 动态改变评价指标
* 对于模型的评价标准优势需要根据实际情况进行动态调整,以让模型在实际应用中获得更好的效果。
* 例如,有时我们不太能接受某些分类错误,于是改变单纯用错误率作为评价标准,给某些分类错误更高的权重,以从追求最小错误率转为追求最小风险。
## 训练 / 验证 / 测试集划分
* 我们一般将数据集分为训练集、验证集、测试集。构建机器学习系统时,我们采用不同的学习方法,在**训练集**上训练出不同的模型,然后使用**验证集**对模型的好坏进行评估,确信其中某个模型足够好时再用**测试集**对其进行测试。
* 因此,训练集、验证集、测试集的设置对于机器学习模型非常重要,合理的设置能够大大提高模型训练效率和模型质量。
### 验证集和测试集的分布
* 验证集和测试集的数据来源应该相同(来自同一分布)、和机器学习系统将要在实际应用中面对的数据一致,且必须从所有数据中随机抽取。这样,系统才能做到尽可能不偏离目标。
### 验证集和测试集的大小
* 过去数据量较小(小于 1 万)时,通常将数据集按照以下比例进行划分:
* 无验证集的情况70% / 30%
* 有验证集的情况60% / 20% / 20%
* 这是为了保证验证集和测试集有足够的数据。现在的机器学习时代数据集规模普遍较大,例如 100 万数据量,这时将相应比例设为 98% / 1% / 1% 或 99% / 1% 就已经能保证验证集和测试集的规模足够。
* 测试集的大小应该设置得足够提高系统整体性能的可信度,验证集的大小也要设置得足够用于评估几个不同的模型。应该根据实际情况对数据集灵活地进行划分,而不是死板地遵循老旧的经验。
## 比较人类表现水平
* 很多机器学习模型的诞生是为了取代人类的工作,因此其表现也会跟人类表现水平作比较。
![Bayes-Error](Bayes-Optimal-Error.png)
* 上图展示了随着时间的推进,机器学习系统和人的表现水平的变化。一般的,当机器学习超过人的表现水平后,它的进步速度逐渐变得缓慢,最终性能无法超过某个理论上限,这个上限被称为**贝叶斯最优误差Bayes Optimal Error**。
* 贝叶斯最优误差一般认为是理论上可能达到的最优误差,换句话说,其就是理论最优函数,任何从 x 到精确度 y 映射的函数都不可能超过这个值。例如,对于语音识别,某些音频片段嘈杂到基本不可能知道说的是什么,所以完美的识别率不可能达到 100%。
* 因为人类对于一些自然感知问题的表现水平十分接近贝叶斯最优误差,所以当机器学习系统的表现超过人类后,就没有太多继续改善的空间了。也因此,只要建立的机器学习模型的表现还没达到人类的表现水平时,就可以通过各种手段来提升它。例如采用人工标记过的数据进行训练,通过人工误差分析了解为什么人能够正确识别,或者是进行偏差、方差分析。当模型的表现超过人类后,这些手段起的作用就微乎其微了。
### 可避免偏差
* 通过与贝叶斯最优误差,或者说,与人类表现水平的比较,可以表明一个机器学习模型表现的好坏程度,由此判断后续操作应该注重于减小偏差还是减小方差。
* 模型在**训练集**上的误差与人类表现水平的差值被称作**可避免偏差Avoidable Bias**。可避免偏差低便意味着模型在训练集上的表现很好,而**训练集与验证集之间错误率的差值**越小,意味着模型在验证集与测试集上的表现和训练集同样好。
* 如果**可避免偏差**大于**训练集与验证集之间错误率的差值**,之后的工作就应该专注于减小偏差;反之,就应该专注于减小方差。
### 理解人类表现水平
* 我们一般用**人类水平误差Human-level Error**来代表贝叶斯最优误差(或者简称贝叶斯误差)。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,**我们将表现最好的作为人类水平误差**。但是实际应用中,不同人选择人类水平误差的基准是不同的,这会带来一定的影响。
* 例如,如果某模型在训练集上的错误率为 0.7%,验证集的错误率为 0.8%。如果选择的人类水平误差为 0.5%那么偏差bias比方差variance更加突出而如果选择的人类水平误差为 0.7%,则方差更加突出。也就是说,根据人类水平误差的不同选择,我们可能因此选择不同的优化操作。
* 这种问题只会发生在模型表现很好,接近人类水平误差的时候才会出现。人类水平误差给了我们一种估计贝叶斯误差的方式,而不是像之前一样将训练的错误率直接对着 0% 的方向进行优化。
* 当机器学习模型的表现超过了人类水平误差时,很难再通过人的直觉去判断模型还能够往什么方向优化以提高性能。
## 总结
想让一个监督学习算法达到使用程度,应该做到以下两点:
1. 算法对训练集的拟合很好,可以看作可避免偏差很低;
2. 推广到验证集和测试集效果也很好,即方差不是很大。
![Human-level](Human-level.png)
根据正交化的思想,我们有一些措施可以独立地优化二者之一。

View File

@@ -0,0 +1,144 @@
机器学习ML策略2
## 错误分析
* 通过人工检查机器学习模型得出的结果中出现的一些错误,有助于深入了解下一步要进行的工作。这个过程被称作**错误分析Error Analysis**。
* 例如,你可能会发现一个猫图片识别器错误地将一些看上去像猫的狗误识别为猫。这时,立即盲目地去研究一个能够精确识别出狗的算法不一定是最好的选择,因为我们不知道这样做会对提高分类器的准确率有多大的帮助。
* 这时,我们可以从分类错误的样本中统计出狗的样本数量。根据狗样本所占的比重来判断这一问题的重要性。假如狗类样本所占比重仅为 5%,那么即使花费几个月的时间来提升模型对狗的识别率,改进后的模型错误率并没有显著改善;而如果错误样本中狗类所占比重为 50%,那么改进后的模型性能会有较大的提升。因此,花费更多的时间去研究能够精确识别出狗的算法是值得的。
* 这种人工检查看似简单而愚笨,但却是十分必要的,因为这项工作能够有效避免花费大量的时间与精力去做一些对提高模型性能收效甚微的工作,让我们专注于解决影响模型准确率的主要问题。
* 在对输出结果中分类错误的样本进行人工分析时,可以建立一个表格来记录每一个分类错误的具体信息,例如某些图像是模糊的,或者是把狗识别成了猫等,并统计属于不同错误类型的错误数量。这样,分类结果会更加清晰。
![Error-analysis-table](Error-analysis-table.png)
* 总结一下,进行错误分析时,你应该观察错误标记的例子,看看假阳性和假阴性,统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型。总之,通过统计不同错误标记类型占总数的百分比,有助于发现哪些问题亟待解决,或者提供构思新优化方向的灵感。
## 修正错误标记
* 我们用 mislabeled examples 来表示学习算法输出了错误的 Y 值。而在做误差分析时有时会注意到数据集中有些样本被人为地错误标记incorrectly labeled这时该怎么做
* 如果是在训练集中,由于机器学习算法对于随机误差的**稳健性Robust**(也称作“鲁棒性”),只要这些出错的样本数量较小,且分布近似随机,就不必花费时间一一修正。
* 而如果出现在验证集或者测试集,则可以在进行误差分析时,通过统计人为标记错误所占的百分比,来大致分析这种情况对模型的识别准确率的影响,并比较该比例的大小和其他错误类型的比例,以此判断是否值得去将错误的标记一一进行修正,还是可以忽略。
当你决定在验证集和测试集上手动检查标签并进行修正时,有一些额外的方针和原则需要考虑:
* 在验证集和测试集上**同时使用同样的修正手段**,以保证验证集和测试集来自相同的分布;
* 同时检查判断正确和判断错误的例子(通常不用这么做);
* 在修正验证集和测试集时,鉴于训练集的分布不必和验证/测试集完全相同,可以不去修正训练集。
## 快速搭建系统并迭代
对于每个可以改善模型的合理方向,如何选择一个方向集中精力处理成了问题。如果想搭建一个全新的机器学习系统,建议根据以下步骤快速搭建好第一个系统,然后开始迭代:
1. 设置好训练、验证、测试集及衡量指标,确定目标;
2. 快速训练出一个初步的系统,用训练集来拟合参数,用验证集调参,用测试集评估;
3. 通过偏差/方差分析以及错误分析等方法,决定下一步优先处理的方向。
## 在不同的分布上训练和测试
* 有时,我们很难得到来自同一个分布的训练集和验证/测试集。还是以猫识别作为例子,我们的训练集可能由网络爬取得到,图片比较清晰,而且规模较大(例如 20 万);而验证/测试集可能来自用户手机拍摄,图片比较模糊,且数量较少(例如 1 万),难以满足作为训练集时的规模需要。
* 虽然验证/测试集的质量不高,但是机器学习模型最终主要应用于识别这些用户上传的模糊图片。考虑到这一点,在划分数据集时,可以将 20 万张网络爬取的图片和 5000 张用户上传的图片作为训练集,而将剩下的 5000 张图片一半作验证集,一半作测试集。比起混合数据集所有样本再随机划分,这种分配方法虽然使训练集分布和验证/测试集的分布并不一样,但是能保证**验证/测试集更接近实际应用场景**,在长期能带来更好的系统性能。
## 数据不匹配
* 之前的学习中,我们通过比较人类水平误差、训练集错误率、验证集错误率的相对差值来判断进行偏差/方差分析。但在训练集和验证/测试集分布不一致的情况下,无法根据相对差值来进行偏差/方差分析。这是因为训练集错误率和验证集错误率的差值可能来自于算法本身(归为方差),也可能来自于样本分布不同,和模型关系不大。
* 在可能存在训练集和验证/测试集分布不一致的情况下,为了解决这个问题,我们可以再定义一个**训练-验证集Training-dev Set**。训练-验证集和训练集的分布相同(或者是训练集分割出的子集),但是不参与训练过程。
* 现在,我们有了*训练集*错误率、*训练-验证集*错误率,以及*验证集*错误率。其中,*训练集*错误率和*训练-验证集*错误率的差值反映了方差;而*训练-验证集*错误率和*验证集*错误率的差值反映了样本分布不一致的问题,从而说明**模型擅长处理的数据和我们关心的数据来自不同的分布**,我们称之为**数据不匹配Data Mismatch**问题。
* 人类水平误差、*训练集*错误率、*训练-验证集*错误率、*验证集*错误率、*测试集*错误率之间的差值所反映的问题如下图所示:
![Analysis-With-Data-Mismatch](Analysis-With-Data-Mismatch.png)
### 处理方法
* 这里有两条关于如何解决数据不匹配问题的建议:
* 做错误分析,尝试了解训练集和验证/测试集的具体差异(主要是人工查看训练集和验证集的样本);
* 尝试将训练数据调整得更像验证集,或者收集更多类似于验证/测试集的数据。
* 如果你打算将训练数据调整得更像验证集,可以使用的一种技术是**人工合成数据**。我们以语音识别问题为例,实际应用场合(验证/测试集)是包含背景噪声的,而作为训练样本的音频很可能是清晰而没有背景噪声的。为了让训练集与验证/测试集分布一致,我们可以给训练集人工添加背景噪声,合成类似实际场景的声音。
* 人工合成数据能够使数据集匹配,从而提升模型的效果。但需要注意的是,不能给每段语音都增加同一段背景噪声,因为这样模型会对这段背景噪音出现过拟合现象,使得效果不佳。
## 迁移学习
* 定义:**迁移学习Tranfer Learning**是通过将已训练好的神经网络模型的一部分网络结构应用到另一模型,将一个神经网络从某个任务中学到的知识和经验运用到另一个任务中,以显著提高学习任务的性能。
* 例如,我们将为猫识别器构建的神经网络迁移应用到放射科诊断中。因为猫识别器的神经网络已经学习到了有关图像的结构和性质等方面的知识,所以只要先删除神经网络中原有的输出层,加入新的输出层并随机初始化权重系数($W^{[L]}$、$b^{[L]}$),随后用新的训练集进行训练,就完成了以上的迁移学习。
* 如果新的数据集很小,可能只需要重新训练输出层前的最后一层的权重,即$W^{[L]}$、$b^{[L]}$,并保持其他参数不变;而如果有足够多的数据,可以只保留网络结构,重新训练神经网络中所有层的系数。这时初始权重由之前的模型训练得到,这个过程称为**预训练Pre-Training**,之后的权重更新过程称为**微调Fine-Tuning**。
* 你也可以不止加入一个新的输出层,而是多向神经网络加几个新层。
![Tranfer-Learning](Tranfer-Learning.png)
在下述场合进行迁移学习是有意义的:
1. 两个任务有同样的输入(比如都是图像或者都是音频);
2. **拥有更多数据的任务迁移到数据较少的任务**
3. 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。
## 多任务学习
* 迁移学习中的步骤是串行的;而 **多任务学习Multi-Task Learning** 使用单个神经网络模型,利用共享表示采用并行训练同时学习多个任务。多任务学习的基本假设是 **多个任务之间具有相关性** ,并且任务之间可以利用相关性相互促进。例如,属性分类中,抹口红和戴耳环有一定的相关性,单独训练的时候是无法利用这些信息,多任务学习则可以利用任务相关性联合提高多个属性分类的精度。
* 以汽车自动驾驶为例,需要实现的多任务是识别行人、车辆、交通标志和信号灯。如果在输入的图像中检测出车辆和交通标志,则输出的 y 为:
$$y = \begin{bmatrix} 0 \\\ 1 \\\ 1 \\\ 0 \end{bmatrix}\quad$$
![Multi-Task-Learning](Multi-Task-Learning.png)
* 多任务学习模型的成本函数为:
$$\frac{1}{m} \sum^m_{i=1} \sum^c_{j=1} L(\hat y_j^{(i)}, y_j^{(i)})$$
* 其中j 代表任务下标,总有 c 个任务。对应的损失函数为:
$$L(\hat y_j^{(i)}, y_j^{(i)}) = -y_j^{(i)} log \hat y_j^{(i)} - (1 -y_j^{(i)})log(1 - \hat y_j^{(i)})$$
* 多任务学习是使用单个神经网络模型来实现多个任务。实际上,也可以分别构建多个神经网络来实现。多任务学习中可能存在训练样本 Y 某些标签空白的情况,这不会影响多任务学习模型的训练。
* 多任务学习和 Softmax 回归看上去有些类似容易混淆。它们的区别是Softmax 回归的输出向量 y 中只有一个元素为 1而多任务学习的输出向量 y 中可以有多个元素为 1。
在下述场合进行多任务学习是有意义的:
1. 训练的一组任务可以共用低层次特征;
2. *通常*,每个任务的数据量接近;
3. 能够训练一个足够大的神经网络,以同时做好所有的工作。多任务学习会降低性能的唯一情况(即和为每个任务训练单个神经网络相比性能更低的情况)是神经网络还不够大。
![Shared-Representation](Shared-Representation.png)
* 在多任务深度网络中,低层次信息的共享有助于减少计算量,同时共享表示层可以使得几个有共性的任务更好的结合相关性信息,任务特定层则可以单独建模任务特定的信息,实现共享信息和任务特定信息的统一。
* 在实践中,多任务学习的使用频率要远低于迁移学习。计算机视觉领域中的物体识别是一个多任务学习的例子。
## 端到端学习
* 在传统的机器学习分块模型中,每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。而**端到端深度学习End-to-end Deep Learning**只用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。
* 如果数据量较少,传统机器学习分块模型所构成的流水线效果会很不错。但如果训练样本足够大,并且训练出的神经网络模型足够复杂,那么端到端深度学习模型的性能会比传统机器学习分块模型更好。
* 而如果数据集规模适中,还是可以使用流水线方法,但是可以混合端到端深度学习,通过神经网络绕过某些模块,直接输出某些特征。
![End-to-end-Deep-Learning](End-to-end-Deep-Learning.png)
### 优点与缺点
优点:
* 只要有足够多的数据,剩下的全部交给一个足够大的神经网络。比起传统的机器学习分块模型,可能更能捕获数据中的任何统计信息,而不需要用人类固有的认知(或者说,成见)来进行分析;
* 所需手工设计的组件更少,简化设计工作流程;
缺点:
* 需要大量的数据;
* 排除了可能有用的人工设计组件;
> 根据以上分析,决定一个问题是否应用端到端学习的**关键点**是:是否有足够的数据,支持能够直接学习从 x 映射到 y 并且足够复杂的函数?

View File

@@ -1,133 +0,0 @@
机器学习ML策略1
> 对于一个已经被构建好且产生初步结果的机器学习系统,为了能使结果更令人满意,往往还要进行大量的改进。鉴于之前的课程介绍了多种改进的方法,例如收集更多数据、调试超参数、调整神经网络的大小或结构、采用不同的优化算法、进行正则化等等,我们有可能浪费大量时间在一条错误的改进路线上。想要找准改进的方向,使一个机器学习系统更快更有效地工作,就需要学习一些在构建机器学习系统时常用到的策略。
## 正交化
正交化定义和例子
* **正交化Orthogonalization** 的核心在于每次调整只会影响模型某一方面的性能,而对其他功能没有影响。这种方法有助于更快更有效地进行机器学习模型的调试和优化。
* 电视旋钮的例子,可以用来调整宽度、高度、梯度、位置的旋钮,互相独立,互不影响。
* 汽车行驶的例子,汽车的方向和汽车的速度分别通过方向盘与油门刹车控制,互不影响。
在机器学习(监督学习)系统中,可以划分四个“功能”:
1. 建立的模型在训练集上表现良好;
2. 建立的模型在验证集上表现良好;
3. 建立的模型在测试集上表现良好;
4. 建立的模型在实际应用中表现良好。
对于不同的目的,采取不同的方法:
* 对于第一条,如果模型在训练集上表现不好,可以尝试训练更大的神经网络或者换一种更好的优化算法(例如 Adam
* 对于第二条,如果模型在验证集上表现不好,可以进行正则化处理或者加入更多训练数据;
* 对于第三条,如果模型在测试集上表现不好,可以尝试使用更大的验证集进行验证;
* 对于第四条,如果模型在实际应用中表现不好,可能是因为测试集没有设置正确或者成本函数评估指标有误,需要改变测试集或成本函数。
> 面对遇到的各种问题,正交化能够帮助我们更为精准有效地解决问题。一个反例是[早停止法Early Stopping](http://kyonhuang.top/Andrew-Ng-Deep-Learning-notes/#/Improving_Deep_Neural_Networks/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E7%9A%84%E5%AE%9E%E7%94%A8%E5%B1%82%E9%9D%A2?id=%e5%85%b6%e4%bb%96%e6%ad%a3%e5%88%99%e5%8c%96%e6%96%b9%e6%b3%95)。如果早期停止,虽然可以改善验证集的拟合表现,但是对训练集的拟合就不太好。因为对两个不同的“功能”都有影响,所以早停止法不具有正交化。虽然也可以使用,但是用其他正交化控制手段来进行优化会更简单有效。
## 单值评价指标
### 单评价指标的意义
* 构建机器学习系统时,通过设置一个量化的**单值评价指标**single-number evaluation metric可以使我们根据这一指标比较不同超参数对应的模型的优劣从而选择最优的那个模型。
* 例如,对于二分类问题,常用的评价指标是**精确率Precision**和**召回率Recall**。假设我们有 A 和 B 两个分类器,其两项指标分别如下:
| 分类器 | 精确率 | 召回率 |
| :---: | :---: | :---: |
| A | 95% | 90% |
| B | 98% | 85% |
* 精确率:$\frac{预测为正类的正类数量}{预测为正类的数量} * 100\%$
* 召回率:$\frac{预测为正类的正类数量}{正类数量} * 100\%$
实际应用中,我们通常使用综合了精确率和召回率的单值评价指标 F1 Score 来评价模型的好坏。F1 Score 其实就是精准率和召回率的**调和平均数Harmonic Mean**,比单纯的平均数效果要好。
$$F1 = \frac{2}{\frac{1}{P}+\frac{1}{R}} = \frac{2PR}{P+R}$$
因此,我们计算出两个分类器的 F1 Score。可以看出 A 模型的效果要更好。
| 分类器 | 精确率 | 召回率 | F1 Score |
| :---: | :---: | :---: | :---: |
| A | 95% | 90% | 92.4% |
| B | 98% | 85% | 91.0% |
通过引入单值评价指标,我们可以更方便快速地对不同模型进行比较。
## 优化指标和满足指标
如果我们还想要将分类器的运行时间也纳入考虑范围,将其和精确率、召回率组合成一个单值评价指标显然不那么合适。这时,我们可以将某些指标作为**优化指标Optimizing Matric**,寻求它们的最优值;而将某些指标作为**满足指标Satisficing Matric**,只要在一定阈值以内即可。
在这个例子中,准确率就是一个优化指标,因为我们想要分类器尽可能做到正确分类;而运行时间就是一个满足指标,如果你想要分类器的运行时间不多于某个阈值,那最终选择的分类器就应该是以这个阈值为界里面准确率最高的那个。
## 动态改变评价指标
对于模型的评价标准优势需要根据实际情况进行动态调整,以让模型在实际应用中获得更好的效果。
例如,有时我们不太能接受某些分类错误,于是改变单纯用错误率作为评价标准,给某些分类错误更高的权重,以从追求最小错误率转为追求最小风险。
## 训练 / 验证 / 测试集划分
我们一般将数据集分为训练集、验证集、测试集。构建机器学习系统时,我们采用不同的学习方法,在**训练集**上训练出不同的模型,然后使用**验证集**对模型的好坏进行评估,确信其中某个模型足够好时再用**测试集**对其进行测试。
因此,训练集、验证集、测试集的设置对于机器学习模型非常重要,合理的设置能够大大提高模型训练效率和模型质量。
### 验证集和测试集的分布
验证集和测试集的数据来源应该相同(来自同一分布)、和机器学习系统将要在实际应用中面对的数据一致,且必须从所有数据中随机抽取。这样,系统才能做到尽可能不偏离目标。
### 验证集和测试集的大小
过去数据量较小(小于 1 万)时,通常将数据集按照以下比例进行划分:
* 无验证集的情况70% / 30%
* 有验证集的情况60% / 20% / 20%
这是为了保证验证集和测试集有足够的数据。现在的机器学习时代数据集规模普遍较大,例如 100 万数据量,这时将相应比例设为 98% / 1% / 1% 或 99% / 1% 就已经能保证验证集和测试集的规模足够。
测试集的大小应该设置得足够提高系统整体性能的可信度,验证集的大小也要设置得足够用于评估几个不同的模型。应该根据实际情况对数据集灵活地进行划分,而不是死板地遵循老旧的经验。
## 比较人类表现水平
很多机器学习模型的诞生是为了取代人类的工作,因此其表现也会跟人类表现水平作比较。
![Bayes-Error](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Bayes-Optimal-Error.png)
上图展示了随着时间的推进,机器学习系统和人的表现水平的变化。一般的,当机器学习超过人的表现水平后,它的进步速度逐渐变得缓慢,最终性能无法超过某个理论上限,这个上限被称为**贝叶斯最优误差Bayes Optimal Error**。
贝叶斯最优误差一般认为是理论上可能达到的最优误差,换句话说,其就是理论最优函数,任何从 x 到精确度 y 映射的函数都不可能超过这个值。例如,对于语音识别,某些音频片段嘈杂到基本不可能知道说的是什么,所以完美的识别率不可能达到 100%。
因为人类对于一些自然感知问题的表现水平十分接近贝叶斯最优误差,所以当机器学习系统的表现超过人类后,就没有太多继续改善的空间了。
也因此,只要建立的机器学习模型的表现还没达到人类的表现水平时,就可以通过各种手段来提升它。例如采用人工标记过的数据进行训练,通过人工误差分析了解为什么人能够正确识别,或者是进行偏差、方差分析。
当模型的表现超过人类后,这些手段起的作用就微乎其微了。
### 可避免偏差
通过与贝叶斯最优误差,或者说,与人类表现水平的比较,可以表明一个机器学习模型表现的好坏程度,由此判断后续操作应该注重于减小偏差还是减小方差。
模型在**训练集**上的误差与人类表现水平的差值被称作**可避免偏差Avoidable Bias**。可避免偏差低便意味着模型在训练集上的表现很好,而**训练集与验证集之间错误率的差值**越小,意味着模型在验证集与测试集上的表现和训练集同样好。
如果**可避免偏差**大于**训练集与验证集之间错误率的差值**,之后的工作就应该专注于减小偏差;反之,就应该专注于减小方差。
### 理解人类表现水平
我们一般用**人类水平误差Human-level Error**来代表贝叶斯最优误差(或者简称贝叶斯误差)。对于不同领域的例子,不同人群由于其经验水平不一,错误率也不同。一般来说,**我们将表现最好的作为人类水平误差**。但是实际应用中,不同人选择人类水平误差的基准是不同的,这会带来一定的影响。
例如,如果某模型在训练集上的错误率为 0.7%,验证集的错误率为 0.8%。如果选择的人类水平误差为 0.5%那么偏差bias比方差variance更加突出而如果选择的人类水平误差为 0.7%,则方差更加突出。也就是说,根据人类水平误差的不同选择,我们可能因此选择不同的优化操作。
这种问题只会发生在模型表现很好,接近人类水平误差的时候才会出现。人类水平误差给了我们一种估计贝叶斯误差的方式,而不是像之前一样将训练的错误率直接对着 0% 的方向进行优化。
当机器学习模型的表现超过了人类水平误差时,很难再通过人的直觉去判断模型还能够往什么方向优化以提高性能。
## 总结
想让一个监督学习算法达到使用程度,应该做到以下两点:
1. 算法对训练集的拟合很好,可以看作可避免偏差很低;
2. 推广到验证集和测试集效果也很好,即方差不是很大。
![Human-level](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Human-level.png)
根据正交化的思想,我们有一些措施可以独立地优化二者之一。

View File

@@ -1,144 +0,0 @@
<h1 align="center">机器学习ML策略2</h1>
## 错误分析
通过人工检查机器学习模型得出的结果中出现的一些错误,有助于深入了解下一步要进行的工作。这个过程被称作**错误分析Error Analysis**。
例如,你可能会发现一个猫图片识别器错误地将一些看上去像猫的狗误识别为猫。这时,立即盲目地去研究一个能够精确识别出狗的算法不一定是最好的选择,因为我们不知道这样做会对提高分类器的准确率有多大的帮助。
这时,我们可以从分类错误的样本中统计出狗的样本数量。根据狗样本所占的比重来判断这一问题的重要性。假如狗类样本所占比重仅为 5%,那么即使花费几个月的时间来提升模型对狗的识别率,改进后的模型错误率并没有显著改善;而如果错误样本中狗类所占比重为 50%,那么改进后的模型性能会有较大的提升。因此,花费更多的时间去研究能够精确识别出狗的算法是值得的。
这种人工检查看似简单而愚笨,但却是十分必要的,因为这项工作能够有效避免花费大量的时间与精力去做一些对提高模型性能收效甚微的工作,让我们专注于解决影响模型准确率的主要问题。
在对输出结果中分类错误的样本进行人工分析时,可以建立一个表格来记录每一个分类错误的具体信息,例如某些图像是模糊的,或者是把狗识别成了猫等,并统计属于不同错误类型的错误数量。这样,分类结果会更加清晰。
![Error-analysis-table](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Error-analysis-table.png)
总结一下,进行错误分析时,你应该观察错误标记的例子,看看假阳性和假阴性,统计属于不同错误类型的错误数量。在这个过程中,你可能会得到启发,归纳出新的错误类型。总之,通过统计不同错误标记类型占总数的百分比,有助于发现哪些问题亟待解决,或者提供构思新优化方向的灵感。
## 修正错误标记
我们用 mislabeled examples 来表示学习算法输出了错误的 Y 值。而在做误差分析时有时会注意到数据集中有些样本被人为地错误标记incorrectly labeled这时该怎么做
如果是在训练集中,由于机器学习算法对于随机误差的**稳健性Robust**(也称作“鲁棒性”),只要这些出错的样本数量较小,且分布近似随机,就不必花费时间一一修正。
而如果出现在验证集或者测试集,则可以在进行误差分析时,通过统计人为标记错误所占的百分比,来大致分析这种情况对模型的识别准确率的影响,并比较该比例的大小和其他错误类型的比例,以此判断是否值得去将错误的标记一一进行修正,还是可以忽略。
当你决定在验证集和测试集上手动检查标签并进行修正时,有一些额外的方针和原则需要考虑:
* 在验证集和测试集上**同时使用同样的修正手段**,以保证验证集和测试集来自相同的分布;
* 同时检查判断正确和判断错误的例子(通常不用这么做);
* 在修正验证集和测试集时,鉴于训练集的分布不必和验证/测试集完全相同,可以不去修正训练集。
## 快速搭建系统并迭代
对于每个可以改善模型的合理方向,如何选择一个方向集中精力处理成了问题。如果想搭建一个全新的机器学习系统,建议根据以下步骤快速搭建好第一个系统,然后开始迭代:
1. 设置好训练、验证、测试集及衡量指标,确定目标;
2. 快速训练出一个初步的系统,用训练集来拟合参数,用验证集调参,用测试集评估;
3. 通过偏差/方差分析以及错误分析等方法,决定下一步优先处理的方向。
## 在不同的分布上训练和测试
有时,我们很难得到来自同一个分布的训练集和验证/测试集。还是以猫识别作为例子,我们的训练集可能由网络爬取得到,图片比较清晰,而且规模较大(例如 20 万);而验证/测试集可能来自用户手机拍摄,图片比较模糊,且数量较少(例如 1 万),难以满足作为训练集时的规模需要。
虽然验证/测试集的质量不高,但是机器学习模型最终主要应用于识别这些用户上传的模糊图片。考虑到这一点,在划分数据集时,可以将 20 万张网络爬取的图片和 5000 张用户上传的图片作为训练集,而将剩下的 5000 张图片一半作验证集,一半作测试集。比起混合数据集所有样本再随机划分,这种分配方法虽然使训练集分布和验证/测试集的分布并不一样,但是能保证**验证/测试集更接近实际应用场景**,在长期能带来更好的系统性能。
## 数据不匹配
之前的学习中,我们通过比较人类水平误差、训练集错误率、验证集错误率的相对差值来判断进行偏差/方差分析。但在训练集和验证/测试集分布不一致的情况下,无法根据相对差值来进行偏差/方差分析。这是因为训练集错误率和验证集错误率的差值可能来自于算法本身(归为方差),也可能来自于样本分布不同,和模型关系不大。
在可能存在训练集和验证/测试集分布不一致的情况下,为了解决这个问题,我们可以再定义一个**训练-验证集Training-dev Set**。训练-验证集和训练集的分布相同(或者是训练集分割出的子集),但是不参与训练过程。
现在,我们有了*训练集*错误率、*训练-验证集*错误率,以及*验证集*错误率。其中,*训练集*错误率和*训练-验证集*错误率的差值反映了方差;而*训练-验证集*错误率和*验证集*错误率的差值反映了样本分布不一致的问题,从而说明**模型擅长处理的数据和我们关心的数据来自不同的分布**,我们称之为**数据不匹配Data Mismatch**问题。
人类水平误差、*训练集*错误率、*训练-验证集*错误率、*验证集*错误率、*测试集*错误率之间的差值所反映的问题如下图所示:
![Analysis-With-Data-Mismatch](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Analysis-With-Data-Mismatch.png)
### 处理方法
这里有两条关于如何解决数据不匹配问题的建议:
* 做错误分析,尝试了解训练集和验证/测试集的具体差异(主要是人工查看训练集和验证集的样本);
* 尝试将训练数据调整得更像验证集,或者收集更多类似于验证/测试集的数据。
如果你打算将训练数据调整得更像验证集,可以使用的一种技术是**人工合成数据**。我们以语音识别问题为例,实际应用场合(验证/测试集)是包含背景噪声的,而作为训练样本的音频很可能是清晰而没有背景噪声的。为了让训练集与验证/测试集分布一致,我们可以给训练集人工添加背景噪声,合成类似实际场景的声音。
人工合成数据能够使数据集匹配,从而提升模型的效果。但需要注意的是,不能给每段语音都增加同一段背景噪声,因为这样模型会对这段背景噪音出现过拟合现象,使得效果不佳。
## 迁移学习
**迁移学习Tranfer Learning**是通过将已训练好的神经网络模型的一部分网络结构应用到另一模型,将一个神经网络从某个任务中学到的知识和经验运用到另一个任务中,以显著提高学习任务的性能。
例如,我们将为猫识别器构建的神经网络迁移应用到放射科诊断中。因为猫识别器的神经网络已经学习到了有关图像的结构和性质等方面的知识,所以只要先删除神经网络中原有的输出层,加入新的输出层并随机初始化权重系数($W^{[L]}$、$b^{[L]}$),随后用新的训练集进行训练,就完成了以上的迁移学习。
如果新的数据集很小,可能只需要重新训练输出层前的最后一层的权重,即$W^{[L]}$、$b^{[L]}$,并保持其他参数不变;而如果有足够多的数据,可以只保留网络结构,重新训练神经网络中所有层的系数。这时初始权重由之前的模型训练得到,这个过程称为**预训练Pre-Training**,之后的权重更新过程称为**微调Fine-Tuning**。
你也可以不止加入一个新的输出层,而是多向神经网络加几个新层。
![Tranfer-Learning](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Tranfer-Learning.png)
在下述场合进行迁移学习是有意义的:
1. 两个任务有同样的输入(比如都是图像或者都是音频);
2. **拥有更多数据的任务迁移到数据较少的任务**
3. 某一任务的低层次特征(底层神经网络的某些功能)对另一个任务的学习有帮助。
## 多任务学习
迁移学习中的步骤是串行的;而**多任务学习Multi-Task Learning**使用单个神经网络模型,利用共享表示采用并行训练同时学习多个任务。多任务学习的基本假设是**多个任务之间具有相关性**,并且任务之间可以利用相关性相互促进。例如,属性分类中,抹口红和戴耳环有一定的相关性,单独训练的时候是无法利用这些信息,多任务学习则可以利用任务相关性联合提高多个属性分类的精度。
以汽车自动驾驶为例,需要实现的多任务是识别行人、车辆、交通标志和信号灯。如果在输入的图像中检测出车辆和交通标志,则输出的 y 为:
$$y = \begin{bmatrix} 0 \\\ 1 \\\ 1 \\\ 0 \end{bmatrix}\quad$$
![Multi-Task-Learning](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Multi-Task-Learning.png)
多任务学习模型的成本函数为:
$$\frac{1}{m} \sum^m\_{i=1} \sum^c\_{j=1} L(\hat y\_j^{(i)}, y\_j^{(i)})$$
其中j 代表任务下标,总有 c 个任务。对应的损失函数为:
$$L(\hat y\_j^{(i)}, y\_j^{(i)}) = -y\_j^{(i)} log \hat y\_j^{(i)} - (1 -y\_j^{(i)})log(1 - \hat y\_j^{(i)})$$
多任务学习是使用单个神经网络模型来实现多个任务。实际上,也可以分别构建多个神经网络来实现。多任务学习中可能存在训练样本 Y 某些标签空白的情况,这不会影响多任务学习模型的训练。
多任务学习和 Softmax 回归看上去有些类似容易混淆。它们的区别是Softmax 回归的输出向量 y 中只有一个元素为 1而多任务学习的输出向量 y 中可以有多个元素为 1。
在下述场合进行多任务学习是有意义的:
1. 训练的一组任务可以共用低层次特征;
2. *通常*,每个任务的数据量接近;
3. 能够训练一个足够大的神经网络,以同时做好所有的工作。多任务学习会降低性能的唯一情况(即和为每个任务训练单个神经网络相比性能更低的情况)是神经网络还不够大。
![Shared-Representation](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/Shared-Representation.png)
在多任务深度网络中,低层次信息的共享有助于减少计算量,同时共享表示层可以使得几个有共性的任务更好的结合相关性信息,任务特定层则可以单独建模任务特定的信息,实现共享信息和任务特定信息的统一。
在实践中,多任务学习的使用频率要远低于迁移学习。计算机视觉领域中的物体识别是一个多任务学习的例子。
## 端到端学习
在传统的机器学习分块模型中,每一个模块处理一种输入,然后其输出作为下一个模块的输入,构成一条流水线。而**端到端深度学习End-to-end Deep Learning**只用一个单一的神经网络模型来实现所有的功能。它将所有模块混合在一起,只关心输入和输出。
如果数据量较少,传统机器学习分块模型所构成的流水线效果会很不错。但如果训练样本足够大,并且训练出的神经网络模型足够复杂,那么端到端深度学习模型的性能会比传统机器学习分块模型更好。
而如果数据集规模适中,还是可以使用流水线方法,但是可以混合端到端深度学习,通过神经网络绕过某些模块,直接输出某些特征。
![End-to-end-Deep-Learning](https://raw.githubusercontent.com/bighuang624/Andrew-Ng-Deep-Learning-notes/master/docs/Structuring_Machine_Learning_Projects/End-to-end-Deep-Learning.png)
### 优点与缺点
应用端到端学习的优点:
* 只要有足够多的数据,剩下的全部交给一个足够大的神经网络。比起传统的机器学习分块模型,可能更能捕获数据中的任何统计信息,而不需要用人类固有的认知(或者说,成见)来进行分析;
* 所需手工设计的组件更少,简化设计工作流程;
缺点:
* 需要大量的数据;
* 排除了可能有用的人工设计组件;
根据以上分析,决定一个问题是否应用端到端学习的**关键点**是:是否有足够的数据,支持能够直接学习从 x 映射到 y 并且足够复杂的函数?