Advertisement

深度学习斯坦福cs231n 课程笔记

阅读量:

前言

对于深度学习,新手我推荐先看UFLDL,不做assignment的话,一两个晚上就可以看完。毕竟卷积、池化啥的并不是什么特别玄的东西。课程简明扼要,一针见血,把最基础、最重要的点都点出来 了。
cs231n这个是一个完整的课程,内容就多了点,虽然说课程是computer vision的,但80%还是深度学习的内容。图像的工作暂时用不上,我就先略过了。
突然发现这两个课程都是斯坦福的,牛校就是牛。


lecture 1

在历史课上适当休息当作练习听力能力也是个不错的选择跳过不太重要的问题也不会有太大影响华裔同学的语速相对缓慢到了第二节课他人讲解时速度较快在短时间内让人感到困惑不解

看似Fei-Fei Li只露面一次。然而她确实是一位重量级人物,因此她的名字仍然排在演示文稿的前面。

lecture 2-4

机器学习的学习与温习。在听力水平得到提升时,请您参考阅读我之前撰写过的一篇文章:[kaggle实战] Digit Recognizer – 从KNN,LR,SVM,RF到深度学习

  • 对于处理复杂度较高的图像数据来说,KNN算法适当增大k值可能具有更好的分类效果.* * 关于hinge损失函数的理解应该深入一些 L_i = \sum_{i \neq y_i} \max(0, s_j - s_{y_i} + 1) 如需进一步理解建议回去复习相关知识.*

该计算过程被分解至激活门单元,并对反向传播过程提供了物理意义解释。以往一直认为这是一个纯粹的链式求导过程,并未觉得有何特殊之处。

image
  • 下面这个图不错, mark一下。
image

这几节课,复习之余,主要还可以gain some image intuition

lecture 5

提醒建议可以利用预训练好的模型如Caffe Model Zoo提供的基础架构,并对其进行微调以适应特定任务需求。观察下来发现大多与图像相关的问题较为复杂难以直接迁移至其他领域。然而图像处理一直是一个具有挑战性的问题尽管目前深度学习技术已经取得了显著的进步和应用但其他领域的许多应用仍然面临着诸多挑战尤其是涉及到不同领域特有的domain knowledge时可能会遇到更多的困难。

image

activation functions

在查看Keras文档时提到过ReLU函数,起初我以为它非常复杂。然而实际上其公式非常简洁,可以说简洁即为高明。

image

重要的是理解背后的原因

  • sigmoid sigmoid各种不好,然后就开始改进了。
image
这里写图片描述

TLDR是too long; doesn’t read

Data Preprocessing

UFLDL里面的zca白化啥的。

image

weight Initialization

  • 这个结论告诉我们,在神经网络中如果权重在初始化过程中没有做好,则会影响到后续的训练效果。具体表现为经过训练后权重的分布可能出现严重问题。
  • 基于对称性原则,在权重初始化时如果选择非随机的方式,则会导致所有训练出的权重值变得完全相同。
  • 而偏置层则可以通过设置为零来实现。

使用时还可以直接利用现有的成果。然而,在设计特别的激活函数时,则需要特别关注初始化参数设置的影响。

image

relu的除以2

image

Batch Normalization

一开始不太清楚预处理和预处理的区别吗?其实差不多就是按批次处理而已。参加学习的时候有时候也会很容易走神。

image

看了assignment才知道,这个是插入在网络中间的layer。

However, even after preprocessing the input data, there is a likelihood that activations in deeper network layers may tend to lose their decorrelation. Additionally, these activations might fail to retain a zero mean or unit variance since they originate from earlier layers in the network. Furthermore, during training, feature distributions across different layers can shift as layer weights are updated. To address these challenges, [3] suggests incorporating batch normalization into the network architecture.

总体而言,在工程化实现方面有所侧重,并且看起来还是很有实用价值的。2015年还算比较新呢?因此UFLDL不包括在内。

summary

image

发现了一个叫做http://lossfunctions.tumblr.com的网站。以后有机会也可以去查看一下。可以说loss属于模型直观可视化的重要组成部分之一。


lecture 6

前几页是复习的,可以mark一下。

虽然DL模型的损失函数呈现高度非凸特性,在这种情况下通常需要采用一系列优化方法以提升训练效果。相比之下,在处理这类问题时传统的方法如SGD等在表现上显得略显不足

  • SGD效率较低
    • 动量的本质类似于惯性。
    • Nesterov Momentum "lookahead" gradient, 本质是利用未来梯度的信息。具体来说,在代码实现时会提前预测下一步的梯度方向。
image
  • adaGrad 梯度大的抑制一下步长。

  • RMSProp优化上面的

  • Adam: momentum + RMSProp

image

L-BFLS好像是LR用的吧。

L-BFGS does not transfer very well to mini-batch setting.

上代码

复制代码
    # 可以发现用alpha和1-alpha来trade-off两个变量很常见啊。。
    
    # Momentum 
    v = mu * v - learning_rate * dx
    x += v
    
    # Nesterov Momentum 
    v_prev = v
    v = mu * v - learning_rate * dx
    x += -mu * v_prev + (1 + mu) * v
    
    # Adagrad 
    cache += dx *
    x += -learning_rate * dx /(np.sqrt(cache) + 1e-7)
    
    # RMSProp
    cache = decay_rate * cache + (1 - decay_rate) * dx *
    x += -learning_rate * dx /(np.sqrt(cache) + 1e-7)
    
    # Adam
    m = beta1*m + (1-beta1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    x += - learning_rate * m / (np.sqrt(v) + 1e-7)

Regularization: Dropout

2014,也是挺新的。注意效果是regularization。

  • Forces the network to have a redundant representation. 因为这个架构特别适用于图像处理任务,在实际应用中发现即使物体以不同角度出现或仅局部显示也不会影响人类对物体的识别能力。
  • 在测试阶段时可以通过多次应用随机丢弃操作并取平均值来提升模型性能。
    Monte Carlo近似方法包括进行许多带不同丢弃掩码的前向传播并取所有预测结果的平均值;或者直接放弃随机丢弃操作,则需对结果进行缩放以避免数值偏大问题。
    通常情况下建议避免使用随机丢弃,在训练过程中可能会发现这种方法并非最优选择。

lecture 7

  • 在CNN的过程中 stride padding等术语确实需要弄清楚 否则调参时经常会遇到各种问题。
  • 经过多次卷积后 一个点能够感知到的原始图像范围会逐渐扩大 因此卷积操作类似于在逐步提取图像特征 从单个像素到线性特征再到区域特征。
  • 从视觉效果来看 数据经过池化处理后维度会有所降低 这是因为图像中存在大量的冗余信息 比如颜色通道或者其他不相关的细节。
  • 其中max pooling是最常用的主流方法 而average pooling实际上相当于一种尺寸缩减的方式 大尺寸图像通过平均池化生成小尺寸表示。
  • pooling操作在图像处理中具有明确的意义 它能有效地去除多余的信息 突出重要的特征。
  • ReLU作为一种激活函数 可以用来区分信号与噪声 帮助模型更好地学习数据的本质特征。

有没感觉到,DL简直就是为图像问题定制的?

image

最后截个图。smaller filter对计算有利,后面有课程讲到。

lecture 8

与图像相关的领域暂且搁置一下。Fast R-CNN和Faster R-CNN这类算法的名字听起来都很厉害。YOLO表现最佳,在以后有机会的时候可以直接尝试使用它。

lecture 9

告诉你怎么可视化和fool CNN。剩下一些图像的东西。DeepDream啥的。

lecture 10

RNN (Recurrent neural networks, prefer using English if you can't translate, some may have incorrect translations), LSTM (Long short-term memory). Also not particularly impressive features, essentially just altering the network architecture. There's no need to fear; you can start by examining the code of min-char-rnn as an entry point.]

RNN

image

其实就是多加上h(t-1)这玩意,activation function用的是tanh,不知为毛。

image

RNN有多种结构,最简单是Vanilla RNN。assignment就用这种。

image

Image Captioning 这个例子很有意思呢!具体来说呢,则是利用CNN从图像中提取特征h₀后输入到RNN中进行处理。接下来呢,RNN接收了一系列word ID序列作为输入,而中间传递的状态向量h(t)则是融合了图像特征和word ID信息内容的综合体现。难以置信的是,这种方法竟然能奏效!至于具体的实现细节,建议自行完成课程作业练习中涉及的相关实验部分

LSTM

觉得该方法的讲解质量不高,在此推荐一篇优秀的文章:http://colah.github.io/posts/2015-08-Understanding-LSTMs/. 搜索LSTM相关内容时发现这篇文章排到了榜首位置。确实令人信服。

lecture 12

  • 掌握 caffe、theano、lasagne 和 keras 等深度学习框架的发音。
  • 对每个框架的优势与不足进行总结。
    尽管 最好还是亲自实践一番吧 才真正能加深理解
    开始大致了解它们的基本功能后 再通过实践逐步深入学习 吧。
    有些事情只有亲身经历才会真正明白
image

Assignment

年纪大了,挑了一些做,没完全做完。

assignment 1

年纪大了,本来就不愿意做作业了.但是为了更好地完成后面的assignment,在学习过程中需要对numpy进行深入理解与实践操作.熟练掌握Octave也能轻松应对后续的工作.

  • knn让你感受一下vectorized方式代码速度快多少。因为可以底层代码可以针对矩阵计算专门优化。
  • linear_svm的vectorized实现费了不少脑子。直接从naive实现去推,或者自己画了个矩阵的示意图推吧,一步步来也不难,空想有点绕的。Hinge loss 是一个凸函数,不过它有些点不可微的,只是有subgradient。之前学svm都是用对偶、smo啥的来解,为什么?(这里有篇Quora大概意思就是说能方便使用kernel,处理原始线性不可分的情况,优化的参数少了,跟数据维度无关了)。 sgd并不stable,多跑几次结果可能不一样。这里已经开始灌输调参侠的思想了,挺好。
  • linear_classifiers random choice的时候忘记X和y要用同一个采样下标啊。坑爹。
  • softmax的score居然不用exp再normalize,害我查半天。现在脑子转得快,直接用vectorized方式实现了。naive方式反而觉得得翻译回去,年纪大就不写了,代码里直接调用vectorized方式的。
  • two_layer_net 调参调参
  • features 图像相关,HOG和color histogram都帮你写好了。其他领域看看提取特征方面有没可以借鉴的,color histogram就是一种统计特征。HOG看上去也是统计类的特征,统计各方向的梯度得到边缘,没细看,大概是这样吧。HOG=Histogram of oriented gradient,哦,最后才反应过来看英文全称就好。

注意除法的时候,int可能需要转成float。忘记在哪碰到过了。

assignment 2

尽管阅读内容感到枯燥乏味,原本也不愿意动手实践。但实际上是通过模块化方法(modular approach)来提高效率,并且这种方法对于后续学习caffe、torch等开源框架的源码也是有帮助的。assignment设计得高明确实是一个事实。relu虽然表面上看起来只是一个layer上的activation function,在实现过程中将其视为layer统一处理会更加便捷。记得在使用Keras进行实践时感到困惑,并不太明白为何在代码中将FC层与激活函数分开处理。这样呈现的方式并非我所想象中那样直观且层次分明。

Notebook帮您完成"单元测试"任务,挺不错的!每个阶段都有检查点帮助您确认完成情况。

numpy默认是传引用,记得用xx.copy()方法返回深拷贝。

assignment 3

传送一个tanh导数

Dtanh

*rnn_layers.py中,在BP(反向传播)过程中,h(t)除了自身节点的梯度外,同时会将梯度传递给t+1节点.这一发现令人遗憾的是,查阅相关资料耗时较长.

小结

大致掌握了课程的核心内容,并对课程设计感到非常满意

全部评论 (0)

还没有任何评论哟~