深度学习·神经网络·计算机视觉我爱编程Machine Learning & Data Analysis

【笔记】PyImageResearch-DL4CV阅读笔记-6

2018-07-22  本文已影响62人  曦沉

20180722pyimageresearch的DeepLearning for ComputerVision电子书阅读笔记。

封面

8. Chapter 8: Parameterized Learning 参数化学习

上一章作者讨论了k-NN分类器,一个机器学习的简单模型,但是k-NN只是简单的对数据进行分类,它本身没有“学习”数据集中的任何东西。

经过讨论了k-NN的优缺点,我们发现k-NN算法对于数据集的依赖程度很高。模型训练相对简单,测试过程比较慢,瓶颈出现在了计算向量之间的距离。当数据集比较大的时候,计算待分类图像和数据集模型之间的距离变得很不方便,计算量会非常大。虽然我们可以使用ANN(Approximate Nearest Neighbor)算法,FLANN或者Annoy算法加速计算过程。

但是对于实例化数据中的副本信息(a replica of data inside the instantiation这里不明白是在说什么,直接翻译为数据实例的副本信息,不好理解。。。)还是无能为力。

对于不能存储实例化的副本信息的理解。如果想要把一个基于上百万张图片的k-NN模型部署到客户那里,那么数据集的大小会达到Gb级别,数据容量过大导致部署困难。这里相对容易理解,假如要把训练好的模型部署到手机上,一个容量需要上Gb的模型,肯定是不现实的。那么这时候可以理解为,我们需要一个模型,模型中承载了一个分类的“算法”,而不需要模型把训练的数据集都承载进去。

那么参数化学习(parameterized learning)就是为了解决这个问题而提出的,它的作用是:定义少量的参数来表示训练好的模型,那么只需要部署这个参数集就可以给分类器赋能,而不必部署训练模型时使用到的原始数据集。

参数化模型的定义如下:


参数化模型定义

本章将会讨论参数化学习的理念和如何实现一个线性分类器。参数化学习是现代机器学习的基础。

8.1 An Introduction to Liner Classification 线性分类的介绍

这一章节的前半部分会介绍线性分类的理论基础和数学基础。通常来说,参数化分类算法是从数据集中学习模板数据(patterns),之后作者会用python来实现一个线性分类。

8.1.1 Four Components of Parameterized Learning 参数学习的四个组成部分

参数化是定义一些模型必备参数的过程。
那么在机器学习过程中,参数化包括:

数据:包括图像的像素数据和图像对应的标签数据。
打分函数:接受输入的图像,然后输出输入图像的预测标签和可能性分数。
损失函数:用于评价预测标签和真实标签之间的差异。
权重和偏差:权重一般使用W来表示,偏差使用b来表示

也许随着模型复杂度的提升,参数还会增加,但是一般来说是这四种类型的参数,我们通过调整Wb来让损失函数最小。

8.1.2 Linear Classification: From Images to Labels 线性分类:从图像到标签

这部分从数学角度分析参数化如何应用到机器学习。
用我们之前提到的dogs, cats and pandas数据集作为例子,假设我们的训练数据集被表示为x_iy_i,其中x_i表示图像数据,y_i表示图像对应的标签数据。并且假设x_i中的i\in{1, ..., N},y_i中的i\in{1, ..., K},然后我们就得到了N个的数据矩阵D并且分布在K维的标签空间中。

具体化到第七章的数据集中,我们的N = 3000,每个RGB图像矩阵维度为32 X 32 X 3,也就是每张图像3072个数据。标签K = 3,分别为dogscatspandas

下面定义我们的评价函数f,评价函数映射图像数据到标签分数。这是我们使用最简单的线性映射函数:
f(x_i, W, b) = W{x_i} + b
这时候我们把图像数据看作[D * 1]的向量,也就是把图像像素数据32 X 32 X 3横向排列为3072 X 1。然后权重矩阵W具有[K * D]维度。最后是参数b,偏差向量应该具有[K * 1]的维度。

回过头来看我们的dogscatspandas数据集,每个x_i被表示为一个3072像素值的向量3072 X 1,权重参数W具有3 X 3072的维度,偏差向量b拥有3 X 1的维度。

那么第七章中的数据集可以表示为下图:


dogs, cats and pandas数据集的参数化示意图

我们的权重矩阵W含有三行,分别代表图像的标签(这里不好理解,虽然使用了K * D,但是这个矩阵本身的每行为什么会表示数据的标签,只能说表示了数据集标签的数量,具体每行代表了一个标签是几个意思。。。),含有3072列,分别代表了图像的每个像素(同样只是数量对应,为什么会代表了具体的像素数据,不太理解)。偏差向量b包含了三个值,这三个只分别表示了待检测图像分别对应数据集中dogscatspandas的相似程度的数量化结果(具体如何量化成为三个数字,现在还不清楚)

公式f(x_i, W, b) = W{x_i} + b中的W{x_i}之间是点积运算,一个3 X 3072的绝阵点乘3072 X 1的矩阵,得到的结果是一个3 X 1的矩阵。从而满足和b向量3 X 1相加的条件。这样看来,每张图片得到的结果是一个带有标签和对应标签分数的3 X 1矩阵。这个函数定义的算暴力,单纯看公式,图像矩阵x_i是变量,也就是写代码时候要输入的参数。接下来要做的事情应该就是通过所谓的“训练”或者“学习”过程找到最优的W矩阵和b向量了。接下来需要关注如何求取这两个参数的运算过程。

作者在接下来也陈述了下一步的关键是求取Wb这两个参数,我们的目标是使用打分函数损失函数来优化这两个参数。

具体来说,如何优化权重矩阵依赖于我们的损失函数,比如梯度下降法梯度下降将会在第九章来讨论。这里只需要简单理解我们有个打分函数,我们也会定义一个损失函数来评价我们的预测是不是足够

8.1.3 Advantages of Parameterized Learning and Linear Classification 参数化学习的有点和线性分类

参数化学习的好处主要有以下两点:

8.1.4 A Simple Linear Classifier With Python 用Python实现的一个简单线性分类器

到这里我们回顾了参数学习和线性分类器的概念,接下来我们用Python来实现一个简单的线性分类器。

这个例子的目的不是展示我们如何从头到尾训练一个模型,我们在后面的章节会覆盖如何训练模型,现在还需要一些基础内容来做铺垫,这里只是简单的展示如何初始化权重矩阵W和偏移向量b,并且展示我们如何用简单的点积运算和这两个参数来进行参数分类。

那开始我们的表演(PS: 借用作者的口吻。。。),我们的目标是用Python脚本来正确分类下面这张示例图片。


待分类图片

首先贴上源程序linear_example.py

# USAGE
# python linear_example.py

# import the necessary packages
import numpy as np
import cv2

# initialize the class labels and set the seed of the pseudorandom
# number generator so we can reproduce our results
labels = ["dog", "cat", "panda"]
np.random.seed(1)

# randomly initialize our weight matrix and bias vector -- in a
# *real* training and classification task, these parameters would
# be *learned* by our model, but for the sake of this example,
# let's use random values
W = np.random.randn(3, 3072)
b = np.random.randn(3)

# load our example image, resize it, and then flatten it into our
# "feature vector" representation
orig = cv2.imread("beagle.png")
image = cv2.resize(orig, (32, 32)).flatten()

# compute the output scores by taking the dot product between the
# weight matrix and image pixels, followed by adding in the bias
scores = W.dot(image) + b

# loop over the scores + labels and display them
for (label, score) in zip(labels, scores):
    print("[INFO] {}: {:.2f}".format(label, score))

# draw the label with the highest score on the image as our
# prediction
cv2.putText(orig, "Label: {}".format(labels[np.argmax(scores)]),
    (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# display our input image
cv2.imshow("Image", orig)
cv2.waitKey(0)

下面开始逐行读代码

首先我们创建一个名为linear_example.py的python脚本文件,并作如下初始化:

# USAGE
# python linear_example.py

# import the necessary packages
import numpy as np
import cv2

# initialize the class labels and set the seed of the pseudorandom
# number generator so we can reproduce our results
labels = ["dog", "cat", "panda"]
np.random.seed(1)

程序5~6行:导入我们需要的python包,我们使用了NumPy作为矩阵运算库,使用了OpenCV来读取图片。
程序
程序第10行:初始化数据集的标签为一个string类型的列表
程序第11行:使用NumPy初始化一个随机数,保证了我们可以复现这里的实验结果。(这里不太理解,为什么生成随机数和复现实验结果有关系???)

假设法去理解复现实验结果:由于生成随机数的时候给了一个固定的种子1,那么随机出来的np是固定的?而且尝试把np.random.seed(1)赋值给var test,并不能赋值成功。

网上查找关于np.random.seed()函数的用法,这里的说法和猜测的差不多,意思是只要使用同样的seed来生成,那么生成的随机数就是一样的。从而达到了复现实验结果的目的。而且如果像保证随机数不同,可以使用系统时间为种子,和.Net套路差不多,不知道会不会出现时间距离很近随机范围不够大的问题,留作之后使用时候查找了。

继续回到Python代码

# randomly initialize our weight matrix and bias vector -- in a
# *real* training and classification task, these parameters would
# be *learned* by our model, but for the sake of this example,
# let's use random values
W = np.random.randn(3, 3072)
b = np.random.randn(3)

程序17~18行:使用随机值初始化W矩阵和b向量,值的范围是[0, 1],

这样初始化Wb的值只是为了展示流程,如果真的要从数据集中训练这两个参数,我们需要明白如何实现优化过程,但是这里还没涉及到优化,只是简单的做流程介绍。并且初始阶段,我们可以把Wb的值作为黑盒来看待,这样的思路不影响后面我们优化的过程。而且这个参数是作者实验出来的,并且可以得到一个正确分类的标签。这里也再度解释了为什么会有复现实验结果的说法,为什么取种子为1

继续回到Python代码

# load our example image, resize it, and then flatten it into our
# "feature vector" representation
orig = cv2.imread("beagle.png")
image = cv2.resize(orig, (32, 32)).flatten()

程序22行:使用OpenCV读取图片数据
程序23行:修改图像的尺寸为32 X 32,并“平铺”为3072 X 1的矩阵

# compute the output scores by taking the dot product between the
# weight matrix and image pixels, followed by adding in the bias
scores = W.dot(image) + b

程序27行:使用简单的点乘给输入的图像数据打分

# loop over the scores + labels and display them
for (label, score) in zip(labels, scores):
    print("[INFO] {}: {:.2f}".format(label, score))

# draw the label with the highest score on the image as our
# prediction
cv2.putText(orig, "Label: {}".format(labels[np.argmax(scores)]),
    (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

# display our input image
cv2.imshow("Image", orig)
cv2.waitKey(0)

程序30~31行:循环输出评分函数的结果,为什么要循环?因为score是一个3 X 1的矩阵。
程序35行:在原始图片上绘制标签文本。
程序39~40行:使用OpenCV在窗口中显示绘制完标签的图像。

运行结果如下图:


运行结果

控制台输出如下:


控制台输出结果

这里需要注意的是,这只是一个工作流程的示例,因为参数权重矩阵W和偏移向量b是作者给出的,虽然用了随机生成,但是种子是固定的1,所以可以看作是作者直接提供了权重矩阵W和偏移向量b的值。

手动设置的权重矩阵W和偏移向量b是没有分类能力的,这里只是演示流程,并且给出的值刚好可以“碰巧”得到正确的分类结果。实际上来说,我们需要通过训练数据集和优化算法来得到正确的权重矩阵W和偏移向量b,比如梯度下降法。

下一章我们将会使用梯度下降法来通过训练数据集得到权重矩阵W和偏移向量b。本章只需要了解运算过程就可以。

8.2 The Role of Loss Functions 损失函数的任务(角色?)

上一部分我们讨论了参数化学习的概念。这种学习模型允许我们提取输入数据和标签,并且通过学习得到一个带有参数的函数完成未知数据到标签的映射。

为了真正的通过数据集,标签和打分函数完成这个“学习”的过程,我们需要引入两个重要的概念:

本章的剩余部分将会介绍通常应用于神经网络和机器学习网络中的损失函数类型。并且Starter Bundle(本电子书)的第九章着重介绍基本的优化方法。Practitioner Bundle(另一本电子书。。。)将会着重介绍优化方法。

回过头来,这里简要介绍损失函数和它在参数化学习中的任务。这里作者推荐了Andrew Ng的Coursear课程作为补充学习损失函数的材料。

8.2.1 What Are Loss Functions? 什么是损失函数?

CIFAR-10训练损失函数图像

这是CIFAR-10数据集的两个模型的训练损失函数图像,X轴是时间,Y轴是损失。通过图像可以看出Model #1的效果要好于Model #2。

最基本的来看,一个损失函数可以反映分类器对于输入数据分类的“好”与“坏”。通过上面的图片来看,随着时间的推进,损失越小,证明分类器越“好”。

为了提升分类的准确度,我们需要调整权重矩阵W和偏移向量b的值。如何去调整这两个参数就是我们的优化问题。现阶段,只需要简单理解损失函数可以作为评价我们打分函数分类性能的依据。

理想情况下,我们的损失函数应该随着时间不断下降,进而调整权重矩阵W和偏移向量b的值。就像上面这张图片显示的这样。Model #1的损失函数初始值大院Model #2,但是随着训练过程的进行,下降的也更快。Model #2在训练过程中出现了停滞,简单来看Model #1的效果要好于Model #2,但是Model #1有可能出现了过拟合

8.2.2 Mult-class SVM Loss 多类SVM损失

多类SVM损失方法的灵感来自于线性支持向量机((Linear)Support Vector Machines),也叫做SVMs。它的打分函数可以输出我们图像的的标签和对应的分数。
f(x_i, W, b) = Wx_i + b
现在我们有了打分函数,我们需要决定,或者告诉我们的打分函数什么是“好的”结果,什么是”不好的”结果。这个“好”或者“不好”表现在参数就是权重矩阵W和偏移向量b的取值。为了做这个判断,我们需要引入损失函数

回顾一下前面的记录,我们创建了一个集合X用来承载输入的图像数据。每个图像表示为x_i

相同的道理来看,我们使用一个集合y包含集合X中所有的标签。这些y的值是真实标签值,并且我们希望其中包含的标签被正确的预测,我们可以通过y_i来访问x_i所对应的标签。

我们用s来表示打分函数
s = f(x_i, W)
并且可以通过x_i的值来得到s_i的值:
s_j= f(x_i, W)_j

那么我们可以把上面的公式的前面的预测公式合并起来,得到hinge loss function(铰链损失函数,可能翻译的不准。。。),关于铰链损失函数的理解参考了知乎CSDN这两篇文章。
L_i = \sum_{j\ne y_i}max(0, s_j - s_{y_i} + 1)

函数的右侧表示,当预测的标签结果y_ij不一致的时候,取0和s_j - s_{y_i} + 1的最大值,也就是保证了每次返回的最小值是0(非负),从而保证了累加过程的进行。s_j - s_{y_i} + 1表示:打分函数对于当前输入数据x_i的打分结果,s_{y_i}表示输入数据的真实分数值(从计算的角度这里有点解释不同,打分函数会返回输入数据对应的标签和对应的分数值,那么s_{y_i}对应的真实的标签的分数值从何而来???)。
假设法来尝试理解这个计算过程,s_j打分函数(评价函数)给出的预测结果的分数值,那么从程序的角度,这是个3 X 1的向量,分别对应了每个标签的预测得分情况,因为只有预测标签和数据本身的标签不一致的时候才会执行这个计算,那么只看一个标签,假设还是dogs, cats and pandas数据集,打分函数预测的标签是dogs这个标签,s_j代表了图像是狗的得分,而且这个得分还是三个标签得分最高的,假如是123分,那么假设s_{y_i}的值是固定的,并且取值为1000,这时候计算结果是123 - 1000 + 1 = -876,那么取最大值,L_i结果是0???如果s_{y_i}取值太大,打分函数每次输出都比较小的话,岂不是L_i一直为0???节奏不太对。。。
那么反过来看,后面有说到如果预测正确的时候L_i = 0,如果程序不使用if对标签是否正确做判断,只使用这个损失函数来计算,确实可以达到目的。并且S_{y_i}的值不需要手动设定。
打分函数会输出所有标签对应的分数,如果预测错误,说明真实标签的S_{y_i}的值小于预测标签s_j的值。那么s_j - s_{y_i} + 1才是正值,所以L_i才会得到积累,如果预测是正确的,那么s_j - s_{y_i} + 1的值为负,输出的L_i为0。这样也就不涉及如何手动指定s_{y_i}的问题,bingo

那么铰链损失函数是对所有 预测标签真实标签 不一致的情况,对打分函数输出的不正确标签的分数打分函数输出的真实标签的分数做相减后值的累加。

那么当输入图像x_i被分类正确的时候s_j - s_{y_i} + 1 < 0,得到L_i = 0,为了求得对于整个数据集训练过程的损失值,我们求取整个训练过程L的平均值。
L = \frac{1}{N}\sum_{i = 1}^{N}L_i

另一种求取L_i的方法叫做squared hinge loss平方铰链损失函数:
L_i = \sum_{j\ne y_i}max(0, s_j - s_{y_i} + 1)^2
平方铰链损失函数对于损失的表示更加明显,由于对错误情况增加了平方来进行计算。

最终使用哪种损失函数来进行运算,完全决定于你的数据集。一般来说标准铰链损失函数使用更广泛一些,但是对于一些数据集来说,平方铰链函数可以的到更准确的结果。当然了,这些是属于调整超参数范畴的内容。

A Multi-class SVM Loss Example 多类SVM损失函数的例子
现在我们来从数学的角度看一下铰链损失,首先来看一个已经实现好的例子。
还是使用dogs, cats, pandas数据集,并且假设我们配置好了Wb得到了下图中的数据来展示这个过程:

展示流程使用的数据

那么我们开始计算Image #1预测的L_i,如下图:

Image #1的损失值
由于4.26是打分函数输出数据的最大值,那么我们的预测结果是dogs,而且铰链函数输出的L_i为0,所以预测是正确的。

这里需要重新对前面理解做纠正,我们通过打分函数得到最大值的分数,从而做出了预测,但是在计算的时候不计算最大值的损失值,只计算除了最大值之外的两个打分函数输出的值。如果把打分函数输出的结果也纳入计算,L_i的值最小就是1,在整个数据集的累加过程中会对最终结果有影响,但是反过来看,最终的L值是要取平均的,即使把正确的标签也加上了1,其实取平均之后只是整体加了1。算法不同对于数值结果的线性改变,也可以接受。但是不计算会减少程序的计算量,每个数据的损失值少了一次线性运算。所以不计算,差不多是这样。

注意到我们只计算了剩余两项的损失值,得到了L_i = 0

那么接下来看Image #2的损失值,如下图:

Image #2的损失值

这种情况下,我们的L_i = 5.96,大于0,说明我们的预测结果是不正确的。反过来看数据图片,我们的预测标签是dogs,但是图片实际标签是cats。第九章将会学习如何来调整我们的Wb来达到正确分类。

接下来是Image #3的损失值,如下图:

Image #3的损失值

最后,我们通过评分函数计算得到了三张图片的评分结果,然后用铰链损失函数计算除了三张图片对应的损失值,那么我们这次训练过程的损失L就是三个损失值的平均值,如下图:

三张图片训练的整体损失值

那么得到的这次训练的损失值就是3.72,这个损失值是我们优化Wb的重要依据,下一张将会介绍如何使用训练的损失值来优化Wb

8.2.3 Cross-entropy Loss and Softmax Classifier 交叉熵损失函数和Softmax分类器

虽然铰链损失很流行,但是在深度学习的卷积神经网络中,交叉熵Softmax分类器却更加常用。
为什么呢?原因很简单:
Softmax分类器给出了我们每种预测标签的可能性,铰链损失函数只能提供边缘距离

啥是边缘距离(margin scores)?
这里不清楚,需要之后补充。。。

而且更重要的是,如果我们使用类似于ImageNet的数据集,我们会查看使用卷积神经网络(CNN)之后得到的精确度最高的五个数标签。这个过程的目的是查看我们的真实标签是否存在于精确度最高的五个标签之中。所以精确度是一个非常好的属性。

对于作者这段话的理解,边缘距离(margin scores)不能通过数值来直接判断可能性,所以通过边缘距离的大小来建立标签的排名去判断预测结果。

Understanding Cross-entropy Loss 交叉熵的理解

Softmax分类器Logistic Regression(洛吉斯蒂回归)的二值情况的实例。就像铰链损失或者平方铰链损失,我们的映射函数f接收一个图像输入数据x_i,然后通过点积运算输入数据x_iW,从而得到输出分类标签的映射过程,公式如下:
f(x_i, W) = Wx_i

然而,回过头来看交叉熵,它和铰链损失不同,我们可以把它解释为每组标签的unnormalized log probabilities
(非归一化对数概率,翻译的可能不准),具体运算是把铰链损失函数的值转换为交叉熵,公式如下:
L_i = -log(\frac{e^{s_{y_i}}}{ \sum_{j}e^{s_j}})

这个公式是如何得到的呢,下面分析运算过程。如果想要让我们的损失函数在预测结果正确的时候输出最小的概率值的负的对数,公式如下:
L_i = -logP(Y = y_i | X = x_i)

这里不太好理解,当打分函数输出的结果预测得到了正确的标签,我们的损失函数需要输出一个概率值,这个概率值应该是最小的概率值?而且这个概率值还是某个值的负的对数值?如果从抽象出y = - logX,要想让y最小,那么-logX最小,根据对数图像的性质,-logX的取值最小对应X取值无限趋近于0。感觉不太对,继续往下看先。。。
上面的理解没有顾及数据含义,重新解释如下:
由于我们已经得到了归一化的概率值,也就是说P(Y = y_i | X = x_i)的取值范围是(0 ~1 )。那么我们通过对数函数来计算损失值的时候,需要把对数函数取负,保证结果为正。因为函数y = lnX在区间(0 ~1)上的值是负的,所以加个负号,变成正的。真。。。机智。
至于交叉熵损失为什么先要对打分函数取自然对数的打分值的指数幂,然后输出归一化概率之后求负倒数值作为损失。还需要看看paper理解其中的原理。现阶段的理解到这里。

那么概率函数可以表示为:
P(Y = k|X = x_i) = \frac{e^{s_{y_i}}}{\sum_{j}e^{s_j}}

并且我们打分函数形式如下:
s = f(x_i, W)

那么,对于某个输入数据的损失函数可以表示如下:
L_i = -log(\frac{e^{s_{y_i}}}{\sum_{y}e^{s_j}})

值得注意的是,这里的对数运算都是基于自然对数e进行的,经过幂运算并且归一化之后的结果就是我们的Softmax functionSoftmax函数。取负对数之后就是我们的交叉熵

那么回过头来对于我们的铰链损失或者平方铰链损失,我们可以通过对所有数据集得到的值取平均值来得到我们的交叉熵,公式如下:
L = \frac{1}{N}\sum_{i = 1}^{N}L_i

作者提到,这里介绍的这些公式也许有些不好理解,这里只是做铺垫,之后在第九章中会详细解释用法和实现,从而帮助更好的理解为什么交叉熵是神经网络和深度学习的关键。

下面的图示展示了交叉熵大概的运行情况:

Softmax运行实例

对于上图中:

为了在实际运行中展示交叉熵损失是如何运作的,我们来分析上图中的步骤。我们的目标是分辨输入图像中是否含有dog, cat, panda。很明显的,我们可以知道输入图象是熊猫,但是我们的Softmax classifier是如何判断的?为了理解它的运行原理,我们作如下分析:

第一个表格中包含了打分函数f对于输入图像的每个标签的分数。这些值是我们未归一化对数概率分类的输入值。我们对打分结果做幂运算(也就是e^s,其中的s是我们的打分函数输出的值),经过计算我们得到了表格二

下一步实对所有的计算得到的对数值做相加,得到了分母分子是每个标签的对数计算值。从而得到了每个标签对应的归一化概率(也就是所有概率值相加等于一)。最后我们对归一化的概率结果取负对数(-ln(p)),从而得到了交叉熵损失

那么回过头来看上面的图像,我们可以看出,Softmax classifier直观的给出了panda标签的概率是93.93%。这个方法可以让我们计算得到数据集中所有的交叉熵损失,从而利用这些值来调整或是评价我们的参数。

小结
这一章,我们复习了参数学习的四大组件:

在本章的图像分类问题中,数据是图像数据集。打分函数可以产生对于每个输入图像的预测损失函数可以评价我们的预测结果。最终,权重矩阵和偏差向量给了我们去从数据集中“学习”的能力,并且我们可以通过优化这两个参数来实现一个高精确度的分类器。

我们还复习了两个很流行的损失函数,铰链损失交叉熵损失铰链损失被应用于很多机器学习的应用中,例如SVMs。交叉熵损失的应用则更为广泛,因为Softmax分类器可以输出概率,而不仅仅是距离margins)。

下一章将会学习一些优化方法,去调整我们的权重矩阵和偏差向量。优化方法真正的让我们的模型算法实际的去从数据集中“学习”到信息。优化方法是现代神经网络和深度学习的基石。

上一篇下一篇

猜你喜欢

热点阅读