Deep Learning_deeplearning.ai(course1、2)简单总结
来源:互联网 发布:怎么在淘宝办理学生证 编辑:程序博客网 时间:2024/06/02 04:53
写在前面
首先,感恩朋友借我的付费账号。
这周二的时候终于把吴恩达老师的deepLearning.ai(https://www.deeplearning.ai/)上的前三课学完了,完成了前两课的quiz和编程练习,感觉收获许多,抱着好好整理一下的心态,一直想要写一篇小总结的,无奈拖延症发作,一直拖到了现在。
本文将简单总结一下deeplearning.ai前三课的内容,主要拎一下框架。
Course1. Neural Networks and Deep Learning
为了引出Neural Network,吴老师从Logistic Regression开始介绍。
Logistic Regression
解决二分类问题
输入x, 输出预测y_hat(0~1)
激活函数:sigmoid
y_hat=sigmoid(w.T * x + b)
Loss Function: L(y_hat, y) = -(y*log(y_hat) + (1-y)*log(1-y_hat))
Cost Function: J(w,b) = -(1/m)*sum(L(y_hat, y))
训练方法:Gradient Descent(Mine:Logistic Regression vs. 感知机?)
为了理解python中向量化计算的快速,吴老师介绍了python中numpy包,以及broadcasting in python。
- Broadcasting in python general principle
- Matrix(m,n) +-*/ (Vector(1,n)->Matrix(m,n))
- Matrix(m,n) +-*/ (Vector(m,1)->Matrix(m,n))
- Vector(m,1) +- (R->Vector(m,1))
有了前面的铺垫,我们可以开始正式学习Neural Network了。
我们可以把前面的Logistic Regression看成一个最简单的,没有隐藏层的Shallow Neural Network。
Activation Function
1.sigmoid(做二分类时,输出层可用,不然 never use it!)
2.tanh(相比于sigmoid,优点是均值≈0)
3.ReLU(常用:可以增加网络稀疏性;易于求导,提高BP时梯度下降的速度)
4.Leaky ReLUQ:为什么要用非线性的激活函数?
A:线性的激活函数满足叠加原理,增加再多的隐藏层,最后的输出都是输入x的线性组合,和直接使用线性模型没有什么两样,都无法解决非线性复杂问题。Random initialization
- 对于Logistic Regression, 直接将W和b初始为0,是可行的,因为进行梯度下降时,x(i)会对每个dw(i)=x(i)*dz起作用;
- 对于Neural Networks,直接将W和b初始为0,会导致“Symmetry breaking problem”,即使得隐藏层内的每个神经元都在进行完全相同的计算,设置再多的神经元都无济于事,故应该对W进行random initialization,b是常数无所谓为不为0。
BP & FP
隐藏层数量增多,神经网络层数增多时,就是我们常说的Deep Neural Network了。
(注:我们计算神经网络层数的时候,一般不计算输入层)
- Why Deep?
- 从简单到复杂:在CNN中,我们可以认为前面的网络层在学习一些简单的特征,例如边缘特征,越到后面的网络层可以认为进一步扩展到更大更复杂的区域;
- small but deep better than big but shallow!
course 1主要介绍了一些神经网络的基础知识。
Course2. Improving Deep Neural Networks: Hyperparameters tuning, Regularization and Optimization
拿到一个数据集应该怎么分?
以前数据量少,Train/Dev/Test(60/20/20)
现在数据量多,Train/Dev/Test(98/1/1)
无论如何,我们应该确保Dev和Test集的数据分布一致。(更麻烦的,在Course3中提到的:训练集和测试集不同分布的,我们应该分成Train/Train-dev/Dev/Test,其中,Train和Train-dev同分布,Dev和Test同分布。)
为什么要划分数据集,因为我们要判断“欠拟合“&”过拟合”
怎么处理High bias 和High variance?
- High bias:Bigger network;Train longer;NN architecture search
- High variance: More data; Regularization; NN architecture search
重点:处理过拟合
- Regularization:代价函数J加入正则项(L1?L2?)
- 为什么正则化可以解决过拟合呢?
- 1.加入正则项后,权重衰减(weight decay),我们把lambd设得足够大,可以认为经过权重衰减后的W,接近与0,那么网络结构就简化了。
- 2.另一种解释是,把lambd设得足够大后,W接近0,则Z也接近0,则整个激活函数接近线性,整个网络结构就接近线性网络,无法解决复杂问题。
- Dropout:随机失活
- 注1. 只在train时dropout,预测时不能dropout
- 注2. 反向随机失活(Inverted dropout)时,需要把a除以keep_prob,以保证a的期望值不变。
- Data Augmentation:数据增强,扩大数据集
- Early Stopping:不够正交化,会导致bias和variance同时变化,不推荐使用
- Regularization:代价函数J加入正则项(L1?L2?)
我们知道了怎么来训练一个网络,知道了当网络出问题的时候要怎么办,但是网络训练速度很慢,效果不好的时候应该怎么办呢?这就涉及到了优化的问题。
- 那么,怎么优化?
- Normalizing inputs:归一化,使得代价函数平面比较均匀,导致我们可以选择较大的学习率,不用怕在一个狭长的平面中,走一步就走出函数空间了,从而加速训练。
- Batch Normalizaiton:归一化中间值,可以加速training。
- Why does batch norm works?
- 作用同对输入归一化,可以提高学习率;
- 使得网络更加robust,增加了每层学习之间的独立性 ;
- 每次batch,都有不同的mean,variance,相当于增加了噪声,进行了正则化。
- 正确初始化W:除了前面所说的为了防止“Symmetry breaking problem”,不能把w初始化为0矩阵外;我们希望隐藏层unit数量越多,w越小,故,w需要乘上一个(1 / sqrt(n_(l-1)))系数,这样才能使得激活函数的值不会太大或太小,可以比较迅速地进行梯度下降修改w值。
- 梯度下降时的各种优化方法:mini-batch、SGD、Momentum、RMSprop、Adam………….
- Mini-batch:一次训练一个batch,减轻系统压力,加速训练;当训练集有很多冗余时,收敛速度更快;特别地,batch_size=1时,就是SGD,SGD算法不会收敛,只会在最小值附近波动。
- Momentum:batch方法更新权重时,仅依靠当前batch,不稳定;故引入梯度的指数加权平均值来代替单纯的梯度值,使得更新方向更稳定。
- RMSprop:与上面Momentum类似,用均方根来代替单纯的梯度值,使得更新方向更稳定。
- Adam:Momentum + RMSprop。
- Learning rate decay:随着时间推移,逐渐降低alpha。
- 逃离鞍点?:梯度下降的各种优化方法,都可以有效地逃离鞍点。具体效果见图
- Deep Learning_deeplearning.ai(course1、2)简单总结
- Deep Learning_deeplearning.ai(course3)简单总结
- course1.3
- TensorFlow5: 训练一个简单的游戏AI(Deep Q Network)
- TensorFlow练习5: 训练一个简单的游戏AI(Deep Q Network)
- TensorFlow练习5: 训练一个简单的游戏AI(Deep Q Network)
- 简单AI
- Coursera deeplearning.ai 深度学习习题2-1-Practical aspects of deep learning
- [AI,Deep Learning, Tensorflow] Anaconda 安装 librosa
- 深度学习(deep learning) AI圣经
- NPC简单AI处理
- NPC简单AI处理
- 简单Ai贪食蛇
- Unity简单AI编写
- unity3d简单的AI
- unity简单AI
- UE4简单AI
- Unity简单AI编写
- Git学习第二天
- 计算机体系结构
- PCL入门<一> 点云的数据结构
- 迭代器失效问题
- 一步步打造自己的通用上拉加载布局
- Deep Learning_deeplearning.ai(course1、2)简单总结
- 回朔算法
- 架构腐化之谜
- 数据结构(二)---基本的栈的操作
- 嵌入式系统导论
- Eclipse中集成Tomcat
- 数据排序及回到顶部
- hessian的简单使用
- Python序列遍历enumerate()的使用方法,同时返回索引和值,索引值从1开始输出