cs_notes

Stanford University CS231n, Spring 2017

https://www.youtube.com/playlist?list=PLC1qU-LWwrF64f4QKQT-Vg5Wr4qEE1Zxk

1. Lecture 1 | Introduction to Convolutional Neural Networks for Visual Recognition

课程概览

希望这对你有帮助。 Let me know if you have any other questions.

Lecture 2 | Image Classification

Piazza和分配1

图像分类任务

分类难点

学习算法思路

KNN算法

线性分类器

神经网络

3. Lecture 3 | Loss Functions and Optimization

行政通知

上课内容回顾

损失函数

多类SVM损失函数

4. Lecture 4 | Introduction to Neural Networks

基本介绍

这节课主讲人是Serena Yeung,她介绍了自己是Fei-Fei小组的PhD学生。这节课将会介绍如何计算梯度,以及神经网络基本概念。

作业安排

分类器定义回顾

之前讨论过如何定义分类器函数f(x), 函数的权重参数为W。f(x)会将数据x作为输入,输出每个分类的分数向量。同时可以定义损失函数,比如SVM损失函数来衡量预测结果的好坏。 将损失函数和正则化项合并为总体损失L。

梯度下降

上一节介绍了使用优化方法来通过迭代地减小损失函数L来找到最佳的W值。每一步都会按照梯度下降的方向,-∇L的负梯度进行移动,逐渐走向损失最低点。

计算梯度

可以使用数值近似或解析梯度来计算∇L。数值近似简单但效率低,解析梯度高效但需要复杂的微分。实际应使用解析梯度来计算,并用数值梯度验证是否正确。

computational graphs

可以使用计算图来表示任意函数。节点代表计算步骤,边代表变量流向。这样可以使用后向传播算法计算任意复杂函数对所有变量的梯度。

后向传播原理

以一个简单函数f(x,y,z)=x+y*z为例,使用计算图表示函数,然后顺序传播计算其值。然后递归应用链式法则从后向前计算每个变量对函数输出的梯度。

总结

后向传播算法利用每个节点仅知晓其本地信息,如输入,输出和本地梯度,然后使用链式法则将本地梯度逐层向前传播,最终计算出任意变量对损失函数梯度。这种方法使得只需要处理简单节点的本地梯度,而不必为整体函数直接求导。

5. Lecture 5 | Convolutional Neural Networks

1957年 弗兰克·罗森布拉特提出感知机

感知机是一个算法,它使用W乘以X加上偏置来计算出分类分数。但是这里的输出只能是1或0。此外还有一个更新规则来更新权重W。

1960年 Widrow和Hoff提出Adaline和Madaline

这是第一个将线性层叠加成多层感知器网络的模型。但是还没有反向传播等训练原理。

1986年 Rumelhart 提出反向传播

首次正式提出用链式法则及更新规则来训练这类网络。

2000年以后 神经网络得以重现

2006年 Hinton和Salakhutdinov的工作展示了如何训练深神经网络。但需要复杂的初始化。

2012年 语音识别和图像分类取得突破

Hinton实验室在语音识别和图像分类任务上取得重大突破。特别是Krizhevsky提出的AlexNet极大提升了ImageNet分类效果。

1950年代 Hubel和Wiesel对猫视觉皮层神经元的研究

发现视觉皮层中的神经元具有嵌入式性和分层组织结构。有简单细胞接受特定边缘或形状,复杂细胞对移动和位置不敏感。

1980年 Fukushima提出模仿此结构的Neocognitron

第一个将简单和复杂细胞组织成替代层的网络模型。

1998年 Yann LeCun首次将卷积神经网络应用到手写数字识别

在美国邮政服务中广泛使用。但能力有限仅能识别简单数字。

2012年 Alex Krizhevsky的AlexNet为卷积神经网络奠定现代标准

该网络利用大量数据和GPU进行高效训练,在ImageNet上取得突破性成果。

卷积神经网络今天广泛应用于各种领域

如图像分类、检测、分割等基础任务,以及生成任务如图像字幕生成等。它还在医学、游戏、自然语言处理中发挥重要作用。

Lecture 6 | Training Neural Networks I

激活函数

Sigmoid

Sigmoid函数是σ(x)=1/(1+e^-x),它将每个输入压缩到范围[0,1]之间。

Sigmoid存在几个问题:

  1. 当输入为非常大正数或负数时,梯度近似于0,会“杀死”梯度传播。

  2. Sigmoid输出不是零中心的,所有输入都为正数时,权重的梯度都只能为同号,效率不高。

  3. Sigmoid包含指数函数计算,计算成本较高。

Tanh

Tanh函数是tanh(x),它将每个输入压缩到范围[-1,1]之间。解决了Sigmoid的第二个问题,但仍然存在第一个问题,即当激活近乎饱和时,梯度近似为0。

ReLU

ReLU激活函数是max(0,x)。它不会“杀死”梯度,并且计算成本很低。但它可能导致“死亡单元”问题,即当x≤0时梯度为0。

网络初始化

需要初始化各层的权重,一般采用小随机值初始化。常用的初始化方法包括满足高斯分布或 uniforms 分布等。

训练网络

使用梯度下降法训练网络参数,迭代的步骤包括:

  1. 采样一个随机批次数据
  2. 前向传播计算损失
  3. 反向传播计算梯度
  4. 使用梯度下降更新网络参数

主要优化算法有 Mini-batch SGD,Momentum, RMSProp 等。

其他技巧

Lecture 7 | Training Neural Networks II

激活函数

上次讲到了各种激活函数及其属性,sigmoid常用于10年前训练神经网络,但在梯度消失问题。tanh也存在类似问题,一般ReLu作为默认选择。

权值初始化

如果初始化太小,抵消效应导致激活值随网络向前传播而减弱。如果太大,会产生爆炸。Xavier和MSRA初始化可保持好的分布。随网络深度增加,这一点变得越来越重要。

数据预处理

卷积神经网络通常使用零均值归一化预处理输入,目的是使损失函数对参数小偏差不敏感,易于优化。batch normalization层也采用这个思路,利用mini batch中的统计信息实时归一化中间激活值。

监督训练过程

应监测训练loss和验证精度曲线以避免过拟合。超参数搜索初步应采用宽范围粗略搜索定位高效区域,然后逐步收缩范围精细优化。学习率通常最重要,其次正则化等。

其他细节

GPU实例费用高,只在最后一个问题需要时使用。实例停止后才真正停止计费。RAM8-16G及2-4CPU应够本课程需求。特征工程、算法、学习率衰减、随机搜索、批处理规模等也关系学习效果。

Lecture 8 | Deep Learning Software

课程信息

  1. 项目提案截止日期是周二。

  2. 正在批改第一次作业,结果会及时告知学生。

  3. 第二次作业截止日期是下周四。在做作业时要关闭没在使用的Google Cloud实例以节省开销。

  4. 第二次作业实质上只需要在最后一个notebook中使用GPU,前几个notebook仅需要Python和NumPy就可以了。

  5. 中期考试日期是5月9日周二,将以理论问题为主,检查学生对已学知识的理解。

计算机架构

深度学习软件

主要深度学习框架包括:

选择框架需权衡开发效率、性能、可扩展性等因素。深度学习任务越来越依赖软硬件整合。

9. Lecture 9 | CNN Architectures

AlexNet

AlexNet是第一个大型卷积神经网络,能成功地完成ImageNet分类任务。

AlexNet的输入图像大小为227×227×3。第一个卷积层采用11×11滤波器,96个滤波器,步幅为4。输出大小为55×55×96。这个层次的参数数目为35k。

第二个层次是池化层,采用3×3滤波器,步幅为2。输出大小为27×27×96。池化层没有学习参数。

AlexNet共有5个卷积层,3个池化层,用ReLU作为激活函数,采用dropout技术。批规模为128。使用SGD加Momentum进行训练,初步学习率为1e-2,验证准确率出现平台时缩小10倍。进行数据增强处理包括翻转,抖动,裁剪和颜色归一化等。

AlexNet的最后几层为全连接层,其中4096维和4096维。最终 softmax 层输出1000维,对应ImageNet分类任务的类别数。AlexNet在2012年ImageNet竞赛中首次使用卷积网络,大幅降低了错误率,开启了卷积网络研究的高潮。

ZFNet

2013年ImageNet竞赛获胜网络为ZFNet,即Zeller Fergus Net。ZFNet相比AlexNet仅优化了网络超参数,层次结构和数量与AlexNet相同。

VGGNet

VGGNet采用相对较小的卷积过滤器3×3,深层次的网络结构,推广使用了池化层。VGG16和VGG19分别由16层和19层卷积层组成。特征图大小经过 pooling 层以后节省计算复杂度。第一层使用1×1步长的卷积,后续使用2×2步长最大池化层。最后使用三个全连接层,每个有4096个节点,最后使用 softmax 输出交叉熵作为目标函数。VGGNet在2014年ILSVRC比赛中表现出色。

GoogleNet

GoogleNet设计上采用了卷积层与池化层交替使用, relu作为激活函数。最大新意在于使用了Inception模块,通过1×1、3×3、5×5等不同尺寸的卷积filter并行运行,之后结果 concat 拼接,同时减少参数数量。Inception模块使网络更深更宽,GoogleNet在2014年ILSVRC比赛中首次使用Inception架构,取得ImageNet分类任务独一无二的成绩。

ResNet

ResNet采用残差结构,通过添加跳跃连接解决深层神经网络学习钝化问题。它利用前向传播获取特征映射,同时让这些特征映射可以直接作为后续层的输入部分,或者通过元素相加融合得到最终结果。ResNet可以很深,如ResNet-152拥有152层,在2015年ILSVRC比赛中取得当时最好的分类结果。

其他网络

此外,还有一些其它经典或研究型网络架构,比如CNN-SVM、Network In Network、DenseNet等。

10. Lecture 10 | Recurrent Neural Networks

一般前馈网络和循环神经网络的比较

循环神经网络的常见应用场景

Resnet神经网络的设计思想

ResNet网络采用残差结构,每个结块输出加上输入,有以下设计思想:

  1. 如果结块参数全部为0,输出就是输入,实现恒等函数
  2. L2正则化驱动参数趋于0,实现选择性使用结块
  3. 通过残差连接增强梯度下传,跳过多个层传递梯度

残差连接对梯度传播的影响

残差连接在反向传播中,可以将梯度分成两条路径:

  1. 一条通过卷积块前向
  2. 一条通过残差连接直接传播

通过增加梯度传播路径,有效解决深网络训练难问题。

CNN网络的发展历程

实验性练习:训练游戏

为给学生更多实战机会,课程设计了一个在线训练游戏。学生可以在其中与不同数据集和网络结构进行交互式训练,体验调参的过程和感受。

Lecture 11 | Detection and Segmentation

语义分割

语义分割任务是将图像每一个像素点分类到某一类别中。例如输入一张带有猫的照片,输出每个像素点所属的种类标签,比如猫、草地、天空等。

语义分割与实例分割的区别在于,语义分割无法区分图像中相同类别的不同个体。例如如果图片中有两只站在一起的牛,语义分割输出的标签中两只牛看起来会融合在一起,无法识别出二者。

分类与定位

一种实现语义分割的方法是采用划窗分类法。首先将输入图像切分成很多很小的局部窗格,然后对每个窗格提取特征并进行分类,预测其中心点像素的种类标签。这种方法可以利用以前学习到的分类模型,但预测效果可能不佳。

目标检测

目标检测任务是识别图像中的目标对象并绘制边界框。例如输入图片可能包含人、车、图书等多种目标,输出需要给每个目标加上框并标注其种类。

常用的目标检测模型有两步:第一步通过主干网络提取特征图,第二步进行区域提升网络预测各个预测框和其对应的类别分数。区域提升网络同时会学习默认框的几何形状和位置信息。

实例分割

实例分割与语义分割的区别在于,实例分割可以识别图像中不同个体。例如两只站在一起的牛,实例分割可以给每只牛都画一个边框并预测其种类。

实现实例分割的一种方法是利用目标检测网络首先检测每个实例,然后在每个检测框内使用像素级语义分割来完成实例分割任务。

总结

本节介绍了几类常见的计算机视觉任务,如语义分割、目标检测、实例分割等,以及一些任务之间的关系。详细阐释了这些任务的差异性以及一些基本实现方法。

12. Lecture 12 | Visualizing and Understanding

首层卷积滤波器

中间层卷积滤波器

常见的卷积神经网络任务

视觉化技巧

总结

本节介绍了如何利用不同技巧来观察和理解卷积神经网络内部事件,以获得网络学习到的视觉表征。

Lecture 13 | Generative Models

今日内容概述

今天我们将讨论生成模型,这是无监督学习中的一种。首先给出一些管理细节。然后会简要介绍无监督学习和它与监督学习的区别。

主要讨论三种常见的生成模型:

  1. PixelRNNs 和 PixelCNNs。这是显式概率密度模型。

  2. 变分自动编码器。这也是显式概率密度模型,但使用近似概率密度。

  3. 生成对抗网络(GAN)。这是一种隐式概率密度估计方法。

无监督学习与监督学习的区别

监督学习使用带标签数据来学习从数据X到标签Y的映射函数。

而无监督学习并不使用标签,而是试图学习数据的隐藏结构,如群集、主成分分析或概率密度估计。

生成模型

生成模型的目标是,给定训练数据,学习生成来自相同分布的新样本。这可以解决概率密度估计问题。

生成模型可以进行显式或隐式概率密度估计。

生成模型的应用包括生成新样本、超分辨率、颜色填充、时序数据模拟等。学习生成模型也可以推断潜在表示特征。

PixelRNNs 和 PixelCNNs

PixelRNNs 和 PixelCNNs 是显式概率密度模型。它们使用随机场来建模图片中的每一个像素的条件概率分布。

PixelRNN 使用RNN顺序生成图片像素,但速度较慢。PixelCNN改用CNN并行生成,运行速度更快。

变分自动编码器

VAE 是另一种显式概率密度模型。它使用变分推断来近似真实分布,并最大化图片的生成概率。

生成对抗网络

GAN 属于隐式概率密度估计模型。它训练生成器来尽可能欺骗鉴别器,使生成样本看起来像真实样本。GAN 生成的是高质量新样本但没有明确定义概率分布。

14. 深度强化学习

强化学习问题

强化学习中的主要对象包括:

优化目标是最大化总奖励。

具体实例包括:

马尔科夫决策过程

马尔科夫决策过程(MDP)是强化学习问题的数学描述,其主要组成包括:

MDP描述了一个循环过程:环境提供状态→代理选择行为→环境给奖励与下个状态

策略与价值函数

策略π是行为决策规则,其定义域为状态空间,目标为求解最优策略π*。

价值函数定义:

π*满足贝尔曼方程:

Q(s,a) = E[r + γmaxQ(s’, a’)]

算法

常见算法有:

Lecture 15 | Efficient Methods and Hardware for Deep Learning

算法改进推理效率

剪枝

可以通过移除一些权值来减小模型尺寸,但不降低准确率。LeCun于1989年首次提出这个剪枝方法。通过训练-剪枝-重训练的循环可以移除90%的参数而不受影响。

权值共享

将相似的权值聚类到一起,用一个聚类中心来代表它们,这样可以节省存储每个权值所需要的位宽。

量化

使用8位整数或者16位浮点数来替代32位浮点数来表示权值,可以大幅减少计算和存储开销。

分块计算

将大模型分成多个更小的子网络进行推理,并行计算来提高速度。

网络压缩

用小尺寸的网络来fit大尺寸网络的功能,被称为智能剪枝,可大幅减小模型。

轻量级模型

直接设计小模型来完成特定任务,比如MobileNet用于移动设备。

硬件改进推理效率

CPU 和 GPU

CPU适合低并行少数据的情况,GPU适合大规模并行大数据量的情况。

FPGA

可编程逻辑门阵列,具有自定义能力但性能比不上ASIC。

ASIC

专门为深度学习设计的加速器芯片,如谷歌的TPU。TPU可以运行量化网络 dozens或百倍faster than GPU。

算法改进训练效率

混合精度训练

使用不同bitwidths来表示变量,如权值使用高精度しながら梯度使用低精度。

数据并行

将一个大批次的数据分割到多个GPU卡上进行训练。

模型并行

将一个大模型分割成子网络并行运行来加速训练。

优化算法

使用更高效的优化算法,如动量,Adagrad等来加速收敛。

硬件改进训练效率

GPU

可以添加更多GPU来提高训练速度。Volta架构支持混合精度训练。

定制化硬件

如Google的云 TPU v2,专为深度学习训练量身定制,每日训练cost更低。

FPGA

可编程能力可以加速定制训练算法。

多芯片组模块

将多个硬件模块集成来实现大规模分布式训练。

16. Lecture 16 | Adversarial Examples and Adversarial Training

什么是对抗例子

对抗例子是经过精心设计计算出来的例子会被模型误分类。大多数情况下,对人来说对抗例子与原始例子无法区分。

对抗例子如何产生

通过优化输入例子,找到使模型分类错误的最小修改。如将熊猫图片通过极小量修改转变为长臂猿的分类。优化搜索的目的是最大限度地提高分类错误概率。

对抗例子对深度学习的威胁

对抗例子能成功使用极小修改欺骗深度学习模型的分类,对安全性有重大威胁。 It可以用来制造机器学习系统的安全漏洞。

防御对抗例子的方法

目前主要防御方法在于提升模型的鲁棒性,增加对噪声的容错能力。但总体来说,防御对抗例子仍是一个开放性研究问题。

使用对抗训练来提升模型

可以使用对抗训练的方法来提升模型性能,即在训练过程中加入对抗扰动来模拟真实攻击,使模型学习到更强大的特征表示能力。

对抗例子产生的本质原因

对抗例子之所以容易产生,与模型本身的线性性质有关。即在输入空间附近,模型输出对输入的微小变化很敏感。而对抗扰动正是利用这个特性进行的最小修改攻击。

线性模型也很容易受到对抗攻击

通过优化输入例子,可以将MNIST数字很小改动地一步步导向不同分类,说明即使是简单线性模型也很难抵御对抗攻击。

总结

对抗例子是一个极其重要的安全问题。深入研究它的产生机理对提升模型鲁棒性和防御对抗攻击都很重要。同时,使用对抗训练也可以有效提升模型性能。