Question 1000309: 反向传播(BP)神经网络和前馈神经网络是一回事吗

统计/机器学习 人工神经网络

如题


Answer

Answer 1:

虽然它们两经常共同出现,但是不是一回事。

没有反向传播( backpropagation)神经网络这个东西,我们常说的是反向传播( backpropagation)算法。

反向传播算法经常被用来计算前馈(forward feed)神经网络中边的权重。

前馈神经网络的结构是由第一层向第二层输入信号,没有环路,一直都是向前;反向传播算法是先向前传值(forward propagation),计算好误差之后,再反向代回(back propagation),对原先计算的权重进行修正。


Question 1000314: 深度学习和人工神经网络是一回事吗?

统计/机器学习 深度学习 人工神经网络

我觉得深度学习就是很深的人工神经网络,所以它们基本上就是一个概念吗?


Answer

Answer 1:

它们不是一回事。

只有一个隐藏层的神经网络当然算不上深度学习。多层的神经网络是深度学习模型的典型代表。AlphaGo就有至少13层。

深度学习的英文是deep (machine) learning。凡是有多层结构的机器学习模型都可以叫做深度学习。除了神经网络,还有一个例子就Deep SVM(深层支持向量机),利用多层SVM提取特征信息。


Question 1000320: 前馈神经网络如何选择隐藏层的数量

统计/机器学习 深度学习 人工神经网络

我现在想用前馈神经网络做预测,我好奇有没有什么系统的方法来选择神经网络中隐藏层的数量?

此外每个隐藏层的节点数量又该如何选择呢?


Answer

Answer 1:

一般都是通过cross validation试出来的,没有什么绝对正确的准则。

不过有些是大家(包括Jeff Heaton)普遍的经验心得,值得参考下。

隐藏层数

一般是一层,因为大部分情况下都够用了。理论上说,一个有两个隐藏层的前馈神经网络可以表示任意的非线性决策边界。所以,可以说1到2个隐藏册。

隐藏层中的节点数

假设输入层的节点数是$N_x$,输出层的节点数$N_y$,那么每个隐藏层中的节点数$N_h$一般在$N_x$和$N_y$之间,有人推荐$\sqrt{N_xN_y}$,也有人推荐

$$N_h=\frac{N_s}{c(N_x+N_y)},$$

其中$N_s$是样本的数量,$c$是一个常数,通常选择个位数。当然以上都是根据经验而来的,具体怎么选,还需要针对具体问题进行分析然后做交叉验证。

Answer 2:

对于分类问题,我一般都是用一个隐藏层,隐藏神经元的个数是从Nx一直试到Ny


Question 1000342: word2vec的网络里为什么没有bias偏置项

统计/机器学习 自然语言处理 人工神经网络

对于一般的神经网络模型,每层都会有代表bias的偏置项,为什么word2vec里却没有?


Answer

Answer 1:

word2vec里面也是有bias项的,可能是你看的介绍里面把它省略了。但是对于word2vec模型里输入层,我们的确会常常省略输入层的bias项,因为模型只有一个隐藏层,而且输入层是线性的。可见即使在输入层加了bias项也没有影响,因为这相当于给隐藏层的bias项多加了个常数而已。

Answer 2:

word2vec是输入层-隐层-输出层的结构。输入层-隐层的权重作为word2vec向量,应当没有bias项。隐层-输出层应该可以加bias。


Question 1000436: 神经网络中的Dropout和Bagging

统计/机器学习 深度学习 人工神经网络

神经网络中的Dropout和Bagging的作用都是用来防止模型过拟合(over-fitting)的。

它们两者从出发点和效果上有什么不同?


Answer

Answer 1:

Bagging和Dropout的目的是一样的,都是为了防止模型过拟合。但是bagging是针对于data,dropout是针对于特征。


Bagging是每次训练的时候从原训练集中随机抽取样本,然后对该样本进行训练。多次反复后,对最后的结果取均值。

Dropout是在构建神经网络的时候,随机的丢掉一些节点和边,这就是相当于对特征进行了随机选择(类似于RandomForest随机选择特征)。

这两者并不分谁好谁差,而且通常为了防止模型过拟合,我们也会考虑同时使用这两者方法。


Question 1000502: 训练神经网络中经常提到的epoch是什么意思

统计/机器学习 深度学习 人工神经网络

初学神经网络,经常看到epoch这个词,这个词翻译成中文是世纪、时代的意思,那么在训练神经网络中这个词有什么具体的指代吗?


Answer

Answer 1:

有具体的意思的。epoch可以翻译成“期”。

比如一共1000个样本,每个样本依次用来训练这个神经网络,当这1000个样本都被用过一遍之后,我们就说完成了一期训练。如果设置epoch=5,意思就是说把这个神经网络进行了五期训练。

一个epoch就是把整个训练集过一遍。

如果是用sgd的话(每次随机选取样本),每训练1000个随机样本就是一个epoch。


Answer 2:

epoch就是整个训练集被训练算法遍历的次数。



Question 1000701: 人工神经网络有哪些常用的激活函数?

统计/机器学习 深度学习 人工神经网络

人工神经网络有哪些常用的激活函数?


Answer

Answer 1:

激活函数一般有两种情况。


第一种情况是,激活函数作用在前一层各个节点输出值的线性组合上。这个线性组合的结果是一个数值,而不是向量。这种情况下的常用激活函数有:


1. 恒等函数 identity function

$$f(x)=x$$




2. 分段线性函数 piece-wise linear function

$$f(x)=\begin{cases}0, \text{ if }x\leq u \\ ax+b, \text{ if } u < x < v \\ 1, \text{ if } x\geq v \end{cases}$$

$u,v,a,b$是参数。



3. 阶梯函数 step function

$$f(x)=\begin{cases}0, \text{ if }x\leq 0\\ 1, \text{ if }x>0\end{cases}$$




4. 双曲正切函数 tanh function

$$f(x)=\tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}$$




5. 修正线性函数 reLU function

$$f(x)=reLU(x)=\begin{cases}0, \text{ if }x<0 \\ x, \text{ if }x\geq 0\end{cases}$$



6. S形函数 Sigmoid function

$$f(x)=\frac{1}{1+e^{-x}}$$




7. 反正切函数 ArcTan function

$$f(x)=\text{arctan}(x)$$




8. 高斯函数 Gaussian

$$f(x)=e^{-x^2}$$




第二种情况是,激活函数直接作用在前一层输出值上。也就是说$x$此时是一个向量。这种情况下的常用激活函数有:


9. Softmax function

$$f(x_1,x_2,\cdots, x_m)_i=\frac{e^{x_i}}{\sum_{j=1}^me^{x_j}}$$


10. Maxout function

$$f(x_1,x_2,\cdots,x_m)=\max (x_1,x_2,\cdots, x_m)$$



参考wiki

Answer 2:

除了上面那位同学提到的那些基本的激活函数,还有一些改进的激活函数。

比如LeakyReLU,PReLU,ELU,ThresholdedReLU等等。

可以参考keras里的介绍


Answer 3:

看图


Answer 4:

加一个Mish activation function.


Question 1000782: tensorflow 训练的时候输出nan

统计/机器学习 人工神经网络 TensorFlow

对于不能归一化,不能把值转换为-1 到1 之间的数据,tensorflow 训练的时候很容易输出nan,这是怎么回事呢?有什么比较好的解决方法吗?


Answer

Answer 1:

为什么不能转化为-1到1呢?

对于数值变量,可以通过最大值最小值的方式或者分位数的方式。

对于名义变量,可以进行one-hot编码,转换成0,1或者如果你愿意也可以是-1,1。


Question 1000915: deep learning中的pooling是什么意思?

统计/机器学习 深度学习 人工神经网络

一些neural net里有所谓的pooling layer,请问这里的pooling是什么意思?

谢谢!



Answer

Answer 1:

pooling中文叫做池化,常用的pooling方法有最大值法和均值法。

pooling的作用就是对图片中的每个小块(而不是每个点)提取信息。


比如有个4 x 4的矩阵,

如果我们用2 x 2的max pooling,也就是对上面原矩阵中2 x 2的小分块矩阵求最大值,就可以得到如下结果。

如果我们用2 x 2的average pooling,也就是对上面原矩阵中2 x 2的小分块矩阵求均值,就可以得到如下结果。


Answer 2:

池化实际上是使图片变小来突出特征,节省运算量。

比如2X2池化是把相邻4个点变成一个点,怎么处理呢?

上面说的比较清楚了,一般取最大值,或者平均值。

CNN就是为了图像处理设置的,图像中我们进行池化并不会对图像造成很大损失。

Answer 3:

手册里有

池化

Answer 4:

pooling是池化的意思,一般在神经网络中有常见的两种池化方式

池化层

在通过卷积层获得输入的特征时,我们需要做的利用这么特征继续做分类运算。但是针对多个卷积核下的输出特征,依旧会面临着超庞大的参数运算,为了解决这个问题,我们依旧需要减少参数量。在使用卷积层时,是因为卷积运算可以有效的从输入中提取特征,我们可以对特征做再统计。这一再统计既要能够反映原输入的特征,又要能够降低数据量,我们很自然的想到了取平均值、最大值。这也是池化操作。


池化层原理

从CNN的总体结构上来看,在卷积层之间往往会加入一个池化层(pooling layer).池化层可以非常有效地缩小图片的尺寸。从而减少最后全连接层的参数,在加快计算速度的同时也防止了过拟合的产生。

池化层前向传播过程类似于卷积层的操作一样,也是通过移动一个类似滤波器的结构完成的,不同于卷积层的是,池化层的滤波器计算不是加权求和,而且求区域内的极大值或者平均值。 

一 使用最多的是最大值操作的池化层,又称最大池化层(max pooling),计算图像区域内最大值,提取纹理效果较好. 


二  使用平均值操作的池化层,又称平均池化层(mean pooling),计算图像区域的平均值,保留背景更好  



Answer 5:

以图片的二维pooling为例,它是用于降低二维向量的维度。常用的pooling方法有max pooling, average pooling等。以2乘2的max pooling为例,它就是仅仅保留每个2乘2的窗口中数值最大的那个元素。

Answer 6:

max pooling可以看做是2x2的非线性filtering(取max)再1/2下采样(down sample),用于提取一个2x2块的信息。最主要目的是

1.在空间上减小数据量,减少计算量

2加入空间平移不变性,减少过拟合。平移小于1个像素,不影响结果。

pooling只能用在Image/Region classification这类以区域为单位的任务。对于以像素为单位的任务(regression / restoration/ deconvolution)最好不用pool,因为在空间上的信息被压缩(down sample)后很难恢复,或者是能靠训练数据得到先验知识中去猜。


Question 1001122: 神经网络中的gradient check是什么意思?

统计/机器学习 深度学习 人工神经网络

神经网络中的gradient check是什么意思?就是检查梯度吗?为什么要查梯度?




Answer

Answer 1:

人工神经网络是个非常复杂的结构,一层层叠加而成。

复杂就意味着在实施人工神经网络的时候需要格外小心,其中一个步骤就是手动检查反向传播(backpropagation)是否正确运行。

所以我们就要手动计算和比较真实的梯度和程序中返回的梯度值,以确保其正确。


Answer 2:

主要是解决vanishing gradient problem。大概意思是backpropogation通过链式规则把gradient从输出端的loss function要反向传输到第一层的参数。传输过程中,gradient会逐渐减小或增大,会导致第一层的参数收到的gradient过小或过大。还有个主要原因是所有参数用同样的learning rate。如果用动态的learning rate,会一定程度解决问题。

解决的方法有:

1. Resnet,加一些bypass的路径,让gradient能通过较少层达到前几层的参数。

2. Relu比sigmoid传输gradient更快。记忆中,AlexNet论文中说Relu收敛比sigmoid快3倍。

3. 更好的参数初始值。让链式规则中的gradient乘上系数的绝对值集中在1,也就是Jacobian 矩阵元素的绝对值大概为1。参考He Kaiming的论文

4. 在中间层增加一些辅助的loss function,让辅助的gradient能提前传到前面的层。有些论文叫hierarchical learning。

Answer 3:

可以参考下stanford这篇文章Gradient checking and advanced optimization



Question 1001123: 神经网络中的dense和sparse是什么意思?

统计/机器学习 深度学习 人工神经网络

神经网络中的dense和sparse是什么意思?经常看到这些词汇,包括keras里也有,字面上就是密集和稀疏,那对于神经网络是什么意思呢?



Answer

Answer 1:

dense和sparse都是形容网络结构中的隐层的。

如果一个隐藏层和前面的输入层和后面的输出层有很多连结,那么就可以称为是dense。最极端的例子就是全连结的前馈网络。这个网络中的所有隐层都是dense。

相反的就是sparse的。

其实直观理解起来,就是形容这个层是紧密连接的(dense)还是稀疏连接的(sparse)。

希望能够帮助到你!


Answer 2:

我就说说Keras里的吧。

Keras里的dense layer,就是全连结(fully connected)层。

Keras里的dropout layper,就是随机删去了一些连接,也就相当于是sparse layer。



Question 1001234: LeakyReLu是什么意思?

统计/机器学习 人工神经网络

神经网络中的激活函数Leaky RELu作为激活函数是什么意思?



Answer

Answer 1:

LeakyReLU这种激活函数被称作泄露修正线性单元,有点类似于普通的ReLU。


ReLU的公式是

$$f(x) = \begin{cases}x, \text{ if }x>0\\ 0, \text{ if }x \leq 0\end{cases}$$

画成图就是这个样子


Leaky ReLU是长这样的

$$f(x) = \begin{cases}x, \text{ if }x>0\\ \lambda x, \text{ if }x \leq 0\end{cases}$$

其中$\lambda$是Leaky ReLU的参数,一般是预先设定好的,在0到1的范围之内。

下图是$\lambda = 0.2$的例子


LeakyReLU小于0的部分,也是非0的,所以称为“泄漏”。



Question 1001324: 神经网络里的batch size和sgd里的batch size是一回事嘛?

统计/机器学习 最优化 人工神经网络

神经网络训练中的batch size是什么意思?

和sgd里的batch size是一回事嘛?



Answer

Answer 1:

本质上、原理上,神经网络的batch和SGD里的batch是一个意思。

batch size就是batch中样本的个数。

对于SGD,我们每次输入进部分样本训练模型,这个就是batch的概念。

同样的,对于神经网络,我们每次输入部分样本(也就是batch)进入网络,训练网络,这就是神经网络中的batch。(其实神经网络很多时候都是用SGD训练的,所以这个batch也就对应了SGD里的batch)


Question 1001450: 神经网络中梯度消弥的原因是什么?

统计/机器学习 数值计算 深度学习 人工神经网络

神经网络中梯度会逐渐变成零,一般称为梯度消弥

造成梯度消弥的原因是什么?



Answer

Answer 1:

一般是比较深的神经网络容易出现梯度消失的现象

如果激活函数的梯度是有界的,比如sigmoid的导数就是在(0, 1)之间,根据链式法则,梯度会一层层递减,当层数很多时,最终梯度会非常小,这就造成了所谓梯度消失的现象。



Question 1001580: 激活函数ReLU和Sigmoid的优劣对比

统计/机器学习 深度学习 人工神经网络

神经网络最常用的两个激活函数应该就是ReLU和Sigmoid函数。

它们各自有什么优劣?通常选哪个更好?



Answer

Answer 1:

一般而言在激活函数上使用的ReLu函数,理由如下:

第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,从而无法完成深层网络的训练。

第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

综上所述建议使用ReLu函数。

Answer 2:

1.Relu计算量小,

2.没有饱和区,没有梯度消失

3.用Relu去估计非线型函数时收敛更快。AlexNet论文里说大概比sigmoid快6倍。

4.有个缺点是Relu输出为0后,梯度没发反向传递,这个Relu就死掉了。在作参数(weight,bias)初始化时,不要把太多Relu弄死掉。所以后面有leakRelu之类。

Answer 3:

对于二元分类问题,输出层的激活函数只能是sigmoid

但是中间隐藏层的确更推荐ReLU,原因也是正如另一个回答所说的三点

1. 计算量更小

2. 没有梯度消失的问题

3. 稀疏表达(奥卡姆剃刀原理)


Answer 4:

应该叫 激励函数 吧


Question 1001688: R语言有没有深度学习或者神经网络的包?

统计/机器学习 深度学习 R 人工神经网络

感觉python里非常多,请问R里有没有稳定的、值得推荐的深度学习或者人工神经网络的包?

谢谢!!




Answer

Answer 1:

R里面也有keras的

R interface to Keras



Answer 2:

MXNetR, darch, deepnet, H2O,deepr等等

它们的比较可以参考这个博客


Answer 3:

现在tensorflow也有了。R Interface to TensorFlow


Question 1001988: dropout rate一般设置多大?

统计/机器学习 深度学习 人工神经网络

请教一下大家,神经网络里dropout rate一般设置多大?有什么技巧吗?

谢谢。


Answer

Answer 1:

主要还是根据自己的需要,这个也是hyper parameter,可以根据结果好坏来调整

一般在输入层dropout的比较少,dropout rate是0.1甚至0.

在中间可以稍微大一点,比如0.5。dropout的一个目的是在每批训练时,通过dropout产生不同的网络结构。当dropout在0.5的时候,网络结构会更大的变化。所以0.5是非常常用的。


Answer 2:

我的经验是决定dropout之前,需要先判断是否模型过拟合

先dropout=0, 训练后得到模型的一些指标(比如:  F1, Accuracy, AP)。比较train数据集和test数据集的指标。

  • 过拟合:尝试下面的步骤。
  • 欠拟合:尝试调整模型的结构,暂时忽略下面步骤。

dropout设置成0.4-0.6之间, 再次训练得到模型的一些指标。

  • 如果过拟合明显好转,但指标也下降明显,可以尝试减少dropout(0.2)
  • 如果过拟合还是严重,增加dropout(0.2)

重复上面的步骤多次,就可以找到理想的dropout值了。


Answer 3:

0.4到0.6之间吧



Question 1002005: 神经网络里每层的激活函数必须是一样的吗?

统计/机器学习 深度学习 人工神经网络

深度学习萌新,请教大家

如果神经网络里有很多层,每层的激活函数必须是一样的吗?



Answer

Answer 1:

当然可以不一样,根据自己的要求,可以每层设置不一样的激活函数



Question 1002018: elu激活函数是什么?

统计/机器学习 人工神经网络

elu激活函数是什么?听说过relu,不知道elu这个是什么意思。



Answer

Answer 1:

elu和relu很相似。大于0的时候,是恒等函数;不过小于0的时候,就是一个指数函数-1的形式。elu就是exponential linear unit。

外国一个网站上看到的插图,描述的就是elu

蓝色是elu,红色是relu

对比relu,elu的好处就是让负输入值也能返回一些信息,而且elu能让整体的输出值的均值在0附近,更robust。




Question 1002562: 什么叫成本函数?它的作用是什么?

统计/机器学习 人工神经网络

关于神经网络里面的这个东西,大神们 能尽量通俗易懂的下解释吗?


Answer

Answer 1:

成本函数就是代价函数,翻译的不同,原意就是cost function


Question 1002696: 如果特征都是非负的,那么用RELU作为激活函数还有意义吗?

统计/机器学习 人工神经网络

在用神经网络训练的时候,如果训练集里的特征的数值都是非负的,那么用RELU作为激活函数还有意义吗?

是不是和没有激活函数的效果一样的?


Answer

Answer 1:

激活函数的输入是$x^Tw$,$w$是网络参数,可正可负;$x$是输入,全为正。明显$x^Tw$的范围是实数,ReLU肯定有用。


Answer 2:

当然不是,relu的输入时特征和参数相乘,参数矩阵一般给到随机值作为初始,所以输入是正是负不可知,但肯定有正有负;就算特征全正,参数一开始给全1矩阵,也会在梯度下降过程调参也有可能把参数调参成负值来拟合模型;只有在非常特殊的情况下,relu表现和无激活函数一样;这种情况也许都不一定要使用高级神经网络


Question 1002712: 怎么理解神经网络中的激活函数hard sigmoid?

统计/机器学习 人工神经网络

怎么理解神经网络中的激活函数hard sigmoid?它和传统的sigmoid函数的区别是什么?


Answer

Answer 1:

Hard Sigmoid是简单版本(非光滑)的Sigmoid,其作用就是用三个线段来拟合整个Sigmoid函数。

表达式是分段的。

如果$x<-2.5$

$$\text{HardSigmoid}(x)=0$$

如果$-2.5\leq x\leq 2.5$

$$\text{HardSigmoid}(x)=0.2x+0.5$$

如果$x>2.5$

$$\text{HardSigmoid}(x)=1$$

从上图可以很明显地看出,hard sigmoid的非光滑性,但是同时两者又非常接近。

与sigmoid相比,hard sigmoid的好处就是计算量小了,毕竟不用求e的幂次。


Question 1002735: 为什么基于skip-gram的word2vec在低频词汇相比cbow更有效?

统计/机器学习 自然语言处理 人工神经网络

面试题库里卷38里的一道题目

对于基于skip-gram和基于CBOW的word2vec,哪个模型对低频词汇表现更好?

答案是skip-gram

不是非常理解,求大神分析下


Answer

Answer 1:

CBOW是根据上下文预测当中的一个词,也就是用多个词预测一个词

比如这样一个句子yesterday was really a [...] day,中间可能是good也可能是nice,比较生僻的词是delightful。当CBOW去预测中间的词的时候,它只会考虑模型最有可能出现的结果,比如goodnice,生僻词delightful就被忽略了。

而对于[...] was really a delightful day这样的句子,每个词在进入模型后,都相当于进行了均值处理(权值乘以节点),delightful本身因为生僻,出现得少,所以在进行加权平均后,也容易被忽视。

Skip-Gram是根据一个词预测它的上下文,也就是用一个词预测多个词,每个词都会被单独得训练,较少受其他高频的干扰。所以对于生僻词Skip-Gram的word2vec更占优。


Answer 2:

在 Google Groups 中,Milokov 提到:

“Skip-gram: works well with small amount of the training data, represents well even rare words or phrases

CBOW: several times faster to train than the skip-gram, slightly better accuracy for the frequent words

This can get even a bit more complicated if you consider that there are two different ways how to train the models: the normalized hierarchical softmax, and the un-normalized negative sampling. Both work quite differently.”


关于这段话,stackoverflow 就数据量这个问题进行过讨论:https://stackoverflow.com/questions/39224236/word2vec-cbow-skip-gram-performance-wrt-training-dataset-size


但关于低频词汇的有效性,并没有过多的说明,我是这样反向理解的:由于 CBOW 需要更多的数据,所以它对高频词汇更敏感,从而在低频词汇上表现没有 skip-gram 好。


觉得这样解释不是很好,欢迎补充!


Question 1002832: 关于神经网络的性能

统计/机器学习 深度学习 人工神经网络

最近再看周志华的《机器学习》,其中神经网络一章提到,原文我记不清了,大意是说:数学上已经证明:只要你深度足够深,参数挑的足够合适,一个神经网络是可以拟合出任意可能的判决形式的;


本人菜鸡,深度学习做得比较少,想问问深度学习大神们怎么看这句话。


Answer

Answer 1:

你说的应该是Universal approximation theorem的引申。

Universal approximation theorem是说对于一个前馈神经网络,哪怕只有一个隐藏层,它也能无限逼近任何有界连续函数。


Question 1002926: 优化算法中的“带冲量”是什么意思?

统计/机器学习 数值计算 最优化 人工神经网络

优化算法中的“带冲量”是什么意思?英文是momentum。怎么理解“冲量”以及“带冲量”?


好像还有一种说法是“动量”,但是我也不是很清楚。


谢谢!


Answer

Answer 1:

momentum就是说每次更新时也考虑前一步的变化。

比如我们熟悉的SGD,迭代步骤是这样的

$$\beta_{i+1}=\beta_i+u_i$$

$u_i$是每次调整的大小,对于SGD,$u_i=-\alpha \nabla_i$。

对于SGD with momentum,迭代公式中的$u_i$就成了

$$u_i = -\alpha \nabla_i + \nu u_{i-1}$$

其中$\nu$是momentum参数,越大就代表过去的梯度权重更大。

用图表示的话,绿色表示之前的迭代方向$u_{i-1}$,红色表示当前根据梯度计算的方向,蓝色就是实际更新$u_i$。


Question 1003228: 为什么神经网络模型不用交叉验证?

统计/机器学习 深度学习 模型验证 人工神经网络

最近开始自学神经网络,深度学习,看了网上不少教程,发现通常只是把数据集分成train set和eval set,很少做交叉验证的。

为什么我们不对神经网络模型进行交叉验证呢?有什么原因吗?


Answer

Answer 1:

当然可以对neural netwok进行cross validation,但是有时候我们并不这么做,我们只做train validation split。

理由是:

1. 训练神经网络的计算代价很大,k-fold cv则需要训练k个神经网络

2. 在用神经网络时,我们往往有极大量的数据,在这种情况下,我们没有必要去通过cross validation来充分利用数据

如果有说的不对的地方,欢迎指正

Answer 2:

也不是完全不用交叉验证,只是用的话比较慢吧

Answer 3:

如果用了dropout,相当于用了cross validation,因为每个训练数据在每个epoch只能见到一个随机的子网络。最后测试时是这k个子网络的平均,k接近无限。

还有如果随机的组成mini batch,每个batch又是训练数据的随机子集,也相当于把训练数据分为无限个子集,降低了过拟合风险。

我理解是以上两点引入足够的随机性,能让结果稳定。如果还有过拟合,还可以加其他方法,比如对参数加L1/L2norm限制,data augmentation,unet/auto encoder等稀疏结构。


Question 1003384: BP神经网络的疑问

统计/机器学习 人工神经网络

权值更新的过程是这样的吗?

假设输入层有2个节点,隐藏层有1层2个结点,输出层只有1个结点。(这样就有2*2+2=6个权值)

第一次训练

    样本1输入,更新权重w1-w6

    样本2输入,基于上次更新的w1-w6再次更新w1-w6

    ...

    样本n输入,基于上次更新的w1-w6再次更新w1-w6

第二次训练

    样本1输入,基于第一次训练最后一次更新的w1-w6再次更新w1-w6

    样本2输入,基于上次更新的w1-w6再次更新w1-w6

    ...

    样本n输入,基于上次更新的w1-w6再次更新w1-w6

...

第N次训练

    样本1输入,基于第N-1次训练最后一次更新的w1-w6再次更新w1-w6

    样本2输入,基于上次更新的w1-w6再次更新w1-w6

    ...

    样本n输入,基于上次更新的w1-w6再次更新w1-w6


是这样的过程吗?



Answer

Answer 1:

你描述的这个过程其实就是广义的mini-batch的训练过程,跟是否是bp或者是否是神经网络都没有关系。你一共重复训练了N次,也就是说epoch是N。

backpropagation神经网络也是可以这样训练。

bp的意思是先向前传播,再反向传播更新权重。


Question 1003392: sigmoid, tanh, arctan这几个激活函数为什么长这么像?

统计/机器学习 人工神经网络

sigmoid, tanh, arctan这几个激活函数为什么长这么像?

它们是等价的吗?或者只是一个平移的关系吗?


Answer

Answer 1:

它们都是S型的。

$\text{arctan}(x)$的范围是$(-\frac{\pi}{2}, \frac{\pi}{2})$

$\text{tanh}(x)$的范围是$(-1, 1)$

$\text{sigmoid}(x)$的范围是$(0, 1)$

如果我们通过平移、缩放把它们的范围都限制在$(-1, 1)$,再对比一下,发现它们也没有重合

其实$\text{tanh}(x)$和$\text{sigmoid}(x)$还是有伸缩的关系,因为

$$\text{tanh}(x)=\frac{1-e^{-2x}}{1+e^{-2x}}=\frac{2}{1+e^{-2x}}-\frac{1+e^{-2x}}{1+e^{-2x}}=2\text{sigmoid}(2x)-1$$


Question 1003694: 为什么GAN是非监督的?

统计/机器学习 无监督学习 深度学习 人工神经网络

为什么GAN是非监督的学习方法?


Answer

Answer 1:

因为GAN本身并不需要数据有label,GAN是产生人工“假”数据,配合原来的真数据来训练discriminator ,而并非原始数据中的label。

所以说GAN是非监督的。

Answer 2:

GAN是semi-supervised, 包含generator$G()$和discriminator$D()$。它有两个输出数据,对应两个loss:

1.原始的输出。loss1可以是逻辑回归或线性回归,用于训练$G()$,是监督训练;

2.人造的label,表示是见过的训练数据。loss2是逻辑回归,用于训练 $D(G())$,是非监督训练。关键是loss2的gradient会传到$G()$,从而用人造label训练generator。换句话说人造label会作为正则项限制$G()$中参数的取值范围。Discriminator用到了“存在即合理”的假设,label=1表示“存在”。这点类似于one class svm anomaly detection,把见过的正常数据的表达空间压缩到一个点上(label=1),而label=0表示其余没见过的“非正常”数据。

----------------题外话---------------------

Discriminator可看做是一个正则项,类似对generator参数$w$的L1/L2 norm,提供先验信息(prior),压缩$w$的取值空间$W$。一般overfitting都发生在$W$的边沿,如果限缩了$W$,把那些边沿部分从$W$中去掉,会降低overfitting的概率。

正则项一般来源于数据某种特征的稀疏性,比如$w$的L1/L2 norm,或者图像处理中相邻pixel的差要稀疏(TV, Laplace,Gaussian)。 Discriminator也是一个稀疏表达(sparse representation)的限制条件,这个人造label就是它的特征,把所有训练数据压缩到一个点上。



Question 1003780: 卷积层的padding一般都是零吗?

统计/机器学习 计算机视觉 人工神经网络

我看网上各种教程里卷积层的padding一般都是零,有不是0的情况吗?

在什么情况下,padding设置为非零的数?


Answer

Answer 1:

教程里一般都是比较简单的例子所以用padding=0比较方便吧

实际中,如果我们要让卷积之后的图片和原来的图片一个尺寸,我们通常是需要加padding=1

此外,如果图片中有一些很重要的信息是图像的边缘,那么我们也需要加padding,不然在卷积的过程中会丢失

Answer 2:

以针对图像的卷积层为例(暂不考虑图像通道数):

输入图像尺寸 W1 x H1,

输出图像尺寸 W2 x H2,

卷积核 K,步长 S,Padding P,

有以下关系:

W2 = (W1 - K + 2P)/S + 1

H2 = (H1 - K + 2P)/S + 1

卷积层如果是为了降维,通常P=0,这样可以减小输出图像的尺寸;如果是为了提取有效特征而不是为了降维,从将P设为合适的数值;比如对于卷积核3,步长1的情况,P=0时W2 = W1 - 2,P=1时W2 = W1。

Answer 3:

一般都是设置0或者1。


Question 1003784: 激活函数RELU在0点的导数是多少?

统计/机器学习 人工神经网络

RELU(x) = max(x, 0)所以它是算分段的,小于0的时候导数是0,大于0的时候导数是1,在0点不可导。

那实际操作或者计算的时候RELU在0点的导数我们认为是0还是1呢?


Answer

Answer 1:

relu在0点的确不可导,正如@huluobo说的,可以用$\log(1+e^x)$来近似,这个函数是连续的,它在0点的导数是0.5。也就是相当于relu在0点的导数取为0.5,也正好是0和1的均值。

也可以就规定relu在0点的取值是0或者1,这样也比较方便。tensorflow里面就默认relu在0点的导数是0。

Answer 2:

用$\ln(1 + e^x)$来approximate吧

Answer 3:

因为数值计算中有roundoff error,计算机里的浮点数0表示是一个0周围以roundoff error为宽度的邻域,并不是一个点。所以tensorflow里Relu在0(计算机中的点,数学上的邻域)的导数应该是0和1两条不连续的线段。为简便,默认只取0。


Question 1003955: purelin激活函数是什么?

统计/机器学习 人工神经网络

有了解一个叫purelin的激活函数的吗?

这个函数是怎么样构造的?


Answer

Answer 1:

purelin就是pure linear function,也就是纯粹线性,等于什么都不做的激活函数,$f(x) = x$。


Question 1004031: 图像识别和深度学习中的“组合爆炸”是什么意思?

统计/机器学习 深度学习 计算机视觉 人工神经网络

图像识别和深度学习中的“组合爆炸”是什么意思?

求指教!


Answer

Answer 1:

和grid search调参里的组合爆炸基本上是一个意思。比如有5个超参要调,每个超参有10个候选值,组合起来的话就有$10^5=100000$个可能性要尝试。

在图像识别里也差不多,比如要识别图像里的一类物品,它可能颜色不同,材质不同,不同拍照的角度看到的形状不同,不同光照效果下的样子也不同,另外还有出现遮挡的情况,考虑到种种情况,组合在一起,每类物品就需要指数级别的训练集。图像识别一般是多分类的。对数据量的要求就非常非常大了。

这个例子是当猴子被不同物体遮挡时,预测结果都不佳。左图是猴子被判断为人;中图是猴子被判断为人,单车被判断成鸟;右图也是类似的。

这是因为训练集中并没有出现猴子与这些物体同时出现的图像,造成模型准确度下降。但是我们也无法做到把这些所有可能的组合的图像都放入训练集,组合爆炸的结果就是数据集需求量暴增。


Question 1004125: 为什么小数据不适合神经网络模型?

统计/机器学习 深度学习 人工神经网络

很多文章上都说数据量小的时候,不能用神经网络和深度学习,这是为什么?有什么理论吗?


Answer

Answer 1:

神经网络是图结构,因为有非线性层比如relu,有的从输入到输出的路径只有一部分数据能流过。大部分数据会被relu挡住,选择走别的路径。如果有条路径只有一个数据流过,那么这条路径上学习到的参数就会逼近这个数据的噪音,变成过拟合。流过数据点越多,噪音相互抵消,通用性(generalization)越好。如果训练数据点太少,神经网络很多路径只有较少数据流过,会过拟合。

这也是在loss中加L1/L2 norm的正则项,添加dropout,让网络有效路径更稀疏,强迫更多数据去共享路径,让数据更集中。

有个经验公式,每个参数(事件)需要10(或更多)数据点去支持。可理解为一个参数要吃到10个数据才能喂饱,越多越好。

Answer 2:

神经网络和深度学习过于复杂,容易出现过拟合。

Answer 3:

神经网络容易在小数据上过拟合。

为什么呢?对于一个三四层的全连接网络,其中的参数可能会多达上几百个。这样就会造成需要被学习的参数多于或者接近训练样本的个数的情况,于是相当于数据量本身,模型过于复杂,就发生了过拟合。


Question 1004214: 怎么理解所谓的dying relu?

统计/机器学习 人工神经网络

印象中一般都是说sigmoid会在两端梯度消失,dying relu这个该怎么理解?


Answer

Answer 1:

假设一个神经元(neuron)是$Relu(wx+b)$。因为一般用mini batch(SGD)优化算法,每次计算gradient只用一组(batch)数据点。假如用一组数据点更新$w,b$后,其余数据点$wx+b<0$,那么只会有一组点能通过这个neuron并更新它的参数,对于绝大多数点来说,不能通过这个neuron,也不能更新参数,相当于“死掉”。如果dying relu 很多,对于大多数数据来说神经网络大部分通路断掉,学习能力就变弱了。

解决办法是用leakyRelu等;bias的初始值设为正数,比如1;减小learning rate。


Question 1004235: Resnet-18, Resnet-50, Resnet-101这些模型里的数字是什么意思?

统计/机器学习 深度学习 计算机视觉 人工神经网络

残差网络Resnet-18, Resnet-50, Resnet-101后面跟着的数字18,50,101都是什么意思?


Answer

Answer 1:

表示网络里隐藏层的层数,Resnet-18, Resnet-50, Resnet-101分别有18、50、101层。


Question 1004271: 常提到的LeNet是什么意思?

统计/机器学习 人工神经网络

常提到的LeNet是什么意思?是一种特定的网络结构吗?


Answer

Answer 1:

LeNet准确的表达是LeNet-5。5表示是隐藏层的个数,LeNet-5就是一共有7层(包括输入、输出层)的卷积神经网络,是最早期的CNN。最早是1990年代,LeCun设计用来识别32x32图像形式的手写数字字母的简单神经网络。

麻雀虽小五脏俱全,有卷积层,有池化层。LeNet可以说是CNN中的hello world。

Answer 2:

就是特指LeCun大神最早版本的那个卷积神经网络,简称LeNet。


Question 1004400: 为什么神经网络用截断正态分布生成初始权值?

统计/机器学习 概率分布 深度学习 人工神经网络

为什么神经网络用截断正态分布随机生成初始权值?而不是用普通的正态分布?


Answer

Answer 1:

我们知道正态分布有个3$\sigma$原则,意思就是99.7%的点都在距离中心3个标准差之内。换句话说,随机初始化的权值依然是有可能是离中心点比较远的。

假设我们用了sigmoid作为激活函数,一旦初始值过小,或者过大,就可能会导致输入到隐藏层的数据太小或者太大,从而进入饱和区。一旦进入饱和区,这些对应的neuron就死掉了,再也不会更新了。

所以为了防止这个dying neuron现象,我们就用了截断正态,保证初始的权值不太大也不太小。

Answer 2:

这是初始点太差,不易收敛的问题。

举例说明下如果用正态分布,不限制极大初始值的问题。比如在最后一层用sigmoid函数,loss是cross entropy。数据点$(x_i,y_i)$对参数$w$的gradient是$dL/dw=(\sigma(w^Tx_i)-y_i)x_i$。假设数据做过标准化处理,学习率是$\alpha=0.001$,数据点个数$N=10^5$,参数初始值是$w=[10^5,0,0,...]$。可以看到gradient中第一项小于1,第二项幅度(标准差)大概是1,每个数据点能提供的修改量大概是$\alpha=0.001$,最快大概需要$10^5/(\alpha*N)=1000$epoch才能把$w_0$减小到0附近。也就是前1000epoch全用于改正$w_0$一个极大的初始值,抑制了其余$w_{j>0}$的学习。这种最好的情况是第一维数据和$y$非常相关,每个数据都能提供正确的修正。最坏的情况是第一维数据和$y$不相关,修正量的方向是随机的,那么$w_0$会“之”字型的缓慢减小。

最后一层$w$出现极大初始值时,情况最糟糕。如果在其他层有极大初始值,只是让个别神经元死掉,危害还小点。

Answer 3:

如果是sigmoid激活函数,截断正态分布可以防止梯度消失

如果是relu激活函数,截断正态分布可以防止一上来很多神经元就死掉(relu中的dying relu


Question 1004607: h-softmax是什么意思?

统计/机器学习 自然语言处理 人工神经网络

一些文本神经网络模型里提到的h-softmax是什么意思?和常规的softmax有什么区别吗?


Answer

Answer 1:

h-softmax就是Hierarchical Softmax,分层的softmax,也是激活函数的一种。

具体可以看看这个blogHierarchical Softmax as output activation function in Neural Network


Question 1004652: GloVe是神经网络模型吗?

统计/机器学习 自然语言处理 数据降维 人工神经网络

GloVe是神经网络模型吗?是什么结构?


Answer

Answer 1:

不是神经网络模型,就是一个矩阵分解算法。


Question 1004661: autoencoder 架構問題

统计/机器学习 无监督学习 深度学习 数据降维 人工神经网络

大家好,目前在做一個有關心電圖的autoencoder ,希望能重建出心電圖訊號

目前遇到一個問題,由於我的心電圖是透過z-score的方式進行正規化,出來的數值並不會只有[-1,1]之間

而我查了大部分的網路架構最後一層大多是用sigmoid or tanh function,這樣出來的結果頂多是[0,1] or [-1,1]之間

這樣會跟我輸入訊號有差異

所以想請教各位大神,這應該要怎麼處理比較好?更換正規化的方式嗎?還是最後一層的activity function有其他選擇?


Answer

Answer 1:

输出层也可以就是线性的,或者就是identity function。很多回归问题的输出层都是这样的。

Answer 2:

我現在是用keras寫程式,想請問如果用linear作為activity function

那loss跟metrics應該怎麼設定呢

謝謝



Question 1005298: 激活函数leakyRELU和pRELU的区别是什么?

统计/机器学习 人工神经网络

leakyRELU和pRELU的公式都是

如果 x <   0:f(x) = ax

如果 x >= 0:f(x) = x

感觉它们两个完全等价吧,那为什么又会有两个不同的名字呢


Answer

Answer 1:

并不完全等价,leakyrelu的a是固定的, prelu可以看作是leakyrelu的一个变体,a是根据网络训练得到的,而非预先定义的。

Answer 2:

两个激活函数都是对RELU的进一步推广。

对于LeakyRELU,$f(x)=\alpha x$中的是固定的,是模型训练前提前设定的。

对于pRELU,$f(x)=\alpha x$中的是未知的,是模型训练中得到的。

更简洁一点说,LeakyRELU中$\alpha$是超参,pRELU中$\alpha$是参数。(两者的区别看这里hyperparameter与parameter


Question 1005430: keras hdf5 從某層輸入數值

统计/机器学习 无监督学习 深度学习 数据降维 人工神经网络

大家好,我最近訓練了一個AutoEncoder

目前的準確率有95%

我在保存權重的時候使用並未把Encoder 和 Decoder分開

所以目前存的hdf5存放著Encoder 和 Decoder的結構及權重

目前我是想把其中的Decoder取出來用

但我不知道要怎麼只取Decoder的部分出來用

希望有經驗的大神們能夠替我解惑

謝謝


Answer

Answer 1:

搬运一个stackoverflow上的问题和答案,应该是你想要的。

Extract encoder and decoder from trained autoencoder


Question 1005463: 为什么wide&deep模型用ftrl和adagrad两种优化方法

统计/机器学习 推荐系统 人工神经网络


在论文里,wide部分使用ftrl优化,deep部分使用adagrad优化,请问这样设计的动机是什么。


Answer

Answer 1:


1.一片google论文说wide模型可能有billion的feature,FTRL+L1norm可以让参数w稀疏,并提供不错的结果。稀疏性应该是一个动机。

2. 可能Google的FTRL的实现适合稀疏数据,而Adagrad每个参数都要记录learning rate,内存消耗太大。

3. 论文里说wide负责memorize/overfitting,deep负责generalization。一个可能的动机是FTRL更容易overtting。

稀疏应该是主要原因。


Question 1005464: word2vec中的negative sampling有什么用?

统计/机器学习 抽样方法 自然语言处理 人工神经网络

word2vec中的negative sampling有什么用?是对谁进行sampling的?


Answer

Answer 1:

word2vec的输入变量和目标变量都是one-hot的,而且维度很大,这样就有了计算量的问题。

negative sampling是针对目标变量的,比如one-hot之后的目标变量是9999个0,1个1。这1万点对应的参数每次迭代时都会更新,假设隐藏层有100个点,那就有100万个参数,所以非常低效。对这9999个0随机取20个,这就是negative sampling。这样的话目标变量里是20个0,1个1,剩下的没有数值,没有数值所对应的那些参数也不会被更新,只更新21个数值对应的参数。这样计算量大大降低,而且实验显示,negative sampling之后模型也更好。


Question 1005503: 训练完keras模型后怎么画出loss和val_loss的对比图?

统计/机器学习 模型验证 数据可视化 人工神经网络 TensorFlow

我用keras训练了一个模型

model.fit(train_array, labels, batch_size=32, epochs=10, validation_split=0.3)

返回了如下的loss和val_loss

Epoch 1/10

17500/17500 [==============================] - 2s 120us/step - loss: 0.6638 - val_loss: 0.6066

Epoch 2/10

17500/17500 [==============================] - 1s 62us/step - loss: 0.5379 - val_loss: 0.4775

Epoch 3/10

17500/17500 [==============================] - 1s 61us/step - loss: 0.4247 - val_loss: 0.3939

Epoch 4/10

17500/17500 [==============================] - 1s 63us/step - loss: 0.3525 - val_loss: 0.3480

Epoch 5/10

17500/17500 [==============================] - 1s 62us/step - loss: 0.3077 - val_loss: 0.3162

Epoch 6/10

17500/17500 [==============================] - 1s 61us/step - loss: 0.2783 - val_loss: 0.2991

Epoch 7/10

17500/17500 [==============================] - 1s 61us/step - loss: 0.2573 - val_loss: 0.2878

Epoch 8/10

17500/17500 [==============================] - 1s 60us/step - loss: 0.2418 - val_loss: 0.2815

Epoch 9/10

17500/17500 [==============================] - 1s 63us/step - loss: 0.2299 - val_loss: 0.2779

Epoch 10/10

17500/17500 [==============================] - 1s 62us/step - loss: 0.2203 - val_loss: 0.2750

我怎么根据这个loss和val_loss画图?就像底下这个图的效果



Answer

Answer 1:

你要把model.fit的训练过程保存下来

history = model.fit(...)

history是一个dict,dict里有history子dict,里面有loss和val_loss,都是list的形式,然后就可以正常画图了

epochs = len(history.history['loss'])

plt.plot(range(epochs), history.history['loss'], label='loss')

plt.plot(range(epochs), history.history['val_loss'], label='val_loss')

plt.legend()

plt.show()

Question 1005539: cnn没有pooling会怎么样?

统计/机器学习 深度学习 计算机视觉 人工神经网络

cnn没有pooling会怎么样?


Answer

Answer 1:

是可以没有pooling的,pooling主要作用就是降维,同时mean pooling可以提取背景信息,max pooling可以提取纹理。

这些功能使用卷积也可以完成,只要设置好卷积核和步长。

谷歌的轻量级卷积MobileNet没有使用pooling。

Answer 2:

著名的alpha go其实就没有使用pooling,只用了convolution。是否要使用pooling层,其实只要看subsampling之后是否会改变原本事物本身。比如,如果是图像处理,subsampling pixels其实并不会影响我们判断物体是什么,有可能只是图像变模糊了,但是我们还是可以判断出这个物体。但是在围棋里面,subsampling棋盘就会影响我们的判断,所以不适合使用pooling。

拓展说一下什么时候适合用cnn,其实就是要看使用的场景是否具有图片的那些特性。

1. 某些pattern和整个图像相比要小很多。

2. 同样的pattern会出现在不同的区域。

3. subsampling并不会改变对物体本身的判断。

特性1和2对应的convolution, 特性3对应的pooling。

Answer 3:

pooling用于down sample, 多用于分类的任务,因为输出是一张图的label,不含有空间信息。还可以用于Unet这类在空间有压缩的结构(空间上的coder-encoder)。

对于denoising,super-resolution这类回归任务,输出含空间信息,一般不用pooling。即使用了pooling,还会用upsample,恢复以前图像大小,比如Unet。


Answer 4:

如果在做CNN图像分类问题的时候,pooling会丢失部分的无用价值的信息的,能减少你的计算量的。

Answer 5:

pooling是用来做downsampling的,如果不做downsampling,每个卷积层的模型权值的个数会几何增长,最后你算力就不够了


Question 1005618: 为什么最大值池化比均值池化好(更常用)?

统计/机器学习 人工神经网络

为什么最大值池化比均值池化好(更常用)?


Answer

Answer 1:

因为图像识别的过程通常是靠边缘才能识别图像和物体,max pooling通常能够尽量保存边缘,而mean pooling用到了窗口内的所有像素,相当于是进行了模糊处理。

但是也不是只使用max pooling,只是更常见。


Question 1005628: 为什么神经网络模型需要大量的样本?

统计/机器学习 人工神经网络

我看到这个问题里说神经网络不适合于小数据的问题,那么为什么神经网络需要大量的样本呢?


Answer

Answer 1:

因为神经网络模型一般不需要做特征工程,它会通过数据自己学习如何进行特征工程,所以它自然需要更多的数据。

从另一个角度讲,神经网络模型一层一层累加,整个网络里通常会有上千甚至上万个参数需要估计。参数越多,当然需要更多的样本。


Question 1005646: VGG16和VGG19的区别?

统计/机器学习 深度学习 计算机视觉 人工神经网络

VGG16和VGG19这两个卷及网络的区别是什么?一般用哪一个?


Answer

Answer 1:

上图是各个版本的VGG的结构。VGG是牛津大学研发的一系列的卷积神经网络的简称。

D列和E列是VGG16和VGG19。VGG19是有19层,VGG16是有16层,多出的三层都是卷基层,具体是多在什么地方的可以看上面的表。

VGG16模型比VGG19更轻量化,VGG19的表现其实和VGG16略好一点,它们其实几乎差不多,所以牛津的研究员就停止在VGG19层了,不再增加更多层数了。

Answer 2:

两者并没有本质上的区别,只是网络深度不一样。VGG16包含13个卷积层和3个全连接层,VGG19包含16个卷积层和3个全连接层。用哪个网络的话我觉得都差不多,效果上vgg19可能会更好一些,不过参数比vgg16多


Question 1005718: CNN中的感受野是什么意思?

统计/机器学习 计算机视觉 人工神经网络

CNN中的感受野是什么意思?


Answer

Answer 1:

感受野(receptive field)指影响一个输出的所有输入的范围,对于CNN级联结构,是一个金字塔形状。每一层CNN是一组非线性滤波器(filter),级联后是kernel size更大的滤波器。最终级联后滤波器的kernel size就是感受野的大小。

题外话,field应该翻译成“场”,比如电场,磁场,重力场,因为receptive field有可能是多维的。

Answer 2:
感受野的定义是: 对与某层输出特征图的某一个点,在卷积神经网络的原始输入数据上能影响到这个点的取值的区域。举例来说加入输入图像的尺寸为224x224, 用3x3的无膨胀卷积核进行卷积操作,那么第二层每个点对应的感受野就是3x3, 其他层计算以此类推。极端的情况, 如果最终输出层的尺寸为1x1,那么那个点对应的感受野就是224x224。

Question 1005727: softmin是什么激活函数?

统计/机器学习 人工神经网络

softmin是什么激活函数?之前学过softmax,但是没有接触过softmin


Answer

Answer 1:

参考这个文档说明softmin

Answer 2:

看了楼上文档。softmin能让一组分类概率中概率最小的是1,其他都是0。比如(1,2,3,4)→(1,0,0,0),让预测概率总和为1

softmax是常见的归一化方法,利用自然对数的指数比来约束输出结果在0-1之间,从而可以利用交叉熵求loss

什么时候需要用到softmin我还没想明白。。貌似少见

Answer 3:

Softmin(x) = Softmax(-x)


Question 1005812: 卷积层、池化层和droput层的前后顺序是什么?

统计/机器学习 计算机视觉 人工神经网络

卷积层、池化层和droput层的前后顺序是什么?

是 卷积层 => 池化层 => dropout层

还是 卷积层 => dropout层 =>池化层?


Answer

Answer 1:

我见到的比较多的是 卷积层 => 池化层 => dropout层

因为dropout一般要在全连接层的前面


Question 1005854: RMSprop里的参数rho和decay有什么区别?

统计/机器学习 数值计算 人工神经网络 TensorFlow

RMSprop里参数rho和decay都是衰减的作用,它们有什么区别呢?

谢谢!!


Answer

Answer 1:

RMSprop在每一步会结合前几步的梯度,进行加权平均,rho是用来控制加强平均的。

decay是对learning rate进行衰减的。

两个参数的作用不同。前者控制迭代方向的改变快慢,后者控制迭代步长的大小。


Question 1005872: 神经网络模型里训练和推理是什么意思?

统计/机器学习 深度学习 人工神经网络

神经网络模型里有训练和推理,这个训练和普通的机器学习模型的训练是不同的意思吗?推理又是什么意思呢?


Answer

Answer 1:

所谓的训练就是我们理解的模型训练的过程。

推理则是predict。


Question 1005904: CNN中卷基层的stride通常都是1吗?为什么?

统计/机器学习 特征选择 计算机视觉 人工神经网络

CNN中卷基层的stride通常都是1吗?为什么?可以用其他数值吗?


Answer

Answer 1:

1和2都挺常见的。

stride越大,提取特征越少;stride越小,提取特征越多。而且stride的选择和卷积核kernel size的大小也有关系。如果stride大于kernel的边长,那么原始信息就会有一部分被跳过,如果stride远小于kernel的边长,提取的特征的重复性就会比较高。

考虑到现在一般kernel都是2x2或者3x3的,所以1和2都是stride的常用选择。


Question 1005932: RNN可以滚动预测吗?

统计/机器学习 深度学习 时间序列 人工神经网络 TensorFlow

用RNN做时间序列模型,想要实现“滚动预测”(不断给model喂新的训练数据,更新模型),不知道能否做到?

比如说,

1. 先用2014.1.1 - 2016.8.1的数据作为training set,然后predict 2016.8.2的值;

2. 用2016.8.2的数据继续train这个模型,然后predict 2016.8.3的值;

3. 以此类推


简言之就是对于一个已经训练好的model,能不能继续feed new training data and update this model?



Answer

Answer 1:

可以,但这样会导致误差叠加,也就是越到后面效果越差

Answer 2:

可以认为是transfer learning。旧模型需要学习新数据。


Question 1006003: 深度学习模型的“蒸馏”是什么意思?

统计/机器学习 深度学习 人工神经网络

深度学习模型的“蒸馏”是什么意思?


Answer

Answer 1:

蒸馏就是把模型的细枝末节给蒸发掉,只留下骨干。

蒸馏是一种模型压缩的技术,将大模型学习出来的知识作为先验,将先验知识传递到小规模的神经网络中,之后实际应用中部署小规模的神经网络。

简单说来就是这个意思。

Answer 2:

简单来说就是让小模型去学习大模型得到的泛化能力,这样得到的结果理论上来说要比直接用小模型数据训练出的结果要更好。


Question 1006024: swish激活函数的公式是什么?

统计/机器学习 深度学习 人工神经网络

有了解swish激活函数的吗?公式是什么?


Answer

Answer 1:

$f(x)=x\cdot\text{sigmoid}(x)$

Swish是ReLU的良好替代:

1)Swish可导

2)小于0时并非始终等于0

3)非单调

Answer 2:

f(x) = x*sigmoid(βx) . β为常数或者可训练的参数


Question 1007616: Feed-Forward Network(FFN)是什么网络结构?

统计/机器学习 人工神经网络

Feed-Forward Network(FFN)是什么网络结构?


Answer

Answer 1:
前馈神经网络(feed forward neural networks),也就是多层感知机(MLP),这种网络包括前向传播和逆向传播,前向传播后计算误差,逆向传播用来更新权值。这种网络没有环路,其他神经网络结构还有CNN和RNN

Question 1021567: yolo v4和yolo v3的主要区别是什么?

统计/机器学习 计算机视觉 人工神经网络

yolo v4和yolo v3的主要区别是什么?有哪些技术改进?


Answer

Answer 1:

一、输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练BackBone

二、主干网络:将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock

三、Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构

四、Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms


Question 1021638: 神经网络的输出值总是一样

统计/机器学习 深度学习 损失函数 人工神经网络 TensorFlow


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon May 4 15:43:05 2020
@author: li_hy
"""

import tensorflow as tf
import numpy as np
from scipy.io import loadmat as load
from tensorflow.keras import layers,optimizers,Sequential
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv1D, BatchNormalization, Activation, MaxPool1D, Dropout, Flatten, Dense
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler
import os

class Mynet(Model):
    def __init__(self):
        super(Mynet, self).__init__()
        self.c1 = Conv1D(filters=3, kernel_size=3, activation='sigmoid')
        self.b1 = BatchNormalization()
        self.a1 = Activation('sigmoid')
        self.p1 = MaxPool1D(pool_size=3, strides=2)
        self.flatten = Flatten()
        self.f1 = Dense(2048, activation='sigmoid')
        self.f2 = Dense(3, activation='softmax')
    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        #x = self.d(x)
        x = self.flatten(x)
        x = self.f1(x)
        y = self.f2(x)
        return y


model = Mynet()
opt=tf.keras.optimizers.SGD(
    learning_rate=0.001, momentum=0.0, nesterov=False, name='SGD'
    )
model.compile(optimizer=opt,     loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])
scaler = StandardScaler()
#数据归一化
x_train = scaler.fit_transform(x_train.astype(np.float32).reshape(-1,1)).reshape(-1,5,16384) 
x_test =scaler.fit_transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,5,16384) 
#print(x_train[0])
history = model.fit(x_train, y_train, batch_size=8, epochs=20, validation_data=(x_test, y_test), validation_freq=1)
#model.summary()  
y=model.predict(x_train)

print(y)
print('-----------------')
print(y_train)


输出的预测结果和输入数据完全没有关系,而且数值几乎一模一样


Answer

Answer 1:

你没有train model 啊。Keras 应该是model.fit()


Question 1022026: epoch和batch之间有什么关系?

统计/机器学习 深度学习 人工神经网络

训练神经网络的时候,epoch和batch之间有什么关系?


Answer

Answer 1:

Epoch是你对整个训练集训练的次数,

Batch在deep learning里面指的是mini-batch.

假设你有100个sample, mini-batch是10, 那就是每次送进去10个sample, 10次就可以跑完这个data set.

这是一个epoch. 你可以跑100个epoch, 相当于模型对每一个sample见到了100次。

Answer 2:

epoch是你选择的训练迭代次数

batch是你每次训练的时候选择的样本数

Answer 3:

epoch × batch = 样本总数


Question 1022118: 吴恩达深度学习第一课第四周作业L层结果收敛在0.64的问题

统计/机器学习 深度学习 人工神经网络

最近在学吴恩达深度学习,但是碰到一些问题,想请教大神。我学到了第一课第四周,我的程序是我参照吴老师的程序自己写了一遍,但是我遇到了问题。在双层网络时,程序结果和吴老师的一模一样,但是L层网络时,我程序代价函数的值收敛在0.64处,检查了两天都没有发现错误在哪里,所以想在这里问问,希望大家能告诉我在哪里错了。非常感谢


原版资源可以在下面这个链接找到

https://github.com/robbertliu/deeplearning.ai-andrewNG



以下是我的python程序:

import numpy as np
import h5py
import matplotlib.pyplot as plt
from dnn_app_utils_v2 import *

def Sigmoid(z):
    return 1 / (1 + np.exp(- z))

def ReLU(z):
    return np.maximum(0, z)

def SigmoidBackward(z):
    a = 1 / (1 + np.exp(- z))
    dz = a * (1 - a)
    return dz

def ReLUBackward(z):
    dz = np.ones(z.shape)
    dz[z < 0] = 0
    return dz

def InitializeParameters(dims):
    np.random.seed(1)
    parameters = {}
    L = len(dims) - 1
    for l in range(1, L + 1):
        parameters['W' + str(l)] = np.random.randn(dims[l], dims[l - 1]) * 0.01
        parameters['b' + str(l)] = np.zeros((dims[l], 1))
    return parameters

def LinearForward(A_pre,W,b):
    Z = W @ A_pre + b
    return Z

def ActivationForward(A_pre,W,b,activation):
    Z = LinearForward(A_pre, W, b)
    if activation == 'sigmoid':
        A = Sigmoid(Z)
    elif activation == 'relu':
        A = ReLU(Z)
    return Z,A

def ForwardPropagation(X,parameters):
    cache = {}
    cache['Z0'], cache['A0'] = np.zeros(X.shape), X
    L = len(parameters) // 2
    for l in range(1,L+1):
        if l == L:
            cache['Z' + str(l)],cache['A' + str(l)] = ActivationForward(cache['A' + str(l - 1)], parameters['W' + str(l)], parameters['b' + str(l)],activation = 'sigmoid')
        else:
            cache['Z' + str(l)], cache['A' + str(l)] = ActivationForward(cache['A' + str(l - 1)], parameters['W' + str(l)], parameters['b' + str(l)], activation='relu')
    #print(cache.keys())
    return cache

def ComputeCost(Y, cache):
    m = Y.shape[1]
    L = len(cache) // 2 - 1
    J = - Y @ np.log(cache['A' + str(L)].T) - (1 - Y) @ np.log(1 - cache['A' + str(L)].T)
    return J / m

def LinearBackward(A_pre,dZ,W,b):
    m = A_pre.shape[1]
    dW = dZ @ A_pre.T / m
    db = np.sum(dZ, axis = 1, keepdims = True) / m
    dA_pre = W.T @ dZ
    return dA_pre,dW,db

def ActivationBackward(Z,A_pre,dA,W,b,activation):
    if activation == 'sigmoid':
        dZ = dA * SigmoidBackward(Z)
    elif activation == 'relu':
        dZ = dA * ReLUBackward(Z)
    dA_pre, dW, db = LinearBackward(A_pre, dZ, W, b)
    return dZ,dW,db,dA_pre

def BackwardPropagation(Y,cache,parameters):
    L = len(parameters) // 2
    m = Y.shape[1]
    grads = {}
    grads['dA' + str(L)] = - Y / cache['A' + str(L)] + (1 - Y) / (1 - cache['A' + str(L)])
    for l in range(L,0,-1):
        if l == L:
            grads['dZ' + str(l)], grads['dW' + str(l)], grads['db' + str(l)], grads['dA' + str(l - 1)] = ActivationBackward(Z = cache['Z' + str(l)],
                                                                                                        A_pre = cache['A' + str(l - 1)],

                                                                                                              dA = grads['dA' + str(l)],

                                                                                                                            W = parameters['W' + str(l)],
                                                                                                                            b = parameters['b' + str(l)],activation = 'sigmoid')
        else:
            grads['dZ' + str(l)], grads['dW' + str(l)], grads['db' + str(l)], grads['dA' + str(l - 1)] = ActivationBackward(Z = cache['Z' + str(l)],
                                                                                                                            A_pre = cache['A' + str(l - 1)],

                                                                                                                            dA = grads['dA' + str(l)],
                                                                                                                            W = parameters['W' + str(l)],
                                                                                                                            b = parameters['b' + str(l)],activation='relu')
    grads['dZ0'] = np.array([0]).reshape(1,1)
    grads['dW0'] = np.array([0]).reshape(1,1)
    grads['db0'] = np.array([0]).reshape(1,1)
    #print(grads.keys())
    return grads

def UpdateParameters(parameters,grads,learning_rate):
    L = len(parameters) // 2
    for l in range(1,L+1):

        parameters['W' + str(l)] = parameters['W' + str(l)] - learning_rate * grads['dW' + str(l)]

        parameters['b' + str(l)] = parameters['b' + str(l)] - learning_rate * grads['db' + str(l)]

    return parameters

def Model(X,Y,dims,learning_rate,iteration_num):

    parameters = InitializeParameters(dims)

    costs = []

    for i in range(iteration_num):

        cache = ForwardPropagation(X, parameters)

        if i % 100 == 0:

            costs.append(np.squeeze(ComputeCost(Y, cache)))

            print('time:',i,'cost:',costs[len(costs) - 1])

        grads = BackwardPropagation(Y, cache, parameters)

        parameters = UpdateParameters(parameters, grads, learning_rate)

    return parameters,costs

def Prediction(parameters,X,Y):

    L = len(parameters) // 2

    cache = ForwardPropagation(X, parameters)

    A = cache['A' + str(L)]

    p = np.zeros(Y.shape)

    m = A.shape[1]

    for i in range(m):

        if A[0,i] > 0.5:

            p[0,i] = 1

        else:

            p[0,i] = 0

    print("Accuracy: " + str(np.sum((p == Y) / m)))

    return p

train_x_orig, train_y, test_x_orig, test_y, classes = load_data()

train_x_flatten = train_x_orig.reshape(train_x_orig.shape[0], -1).T

test_x_flatten = test_x_orig.reshape(test_x_orig.shape[0], -1).T

train_x = train_x_flatten / 255

test_x = test_x_flatten / 255

n_x = train_x.shape[0]

n_y = train_y.shape[0]

dims = (n_x,20,7,5,n_y)

parameters,costs = Model(train_x, train_y, dims, learning_rate = 0.0075,iteration_num = 2500)

print('train set:')

Prediction(parameters,train_x,train_y)

print('test set:')

Prediction(parameters,test_x,test_y)

plt.plot(list(range(25)),costs)

plt.show()






Answer

Answer 1:


def ReLUBackward(z):  
    dz = np.ones(z.shape)  
    dz[z < 0] = 0  
    return dz 

dz = np.ones(z.shape)这里dZ应该是dA

Answer 2:

我也遇到了这个问题,请问你解决了吗?这个问题已经困扰我好久了


Question 1022153: 神经网络里为什么隐藏层越多越好?

统计/机器学习 深度学习 人工神经网络

神经网络里为什么隐藏层越多越好?


Answer

Answer 1:

神经网络是非线性函数聚类+线性拟合。非线性函数作用是把每层输入特征空间分割成很多小的子空间,每个子空间是一个簇;然后每个神经元在一个子空间做线性回归。类似于用很短的线段去描任意曲线。

隐藏层越多,特征空间的抽象程度越高,分割的子空间也会更小,在子空间内的数据点可能会更线性相关。打个比方,以体重划分动物,找不出人类;如果以是否用手制造工具并有复杂语言为特征,更容易把人类找出来。

隐藏层越多,训练越困难,梯度消失会更严重。还有个问题是隐藏层越多,特征抽象程度会越高,更容易过拟合。需要更大训练数据解决过拟合。

Answer 2:

神经网络是利用中间的隐藏层去学习原来在机器学习中的特征,如果隐藏层越多,那么神经网络学习到的特征就越多,那么自然学习的效果越好。但是神经网络的隐藏层不是越多越好,因为存在梯度爆炸与梯度消失问题,神经网络的层数是有存在一定限制的,同时神经网络的隐藏层越多,那么相应需要学习的参数就越多,训练时间与训练难度就越大,所以隐藏层不是越多越好。

Answer 3:

隐层越多,体现模型的 学习能力更强,能学到更多东西。但是我一般是根据实际数据训练的反馈情况来做调整的,不一定越多越好。我目前是这样理解的。

Answer 4:

肯定不是越多越好的,物极必反。需要看任务本身的复杂度和数据本身的特性。

“隐藏层越多越好”这个观点也违背奥卡姆剃刀原则了。

Answer 5:

越后面的隐藏层学得越精细,也比较抽象难解释。隐藏越多,参数越多,对数据量的要求也更大。


Question 1022201: 激活函数multi-sigmoid和softmax有什么区别?

统计/机器学习 人工神经网络

激活函数multi-sigmoid和softmax有什么区别?


Answer

Answer 1:

multi-sigmoid activation function 用于multi-label classification problem,label不是只有一个答案,也就说label y可能有多个1。比如一个x-ray胸透结果,可能诊断出有肺部感染和脓肿,但是没有胸膜增厚,没有心脏肿大或者疝气那么y = (y1=1, y2=1, y3=0, y4 = 0, y5 = 0),使用multi-sigmoid激活函数产生的概率是 prob = (0.9, 0.8, 0.2, 0.1, 0.15). 注意,这里所有的概率和并不是1,每个维度是相对彼此独立的。

softmax activation function 用于multi-class classification problem,label只能有一个答案,label y只有一个1。比如我们要判断一个图片到底是0-9里面的哪个数字,y class有10个,但是只可能有一个数字。假设这个数字是3, y = (y1 = 0, y2 = 0, y3 = 1, y4 = 0, ..., y9 = 0), 使用softmax激活函数产生概率是prob = (0.01, 0.01, 0.9, 0.01, 0.01, 0.01, 0.02, 0.01, 0.01, 0.01). 注意,这里的概率和必须相加为1,这是限制条件。

总结来说,如果你的output class是互斥的,就用softmax, 反之用sigmoid。



Question 1022204: Keras模型针对同一数据集做fit和evaluation,accuracy值却不相同

统计/机器学习 人工神经网络 TensorFlow

模型是一个很简单的模型:

inputs = Input(shape=(X_train.shape[1],))
nb_x_1 = BatchNormalization()(inputs)
dense_x_1 = Dense(64, activation='relu')(nb_x_1)
nb_x_2 = BatchNormalization()(dense_x_1)
dense_x_2 = Dense(64, activation='relu')(nb_x_2)
predictions = Dense(1, activation='sigmoid')(dense_x_2)

optmzr = keras.optimizers.Adagrad()

model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer=optmzr,
              loss="binary_crossentropy",
              metrics=['accuracy'])

但针对一个数据集进行fit后(截图只有一个epoch,但之前还经过了多个epoch的fit),显示accuracy是0.98,而立即针对同一数据集做evaluation,显示accuracy只有0.48,loss也从0.12变到了0.75,差别还挺大


我也进行过一些搜索,例如:https://github.com/keras-team/keras/issues/6977   但没有找到什么有价值的答案。


希望高人相助!多谢多谢!


Answer

Answer 1:

BatchNorm() 在evaluation下会被关掉


Question 1022221: BatchNormalization这一层一般有哪些参数需要调?

统计/机器学习 深度学习 人工神经网络

BatchNormalization这一层一般有哪些参数需要调?


Answer

Answer 1:

BN里有两个参数,但是不是超参,不是调出来的,是学习出来的。

BN里的两个参数是scale和shift,这两个参数是通过训练来学习到的,用来对变换后的激活反变换,使得网络表达能力增强,即对变换后的激活进行如下的scale和shift操作

$$y = \gamma x + \beta$$


Question 1022277: hidden size

统计/机器学习 深度学习 自然语言处理 人工神经网络

hidden size  到底是什么呀 


Answer

Answer 1:

问题描述不清晰。

什么模型的hidden size?

hideen size 你是想问hidden variable的作用还是hidden size中size大小对模型的影响?


Question 1022330: 反向传播和梯度算法概念???反向传播是指反向传播算法,还是反向传播算法中的一个过程?

统计/机器学习 深度学习 人工神经网络

谢谢


Answer

Answer 1:

反向传播算法是指误差函数在网络中的梯度传播。只不过反向传播是从输出层反向到输入层的逐层求导。如果说的是反向传播算法,就是误差函数对输入层求导。


Question 1022363: 为什么RNN会有梯度消失的问题,LSTM是怎么解决梯度消失的?

统计/机器学习 深度学习 人工神经网络

RNN为什么会有梯度消失的问题?LSTM为什么可以解决梯度消失?


Answer

Answer 1:

根据我的理解,RNN的Memory会在不断的传播中指数型累积,而LSTM邮5个Gate会根据你的输入对memory进行处理,或是保留或是删除,可以解决梯度消失的问题。


Question 1022462: 请问深度学习算法中的梯度消失的原理是什么?如何能通俗理解

统计/机器学习 深度学习 人工神经网络

请问深度学习算法中的梯度消失的原理是什么?如何能通俗理解,我看到RNN和循环神经网络中总是涉及梯度消失


Answer

Answer 1:

梯度消失就是当x自某一点至无穷时,曲线平缓(导数几乎为0)


来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。