cs231n第6课:梯度下降方法、lr更新方法、dropout、卷积神经网络
发布了作业2:

这节课继续讲网络训练:(梯度下降方法、lr更新方法、dropout、梯度检查)

题外话:我要开始费曼学习法,把概念讲给8岁小孩子听,做一个8岁都能听懂的cs231n的讲课。

SGD(随机梯度下降 Stochastic Gradient Descent)为什么这么慢(达到loss最低点):

v1:虽然w1(竖直方向)可以变得很快,但它是一个和loss减小关系微弱的变量,不同图片下它的变化引起loss变化很大,但是每张图让w1变化的方向都不一样因此彼此抵消,或证明了w1的无关性。
虽然w2(水平方向)梯度很小,但每张图使w2变化的方向都是一致的,所以w2应该快一点变化(只靠微弱的梯度太慢接近loss低点了),所以用动量梯度下降
v2:SGD的前进取决于梯度大小。这个w梯度大是这张图对这个w的喜好,不代表这个w能让所有图都loss减小。让所有图都loss减小的w梯度可能很小,所以前进的很慢。
v3:SGD的梯度大小决定了w的改变速度,等所有w达到合适值才能达到loss最低点。
有些梯度大的w,不同图片w增大减小相互抵消,w只能采纳(当前W下)所有人的利益使loss总均值不高,但没办法满足所有人的目的让loss变小。
有些梯度小的w,不同图片w都增大/都减小,但因为梯度小,所以很慢才能达到loss最低点。【这就是SGD慢的原因之一,为了补救“这类w变得慢”的情况,我们让w的改变速度再依赖于w的总和量,而非仅当前值 → Momentum(动量) update】
15:00
Momentum update(动量更新 (w) )

SGD: w += - learning_rate * dw
w不断的积分(累加)dw
Momentum update:
v = mu * v - learning_rate * dw
v = v0 + 1/2 a t² ,其中v0是指数递减地记录了最近一批v0的趋势
因为不止看当前的dw,而是看一段时间dw的总和,所以浅梯度方向下降变快了
dw += v
momentum为什么比SGD快:
梯度大的w(不同图片dw相反的),总和v 因为相互抵消而减小,dw改变的少(mu存在阻尼,震荡会越来越小);
梯度小的w(不同图片dw相同的),总和v 因为累加而变大,dw改变的大,所以接近loss快。
Nesterov Momentum update(涅斯捷罗夫动量更新)

因为肯定会走其中的v0步(另一步是当前dw),与其求当前点的dw,不如求站在v0点的dw。这样就具备了半步前瞻性。
AdaGrad update(“第二动量更新”)

绝对值变化总量大的w,更新的每一步step size(即dw)会变小(不管不同图片下是相互抵消还是叠加,都会减小)
绝对值总量变化小的w,每一步dw会放大(不管不同图片的dw是相互抵消,还是同方向)。
缺点:随着时间增长,cache会越来越大,w的变化dw会接近 0 。【为了解决这个缺点就有了RMSProp】
疑问:为什么绝对值变化总量大的w(不同图片w改变方向相同)也需要慢慢来?不应该快点更好吗?【andrej说,通常神经网络的optimization landcape不是这样的】
为什么绝对值变化总量小的w(不同图片w改变方向不同)会需要step更大?振荡好像不存在好处,但也没多坏。
RMSProp

cache原先是历史dw²总量计数器,现在只记录近期的一批 dw²(越久之前的dw² 权重按照指数递减)。这样就避免了AdaGrad 会 zero update(dw几乎=0) 的问题。
8:21
Adam Update(结合momentum和RMSProp)
结合Nesterov momentum和RMSProp的也有人在做但貌似还没出论文(说这句是在2016年)
有两句代码是为了在v和cache初始化为0的前几个周期让v和cache“热身”(我有点看不懂),不是很重要
Learning rate(Update):
以上所有更新w的方法都还是有一个lr参数,lr参数也可以更新:
step decay:每(几)个epoch ,learning rate * 0.9
exponential decay:lr = lr * e(每个epoch,e的指数+1)——我感觉这和1是等价的?
1/t decay:lr = lr / (1+kt) t就是epoch数
实践中用的比较少。一般有用类似第二种指数递减的学习率什么的。
第二方法:
泰勒公式(?)、牛顿直接跳到求梯度=0的loss最低点(但占用太多内存资源)、 BFGS比牛顿法少些内存(但内存还是放不下)、L-BFGS可以用(但用mini-batch和随机量时效果不好)
总结:1. 用Adam Update
2. 如果能把所有batch放进内存,用L-BFGS(但目前--2016--大模型用不了,这还只是个研究方向)
model ensemble
多个同种模型一起,平均一下输出,总能得到网络输出额外提高2%的准确率(可以通过trick而在一个模型的训练中得到比如7个模型)
regularization:Dropout
提升2%性能,类似ensemble但不需要多次训练。
类似ensemble的作用,每个mini batch都要重新把网络dropout掉比如每一层drop一半。最终test的时候不drop而使用完整的网络,会有多个模型ensemble的效果。
然后在test的时候不drop,而是使用整个网络,但是要让网络输出 * drop的比例比如1/2。(但是若使用了非线性激活函数,这就不准了)
inverted dropout:也可以把这个“修正”放在forward而不是test函数里,那就是要让网络输出 / drop的比例比如1/2(即扩大2倍)。因为节省了网络预测时的时间(每一层 *1/2 的操作),所以这个是最常用的。
Gradient Checking

Gradient Checking 看课程笔记,不讲
卷积神经网络
猫神经网络,诺贝尔奖两人发现层级结构,一层一层simple到complex cell,提出这种神经元假设模型。视野中相近的神经元在皮层里也是相邻的
第一个复制这个模型到计算机的是日本的Fukushima,做了层级结构(聚类方案)的Neurocognitron,那时候还没有反向传播(但是,反向传播虽然有点众妙之门但也不是皮层使用的正道,正道藏在赫布规则里--我说的。)
第二个是Lecun的LeNet,继承了网络模型,但是用了反向传播,效果不错,用来识别英文字母/数字
第三个是2012的AlexNet,原理大致没变,数据集和网络变大了,准确率超出了那一年其他算法一截。
卷积神经网络能干什么:
Classification 分类:youtube视频自动分类(根据视频里的图片是什么内容),(语音识别?),鲸鱼分类(百来个种类),
Retrieval 识图:百度识图,谷歌识图
Detection 目标探测:自动驾驶检测周围的东西,(估计躯干姿态?),探测癌症细胞,识别道路路标,(识别卫星图中的道路?)
Segmentation 语义分割: 分割不同神经组织细胞,
其他:玩电脑游戏,输入文本输出文本(语意,NLP,ChatGPT),图片描述,GAN 风格图像生成
卷积神经网络 vs. 猴子的大脑皮层

特征空间是某个深层的W,比如2个W就有一个平面向量,‘动物’向量和‘汽车’向量就会有一定距离,但是‘椅子’向量和‘椅子’向量距离就会很近。多个W就会有多维空间的向量,它们的2个多维向量(即“特征向量”)之间也有距离。
猴子的IT皮层(比较深的视觉皮层)用多个探针,也能模拟多个W的效果,比较两个不同类别之间(在特征空间内)的距离。
结果是:横轴数轴都是7种类别,然后卷积神经网络得到的“不同类别特征向量距离图”和猴子IT皮层的“不同类别特征向量距离图”非常相似。结论是,这可能意味着卷积网络在做和大脑类似的事情。
卷积神经网络(这种用反向传播的)具有了人脑的特征提取功能
但它训练时,pros能接近最正确答案(借助反向传播梯度下降算法的逆天巧妙自动拟合想要的人为规定的结果),cons抽象概念被手动限定在输出层(几种类别)的规模。
中间概念、逻辑关联和推理、更多认知规则的形成,未被构建。
激活学习,激活值越高,说明图片和数字值越符合。最终被激活的是谁?一个细胞?还是有10个数字,就有10个细胞?还是10个图,10个数字,100个细胞?
卷积神经网络是用这种监督训练,手动强迫学习固定特征。那无监督用的是什么?还未了解。需要去了解。cs231n里会提到?14课好像有提到。