吴恩达深度学习

神经网络

浅层神经网络

activation function

sigmoid

σ(z)=11+ez\sigma(z) = \frac{1}{1 + e^{-z}}

tanh

在隐藏层使用,可以使样本均值为0

tanh(z)=ezezez+eztanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}

ReLU

rectify linear unit, 收敛更快 f(z)={0,if z<=0z,if z>0f(z) = \begin{cases} 0, & \text{if $z <= 0$} \\ z, & \text{if $z > 0$} \end{cases}

Leaky ReLU

解决负数导数为0的问题 f(z)={0.01z,if z<=0z,if z>0f(z) = \begin{cases} 0.01z, & \text{if $z <= 0$} \\ z, & \text{if $z > 0$} \end{cases}

随机初始化

He initialization

np.random.randn(shape)np.sqrt(2/num_units)np.random.randn(shape) * np.sqrt(2 / num\_units)

Xavier initialization

np.random.randn(shape)np.sqrt(1/num_units)np.random.randn(shape) * np.sqrt(1 / num\_units)

正则化

L2范数

损失函数后面加上L2范数

Dropout

Inverted Dropout

通过p概率将部分神经元置0后,还要将当前层的输出除以1-p,以保证损失函数与没有使用dropout基本一致

Data augmentation

flip, color distortion, gaussian noise

Early stopping

Early stopping便是一种提前结束训练的策略用来防止过拟合。 一般的做法是记录到目前为止最好的 validation accuracy,当连续10个Epoch没有达到最佳 accuracy时,则可以认为 accuracy不再提高了。

归一化

z=(xμ(x))σ(x)z = \frac{(x - \mu(x))}{\sigma(x)}

μ(x)=1minxi\mu(x) = \frac{1}{m}\sum_i^nx_i σ2(x)=1min(xiμ)2\sigma^2(x) = \frac{1}{m}\sum_i^n(x_i - \mu)^2 则, μ(z)=1minzi=1mσ(x)in(xiμ(x))=μ(x)σ(x)μ(x)σ(x)=0\mu(z) = \frac{1}{m}\sum_i^nz_i = \frac{1}{m\sigma(x)}\sum_i^n(x_i - \mu(x)) = \frac{\mu(x)}{\sigma(x)} - \frac{\mu(x)}{\sigma(x)} = 0 σ2(z)=1min(ziμ(z))2=1min(zi0)2=1min(xiμ(x)σ(x))2=σ(x)2σ(x)2=1\sigma^2(z) = \frac{1}{m}\sum_i^n(z_i - \mu(z))^2 = \frac{1}{m}\sum_i^n(z_i - 0)^2 = \frac{1}{m}\sum_i^n(\frac{x_i - \mu(x)}{\sigma(x)})^2 = \frac{\sigma(x)^2}{\sigma(x)^2} = 1

由于所有特征的均值为0,方差为1,所以空间上的点会呈一个超球体状分布的原点附近

优化算法

指数移动加权平均
Momentum

vdw=βvdw+(1β)dwv_{dw} = \beta v_{dw} + (1 - \beta)dw w=wαvdww = w - \alpha v_{dw} 每个epoch更新一次vdwv_{dw}, 第一个epoch,vdwv_{dw}为0 利用指数移动加权平均,让曲线更加平滑,从而加速收敛

RMSprop

Root mean sqrt prop sdw=βsdw+(1β)dw2s_{dw} = \beta s_{dw} + (1 - \beta)dw^2 w=wαsdww = w - \alpha \sqrt{s_{dw}}

Adam

Adative momentum estimation vdw=β1vdw+(1β1)dwv_{dw} = \beta1 v_{dw} + (1 - \beta1)dw sdw=β2sdw+(1β2)dw2s_{dw} = \beta2 s_{dw} + (1 - \beta2)dw^2 w=wαvdwsdww = w - \alpha \frac{v_{dw}}{\sqrt{s_{dw}}} 相当于学习率自适应。 当点在平坡时,梯度小,则下一轮走得快一点; 当点在斜坡时,梯度大,则下一轮走得慢一点;

AdaGrad

vdw=indw2v_{dw} = \sum_i^ndw^2 w=wαvdwww = w - \frac{\alpha}{\sqrt{v_{dw}}}w 学习率能自适应,慢慢趋于0

Nesterov

NAG, Nesterov Accelerated Gradient vdw=βvdw+(1β)dw(wαvdw)v_{dw} = \beta v_{dw} + (1 - \beta)dw(w - \alpha v_{dw}) w=wαvdww = w - \alpha v_{dw}

用未来的梯度方向

超参数调优

Batch Normalization

μ=1mimzi\mu = \frac{1}{m}\sum_i^mz_i σ2=1mim(ziμ)2\sigma^2 = \frac{1}{m}\sum_i^m(z_i - \mu)^2 znorm=zμσ2+ϵz_{norm} = \frac{z - \mu}{\sqrt{\sigma^2 + \epsilon}} z~=γznorm+β\tilde{z} = \gamma z_{norm} + \beta

γ\gammaβ\beta也要做为参数用于训练,在神经网络中加了BN层

如果γ\gamma等于方差, β\beta等于均值,则变换回了原来的zz. 加入最后一步,是为了还原原来的结构,因为γ\gammaβ\beta也变成了要训练的参数,理论上,如果准确率100%,则训练结果γ\gamma等于方差, β\beta等于均值。

测试集时,μ\muσ\sigma是通过指数移动平均方法将之前训练集保存下来的每个μ\muσ\sigma做一个估计,用于计算测试时的znormz_{norm}z~\tilde{z}

SoftMax

SoftMax(xj)=ejxineixSoftMax(x_j) = \frac{e^x_j}{\sum_i^n e^x_i}

ML工程化

CNN

边缘检测

用一个kernel或者叫filter去做卷积运算,比如: A=[101111101]A =\left[\begin{matrix} 1 & 0 & -1 \\ 1 & 1 & -1 \\ 1 & 0 & -1 \\ \end{matrix} \right] 是一个垂直边缘检测filter

Sober filter: A=[101212101]A =\left[\begin{matrix} 1 & 0 & -1 \\ 2 & 1 & -2 \\ 1 & 0 & -1 \\ \end{matrix} \right]

Scharr filter A=[30310110303]A =\left[\begin{matrix} 3 & 0 & -3 \\ 10 & 1 & -10 \\ 3 & 0 & -3 \\ \end{matrix} \right]

CNN卷积层其实就是让神经网络自己去学习filter,而不是人工指定。

Padding

Stride

卷积核移动的步长 公式变为: n+2pfs+1\frac{n + 2p - f}{s} + 1 s为步长

三维卷积

HxWxC的图片,卷积核为fxfxC, 结果为 H+2pfs+1\frac{H + 2p - f}{s} + 1, 假设H=WH = W

Pooling(下采样)

原理

反向传播

TODO

经典网络

LeNet-5
AlexNet
VGG-16
ResNet

g(z)=g(waz1+b+az1)g(z) = g(wa_{z-1} + b + a_{z-1}) 当出现梯度消失时,waz1+bwa_{z-1} + b为0,则g(z)=g(az1)g(z) = g(a_{z-1}), 由于g一般为relu,也即g(z)=az1g(z) = a_{z-1}

Inception

将大网络分成多个inception, 每个inception包含不同大小的卷积核,考虑更多全局信息。

目标检测

目标定位

label: (yc,bx,by,bh,bw,c1,c2,c3)(y_c, b_x, b_y, b_h, b_w, c1, c2, c3) 其中,ycy_c为1表示检测到物体,bx,by,bh,bwb_x, b_y, b_h, b_w分别为目标的坐标,高度和宽度。c1,c2,c3c1, c2, c3表示类别

卷积网络的滑动窗口实现

TODO

YOLO

You only look once

交并比IoU

Intersection over Union

将预测窗口与实际窗口的交集除以并集,大于0.5表示可以接受

Non-max suppression
Anchor Boxes

解决同一个窗口里面有多个目标的情况,将输出label翻n倍,n为目标个数

R-CNN

Region of CNN 去掉在没有目标的窗口上的无意义扫描. 通过图像分割思想,只检测有色块的区域。

Fast R-CNN

用卷积滑动窗口的实现加快了速度。

Faster R-CNN

用卷积神经网络来进行图像分割,以检测出来色块

人脸识别

Siamese network

孪生网络, 属于小样本学习的一种。训练一个卷积神经网络f, 将2个同类图片经过f, 得到特征向量x1, x2, 将|x1 - x2|作为输入经过一个MLP,以sigmoid输出,由于是同类图片,期望结果接近1,通过反向传播不断训练,直到f能达到同类图片结果接近1,不同类图片结果接近0为止。

Triplet

类似的还有Triplet损失,需要输入3张图片,一个anchor, 一个positive, 一个negative

d++α<=dd^{+} + \alpha <= d^{-}

d+d^+为anchor到positive的距离,dd^-为anchor到negative的距离。若α=0.2,d+=0.5\alpha = 0.2, d^+ = 0.5, 则要求 d>=0.7d^- >= 0.7

风格迁移

损失函数 原始图片C, 风格图片S, 生成的图片G J(G)=αJcontent(C,G)+βJstyle(S,G)J(G) = \alpha J_{content}(C, G) + \beta J_{style}(S, G) 表明,内容上要和原始图片尽可能一致,风格上要和风格图片尽可能一致

对于 Jcontent(C,G)J_{content}(C, G), 需要分析卷积网络隐藏层里面是哪一层控制内容,取这一层的输出,aca_caga_g分别为C和G的输出,则 Jcontent(C,G)=12(acag)2J_{content}(C, G) = \frac{1}{2}(a_c - a_g)^2

对于风格损失函数,输入图像的feature map为[ ch, h, w]。我们经过flatten(即是将h*w进行平铺成一维向量)和矩阵转置操作,可以变形为[ ch, h*w]和[ h*w, ch]的矩阵。再对两个作内积得到Gram Matrices。 (蓝色条表示每个通道flatten后特征点,最后得到 [ch * ch]的G矩阵)

目前是减少2个G矩阵的相似度,即使用2个矩阵对应元素的均方误差来表示。

1D和3D卷积

1D: 心电图 3D: CT影像,视频

RNN

RNN只考虑前面的序列对后面的序列有影响,并没有考虑反过来的。所以才出现了BiDirection RNN

LSTM

Long short term memory 解决梯度消失的问题

u: update gate f: forget gate o: output gate

f=sigmoid(Wf(xt,ht1))f = sigmoid(W_f * (x_t, h_{t-1}))

u=sigmoid(Wu(xt,ht1))u = sigmoid(W_u * (x_t, h_{t-1}))

o=sigmoid(Wo(xt,ht1))o = sigmoid(W_o * (x_t, h_{t-1})) z=tanh(W(xt,ht1))z = tanh(W * (x_t, h_{t-1})) ct=fct1+uzc_t = f * c_{t-1} + u * z ht=otanh(ct)h_t = o * tanh(c_t)

GRU

Gated Recurrent Unit(GRU) 解决梯度消失的问题

r: reset gate, u: update gate

r=sigmoid(Wr(xt,ht1))r = sigmoid(W_r * (x_t, h_{t-1}))

u=sigmoid(Wu(xt,ht1))u = sigmoid(W_u * (x_t, h_{t-1})) h~t1=ht1r\tilde{h}_{t-1} = h_{t-1} * r h~=tanh(W(xt,h~t1))\tilde{h} = tanh(W * (x_t, \tilde{h}_{t-1})) ht=(1u)ht1+uh~h_t = (1 - u) * h_{t-1} + u * \tilde{h}

最后的表达式也是使用了指数移动平均。

Word embedding

通过学习词语之间的相关性,在已经有label的样例中,可以更好的泛化那些未见过的序列,这是通过相关性来实现的。 Tom likes cat. 假设已经训练出来Tom是人名,当模型遇到Alex likes dog.时,由于 cat和dog很类似,所以可以预测出来Alex大概率是人名。

可以用于推导近义词,反义词。类比推理

训练方法是无监督训练,构建一个神经网络,对于相似的单词,可以得到相同的输出,则神经网络的隐藏层就包含了word embedding的信息,有部分单词的相关性,从而无需人工先验指定。

Word2Vec

用一个没有激活函数的神经网络来训练出来的参数,这些参数就是映射到低维空间的work embedding

如果是用一个词语作为输入,来预测它周围的上下文,那这个模型叫做『Skip-gram 模型』 而如果是拿一个词语的上下文作为输入,来预测这个词语本身,则是 『CBOW 模型』

Negative sampleing

使用一个正例,多个负例,直接用Logistic训练分类器

GloVe

Global vectors for word representation TODO

t-SNE

SNE(Stochastic Neighbor Embedding,随机近邻嵌入), 流形学习的一种

Seq2Seq

Encoder-Decoder network Encoder输入某种语言的句子,decoder输出另外一种语言

Beam search

通过设置beam search width, 让神经网络不仅仅看下一个单词与当前单词的关系,也看前几个单词的关系

CTC

The acoustic-to-word model