- Sep 2018
-
192.168.199.102:5000 192.168.199.102:5000
-
什么样的情形可以使用 CNN
记忆: 小抠样
记忆:small, regions, subsampling
- 某些pattern远小于整张图片
这个是说 filter 一般采取小于整张图片的形状
- 同样的pattern出现在图片的不同位置
这个是说 filter 会逐行逐列移动扫描整张图片
- subsampling 没有什么影响
这个是说 pooling 是切割图片为多块,每块只取一格(1 pixel)
关于 subsampling
这里的意思是说,对于 featuremap 如果池化层 size = 2*2 , maxpooling 会只去最大的一个值(averagePooling 会取平均,但也只是一个值)而忽略其他值。这件事情的物理意义是:featuremap 是由 filter 扫描整张图片得到的,某个pattern(pattern较大,stride较小时)可能被多次扫描到并体现在 featuremap 中类似于 \([0,1,2,5,2,1,0]\),直接丢弃这种长尾效应的尾对判定该某个pattern的位置以及匹配程度是没有任何影响的,他完全可以被最大的那个
5
hold住。长尾效应的取舍
围棋(连续型pattern) vs. 图像识别(离散型pattern)
图像识别就是这种最大值可以完全hold位置以及匹配程度信息的任务。可是对于其他任务比如围棋,他的核心任务虽然也是识别某个模式,但长尾效应的尾部是有作用的。
在图像识别中被识别的模式是独立的或者叫离散的 --- 一个圆的是形状是眼睛,3/4个圆就不是眼睛了。在围棋中 \([0,1,2,5,2,1,0]\) 那些\(0,1,2\)对判断当前棋子所处的状态是有影响的,甚至他可能更重视长尾效应中的尾。
结论
所以,对于是否使用 maxpooling 层要根据你的具体任务来做具体对待:
当任务识别的pattern‘’比较离散”---目标仅仅是寻找和定位pattern,别无其他 适合加上 maxpooling,让模型更专注,也让模型参数更少。
当任务识别的pattern“比较连续”---长尾效应之尾会影响任务目标 最好不加 maxpooling,这样模型可以保存更多现场信息,让结果更精确。
像围棋这种任务,显然就不能使用纯粹的CNN(包含 maxpooling),所以 alpha-go 中没有使用 maxpooling.
-
从可视化某个filter or neuron的激活度到deepdream
google 的 deepdream 的核心思想就是借用最大化某个filter or neuron.不同的是 deepdream 不是单纯“最大化某个filter or neuron的输出”,而是针对某层,让该层神经元原本输出大的更大,原本输出小的更小。,亦即,
CNN of deepdream exaggerates what it sees
assume output of k-th hidden layer is
\(output_k = [3.9, -1.5, 2.3, ...]\)
正的扩大,负的缩小
\([3.9\Uparrow, -1.5\Downarrow, 2.3\Uparrow, ...]\)
成为
\(output_k' = [10, -5, 8, ...]\)
以其为目标,找到 \(x^\star\)
\(x^\star = argmin_x(output_k - output_k')\)
从 deepdream 到 deepstyle
之前都是只考虑了输出这件事,不论是 filter or neuron 还是某一层 hidden layer 我们关注的都是输出。现在如果我们把filter 和 filter 之间的 correlation 纳入考虑范畴。就可以实现风格迁移,这就是 deepstyle 的核心思想。
一个训练好的 CNN,输入某张图片,获取某一层 hidden layer 的输出(取内容);
一个训练好的 CNN,输入某张图片,获取某一层 hidden layer 的correlation(取风格);
目标是:找到一个 \(x\),他经过CNN得到的相同层 hidden layer 的内容像步骤1中的;风格像步骤2中的。
-
如何展示某个 filter 学到了什么
也就是什么样的图片可以让 filter 被激活(度高)
定义: 核的激活度
Degree of the activation of k-th filter, 核激活度表示这个 filter 被激活的程度, 他等于该filter输出的 featuremap 矩阵的所有元素的和(一个 filter 只会生成dim=1的featuremap)。
\(k-th\ filter\ is\ a\ matrix : A^k\)
assum \(A^k\) is a 11 * 11 matrix
\(element\ of\ A^k: a_{ij}^k\)
\(degree\ of\ activation\ of\ k-th\ filter: a^k = \sum_{i=1}^{11}\sum_{j=1}^{11}a_{ij}^k\)
我们的目标是:找一张img,他可以让这个filter被激活度最大
\(img^\star = argmax_{img}a^k\) , 亦即
\(x^\star = argmax_{x}a^k\)
我们使用 Gradient Ascent 去更新 \(x\) 使得某个filter的被激活度 \(a^k\) 最大。
如何展示某个 neuron 学到了什么
也就是什么样的屠屏可以让 neuron 被激活。
定义:神经元的激活度
某个神经元的激活度,很简单,就是这个神经元的输出。
第 j 个神经元的输出记做 \(a^j\)
我们的目标是: 找一张img, 他可以让这个neuron的输出最大
\(img^\star = argmax_{img}a^j\) , 亦即
\(x^\star = argmax_{x}a^j\)
同上,也使用 Grandient Ascent.
如何展示某个输出层 neuron 学到了什么
其他同上
\(img^\star = argmax_{img}a^j\) , 亦即
\(x^\star = argmax_{x}y^j\)
由于是输出层神经元,如果我们在做手写数字识别mnist的话,那么输出层神经元应该有10个(对应数字 0~9),我们是否可以据此产生图片了?类似生成模型。
但结果并不如人意料,机器学出的东西与人类理解的东西有非常大的不同。我们确实可以通过这种GradientAscent的方法找到10张图片,他们也确实可以被模型正确分类到10个类别中,但这10张图片却无法被人类识别。
话腐朽为‘数字’
但我们依然可以对这些数字做一些处理(对 \(x^\start\) 做一些限制 --- 加一些 constraints),让他看起来像是数字:
\(x^\star = argmax_{x}y^j\)
change to:
\(x^\star = argmax_{x}(y^i - \sum_{i,j}|x_{ij}|)\)
类比 L1-regularization of GD on w:
\(||\Theta||_1 = |w_1| + |w_2| + ...... + |w_N|\)
\(L^{'}(\Theta) = L(\Theta) + \lambda ||\Theta||_1\)
\(w^\star = argmin_wL'(\Theta))\)
\(w^\star = argmin_{w}(L + \sum_{i=1}^{dim}|w_{i}|)\)
加上这个限制的意思是,人类可以识别的数字图片(灰度图)应该是大部分为0,小部分为正,并且为正的部分应该相连。
我们给原始的 \(argmax\) 公式加入 \(L1\) 正则项,让这个 x 可以尽量的稀疏(这是 L1 的特点),也就是大部分 x 的元素是 0,少量为1.
-
keras 中卷积层的形状问题
model.add( Convolution2D(25, 3, 3, input_shape=(1,28,28)) ) model.add( MaxPooling2D((2,2)) )
我们平时表示RGB彩图时,习惯将 通道 维度放在最后:
(高,宽,通)
,opencv/pil/numpy/scikit 处理图片都是采用这种方式,但在 tensorflow/keras 中使用的是(通,高,宽)
的表达方式。所以:Convolution2D(25,3,3, input_shape=(1,28,28))
- 表示卷积层有
25
个size=3*3
的 filter - 输入图片是灰度图像
(channel_dim=1)
, 图片size=28*28
对比 Dense Layer:
Dense(input_shape=(1,28,28), units=800, activation='relu')
可以看出,
卷积层只是说明了本层权重的一些信息(filter就是权重) ,而神经元数目则交给系统自动推算; 全连接层则直接指明了本层神经元的数目。
卷积层和池化层形状推算
Convolution2D(25,3,3, input_shape=(1,28,28))
会输出一个形状为
(25, (28-3+1), (28-3+1))
的 feature map。卷积层输出形状推算公式为:
- i --- 本层
- i-1 --- 前一层
\(Convol:\) \(feature \ map \ size =(filterNumber_i, imgHeight_{i-1} - filterHeight_i + 1, imgWidth_{i-1} - filterWidth_i + 1)\)
MaxPooling2D((2,2))
会输出一个形状为
(25, 13, 13)
的 feature map.池化层输出形状推算公式为:
- i --- 本层
- i-1 --- 前一层
\(Pooling:\) \(feature\ map\ size= (filterNumber_{i-1}, imgHeight_{i-1}//poolHeight_i, imgWidth_{i-1} // poolWidth_i)\)
//
的意思是 celing division,5//2=2
卷积层和池化层参数量推算
卷积层参数量推算公式:
- i --- 本层
- i-1 --- 前一层
\(Convol_{paraNum}=filterNumber_{i-1} * filterNumber_i * filterHeight_i * filterWidth_i\)
model.add(Convolution2D(25,3,3,input_shape=(1,28,28))) model.add(MaxPooling2D((2,2))) model.add(Convolution2D(50,3,3))
第一个卷积层的总参数量为: 1 25 3 * 3
第二个卷积层的总参数量为: 25 50 3 * 3
- 表示卷积层有
-
简单记忆训练 DNN 的技巧:
对于坏习惯, 早弃则自活
前三个针对训练误差小测试误差大的情况;
后两个针对训练误差就很大的情况;
tips for good training but bad testing
- (早)Early Stopping
- (弃)Dropout
- (则)Regularization
tips for bad training
- (自)Adaptive learning rate(optimizer)
- (活)New activation function
dropout
- 训练的时候
每一次更新参数之前(我们一般一个 mini-batch 更新一次参数,也就是每个 mini-batch 都对神经元做一次随机丢弃),对每一个神经元(包括input layer,这点要注意)做丢弃:
1 mini-batch -> 1 dorpout -> 1 thin-network
每一个神经元都有 p% 几率被丢弃,所有与被丢弃的神经元相连的权重 w 也都会被丢弃,这样整个网络的结构就变了,深度不变宽度变窄。
dropout 毫无疑问会让训练结果变差,因为整体模型复杂度降低了。
- 测试的时候
需要注意两点:
- 测试的时候不对神经元做丢弃
- 测试的时候每个权重都乘以 (1-p%): w * (1-p%)
为什么 dropout 测试机权重需要乘以 (1-p%)
假设 dropout rate 设为 50%, 在训练的时候我们得到的某个神经元的输出 \(z\) ,是丢弃了输入层一半的神经元及权重得到的:
\(z=f([x1,x2,x3,x4])\) --> \(z=f([x1,x4])\)
在测试的时候这个由于不做任何丢弃:
\(z=f([x1,x2,x3,x4])\))
该神经元的输出大约会是原来的两倍:
\(f(\vec{x}) = w * x + b\)
\(f([x1,x2,x3,x4]) \approx 2 * f([x1,x4])\)
\(w_{new} = 0.5 * w_{old}\) ,这样:
\(f([x1,x2,x3,x4]) \approx f([x1,x4])\)
-
one step further
为了防止 overfitting,防止参数量太多而引起的数据集和模型的优化方向 mis-match 的情况。我们经常人为设定:
\(\Sigma_1 = \Sigma_2\)
需要说明的是:如果做了公用 \(Sigma\) 这种假设的话,最后得到的就是一个直线边界,不做这一假设的话得到的是一个曲线边界。
likelihood 公式就变成:
\(N1 = num(samples of C1)\)
\(N2 = num(samples of C2)\)
\(L(\mu_1, \mu_2, \Sigma) = f_{\mu_1,\Sigma}(x^1)f_{\mu_1,\Sigma}(x^2)f_{\mu_1,\Sigma}(x^3)......f_{\mu_1,\Sigma}(x^{N1}) * f_{\mu_2,\Sigma}(x^1)f_{\mu_2,\Sigma}(x^2)f_{\mu_2,\Sigma}(x^3)......f_{\mu_2,\Sigma}(x^{N2})\)
对上面的式子可以通过微分,或者直接记住下面的公式解(其中 \(\mu_1\) \(\mu_2\) 跟原来一样,都是 样本的均值,\(\Sigma\) 是某类别的样本比例作为权重的 \(\Sigma\) 之和):
\(\mu_1 = avg(sample of C1)\)
\(\mu_1 = avg(sample of C1)\)
\(\Sigma = \frac{N_1}{N_1+N_2}\Sigma^1 + \frac{N_2}{N_1+N_2}\Sigma^2\)
-
直接用【线性回归】模型解【分类问题】的弊端
线性回归的标签值 \(y\) 都是实数(亦即可能任意大or任意小),同时线性回归的代价函数是平方误差 \((y-\hat{y})^2\) --- square error. 而代价函数又会通过 GD 直接影响 w 和 b --- 分界线。
在分类问题中,无论错误程度多高,错点的代价永远算作‘1’;而在线性回归中,做错点的代价与他的错误程度平方正比(远大于1)。两者的代价函数不一样,两者得到的函数(分界线)就肯定不一样。
-
从逻辑斯回归到神经网络
logistic regression 有非常严格的使用限制,线性可分。
logistic regression 虽然可以理解为对分布的近似,但其本质仍然是一个直线分界线,因为他也是要求出 w 和 b,使用的函数集仍然是 wx+b = y , 也就是要求数据集必须是线性可分的。
如果遇到线性不可分的数据集,可以考虑采用特征转换。但如何做特征转换呢?
一个很好的方法是cascading logistic regression models --- 把很多个 logistic regression 接起来,就可以做到这件事情。这个东西有点像是在解释 NN,以及为什么他可以做到自动化 feature transform, 然后做分类。
李老师由此引入 "Neuron" 概念:
每一个逻辑斯模型的输入可以是其他逻辑斯模型的输出。
他们可以串在一起形成一个网络,这个网络就叫做神经网络。
-
多分类任务
主要就是利用 softmax:
第一步:计算 score
z1 = w1 * x + b1
z2 = w2 * x + b2
z3 = w3 * x + b3
第二步:对 score 做 exponential normalization
\(y_{1} = \frac{e^{z_{1}}}{\sum^3_{j=1}e^{z_{j}}}\)
\(y_{2} = \frac{e^{z_{2}}}{\sum^3_{j=1}e^{z_{j}}}\)
\(y_{3} = \frac{e^{z_{3}}}{\sum^3_{j=1}e^{z_{j}}}\)
第三步:以 yi 表示 P(Ci | x) --- x 属于第i个分类的预测概率
\(y_i = P(C_i | x)\)
为什么叫做 softmax 呢? exponential 函数会让大小值之间的差距变的更大,换言之他会强化最大值。
-
生成模型 vs. 判别模型
总体来看,如果样本足够多,判别模型的正确率高于生成模型的正确率。
生成模型和判别模型最大的区别在于,生成模型预先假设了很多东西,比如预先假设数据来自高斯,伯努利,符合朴素贝叶斯等等,相当于预先假设了 Hypothesis 函数集,只有在此基础上才有可能求出这个概率分布的参数。
生成模型,进行了大量脑补。脑补听起来并不是一件好事,但是当你的数据量太小的时候,则必须要求你的模型具备一定的脑补能力。
判别模型非常依赖样本,他就是很传统,死板,而生成模型比较有想象力,可以“想象”出不存在于当前样本集中的样本,所以他不那么依赖样本。
关于 想象出不能存在于当前样本集的样本 ,见本课程 40:00 老师举例。
生成模型在如下情形比判别模型好:
- 数据量较小时。
- 数据是noisy,标签存在noisy。
- 先验概率和类别相关的概率可以统计自不同的来源。
释疑第三条优点:老师举例,在语音辨识问题中,语音辨识部分虽然是 DNN --- 一个判别模型,但其整体确实一个生成模型,DNN 只是其中一块而已。为什么会这样呢?因为你还是要去算一个先验概率 --- 某一句话被说出来的概率,而获得这个概率并不需要样本一定是声音,只要去网络上爬很多文字对话,就可以估算出这个概率。只有 类别相关的概率 才需要声音和文字pair,才需要判别模型 --- DNN 出马。
-
-
github.com github.com
-
@mingrutar - Correction: config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config)
当运行 keras 进行模型训练时,如果遇到以下错误:
failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
可以添加这样的语句,如此之后可以正常运行了。
Tags
Annotators
URL
-
- Nov 2017
-
genomebiology.biomedcentral.com genomebiology.biomedcentral.com
-
MCC
Matthews correlation coefficient
-
- Oct 2017
- Jun 2017
-
offconvex.github.io offconvex.github.io
-
One explanation of Non-convex optimization
Tags
Annotators
URL
-
- May 2017
-
www.analyticsvidhya.com www.analyticsvidhya.com
-
Precision: It is a measure of correctness achieved in positive prediction i.e. of observations labeled as positive, how many are actually labeled positive. Precision = TP / (TP + FP) Recall: It is a measure of actual observations which are labeled (predicted) correctly i.e. how many observations of positive class are labeled correctly. It is also known as ‘Sensitivity’. Recall = TP / (TP + FN)
Example: In cancer research you may want higher recall, Since you want all actual positive observations to classified as True Positive. A lower Precision maybe alright because some healthy people classified as cancerous can be rectified later.
-
- Apr 2017
-
demo.clab.cs.cmu.edu demo.clab.cs.cmu.edu
-
if your goal is word representation learning,you should consider both NCE and negative sampling
Wonder if anyone has compared these two approaches
-
- Feb 2017
-
sebastianraschka.com sebastianraschka.com
-
Feature scaling in depth tutorial
-
- Dec 2015
-
cs231n.stanford.edu cs231n.stanford.edu
-
some of the deep learning libraries we may look at later in the class
what c++ libraries are used?
-
- Apr 2015
-
arxiv.org arxiv.org
-
Same as above but the pre- trained vectors are fine-tuned for each task.
How?
Backpropagating to the input layer, changing the vector representation with the training examples?
-
- Sep 2014
-
sites.psu.edu sites.psu.edu
-
you
us
-
you
we
-
your
our
-
your
our
-
your
our
-
ethical challenges.
the ethical challenges you will come up against along the way.
-