【深度学习】积累与发现

神经网络基础

优化方法

深度学习基础(三)——优化算法

梯度方向是增长最快,负梯度是下降最快

优化算法

动量法:其实就是用的梯度的滑动平均值,从而保证梯度的平滑,文中的例子我觉得不太好。简单说就是如果只考虑当前梯度,那如果梯度在某个方向来回震荡,一会儿正1000,一会儿-1000,那就非常难以拟合下去,动量法就可以保证用的梯度尽量和之前的梯度方向相同
Adagrad:计算一个累计项,就是各个梯度方向的平方的和,然后用这个平方和做分母,平方和太大的方向,进行下一步的梯度步幅稍微小一点,平方和一直太小的方向,下一步的步幅稍微大点
RMSprop:把平方和换成了梯度平方的滑动平均值,就是把和换成了平均值
Adadelta:把手动输入的学习率自动运算
Adam:之前乘的都是直接是梯度,现在不了,乘梯度的滑动平均值,其余RMSPROP一样

深度学习 - 常用优化算法

什么是指数加权平均、偏差修正?
理解滑动平均(exponential moving average)

消除不稳定的随机因素,并且用不着存全部的平均值,对全体平均值的一个近似,那么为啥bachnorm用滑动平均,weight就没用滑动平均呢,我想应该是因为weight在梯度下降的时候有学习率来保障,本来学习率就不大,而且现在学习率都在下降,weight下降得本身并不快,本来最终已经到极值点了,一旦用了滑动平均,有可能反过来导致最终的模型欠拟合。

小白都能看懂的softmax详解
前馈神经网络与反向传播算法(推导过程)

⊙ \odot 指的应该是两个形状相同的向量,把位置相同的项进行乘积

A Step by Step Backpropagation Example
详解机器学习中的梯度消失、爆炸原因及其解决方法

tanh的导数取值范围更广

【深度学习】深入理解Batch Normalization批标准化
Batch Normalization原理与实战 - 天雨粟的文章 - 知乎

主要作用是稳定训练过程(克服covariate shift)以及加速训练(拉回非激活区)
对于过拟合的解释:不同batch的分布不同,模型要去拟合各个batch,这个模型就会很复杂,因为它在尝试拟合每个batch,导致过拟合
bn也相当于一种data augmentation,同样的数据在不同batch中会被变化成不同的值。

BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结

BN在对每个样本的相同维度进行归一化,LN是对单个样本(输入)进行归一化;举例来讲,以图片为例,BN是对一个batch里的所有样本的C里的所有值求均值方差,然后作用于C;LN是对一张图片里的CHW求均值,然后作用于CHW
在RNN里,同一批batch的序列长度不一致,这个就没法bn

在AlexNet中LRN 局部响应归一化的理解
深度学习的局部响应归一化LRN(Local Response Normalization)理解

由公式可以看出,如果某个点的值很大,那么其周围通道的值就会变小

为什么不对偏置做正则化

其实不对= =偏置也能正则化,tf里有实现的,只不过习惯来讲不对bias正则化

损失函数

机器学习中的基本问题——log损失与交叉熵的等价性
深度学习系列之Focal Loss个人总结

实际是在让每个样本的损失是动态的,假设 y ′ y' y是正样本的概率,根据式子 − ( 1 − y ′ ) r l o g y ′ -(1-y')^rlog y' (1y)rlogy可知,一个 y ′ y' y很大的样本贡献的损失很小,也就是说已经能够被很好的分类的样本贡献的损失小,反过来就是,不容易被判别的样本贡献的损失大;对于负样本同样道理

理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

因为神经网络在多分类问题中,类标号使用的是类似于独热编码,比如某个样本是第二类,那他的期望输出就是 ( 0 , 1 , 0 , . . . , 0 ) (0,1,0,...,0) (0,1,0,...,0),所以交叉熵可以写成 L = − ∑ k t k ⋅ l n P ( y = k ) L = -\sum_k t_k \cdot lnP(y=k) L=ktklnP(y=k)
总体损失用求和值还是均值呢?我认为应该用均值,并且多数情况下也是这样的,举例来讲,对 y 1 = x 2 y_1=x^2 y1=x2 y 2 = 3 x 2 y_2=3x^2 y2=3x2做梯度下降,当 x = 1 x=1 x=1,学习率为1的时候,那么对于 y 1 y_1 y1来讲,其下一个x值就是-1,而对于 y 2 y_2 y2来讲,其下一个x值就是-5,那么 y 2 y_2 y2永远也下降不下来,而对损失求和就类似于 y 2 y_2 y2,会导致损失函数有很多谷。
设损失函数为 l o s s ( y , y ^ ) loss(y,\hat{y}) loss(y,y^),假设当前batch下的样本数量为m,特征维度为n,要更新的某个参数为 w k ∈ θ , θ ∈ R l w_k \in \theta,\theta \in R^l wkθ,θRl,那么新的参数应该为
w k : = w k − η ( 1 m ∑ i = 1 m ∂ l o s s ( y i , y ^ i ) ∂ y ^ i ∂ y ^ i ∂ w k + 2 λ w k ) w_k:=w_k-\eta (\frac{1}{m} \sum_{i=1}^{m} \frac{\partial loss(y_i,\hat{y}_i)}{\partial \hat{y}_i} \frac{\partial \hat{y}_i}{\partial w_k}+2\lambda w_k) wk:=wkη(m1i=1my^iloss(yi,y^i)wky^i+2λwk)

可以先求出 ∂ l o s s ( Y , Y ^ ) ∂ Y ^ \frac{\partial loss(Y,\hat{Y})}{\partial \hat{Y}} Y^loss(Y,Y^)这个 m m m维列向量,向量中的第 i i i个元素就是 ∂ l o s s ( y i , y ^ i ) ∂ y ^ i \frac{\partial loss(y_i,\hat{y}_i)}{\partial \hat{y}_i} y^iloss(yi,y^i)
然后再求出 ∂ Y ^ ∂ θ \frac{\partial \hat{Y}}{\partial \theta} θY^这个 m ∗ l m*l ml的Jacobian矩阵,其中第 i i i k k k列的元素为 ∂ y i ∂ w k \frac{\partial y_i}{\partial w_k} wkyi
于是更新权重的时候,可以利用广播性质将 ∂ l o s s ( Y , Y ^ ) ∂ Y ^ ∗ ∂ Y ^ ∂ θ \frac{\partial loss(Y,\hat{Y})}{\partial \hat{Y}} * \frac{\partial \hat{Y}}{\partial \theta} Y^loss(Y,Y^)θY^,即按列相乘,计算出来一个 m ∗ l m*l ml的矩阵,其中第 i i i k k k列的元素就是 ∂ l o s s ( y i , y ^ i ) ∂ y ^ i ∂ y ^ i ∂ w k \frac{\partial loss(y_i,\hat{y}_i)}{\partial \hat{y}_i} \frac{\partial \hat{y}_i}{\partial w_k} y^iloss(yi,y^i)wky^i
再对每一列求平均,就得到了参数的梯度向量

激活神经元

常用的激活函数对比
Deep learning:四十五(maxout简单理解)
激活函数(ReLU, Swish, Maxout)

不想解释了,文章写得挺明白的了,maxout的当前层的参数变成了三维的,可以看做原本的一个神经元,又拆成了一个小的前馈神经网络层,不过文中定义W的方式有点别扭
另外tanh相对于sigmoid的优点2,这块需要回想一下BP算法,在BP算法里,反向传播的时候用到了下一层神经元的输出,而sigmoid的输出恒正,tanh的输出有正负,可取的值范围变大了,因此梯度的范围也变大了,从而加速梯度下降的速度

卷积神经网络CNN

深度学习简介(一)——卷积神经网络
卷积神经网络(CNN)反向传播算法

z L z^L zL是第 L L L层的输入, a L a^L aL是第 L L L层的输出

cnn 系列文章三 ----strides,padding详解,基于andrew ng的DeepLearning
CNN初探

CNN就是卷积->池化->…->结果,然后把结果展开成1维度,这堆东西就是这个图片的特征了,然后后面再接一个DNN,就能用来分类了

极简解释inception V1 V2 V3 V4
Feature Extractor[Inception v4]
卷积神经网络的网络结构——Inception V4
为什么resnet效果好
为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题。

正向来看,可以把更多信息传递到后面去,另外加深至少不会变差,无非就是学恒等映射呗;反向来看,可以让梯度传递回去

【AI-1000问】为什么现在大家喜欢用3*3小卷积?

RCNN

一文读懂Faster RCNN
Faster RCNN 学习笔记
一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

循环神经网络RNN

循环神经网络(RNN)模型与前向反向传播算法

δ ( t ) = ∂ L ∂ o ( t ) ∂ o ( t ) ∂ h ( t ) + ∂ L ∂ h ( t + 1 ) ∂ h ( t + 1 ) ∂ h ( t ) \delta^{(t)} =\frac{\partial L}{\partial o^{(t)}} \frac{\partial o^{(t)}}{\partial h^{(t)}} + \frac{\partial L}{\partial h^{(t+1)}}\frac{\partial h^{(t+1)}}{\partial h^{(t)}} δ(t)=o(t)Lh(t)o(t)+h(t+1)Lh(t)h(t+1)
因为 L L L可以看做 L ( o 1 , . . . , o τ ) L(o^1,...,o^\tau) L(o1,...,oτ),其中和 h t h^t ht相关的项只有 o t , o t + 1 o^t,o^{t+1} ot,ot+1,这是因为 o t o^t ot h t h^t ht的函数, o t + 1 o^{t+1} ot+1 h t + 1 h^{t+1} ht+1的函数, h t + 1 h^{t+1} ht+1 h t h^t ht的函数。
因此 L L L h t h^t ht求导可以看做 ∂ L ∂ h t = ∂ L ∂ o t ∂ o t ∂ h t + ∂ L ∂ o t + 1 ∂ o t + 1 ∂ h t + 1 ∂ h t + 1 ∂ h t = ∂ L ∂ o t ∂ o t ∂ h t + ∂ L ∂ o h + 1 ∂ h t + 1 ∂ h t \frac{\partial L}{\partial h^t}=\frac{\partial L}{\partial o^t}\frac{\partial o^t}{\partial h^t}+\frac{\partial L}{\partial o^{t+1}} \frac{\partial o^{t+1}}{\partial h^{t+1}} \frac{\partial h^{t+1}}{\partial h^t}=\frac{\partial L}{\partial o^t}\frac{\partial o^t}{\partial h^t}+\frac{\partial L}{\partial o^{h+1}}\frac{\partial h^{t+1}}{\partial h^t} htL=otLhtot+ot+1Lht+1ot+1htht+1=otLhtot+oh+1Lhtht+1

RNN梯度消失和爆炸的原因
【神经网络】循环神经网络(RNN)的长期依赖问题

图里那三个公式b和O是分开的
长期依赖: ∂ L ∂ W x \frac{\partial L}{\partial W_x} WxL的式子里,需要对全部 S S S进行求导,就是导数依赖于全部的输入,并且稍远一点输入,提供的梯度非常小,导致RNN只和最近的输入有关了,这就违背了RNN的初衷。
LSTM加了遗忘门,如果某个门导致了之前的输入被遗忘,那么对于某个位置求梯度,这个梯度就不会传很远,解决了长期依赖。

LSTM模型与前向反向传播算法

⊙ \odot 乘积就是对应项相乘,并且 x ( t ) , i ( t ) , a ( t ) , o ( t ) , f ( t ) , C ( t ) x^{(t)},i^{(t)},a^{(t)},o^{(t)}, f^{(t)},C^{(t)} x(t),i(t),a(t),o(t),f(t),C(t)都是向量,并且除了 x ( t ) x^{(t)} x(t)是m维的,其余的都是n维的
像RNN一样,直接把上一时刻的输出作为隐状态,但在LSTM的模型里,除了作为输出的隐含状态,又有一个细胞状态
我觉得LSTM可以这样理解:首先LSTM里有三个输入,数据输入 x x x,上一时刻输出 h t − 1 h_{t-1} ht1,以及细胞状态 C t − 1 C_{t-1} Ct1。那么首先是遗忘门,读取 x x x h t − 1 h_{t-1} ht1来计算出一个0到1的值 f t f_t ft,用这个值乘以 C t − 1 C_{t-1} Ct1,这一步的意义就好比说根据当前的输入以及上一时刻的输出(或者说隐含状态),此时细胞状态中的百分之多少的信息是对输出有帮助的,如果说 f t f_t ft是0.3,就意味着,为了得到输出,我需要从细胞状态中提取30%的信息;然后输入门就是根据 x x x h t − 1 h_{t-1} ht1来计算出了一个值叫做 i ⊙ a i \odot a ia,这个东西代表了,神经元此时 x x x h t − 1 h_{t-1} ht1之中蕴含了那些信息,那么在状态更新的时候,就用此时的信息加上从上一个细胞状态中提取的有效信息,得到的就是此时的细胞状态了。输出们,根据 x x x h t − 1 h_{t-1} ht1和此时细胞的状态,获得输出值。

Keras关于LSTM的units参数,还是不理解?

每一个小黄框都可以看做一个单层的前馈神经网络,并且每个小黄框里都有n个神经元,因此输出为n维,这个n就是num_hidden,举例来讲,按照刘建平的blog中的符号定义,遗忘门的输出为 f ( t ) = σ ( W f h ( t − 1 ) + U f x ( t ) + b f ) f^{(t)} = \sigma(W_fh^{(t-1)} + U_fx^{(t)} + b_f) f(t)=σ(Wfh(t1)+Ufx(t)+bf),那么可以看做一个输入为n+m维,m为输入的维度,输出为n维(即拥有n个神经元)的单层神经网络 f ( t ) = σ ( [ W f , U f ] T [ h ( t − 1 ) , x ( t ) ] + b f ) f^{(t)} = \sigma([W_f,U_f]^T[h^{(t-1)} , x^{(t)}] + b_f) f(t)=σ([Wf,Uf]T[h(t1),x(t)]+bf),那么这个n就是num_hidden

【深度学习】积累与发现_第1张图片
【深度学习】RNN的梯度消失/爆炸与正交初始化
深度学习之GRU网络

GRU是把细胞状态又去除了,用了新的连接方法,留了一个更新门和重置门,更新门的作用,根据上一时刻隐状态和当前输入来决定当前时刻的暂时的隐含状态,重置门的作用有两个根据上一时刻隐状态和当前输入,一方面来决定需要用多少当前时刻的暂时的隐含状态,另一方面决定需要多少上一时刻的隐含状态
这样记吧,用 x , h t − 1 x,h_{t-1} x,ht1计算出了两个值 h ′ , h ′ ′ h',h'' h,h,他们都是从sigmoid出来的,只是参数不同,其中 h ′ h' h x x x结合获得结合隐状态之前的输出, h ′ ′ h'' h用来更新隐含状态 h t − 1 h_{t-1} ht1以及输出。最后把更新后的输出和隐含状态求和就可以了

peephole connection

就是把在过各种门的时候,把细胞状态也算上

一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

Attention

从Encoder-Decoder(Seq2Seq)理解Attention的本质

attention score的下标有点问题。意会就行

自然语言处理中的Attention机制总结

首先要根据 s j , h i s_j,h_i sj,hi来计算第 i i i个输入的编码的attention score: α i , j \alpha_{i,j} αi,j,然后对全部输入的编码进行加权求和

细讲 | Attention Is All You Need
self-attention与attention简要梳理

Q ∈ R n ∗ d k , K ∈ R m ∗ d k , V ∈ R m ∗ d v Q \in \mathbb{R}^{n*d_k}, K \in \mathbb{R}^{m*d_k}, V \in \mathbb{R}^{m*d_v} QRndk,KRmdk,VRmdv
其中n是输入的样本数目,比如说一句话的单词个数, d k d_k dk是每个单词的嵌入向量维度, Q K T QK^T QKT中的第一行,就是一行attention score,第一行第一个值对应的就是V中第一行这个embedding vector

AutoEncoder

深度学习教程之Autoencoder
栈式自编码算法

层数越深的隐层输出代表着越高级的特征

为什么稀疏自编码器很少见到多层的? - 科言君的回答 - 知乎
几种Autoencoder的深入理解和思考

特征提取方法

特征提取方法: one-hot 和 TF-IDF
词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍
word2vec原理(一) CBOW与Skip-Gram模型基础

讲的一般,而且描述有一些不清楚,看斯坦福大学的课件吧,写的很好,简单说就是三层网络加一个softmax,第一层输入,经过线性变换组合作为第二层的输入,第二层输入什么输出什么,然后再经过一个线性变换作为第三层的输入,第三层是也是输入什么就输出什么,比如说第i个神经元输出为 z i z_i zi,然后末尾用softmax计算后得到最终的输出,第i个最终输出就是 e z i / ∑ j e z j {e^{z_i}}/ \sum_{j} e^{z_j} ezi/jezj

word2vec原理(二) 基于Hierarchical Softmax的模型

传统三层网络输出的softmax的计算的时候,需要计算每个输出值 z i z_i zi e z i e^{z_i} ezi,但是这计算量很大,而分层softmax就是为了避免这个事。怎么避免的呢,就是通过一个霍夫曼树,它是这样设计的,它首先随机初始化词向量,并且这个词向量随着迭会更新;然后对输入求平均,作为隐层的输入,同时也是输出,这其实就是CBOW在做的事,一个字串是 x w − c , . . . , x w , . . . , x w + c x_{w-c},...,x_w,...,x_{w+c} xwc,...,xw,...,xw+c,其中每个 x x x都是当前时刻的词嵌入向量,然后 h w = 1 2 c ∑ i = − c , i ≠ 0 c x w + i h_w=\frac{1}{2c}\sum_{i=-c,i \ne 0}^c x_{w+i} hw=2c1i=c,i̸=0cxw+i作为隐层的输入与输出;然后把输出送到一个霍夫曼树的根节点,注意如果此时我们希望的是,这个霍夫曼树能够把 h w h_w hw送到 x w x_w xw对应的词在树中的位置去。这样我们就不用计算全部值的softmax了,只算结点的sigmoid就行了。
那什么时候算训练好了呢,就是在当前的词向量与当前霍夫曼树的情况下,多数的词都能被送到正确的位置,就可以了。最终的词向量就是我需要的词向量。而这个霍夫曼树em。。。应该就没啥用了。
如果一个词对应多种上下文怎么办呢,没关系,你看第三小节的步骤3,他是用单个样本进行参数更新的。
文中提到了首先随机初始化词向量,这个可以结合TensorFlow的word2vec示例理解,输入是one-hot,过一个embedding,中间层的输入就是输出

word2vec原理(三) 基于Negative Sampling的模型

有点不好理解奥,刚开始对 θ w i \theta^{w_i} θwi是什么没太理解,但是博主45楼回复了,然后更新就完了
在这里插入图片描述
二刷理解:以skip-gram为例,输入一个词 w 0 w_0 w0返回上下文 c o n t e x t ( w 0 ) context(w_0) context(w0),可以想象成输入层是一个词的one-hot编码;过了一个embedding层之后可以获得一个嵌入向量 x 0 x_0 x0,然后在embedding层后面又接了一个全连接网络,输出的维度是字典大小,用这个 x 0 x_0 x0过这个全连接,可以获得 σ ( x 0 T θ w i ) \sigma(x_0^T\theta^{w_i}) σ(x0Tθwi)(不要在意x是列向量还是行向量,意会就行),就相当于一个logistics regression,代表着 w 0 w_0 w0的context里有 w i w_i wi的概率。然后在梯度下降的时候,只需要计算正样本出现的概率和负样本不出现的概率就可以了,也不用过softmax,最大化似然就可以了,省了很多计算
三刷疑问:文中说 w 0 , c o n t e x t ( w 0 ) w_0,context(w_0) w0,context(w0)作为正样本, w i , c o n t e x t ( w 0 ) w_i,context(w_0) wi,context(w0)作为负样本,但我看Distributed Representations of Words and Phrases
and their Compositionality
论文里并不是这样啊,论文里的意思是,中心词不动 w I w_I wI,只不过是对context进行修改,以 c o u n t ( w i ) 3 / 4 ∑ u ∈ v o c a b c o u n t ( u ) 3 / 4 \frac{count(w_i)^{3/4}}{\sum\limits_{u \in vocab} count(u)^{3/4}} uvocabcount(u)3/4count(wi)3/4作为词 w i w_i wi的概率进行采样,修改context里某个位置的词,然后计算损失,或者说最大化目标为 l o g σ ( v w o ′ T v w I ) + E w i ∼ P ( w ) l o g ( σ ( − v w i ′ T v w I ) ) log\sigma(v'^T_{w_o}v_{w_I} )+E_{w_i \sim P(w)}log(\sigma(-v_{w_i}'^Tv_{w_I} )) logσ(vwoTvwI)+EwiP(w)log(σ(vwiTvwI)),其中 v w I v_{w_I} vwI是输入层的词向量, v w i ′ v'_{w_i} vwi是输出层的嵌入矩阵的对应的词向量,第一项中 σ ( v w o ′ T v w I ) \sigma(v'^T_{w_o}v_{w_I} ) σ(vwoTvwI)代表context里存在 w O w_O wO的概率, σ ( − v i ′ T v w I ) \sigma(-v'^T_iv_{w_I} ) σ(viTvwI)代表不存在 w i w_i wi的概率

玻尔兹曼机

深度学习教程之受限玻耳兹曼机
受限玻尔兹曼机(RBM)原理总结

深度信念网络

深度信念网络(Deep Belief Network)
深度信念神经网络DBN最通俗易懂的教程
机器学习——DBN深度信念网络详解

你可能感兴趣的:(优秀文章链接)