Assignment 1 | 斯坦福CS231n-深度学习与计算机视觉课程

CS231n简介

CS231n的全称是CS231n: Convolutional Neural Networks for Visual Recognition,即面向视觉识别的卷积神经网络。该课程是斯坦福大学计算机视觉实验室推出的课程。需要注意的是,目前大家说CS231n,大都指的是2016年冬季学期(一月到三月)的最新版本。

课程描述 Information 计算机视觉在社会中已经逐渐普及,并广泛运用于搜索检索、图像理解、手机应用、地图导航、医疗制药、无人机和无人驾驶汽车等领域。而这些应用的核心技术就是图像分类、图像定位和图像探测等视觉识别任务。近期神经网络(也就是“深度学习”)方法上的进展极大地提升了这些代表当前发展水平的视觉识别系统的性能。 本课程将深入讲解深度学习框架的细节问题,聚焦面向视觉识别任务(尤其是图像分类任务)的端到端学习模型。在10周的课程中,学生们将会学习如何实现、训练和调试他们自己的神经网络,并建立起对计算机视觉领域的前沿研究方向的细节理解。最终的作业将包括训练一个有几百万参数的卷积神经网络,并将其应用到最大的图像分类数据库(ImageNet)上。我们将会聚焦于教授如何确定图像识别问题,学习算法(比如反向传播算法),对网络的训练和精细调整(fine-tuning)中的工程实践技巧,指导学生动手完成课程作业和最终的课程项目。

视频入口

Assignment(1)

01

线性分类器(Linear classifier)

  • 分值函数,将原始数据(即输入数据,经过预处理后的)映射成每个类对应的分值(分值越高,该类的可能性就越大)。 score function: map the raw data to class scores.
  • 损失(代价)函数,表示预测结果和真实类标签之间的差。 loss/cost function: quantify the agreement between the predicted scores and the ground truth labels.
  • 优化,最小化损失函数(通过优化分值函数中的参数/权重)。 optimization: minimize the loss function with respect to the parameters of the score function.
  • 数据集(本课程中指图像): ·训练集(training dataset),用于训练模型(即训练模型的表达能力)。 ·验证集(validation dataset),用于微调模型的超参数,使模型性能达到最优。 ·测试集(test dataset),测试模型的泛化能力。

假设我们有一个图像训练集 X,是一个大小为[N,D]的矩阵;其中,N表示样本的数量,D表示样本的维数。xi是X中的第i行,即第i个样本。

y表示一个向量,大小为[1,N];yi表示第i个样本的真实类别,yi=1,2,3, ...,C。

假设我们有一个线性映射为:

----------------------> f(xi, W, b) = xiW + b <--------------------

其中,W是权重(weight)矩阵,大小为[D,C],W的第j列表示xi在第j(1≤ j ≤C)个类别上的线性映射;b是偏置向量,大小为[1,C];f的大小为[N,C]。(ps: 这里的公式为了和代码里的保持一致,做了调整,下面的公式都为编程服务)

函数f(xi, W, b) 的值就是C在每个类别上的得分,而我们的最终目标就是学习到W和b,使得f的大小在全局范围内接近真实值,即真实的类别得到更高的分数。

为了便于直观理解,下面贴出一个栗子(和上面的公式有点区别,但不影响理解):

CS231n Convolutional Neural Networks for Visual Recognition.png

图片中的结果认为这很可能是一只狗,说明W和b的值没有训练好。

关于线性分类器的几何解释和模板解释,可以直接看cs231n的笔记,这里不再赘述。

为了便于计算,我们可以将b和W进行合并,将b加到W的最后一行,W的大小将变为[D+1,C]。此时,xi需要增加一维常数1,即xi的大小为[1,D+1](编程的时候别忘了);同时,上面的f需要修改为:f(xi, W) 。

  • 数据预处理(Part 3 部分会讲一下为什么需要预处理) 在机器学习里,规范化/归一化(Normalization)输入特征(这里指像素值[0,255])是非常常见且必要的,特别是对于各维度幅度变化非常大的数据集。但对于图像而言,一般只要去均值(mean subtraction)即可(因为图像每一维的像素值都在[0,255]之间),即计算出训练集图像的均值图像,然后每张图像(包括训练集、验证集和测试集)减去均值图像(一般不需要归一化和白化)。在numpy中此过程可以表示为: X -= np.mean(X, axis=0)。

1. 多分类支持向量机损失函数(Multiclass SVM loss)

SVM loss : 对于每一张图像样本,正确分类的得分应该比错误分类的得分至少高Δ(Δ的取值在实际中一般为1,不将Δ作为参数是因为它的变化可以转换为W的变化,所以只要训练W就行了)。这里贴上一张图便于理解:

CS231n Convolutional Neural Networks for Visual Recognition.png

上面我们提到的线性映射将第i个样本的像素值作为输入,输出该样本在C个类别上的得分,形成一个分值向量,大小为[1,C]。所以,我们记sj = f(xi, W)j,表示第i个样本在第j类上的得分。那么,multiclass SVM loss的表达式如下:

--------------------> Li = ∑j≠yi max(0, sj−syi+Δ) <---------------

从表达式中可以看出,当syi >= sj + Δ 时,Li = 0,这时候表示判断准确;反之,Li>0,这时候表示判断有误。

我们可以将Li重新表示如下:

--------------> Li = ∑j≠yi max(0, (xiW)j−(xyiW)j+Δ) <------------

上面的max(0, -)函数称为Hinge loss,有时候也可以用max(0, -)2,称为squared hinge loss SVM (or L2-SVM),它对错误的惩罚更加严厉。我们可以通过交叉验证来选择具体的形式(多数情况下我们会使用前者)。(ps: 这里有一篇介绍Hinge loss的博文)


2. 正则化(Regularization)

上面的损失函数存在缺陷:W不唯一。假设一组W使得损失函数的值为0,那么 λW (λ>1) 也能做到。为了得到唯一的W进行分类工作,我们可以添加一个正则化惩罚项(regularization penalty)R(W)来实现,通常是2范数:

---------------------------> R(W) = ∑k∑s (Wk,s)2 <-----------------------

添加惩罚项后,完整的损失函数表达式为:

---------------------------> L = (1/N)∑iLi + λR(W) <---------------------

其中,λ可以通过交叉验证来选择。

对参数进行惩罚最主要的作用其实是防止过拟合(overfitting),提高模型的泛化能力。此外,偏置b不会对输入特征的影响强度产生作用,所以我们不需要对b进行惩罚(但是b被合并到了W里,所以实际上我们在assignment1里对b也进行了惩罚,不过影响不大)。

后面求解参数W会用到L关于W的偏导数,这里我们先给出(推导比较简单,这里Δ我直接换成1了):

------------> ∇Wyi Li = - xiT(∑j≠yi1(xiWj - xiWyi +1>0)) + 2λWyi <------

------------> ∇Wj Li = xiT 1(xiWj - xiWyi +1>0) + 2λWj , (j≠yi) <--------

其中,1(·)是示性函数,其取值规则为:1(表达式为真) =1;1(表达式为假) =0。


3. Softmax classifier

Softmax是二值Logistic回归在多分类问题上的推广。

这里函数f保持不变,将Hinge loss替换成交叉熵损失函数(cross-entropy loss),其损失函数表达式如下(log(e) =1):

-----------------------> Li = -log(exp(fyi)/∑j exp(fj)) <-------------------

其中,函数fj(z) = exp(zj)/∑k exp(zk)称为softmax函数。可以看出softmax函数的输出实际上是输入样本xi在K个类别上的概率分布,而上式是概率分布的交叉熵(不是相对熵,虽然看上去好像是相对熵,下面我会稍微修改一下Li,还原它的本来面目;交叉熵可以看做熵与相对熵之和)。

先引入一下信息论里的交叉熵公式:H(p,q) = -∑x p(x)logq(x);其中p表示真实分布,q表示拟合分布。下面我们来修改下Li:

-----------------------> Li = -∑k pi,klog(exp(fk)/∑j exp(fj)) <-------------

其中,pi = [0,0, ...,0,1,0, ...,0,0],pi,k=pi[k],pi 的大小为[1,C],pi 中只有pi[yi]=1,其余元素均为0。现在感觉如何?

在实际编程计算softmax函数时,可能会遇到数值稳定性(Numeric stability)问题(因为在计算过程中,exp(fyi) 和 ∑j exp(fj) 的值可能会变得非常大,大值数相除容易导致数值不稳定),为了避免出现这样的问题,我们可以进行如下处理:

CS231n Convolutional Neural Networks for Visual Recognition.png

其中,C的取值通常为:logC = -maxj fj,即-logC取f每一行中的最大值。

现在,结合惩罚项,给出总的损失函数:

---------> L = -(1/N)∑i∑j1(k=yi)log(exp(fk)/∑j exp(fj)) + λR(W) <-------

后面求解参数W会用到L关于W的偏导数,这里我们先给出结果,然后推导一遍:

--> ∇Wk L = -(1/N)∑i xiT(pi,m-Pm) + 2λWk, where Pk = exp(fk)/∑j exp(fj) <--------

推导过程如下:

Derivative of softmax loss function.png

下面贴出一张图,大家可以直观感受下SVM和Softmax关于损失函数的计算区别:

CS231n Convolutional Neural Networks for Visual Recognition.png

4. 优化(Optimization)

优化就是通过在训练集上训练参数(权重和偏置),最小化损失函数的过程。然后,通过验证集来微调超参数(学习率、惩罚因子λ等等),最终得到最优的模型;并用测试集来测试模型的泛化能力。

通常我们用梯度下降法(Gradient Descent)并结合反向传播(Backpropagation)来训练参数。具体的参数更新策略,这里我们使用vanilla update方法(我们会在Part3神经网络部分,具体介绍不同的参数更新策略),即x += - learning_rate * dx,其中x表示需要更新的参数。

梯度下降的版本很多,通常我们使用Mini-batch梯度下降法(Mini-batch Gradient Descent),具体参见该课程的笔记。

ps: 在编程任务中你会发现上面提示用随机梯度下降(Stochastic Gradient Descent, SGD),但实际上用了Mini-batches,所以当你听到有人用SGD来优化参数,不要惊讶,他们实际是用了Mini-batches的。

至于反向传播,实际就是链式法则(chain rule),这里不展开讲,具体参见课程笔记。实际上我已经给出了,就是上面的偏导。等到后面的神经网络,再具体展开讲一下。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2017-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PPV课数据科学社区

迁移学习

所谓迁移学习是指针对新问题重新使用预先训练的模型。由于它能用较少的数据训练深度神经网络,这使得目前它在深度学习领域非常流行。通过这篇文章您将会了解什么是迁移学习...

911
来自专栏机器学习算法与Python学习

机器学习(37)之矩阵分解在协同过滤推荐中的应用

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在协同过滤推荐算法...

46313
来自专栏程序你好

关于神经网络技术演化史

神经网络和深度学习技术是当今大多数高级智能应用的基础。在本文中,来自阿里巴巴搜索部门的高级算法专家孙飞博士将简要介绍神经网络的发展,并讨论该领域的最新方法。

884
来自专栏ATYUN订阅号

【行业】如何解决机器学习中出现的模型成绩不匹配问题

评估机器学习模型的程序是,首先基于机器学习训练数据对其进行调试和评估,然后在测试数据库中验证模型是否具有良好的技能。通常,在使用训练数据集评估模型后,你会对得到...

904
来自专栏云时之间

<机器学习>西瓜书,读书笔记

机器学习的发展阶段 1:推荐书目:周志华<机器学习西瓜书>,李航教授<统计学习方法>,这两本书都用简单的方式介绍了一批重要并且常用的机器学习算法 机器学习所发展...

3489
来自专栏CDA数据分析师

一文看懂自动驾驶中应用的机器学习算法

机器学习算法已经被广泛应用于自动驾驶各种解决方案,电控单元中的传感器数据处理大大提高了机器学习的利用率,也有一些潜在的应用,比如利用不同外部和内部的传感器的数据...

23710
来自专栏AI科技评论

学界 | OpenAI最新发现:易于实现的新方法,轻松加快学习速度

AI 科技评论按:OpenAI最新发现表明,通过在网络的参数空间中加入噪声,可以获得远优于在网络的行为空间中增加噪声的表现。此外,他们发布了一系列基准代码,覆盖...

3204
来自专栏新智元

以色列神秘AI研究力量:深度学习的四大失败

【新智元导读】深度学习力量强大,但无论是理论研究者还是实际从业者,了解深度学习的局限也是十分重要的。耶路撒冷希伯来大学的一组研究人员,其中有两位任职于 Mobi...

4168
来自专栏人人都是极客

自动驾驶中常用的四类机器学习算法

机器学习算法已经被广泛应用于自动驾驶各种解决方案,电控单元中的传感器数据处理大大提高了机器学习的利用率,也有一些潜在的应用,比如利用不同外部和内部的传感器的数据...

976
来自专栏人工智能头条

技术干货丨想写出人见人爱的推荐系统,先了解经典矩阵分解技术

对于一个推荐系统,其用户数据可以整理成一个user-item矩阵。矩阵中每一行代表一个用户,而每一列则代表一个物品。若用户对物品有过评分,则矩阵中处在用户对应的...

753

扫码关注云+社区