对于深度学习,新手我推荐先看UFLDL,不做assignment的话,一两个晚上就可以看完。毕竟卷积、池化啥的并不是什么特别玄的东西。课程简明扼要,一针见血,把最基础、最重要的点都点出来 了。
cs231n这个是一个完整的课程,内容就多了点,虽然说课程是computer vision的,但80%还是深度学习的内容。图像的工作暂时用不上,我就先略过了。
突然发现这两个课程都是斯坦福的,牛校就是牛。
历史课,吹吹水,当作练听力,跳过问题也不大。华裔语速还是慢,后面lecture2别人讲的时候语速快得一下子懵逼了。
貌似是Fei-Fei Li唯一一次出现。不过人家确实是大牛,所以名字还是排在ppt前面。
机器学习的复习。当练听力好了。我以前写过一篇博客,可以对照看看:[kaggle实战] Digit Recognizer – 从KNN,LR,SVM,RF到深度学习。
svm这个hinge loss应该看明白吧Li=∑i≠yimax(0,sj−syi+1) 不明白的自己回去复习svm了。
这几节课,复习之余,主要还可以gain some image intuition
activation functions
以前看keras的文档提到ReLu,还以为很复杂,其实式子很简单,简单就是好啊。
重要的是理解背后的原因
* sigmoid sigmoid各种不好,然后就开始改进了。
TLDR是too long; doesn’t read
Data Preprocessing
weight Initialization
用的时候倒是直接用现成的结论就好。但如果你要搞特殊的activation function,那就得注意初始化的问题了。
relu的除以2
Batch Normalization
刚开始还不太明白跟preprocessing的区别,好像就是分batch做而已。听课听着听着也走神了。
看了assignment才知道,这个是插入在网络中间的layer。
However even if we preprocess the input data, the activations at deeper layers of the network will likely no longer be decorrelated and will no longer have zero mean or unit variance since they are output from earlier layers in the network. Even worse, during the training process the distribution of features at each layer of the network will shift as the weights of each layer are updated.
……
To overcome this problem, [3] proposes to insert batch normalization layers into the network.
总之,是一个有点偏工程实现的优化,貌似还挺有用。2015,挺新的,所以UFLDL没有。
summary
http://lossfunctions.tumblr.com 居然有这个网站,有空可以去看看。loss算是模型直观可视化的一个重要部分。
前几页是复习的,可以mark一下。
貌似因为DL的loss是高度非凸,所以需要下面这些优化。LR啥的没听说过要用adam啥的。估计sgd就很好了。
Nesterov Momentum “lookahead” gradient, 就是先用更新后的位置的梯度。代码实现的时候稍微变形了下。
adaGrad 梯度大的抑制一下步长。
RMSProp优化上面的
Adam: momentum + RMSProp
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 ** 2
x += -learning_rate * dx /(np.sqrt(cache) + 1e-7)
# RMSProp
cache = decay_rate * cache + (1 - decay_rate) * dx ** 2
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)
2014,也是挺新的。注意效果是regularization。
有没感觉到,DL简直就是为图像问题定制的?
最后截个图。smaller filter对计算有利,后面有课程讲到。
图像相关的。先略吧。Fast R-CNN,Faster R-CNN啥的,名字这么屌。YOLO最快,后面有时间直接玩玩这个吧。
告诉你怎么可视化和fool CNN。剩下一些图像的东西。DeepDream啥的。
RNN(Recurrent Neural Networks,不会翻译的就直接用英文吧,貌似有人翻译错了),LSTM(Long short term memory)。也没有很神的东西,就是改变一下网络结构。所以不要害怕。可以看看 min-char-rnn 的代码作为切入点。
其实就是多加上h(t-1)这玩意,activation function用的是tanh,不知为毛。
RNN有多种结构,最简单是Vanilla RNN。assignment就用这种。
Image Captioning 这个例子挺有意思的,就是通过CNN提取图像特征h0给RNN,然后RNN的输入就是一串word id,中间传递的h(t)就是夹杂图像feature和word id的东西。很难想象这样居然work。细节自己做assignment吧。
感觉讲得不怎么好,不如看这篇http://colah.github.io/posts/2015-08-Understanding-LSTMs/, 现在google LSTM,这篇已经排第一了,果然群众的眼睛是雪亮的。
年纪大了,挑了一些做,没完全做完。
年纪大了,原本不想做。但是得熟悉一下numpy,不然后面assignment的有点吃力。熟悉octave的话,也不会太吃力。
注意除法的时候,int可能需要转成float。忘记在哪碰到过了。
虽然看内容没啥意思,原本也不想做。但其实是帮你熟悉modular approach,对后面看caffe、torch等源码还是有帮助的。assignment设计得还是很高明啊。relu虽然可以看做layer上的activation function,但实现的时候当作layer统一处理更方便。之前看keras例子的时候就有点困惑,不知道为啥代码里FC跟activation function分开了。这样代码看上去并不是我想象中的一层层。之前在UFLDL里都是FC+sigmoid作一个layer。
notebook里面帮你写好“单元测试”了,挺好的,这样每一步都有checkpoint知道自己对了没。
numpy默认是传引用,记得用xx.copy()方法返回深拷贝。
基本把课程学完了,感觉课程设计得相当赞,内容也很新。把相应的知识都整理到一起,免得自己零零散散地找论文、找资料,还是推荐大家都系统地学一下比较好。课程的Materials也很棒,不要忘记看。编程的assignment就更不用说了,老老实实做下去确实能学到不少东西,加深课程的理解。讲师karpathy我挺喜欢的,可以上他的博客去看看 http://karpathy.github.io/。深度学习还有另外一门cs224d,是关于nlp的 ,感觉现在深度学习就是图像和nlp比较合适。公司现在为了DL而DL,我也不知能搞出什么东西。