深度学习(吴恩达)知识总结

logistic回归

y ^ = σ ( w T x + b ) \hat{y}=\sigma(w^Tx+b) y^=σ(wTx+b),where σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+ez1
cost function: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) l o g y ^ ( i ) + ( 1 − y ( i ) ) l o g ( 1 − y ^ ( i ) ) ] J(w,b)=\frac{1}{m}\sum_{i=1}^{m}\mathscr{L}(\hat{y},y^{(i)})=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log\hat{y}^{(i)}+(1-y^{(i)})log(1-\hat{y}^{(i)})] J(w,b)=m1i=1mL(y^,y(i))=m1i=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]
w = w − α d J ( w , b ) d w w=w-\alpha\frac{dJ(w,b)}{dw} w=wαdwdJ(w,b)
b = b − α d J ( w , b ) d b b=b-\alpha\frac{dJ(w,b)}{db} b=bαdbdJ(w,b)\

Python中的技巧

a=np.random.randn(5,1) # a.shape=(5, 1) 5行1列的矩阵
a=a.reshape(5,1) # 将a转换成5行1列的矩阵

神经网络

在这里插入图片描述
单个训练样本计算

激活函数

Activation functionFormulaPicture
sigmoid a = 1 1 + e − z a=\frac{1}{1+e^{-z}} a=1+ez190
tanh a = e z − e − z e z + e − z a=\frac{e^z-e^{-z}}{e^z+e^{-z}} a=ez+ezezez100
ReLU a = m a x ( 0 , z ) a=max(0,z) a=max(0,z)90
Leaky ReLU a = m a x ( 0.01 z , z ) a=max(0.01z,z) a=max(0.01z,z)在这里插入图片描述

激活函数利弊:

Activation functionAdvantageDisadvantage
sigmoid1. Sigmoid 函数的输出范围是 0 到 1。由于输出值限定在 0 到1,因此它对每个神经元的输出进行了归一化;
2.用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适;
3. 梯度平滑,避免「跳跃」的输出值;
4. 函数是可微的。这意味着可以找到任意两个点的 sigmoid 曲线的斜率;
5. 明确的预测,即非常接近 1 或 0。
1. 梯度消失:注意:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
2. 不以零为中心:Sigmoid 输出不以零为中心的,,输出恒大于0,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。
3. 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂,计算机运行起来速度较慢。
Tanh1. 当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
2. 在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。
与sigmoid类似,Tanh 函数也会有梯度消失的问题,因此在饱和时(x很大或很小时)也会「杀死」梯度。
ReLU1. 当输入为正时,导数为1,一定程度上改善了梯度消失问题,加速梯度下降的收敛速度;
2. 计算速度快得多。ReLU 函数中只存在线性关系,因此它的计算速度比 sigmoid 和 tanh 更快。
3 .被认为具有生物学合理性(Biological Plausibility),比如单侧抑制、宽兴奋边界(即兴奋程度可以非常高)
1. Dead ReLU 问题。当输入为负时,ReLU 完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度将完全为零;
2.不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。
Leaky ReLU1. Leaky ReLU 通过把 x 的非常小的线性分量给予负输入(0.01x)来调整负值的零梯度(zero gradients)问题,当 x < 0 时,它得到 0.1 的正梯度。该函数一定程度上缓解了 dead ReLU 问题。
2.Leak 有助于扩大 ReLU 函数的范围,通常 a 的值为 0.01 左右;
3. Leaky ReLU 的函数范围是(负无穷到正无穷)
为什么要使用非线性激活函数?
计算量更少,只有一个地方需要使用线性激活函数:就是如果机器学习的是回归问题,可以在输出层使用线性激活函数。

权重初始化:
w [ 1 ] = n p . r a n d o m . r a n d n ( ( 2 , 2 ) ) ∗ 0.01 w^{[1]}=np.random.randn((2,2))*0.01 w[1]=np.random.randn((2,2))0.01 #如果不是0.01而是100的话,容易在一开始z就很大,在两端平缓区域,导致tanh或sigmoid激活函数接近饱和,从而减慢学习速度。
b [ 1 ] = n p . z e r o ( ( 2 , 1 ) ) b^{[1]}=np.zero((2,1)) b[1]=np.zero((2,1)) #2表示有两个特征,1表示有一个隐藏神经元(一组数据)
w [ 2 ] = n p . r a n d o m . r a n d n ( ( 1 , 2 ) ) ∗ 0.01 w^{[2]}=np.random.randn((1,2))*0.01 w[2]=np.random.randn((1,2))0.01
b [ 2 ] = 0 b^{[2]}=0 b[2]=0
在这里插入图片描述

深层神经网络

前向传播:
输入: a [ l − 1 ] a^{[l-1]} a[l1]
输出: a [ l ] a^{[l]} a[l],cache( z [ l ] z^{[l]} z[l])
z [ l ] = w [ l ] ∗ a [ l − 1 ] + b [ l ] z^{[l]}=w^{[l]}*a^{[l-1]}+b^{[l]} z[l]=w[l]a[l1]+b[l]
a [ l ] = g [ l ] ( z [ l ] ) a^{[l]}=g^{[l]}(z^{[l]}) a[l]=g[l](z[l])
反向传播:
输入: d a [ l ] da^{[l]} da[l]
输出: d a [ l − 1 ] , d W [ l ] , d b [ l ] da^{[l-1]},dW^{[l]},db^{[l]} da[l1]dW[l]db[l]
d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]}=da^{[l]}*g^{[l]^{'}}(z^{[l]}) dz[l]=da[l]g[l](z[l])
d w [ l ] = d z [ l ] ∗ a [ l − 1 ] dw^{[l]}=dz^{[l]}*a^{[l-1]} dw[l]=dz[l]a[l1]
d b [ l ] = d z [ l ] db^{[l]}=dz^{[l]} db[l]=dz[l]
d a [ l − 1 ] = w [ l ] T ∗ d z [ l ] da^{[l-1]}=w^{[l]^T}*dz^{[l]} da[l1]=w[l]Tdz[l]
d z [ l ] = w [ l + 1 ] T ∗ d z [ l + 1 ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]}=w^{[l+1]^T}*dz^{[l+1]}*g^{[l]^{'}}(z^{[l]}) dz[l]=w[l+1]Tdz[l+1]g[l](z[l])

w维数:(当前层神经元个数,上一层神经元个数)=( n [ l ] , n [ l − 1 ] n^{[l]},n^{[l-1]} n[l],n[l1])
b维数:(当前层神经元个数,1)=( n [ l ] , 1 n^{[l]},1 n[l],1)
dw维数:(当前层神经元个数,上一层神经元个数)=( n [ l ] , n [ l − 1 ] n^{[l]},n^{[l-1]} n[l],n[l1])
db维数:(当前层神经元个数,1)=( n [ l ] , 1 n^{[l]},1 n[l],1)
z维数:(当前层神经元个数,1)=( n [ l ] , 1 n^{[l]},1 n[l],1)
Z维数:(当前层神经元个数,m)=( n [ l ] , m n^{[l]},m n[l],m) m为训练样本个数

Dropout正则化:随机丢失部分神经元数据
神经网络权重的初始化:将 V a r ( w i ) = 1 n Var(w_i)=\frac{1}{n} Var(wi)=n1

梯度的数值逼近

f ( θ ) = θ 3 , θ = 1 f(\theta)=\theta^3,\theta=1 f(θ)=θ3θ=1
单边误差: g ( θ ) = f ( θ + ε ) − f ( θ ) ε = 3.0301 g(\theta)=\frac{f(\theta+\varepsilon)-f(\theta)}{\varepsilon}=3.0301 g(θ)=εf(θ+ε)f(θ)=3.0301 e r r o r = 0.0301 error=0.0301 error=0.0301
双边误差: g ( θ ) ≈ f ( θ + ε ) − f ( θ − ε ) 2 ε = 3.0001 g(\theta)\approx\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2\varepsilon}=3.0001 g(θ)2εf(θ+ε)f(θε)=3.0001 e r r o r = 0.0001 error=0.0001 error=0.0001
g ( θ ) = 3 θ 2 = 3 g(\theta)=3\theta^2=3 g(θ)=3θ2=3

Mini-batch 梯度下降

梯度:梯度是代价函数对每个参数的偏导数。
不全部取所有的样本,只取一部分,分别计算拟合函数值,再计算代价函数,然后反向传播计算梯度,更新权重w。若有5万个样本,每次梯度下降的样本数量是100个,则要进行500次梯度下降。

动量梯度下降

指数加权平均

v t = β v t − 1 + ( 1 − β ) θ t v_t=\beta v_{t-1}+(1-\beta)\theta _t vt=βvt1+(1β)θt # 与前面的时刻有关,且时间离的越远,影响越小

动量梯度下降公式

引入动量 v d w = β v d w + ( 1 − β ) d w v_{dw}=\beta v_{dw}+(1-\beta)dw vdw=βvdw+(1β)dw v d b = β v d b + ( 1 − β ) d b v_{db}=\beta v_{db}+(1-\beta)db vdb=βvdb+(1β)db,dw是横轴梯度,db是纵轴梯度, β \beta β通常取0.9。
w = w − α v d w w=w-\alpha v_{dw} w=wαvdw b = b − α v d b b=b-\alpha v_{db} b=bαvdb,w为横轴方向,b为纵轴方向,目的是要减缓纵轴的震荡,加快横轴的收敛速度。
作用:使得梯度下降的方向由梯度方向和动量方向共同决定,减小梯度下降过程中的震荡。
在这里插入图片描述

RMSprop

s d w = β s d w + ( 1 − β ) d w 2 s_{dw}=\beta s_{dw}+(1-\beta)dw^2 sdw=βsdw+(1β)dw2
s d b = β s d b + ( 1 − β ) d b 2 s_{db}=\beta s_{db}+(1-\beta)db^2 sdb=βsdb+(1β)db2
w = w − α d w s d w w=w-\alpha \frac{dw}{\sqrt{s_{dw}}} w=wαsdw dw
b = b − α d b s d b b=b-\alpha \frac{db}{\sqrt{s_{db}}} b=bαsdb db

Adam优化算法

v d w = β 1 v d w + ( 1 − β 1 ) d w v_{dw}=\beta _1 v_{dw}+(1-\beta _1)dw vdw=β1vdw+(1β1)dw
v d b = β 1 v d b + ( 1 − β 1 ) d b v_{db}=\beta _1v_{db}+(1-\beta _1)db vdb=β1vdb+(1β1)db
s d w = β 2 s d w + ( 1 − β 2 ) d w 2 s_{dw}=\beta _2 s_{dw}+(1-\beta _2)dw^2 sdw=β2sdw+(1β2)dw2
s d b = β 2 s d b + ( 1 − β 2 ) d b 2 s_{db}=\beta _2s_{db}+(1-\beta _2)db^2 sdb=β2sdb+(1β2)db2
v d w c o r r e c t e d = v d w 1 − β 1 t v_{dw}^{corrected}=\frac{v_{dw}}{1-\beta _1^t} vdwcorrected=1β1tvdw,t为迭代次数
v d b c o r r e c t e d = v d b 1 − β 1 t v_{db}^{corrected}=\frac{v_{db}}{1-\beta _1^t} vdbcorrected=1β1tvdb
s d w c o r r e c t e d = s d w 1 − β 2 t s_{dw}^{corrected}=\frac{s_{dw}}{1-\beta _2^t} sdwcorrected=1β2tsdw
s d b c o r r e c t e d = s d b 1 − β 2 t s_{db}^{corrected}=\frac{s_{db}}{1-\beta _2^t} sdbcorrected=1β2tsdb
w = w − α v d w c o r r e c t e d s d w + ε w=w-\alpha \frac{v_{dw}^{corrected}}{\sqrt{s_{dw}}+\varepsilon} w=wαsdw +εvdwcorrected
b = b − α v d b c o r r e c t e d s d b + ε b=b-\alpha \frac{v_{db}^{corrected}}{\sqrt{s_{db}}+\varepsilon} b=bαsdb +εvdbcorrected

学习率衰减

1 epoch=1 pass through data
在这里插入图片描述
公式一:
α = 1 1 + d e c a y r a t e ∗ e p o c h n u m ∗ α 0 \alpha=\frac{1}{1+decayrate*epochnum}*\alpha_0 α=1+decayrateepochnum1α0 α 0 \alpha_0 α0为初始学习率。
公式二:
α = 0.9 5 e p o c h n u m ∗ α 0 \alpha=0.95^{epochnum}*\alpha_0 α=0.95epochnumα0
公式三:
α = k e p o c h n u m ∗ α 0 \alpha=\frac{k}{\sqrt {epochnum}}*\alpha_0 α=epochnum kα0,k为常数
公式四:
α = k t ∗ α 0 \alpha=\frac{k}{\sqrt {t}}*\alpha_0 α=t kα0,t为mini-batch的样本数

调试处理

α \alpha α:学习率
β \beta β:momentum参数,一般为0.9
mini-batch:样本数
hidden inits:隐藏层单元
layers:层数
learning rate decay:学习率衰减
Adam算法 β 1 、 β 2 、 ε \beta _1、\beta _2、\varepsilon β1β2ε:一般设 0.9 、 0.999 、 1 0 − 8 0.9、0.999、10^{-8} 0.90.999108
选取调试值方法:网格法、数标尺。
在这里插入图片描述在这里插入图片描述

batch归一化

归一化:使数据的均值为0,方差为1,符合正态分布,通常在激活之前进行batch-normal。以下公式中,m为mini-batch的样本数。
作用:减少前层参数对后层的影响,加速整个网络的学习;有正则化的效果,给隐藏层添加了噪音。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Softmax激活函数分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tensorflow

函数训练
w=tf.Variable(0,dtype=tf.float32) #初始化参数
cost=tf.add(tf.add(w**2,tf.multiply(-10.,w)),25)
train=tf.train.GradientDescentOptimizer(0.01).minimize(cost) #学习率0.01,目标是最小化损失
init=tf.global_variables_initializer()
session=tf.Session()
session.run(init) #初始化全局变量
session.run(train) #运行一步梯度下降法
for i in range(1000): #运行下降1000次迭代
session.run(train)

训练集训练
import numpy as np
import tensorflow as tf
coefficients=np.array([[1.],[-20.],[25.]])
x=tf.placeholder(tf.float32,[3,1]) #x为3行一列的训练数据
cost=tf.add(tf.add(w2,tf.multiply(-10.,w)),25)
cost=x[0][0]*w
2+x[1][0]*w+x[2][0]
train=tf.train.GradientDescentOptimizer(0.01).minimize(cost) #学习率0.01,目标是最小化损失
init=tf.global_variables_initializer()
session=tf.Session()
session.run(train,feed+dict={x:coefficients}) #运行一步梯度下降法

卷积神经网络

padding

图像大小:n×n,滤波核大小f×f,则输出维度是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)×(n-f+1) (nf+1)×(nf+1)
填充的目的:充分利用边缘特征值,发挥角落或图像边缘的信息作用。输出变成 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)×(n+2p-f+1) (n+2pf+1)×(n+2pf+1),p=padding=1,p表示添加了几圈。
Valid卷积——没有padding
Same卷积——填充后,输入和输出的尺寸没有变,即n+2p-f+1=n, p = f − 1 2 p=\frac{f-1}{2} p=2f1,当卷积核边长是奇数时,输入和输出尺寸一样大,因此一般采用的卷积核长度为奇数。

卷积步长

图像大小:n×n,滤波核大小f×f,padding:p,stride=s,则输出尺寸为: i n t ( n + 2 p − f s + 1 ) × i n t ( n + 2 p − f s + 1 ) int(\frac{n+2p-f}{s}+1)×int(\frac{n+2p-f}{s}+1) int(sn+2pf+1)×int(sn+2pf+1),int表示向下取整

三维卷积(可用于RGB图像)

在这里插入图片描述

多核卷积(垂直、水平)

图像: n × n × n c n×n×n_c n×n×nc,卷积核 f × f × n c f×f×n_c f×f×nc n c n_c nc为通道数,则输出图像尺寸为: ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1)×(n-f+1)×n_c^{'} (nf+1)×(nf+1)×nc n c ′ n_c^{'} nc为使用的滤波器的个数
在这里插入图片描述

单层卷积神经网络

在这里插入图片描述
在这里插入图片描述
参数的个数与滤波器的个数和大小有关,与图像的尺寸无关。
在这里插入图片描述

池化层

Max-pooling(常用):选取区域内的最大值。
最大池化输出大小: i n t ( n + 2 p − f s + 1 ) × i n t ( n + 2 p − f s + 1 ) int(\frac{n+2p-f}{s}+1)×int(\frac{n+2p-f}{s}+1) int(sn+2pf+1)×int(sn+2pf+1),常用值: f = 2 , s t r i d e = 2 , p = 0 f=2,stride=2,p=0 f=2,stride=2,p=0,相互于高度和宽度减半。
平均池化:选取区域内的平均值。
注意!池化层没有要学习的参数。

图像增强

  1. 垂直镜像对称
  2. 色彩转换

非极大值抑制

1.丢弃概率小于或等于预定阈值(例如0.5)的所有方框;
2.对于剩余的边界框:选择具有最高概率的边界框并将其作为输出预测;
3.计算相关联的边界框的IoU值(交并比),舍去IoU大于阈值的边界框;
4.重复步骤2,直到所有边界框都被视为输出预测或被舍弃;

Yolo算法步骤

1.输入一个图像,先将其分成n×n的网格。
2.对每个网格应用CNN模型进行图像分类和定位处理,获得预测对象的边界框及其对应的类概率。
3.非极大值抑制得到最终目标结果。