rcnn 为什么使用svm不适用faster rcnn softmaxx

你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
要回复问题请先或
关注: 1 人晓雷机器学习笔记 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"title":"线性回归","author":"xiao-lei-75-81","content":"【监督学习概述】假如我们有如下数据,如何根据 房屋面积 和 房间数量来预测房屋价格呢?显然用编程的方式是不可行的,因为我们找不出这些数据存在什么规律(模式),我们可以采用机器学习来尝试解决这个问题。具体流程如下:
1. 根据现有数据 采用某种机器学习方法 学得一个模型h (hypothesis)。 2 使用模型h进行预测。
几个关键点: (后文会做详细解释,此处了解即可)学习算法: 根据预测目标是离散还是连续分别对应分类算法 和 回归算法。根据h是否带有参数划分为参数方法 或非参数方法, 学习原理大概是: 几何原理,概率统计原理,仿生学原理(例如神经网路)
h: hypothesis 的本质是一个从输入到输出的映射,也就是说我们要从训练数据中学习一个满足该数据模式的映射h,它的表达形式可以是 普通函数 或 概率密度函数等【线性回归】分类/回归:回归参数/非参:参数方法学习原理:统计h: 普通函数线性回归就是用线性方程去拟合数据,即取h为如下形式:其中 x_{1} ,x_{2}
分别代表 房屋面积和房间数量,\\theta_{0} , \\theta_{1} , \\theta_{2}
是需要学习的参数,显然它属于参数方法。为了书写方便一般我们引进 x_{0} = 1 这样就可以有 h_{\\theta} = \\theta_{0} x_{0} + \\theta_{1} x_{1} + \\theta_{2} x_{2} = \\sum_{i=0}^{n} \\theta_{i} x_{i} = \\bm \\theta ^ \\mathrm{ T } \\bm
x接下来的问题是: 我们如何学习参数 \\bm \\theta ?最直观的想法是: 让模型h_{\\theta}\n 的预测结果h_{\\theta} (\\bm x^i) 尽量接近
y^{i} 。为此我们定义衡量接近程度的损失函数:它反映了模型对训练数据的拟合程度: J( \\theta)
越小 说明拟合的越好。如此看来我们通过求解 min \\; J(\\theta) \\\\\n
,即可得到参数 \\bm \\theta =
\n\\begin{pmatrix}\n \n\\theta_{0} \\\\ \n\\theta_{1} \\\\ \n\\theta_{2} \\\\ \n \\end{pmatrix}\n。求解的方法有很多,此处介绍 梯度下降法,normal equations。梯度下降法 ( gradient descent)
梯度下降的主要思想是: 先随机初始化一个值,然后按照某种策略逐渐逼近最小点。它是一种搜索算法。而根据多元微积分,梯度的方向是下降最快的方向,如下图蓝色线:图中向量 \\vec {QP} 是梯度方向, 如果我们想以最快速度从最外面的P点靠近中心点 第一步就是从 P到Q: \\vec{OQ}
\\vec{OP} - \\alpha \\vec{QP} = \\begin{pmatrix}\n\\theta_{0}^{p} \\\\ \n\\theta_{1}^{p} \\\\ \n\\theta_{2}^{p} \\\\ \n \\end{pmatrix}\n- \n\\begin{pmatrix}\n
\\frac{\\partial J) }{\\partial \\theta_{0}}
\\frac{\\partial J }{\\partial \\theta_{1}}
\\frac{\\partial J }{\\partial \\theta_{2}}
\\\\ \n \\end{pmatrix}\n=\n\\begin{pmatrix}\n\\theta_{0}^{p} -
\\alpha \\frac{\\partial J) }{\\partial \\theta_{0}}
\\\\ \n\\theta_{1}^{p} - \\alpha \\frac{\\partial J }{\\partial \\theta_{1}}
\\\\ \n \\theta_{2}^{p} - \\alpha \\frac{\\partial J }{\\partial \\theta_{2}}
\\\\ \n \\end{pmatrix}\n= \n\\begin{pmatrix}\n\\theta_{0}^{Q} \\\\ \n\\theta_{1}^{Q} \\\\ \n\\theta_{2}^{Q} \\\\ \n \\end{pmatrix}\n即: 对于每一个参数\\theta_{j}
通过 执行下面公式可以逐步找到最小值点: 将
\\frac{\\partial J(
\\theta) }{\\partial \\theta_{j}}
\\frac{\\partial }{\\partial \\theta_{j}}
\\frac{1}{2}
\\sum_{1}^{m}( h_{\\theta}( x^{(i)}) -y^{(i)}
)^2 = \\sum_{1}^{m}( h_{\\theta}( x^{(i)}) -y^{(i)}
) x_{j}^{(i)} 带入上式得:上式表明:如果遇到错误率较大的数据则更新的幅度也会相应较大,遇到错误率较小的数据更新幅度也会变小。具体的实现过程有两种方式:批量梯度下降(batch gradient descent) : 这种方式先遍历所有训练数据训练数据求得一个 参数 \\theta_{i}, 再重复该过程得到 \\theta_{i+1}。该算法可以整体上描述为:由于每次循环都要遍历完所有的训练数据,当数据量较大时求解过程应该收敛的很慢。随机梯度下降法( stochastic gradient descent ): 先遍历一个训练数据的所有特征,再遍历下一个训练数据。它总是每次前进一小步,最终到达最优点。通常比批量梯度下降收敛更快。方程式法 (The normal equations)我们想把J(\\theta) 用矩阵的形式表示出来,这样就可以直接利用矩阵进行求解。表示方法如下:只需让 X\\theta - \\bm y 的每一个元素取平方即可得到 J(\\theta)。 由 z^{\\rm T} z = \\sum z_{i}^2 即可得到 :
求解方法如下: 用到了很多矩阵计算的公式。统计学解释为什么损失函数 J(\\theta) 作为一种学习指标是有效的? 实际上我们可以给它赋予统计学意义。总的来说: 采用最大似然估计法使得训练数据出现的概率最大可以推导出此时必然有 J(\\theta) 取最小。 假设对于每一个训练数据: 其中 \\epsilon^{i} 是一个误差项,它代表没有被模型考虑到的影响因素或者随机噪声。由概率统计学知识可知,多个影响因素的叠加一般是呈正态分布的。
所以此处的 \\epsilon^{i} 假设为高斯分布且都是 独立同分布(IID)(即每一个样本都是独立同分布) p(\\epsilon^{(i)}) = \\frac {1}{\\sqrt{2\\pi}}
\\exp \\left ( - \\frac{ (\\epsilon ^{(i)} ) ^ 2
}{2 \\sigma^2}
\n\\Rightarrow\n p( y^{(i)} - \\theta^{T}x^{(i)} )
= \\frac {1}{\\sqrt{2\\pi}}
\\exp \\left ( - \\frac{ (y^{(i)} - \\theta^{T}x^{(i)}
}{2 \\sigma^2}
= p(y^{(i)} | x^{(i)} ; \\theta )\n记训练数据为: X = \\begin{pmatrix}\n x_{0}^{(1)} & \\cdots & x_{n}^{(1) }\\\\ \n \\vdots & \\ddots & \\vdots\\\\ \n x_{0}^{(m)} & \\cdots & x_{n}^{(m)}\n \\end{pmatrix}
对应的样本结果为 \\vec{y} = \n\\begin{pmatrix}\ny^{(1)} \\\\\ny^{(2)} \\\\\n\n\\vdots \\\\\ny^{(m)} \\\\\n\\end{pmatrix}
,那么训练数据的出现的概率为:即有似然函数: 由于每个样本都是独立同分布,所以整个训练数据的概率等于单个样本的乘积:根据最大似然估计法,求解 L(\\theta) 较困难,但是 求解与 L(\\theta) 单调性一致的 l(\\theta) = logL(\\theta)
会容易一些:接着求解 max \\; l(\\theta) = min \\frac {1}{2} \\sum_{i=1}^{m}( y^{(i)}
- \\theta ^Tx^{(i)})^2 = min \\; J(\\theta) 。
(一个小细节:l(\\theta) 取最大值与 \\sigma无关。)推导完毕。局部加权线性回归 (LWR)最后,我们再来看一个线性回归的变种。局部加权线性回归的思想是: 当我们想要预测 x 时,只对它附近的点做线性回归。 图中红色线附近的点意味着只需要考虑待测点附近的几个样本。那么关键就在于怎么用一种数学形式来表达 局部选中 。 如果能有一个 窗函数 w (绿色部分) 在待测点附近 取值为1 其它地方取值 为 0 , 让 y \\cdot
w就可以达到我们的目的。但是窗函数的数学形式不够友好,我们一般用 如下函数:它的图像大概是: 再 待测点 x 处 大致取值为 1现在我们根据下图推导出它的数学表示式:横轴表示 某个属性 (例如 房子面积) ,纵轴表示 实际值 (例如房价)
,蓝色点对应
某一条训练数据 y ,绿色点代表
拟合的直线 \\theta^Tx ,黑色点代表 窗函数 w 。表示出 某一点处 预测值与实际值的误差: ( y^{(i)} - \\theta^Tx^{(i)} ) ^2再乘以 该点对应的 窗函数 w 的值 (相当于权重)
得到: w^{(i)} ( y^{(i)} - \\theta^Tx^{(i)} ) ^2 然后求和: \\sum_{i} w^{(i)} ( y^{(i)} - \\theta^Tx^{(i)} ) ^2
即为新的 损失函数 J(\\theta)现在回归问题变成了:它的拟合图像大致是下图红色的线, 也就不会出现下图 黑色线 那种 偏差很大的拟合结果了。","updated":"T14:02:31.000Z","canComment":false,"commentPermission":"anyone","commentCount":5,"likeCount":20,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T22:02:31+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-0af21817cd_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":5,"likesCount":20},"":{"title":"logistic regression","author":"xiao-lei-75-81","content":"logistic regression 用于 二分类问题: y \\in \\{ 0, 1\\}由上一篇可知 线性回归 会拟合出 一条直线, 如果我们想把它用于分类,一种办法就是 把 该线性函数 加一层映射, 映射到
(0, 1) 空间, 然后设置一个阈值 超过该 值 取 分类1 ,否则取分类 0, 这样就达到了目的。
(不过我们实际上操作并没有 完全按照这个思路,具体见下文)【学习阶段】具体来说:增加的一层映射函数为(logistic function or the sigmoid function):拟合函数为:如何训练模型的参数 \\theta ?
可以用极大似然法。假设1: 拟合函数是 出现x时为分类1 的概率 把两个函数统一在一起: 假设2: 各个训练样本是独立同分布的(IID)那么由极大似然估计:如何求解 似然函数的最大值?
类似线性回归中的 梯度下降法,此处我们用 梯度上升法( gradient ascent) : 对于仅有一个训练样本点的情况:上式 第1步到 第2步的推导用到了公式:所以我们得到到了 随机梯度上式的递进规则 ( stochastic gradient ascent rule): 具体推导请看
中的相关内容。【 预测阶段】h(\\theta) & 0.5 \\Rightarrow
y =1 \\\\\nh(\\theta) &= 0.5 \\Rightarrow
y = 0[代码]def stocGradAscent1(dataMatrix, classLabels):\n
m,n = shape(dataMatrix)\n
alpha = 0.01\n
weights = ones(n)
#initialize to all ones\n
for i in range(m):\n
h = sigmoid(sum(dataMatrix[i]*weights))\n
error = classLabels[i] - h\n
weights = weights + alpha * error * dataMatrix[i]\n
return weights\ndef classifyVector(inX, weights):\n
prob = sigmoid(sum(inX*weights))\n
if prob & 0.5: return 1.0\n
else: return 0.0\ndef colicTest():\n
frTrain = open('horseColicTraining.txt'); frTest = open('horseColicTest.txt')\n
trainingSet = []; trainingLabels = []\n
for line in frTrain.readlines():\n
currLine = line.strip().split('\\t')\n
lineArr =[]\n
for i in range(21):\n
lineArr.append(float(currLine[i]))\n
trainingSet.append(lineArr)\n
trainingLabels.append(float(currLine[21]))\n
trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)\n
errorCount = 0; numTestVec = 0.0\n
for line in frTest.readlines():\n
numTestVec += 1.0\n
currLine = line.strip().split('\\t')\n
lineArr =[]\n
for i in range(21):\n
lineArr.append(float(currLine[i]))\n
if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):\n
errorCount += 1\n
errorRate = (float(errorCount)/numTestVec)\n
print \"the error rate of this test is: %f\" % errorRate\n
return errorRate\n其中
horseColicTraining.txt horseColicTest.txt 分别是训练数据和测试数据。 每行21个值,前20个特征,最后一个是类别(0或1)。","updated":"T12:07:32.000Z","canComment":false,"commentPermission":"anyone","commentCount":0,"likeCount":9,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T20:07:32+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":0,"likesCount":9},"":{"title":"牛顿法求解最值","author":"xiao-lei-75-81","content":"前面我们介绍了 梯度上升法 求最大值 和最小值。 牛顿法是另外一种求最值的方法。而且它的收敛速度更快。 不过它的计算量会更大。【基本思想】求解f(x) = 0做一条卡切线(绿色)与 x轴交于a,从f(a)处继续做切线 与 x轴交于 b, 然后再从f(b)做切线,最后就可以逼近 f(x) = 0 tan \\theta = f^{'}(x) = \\frac{ f(x) }{ \\Delta x }
\\Rightarrow
\\Delta x = \\frac{ f(x) }{f^{'}(x) }
,所以 求解 f(\\theta) = 0
牛顿法的更新规则为:求解最大值当我们想求 max \\; l(\\theta) \\Rightarrow
l'(\\theta) = 0
令 f( \\theta) = l'(\\theta) = 0
\\Rightarrow
其中 l'(\\theta) = \n\\begin{pmatrix}\n l'_{1} \\\\ \n l'_{2} \\\\\n\\vdots \\\\\n l'_{n} \\\\\n \\end{pmatrix}\n=
\\nabla_{\\theta} l(\\theta) , l'' = \n\\begin{pmatrix}\n l''_{11} & \\cdots & l''_{1n}\\\\ \n \\vdots & \\ddots & \\vdots\\\\ \n l''_{m1} & \\cdots & l''_{mn}\n \\end{pmatrix}\n= H ( Hessian矩阵)
也写做:牛顿法 与梯度下降的比较作者:金秉文链接:牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。wiki上给的图很形象,我就直接转过来了:","updated":"T12:46:51.000Z","canComment":false,"commentPermission":"anyone","commentCount":2,"likeCount":3,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T20:46:51+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":2,"likesCount":3},"":{"title":"广义线性模型(Generalized Linear Model)","author":"xiao-lei-75-81","content":"概要:本文将会 说明 线性回归和逻辑回归都是广义线性模型的一种特殊形式,介绍广义线性模型的一般求解步骤。 利用广义线性模型推导 出 多分类的Softmax Regression。线性回归中我们假设: 逻辑回归中我们假设:其实它们都只是
广义线性模型 (GLMs) 的特例。提前透露:有了广义线性模型下 我们只需要把 符合指数分布的一般模型 的参数 转换成它对应的广义线性模型参数,然后 按照 广义线性模型的 求解步骤 即可轻松求解问题。 指数分布族( The exponential family)首先我们定义一下什么是指数分布族,它有如下形式:简单介绍下其中的参数 (看不懂没关系)\\eta
是 自然参数 ( natural parameter )T(y) 是充分统计量( sufficient statistic ) (一般情况下 T(y) = y)a(\\eta)
log partition function
( e^{ - a(\\eta)} 充当正规化常量的角色,保证 \\sum p(y; \\eta)
= 1 )也就是所 T,a, b 确定了一种分布,\\eta 是 该分布的参数。选择合适的 T, a,b 我们可以得到
高斯分布 和 Bernoulli 分布。Bernoulli分布的指数分布族形式:=& 即:在如下参数下 广义线性模型是 Bernoulli 分布\\eta = log( \\phi / (1- \\phi)) \\Rightarrow
= 1/(1 + e^{-\\eta})
Gaussian 分布的指数分布族形式:在线性回归中,\\sigma
对于模型参数 \\theta 的选择没有影响,为了推导方便我们将其设为1:得到 对应的参数:用广义线性模型进行建模: 想用 广义线性模型对一般问题进行建模首先需要明确几个 假设:y |θ \\sim ExponentialFamily(\\eta)
y的条件概率属于指数分布族 给定x 广义线性模型的目标是 求解 T(y) | x , 不过由于 很多情况下 T(y) = y
所以我们的目标变成了 y | x , 也即 我们希望拟合函数为
h(x) = E[y|x] ( 备注: 这个条件在 线性回归 和 逻辑回归中都满足, 例如
逻辑回归中 hθ(x) = p(y = 1|x;\\theta) = 0 \\cdot p(y = 0|x; \\theta) + 1 \\cdot
p(y = 1|x; \\theta) = E[y|x;\\theta])
)自然参数 \\eta
与 x是线性关系 : \\eta = \\theta ^T x
( \\eta 为向量时 \\eta_{i} = \\theta_{i} ^T x
)有了如上假设 就可以 进行建模和求解了:具体参考下面例子。广义线性模型 推导出 线性回归:step1: y |θ \\sim N( \\mu , \\theta)step2: 由假设2
h(x) = E[y|x] 得到:广义线性模型 推导出 逻辑回归:step1: y|x;\\theta \\sim Bernoulli(\\phi)step2:
与上面同理广义线性模型推导出 Softmax Regression (多分类算法 ):【step1】: y有多个可能的分类: y \\in
\\right\\}
, 每种分类对应的概率: \\phi_{1}, \\phi_{2}, \\cdots ,\\phi_{k},
但是 由于 \\sum _{i =1}^{k}{\\phi_{i}} = 1 , 所以一般 用 k-1个参数
\\phi_{1}, \\phi_{2}, \\cdots ,\\phi_{k-1},
其中 \\phi_{i} = p(y = \\phi) \\; , p(y = \\phi) = 1 - \\sum _{i=1}^{ k-1} {\\phi_{i}}为了将 多项分布 表达为 指数族分布:
,它不再是 一个数 而是一个变量 引进指示函数:
1 \\left\\{ \\cdot \\right\\}
为 \n1\\left\\{ True \\right\\}
= 1 \\; , 1\\left\\{ False \\right\\}
= 0 E[(T(y))i] = P(y = i) = \\phi_{i}得到它的指数分布族形式 以及 各个对应参数为:求出 \\phi_{i} :=& 也即: 至此我们就可以利用广义线性模型进行求解:【step2】可见 拟合函数的输出结果是 每一种分类对应的概率 所组成的向量。接下了只需要根据 最大似然法拟合参数即可:可以用梯度上升或着牛顿法。","updated":"T07:46:36.000Z","canComment":false,"commentPermission":"anyone","commentCount":4,"likeCount":27,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T15:46:36+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-02c43a6bac4c0871e2aa_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":4,"likesCount":27},"":{"title":"Gaussian discriminant analysis","author":"xiao-lei-75-81","content":"之前所介绍的几种算法的思路都是 对
p(y|x;\\theta)
进行建模,例如逻辑回归中,它的思路是在空间中找到一条分割线,对于预测点如果落在某一边属于 A类,落在另一边则属于B类。 这种算法被称为判别算法,它直接对目标问题进行建模,然后求解。这里要介绍另外一种思路:先对现有的A类建模得到A模型
p(x|y=0) ,对B类建模得到B模型
p(x|y=1) , 然后看我们的待预测点与 哪个模型更匹配: 具体做法是通过贝叶斯计算其后验概率
p(y|x) = \\frac{p(x|y)p(y) }{
= \\frac{p(x|y)p(y) }{ p(x|y = 1)p(y = 1) + p(x|y = 0)p(y = 0)
进行建模的思路叫做 生成算法 (generative learning algorithms)。实际上 如果我们仅仅做预测不需要求解全部贝叶斯公式 因为【Gaussian discriminant analysis】在GDA中我们假设
服从 多元高斯分布:
\\sim N(\\mu , \\Sigma ) ,其中 均值向量
\\mu \\in R^n
协方差矩阵 \\Sigma
\\in R^{n\\times n} \\Sigma\\geq
是对称的半正定矩阵。 详细说明一下该分布:
符合高斯分布的随机变量X的期望为 随机变量 Z的协方差为
Cov(Z) = E[(Z - E[Z])(Z - E[Z])^T] = E[ZZ^T]-(E[Z])(E[Z])^T
X \\sim N(\\mu,\\Sigma) \\Rightarrow
Cov(X) = \\Sigma\n固定均值, 协方差矩阵越大 图像越扁平(协方差矩阵就是衡量偏离均值的程度,越大越偏离,图像也就越扁平)非单位矩阵形式的协方差矩阵图像会发生扭曲, 因为变量间存在相关关系 固定协方差矩阵
图像随着均值平移当是输入特征是连续值的随机变量,我们可以使用GDA, 假设
服从多元高斯分布。可以看出我们是让两个分布共用了同一个协方差矩阵 \\Sigma ,整个模型的参数为
\\phi, \\Sigma, \\mu_{0} , \\mu_{1} ,通过最大似然估计求参数:求解 max \\; l(\\phi, \\mu_{0}, \\mu_{1}, \\Sigma) 得到参数:有了参数 就可以得到各种分布 P(y), P(x|y=0), P(x|y=1) 然后代入
p(y|x) = \\frac{p(x|y)p(y) }{
p(x) } 就可以求得 x所属的分类了。模型对应的图像为: 蓝色分割线对应 p(y = 1|x) = 0.5【GDA 和 logistic regression 的关系】如果我们把 GDA中的
p(y = 1|x;\\phi,\\mu_{0},\\mu_{1},\\Sigma)
看成 x的函数,可以得到它属于 逻辑回归的 函数形式: 这一点看似奇妙实际上 意料之外情理之中,一张图就可以说明,以一维高斯分布为例图中黑色曲线代表两个高斯分布,沿着x从最右边向最左边移动时
刚开始根本不可能属于分类0,到了中间 属于分类0,分类1的概率各位0.5, 再往右就完全属于分类1了。 红色的线就表示了属于分类1 的概率,它是逻辑回归的曲线形式。如果
是多元高斯分布,那么 p(y|x) 是
logistic函数,但是反之则不然 (p(y|x) 是
logistic函数, p(x|y)
不一定是多元高斯分布,例如 泊松分布的生成模型也会演变为
logistic函数的判别模型)。这说明 GDA做了更强的模型假设。GDA做了更强的模型假设,当数据 的确是或大概是 高斯分布时, 它的数据效率更高(很少的数据就可以学的很好) Logistic regression 做了弱一点的模型假设,所以 鲁棒性好 (特别是 当数据本身不是高斯分布,并且数据不是很多的情况下Logistic regression 效果一般比 GDA好,所以实际中 LR使用的更广泛)","updated":"T02:55:55.000Z","canComment":false,"commentPermission":"anyone","commentCount":4,"likeCount":1,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T10:55:55+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":4,"likesCount":1},"":{"title":"朴素贝叶斯( Naive Bayes)","author":"xiao-lei-75-81","content":"在GDA中 x时连续随机变量,这篇文章聊聊x是离散随机变量的情形。 回想垃圾邮件分类中我们把 邮件分为 垃圾邮件和非垃圾邮件,这是典型的文本分类问题。如何表示一封邮件的内容呢?此处我们采用特征向量的方式, 存在一个按照字母排序的字符集(也叫字典),如果邮件中 出现过某一个单词,就把特征向量中对应的元素设为1. 例如 邮件中的内容只有 “a boy\"时对应的特征向量。显然x向量的维度等于字典长度。接下来我们要对
p(x|y) 建模:方案1 :原样刻画问题, 把x看作多项分布 ,假设字典包含5000个词,那么
x \\in \\{0,1 \\}^{50000} , x就有
种可能取值。 需要 (2^{50000}-1)个参数 (一个
2^{50000}-1
维度的参数向量 )。 显然 P(x^{(i)} | y)
参数过多,不可行。方案2: 做一个比较强的假设再刻画问题,大大简化模型。 假设每个 x_{i} 相对于y 条件独立 ( Naive Bayes (NB) assumption)。例如: p(x_{2000}|y) = p(x_{2000}|y,x_{3000}).x_{2000}
对应 单词 ”buy“ ,
对应单词 ”price\" ,它的意思是 在已知邮件分类的情况下, “buy\"是否在邮件中出现 与 ”price\"是否在邮件中出现过没有关联。 \\phi_{y},\\phi_{i}|y=0 , \\phi_{i}|y=1 对于每一封邮件x^{(i)} = \\left( x_{1}, x_{2} \\cdots
x_{m} \\right)^T 它对应的分布为 P(x^{(i)} | y) 为:利用贝叶斯公式得到模型:
p( y^{(i)} | x^{(i)} ) =\n \\frac{ p(x^{(i)}, y^{(i)}) }{p(x^{(i)})}
\n\\frac {p(x^{(i)} | y^{(i)}) p(y^{(i)}) }{ \\sum p(x^{(i)} | y^{(i)}) p(y^{(i)}) }
p(x^{(i)} | y^{(i)})
\\prod_{j=1}^{n} p(x_{j} | y^{(i)}) 可见模型参数包括
\\phi_{i}|y=1 = p(xi = 1|y = 1) \\\\\n
\\phi_{i}|y=0 = p(xi = 1|y = 0)\\\\\n
\\phi_{y} = p(y = 1)
通过极大似然估计可以求解参数。 具体如下:给定训练集 {(x(i),y(i));i =1,...,m}\n , 可以得到联合似然函数
: 其中 p(x^{(i)} , y^{(i)}) = p(x^{(i)} | y^{(i)}) p(y^{(i)})
= \\{ \\prod_{j=1}^{n} p(x_{j} | y^{(i)}) \\} \\cdot p(y^{(i)})求解 max \\; l( \\phi_{y} , \\phi_{i} |y=0 ,
\\phi_{i} |y=1)
得到:这个结果有着明显的意义:\\phi_{j} | y=1
包含词汇j的垃圾邮件 与 垃圾邮件 之比\\phi_{j} | y=0 是
包含词汇j的非垃圾邮件 与 非垃圾邮件之比\\phi_{y} 是垃圾邮件所占比例已知参数就可以求得任意 邮件 x= \\left( x_{1}, x_{2} \\cdots
x_{m} \\right)^T属于垃圾邮件的概率:总结一下:【朴素贝叶斯 推广】上面第二步骤中 假设 每个词汇 x_{i} 只能取两种值,它 服从 Bernoulli 分布。 如果它可以取 k个可能值
\\{1,2,...,k_{i} \\} 就是 多项分布 :
p(x^i|y) \\sim M(n; \\phi_{1}, \\phi_{2} \\cdots \\phi_{n}
这就把朴素贝叶斯做了进一步推广,适用范围更广。一般情况下可以把连续值转换为离散的多项分布然后用朴素贝叶斯来求解,例如 x代表房屋面积, 通过分段就可以离散化
x为890 平方 对应 x=3如果 原始数据通过
假设为多元高斯分布, 适用 GDA 算法没有得到理想效果。可以试着把它 离散化(多项分布) 然后使用朴素贝叶斯算法 或许是不错的选择。[Laplace smoothing] 假设 “nips” 是最新一份邮件中的 第35000个词, 其它邮件中从未出现过该词,那么 当我们想要预测 一份含有“nips”的邮件是否为 垃圾邮件时:因为 \\prod_{i=1}^{n}
p(xi|y) 包含
p(x_{35000}|y) = 0 因为训练样本有限就预测概率为零时非常不合理的。 如何改进呢?
Laplace smoothing。 以 多项分布的随机变量 z \\in \\{1 \\cdots k \\} 为例 ,其参数为
\\phi_{j} = p(z = i) 在给定m个独立的训练集
\\{z^{(1)},...,z^{(m)} \\} 的估计为 如同前面所讲 其中的 \\phi_{j} 可能为 0. 为了避免这个问题 我们使用 Laplace smoothin: 分子加1,分母加 k (k个
\\phi_{j} ) 而且仍然满足概率要求:这样就有效避免了为0的情况。同理,对于朴素贝叶斯:【文本分类的事件模型】在文本分类问题中 朴素贝叶斯使用了多元 Bernoulli事件模型 (multi-variate Bernoulli event model): 假设一封邮件(文本)是按照如下步骤生成的: 首先按照概率 P(y) 决定下一封邮件是否发送垃圾邮件或正常邮件发送者扫描真个字典 按照概率 p(x_{i} = 1|y) = \\phi_{i}|y决定是否包含词汇 i
, 所以一份邮件的概率为 但是还可以有另一中方式:多项事件模型 ( multinomial event model)
首先按照概率 P(y) 决定下一封邮件是否发送垃圾邮件或正常邮件 开始写邮件, 邮件的每一个词都可能是 字典中词汇任意一个,即 p(x_{1}|y) 服从 多项分布 , 并且 每个词之间独立 (IID)。
按照 第一个词,第二个词, 一次写下去 知道 写完为止。所以 一封邮件的概率为:图示如下:新模型的参数 为 \\phi_{y} = p(y) \\\\\n \\phi_{i}|y=1 = p(x_j = i|y = 1) \\\\\n \\phi_{i}|y=0 = p(x_j = i|y = 0)给定训练数据:
\\{(x^{(i)},y^{(i)}) \\; i = 1,...,m \\}
\\\\\n x^{(i)} = (x^{(i)}_1 ,x^{(i)}_2 ,...,x^{(i)}_{ni} )
得到似然函数:最大似然估计得到参数:加上 Laplace smoothing :","updated":"T08:46:27.000Z","canComment":false,"commentPermission":"anyone","commentCount":2,"likeCount":5,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T16:46:27+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-ce76c9fc07db57553fcc_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":2,"likesCount":5},"":{"title":"RCNN- 将CNN引入目标检测的开山之作","author":"xiao-lei-75-81","content":"前面一直在写传统机器学习。从本篇开始写一写 深度学习的内容。 可能需要一定的神经网络基础(可以参考
日后可能会在专栏发布自己的中文版笔记)。 (论文:Rich feature hierarchies for accurate object detection and semantic segmentation) 是将CNN方法引入目标检测领域, 大大提高了目标检测效果,可以说改变了目标检测领域的主要研究思路, 紧随其后的系列文章:( ),,
代表该领域当前最高水准。 【论文主要特点】(相对传统方法的改进)速度:
经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则(采用Selective Search方法)预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上(采用CNN)提取特征,进行判断。训练集: 经典的目标检测算法在区域中提取人工设定的特征。本文则采用深度网络进行特征提取。使用两个数据库: 一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。 一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置,一万图像,20类。 本文使用识别库进行预训练得到CNN(有监督预训练),而后用检测库调优参数,最后在检测库上评测。看到这里也许你已经对很多名词很困惑,下面会解释。先来看看它的基本流程:【基本流程 ===================================】RCNN算法分为4个步骤 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
位置精修: 使用回归器精细修正候选框位置 【基础知识 ===================================】 主要思想:使用一种过分割手段,将图像分割成小区域 (1k~2k 个)查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置 输出所有曾经存在过的区域,所谓候选区域其中合并规则如下: 优先合并以下四种区域: 颜色(颜色直方图)相近的 纹理(梯度直方图)相近的 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -& abcd-efgh -& abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h -&abcd-e-f-g-h -&abcdef-gh -& abcdefgh)合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。上述四条规则只涉及区域的颜色直方图、梯度直方图、面积和位置。合并后的区域特征可以直接由子区域特征计算而来,速度较快。有监督预训练与无监督预训练:(1)无监督预训练(Unsupervised pre-training)预训练阶段的样本不需要人工标注数据,所以就叫做无监督预训练。(2)有监督预训练(Supervised pre-training)所谓的有监督预训练也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务时:人脸性别识别,那么这个时候你可以利用已经训练好的年龄识别CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练,让它输出性别。这就是所谓的迁移学习,说的简单一点就是把一个任务训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。对于目标检测问题: 图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇论文采用了迁移学习的思想: 先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段CNN模型的输出是1000个神经元(当然也直接可以采用Alexnet训练好的模型参数)。重叠度(IOU):物体检测需要定位出物体的bounding box,就像下面的图片一样,我们不仅要定位出车辆的bounding box 我们还要识别出bounding box 里面的物体就是车辆。对于bounding box的定位精度,有一个很重要的概念: 因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。 它定义了两个bounding box的重叠度,如下图所示就是矩形框A、B的重叠面积占A、B并集的面积比例。非极大值抑制(NMS):RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。就这样一直重复,找到所有被保留下来的矩形框。非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。VOC物体检测任务: 相当于一个竞赛,里面包含了20个物体类别:
还有一个背景,总共就相当于21个类别,因此一会设计fine-tuning CNN的时候,我们softmax分类输出层为21个神经元。【各个阶段详解 ===================================】 总体思路再回顾:首先对每一个输入的图片产生近2000个不分种类的候选区域(region proposals),然后使用CNNs从每个候选框中提取一个固定长度的特征向量(4096维度),接着对每个取出的特征向量使用特定种类的线性SVM进行分类。也就是总个过程分为三个程序:a、找出候选框;b、利用CNN提取特征向量;c、利用SVM进行特征向量分类。候选框搜索阶段:当我们输入一张图片时,我们要搜索出所有可能是物体的区域,这里采用的就是前面提到的Selective Search方法,通过这个算法我们搜索出2000个候选框。然后从上面的总流程图中可以看到,搜出的候选框是矩形的,而且是大小各不相同。然而CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法: (1)各向异性缩放这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示;(2)各向同性缩放因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法A、先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;B、先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图(C)所示;对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。(备注:候选框的搜索策略作者也考虑过使用一个滑动窗口的方法,然而由于更深的网络,更大的输入图片和滑动步长,使得使用滑动窗口来定位的方法充满了挑战。)CNN特征提取阶段:1、算法实现a、网络结构设计阶段网络架构两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。b、网络有监督预训练阶段
(图片数据库:ImageNet ILSVC )参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这里文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。网络优化求解时采用随机梯度下降法,学习率大小为0.001;C、fine-tuning阶段 (图片数据库: PASCAL VOC)我们接着采用 selective search 搜索出来的候选框 (PASCAL VOC 数据库中的图片) 继续对上面预训练的CNN模型进行fine-tuning训练。假设要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景) (20 + 1bg = 21),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变;接着就可以开始继续SGD训练了。开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch size大小选择128,其中32个事正样本、96个事负样本。关于正负样本问题:一张照片我们得到了2000个候选框。然而人工标注的数据一张图片中就只标注了正确的bounding box,我们搜索出来的2000个矩形框也不可能会出现一个与人工标注完全匹配的候选框。因此在CNN阶段我们需要用IOU为2000个bounding box打标签。如果用selective search挑选出来的候选框与物体的人工标注矩形框(PASCAL VOC的图片都有人工标注)的重叠区域IoU大于0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。(备注: 如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了)2. 疑惑点: CNN训练的时候,本来就是对bounding box的物体进行识别分类训练,在训练的时候最后一层softmax就是分类层。那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm,具体请看下文。SVM训练、测试阶段训练阶段:这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包含物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。一旦CNN f7层特征被提取出来,那么我们将为每个物体类训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含了4096个权值w),就可以得到结果了。得到的特征输入到SVM进行分类看看这个feature vector所对应的region proposal是需要的物体还是无关的实物(background) 。 排序,canny边界检测之后就得到了我们需要的bounding-box。再回顾总结一下:整个系统分为三个部分:1.产生不依赖与特定类别的region proposals,这些region proposals定义了一个整个检测器可以获得的候选目标2.一个大的卷积神经网络,对每个region产生一个固定长度的特征向量3.一系列特定类别的线性SVM分类器。位置精修: 目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。 回归器:对每一类目标,使用一个线性脊回归器进行精修。正则项λ=10000。 输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。
训练样本:判定为本类的候选框中和真值重叠面积大于0.6的候选框。测试阶段:使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。(非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到这一类的结果(然后继续进行下一个分类)。作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性。完。 本文主要整理自以下文章:《Rich feature hierarchies for Accurate Object Detection and Segmentation》《Spatial 《Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》","updated":"T09:54:35.000Z","canComment":false,"commentPermission":"anyone","commentCount":19,"likeCount":129,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T17:54:35+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-515dad59dd0f936f16fa4c7f_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":19,"likesCount":129},"":{"title":"历史|文章笔记-从线性分类器到卷积神经网络","author":"xiao-lei-75-81","content":"本文主要是阅读
的笔记。 前面已经 按照
指数分布族 的视角,把线性回归(高斯分布)与逻辑回归(Bernoulli分布)统一在 广义线性模型 之下。 它是一种偏向数学的视角。阅读了 这篇
之后,发现还有另一种 神经元 的视角可以把逻辑回归 ,SVM,神经网络(NN) 和 CNN都统一在一起。这篇笔记的目的主要有几个关键点:引入 神经元视角统一看待几个传统机器学习算法和神经网络 说明近年来火热的一种神经网络 (深度卷积网络 也叫 深度学习)为什么在沉寂一段时间后又突然热起来。(换句话说:深度学习为什么有效?做了那些改进?)不过笔记旨在说明思想,不是专门讲解知识点的教程。看不懂的同学可以把它当作机器学习的一篇发展史概述。回想前面的两篇
我们都可以按照 极大似然估计的统计学思想
step1: 假设 y|x 的分布 , step2:利用极大似然估计 得到 max \\; l(\\theta )
\\Leftrightarrow min \\; J(\\theta) 而J(\\theta) 就是我们的损失函数。
(当然也可以不按照这个思路也能得出损失函数 例如
中的开篇就是以数学直观含义直接给出了最小二乘法形式的损失函数 然后才按照似然估计赋予其概率意义)【逻辑回归(LR) - 神经元模型】线性回归的目标函数与损失函数分别为\\hat{y}=\\vec{\\omega}\\cdot\\vec{x}+b , \\varepsilon
= \\frac{1}{2}{(y-\\hat{y} )}^{2} (此处是对于单个样本的损失函数)为了求解二分类问题,我们在线性回归上加一个 sigmoid函数 (作映射 (-\\infty, \\infty) \\rightarrow
就得到了逻辑回归。 逻辑回归的目标函数与损失函数分别为:(注意:损失函数刚好是凸函数:全局最优就是局部最优)而逻辑回归模型的另外一个名称为神经元模型——即我们认为大脑的神经元有着像上述模型一样的结构:一个神经元会根据与它相连的神经元的输入(x)做出反应,决定自身的激活程度(一般用sigmoid函数衡量激活程度),并将激活后的数值(y)输出到其他神经元。(上图为单个的神经元模型)【神经网络(Neural Network,简称NN)】逻辑回归的决策平面是线性的,它一般只能够解决样本是线性可分的情况。如果样本呈现非线性的时候,我们可以引入多项式回归。(看下图)(备注:多项式回归也可以看成是线性回归或者逻辑回归的一个特例——将线性回归或者逻辑回归的特征x转化为x^{1},{x}^{2}, {x}^{3} \\cdots等非线性的特征组合,然后对其进行线性的拟合)多项式回归虽然解决了非线性可分问题,但需要人工构造非线性的特征(x^{i})。而神经网络(NN)既(a)能够应付样本非线性可分的情况,又同时(b)能够自动构造非线性的特征。神经网络可以看成“线性组合-非线性激活函数-线性组合-非线性激活函数…”这钟较为复杂网络结构,它的决策面是复杂的,于是能够适应样本非线性可分的情况。中间一列的橙色神经元构成的层次我们称为隐层。我们认为隐层的神经元对原始特征进行了组合,并提取出来了新的特征,而这个过程是模型在训练过程中自动“学习”出来的。【支持向量机(简称SVM)】神经网络的出现一度引起研究热潮,但有如下缺点:一般来说需要大量的训练样本。代价函数边界复杂,非凸,存在多个局部最优值。参数意义模糊,比如隐层的神经元个数应该取多少一直没有定论。浅层神经网络(Shallow network)对于特征学习的表达能力有限。(只能学习很底层的浅特征 ,无法得到抽象层次更高的深特征 例如原子-&分子-&细胞 层次逐步加深)深层神经网络(Deep network)的参数繁多,一方面容易导致过拟合问题,另一方面因为训练时间过长而导致不可学习。(参数多容易从噪声中学习模式)上世纪90年代被提出来后,神经网络一度衰落了。典型的(不加核函数的)SVM是 L-SVM,本质上依然是一个线性分类器,SVM的核心思想在于它的分类准则——最大间隔(max margin).(备注:同为线性分类器的拓展,逻辑回归和L-SVM有着千丝万缕的关系,Andrew Ng的课件有一张图很清晰地把这两者的代价函数联系起来了)由于L-SVM是线性分类器,所以不能解决样本线性不可分的问题。于是后来人们引入了核函数的概念,于是得到了K-SVM(K是Kernel的意思)。从本质上讲,核函数是用于将原始特征映射到高维的特征空间中去,并认为在高维特征空间中能够实现线性可分。SVM比起神经网络有着以下的优点:代价函数是凸函数,存在全局最优值。能够应付小样本集的情况不容易过拟合,并且有着不错的泛化性能和鲁棒性核函数的引入,解决了非线性问题,同时还避免了维数灾难SVM参考:。其实我们依然可以将SVM看成一种特殊的神经元模型:L-SVM本质上跟单神经元(即逻辑回归)模型的最大差别,只是代价函数的不同,所以可以将SVM也理解成一种神经元,只不过它的激活函数不是sigmoid函数,而是SVM独有的一种激活函数的定义方法。K-SVM只是比起L-SVM多了一个负责用于非线性变换的核函数,这个跟神经网络的隐层的思想也是一脉相承的。所以K-SVM实际上是两层的神经元网络结构:第一层负责非线性变换,第二层负责回归。一文中,认为这两者从表达性来说是等价的。(注:这里的“三层前向神经网络”实际上是带一个隐层的神经网络,说是三层是因为它把网络的输入也看成一个层。)( 四种算法小结:)【卷积神经网络】近年来,神经网络又重新兴盛起来了。尤以“卷积神经网络”为其代表。生物学背景:引自。1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念,1984年日本学者Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络,也是感受野概念在人工神经网络领域的首次应用。神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。通常神经认知机包含两类神经元,即承担特征抽取的S-元和抗变形的C-元。S-元中涉及两个重要参数,即感受野与阈值参数,前者确定输入连接的数目,后者则控制对特征子模式的反应程度。许多学者一直致力于提高神经认知机的性能的研究:在传统的神经认知机中,每个S-元的感光区中由C-元带来的视觉模糊量呈正态分布。如果感光区的边缘所产生的模糊效果要比中央来得大,S-元将会接受这种非正态模糊所导致的更大的变形容忍性。我们希望得到的是,训练模式与变形刺激模式在感受野的边缘与其中心所产生的效果之间的差异变得越来越大。为了有效地形成这种非正态模糊,Fukushima提出了带双C-元层的改进型神经认知机。基本网络结构:LeNet图中的Convolutions对应了上一段说的S-元,Subsampling对应了上一段中说的C-元。对于Convolution层的每个神经元,它们的权值都是共享的,这样做的好处是大大减少了神经网络的参数个数。对于Sampling层的每个神经元,它们是上一层Convolution层的局部范围的均值(或者最大值),能够有效地提供局部的平移和旋转不变性。为何神经网络重新兴起?卷积神经网络属于一种深度的神经网络,如上文所说,深度神经网络在之前是不可计算的,主要是由于网络层次变深后会导致下面问题:由于网络参数增多,导致了严重的过拟合现象在训练过程中,对深度网络使用BP算法传播时候梯度迅速减少,导致前面的网络得不到训练,网络难以收敛。而深度卷积网络提出了一系列改进办法:减少参数:共享权值:即上文提到的卷积层的卷积核权值共享,大大减少了网络中参数的数量级。解决过拟合加大数据量:一个是通过众包的方式来增加样本的量级,比如,目前ImageNet已经有了120万的带标注的图片数据。另一个是通过对已有的样本进行随机截取、局部扰动、小角度扭动等方法,来倍增已有的样本数(人工扩增数据)。L1正则化:衰减权值,防止从噪声中学习模式,专注于少数重要的连接 L2正则化:衰减权值,防止从噪声中学习模式,Dropout机制:Hinton在2012提出了,能够在训练过程中将通过随机禁止一半的神经元被修改,避免了过拟合的现象。(相当于取平均 参考) BP传播时梯度衰减导致网络难以收敛的问题:改变激活函数,使用作为激活函数,由于ReLU的导数对于正数输入来说恒为1,能够很好地将梯度传到位于前面的网络当中。增强计算能力:使用GPU进行运算,比起CPU时代运算性能有了数量级的提升。(可以以更小的时间进行更多次迭代搜索问题空间,更快的收敛)上述问题得到有效解决后,神经网络的优势就得到充分的显现了:复杂模型带来的强大的表达能力有监督的自动特征提取深度卷积网络案例:CNN样例1 AlexNet:在ImageNet举办的大规模图像识别比赛ILSVRC2012中分类比赛中,Hinton的学生Alex搭建了一个8层的CNN,最终top-5的漏报率是16%,抛离而第二名的27%整整有11个百分点。这个网络中用到的技术有:ReLU激活函数多GPU编程局部正则化(Local Response Normalization)重叠的下采样(Overlapping Pooling)通过随机截取和PCA来增加数据DropoutCNN样例2 deconvnet:在下一年的比赛ILSVRC2013中,在同样的数据集同样的任务下,Matthew进一步将漏报率降到了11%。他使用了一个被命名为“Deconvolutional Network”(简称deconvnet)的技术。Matthew的核心工作在于尝试将CNN学习出来的特征映射回原图片,来对每个卷积层最具有判别性的部分实现可视化——也就是,观察CNN在卷积层中学习到了什么。CNN样例3 DeepPose:DeepPose的贡献在于它对CNN使用了级联的思想:首先,可以用第一层CNN大致定位出人物的关节位置,然后使用反复使用第二层神经网络对第一层网络进行微调,以达到精细定位的目的。从另外一个角度,这个工作也说明了,CNN不仅能够应付分类问题,也能够应付定位的问题。CNN样例4 CNN vs 人工特征:该工作旨在验证CNN提取出来的特征是否有效,于是作者做了这样的一个实验:将在ILSVRC2013的分类+定位比赛中获胜的OverFeat团队使用CNN提取出来的特征,加上一个L-SVM后构成了一个分类器,去跟各个物体分类的数据集上目前最好(state-of-the-art)的方法进行比较,结果几乎取得了全面的优胜。【总结】神经元网络模型是个极其有效的模型,近年来由于样本数量和计算性能都得到了几何量级的提高,CNN这一深度框架得以发挥它的优势,在计算机视觉的数个领域都取得了不菲的成就。目前来说,对CNN本身的研究还不够深入,CNN效果虽然优秀,但对于我们来说依然是一个黑盒子。弄清楚这个黑盒子的构造,从而更好地去改进它,会是一个相当重要的工作。","updated":"T00:57:10.000Z","canComment":false,"commentPermission":"anyone","commentCount":4,"likeCount":50,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T08:57:10+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-cd4983cac374c5cc2a1fc87_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":4,"likesCount":50},"":{"title":"神经网络架构演进(经典论文)-Alexnet","author":"xiao-lei-75-81","content":"前面发表是发现有些内容没有自动保存,不知道知乎的服务器怎么了。 果断删了重新发。这一篇是 Alexnet :
。1 Introduction当前目标检测主要采用机器学习的方法。为了改善性能,我们可以收集更多的数据,学习更强大的模型,使用更好的技术防止过拟合。目前有标记的图片数据库还比较小,简单的识别任务足够应付,尤其是我们还可以采用 保留标签图片变换的方法人工扩增这些数据。 例如: MNIST 数字识别率可以媲美人类。 但是,现实中的物体是复杂多样的,这就需要更大的已标记数据集。人们早就意识到训练数据太小是个严峻的问题,直到最近才得以收集到百万级别的标记图片数据,这些大数据集包括 LabelMe , ImageNet 等。从百万级的图片数据中学习数千个物体,我们需要一个具备强大学习能力的模型。但是,对于大量物体识别的复杂任务,ImageNet这样的大数据集依然不够用,因此我们的模型也需要具备一些先验知识来补偿那些不知道的数据。卷积神经网络(CNN)就是一类满足要求的模型,它可以通过改变深度和宽度调整学习能力,它也会做出 很强但是近乎正确的假设(先验知识 例如:统计稳定性,局部像素相关性) 。 相比于 同样大小的标准前馈神经网络( standard feedforward neural networks ) 卷积神经网络有更少的神经元连接和参数,因此它可以更快的训练(学习)但是性能上只有轻微的降低。 不过仅有自身的良好特性还是不够的,还得加上GPU(高度优化的2D卷积实现)来加快训练CNN网络 , 大数据集(例如 ImageNet)的解决过拟合(外因)。2. 数据ImageNet:固定大小256x256。先把最小边缩放为256然后从图像中间扣取256x256图片。3. 结构3.1 ReLU Nonlinearity激活函数一般采用tanh 或者 sigma 但是它们会出现饱和现象(函数图像的两边梯度变得很小,不利于反向传播梯度下降法学习)。ReLU不会出现饱和现象,它在大于0时的梯度是恒定的(只要大于0就可以学习)。
图:实线表示ReLUs 很快就收敛到0.25,虚线代表 tanh 很难收敛3.2 Training on Multiple GPUs一个 GTX 580 GPU 只有 3GB内存, 这限制了可训练神经网络的最大容量。所以作者把网络放在两个GPU中训练。当前的GPU很适合跨GP并行,它们可以互相直接读写不必经过主机内存。作者采取的并行化方式是 每个GPU放一半的核,另外还有一个小技巧:GPU只在特定层之间通信。例如 第三层的核以全部第二层的的特征图作为输入,第四层的核仅以第三层中同一GPU的特征图作为输入。选择这种链接方式不利于交叉验证,但是可以精确的调整通信的数量直到达到可接受的计算量。3.3 Local Response NormalizationReLU 不需要输入归一化解决饱和问题。只要ReLU的输入大于0就可以学习。但是 局部正则模式( local normalization scheme )有利于增加泛化能力。 a_{x,y}^{i}表示 首先应用第i个核 在位置(x,y) 然后运用ReLU非线性化 再 响应归一化 的神经元输出,b_{x,y}^{i}
表示局部响应归一化。下面是 两种 局部响应归一化的示意图,上面公式对应的是下面左图。局部归一的动机:在神经生物学有一个概念叫做 侧抑制(lateral inhibitio),指的是 被激活的神经元抑制相邻神经元。归一化(normalization)的目的是“抑制”,局部响应归一化就是借鉴 侧抑制 的思想来实现局部抑制,尤其当我们使用ReLU 的时候这种“侧抑制”很管用。因为ReLU的响应结果是无界的(可以非常大)所以需要归一化。参考: In neurobiology, there is a concept called “lateral inhibition”. Now what does that mean? This refers to the capacity of an excited neuron to subdue its neighbors. We basically want a significant peak so that we have a form of local maxima. This tends to create a contrast in that area, hence increasing the sensory perception. Increasing the sensory perception is a good thing! We want to have the same thing in our CNNs.3.4 Overlapping Pooling相比于正常池化(步长s=2,窗口z=2) 重叠池化(步长s=2,窗口z=3) 可以减少top-1, top-5分别为0.4% 和0.3%。重叠池化可以比避免过拟合。4 Reducing Overfitting4.1
Data Augmentation两种方式人工扩增数据。第一种是 抠图(从256x256抠出224x224)加上水平反转。第二种是 改变RGB颜色通道强度。 有效增加数据量,减少过拟合现象。4.2
Dropout 组合多个模型的预测结果是一种非常有效的减少过拟合方法,但是代价太高。 而dropout是一种有效的组合模型的方法,只需要两倍的训练时间即可实现模型组合(类似取平均)的效果。5. 结构","updated":"T07:27:35.000Z","canComment":false,"commentPermission":"anyone","commentCount":5,"likeCount":32,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T15:27:35+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-f88ee63665cbffe8c732c_r.png","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":5,"likesCount":32},"":{"title":"历史|从神经元到深度学习","author":"xiao-lei-75-81","content":"本篇是
的笔记。说明:层数不考虑输入。一, 单层神经网络(感知器)1.引子 1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字–“感知器”(Perceptron)人们认为已经发现了智能的奥秘,许多学者和科研机构纷纷投入到神经网络的研究中。美国军方大力资助了神经网络的研究,并认为神经网络比“原子弹工程”更重要。这段时间直到1969年才结束,这个时期可以看作神经网络的第一次高潮。2.结构 3.效果感知器类似一个逻辑回归模型,可以做线性分类任务。 我们可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。4.影响感知器只能做简单的线性分类任务。但是当时的人们热情太过于高涨,并没有人清醒的认识到这点。于是,当人工智能领域的巨擘Minsky指出这点时,事态就发生了变化。Minsky在1969年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对XOR(异或)这样的简单分类任务都无法解决。Minsky认为,如果将计算层增加到两层,计算量则过大,而且没有有效的学习算法。所以,他认为研究更深层的网络是没有价值的。由于Minsky的巨大影响力以及书中呈现的悲观态度,让很多学者和实验室纷纷放弃了神经网络的研究。神经网络的研究陷入了冰河期。这个时期又被称为“AI winter”。二. 两层神经网络(多层感知器)1.引子Minsky说过单层神经网络无法解决异或问题。但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。不过两层神经网络的计算是一个问题,没有一个较好的解法。1986年,Rumelhar和Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。这时候的Hinton还很年轻,30年以后,正是他重新定义了神经网络,带来了神经网络复苏的又一春。2.结构两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。使用矩阵运算来表达是很简洁的,而且也不会受到节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个变量)。因此神经网络的教程中大量使用矩阵运算来描述。我们对神经网络的结构图的讨论中都没有提到偏置节点(bias unit)。事实上,这些节点是默认存在的。它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。 在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数(active function)。事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。初学者可能认为画神经网络的结构图是为了在程序中实现这些圆圈与线,但在一个神经网络的程序中,既没有“线”这个对象,也没有“单元”这个对象。实现一个神经网络最需要的是线性代数库。3.效果与单层神经网络不同。理论证明两层神经网络可以无限逼近任意连续函数。也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。下面就是一个例子(此两图来自colah的),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务?我们可以把输出层的决策分界单独拿出来看一下。就是下图。可以看到,输出层的决策分界仍然是直线。关键就是,从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。这样就导出了两层神经网络可以做非线性分类的关键–隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合 。隐藏层节点设计:在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。节点数设置的多少,却会影响到整个模型的效果。目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。实际例子:
字符识别网络架构(下图),它是一个中文车牌识别系统。 EasyPR使用了字符的图像去进行字符文字的识别。输入是120维的向量。输出是要预测的文字类别,共有65类((数字+字母+省份简称))。根据实验,我们测试了一些隐藏层数目,发现当值为40时,整个网络在测试集上的效果较好,因此选择网络的最终结构就是120,40,65。4.训练 在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。定义损失函数(关于参数的函数)来衡量预测值与实际值的差距。梯度下降 让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。 在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不一次计算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。反向传播算法的启示是数学中的链式法则。在此需要说明的是,尽管早期神经网络的研究人员努力从生物学中得到启发,但从BP算法开始,研究者们更多地从数学上寻求问题的最优解。不再盲目模拟人脑网络是神经网络研究走向成熟的标志。正如科学家们可以从鸟类的飞行中得到启发,但没有必要一定要完全模拟鸟类的飞行方式,也能制造可以飞天的飞机。优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。5.影响 两层神经网络在多个地方的应用说明了其效用与价值。10年前困扰神经网络界的异或问题被轻松解决。神经网络在这个时候,已经可以发力于语音识别,图像识别,自动驾驶等多个领域。但是神经网络仍然存在若干的问题:尽管使用了BP算法,一次神经网络的训练仍然耗时太久,而且困扰训练优化的一个问题就是局部最优解问题,这使得神经网络的优化较为困难。同时,隐藏层的节点数需要调参,这使得使用不太方便,工程和研究人员对此多有抱怨。  90年代中期,由Vapnik等人发明的SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。基于以上种种理由,SVM迅速打败了神经网络算法成为主流。 神经网络的研究再次陷入了冰河期。当时,只要你的论文中包含神经网络相关的字眼,非常容易被会议和期刊拒收,研究界那时对神经网络的不待见可想而知。三. 多层神经网络(深度学习) 1.引子  在被人摒弃的10年中,有几个学者仍然在坚持研究。这其中的棋手就是加拿大多伦多大学的Geoffery Hinton教授。  2006年,Hinton在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念。与传统的训练方式不同,“深度信念网络”有一个“预训练”(pre-training)的过程,这可以方便的让神经网络中的权值找到一个接近最优解的值,之后再使用“微调”(fine-tuning)技术来对整个网络进行优化训练。这两个技术的运用大幅度减少了训练多层神经网络的时间。他给多层神经网络相关的学习方法赋予了一个新名词--“深度学习”。   很快,深度学习在语音识别领域暂露头角。接着,2012年,深度学习技术又在图像识别领域大展拳脚。Hinton与他的学生在ImageNet竞赛中,用多层的卷积神经网络成功地对包含一千类别的一百万张图片进行了训练,取得了分类错误率15%的好成绩,这个成绩比第二名高了近11个百分点,充分证明了多层神经网络识别效果的优越性。 2.结构上图,可以看出W(1)中有6个参数,W(2)中有4个参数,W(3)中有6个参数,所以整个神经网络中的参数有16个(这里我们不考虑偏置节点,下同)。经过调整以后,整个网络的参数变成了33个。虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示(represention)能力。在参数一致的情况下,我们也可以获得一个“更深”的网络。上图的网络中,虽然参数数量仍然是33,但却有4个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达(可以更深入的表示特征)。3.效果与两层层神经网络不同。多层神经网络中的层数增加了很多。增加更多的层次 就可以更深入的表示特征(深度),以及更强的函数模拟能力(参数数量)。 更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。  通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。这点也在ImageNet的多次大赛中得到了证实。从2012年起,每年获得ImageNet冠军的深度神经网络的层数逐年增加,2015年最好的方法GoogleNet是一个多达22层的神经网络。在最新一届的ImageNet大赛上,目前拿到最好成绩的MSRA团队的方法使用的更是一个深达152层的网络!关于这个方法更多的信息有兴趣的可以查阅ImageNet网站。4.训练  在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此,目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。  在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的计算芯片(例如GPU图形加速卡)时,梯度下降算法以及反向传播算法在多层神经网络中的训练中仍然工作的很好。目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。   在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。5.影响  目前,深度神经网络在人工智能界占据统治地位。但凡有关人工智能的产业报道,必然离不开深度学习。神经网络界当下的四位引领者除了前文所说的Ng,Hinton以外,还有CNN的发明人Yann Lecun,以及《Deep Learning》的作者Bengio。多层神经网络的研究仍在进行中。现在最为火热的研究技术包括RNN,LSTM等,研究方向则是图像理解方面。图像理解技术是给计算机一幅图片,让它用语言来表达这幅图片的意思。ImageNet竞赛也在不断召开,有更多的方法涌现出来,刷新以往的正确率。四 回顾  1.影响  我们回顾一下神经网络发展的历程。神经网络的发展历史曲折荡漾,既有被人捧上天的时刻,也有摔落在街头无人问津的时段,中间经历了数次大起大落。  从单层神经网络(感知器)开始,到包含一个隐藏层的两层神经网络,再到多层的深度神经网络,一共有三次兴起过程。详见下图。 历史最大的好处是可以给现在做参考。科学的研究呈现螺旋形上升的过程,不可能一帆风顺。同时,这也给现在过分热衷深度学习与人工智能的人敲响警钟,因为这不是第一次人们因为神经网络而疯狂了。1958年到1969年,以及1985年到1995,这两个十年间人们对于神经网络以及人工智能的期待并不现在低,可结果如何大家也能看的很清楚。因此,冷静才是对待目前深度学习热潮的最好办法。如果因为深度学习火热,或者可以有“钱景”就一窝蜂的涌入,那么最终的受害人只能是自己。神经网络界已经两次有被人们捧上天了的境况,相信也对于捧得越高,摔得越惨这句话深有体会。因此,神经网络界的学者也必须给这股热潮浇上一盆水,不要让媒体以及投资家们过分的高看这门技术。很有可能,三十年河东,三十年河西,在几年后,神经网络就再次陷入谷底。根据上图的历史曲线图,这是很有可能的。2.效果  下面说一下神经网络为什么能这么火热?简而言之,就是其学习效果的强大。随着神经网络的发展,其表示性能越来越强。  从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。 可以看出,随着层数增加,其非线性分界拟合能力不断增强。图中的分界线并不代表真实训练出的效果,更多的是示意效果。  神经网络的研究与应用之所以能够不断地火热发展下去,与其强大的函数拟合能力是分不开关系的。3.外因 当然,光有强大的内在能力,并不一定能成功。一个成功的技术与方法,不仅需要内因的作用,还需要时势与环境的配合。神经网络的发展背后的外在原因可以被总结为:更强的计算性能,更多的数据,以及更好的训练方法。只有满足这些条件时,神经网络的函数拟合能力才能得已体现,见下图。之所以在单层神经网络年代,Rosenblat无法制作一个双层分类器,就在于当时的计算性能不足,Minsky也以此来打压神经网络。但是Minsky没有料到,仅仅10年以后,计算机CPU的快速发展已经使得我们可以做两层神经网络的训练,并且还有快速的学习算法BP。  但是在两层神经网络快速流行的年代。更高层的神经网络由于计算性能的问题,以及一些计算方法的问题,其优势无法得到体现。直到2012年,研究人员发现,用于高性能计算的图形加速卡(GPU)可以极佳地匹配神经网络训练所需要的要求:高并行性,高存储,没有太多的控制需求,配合预训练等算法,神经网络才得以大放光彩。  互联网时代,大量的数据被收集整理,更好的训练方法不断被发现。所有这一切都满足了多层神经网络发挥能力的条件。外在条件的满足也是神经网络从神经元得以发展到目前的深度神经网络的重要因素。 除此以外,一门技术的发扬没有“伯乐”也是不行的。在神经网络漫长的历史中,正是由于许多研究人员的锲而不舍,不断钻研,才能有了现在的成就。前期的Rosenblat,Rumelhart没有见证到神经网络如今的流行与地位。但是在那个时代,他们为神经网络的发展所打下的基础,却会永远流传下去,不会退色。备注: 神经网络分类原文:","updated":"T03:24:06.000Z","canComment":false,"commentPermission":"anyone","commentCount":5,"likeCount":56,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","sourceUrl":"","publishedTime":"T11:24:06+08:00","links":{"comments":"/api/posts//comments"},"url":"/p/","titleImage":"/v2-1e5c381b517f4f74d8c5_r.jpg","summary":"","href":"/api/posts/","meta":{"previous":null,"next":null},"snapshotUrl":"","commentsCount":5,"likesCount":56},"":{"title":"原始图片中的ROI如何映射到到feature map?","author":"xiao-lei-75-81","content":"在SPP-net中的难点一曾提到:ROI如何对应到feature map?这个地方遇到不少坑,看了很多资料都没有太明白,感觉太绕。先数数遇到的坑:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》原文是这样写的,一脸懵逼。找了张图是这样画的:有那么点意思,好像是从前向后推出各个层的感受野,可是还是不懂为啥这样。这两张图,看的有点摸不着头脑接着找了何凯明在ICCV2015上演讲的PPT:《 》,算是有了点眉目。可是还是不造咋回事,只知道有那么个公式,却不知道怎么推出来的,满心的疑惑。回归正题最后找到一篇靠谱的文章 ,它给出了一个不错的启发,还附带了代码,最关键的是它给出了参考链接。 于是我终于在参考链接找到了这篇
最佳博文,不仅清晰易懂,而且公式详细。(不过感觉略有不足,所以下面就详细介绍一下这个大坑)【先说说感受野的计算】回忆一下我之前在
里就曾经画图推导过的一个公式(这个公式很常见,可是竟然很少有人去讲它怎么来的,当时我在写 CNN简介就顺便画图推导了一下,没细看的同学可以回头看看)原文里提到:隐藏层边长(输出的边长) = (W - K + 2P)/S + 1 (其中 W是输入特征的大小,K是卷积核大小,P是填充大小,S是步长(stride))为了理解方便我就把公式先用英文写一下:output field size = ( input field size - kernel size + 2*padding ) / stride + 1(output field size 是卷积层的输出,input field size 是卷积层的输入)反过来问你:
卷积层的输入(也即前一层的感受野) = ?答案必然是:
input field size
= (output field size
- 1)* stride - 2*padding + kernel size再重申一下:卷积神经网络CNN中,某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。感受野的大小是由kernel size,stride,padding , outputsize 一起决定的。从 里截张图你感受一下:公式化一下:对于Convolution/Pooling layer(博文作者忘了加上padding本文在这里补上):r_i = s_i \\cdot (r_{i+1} - 1) + k_i -2 \\cdot padding对于 Neuronlayer(ReLU/Sigmoid/..) :r_I = r_{i+1}
(显然如此)上面只是给出了 前一层在后一层的感受野,如何计算最后一层在原始图片上的感受野呢? 从后向前级联一下就可以了(先计算最后一层到倒数第二层的感受野,再计算倒数第二层到倒数第三层的感受野,依次从后往前推导就可以了) 中用如下核心代码计算了 Alexnet
zf-5和VGG16网络每层输出feature map的感受野大小。net_struct = {'alexnet': {'net':[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0]],\n
'name':['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5']},\n
'vgg16': {'net':[[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],\n
[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0]],\n
'name':['conv1_1','conv1_2','pool1','conv2_1','conv2_2','pool2','conv3_1','conv3_2',\n
'conv3_3', 'pool3','conv4_1','conv4_2','conv4_3','pool4','conv5_1','conv5_2','conv5_3','pool5']},\n
'zf-5':{'net':}

我要回帖

更多关于 cnn svm结合 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信