225 Matching Annotations
  1. Sep 2018
    1. 什么样的情形可以使用 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.

    2. 从可视化某个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 的核心思想。

      1. 一个训练好的 CNN,输入某张图片,获取某一层 hidden layer 的输出(取内容);

      2. 一个训练好的 CNN,输入某张图片,获取某一层 hidden layer 的correlation(取风格);

      目标是:找到一个 \(x\),他经过CNN得到的相同层 hidden layer 的内容像步骤1中的;风格像步骤2中的。

    3. 如何展示某个 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.

    4. 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))

      1. 表示卷积层有 25size=3*3 的 filter
      2. 输入图片是灰度图像(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

    5. 简单记忆训练 DNN 的技巧:

      对于坏习惯, 早弃则自活

      前三个针对训练误差小测试误差大的情况;

      后两个针对训练误差就很大的情况;

      tips for good training but bad testing

      1. (早)Early Stopping
      2. (弃)Dropout
      3. (则)Regularization

      tips for bad training

      1. (自)Adaptive learning rate(optimizer)
      2. (活)New activation function

      dropout

      • 训练的时候

      每一次更新参数之前(我们一般一个 mini-batch 更新一次参数,也就是每个 mini-batch 都对神经元做一次随机丢弃),对每一个神经元(包括input layer,这点要注意)做丢弃

      1 mini-batch -> 1 dorpout -> 1 thin-network

      每一个神经元都有 p% 几率被丢弃,所有与被丢弃的神经元相连的权重 w 也都会被丢弃,这样整个网络的结构就变了,深度不变宽度变窄。

      dropout 毫无疑问会让训练结果变差,因为整体模型复杂度降低了。

      • 测试的时候

      需要注意两点:

      1. 测试的时候不对神经元做丢弃
      2. 测试的时候每个权重都乘以 (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])\)

    6. 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\)

    7. 直接用【线性回归】模型解【分类问题】的弊端

      线性回归的标签值 \(y\) 都是实数(亦即可能任意大or任意小),同时线性回归的代价函数是平方误差 \((y-\hat{y})^2\) --- square error. 而代价函数又会通过 GD 直接影响 w 和 b --- 分界线。

      在分类问题中,无论错误程度多高,错点的代价永远算作‘1’;而在线性回归中,做错点的代价与他的错误程度平方正比(远大于1)。两者的代价函数不一样,两者得到的函数(分界线)就肯定不一样。

    8. 从逻辑斯回归到神经网络

      logistic regression 有非常严格的使用限制,线性可分。

      logistic regression 虽然可以理解为对分布的近似,但其本质仍然是一个直线分界线,因为他也是要求出 w 和 b,使用的函数集仍然是 wx+b = y , 也就是要求数据集必须是线性可分的

      如果遇到线性不可分的数据集,可以考虑采用特征转换。但如何做特征转换呢?

      一个很好的方法是cascading logistic regression models --- 把很多个 logistic regression 接起来,就可以做到这件事情。这个东西有点像是在解释 NN,以及为什么他可以做到自动化 feature transform, 然后做分类。

      李老师由此引入 "Neuron" 概念:

      每一个逻辑斯模型的输入可以是其他逻辑斯模型的输出。

      他们可以串在一起形成一个网络,这个网络就叫做神经网络。

    9. 多分类任务

      主要就是利用 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 函数会让大小值之间的差距变的更大,换言之他会强化最大值。

    10. 生成模型 vs. 判别模型

      总体来看,如果样本足够多,判别模型的正确率高于生成模型的正确率。

      生成模型和判别模型最大的区别在于,生成模型预先假设了很多东西,比如预先假设数据来自高斯,伯努利,符合朴素贝叶斯等等,相当于预先假设了 Hypothesis 函数集,只有在此基础上才有可能求出这个概率分布的参数。

      生成模型,进行了大量脑补。脑补听起来并不是一件好事,但是当你的数据量太小的时候,则必须要求你的模型具备一定的脑补能力。

      判别模型非常依赖样本,他就是很传统,死板,而生成模型比较有想象力,可以“想象”出不存在于当前样本集中的样本,所以他不那么依赖样本。

      关于 想象出不能存在于当前样本集的样本 ,见本课程 40:00 老师举例。

      生成模型在如下情形比判别模型好:

      1. 数据量较小时。
      2. 数据是noisy,标签存在noisy。
      3. 先验概率和类别相关的概率可以统计自不同的来源。

      释疑第三条优点:老师举例,在语音辨识问题中,语音辨识部分虽然是 DNN --- 一个判别模型,但其整体确实一个生成模型,DNN 只是其中一块而已。为什么会这样呢?因为你还是要去算一个先验概率 --- 某一句话被说出来的概率,而获得这个概率并不需要样本一定是声音,只要去网络上爬很多文字对话,就可以估算出这个概率。只有 类别相关的概率 才需要声音和文字pair,才需要判别模型 --- DNN 出马。

    1. @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

      可以添加这样的语句,如此之后可以正常运行了。

  2. Nov 2017
  3. Oct 2017
  4. Jun 2017
  5. May 2017
    1. 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.

  6. Apr 2017
    1. if your goal is word representation learning,you should consider both NCE and negative sampling

      Wonder if anyone has compared these two approaches

  7. Feb 2017
  8. Dec 2015
    1. some of the deep learning libraries we may look at later in the class

      what c++ libraries are used?

  9. Apr 2015
    1. 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?

  10. Sep 2014