andrewng-depp-learning课程笔记

2 minute read

Published:

andrewng-deep-learning课程笔记

AndrewNg-deep learning课程笔记

m:数据量大小
有m个数据集的时候并不需要用for 循环遍历所有训练集

有m 个训练样本, 


logistic regression

given x ,want
logistic :

want
Loss function :

not convex :有多个局部极值。难以优化

Cost Function :

logistic regression is a small new NN
gradient descent:

python技巧

尽量不要显示使用for循环
用向量化代替for
用np.dot能更好的实现并行

python brooadcasting :
(m,n) +(1,n)/(m,1)

用reshape保证矩阵的大小正确
matlab:bsxfun

消除bug的技巧

不使用(5,)形式的数组,
不用
a = numpy.random.randn(5)
结果为rank 1 array
可以使用reshpae转化

而使用:
a = numpy.random.randn(5,1)
assert(a.shape == (5,1))
多用reshpae

训练时,多个样本不用for循环,把训练样本向量化进行操作

激活函数:

非线性
tanh:

几乎总是比sigmaoid 好
中间值为0,所以有类似数据中心化的效果
几乎不使用sigmoid
{0,1}二分类使用sigmoid
z很大或很小时导数很小,速度会慢
–>>ReLU:

基本都使用relu,快很多
leakly relu:
一般比relu好,函数使用不多,
先在交叉验证集上跑,
为什么需要激活函数:
引入非线性 
输出y为实数,而不是0,1时,可能可以使用linear unit 不使用激活函数。(在最后一层)

np.sum(,axis=1,keepdims=True)
参数初始化:
如果把参数初始化为全部0,接下来每个节点都是一样的结果,权重无法更新。
所以用随机初始化,用小的值初始化
w = np.randim.randn((2,2))*0.01
初始化大的话,激活函数输入大,在sigmoid 或tanh中就会落入平缓部分,参数更新慢

deep nn技巧

debug:
写之前先在纸上仔细推导一次所有的过程的维数。

一般先从logistic 开始,然后慢慢从一层两层开始增加

梯度递减梯度爆炸

因为层数的增加,导致即使每一层的导数值不大,但是在多层的相乘后导致最后结果特别大或者趋于0

避免方法:

Xavier initialation
把权重矩阵W设置为均值为0,方差为1的向量,使得权重的值不会过大或者过小。
给出初始化权重矩阵的方差的默认值
Relu:

tanh:

或者:

也可以:

将lambda作为一个超参数进行调试

gradient check:

检查bp是否正确
用双边差分代替导数,检查梯度计算是否正确

Alt text

Alt text
问题:此处J指的是?cost function?
注意事项:

Alt text

mini-batch :

把一个大的训练集分为许多个小的训练集。
比如把一共有5000000个数据的训练集分为5000个。每个1000个数据的小训练集。

one epoch:所有的训练样本完成一次Forword运算以及一次BP运算
batch size:一次Forword运算以及BP运算中所需要的训练样本数目,其实深度学习每一次参数的更新所需要损失函数并不是由一个{data:label}获得的,而是由一组数据加权得到的,这一组数据的数量就是[batch size]。当然batch size 越大,所需的内存就越大,要量力而行
iterations(迭代):每一次迭代都是一次权重更新,每一次权重更新需要batch size个数据进行Forward运算得到损失函数,再BP算法更新参数。
最后可以得到一个公式 one epoch = numbers of iterations = N = 训练样本的数量/batch size

Alt text
if mini-batch size =1 => stochastic gradient descent
if min-batch size = m(训练集总数) => batch gradient descent
如何选择min-batch size :
如果训练集较小(<2000),使用batch
如果训练集较大,使用mini-batch,大小为64-512.使用2的幂次,代码运行速度更快
也可以把mini-batch size 当做一个超参数,试验几个不同的值,找到使cost funtion下降最快的mini batch size

滑动平均:

Alt text

Alt text
得到的结果:EMS是前天的指数平均
每天的权重是指数递减的
伪代码:
v=0
repeat:

只需要储存一个值,计算量是O(n)。省内存,省计算量
普通的平均法也可以用一行代码实现:

速度是一样的。使用滑动平均可能是因为其权重指数递减的设定有关。

bias correction :

b=0.98,
因为v=0,所以v1,v2等前几个值会很小,此时算出的结果误差很大,但是一段时间后结果会趋于正常。
tricks:
代替修正前期的误差,t增大后,->1。没有影响

momentum gredient

几乎总是比standart gredient descent 快

Alt text
在grdient descent 过程中,每次计算结果的梯度值变化太大,如果选取大的learning rate,可能结果无法收敛。所以只能使用小的learning rate。使用滑动平均值代替原本的梯度,每次的结果更平滑。不会出现剧烈波动,所以可以使用大的学习率,从而更快的收敛。
把梯度递减算法看成一个球从一个碗的边缘滚下去,算出的dW等可以算为其下滚的加速度,加入了momentum可以看做是为其加了一个摩擦力。

Alt text
或者:
通常把设为0.9
因为迭代次数很多,所有并不需要bias correction。

RMSprop(root mean square prop)

Alt text
加入是为了避免分母太小。

Adam:Adaptive Moment Estimation

Alt text
效果很好!
将RMSprop和momentum结合。
超参数选择:
:need to be tune.usually 0.9.usually 0.999.doesn’t matter but recommend

learning rate decay

用固定大小的learning rate 时,最终结果会因为mini-bath 中的噪音而导致不会收敛.所以用递减的learning rate,既可以在训练初期有较快的速度,到训练后期也不会扯到蛋(收敛到较好的结果)
1 epoch = 1 pass through data
decay的方法:

decay rate 成为了新的超参数



t is mini-batch number
离散:隔一段时间减半
或者手动设定
还是建议先设定一个较好的learning rate,然后在其基础上调整模型。之后再考虑learning rate decay

局部最优问题和鞍点

Alt text
如果遇到平缓的区域,此时导数接近于0。但是在其他维度的参数的影响下,会往其他方向下降,从而最终走出平缓区域。但是训练速度会减缓。所有需要使用Adam等方法

week 3

调试过程的技巧

learning rate 是调试中最重要的超参数
然后是momentum,hidden unit,mini-batch size
其他是layers,learning rate decay
不用调试Adam 中的参数
因为很难提前知道目前问题哪个超参数最重要。所以选取超参数时,尝试多个随机的超参数的值。而不是一定范围遍历选取超参数。(因为有很多超参数),
先在较大的范围随机选取一些超参数,得到相对好的结果后,在好的几组超参数附近使用较小的范围细致调整超参数(先用粗的再用细的)

在合适范围内选取超参数的值

Alt text

Alt text
射击到指数时,微小的改变可能会导致巨大的变动。所以要使用exp scale取样
如果计算资源充足时,可以设置多个不同超参数。观察结果。不足时就在一个超参数设定下每天根据表现手工调整学习率等

bath normalization

类似于在logistic 中对输入进行nomallization,(使均值为0,方差为1)
在deep nn 中的每一层的z[l]进行nolrmallize,(在激活函数前)。并通过转化使得每一层的输入都是想要的均值方差




因为最终需要得到的是W,所以不能对W进行normalize ,而是对z进行。
通常与min-batch 一起使用。

所以此时b失去作用,可以忽略掉。被取代

Alt text
可以使用Adam等算法更新。
batch-norm 的作用:
消除前面的层的参数变化对后面层的影响。有更好的迁移性
covariate shift:
已知真实映射:
g:x->y
是从同一个x中抽取出的训练数据,但是x1.x2不在同一个分布中。
根据一定分布的训练数据x1,现在已经通过学习得到了一个映射:
f:x1->y
当x的分布改变时,现在需要处理的数据是x2,可能需要重新学习一个f2。才能在新的分布下得到正确的结果
f2:x2->y
而实际上需要学习到的应该是f。
例子:在判断一张图片是否是猫的时候,如果先在一堆黑猫的数据中训练得到了判断其是不是黑猫的分类器f1,在接下来的任务中,需要判断包含各种颜色的猫的图片。此时之前的f1就不能用了。需要重新训练。而真正需要的分类器是判断一张图是不是猫的分类器。

Alt text
需要得到的是a[2]到y的训练。但是当输入x不同时,a[2]的值变化会很大。会出现covarient shift问题。所有需要normalize。使a[2]的值稳定在一定分布下。]所训练出的a[2]->y的参数对不同的输入都有更好的鲁棒性,从而达到加快训练速度的效果。
减弱前面层参数变化对后面层的影响。
使每层的训练更独立, 即是使每层训练出来的特征效果更好
因为每个mini-batch都有一些噪音,在减去均值时会将噪音引入,起到了轻微的正则化的效果,但是很小。所有可以与dropout一块使用。

batch norm at test time :
测试的时候,样本并不是按mini-batch 的形式,而是一个一个的,无法计算均值和方差。
用训练是每个batch的每一层,都会算一个,用指数滑动平均算出的滑动平均,用来测试过程中。

softmax

softmax可以看做是一个特殊的激活函数。其他的激活函数都是单个数字输入单个数字输出.softmax必须输入向量。起到将结果归一化的作用。用来实现多分类。

hard max :最大值为1,其他都为0

Alt text
其实就是最大似然估计的一种形式。
 

Alt text

结构化机器学习项目

week1:
判断系统的瓶颈在哪里,同时用一系列特殊的按钮调整
正交化:
因为在一个深度神经网络系统中,有多个参数需要调整。
针对不同的调参目的设置不同的”按钮“来调整。每个”按钮“的功能应该是正交的,不互相影响的。
比如:在训练集上cost function很差,于是可以用更深的网络,使用Adam等算法等策略,这些是第一个“按钮”
在dev set 上效果上,可以有增大训练集等方法,就是第二个“按钮”

Alt text

1.设置一个单实数评估指数用来判断模型好坏
2.一部分指标可以设置一个阈值,在阈值内比较指标的大小
3.dev set 和test set 应该来自于同一个分布 先在train set 训练,dev set上比较多个算法效果。最后在test set 评估
4.如果误差指标不满意,那就马上换掉
5.可以先设一个差不多的指标,然后开始跑,一段时间后发现效果不好,然后就马上换指标。但是不能等太长

Alt text

week2:
误差分析:

Alt text

Alt text

Alt text

Alt text

training dev set error

Alt text

Alt text

transfer learning :
先在大的数量级上预训练,然后把最后一个节点去掉,替换为新的节点或新的几层网络。在新的,比较小的训练集上进行训练。更新所有权重,(fine tuning)利用其他来源的数据的信息,迁移到需要的任务上。
问题:不更新前面层的参数,只添加新的几层,这样需要的数据会比较少,速度也快。

Alt text

Alt text

多任务学习:

Alt text

当对于同一个训练集,有多个任务要识别,比如在交通的照片中识别出是否有行人,红绿灯,交通标志等。
在最后一层,结果从0,1变为n维0,1的向量。
从语音数据中加入一个判断年龄的任务?

Alt text

迁移学习比多任务更常见

end-to-end deep learning