diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..10999b8 Binary files /dev/null and b/.DS_Store differ diff --git a/MarkDown/第一章_数学基础.md b/MarkDown/第一章_数学基础.md index 457435f..903c340 100644 --- a/MarkDown/第一章_数学基础.md +++ b/MarkDown/第一章_数学基础.md @@ -1,18 +1,29 @@ # 第一章 数学基础 -> Markdown Revision 1; +> Markdown Revision 1; --update 2018/10/30 13:00 > Date: 2018/10/25 > Editor: 乔成磊-同济大学 > Contact: qchl0318@163.com -## 1.1 标量、向量、张量之间的联系 -**张量(tensor)** -在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。使用**$A$**来表示张量“A”。张量**$A$**中坐标为$(i,j,k)$的元素记作$A_{(i,j,k)}$。 +## 1.1 标量、向量、矩阵、张量之间的联系 +**标量(scalar)** +一个标量表示一个单独的数,它不同于线性代数中研究的其他大部分对象(通常是多个数的数组)。我们用斜体表示标量。标量通常被赋予小写的变量名称。 + +**向量(vector)** +矩阵是具有相同特征和纬度的对象的集合,表现为一张二维数据表。其意义是一个对象表示为矩阵中的一行,一个特征表示为矩阵中的一列,每个特征都有数值型的取值。通常会赋予矩阵粗体的大写变量名称,比如**A**。 + +**矩阵(matrix)** +一个向量表示组有序排列的数。通过次序中的索引,我们可以确定每个单独的数。通常我们赋予向量粗体的小写变量名称,比如xx。向量中的元素可以通过带脚标的斜体表示。向量x的第一个元素是x1,第二个元素是x2,以此类推。我们也会注明存储在向量中的元素的类型(实数、虚数等)。 + +**张量(tensor)** +在某些情况下,我们会讨论坐标超过两维的数组。一般地,一个数组中的元素分布在若干维坐标的规则网格中,我们将其称之为张量。使用**$A$**来表示张量“A”。张量**$A$**中坐标为$(i,j,k)$的元素记作$A_{(i,j,k)}$。 + **关系** 标量是0阶张量,向量是一阶张量。举例: 标量就是知道棍子的长度,但是你不会知道棍子指向哪儿。 向量就是不但知道棍子的长度,还知道棍子指向前面还是后面。 张量就是不但知道棍子的长度,也知道棍子指向前面还是后面,还能知道这棍子又向上/下和左/右偏转了多少。 + ## 1.2 张量与矩阵的区别? 1. 从代数角度讲, 矩阵它是向量的推广。向量可以看成一维的“表格”(即分量按照顺序排成一排), 矩阵是二维的“表格”(分量按照纵横位置排列), 那么$n$阶张量就是所谓的$n$维的“表格”。 张量的严格定义是利用线性映射来描述的。 2. 从几何角度讲, 矩阵是一个真正的几何量,也就是说,它是一个不随参照系的坐标变换而变化的东西。向量也具有这种特性。 @@ -20,7 +31,8 @@ 4. 表示标量的数和表示矢量的三维数组也可分别看作1×1,1×3的矩阵。 ## 1.3 矩阵和向量相乘结果 -一个$m$行$n$列的矩阵和$n$行向量相乘,最后得到就是一个$m$行的向量。运算法则就是矩阵中的每一行的数据与向量中的数据相乘。 +一个$m$行$n$列的矩阵和$n$行向量相乘,最后得到就是一个$m$行的向量。运算法则就是矩阵中的每一行数据看成一个行向量与该向量作点乘。 + ## 1.4 向量和矩阵的范数归纳 **向量的范数** 定义一个向量为:$\vec{a}=[-5, 6, 8, -10]$。 @@ -28,9 +40,17 @@ 向量的2范数:向量的每个元素的平方和再开平方根,上述$\vec{a}$的2范数结果就是:15。 向量的负无穷范数:向量的所有元素的绝对值中最小的:上述向量$\vec{a}$的负无穷范数结果就是:5。 向量的正无穷范数:向量的所有元素的绝对值中最大的:上述向量$\vec{a}$的负无穷范数结果就是:10。 +向量的L-P范数:$L_p=|\vec{x}|_p=\sqrt[p]{\sum_{i=1}^{n}x_i^p},\vec{x}=( x_1,x_2,...,x_n )$ **矩阵的范数** 定义一个矩阵$A=[-1, 2, -3; 4, -6, 6]$。 +矩阵的范数定义为 +$$ +\|A\|_p :=\sup_{x\neq 0}\frac{\|Ax\|_p}{\|x\|_p}. +$$ + +当向量取不同范数时, 相应得到了不同的矩阵范数。 + **矩阵的1范数**:矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大),上述矩阵$A$的1范数先得到$[5,8,9]$,再取最大的最终结果就是:9。 **矩阵的2范数**:矩阵$A^TA$的最大特征值开平方根,上述矩阵$A$的2范数得到的最终结果是:10.0623。 **矩阵的无穷范数**:矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大),上述矩阵$A$的1范数先得到$[6;16]$,再取最大的最终结果就是:16。 @@ -39,6 +59,7 @@ **矩阵的L1范数**:矩阵中的每个元素绝对值之和,它是L0范数的最优凸近似,因此它也可以表示稀疏,上述矩阵$A$最终结果就是:22。 **矩阵的F范数**:矩阵的各个元素平方之和再开平方根,它通常也叫做矩阵的L2范数,它的有点在它是一个凸函数,可以求导求解,易于计算,上述矩阵A最终结果就是:10.0995。 **矩阵的L21范数**:矩阵先以每一列为单位,求每一列的F范数(也可认为是向量的2范数),然后再将得到的结果求L1范数(也可认为是向量的1范数),很容易看出它是介于L1和L2之间的一种范数,上述矩阵$A$最终结果就是:17.1559。 + ## 1.5 如何判断一个矩阵为正定? 1. 顺序主子式全大于0; 2. 存在可逆矩阵$C$使$C^TC$等于该矩阵; @@ -46,35 +67,52 @@ 4. 合同于单位矩阵$E$(即:规范形为$E$) 5. 标准形中主对角元素全为正; 6. 特征值全为正; -7. 是某基的度量矩阵 +7. 是某基的度量矩阵。 ## 1.6 导数偏导计算 + ## 1.7 导数和偏导数有什么区别? 导数和偏导没有本质区别,都是当自变量的变化量趋于0时,函数值的变化量与自变量变化量比值的极限(如果极限存在的话)。 一元函数,一个$y$对应一个$x$,导数只有一个。 二元函数,一个$z$对应一个$x$和一个$y$,有两个导数:一个是$z$对$x$的导数,一个是$z$对$y$的导数,称之为偏导。 求偏导时要注意,对一个变量求导,则视另一个变量为常数,只对改变量求导,从而将偏导的求解转化成了一元函数的求导了。 (http://blog.sina.com.cn/s/blog_5b014d510100axmt.html) + ## 1.8 特征值分解与特征向量 特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。 -如果说一个向量$\vec{v}$是方阵$A$的特征向量,将一定可以表示成下面的形式:$$A\nu = \lambda \nu$$ -$\lambda$为特征向量$\vec{v}$对应的特征值。特征值分解是将一个矩阵分解为如下形式: $$A=Q\sum Q^{-1}$$ - +如果说一个向量$\vec{v}$是方阵$A$的特征向量,将一定可以表示成下面的形式: +$$ +A\nu = \lambda \nu +$$ +$\lambda$为特征向量$\vec{v}$对应的特征值。特征值分解是将一个矩阵分解为如下形式: +$$ +A=Q\sum Q^{-1} +$$ 其中,$Q$是这个矩阵$A$的特征向量组成的矩阵,$\sum$是一个对角矩阵,每一个对角线元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。也就是说矩阵$A$的信息可以由其特征值和特征向量表示。 对于矩阵为高维的情况下,那么这个矩阵就是高维空间下的一个线性变换。可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。 (http://blog.csdn.net/jinshengtao/article/details/18448355) + ## 1.9 奇异值与特征值有什么关系? -那么奇异值和特征值是怎么对应起来的呢?我们将一个矩阵$A$的转置乘以$A$,并对$AA^T$求特征值,则有下面的形式:$$(A^TA)V = \lambda V$$ -这里$V$就是上面的右奇异向量,另外还有:$$\sigma_i = \sqrt{\lambda\_i}, u\_i=\frac{1}{\sigma\_i}A\mu\_i$$ +那么奇异值和特征值是怎么对应起来的呢?我们将一个矩阵$A$的转置乘以$A$,并对$AA^T$求特征值,则有下面的形式: +$$ +(A^TA)V = \lambda V +$$ +这里$V$就是上面的右奇异向量,另外还有: +$$ +\sigma_i = \sqrt{\lambda_i}, u_i=\frac{1}{\sigma_i}A\mu_i +$$ 这里的$\sigma$就是奇异值,$u$就是上面说的左奇异向量。【证明那个哥们也没给】 奇异值$\sigma$跟特征值类似,在矩阵$\sum$中也是从大到小排列,而且$\sigma$的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前$r$($r$远小于$m、n$)个的奇异值来近似描述矩阵,即部分奇异值分解: -$$A\_{m\times n}\thickapprox U_{m \times r}\sum\_{r\times r}V\_{r \times n}^T$$ - -右边的三个矩阵相乘的结果将会是一个接近于$A$的矩阵,在这儿,$r$越接近于$n$,则相乘的结果越接近于$A$。 +$$ +A_{m\times n}\thickapprox U_{m \times r}\sum_{r\times r}V_{r \times n}^T +$$ +右边的三个矩阵相乘的结果将会是一个接近于$A$的矩阵,在这儿,$r$越接近于$n$,则相乘的结果越接近于$A$。 + ## 1.10 机器学习为什么要使用概率? 事件的概率是衡量该时间发生的可能性的量度。虽然在一次随机试验中某个事件的发生是带有偶然性的,但那些可在相同条件下大量重复的随机试验却往往呈现出明显的数量规律。 机器学习除了处理不确定量,也需处理随机量。不确定性和随机性可能来自多个方面,使用概率论来量化不确定性。 概率论在机器学习中扮演着一个核心角色,因为机器学习算法的设计通常依赖于对数据的概率假设。 + >例如在机器学习(Andrew Ng)的课中,会有一个朴素贝叶斯假设就是条件独立的一个例子。该学习算法对内容做出假设,用来分辨电子邮件是否为垃圾邮件。假设无论邮件是否为垃圾邮件,单词x出现在邮件中的概率条件独立于单词y。很明显这个假设不是不失一般性的,因为某些单词几乎总是同时出现。然而,最终结果是,这个简单的假设对结果的影响并不大,且无论如何都可以让我们快速判别垃圾邮件。 ## 1.11 变量与随机变量有什么区别? @@ -85,6 +123,7 @@ $$A\_{m\times n}\thickapprox U_{m \times r}\sum\_{r\times r}V\_{r \times n}^T$$ 比如: 当变量$x$值为100的概率为1的话,那么$x=100$就是确定了的,不会再有变化,除非有进一步运算. 当变量$x$的值为100的概率不为1,比如为50的概率是0.5,为100的概率是0.5,那么这个变量就是会随不同条件而变化的,是随机变量,取到50或者100的概率都是0.5,即50%。 + ## 1.12 常见概率分布? (https://wenku.baidu.com/view/6418b0206d85ec3a87c24028915f804d2b168707) ![常见概率分布](../img/ch1/prob_distribution_1.png) @@ -96,7 +135,10 @@ $$A\_{m\times n}\thickapprox U_{m \times r}\sum\_{r\times r}V\_{r \times n}^T$$ ![常见概率分布](../img/ch1/prob_distribution_7.png) ## 1.13 举例理解条件概率 -条件概率公式如下:$$P(A/B) = P(A\cap B) / P(B)$$ +条件概率公式如下: +$$ +P(A/B) = P(A\cap B) / P(B) +$$ 说明:在同一个样本空间$\Omega$中的事件或者子集$A$与$B$,如果随机从$\Omega$中选出的一个元素属于$B$,那么下一个随机选择的元素属于$A$ 的概率就定义为在$B$的前提下$A$的条件概率。 ![条件概率](../img/ch1/conditional_probability.jpg) @@ -104,81 +146,99 @@ $$A\_{m\times n}\thickapprox U_{m \times r}\sum\_{r\times r}V\_{r \times n}^T$$ 举例:一对夫妻有两个小孩,已知其中一个是女孩,则另一个是女孩子的概率是多少?(面试、笔试都碰到过) **穷举法**:已知其中一个是女孩,那么样本空间为男女,女女,女男,则另外一个仍然是女生的概率就是1/3; **条件概率法**:$P(女|女)=P(女女)/P(女)$,夫妻有两个小孩,那么它的样本空间为女女,男女,女男,男男,则$P(女女)$为1/4,$P(女)= 1-P(男男)=3/4$,所以最后$1/3$。 -这里大家可能会误解,男女和女男是同一种情况,但实际上类似姐弟和兄妹是不同情况。 +这里大家可能会误解,男女和女男是同一种情况,但实际上类似姐弟和兄妹是不同情况。 + ## 1.14 联合概率与边缘概率联系区别? **区别:** -联合概率:联合概率指类似于$P(X=a,Y=b)$ 这样,包含多个条件,且所有条件同时成立的概率。联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。 +联合概率:联合概率指类似于$P(X=a,Y=b)$这样,包含多个条件,且所有条件同时成立的概率。联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。 边缘概率:边缘概率是某个事件发生的概率,而与其它事件无关。边缘概率指类似于$P(X=a)$,$P(Y=b)$这样,仅与单个随机变量有关的概率 - **联系:** 联合分布可求边缘分布,但若只知道边缘分布,无法求得联合分布。 + ## 1.15条件概率的链式法则 由条件概率的定义,可直接得出下面的乘法公式: -乘法公式 设$A, B$是两个事件,并且$P(A) > 0$, 则有 $$P(AB) = P(B|A)P(A)$$ -推广 $$P(ABC)=P(C|AB)P(B)P(B|A)P(A)$$ -一般地,用归纳法可证:若$P(A\_1A\_2...A\_n)>0$,则有$$P(A\_1A\_2...A\_n)=P(A\_n|A\_1A\_2...A\_{n-1}P(A\_{n-1}|A\_1A\_2...A\_{n-2})...P(A\_2|A\_1)P(A_1)$$ -任何多维随机变量联合概率分布,都可以分解成只有一个变量的条件概率相乘形式。 +乘法公式 设$A, B$是两个事件,并且$P(A) > 0$, 则有 +$$ +P(AB) = P(B|A)P(A) +$$ +推广 +$$ +P(ABC)=P(C|AB)P(B)P(B|A)P(A) +$$ +一般地,用归纳法可证:若$P(A_1A_2...A_n)>0$,则有 +$$ +P(A_1A_2...A_n)=P(A_n|A_1A_2...A_{n-1}P(A_{n-1}|A_1A_2...A_{n-2})...P(A_2|A_1)P(A_1) +$$ +任何多维随机变量联合概率分布,都可以分解成只有一个变量的条件概率相乘形式。 + ## 1.16 独立性和条件独立性 **独立性** 两个随机变量$x$和$y$,概率分布表示成两个因子乘积形式,一个因子只包含$x$,另一个因子只包含$y$,两个随机变量相互独立(independent)。 条件有时为不独立的事件之间带来独立,有时也会把本来独立的事件,因为此条件的存在,而失去独立性。 -举例:$P(XY)=P(X)P(Y)$, 事件$X$和事件$Y$独立。此时给定$Z$,$$P(X,Y|Z) \not = P(X|Z)P(Y|Z)$$ +举例:$P(XY)=P(X)P(Y)$, 事件$X$和事件$Y$独立。此时给定$Z$, +$$ +P(X,Y|Z) \not = P(X|Z)P(Y|Z) +$$ 事件独立时,联合概率等于概率的乘积。这是一个非常好的数学性质,然而不幸的是,无条件的独立是十分稀少的,因为大部分情况下,事件之间都是互相影响的。 - **条件独立性** -给定$Z$的情况下,$X$和$Y$条件独立,当且仅当$$X\bot Y|Z \iff P(X,Y|Z) = P(X|Z)P(Y|Z)$$ +给定$Z$的情况下,$X$和$Y$条件独立,当且仅当 +$$ +X\bot Y|Z \iff P(X,Y|Z) = P(X|Z)P(Y|Z) +$$ $X$和$Y$的关系依赖于$Z$,而不是直接产生。 - **举例**定义如下事件: $X$:明天下雨; $Y$:今天的地面是湿的; $Z$:今天是否下雨; -$Z$事件的成立,对$X$和$Y$均有影响,然而,在$Z$事件成立的前提下,今天的地面情况对明天是否下雨没有影响。 +$Z$事件的成立,对$X$和$Y$均有影响,然而,在$Z$事件成立的前提下,今天的地面情况对明天是否下雨没有影响。 + ## 1.17期望、方差、协方差、相关系数总结 (http://www.360doc.com/content/13/1124/03/9482_331690142.shtml) - **期望** 在概率论和统计学中,数学期望(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和。它反映随机变量平均取值的大小。 线性运算: $E(ax+by+c) = aE(x)+bE(y)+c$ -推广形式: $E(\sum\_{k=1}^{n}{a\_ix\_i+c}) = \sum\_{k=1}^{n}{a\_iE(x\_i)x\_i+c}$ -函数期望:设$f(x)$为$x$的函数,则$f(x)$的期望 -离散函数: $E(f(x))=\sum\_{k=1}^{n}{f(x\_k)P(x\_k)}$ -连续函数: $E(f(x))=\int_{-\infty}^{+\infty}{f(x)p(x)dx}$ -注意:函数的期望不等于期望的函数,即$E(f(x))=f(E(x))$ -一般情况下,乘积的期望不等于期望的乘积。 -如果$X$和$Y$相互独立,则$E(xy)=E(x)E(y)$。 +推广形式: $E(\sum_{k=1}^{n}{a_ix_i+c}) = \sum_{k=1}^{n}{a_iE(x_i)x_i+c}$ +函数期望:设$f(x)$为$x$的函数,则$f(x)$的期望为 + - 离散函数: $E(f(x))=\sum_{k=1}^{n}{f(x_k)P(x_k)}$ + - 连续函数: $E(f(x))=\int_{-\infty}^{+\infty}{f(x)p(x)dx}$ +注意:函数的期望不等于期望的函数,即$E(f(x))=f(E(x))​$ +一般情况下,乘积的期望不等于期望的乘积。 +如果$X​$和$Y​$相互独立,则$E(xy)=E(x)E(y)​$。 **方差** 概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。 -方差是一种特殊的期望。定义为: $$Var(x) = E((x-E(x))^2)$$ - +方差是一种特殊的期望。定义为: +$$ +Var(x) = E((x-E(x))^2) +$$ 方差性质: -1. $Var(x) = E(x^2) -E(x)^2$ -2. 常数的方差为0; -3. 方差不满足线性性质; -4. 如果$X$和$Y$相互独立, $Var(ax+by)=Var(x)+Var(y)$ - +1)$Var(x) = E(x^2) -E(x)^2$ +2) 常数的方差为0; +3)方差不满足线性性质; +4)如果$X$和$Y$相互独立, $Var(ax+by)=Var(x)+Var(y)$ **协方差** 协方差是衡量两个变量线性相关性强度及变量尺度。 -两个随机变量的协方差定义为:$$Cov(x,y)=E((x-E(x))(y-E(y)))$$ +两个随机变量的协方差定义为: +$$ +Cov(x,y)=E((x-E(x))(y-E(y))) +$$ 方差是一种特殊的协方差。当$X=Y$时,$Cov(x,y)=Var(x)=Var(y)$。 协方差性质: 1) 独立变量的协方差为0。 -2) 协方差计算公式:$$Cov(\sum\_{i=1}^{m}{a\_ix\_i}, \sum\_{j=1}^{m}{b\_jy\_j}) = \sum\_{i=1}^{m} \sum\_{j=1}^{m}{a\_ib\_jCov(x\_iy\_i)}$$ -3) 特殊情况: $$Cov(a+bx, c+dy) = bdCov(x, y)$$ +2) 协方差计算公式: +$$ +Cov(\sum_{i=1}^{m}{a_ix_i}, \sum_{j=1}^{m}{b_jy_j}) = \sum_{i=1}^{m} \sum_{j=1}^{m}{a_ib_jCov(x_iy_i)} +$$ +3) 特殊情况: +$$ +Cov(a+bx, c+dy) = bdCov(x, y) +$$ **相关系数** 相关系数是研究变量之间线性相关程度的量。 -两个随机变量的相关系数定义为: $$Corr(x,y) = \frac{Cov(x,y)}{\sqrt{Var(x)Var(y)}}$$ +两个随机变量的相关系数定义为: +$$ +Corr(x,y) = \frac{Cov(x,y)}{\sqrt{Var(x)Var(y)}} +$$ 性质: 1) 有界性。相关系数的取值范围是 ,可以看成无量纲的协方差。 -2) 值越接近1,说明两个变量正相关性(线性)越强。越接近-1,说明负相关性越强,当为0时,表示两个变量没有相关性。 - - - - - - - - - - +2) 值越接近1,说明两个变量正相关性(线性)越强。越接近-1,说明负相关性越强,当为0时,表示两个变量没有相关性。 \ No newline at end of file diff --git a/MarkDown/第七章_生成对抗网络(GAN).md b/MarkDown/第七章_生成对抗网络(GAN).md new file mode 100644 index 0000000..8a2d25b --- /dev/null +++ b/MarkDown/第七章_生成对抗网络(GAN).md @@ -0,0 +1 @@ +待提出 diff --git a/MarkDown/第三章_深度学习基础.md b/MarkDown/第三章_深度学习基础.md index c680b49..85787fd 100644 --- a/MarkDown/第三章_深度学习基础.md +++ b/MarkDown/第三章_深度学习基础.md @@ -128,7 +128,8 @@ http://mini.eastday.com/mobile/180116023302833.html ![](../img/ch3/3-8.png) -2. 梯度爆炸; +2. 梯度爆炸 + 又称exploding gradient problem,在深度网络或循环神经网络(RNN)等网络结构中,梯度可在网络更新的过程中不断累积,变成非常大的梯度,导致网络权重值的大幅更新,使得网络不稳定;在极端情况下,权重值甚至会溢出,变为NaN值,再也无法更新。 具体可参考文献https://machinelearningmastery.com/exploding-gradients-in-neural-networks/ ; 3. 权重矩阵的退化导致模型的有效自由度减少。参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络深度)的增加,矩阵的乘积变得越来越退化; @@ -401,6 +402,11 @@ $$ 来源:[一文弄懂神经网络中的反向传播法——BackPropagation](http://www.cnblogs.com/charlotte77/p/5629865.html) +### 3.2.6 了解神经网络知识的读者可能会有一个疑问,具有一个隐藏层的人工神经网络已经非常强大了,理论上来说,只要神经元足够多,构成一个很“宽”的网络,它就可以拟合任意的函数,那为什么还要更“深”呢?(贡献者:黄钦建-华南理工大学) + +原因在于:在神经元数量相同的情况下,深层网络结构具有更大的容量,分层组合带来的是指数级的表达空间,能够组合成更多不同类型的子结构,这样可以更容易地学习和表示各种特征。并且,隐藏层增加则意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。 + + ## 3.3 超参数 ### 3.3.1 什么是超参数? @@ -577,6 +583,50 @@ $$ softmax 直白来说就是将原来输出是 $ 3,1,-3 $ 通过 softmax 函数一作用,就映射成为 $ (0,1) $ 的值,而这些值的累和为 $ 1 $(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标! +### 3.4.10 交叉熵代价函数定义及其求导推导。(贡献者:黄钦建-华南理工大学) + + +神经元的输出就是 a = σ(z),其中$z=\sum w_{j}i_{j}+b$是输⼊的带权和。 + +$C=-\frac{1}{n}\sum[ylna+(1-y)ln(1-a)]$ + +其中 n 是训练数据的总数,求和是在所有的训练输⼊ x 上进⾏的, y 是对应的⽬标输出。 + +表达式是否解决学习缓慢的问题并不明显。实际上,甚⾄将这个定义看做是代价函数也不是显⽽易⻅的!在解决学习缓慢前,我们来看看交叉熵为何能够解释成⼀个代价函数。 + +将交叉熵看做是代价函数有两点原因。 + +第⼀,它是⾮负的, C > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。 + +第⼆,如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。 + +假设在这个例⼦中, y = 0 ⽽ a ≈ 0。这是我们想到得到的结果。我们看到公式中第⼀个项就消去了,因为 y = 0,⽽第⼆项实际上就是 − ln(1 − a) ≈ 0。反之, y = 1 ⽽ a ≈ 1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的) + +综上所述,交叉熵是⾮负的,在神经元达到很好的正确率的时候会接近 0。这些其实就是我们想要的代价函数的特性。其实这些特性也是⼆次代价函数具备的。所以,交叉熵就是很好的选择了。但是交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。为了弄清楚这个情况,我们来算算交叉熵函数关于权重的偏导数。我们将$a={\varsigma}(z)$代⼊到 公式中应⽤两次链式法则,得到: + +$\begin{eqnarray}\frac{\partial C}{\partial w_{j}}&=&-\frac{1}{n}\sum \frac{\partial }{\partial w_{j}}[ylna+(1-y)ln(1-a)]\\&=&-\frac{1}{n}\sum \frac{\partial }{\partial a}[ylna+(1-y)ln(1-a)]*\frac{\partial a}{\partial w_{j}}\\&=&-\frac{1}{n}\sum (\frac{y}{a}-\frac{1-y}{1-a})*\frac{\partial a}{\partial w_{j}}\\&=&-\frac{1}{n}\sum (\frac{y}{\varsigma(z)}-\frac{1-y}{1-\varsigma(z)})\frac{\partial \varsigma(z)}{\partial w_{j}}\\&=&-\frac{1}{n}\sum (\frac{y}{\varsigma(z)}-\frac{1-y}{1-\varsigma(z)}){\varsigma}'(z)x_{j}\end{eqnarray}$ + +根据$\varsigma(z)=\frac{1}{1+e^{-z}}$ 的定义,和⼀些运算,我们可以得到 ${\varsigma}'(z)=\varsigma(z)(1-\varsigma(z))$。化简后可得: + +$\frac{\partial C}{\partial w_{j}}=\frac{1}{n}\sum x_{j}({\varsigma}(z)-y)$ + +这是⼀个优美的公式。它告诉我们权重学习的速度受到$\varsigma(z)-y$,也就是输出中的误差的控制。更⼤的误差,更快的学习速度。这是我们直觉上期待的结果。特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中${\varsigma}'(z)$导致的学习缓慢。当我们使⽤交叉熵的时候,${\varsigma}'(z)$被约掉了,所以我们不再需要关⼼它是不是变得很⼩。这种约除就是交叉熵带来的特效。实际上,这也并不是⾮常奇迹的事情。我们在后⾯可以看到,交叉熵其实只是满⾜这种特性的⼀种选择罢了。 + +根据类似的⽅法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到: + +$\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)$ + + +再⼀次, 这避免了⼆次代价函数中类似${\varsigma}'(z)$项导致的学习缓慢。 + +### 3.4.11 为什么Tanh收敛速度比Sigmoid快?(贡献者:黄钦建-华南理工大学) + +`$tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)$` + +`$s^{,}(x)=s(x)*(1-s(x))\in (0,\frac{1}{4}]$` + +由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻,所以Tanh收敛速度比Sigmoid快。 + ## 3.5 Batch_Size ### 3.5.1 为什么需要 Batch_Size? @@ -789,6 +839,13 @@ Weight Normalization 和 Batch Normalization 都属于参数重写(Reparameter 不需要额外的存储空间来保存 mini batch 的均值和方差,同时实现 Weight Normalization 时,对深度学习网络进行正向信号传播和反向梯度计算带来的额外计算开销也很小。因此,要比采用 Batch Normalization 进行 normalization 操作时,速度快。 但是 Weight Normalization 不具备 Batch Normalization 把网络每一层的输出 Y 固定在一个变化范围的作用。因此,采用 Weight Normalization 进行 Normalization 时需要特别注意参数初始值的选择。 +### 3.6.13 Batch Normalization在什么时候用比较合适?(贡献者:黄钦建-华南理工大学) + +在CNN中,BN应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。 + +BN比较适用的场景是:每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。 + + ## 3.7 预训练与微调(fine tuning) ### 3.7.1 为什么无监督预训练可以帮助深度学习? @@ -1007,4 +1064,48 @@ tf.train.RMSPropOptimizer 5. dropout 自己虽然也很牛,但是 dropout、max-normalization、large decaying learning rates and high momentum 组合起来效果更好,比如 max-norm regularization 就可以防止大的learning rate 导致的参数 blow up。 6. 使用 pretraining 方法也可以帮助 dropout 训练参数,在使用 dropout 时,要将所有参数都乘以 $ 1/p $。 -## 3.27 Padding 系列问题 \ No newline at end of file + +## 3.13 深度学习中常用的数据增强方法(Data Augmentation)?(贡献者:黄钦建-华南理工大学) + +- Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当); + +- PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering; + +- Random Scale:尺度变换; + +- Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换; + +- Horizontal/Vertical Flip:水平/垂直翻转; + +- Shift:平移变换; + +- Rotation/Reflection:旋转/仿射变换; + +- Noise:高斯噪声、模糊处理; + +- Label Shuffle:类别不平衡数据的增广; + +## 3.14 请解释深度学习中的 Internal Covariate Shift的意思?(贡献者:黄钦建-华南理工大学) + +深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。 + +Google 将这一现象总结为 Internal Covariate Shift,简称 ICS。 什么是 ICS 呢? + +大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。 + +大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。 + + +**那么ICS会导致什么问题?** + +简而言之,每个神经元的输入数据不再是“独立同分布”。 + +其一,上层参数需要不断适应新的输入数据分布,降低学习速度。 + +其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。 + +其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。 + +## 3.27 Padding 系列问题 + +## 3. diff --git a/MarkDown/深度学习500问-Tan-08第八章 图像分割(md版本).md b/MarkDown/第九章_图像分割.md similarity index 88% rename from MarkDown/深度学习500问-Tan-08第八章 图像分割(md版本).md rename to MarkDown/第九章_图像分割.md index b128861..1ecc581 100644 --- a/MarkDown/深度学习500问-Tan-08第八章 图像分割(md版本).md +++ b/MarkDown/第九章_图像分割.md @@ -1,11 +1,12 @@ -############################################################# -## 深度学习500问-Tan-08第八章 图像分割(md版本) +######################################################### +### 深度学习500问-第九章 图像分割(md版本) 作者:scutan90 -编辑者:shw2018(UESTC_孙洪卫_硕) -时间:2018.10.25 -############################################################# +编辑者:shw2018(UESTC_孙洪卫_硕,Wechat:sunhwee) +提交:2018.10.25 +更新:2018.10.28 +######################################################### -# **第八章 图像分割** +# **第九章 图像分割** ## **8.1 传统的基于CNN的分割方法缺点?**    @@ -60,7 +61,7 @@ FCN对图像进行像素级的分类,从而解决了语义级别的图像分    (1)存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。    -(2)计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。 +(2)计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。    (3)像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。 @@ -218,7 +219,8 @@ learning rate:0.001。 第二,定位准确性和上下文间不可兼得。大的patches需要更多的max-pooling层这样减小了定位准确性(为什么?因为你是对以这个像素为中心的点进行分类,如果patch太大,最后经过全连接层的前一层大小肯定是不变的,如果你patch大就需要更多的pooling达到这个大小),因为Pooling层会降低分辨率,丢失信息),而小的patches只能看到很小的局部信息,包含的背景信息不够。许多现在的方法使用不同层的特征来同时兼容定位和利用context。    在这篇论文,我们建立了一个更好全卷积方法。我们定义和扩展了这个方法它使用更少的训练图片但产生更精确的分割。 -
+
+    (1) 使用全卷积神经网络。(全卷积神经网络就是卷积取代了全连接层,全连接层必须固定图像大小而卷积不用,所以这个策略使得,你可以输入任意尺寸的图片,而且输出也是图片,所以这是一个端到端的网络。)    @@ -230,6 +232,77 @@ learning rate:0.001。    (4) 最后再经过两次卷积,达到最后的heatmap,再用一个1X1的卷积做分类,这里是分成两类,所以用的是两个神经元做卷积,得到最后的两张heatmap,例如第一张表示的是第一类的得分(即每个像素点对应第一类都有一个得分),第二张表示第二类的得分heatmap,然后作为softmax函数的输入,算出概率比较大的softmax类,选择它作为输入给交叉熵进行反向传播训练。 +## 下面是U-Net模型的代码实现:(贡献者:黄钦建-华南理工大学) + +``` +def get_unet(): + inputs = Input((img_rows, img_cols, 1)) + conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(inputs) + conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1) + pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) + # pool1 = Dropout(0.25)(pool1) + # pool1 = BatchNormalization()(pool1) + + conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1) + conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2) + pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) + # pool2 = Dropout(0.5)(pool2) + # pool2 = BatchNormalization()(pool2) + + conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2) + conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3) + pool3 = MaxPooling2D(pool_size=(2, 2))(conv3) + # pool3 = Dropout(0.5)(pool3) + # pool3 = BatchNormalization()(pool3) + + conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(pool3) + conv4 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv4) + pool4 = MaxPooling2D(pool_size=(2, 2))(conv4) + # pool4 = Dropout(0.5)(pool4) + # pool4 = BatchNormalization()(pool4) + + conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(pool4) + conv5 = Conv2D(512, (3, 3), activation='relu', padding='same')(conv5) + + up6 = concatenate([Conv2DTranspose(256, (2, 2), strides=( + 2, 2), padding='same')(conv5), conv4], axis=3) + # up6 = Dropout(0.5)(up6) + # up6 = BatchNormalization()(up6) + conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(up6) + conv6 = Conv2D(256, (3, 3), activation='relu', padding='same')(conv6) + + up7 = concatenate([Conv2DTranspose(128, (2, 2), strides=( + 2, 2), padding='same')(conv6), conv3], axis=3) + # up7 = Dropout(0.5)(up7) + # up7 = BatchNormalization()(up7) + conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(up7) + conv7 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv7) + + up8 = concatenate([Conv2DTranspose(64, (2, 2), strides=( + 2, 2), padding='same')(conv7), conv2], axis=3) + # up8 = Dropout(0.5)(up8) + # up8 = BatchNormalization()(up8) + conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(up8) + conv8 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv8) + + up9 = concatenate([Conv2DTranspose(32, (2, 2), strides=( + 2, 2), padding='same')(conv8), conv1], axis=3) + # up9 = Dropout(0.5)(up9) + # up9 = BatchNormalization()(up9) + conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(up9) + conv9 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv9) + + # conv9 = Dropout(0.5)(conv9) + + conv10 = Conv2D(1, (1, 1), activation='sigmoid')(conv9) + + model = Model(inputs=[inputs], outputs=[conv10]) + + model.compile(optimizer=Adam(lr=1e-5), + loss=dice_coef_loss, metrics=[dice_coef]) + + return model +``` ## **8.3 SegNet**    @@ -245,6 +318,7 @@ learning rate:0.001。    SegNet网络的结构如下图所示:
+    SegNet网络结构如图1所示,Input为输入图片,Output为输出分割的图像,不同颜色代表不同的分类。语义分割的重要性就在于不仅告诉你图片中某个东西是什么,而且告知你他在图片的位置。我们可以看到是一个对称网络,由中间绿色pooling层与红色upsampling层作为分割,左边是卷积提取高维特征,并通过pooling使图片变小,SegNet作者称为Encoder,右边是反卷积(在这里反卷积与卷积没有区别)与upsampling,通过反卷积使得图像分类后特征得以重现,upsampling使图像变大,SegNet作者称为Decoder,最后通过Softmax,输出不同分类的最大值。这就是大致的SegNet过程,下面对这个过程里面使用到的方法进行介绍。    @@ -252,6 +326,7 @@ SegNet网络结构如图1所示,Input为输入图片,Output为输出分割    SegNet解码技术如下图所示:
+    解码网络使用保存的最大池化索引上采样,得到稀疏的特征图,将特征图与可训练的解码滤波器族卷积得到致密的特征图。之后进行BN。高维的特征图输入soft-max层,对每个像素进行分类,得到每个像素属于K类的概率。 图3中右边是FCN的解码技术,FCN对编码的特征图进行降维,降维后输入到解码网络,解码网络中,上采样使用反卷积实现,上采样的特征图与降维的编码图进行element-wise add得到最终的解码特征图。FCN解码模型需要存储编码特征图,在嵌入式设备中内存紧张。    @@ -276,6 +351,7 @@ SegNet的Encoder过程中,卷积的作用是提取特征,SegNet使用的卷    下面看一下dilated conv原始论文[4]中的示意图
+    (a) 图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1) * layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。    @@ -291,13 +367,15 @@ RefineNet block的作用就是把不同resolution level的feature map进行融    最左边一栏就是FCN的encoder部分(文中是用的ResNet),先把pretrained ResNet按feature map的分辨率分成四个ResNet blocks,然后向右把四个blocks分别作为4个path通过RefineNet block进行融合refine,最后得到一个refined feature map(接softmax再双线性插值输出)。 注意除了RefineNet-4,所有的RefineNet block都是二输入的,用于融合不同level做refine,而单输入的RefineNet-4可以看作是先对ResNet的一个task adaptation。 +    **RefineNet Block**    接下来仔细看一下RefineNet block,可以看到主要组成部分是Residual convolution unit, Multi-resolution fusion, Chained residual pooling, Output convolutions. 切记这个block作用是融合多个level的feature map输出单个level的feature map,但具体的实现应该是和输入个数、shape无关的。 -
+
+    -Residual convolution unit就是普通的去除了BN的residual unit; +Residual convolution unit就是普通的去除了BN的residual unit;    Multi-resolution fusion是先对多输入的feature map都用一个卷积层进行adaptation(都化到最小的feature map的shape),再上采样再做element-wise的相加。注意如果是像RefineNet-4那样的单输入block这一部分就直接pass了;    @@ -308,7 +386,7 @@ Output convolutions就是输出前再加一个RCU。 ## **8.6 PSPNet**    -场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的.本文使用文中的pyramid pooling module实现基于不同区域的上下文集成,提出了PSPNet,实现利用上下文信息的能力进行场景解析。 +场景解析对于无限制的开放词汇和不同场景来说是具有挑战性的.本文使用文中的pyramid pooling module实现基于不同区域的上下文集成,提出了PSPNet,实现利用上下文信息的能力进行场景解析。    作者认为,FCN存在的主要问题是没有采取合适的策略来用全局的信息,本文的做法就是借鉴SPPNet来设计了PSPNet解决这个问题。    @@ -316,8 +394,9 @@ Output convolutions就是输出前再加一个RCU。
   FCN认为右侧框中是汽车,但是实际上是船,如果参考上下文的先验知识,就会发现左边是一个船屋,进而推断是框中是船.FCN存在的主要问题就是不能利用好全局的场景线索。 +    -对于尤其复杂的场景理解,之前都是采用空间金字塔池化来做的,和之前方法不同(为什么不同,需要参考一下经典的金字塔算法),本文提出了pyramid scene parsing network(PSPNet)。 +对于尤其复杂的场景理解,之前都是采用空间金字塔池化来做的,和之前方法不同(为什么不同,需要参考一下经典的金字塔算法),本文提出了pyramid scene parsing network(PSPNet)。    本文的主要贡献如下:    @@ -371,7 +450,7 @@ DeepLabv2 是相对于 DeepLabv1 基础上的优化。DeepLabv1 在三个方向    论文受到 Spatial Pyramid Pooling (SPP) 的启发,提出了一个类似的结构,在给定的输入上以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文,称为 ASPP (atrous spatial pyramid pooling) 模块。    -DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF 在增强模型捕捉细节的能力。 +DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF 在增强模型捕捉细节的能力。    论文模型基于 ResNet,在 NVidia Titan X GPU 上运行速度达到了 8FPS,全连接 CRF 平均推断需要 0.5s ,在耗时方面和 DeepLabv1 无差异,但在 PASCAL VOC-2012 达到 79.7 mIOU。 @@ -381,9 +460,10 @@ DCNN 的分类不变形影响空间精度。DeepLabv2 是采样全连接的 CRF 好的论文不止说明怎么做,还告诉为什么。DeepLab 延续到 DeepLabv3 系列,依然是在空洞卷积做文章,但是探讨不同结构的方向。    DeepLabv3 论文比较了多种捕获多尺度信息的方式: -
+
+    -1.Image Pyramid:将输入图片放缩成不同比例,分别应用在 DCNN 上,将预测结果融合得到最终输出。 +1.Image Pyramid:将输入图片放缩成不同比例,分别应用在 DCNN 上,将预测结果融合得到最终输出。    2.Encoder-Decoder:利用 Encoder 阶段的多尺度特征,运用到 Decoder 阶段上恢复空间分辨率,代表工作有 FCN、SegNet、PSPNet 等工。    @@ -409,7 +489,8 @@ deeplab V3新设计的aspp结构解决了问题1,deeplab v3+主要目的在于 问题2 可以使用空洞卷积替代更多的pooling层来获取分辨率更高的feature。但是feature分辨率更高会极大增加运算量。 以deeplab v3 使用的resnet101为例, stride=16将造成后面9层feature变大,后面9层的计算量变为原来的2*2=4倍大。stride=8则更为恐怖,后面78层的计算量都会变大很多。    解决方案:1、编解码器结构。2 Modified Aligned Xception -
+
+    在deeplabv3 基础上 加入解码器。 A是aspp结构。 A的8*的上采样可以看做是一个naïve的解码器。 B是编解码结构。集合了高层和底层的feature。 C就是本文采取的结构。Conv2(图中红色)的提取到结果和最后提取出的feature上采样4后融合。    @@ -417,17 +498,19 @@ deeplab V3新设计的aspp结构解决了问题1,deeplab v3+主要目的在于    (1)Encoder-Decoder with Atrous Convolution
+    编码器采用deeplabv3。    解码器部分:先从低层级选一个feature,将低层级的feature用1 * 1的卷积进行通道压缩(原本为256通道,或者512通道),目的在于减少低层级的比重。作者认为编码器得到的feature具有更丰富的信息,所以编码器的feature应该有更高的比重。 这样做有利于训练。    -再将编码器的输出上采样,使其分辨率与低层级feature一致。 举个例子,如果采用resnet conv2 输出的feature,则这里要*4上采样。 将两种feature 连接后,再进行一次3*3的卷积(细化作用),然后再次上采样就得到了像素级的预测。 后面的实验结果表明这种结构在stride=16时既有很高的精度速度又很快。stride=8相对来说只获得了一点点精度的提升,但增加了很多的计算量。 +再将编码器的输出上采样,使其分辨率与低层级feature一致。 举个例子,如果采用resnet conv2 输出的feature,则这里要* 4上采样。 将两种feature 连接后,再进行一次3 * 3的卷积(细化作用),然后再次上采样就得到了像素级的预测。 后面的实验结果表明这种结构在 stride=16 时既有很高的精度速度又很快。stride=8相对来说只获得了一点点精度的提升,但增加了很多的计算量。    (2)Modified Aligned Xception    Xception 主要采用了deepwish seperable convolution来替换原来的卷积层。简单的说就是这种结构能在更少参数更少计算量的情况下学到同样的信息。这边则是考虑将原来的resnet-101骨架网换成xception。
+    红色部分为修改    @@ -483,11 +566,11 @@ PS: 虽然 Misalignment 在分类问题上影响并不大,但在 Pixel 级    **3.技术要点3 - Loss Function**    -每个 ROIAlign 对应 K * m^2 维度的输出。K 对应类别个数,即输出 K 个mask,m对应 池化分辨率(7*7)。Loss 函数定义: +每个 ROIAlign 对应 K * m^2 维度的输出。K 对应类别个数,即输出 K 个mask,m对应 池化分辨率(7 * 7)。Loss 函数定义: $$ Lmask(Cls_k)=Sigmoid(Cls_k) -$$ -    +$$ +   $Lmask(Cls_k) = Sigmoid (Cls_k)$,平均二值交叉熵 (average binary cross-entropy)Loss,通过逐像素的 Sigmoid 计算得到。    Why K个mask?通过对每个 Class 对应一个 Mask 可以有效避免类间竞争(其他 Class 不贡献 Loss )。 @@ -548,17 +631,16 @@ UC Berkeley的Deepak Pathak 使用了一个具有图像级别标记的训练数    该方法把训练过程看作是有线性限制条件的最优化过程: $$ -\underset{\theta, P}{minimize} \;\;\;\;\;\;\;\;\;\;D(P(X)||Q(X|\theta)) +\underset{\theta, P}{minimize} \;\;\;\;\;\;\;\;\;\;\;D(P(X)||Q(X|\theta)) $$ $$ -subject \, \,to \, \, \,\, \, \, \, \, A\vec{P}\geq \vec{b,} \, \, \,\, \, \, \, \,\sum_x P\left(X \right )=1. +subject \, \,to \, \, \,\, A\vec{P}\geq \vec{b,} \, \, \,\, \, \, \, \,\sum_x P\left(X \right )=1. $$    其中 是一个隐含的类别分布, 是CNN预测的类别分布。目标函数是KL-divergence最小化。其中的线性限制条件来自于训练数据上的标记,例如一幅图像中前景类别像素个数期望值的上界或者下界(物体大小)、某个类别的像素个数在某图像中为0,或者至少为1等。该目标函数可以转化为为一个loss function,然后通过SGD进行训练。
   -实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差,在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%,加上物体大小的限制条件后能达到45.1%, 如果再使用bounding box做限制,可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。 - +实验中发现单纯使用Image tags作为限制条件得到的分割结果还比较差,在PASCAL VOC 2012 test数据集上得到的mIoU为35.6%,加上物体大小的限制条件后能达到45.1%, 如果再使用bounding box做限制,可以达到54%。FCN-8s可以达到62.2%,可见弱监督学习要取得好的结果还是比较难。 **8.9.3 DeepLab+bounding box+image-level labels** @@ -576,7 +658,7 @@ $$ 使用EM算法估计 和 。E步骤是固定 求 的期望值,M步骤是固定 使用SGD计算。
   -对于给出bounding box标记的训练图像,该方法先使用CRF对该训练图像做自动分割,然后在分割的基础上做全监督学习。通过实验发现,单纯使用图像级别的标记得到的分割效果较差,但是使用bounding box的训练数据可以得到较好的结果,在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。 +对于给出bounding box标记的训练图像,该方法先使用CRF对该训练图像做自动分割,然后在分割的基础上做全监督学习。通过实验发现,单纯使用图像级别的标记得到的分割效果较差,但是使用bounding box的训练数据可以得到较好的结果,在VOC2012 test数据集上得到mIoU 62.2%。另外如果使用少量的全标记图像和大量的弱标记图像进行结合,可以得到与全监督学习(70.3%)接近的分割结果(69.0%)。 **8.9.4统一的框架** @@ -586,7 +668,7 @@ Learning to Segment Under Various Forms of Weak Supervision (CVPR 2015) Wisconsin-Madison大学的Jia Xu提出了一个统一的框架来处理各种不同类型的弱标记:图像级别的标记、bounding box和部分像素标记如scribbles。该方法把所有的训练图像分成共计 个super-pixel,对每个super-pixel提取一个 维特征向量。因为不知道每个super-pixel所属的类别,相当于无监督学习,因此该方法对所有的super-pixel做聚类,使用的是最大间隔聚类方法(max-margin clustering, MMC),该过程的最优化目标函数是: $$ \frac{1}{2}tr\left ( W^TW \right ) + \lambda\sum_{p=1}^{n}\sum_{c=1}^{C}\xi \left ( w_c;x_p;h_p^c \right ) -$$ +$$    其中 是一个特征矩阵,每列代表了对于的类别的聚类特征。 是将第 个super-pixel划分到第 类的代价。在这个目标函数的基础上,根据不同的弱标记方式,可以给出不同的限制条件,因此该方法就是在相应的限制条件下求最大间隔聚类。
@@ -598,3 +680,30 @@ $$    小结:在弱标记的数据集上训练图像分割算法可以减少对大量全标记数据的依赖,在大多数应用中会更加贴合实际情况。弱标记可以是图像级别的标记、边框和部分像素的标记等。训练的方法一般看做是限制条件下的最优化方法。另外EM算法可以用于CNN参数和像素类别的联合求优。 +## 8.10 DenseNet(贡献者:黄钦建-华南理工大学) + +这篇论文是CVPR2017年的最佳论文。 + +卷积神经网络结构的设计主要朝着两个方向发展,一个是更宽的网络(代表:GoogleNet、VGG),一个是更深的网络(代表:ResNet)。但是随着层数的加深会出现一个问题——梯度消失,这将会导致网络停止训练。到目前为止解决这个问题的思路基本都是在前后层之间加一个identity connections(short path)。 + +![](../img/ch8/8-10-3.png) + +由上图中可知Resnet是做值的相加(也就是add操作),通道数是不变的。而DenseNet是做通道的合并(也就是Concatenation操作),就像Inception那样。从这两个公式就可以看出这两个网络的本质不同。此外DensetNet的前面一层输出也是后面所有层的输入,这也不同于ResNet残差网络。 + + +![](../img/ch8/8-10-1.png) + +DenseNet的Block结构如上图所示。 + +1*1卷积核的目的:减少输入的特征图数量,这样既能降维减少计算量,又能融合各个通道的特征。我们将使用BottleNeck Layers的DenseNet表示为DenseNet-B。(在论文的实验里,将1×1×n小卷积里的n设置为4k,k为每个H产生的特征图数量) + +![](../img/ch8/8-10-2.png) + +上图是DenseNet网络的整体网络结构示意图。其中1*1卷积核的目的是进一步压缩参数,并且在Transition Layer层有个参数Reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半。当Reduction的值小于1的时候,我们就把带有这种层的网络称为DenseNet-C。 + +DenseNet网络的优点包括: +1、减轻了梯度消失 +2、加强了feature的传递 +3、更有效地利用了feature  +4、一定程度上较少了参数数量 +5、一定程度上减轻了过拟合 diff --git a/MarkDown/第二章_机器学习基础.md b/MarkDown/第二章_机器学习基础.md new file mode 100644 index 0000000..68b5b9a --- /dev/null +++ b/MarkDown/第二章_机器学习基础.md @@ -0,0 +1,1821 @@ +# 第二章 机器学习基础 +## 2.1 各种常见算法图示 +|回归算法|基于实例的算法|正则化方法| +|:-:|:-:|:-:| +|![](../img/ch2/2.1/1.jpg)|![](../img/ch2/2.1/2.jpg)|![](../img/ch2/2.1/3.png)| + +|决策树学习|贝叶斯方法|基于核的算法| +|:-:|:-:|:-:| +|![](../img/ch2/2.1/4.png)|![](../img/ch2/2.1/5.jpg)|![](../img/ch2/2.1/6.jpg)| + +|聚类算法|关联规则学习|人工神经网络| +|:-:|:-:|:-:| +|![](../img/ch2/2.1/7.png)|![](../img/ch2/2.1/8.jpg)|![](../img/ch2/2.1/9.png)| + +|深度学习|降低维度算法|集成算法| +|:-:|:-:|:-:| +|![](../img/ch2/2.1/10.jpg)|![](../img/ch2/2.1/11.jpg)|![](../img/ch2/2.1/12.jpg)| + +## 2.2 监督学习、非监督学习、半监督学习、弱监督学习? +根据数据类型的不同,对一个问题的建模有不同的方式。依据不同的学习方式和输入数据,机器学习主要分为以下四种学习方式。 + +**监督学习**: +1. 监督学习是使用已知正确答案的示例来训练网络。已知数据和其一一对应的标签,训练一个智能算法,将输入数据映射到标签的过程。 +2. 监督式学习的常见应用场景如分类问题和回归问题。 +3. 常见算法有逻辑回归(Logistic Regression)和反向传递神经网络(Back Propagation Neural Network) + +**非监督式学习**: +1. 在非监督式学习中,数据并不被特别标识,适用于你具有数据集但无标签的情况。学习模型是为了推断出数据的一些内在结构。 +2. 常见的应用场景包括关联规则的学习以及聚类等。 +3. 常见算法包括Apriori算法以及k-Means算法。 + +**半监督式学习**: +1. 在此学习方式下,输入数据部分被标记,部分没有被标记,这种学习模型可以用来进行预测。 +2. 应用场景包括分类和回归,算法包括一些对常用监督式学习算法的延伸,通过对已标记数据建模,在此基础上,对未标记数据进行预测。 +3. 常见算法如图论推理算法(Graph Inference)或者拉普拉斯支持向量机(Laplacian SVM)等。 + +**弱监督学习**: +1. 弱监督学习可以看做是有多个标记的数据集合,次集合可以是空集,单个元素,或包含多种情况(没有标记,有一个标记,和有多个标记)的多个元素。 +2. 数据集的标签是不可靠的,这里的不可靠可以是标记不正确,多种标记,标记不充分,局部标记等。 +3. 已知数据和其一一对应的弱标签,训练一个智能算法,将输入数据映射到一组更强的标签的过程。标签的强弱指的是标签蕴含的信息量的多少,比如相对于分割的标签来说,分类的标签就是弱标签。 +4. 举例,告诉一张包含气球的图片,需要得出气球在图片中的位置及气球和背景的分割线,这就是已知弱标签学习强标签的问题。 + +在企业数据应用的场景下, 人们最常用的可能就是监督式学习和非监督式学习的模型。 在图像识别等领域,由于存在大量的非标识的数据和少量的可标识数据, 目前半监督式学习是一个很热的话题。 + +## 2.3 监督学习有哪些步骤 +**监督式学习**: +监督学习是使用已知正确答案的示例来训练网络。每组训练数据有一个明确的标识或结果,想象一下,我们可以训练一个网络,让其从照片库中(其中包含气球的照片)识别出气球的照片。以下就是我们在这个假设场景中所要采取的步骤。 +**步骤1:数据集的创建和分类** +首先,浏览你的照片(数据集),确定所有包含气球的照片,并对其进行标注。然后,将所有照片分为训练集和验证集。目标就是在深度网络中找一函数,这个函数输入是任意一张照片,当照片中包含气球时,输出1,否则输出0。 +**步骤2:训练** +选择合适的模型,模型可通过以下激活函数对每张照片进行预测。既然我们已经知道哪些是包含气球的图片,那么我们就可以告诉模型它的预测是对还是错。然后我们会将这些信息反馈(feed back)给网络。 +该算法使用的这种反馈,就是一个量化“真实答案与模型预测有多少偏差”的函数的结果。这个函数被称为成本函数(cost function),也称为目标函数(objective function),效用函数(utility function)或适应度函数(fitness function)。然后,该函数的结果用于修改一个称为反向传播(backpropagation)过程中节点之间的连接强度和偏差。 +我们会为每个图片都重复一遍此操作,而在每种情况下,算法都在尽量最小化成本函数。 +其实,我们有多种数学技术可以用来验证这个模型是正确还是错误的,但我们常用的是一个非常常见的方法,我们称之为梯度下降(gradient descent)。 +**步骤3:验证** +当处理完训练集所有照片,接着要去测试该模型。利用验证集来来验证训练有素的模型是否可以准确地挑选出含有气球在内的照片。 +在此过程中,通常会通过调整和模型相关的各种事物(超参数)来重复步骤2和3,诸如里面有多少个节点,有多少层,哪些数学函数用于决定节点是否亮起,如何在反向传播阶段积极有效地训练权值等等。 +**步骤4:测试及应用** +当有了一个准确的模型,就可以将该模型部署到你的应用程序中。你可以将模型定义为API调用,并且你可以从软件中调用该方法,从而进行推理并给出相应的结果。 + +## 2.4 多实例学习? +多示例学习(multiple instance learning) :已知包含多个数据的数据包和数据包的标签,训练智能算法,将数据包映射到标签的过程,在有的问题中也同时给出包内每个数据的标签。 +比如说一段视频由很多张图组成,假如10000张,那么我们要判断视频里是否包含某一物体,比如气球。单张标注每一帧是否有气球太耗时,通常人们看一遍说这个视频里是否有气球,就得到了多示例学习的数据。10000帧的数据不是每一个都有气球出现,只要有一帧有气球,那么我们就认为这个数据包是有气球的。只有当所有的视频帧都没有气球,才是没有气球的。从这里面学习哪一段视频(10000张)是否有气球出现就是多实例学习的问题。 + +## 2.5 分类网络和回归的区别? +2.3小节介绍了包含气球照片的数据集整理。当照片中包含气球时,输出1,否则输出0。此步骤通常称为分类任务(categorization task)。在这种情况下,我们进行的通常是一个结果为yes or no的训练。 +但事实上,监督学习也可以用于输出一组值,而不仅仅是0或1。例如,我们可以训练一个网络,用它来输出一张图片上有气球的概率,那么在这种情况下,输出值就是0到1之间的任意值。这些任务我们称之为回归。 + +## 2.6 什么是神经网络? +神经网络就是按照一定规则将多个神经元连接起来的网络。不同的神经网络,具有不同的连接规则。 +例如全连接(full connected, FC)神经网络,它的规则包括: +1. 有三种层:输入层,输出层,隐藏层。 +2. 同一层的神经元之间没有连接。 +3. full connected的含义:第 N 层的每个神经元和第 N-1 层的所有神经元相连,第 N-1 层神经元的输出就是第 N 层神经元的输入。 +4. 每个连接都有一个权值。 +**神经网络架构** +下面这张图就是一个神经网络系统,它由很多层组成。输入层负责接收信息,比如一只猫的图片。输出层是计算机对这个输入信息的判断结果,它是不是猫。隐藏层就是对输入信息的传递和加工处理。 +![](../img/ch2/2.6/1.png) + +## 2.7 常用分类算法的优缺点? +|算法|优点|缺点| +|:-|:-|:-| +|Bayes 贝叶斯分类法|1)所需估计的参数少,对于缺失数据不敏感。2)有着坚实的数学基础,以及稳定的分类效率。|1)假设属性之间相互独立,这往往并不成立。(喜欢吃番茄、鸡蛋,却不喜欢吃番茄炒蛋)。2)需要知道先验概率。3)分类决策存在错误率。| +|Decision Tree决策树|1)不需要任何领域知识或参数假设。2)适合高维数据。3)简单易于理解。4)短时间内处理大量数据,得到可行且效果较好的结果。5)能够同时处理数据型和常规性属性。|1)对于各类别样本数量不一致数据,信息增益偏向于那些具有更多数值的特征。2)易于过拟合。3)忽略属性之间的相关性。4)不支持在线学习。| +|SVM支持向量机|1)可以解决小样本下机器学习的问题。2)提高泛化性能。3)可以解决高维、非线性问题。超高维文本分类仍受欢迎。4)避免神经网络结构选择和局部极小的问题。|1)对缺失数据敏感。2)内存消耗大,难以解释。3)运行和调差略烦人。| +|KNN K近邻|1)思想简单,理论成熟,既可以用来做分类也可以用来做回归; 2)可用于非线性分类; 3)训练时间复杂度为O(n); 4)准确度高,对数据没有假设,对outlier不敏感;|1)计算量太大2)对于样本分类不均衡的问题,会产生误判。3)需要大量的内存。4)输出的可解释性不强。| +|Logistic Regression逻辑回归|1)速度快。2)简单易于理解,直接看到各个特征的权重。3)能容易地更新模型吸收新的数据。4)如果想要一个概率框架,动态调整分类阀值。|特征处理复杂。需要归一化和较多的特征工程。| +|Neural Network 神经网络|1)分类准确率高。2)并行处理能力强。3)分布式存储和学习能力强。4)鲁棒性较强,不易受噪声影响。|1)需要大量参数(网络拓扑、阀值、阈值)。2)结果难以解释。3)训练时间过长。| +|Adaboosting|1)adaboost是一种有很高精度的分类器。2)可以使用各种方法构建子分类器,Adaboost算法提供的是框架。3)当使用简单分类器时,计算出的结果是可以理解的。而且弱分类器构造极其简单。4)简单,不用做特征筛选。5)不用担心overfitting。|对outlier比较敏感| + +## 2.8 正确率能很好的评估分类算法吗? +不同算法有不同特点,在不同数据集上有不同的表现效果,根据特定的任务选择不同的算法。如何评价分类算法的好坏,要做具体任务具体分析。对于决策树,主要用正确率去评估,但是其他算法,只用正确率能很好的评估吗? +答案是否定的。 +正确率确实是一个很直观很好的评价指标,但是有时候正确率高并不能完全代表一个算法就好。比如对某个地区进行地震预测,地震分类属性分为0:不发生地震、1发生地震。我们都知道,不发生的概率是极大的,对于分类器而言,如果分类器不加思考,对每一个测试样例的类别都划分为0,达到99%的正确率,但是,问题来了,如果真的发生地震时,这个分类器毫无察觉,那带来的后果将是巨大的。很显然,99%正确率的分类器并不是我们想要的。出现这种现象的原因主要是数据分布不均衡,类别为1的数据太少,错分了类别1但达到了很高的正确率缺忽视了研究者本身最为关注的情况。 + +## 2.9 分类算法的评估方法? +1. **几个常用的术语** +这里首先介绍几个*常见*的 模型评价术语,现在假设我们的分类目标只有两类,计为正例(positive)和负例(negative)分别是: + 1) True positives(TP): 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数); + 2) False positives(FP): 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数; + 3) False negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数; + 4) True negatives(TN): 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。  + +![](../img/ch2/2.9/1.png) + +上图是这四个术语的混淆矩阵。 +1)P=TP+FN表示实际为正例的样本个数。 +2)True、False描述的是分类器是否判断正确。 +3)Positive、Negative是分类器的分类结果,如果正例计为1、负例计为-1,即positive=1、negative=-1。用1表示True,-1表示False,那么实际的类标=TF\*PN,TF为true或false,PN为positive或negative。 +4)例如True positives(TP)的实际类标=1\*1=1为正例,False positives(FP)的实际类标=(-1)\*1=-1为负例,False negatives(FN)的实际类标=(-1)\*(-1)=1为正例,True negatives(TN)的实际类标=1\*(-1)=-1为负例。 + +2. **评价指标** + 1) 正确率(accuracy) +正确率是我们最常见的评价指标,accuracy = (TP+TN)/(P+N),正确率是被分对的样本数在所有样本数中的占比,通常来说,正确率越高,分类器越好。 + 2) 错误率(error rate) +错误率则与正确率相反,描述被分类器错分的比例,error rate = (FP+FN)/(P+N),对某一个实例来说,分对与分错是互斥事件,所以accuracy =1 - error rate。 + 3) 灵敏度(sensitive) +sensitive = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力。 + 4) 特效度(specificity) +specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力。 + 5) 精度(precision) +精度是精确性的度量,表示被分为正例的示例中实际为正例的比例,precision=TP/(TP+FP)。 + 6) 召回率(recall) +召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。 + 7) 其他评价指标 + 计算速度:分类器训练和预测需要的时间; + 鲁棒性:处理缺失值和异常值的能力; + 可扩展性:处理大数据集的能力; + 可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。 + 8) 查准率和查全率反映了分类器分类性能的两个方面。如果综合考虑查准率与查全率,可以得到新的评价指标F1测试值,也称为综合分类率: + ![](../img/ch2/2.9/2.jpg) + 为了综合多个类别的分类情况,评测系统整体性能,经常采用的还有微平均F1(micro-averaging)和宏平均F1(macro-averaging )两种指标。宏平均F1与微平均F1是以两种不同的平均方式求的全局的F1指标。其中宏平均F1的计算方法先对每个类别单独计算F1值,再取这些F1值的算术平均值作为全局指标。而微平均F1的计算方法是先累加计算各个类别的a、b、c、d的值,再由这些值求出F1值。由两种平均F1的计算方式不难看出,宏平均F1平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均F1平等考虑文档集中的每一个文档,所以它的值受到常见类别的影响比较大。 +**ROC曲线和PR曲线** + +References +[1] 李航. 统计学习方法[M]. 北京:清华大学出版社,2012. + +## 2.10 什么样的分类器是最好的? +对某一个任务,某个具体的分类器不可能同时满足或提高所有上面介绍的指标。 +如果一个分类器能正确分对所有的实例,那么各项指标都已经达到最优,但这样的分类器往往不存在。比如之前说的地震预测,既然不能百分百预测地震的发生,但实际情况中能容忍一定程度的误报。假设在1000次预测中,共有5次预测发生了地震,真实情况中有一次发生了地震,其他4次则为误报。正确率由原来的999/1000=99.9下降为996/10000=99.6。召回率由0/1=0%上升为1/1=100%。对此解释为,虽然预测失误了4次,但真的地震发生前,分类器能预测对,没有错过,这样的分类器实际意义更为重大,正是我们想要的。在这种情况下,在一定正确率前提下,要求分类器的召回率尽量高。 + +## 2.11 大数据与深度学习的关系 +**大数据**通常被定义为“超出常用软件工具捕获,管理和处理能力”的数据集。 +**机器学习**关心的问题是如何构建计算机程序使用经验自动改进。 +**数据挖掘**是从数据中提取模式的特定算法的应用。 +在数据挖掘中,重点在于算法的应用,而不是算法本身。 + +**机器学习和数据挖掘**之间的关系如下: +数据挖掘是一个过程,在此过程中机器学习算法被用作提取数据集中的潜在有价值模式的工具。 +大数据与深度学习关系总结如下: +1. 深度学习是一种模拟大脑的行为。可以从所学习对象的机制以及行为等等很多相关联的方面进行学习,模仿类型行为以及思维。 +2. 深度学习对于大数据的发展有帮助。深度学习对于大数据技术开发的每一个阶段均有帮助,不管是数据的分析还是挖掘还是建模,只有深度学习,这些工作才会有可能一一得到实现。 +3. 深度学习转变了解决问题的思维。很多时候发现问题到解决问题,走一步看一步不是一个主要的解决问题的方式了,在深度学习的基础上,要求我们从开始到最后都要基于哦那个一个目标,为了需要优化的那个最终目的去进行处理数据以及将数据放入到数据应用平台上去。 +4. 大数据的深度学习需要一个框架。在大数据方面的深度学习都是从基础的角度出发的,深度学习需要一个框架或者一个系统总而言之,将你的大数据通过深度分析变为现实这就是深度学习和大数据的最直接关系。 + +## 2.12 理解局部最优与全局最优 +笑谈局部最优和全局最优 +> 柏拉图有一天问老师苏格拉底什么是爱情?苏格拉底叫他到麦田走一次,摘一颗最大的麦穗回来,不许回头,只可摘一次。柏拉图空着手出来了,他的理由是,看见不错的,却不知道是不是最好的,一次次侥幸,走到尽头时,才发现还不如前面的,于是放弃。苏格拉底告诉他:“这就是爱情。”这故事让我们明白了一个道理,因为生命的一些不确定性,所以全局最优解是很难寻找到的,或者说根本就不存在,我们应该设置一些限定条件,然后在这个范围内寻找最优解,也就是局部最优解——有所斩获总比空手而归强,哪怕这种斩获只是一次有趣的经历。 +柏拉图有一天又问什么是婚姻?苏格拉底叫他到彬树林走一次,选一棵最好的树做圣诞树,也是不许回头,只许选一次。这次他一身疲惫地拖了一棵看起来直挺、翠绿,却有点稀疏的杉树回来,他的理由是,有了上回的教训,好不容易看见一棵看似不错的,又发现时间、体力已经快不够用了,也不管是不是最好的,就拿回来了。苏格拉底告诉他:“这就是婚姻。 + +优化问题一般分为局部最优和全局最优。 +1. 局部最优,就是在函数值空间的一个有限区域内寻找最小值;而全局最优,是在函数值空间整个区域寻找最小值问题。 +2. 函数局部最小点是那种它的函数值小于或等于附近点的点。但是有可能大于较远距离的点。 +3. 全局最小点是那种它的函数值小于或等于所有的可行点。 + +## 2.13 理解逻辑回归 +**回归划分**: +广义线性模型家族里,依据因变量不同,可以有如下划分: +1. 如果是连续的,就是多重线性回归; +2. 如果是二项分布,就是Logistic回归; +3. 如果是Poisson分布,就是Poisson回归; +4. 如果是负二项分布,就是负二项回归。 +Logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最常用的就是二分类的Logistic回归。 + +**Logistic回归的适用性**: +1. 用于概率预测。用于可能性预测时,得到的结果有可比性。比如根据模型进而预测在不同的自变量情况下,发生某病或某种情况的概率有多大; +2. 用于分类。实际上跟预测有些类似,也是根据模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。进行分类时,仅需要设定一个阈值即可,可能性高于阈值是一类,低于阈值是另一类。 +3. 寻找危险因素。寻找某一疾病的危险因素等。 +4. 仅能用于线性问题。只有当目标和特征是线性关系时,才能用逻辑回归。在应用逻辑回归时注意两点:一是当知道模型是非线性时,不适用逻辑回归;二是当使用逻辑回归时,应注意选择和目标为线性关系的特征。 +5. 各特征之间不需要满足条件独立假设,但各个特征的贡献独立计算。 + +## 2.14 逻辑回归与朴素贝叶斯有什么区别? +1. 逻辑回归时生成模型,朴素贝叶斯是判别模型,所以生成和判别的所有区别它们都有。 +2. 朴素贝叶斯属于贝叶斯,逻辑回归是最大似然,两种概率哲学间的区别。 +3. 朴素贝叶斯需要独立假设。 +4. 逻辑回归需要求特征参数间是线性的。 + +## 2.15 线性回归与逻辑回归的区别?(贡献者:黄钦建-华南理工大学) + +线性回归的样本的输出,都是连续值,$ y\in (-\infty ,+\infty )$,而逻辑回归中$y\in (0,1)$,只能取0和1。 + +对于拟合函数也有本质上的差别: + +线性回归:$f(x)=\theta ^{T}x=\theta _{1}x _{1}+\theta _{2}x _{2}+...+\theta _{n}x _{n}$ + +逻辑回归:$f(x)=P(y=1|x;\theta )=g(\theta ^{T}x)$,其中,$g(z)=\frac{1}{1+e^{-z}}$ + + +可以看出,线性回归的拟合函数,是对f(x)的输出变量y的拟合,而逻辑回归的拟合函数是对为1类的样本的概率的拟合。 + +那么,为什么要以1类样本的概率进行拟合呢,为什么可以这样拟合呢? + +$\theta ^{T}x=0$就相当于是1类和0类的决策边界: + +当$\theta ^{T}x>0$,则y>0.5;若$\theta ^{T}x\rightarrow +\infty $,则$y \rightarrow 1 $,即y为1类; + + +当$\theta ^{T}x<0$,则y<0.5;若$\theta ^{T}x\rightarrow -\infty $,则$y \rightarrow 0 $,即y为0类; + +这个时候就能看出区别来了,在线性回归中$\theta ^{T}x$为预测值的拟合函数;而在逻辑回归中$\theta ^{T}x$为决策边界。 + +| | 线性回归 | 逻辑回归 | +|:-------------:|:-------------:|:-----:| +| 目的 | 预测 |分类 | +| $y^{(i)}$ | 未知 | (0,1)| +| 函数 | 拟合函数 | 预测函数 | +| 参数计算方式| 最小二乘法 | 极大似然估计 | + + +下面具体解释一下: + +1. 拟合函数和预测函数什么关系呢?其实就是将拟合函数做了一个逻辑函数的转换,转换后使得$y^{(i)} \in (0,1)$; + +2. 最小二乘和最大似然估计可以相互替代吗?回答当然是不行了。我们来看看两者依仗的原理:最大似然估计是计算使得数据出现的可能性最大的参数,依仗的自然是Probability。而最小二乘是计算误差损失。 + + +## 2.16 为什么需要代价函数? +1. 为了得到训练逻辑回归模型的参数,需要一个代价函数,通过训练代价函数来得到参数。 +2. 用于找到最优解的目的函数。 + +## 2.17 代价函数作用原理 +在回归问题中,通过代价函数来求解最优解,常用的是平方误差代价函数。有如下假设函数: +$$ +h(x) = A + Bx +$$ +假设函数中有$A$和$B$两个参数,当参数发生变化时,假设函数状态也会随着变化。 +如下图所示 + +![](../img/ch2/2.16/1.jpg) + +想要你和图中的离散点,我们需要尽可能找到最优的$A$和$B$来使这条直线更能代表所有数据。如何找到最优解呢,这就需要使用代价函数来求解,以平方误差代价函数为例,假设函数为$h(x)=\theta_0x$。 +平方误差代价函数的主要思想 +平方误差代价函数的主要思想就是将实际数据给出的值与拟合出的线的对应值做差,求出拟合出的直线与实际的差距。在实际应用中,为了避免因个别极端数据产生的影响,采用类似方差再取二分之一的方式来减小个别数据的影响。因此,引出代价函数: +$$ +J(\theta_0, \theta_1) = \frac{1}{m}\sum_{i=1}^m(h(x^{(i)})-y^{(i)})^2 +$$ + +**最优解即为代价函数的最小值**$\min J(\theta_0, \theta_1)$。如果是1个参数,代价函数一般通过二维曲线便可直观看出。如果是2个参数,代价函数通过三维图像可看出效果,参数越多,越复杂。 +当参数为2个时,代价函数是三维图像。 + +![](../img/ch2/2.16/2.png) + +## 2.18 为什么代价函数要非负? +目标函数存在一个下界,在优化过程当中,如果优化算法能够使目标函数不断减小,根据单调有界准则,这个优化算法就能证明是收敛有效的。 +只要设计的目标函数有下界,基本上都可以,代价函数非负更为方便。 + +## 2.19 常见代价函数? +1. **二次代价函数(quadratic cost)**: +$$ +J = \frac{1}{2n}\sum_x\Vert y(x)-a^L(x)\Vert^2 +$$ + +其中,$J$表示代价函数,$x$表示样本,$y$示实际值,$a$表示输出值,$n$表示样本的总数。使用一个样本为例简单说明,此时二次代价函数为: +$$ +J = \frac{(y-a)^2}{2} +$$ + +假如使用梯度下降法(Gradient descent)来调整权值参数的大小,权值$w$和偏置$b$的梯度推导如下: +$$\frac{\delta J}{\delta w}=(a-y)\delta'(z)x$$,$$\frac{\delta J}{\delta b}=(a-y)\delta'(z)$$ +其中,$z$表示神经元的输入,$\theta$表示激活函数。权值$w$和偏置$b$的梯度跟激活函数的梯度成正比,激活函数的梯度越大,权值$w$和偏置$b$的大小调整得越快,训练收敛得就越快。 +*注*: +神经网络常用的激活函数为sigmoid函数,该函数的曲线如下所示: + +![](../img/ch2/2.18/1.png) + +假设目标是收敛到1.0。0.82离目标比较远,梯度比较大,权值调整比较大。0.98离目标比较近,梯度比较小,权值调整比较小。调整方案合理。 +假如目标是收敛到0。0.82目标比较近,梯度比较大,权值调整比较大。0.98离目标比较远,梯度比较小,权值调整比较小。调整方案不合理。 +原因:初始的代价(误差)越大,导致训练越慢。 + +2. **交叉熵代价函数(cross-entropy)**: +交叉熵代价函数: +$$ +J = \frac{1}{n}\sum_x[y\ln a + (1-y)\ln{(1-a)}] +$$ + +其中,$J$表示代价函数,$x$表示样本,$y$表示实际值,$a$表示输出值,$n$表示样本的总数。 +权值$w$和偏置$b$的梯度推导如下: +$$\frac{\delta J}{\delta w_j}=\frac{1}{n}\sum_{x}(\delta{(a)}-y)$$, +$$\frac{\delta J}{\delta b}=\frac{1}{n}\sum_{x}(\delta{(z)}-y)$$ +当误差越大时,梯度就越大,权值$w$和偏置$b$调整就越快,训练的速度也就越快。 +**二次代价函数适合输出神经元是线性的情况,交叉熵代价函数适合输出神经元是S型函数的情况。** + +3. **对数释然代价函数(log-likelihood cost)**: +对数释然函数常用来作为softmax回归的代价函数。深度学习中普遍的做法是将softmax作为最后一层,此时常用的代价函数是对数释然代价函数。 + 对数似然代价函数与softmax的组合和交叉熵与sigmoid函数的组合非常相似。对数释然代价函数在二分类时可以化简为交叉熵代价函数的形式。 +在tensorflow中: + 与sigmoid搭配使用的交叉熵函数:`tf.nn.sigmoid_cross_entropy_with_logits()`。 + 与softmax搭配使用的交叉熵函数:`tf.nn.softmax_cross_entropy_with_logits()`。 + +## 2.20 为什么用交叉熵代替二次代价函数 +1. **为什么不用二次方代价函数** +由2.18节可知,权值$w$和偏置$b$的偏导数为 +$$\frac{\delta J}{\delta w}=(a-y)\delta'(z)x$$,$$\frac{\delta J}{\delta b}=(a-y)\delta'(z)$$ +, 偏导数受激活函数的导数影响,sigmoid函数导数在输出接近0和1时非常小,会导致一些实例在刚开始训练时学习得非常慢。 + +2. **为什么要用交叉熵** +交叉熵函数权值$w$和偏置$b$的梯度推导为: +$$\frac{\delta J}{\delta w_j}=\frac{1}{n}\sum_{x}(\delta{(a)}-y)$$, +$$\frac{\delta J}{\delta b}=\frac{1}{n}\sum_{x}(\delta{(z)}-y)$$ +由以上公式可知,权重学习的速度受到$\delta{(z)}-y$影响,更大的误差,就有更快的学习速度,避免了二次代价函数方程中因$\delta'{(z)}$导致的学习缓慢的情况。 + +## 2.21 什么是损失函数? +损失函数(Loss function)又叫做误差函数,用来衡量算法的运行情况,估量模型的预测值 与真实值 的不一致程度,是一个非负实值函数,通常使用 来表示,损失函数越小,模型的鲁棒性就越好。 +损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。 + +## 2.22 常见的损失函数 +机器学习通过对算法中的目标函数进行不断求解优化,得到最终想要的结果。分类和回归问题中,通常使用损失函数或代价函数作为目标函数。 +损失函数用来评价预测值和真实值不一样的程度。通常损失函数越好,模型的性能也越好。 +损失函数可分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是在经验风险损失函数上加上正则项。 +下面介绍常用的损失函数: + +1. 0-1损失函数 +如果预测值和目标值相等,值为0,如果不相等,值为1. +$$ +L(Y, f(x)) = +\begin{cases} +1,& Y\ne f(x)\\ +0,& Y = f(x) +\end{cases} +$$ +一般的在实际使用中,相等的条件过于严格,可适当放宽条件: +$$ +L(Y, f(x)) = +\begin{cases} +1,& |Y-f(x)|\ge T\\ +0,& |Y-f(x)|< T +\end{cases} +$$ + +2. 绝对值损失函数 +和0-1损失函数相似,绝对值损失函数表示为: +$$L(Y, f(x)) = |Y-f(x)|$$ + +3. 平方损失函数 +$$L(Y, f(x)) = \sum_N{(Y-f(x))}^2$$ + +这点可从最小二乘法和欧几里得距离角度理解。最小二乘法的原理是,最优拟合曲线应该使所有点到回归直线的距离和最小。 + +4. log对数损失函数 +$$L(Y, P(Y|X)) = -\log{P(Y|X)}$$ + +常见的逻辑回归使用的就是对数损失函数,有很多人认为逻辑回归的损失函数式平方损失,其实不然。逻辑回归它假设样本服从伯努利分布,进而求得满足该分布的似然函数,接着取对数求极值等。逻辑回归推导出的经验风险函数是最小化负的似然函数,从损失函数的角度看,就是log损失函数。 + +5. 指数损失函数 +指数损失函数的标准形式为: +$$L(Y, f(x)) = \exp{-yf(x)}$$ +例如AdaBoost就是以指数损失函数为损失函数。 + +6. Hinge损失函数 +Hinge损失函数的标准形式如下: +$$L(Y) = \max{(0, 1-ty)}$$ +其中y是预测值,范围为(-1,1),t为目标值,其为-1或1. + +在线性支持向量机中,最优化问题可等价于 +$$ +\underset{\min}{w,b}\sum_{i=1}^N (1-y_i(wx_i+b))+\lambda\Vert w^2\Vert +$$ + +上式相似于下式 +$$ +\frac{1}{m}\sum_{i=1}^{N}l(wx_i+by_i) + \Vert w^2\Vert +$$ +其中$l(wx_i+by_i)$是Hinge损失函数,$\Vert w^2\Vert$可看做为正则化项。 + +## 2.23 逻辑回归为什么使用对数损失函数? +假设逻辑回归模型 +TODO +假设逻辑回归模型的概率分布是伯努利分布,其概率质量函数为 +TODO +其似然函数为 +TODO +对数似然函数为 +TODO +对数函数在单个数据点上的定义为 +TODO +则全局样本损失函数为: +TODO +由此可看出,对数损失函数与极大似然估计的对数似然函数本质上是相同的。所以逻辑回归直接采用对数损失函数。 + +## 2.24 对数损失函数是如何度量损失的? +举例: +高斯分布中,我们需要确定均值 和标注差 。 +如何确定这两个参数?最大似然估计是比较常用的方法。最大似然的目标是找到一些参数值,这些参数值对应的分布可以最大化观测到数据的概率。 +因为需要计算观测到所有数据的全概率,即所有观测到的数据点的联合概率。现考虑如下简化情况: +1. 假设观测到每个数据点的概率和其他数据点的概率是独立的。 +2. 取自然对数。 +假设观测到单个数据点TODO的概率为: +TODO +其联合概率为 +TODO +对上式取自然对数,可得: +TODO +根据对数定律,上式可以化简为: +TODO +求导: +TODO +上式左半部分为对数损失函数。损失函数越小越好,因此我们令对数损失函数为0,可得: +TODO +同理,可计算TODO。 + +## 2.25 机器学习中为什么需要梯度下降? +1. 梯度下降是迭代法的一种,可以用于求解最小二乘问题。 +2. 在求解机器学习算法的模型参数,即无约束优化问题时,主要有梯度下降法(Gradient Descent)和最小二乘法。 +3. 在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。 +4. 如果我们需要求解损失函数的最大值,可通过梯度上升法来迭代。梯度下降法和梯度上升法可相互转换。 +5. 在机器学习中,梯度下降法主要有随机梯度下降法和批量梯度下降法。 + +## 2.26 梯度下降法缺点? +1. 靠近极小值时收敛速度减慢。 +2. 直线搜索时可能会产生一些问题。 +3. 可能会“之字形”地下降。 + +梯度概念需注意: +1. 梯度是一个向量,即有方向有大小; +2. 梯度的方向是最大方向导数的方向; +3. 梯度的值是最大方向导数的值。 + +## 2.27 梯度下降法直观理解? +梯度下降法经典图示: + +![](../img/ch2/2.25/1.png) + +形象化举例: +> 由上图,假如最开始,我们在一座大山上的某处位置,因为到处都是陌生的,不知道下山的路,所以只能摸索着根据直觉,走一步算一步,在此过程中,每走到一个位置的时候,都会求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。不断循环求梯度,就这样一步步的走下去,一直走到我们觉得已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。 +由此,从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。 + +核心思想归纳: +1. 初始化参数,随机选取取值范围内的任意数; +2. 迭代操作: + a) 计算当前梯度; + b)修改新的变量; + c)计算朝最陡的下坡方向走一步; + d)判断是否需要终止,如否,返回a); +3. 得到全局最优解或者接近全局最优解。 + +## 2.28 梯度下降法算法描述? +1. 确定优化模型的假设函数及损失函数。 +举例,对于线性回归,假设函数为: +TODO +其中,TODO分别为模型参数、每个样本的特征值。 +对于假设函数,损失函数为: +TODO +2. 相关参数初始化。 +主要初始化TODO、算法迭代步长TODO、终止距离TODO。初始化时可以根据经验初始化,即TODO初始化为0,步长TODO初始化为1。当前步长记为TODO。当然,也可随机初始化。 +3. 迭代计算。 + +1) 计算当前位置时损失函数的梯度,对TODO,其梯度表示为:TODO + +2) 计算当前位置下降的距离。TODO + +3) 判断是否终止。 +确定是否所有TODO梯度下降的距离TODO都小于终止距离TODO,如果都小于TODO,则算法终止,当然的值即为最终结果,否则进入下一步。 +4) 更新所有的TODO,更新后的表达式为:TODO +5) 更新完毕后转入1)。 + + +**举例**。以线性回归为例。 +假设样本是 +TODO +损失函数为 +TODO +在计算中,TODO的偏导数计算如下: +TODO +令上式 。4)中TODO的更新表达式为: + TODO +由此,可看出,当前位置的梯度方向由所有样本决定,上式中TODO的目的是为了便于理解。 + +## 2.29 如何对梯度下降法进行调优? +实际使用梯度下降法时,各项参数指标不能一步就达到理想状态,对梯度下降法调优主要体现在以下几个方面: +1. **算法迭代步长$\alpha$选择。** +在算法参数初始化时,有时根据经验将步长 初始化为1。实际取值取决于数据样本。可以从大到小,多取一些值,分别运行算法看迭代效果,如果损失函数在变小,则取值有效。如果取值无效,说明要增大步长。但步长太大,有时会导致迭代速度过快,错过最优解。步长太小,迭代速度慢,算法运行时间长。 +2. **参数的初始值选择。** +初始值不同,获得的最小值也有可能不同,梯度下降有可能得到的是局部最小值。如果损失函数是凸函数,则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。 +3. **标准化处理。** +由于样本不同,特征取值范围也不同,导致迭代速度慢。为了减少特征取值的影响,可对特征数据标准化,使新期望为0,新方差为1,可节省算法运行时间。 + +## 2.30 随机梯度和批量梯度区别? +随机梯度下降和批量梯度下降是两种主要梯度下降法,其目的是增加某些限制来加速运算求解。 +引入随机梯度下降法与mini-batch梯度下降法是为了应对大数据量的计算而实现一种快速的求解。 +下面通过介绍两种梯度下降法的求解思路,对其进行比较。 +假设函数为 +TODO +损失函数为 +TODO +其中,TODO为样本个数,TODO为参数个数。 + +1、 **批量梯度下降的求解思路如下:** + +a) 得到每个TODO对应的梯度: +TODO + +b) 由于是求最小化风险函数,所以按每个参数TODO的梯度负方向更新TODO: +TODO + +c) 从上式可以注意到,它得到的虽然是一个全局最优解,但每迭代一步,都要用到训练集所有的数据,如果样本数据 很大,这种方法迭代速度就很慢。 +相比而言,随机梯度下降可避免这种问题。 + +2、**随机梯度下降的求解思路如下:** +a) 相比批量梯度下降对应所有的训练样本,随机梯度下降法中损失函数对应的是训练集中每个样本的粒度。 +损失函数可以写成如下这种形式, + TODO + +b)对每个参数TODO按梯度方向更新 : + TODO + +c) 随机梯度下降是通过每个样本来迭代更新一次。 +随机梯度下降伴随的一个问题是噪音较批量梯度下降要多,使得随机梯度下降并不是每次迭代都向着整体最优化方向。 + +**小结:** +随机梯度下降法、批量梯度下降法相对来说都比较极端,简单对比如下: +批量梯度下降: +a)采用所有数据来梯度下降。 +b) 批量梯度下降法在样本量很大的时候,训练速度慢。 + +随机梯度下降: +a) 随机梯度下降用一个样本来梯度下降。 +b) 训练速度很快。 +c) 随机梯度下降法仅仅用一个样本决定梯度方向,导致解有可能不是最优。 +d) 收敛速度来说,随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。 + +下面介绍能结合两种方法优点的小批量梯度下降法。 + +3、 **小批量(mini-batch)梯度下降的求解思路如下** +对于总数为$m$个样本的数据,根据样本的数据,选取其中的$n(1< n< m)$个子样本来迭代。其参数$\theta$按梯度方向更新$\theta_i$公式如下: +TODO + +## 2.31 各种梯度下降法性能比较 +下表简单对比随机梯度下降(SGD)、批量梯度下降(BGD)、小批量梯度下降(mini-batch GD)、和online GD的区别,主要区别在于如何选取训练数据: +||BGD|SGD|Mini-batch GD|Online GD| +|:-:|:-:|:-:|:-:|:-:|:-:| +|训练集|固定|固定|固定|实时更新| +|单次迭代样本数|整个训练集|单个样本|训练集的子集|根据具体算法定| +|算法复杂度|高|低|一般|低| +|时效性|低|一般|一般|高| +|收敛性|稳定|不稳定|较稳定|不稳定| + +BGD、SGD、Mini-batch GD,前面均已讨论过,这里介绍一下Online GD。 + +Online GD于mini-batch GD/SGD的区别在于,所有训练数据只用一次,然后丢弃。这样做的优点在于可预测最终模型的变化趋势。 + +Online GD在互联网领域用的较多,比如搜索广告的点击率(CTR)预估模型,网民的点击行为会随着时间改变。用普通的BGD算法(每天更新一次)一方面耗时较长(需要对所有历史数据重新训练);另一方面,无法及时反馈用户的点击行为迁移。而Online GD算法可以实时的依据网民的点击行为进行迁移。 + +## 2.32 计算图的导数计算图解? +计算图导数计算是反向传播,利用链式法则和隐式函数求导。 + +假设TODO在点TODO处偏导连续,TODO是关于TODO的函数,在TODO点可导,求TODO在TODO点的导数。 + +根据链式法则有 +TODO + +为了便于理解,下面举例说明。 +假设$f(x)$是关于a,b,c的函数。 + +![](../img/ch2/2.27/1.png) + +![](../img/ch2/2.27/2.png) + +## 2.33 线性判别分析(LDA)思想总结 +线性判别分析(Linear Discriminant Analysis,LDA)是一种经典的降维方法。 + +和PCA不考虑样本类别输出的无监督降维技术不同,LDA是一种监督学习的降维技术,数据集的每个样本有类别输出。 + +LDA分类思想简单总结如下: +1. 多维空间中,数据处理分类问题较为复杂,LDA算法将多维空间中的数据投影到一条直线上,将d维数据转化成1维数据进行处理。 +2. 对于训练数据,设法将多维数据投影到一条直线上,同类数据的投影点尽可能接近,异类数据点尽可能远离。 +3. 对数据进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定样本的类别。 +如果用一句话概括LDA思想,即“投影后类内方差最小,类间方差最大”。 + +## 2.34 图解LDA核心思想 +假设有红、蓝两类数据,这些数据特征均为二维,如下图所示。我们的目标是将这些数据投影到一维,让每一类相近的数据的投影点尽可能接近,不同类别数据尽可能远,即图中红色和蓝色数据中心之间的距离尽可能大。 + +![](../img/ch2/2.29/1.png) + +左图和右图是两种不同的投影方式。 + +左图思路:让不同类别的平均点距离最远的投影方式。 + +右图思路:让同类别的数据挨得最近的投影方式。 + +从上图直观看出,右图红色数据和蓝色数据在各自的区域来说相对集中,根据数据分布直方图也可看出,所以右图的投影效果好于左图,左图中间直方图部分有明显交集。 + +以上例子是基于数据是二维的,分类后的投影是一条直线。如果原始数据是多维的,则投影后的分类面是一低维的超平面。 + +## 2.35 二类LDA算法原理? +输入:数据集TODO,其中样本TODO是n维向量,TODO,TODO降维后的目标维度TODO。定义 + +TODO为第TODO类样本个数; + +TODO为第TODO类样本的集合; + +TODO为第TODO类样本的均值向量; + +TODO为第TODO类样本的协方差矩阵。 + +其中TODO,TODO。 + +假设投影直线是向量TODO,对任意样本TODO,它在直线TODO上的投影为TODO,两个类别的中心点TODO在直线TODO的投影分别为TODO、TODO。 + +LDA的目标是让两类别的数据中心间的距离TODO尽量大,与此同时,希望同类样本投影点的协方差TODO、TODO尽量小,最小化TODO。 +定义 +类内散度矩阵TODO + +类间散度矩阵TODO + +据上分析,优化目标为TODO + +根据广义瑞利商的性质,矩阵TODO的最大特征值为TODO的最大值,矩阵TODO的最大特征值对应的特征向量即为TODO。 + +## 2.36 LDA算法流程总结? +LDA算法降维流程如下: + +输入:数据集TODO,其中样本TODO是n维向量,TODO,降维后的目标维度TODO。 + +输出:降维后的数据集TODO。 + +步骤: +1. 计算类内散度矩阵 。 +2. 计算类间散度矩阵 。 +3. 计算矩阵 。 +4. 计算矩阵 的最大的d个特征值。 +5. 计算d个特征值对应的d个特征向量,记投影矩阵为 。 +6. 转化样本集的每个样本,得到新样本 。 +7. 输出新样本集 + +## 2.37 LDA和PCA区别? +|异同点|LDA|PCA| +|:-:|:-|:-| +|相同点|1. 两者均可以对数据进行降维;2. 两者在降维时均使用了矩阵特征分解的思想;3. 两者都假设数据符合高斯分布;| +|不同点|有监督的降维方法|无监督的降维方法| +||降维最多降到k-1维|降维多少没有限制| +||可以用于降维,还可以用于分类|只用于降维| +||选择分类性能最好的投影方向|选择样本点投影具有最大方差的方向| +||更明确,更能反映样本间差异|目的较为模糊| + +## 2.38 LDA优缺点? +|优缺点|简要说明| +|:-:|:-| +|优点|1. 可以使用类别的先验知识;2. 以标签,类别衡量差异性的有监督降维方式,相对于PCA的模糊性,其目的更明确,更能反映样本间的差异;| +|缺点|1. LDA不适合对非高斯分布样本进行降维;2. LDA降维最多降到k-1维;3. LDA在样本分类信息依赖方差而不是均值时,降维效果不好;4. LDA可能过度拟合数据。| + +## 2.39 主成分分析(PCA)思想总结 +1. PCA就是将高维的数据通过线性变换投影到低维空间上去。 +2. 投影思想:找出最能够代表原始数据的投影方法。被PCA降掉的那些维度只能是那些噪声或是冗余的数据。 +3. 去冗余:去除可以被其他向量代表的线性相关向量,这部分信息量是多余的。 +4. 去噪声,去除较小特征值对应的特征向量,特征值的大小反映了变换后在特征向量方向上变换的幅度,幅度越大,说明这个方向上的元素差异也越大,要保留。 +5. 对角化矩阵,寻找极大线性无关组,保留较大的特征值,去除较小特征值,组成一个投影矩阵,对原始样本矩阵进行投影,得到降维后的新样本矩阵。 +6. 完成PCA的关键是——协方差矩阵。 +协方差矩阵,能同时表现不同维度间的相关性以及各个维度上的方差。 +协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。 +7. 之所以对角化,因为对角化之后非对角上的元素都是0,达到去噪声的目的。对角化后的协方差矩阵,对角线上较小的新方差对应的就是那些该去掉的维度。所以我们只取那些含有较大能量(特征值)的维度,其余的就舍掉,即去冗余。 + +## 2.40 图解PCA核心思想 +PCA可解决训练数据中存在数据特征过多或特征累赘的问题。核心思想是将m维特征映射到n维(n < m),这n维形成主元,是重构出来最能代表原始数据的正交特征。 + +假设数据集是m个n维,$(x^{(1)}, x^{(2)}, \cdots, x^{(m)})$。如果n=2,需要降维到$n'=1$,现在想找到某一维度方向代表这两个维度的数据。下图有$u_1, u_2$两个向量方向,但是哪个向量才是我们所想要的,可以更好代表原始数据集的呢? + +![](../img/ch2/2.34/1.png) + +从图可看出,$u_1$比$u_2$好,为什么呢?有以下两个主要评价指标: +1. 样本点到这个直线的距离足够近。 +2. 样本点在这个直线上的投影能尽可能的分开。 + +如果我们需要降维的目标维数是其他任意维,则: +1. 样本点到这个超平面的距离足够近。 +2. 样本点在这个超平面上的投影能尽可能的分开。 + +## 2.41 PCA算法推理 +下面以基于最小投影距离为评价指标推理: + +假设数据集是m个n维,TODO,且数据进行了中心化。经过投影变换得到新坐标为TODO,其中TODO是标准正交基,即TODO,TODO。经过降维后,新坐标为TODO,其中TODO是降维后的目标维数。样本点TODO在新坐标系下的投影为TODO,其中TODO是TODO在低维坐标系里第j维的坐标。如果用TODO去恢复TODO,则得到的恢复数据为TODO,其中TODO为标准正交基组成的矩阵。 + +考虑到整个样本集,样本点到这个超平面的距离足够近,目标变为最小化TODO。对此式进行推理,可得: +TODO + +在推导过程中,分别用到了TODO,矩阵转置公式TODO,TODO,TODO以及矩阵的迹,最后两步是将代数和转为矩阵形式。 +由于TODO的每一个向量TODO是标准正交基,TODO是数据集的协方差矩阵,TODO是一个常量。最小化TODO又可等价于 + +TODO + +利用拉格朗日函数可得到 +TODO + +对TODO求导,可得TODO,也即TODO。 是TODO个特征向量组成的矩阵, 为TODO的特征值。TODO即为我们想要的矩阵。 +对于原始数据,只需要TODO,就可把原始数据集降维到最小投影距离的TODO维数据集。 + +基于最大投影方差的推导,这里就不再赘述,有兴趣的同仁可自行查阅资料。 + +## 2.42 PCA算法流程总结 +输入:TODO维样本集TODO,目标降维的维数TODO。 + +输出:降维后的新样本集TODO。 + +主要步骤如下: +1. 对所有的样本进行中心化,TODO。 +2. 计算样本的协方差矩阵TODO。 +3. 对协方差矩阵TODO进行特征值分解。 +4. 取出最大的TODO个特征值对应的特征向量TODO。 +5. 标准化特征向量,得到特征向量矩阵TODO。 +6. 转化样本集中的每个样本TODO。 +7. 得到输出矩阵TODO。 +*注*:在降维时,有时不明确目标维数,而是指定降维到的主成分比重阈值TODO。假设TODO个特征值为TODO,则TODO可从TODO得到。 + +## 2.43 PCA算法主要优缺点 +|优缺点|简要说明| +|:-:|:-| +|优点|1. 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。 2.各主成分之间正交,可消除原始数据成分间的相互影响的因素。3. 计算方法简单,主要运算是特征值分解,易于实现。| +|缺点|1.主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。2. 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。| + +## 2.44 降维的必要性及目的 +**降维的必要性**: +1. 多重共线性--预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。 +2. 高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有0.02%。 +3. 过多的变量,对查找规律造成冗余麻烦。 +4. 仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。 + +**降维的目的**: +1. 减少预测变量的个数。 +2. 确保这些变量是相互独立的。 +3. 提供一个框架来解释结果。关特征,特别是重要特征更能在数据中明确的显示出来;如果只有两维或者三维的话,更便于可视化展示。 +4. 数据在低维下更容易处理、更容易使用。 +5. 去除数据噪声。 +6. 降低算法运算开销。 + +## 2.45 KPCA与PCA的区别? +应用PCA算法的前提是假设存在一个线性的超平面,进而投影。那如果数据不是线性的呢?该怎么办?这时候就需要KPCA,数据集从TODO维映射到线性可分的高维TODO,然后再从TODO维降维到一个低维度TODO。 + +KPCA用到了核函数思想,使用了核函数的主成分分析一般称为核主成分分析(Kernelized PCA, 简称KPCA)。 + +假设高维空间数据由TODO维空间的数据通过映射TODO产生。 + +TODO维空间的特征分解为: +TODO其映射为TODO + +通过在高维空间进行协方差矩阵的特征值分解,然后用和PCA一样的方法进行降维。由于KPCA需要核函数的运算,因此它的计算量要比PCA大很多。 + +## 2.46 模型评估 +### 2.46.1 模型评估常用方法? +一般情况来说,单一评分标准无法完全评估一个机器学习模型。只用good和bad偏离真实场景去评估某个模型,都是一种欠妥的评估方式。下面介绍常用的分类模型和回归模型评估方法。 + +**分类模型常用评估方法:** + +|指标|描述|Scikit-learn函数| +|:-:|:-:|:-| +|Precision|精准度|from sklearn.metrics import precision_score| +|Recall|召回率|from sklearn.metrics import recall_score| +|F1|F1值|from sklearn.metrics import f1_score| +|Confusion Matrix|混淆矩阵|from sklearn.metrics import confusion_matrix| +|ROC|ROC曲线|from sklearn.metrics import roc| +|AUC|ROC曲线下的面积|from sklearn.metrics import auc| +|precision|查准率|| +|recall|查全率|| +|P-R曲线|查准率为纵轴,查全率为横轴,作图|| + +**回归模型常用评估方法:** +|指标|描述|Scikit-learn函数| +|:-:|:-:|:-| +|Mean Square Error (MSE, RMSE)|平均方差|from sklearn.metrics import mean_squared_error| +|Absolute Error (MAE, RAE)|绝对误差|from sklearn.metrics import mean_absolute_error, median_absolute_error| +|R-Squared|R平方值|from sklearn.metrics import r2_score| + +## 2.47 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?(贡献者:黄钦建-华南理工大学) + +**对于Bias:** + +- Bias衡量模型拟合训练数据的能力(训练数据不一定是整个 training dataset,而是只用于训练它的那一部分数据,例如:mini-batch)。 +- Bias 越小,拟合能力越高(可能产生overfitting);反之,拟合能力越低(可能产生underfitting)。 + +**对于Variance:** + +- Variance衡量模型的泛化的能力。 +- Variance越小,模型的泛化的能力越高;反之,模型的泛化的能力越低。 + +> 训练误差大,测试误差小 → Bias大 +> +> 训练误差小,测试误差大→ Variance大 → 降VC维 +> +> 训练误差大,测试误差大→ 升VC维 + +### 2.47.1 经验误差与泛化误差 +误差(error):一般地,我们把学习器的实际预测输出与样本的真是输出之间的差异称为“误差” + +经验误差(empirical error):也叫训练误差(training error)。模型在训练集上的误差。 + +泛化误差(generalization error):模型在新样本集(测试集)上的误差称为“泛化误差”。 + +### 2.47.2 图解欠拟合、过拟合 +根据不同的坐标方式,欠拟合与过拟合图解不同。 +1. **横轴为训练样本数量,纵轴为误差** + +![](../img/ch2/2.40.3/1.png) + +如上图所示,我们可以直观看出欠拟合和过拟合的区别: + +模型欠拟合:在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大; + +模型过拟合:在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。 + +模型正常:在训练集以及测试集上,同时具有相对较低的偏差以及方差。 + +2. **横轴为模型复杂程度,纵轴为误差** + +![](../img/ch2/2.40.3/2.png) + +模型欠拟合:模型在点A处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大。 + +模型过拟合:模型在点C处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。 + +模型正常:模型复杂程度控制在点B处为最优。 + +3. **横轴为正则项系数,纵轴为误差** + +![](../img/ch2/2.40.3/3.png) + +模型欠拟合:模型在点C处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大。 + +模型过拟合:模型在点A处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。 它通常发生在模型过于复杂的情况下,如参数过多等,会使得模型的预测性能变弱,并且增加数据的波动性。虽然模型在训练时的效果可以表现的很完美,基本上记住了数据的全部特点,但这种模型在未知数据的表现能力会大减折扣,因为简单的模型泛化能力通常都是很弱的。 + +模型正常:模型复杂程度控制在点B处为最优。 + +### 2.47.3 如何解决过拟合与欠拟合? +**如何解决欠拟合:** +1. 添加其他特征项。组合、泛化、相关性、上下文特征、平台特征等特征是特征添加的重要手段,有时候特征项不够会导致模型欠拟合。 +2. 添加多项式特征。例如将线性模型添加二次项或三次项使模型泛化能力更强。例如,FM模型、FFM模型,其实就是线性模型,增加了二阶多项式,保证了模型一定的拟合程度。 +3. 可以增加模型的复杂程度。 +4. 减小正则化系数。正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。 + +**如何解决过拟合:** +1. 重新清洗数据,数据不纯会导致过拟合,此类情况需要重新清洗数据。 +2. 增加训练样本数量。 +3. 降低模型复杂程度。 +4. 增大正则项系数。 +5. 采用dropout方法,dropout方法,通俗的讲就是在训练的时候让神经元以一定的概率不工作。 +6. early stoping。 +7. 减少迭代次数。 +8. 增大学习率。 +9. 添加噪声数据。 +10. 树结构中,可以对树进行剪枝。 + +欠拟合和过拟合这些方法,需要根据实际问题,实际模型,进行选择。 + +### 2.47.4 交叉验证的主要作用? +为了得到更为稳健可靠的模型,对模型的泛化误差进行评估,得到模型泛化误差的近似值。当有多个模型可以选择时,我们通常选择“泛化误差”最小的模型。 + +交叉验证的方法有许多种,但是最常用的是:留一交叉验证、k折交叉验证 + +### 2.47.5 k折交叉验证? +1. 将含有N个样本的数据集,分成K份,每份含有N/K个样本。选择其中1份作为测试集,另外K-1份作为训练集,测试集就有K种情况。 +2. 在每种情况中,用训练集训练模型,用测试集测试模型,计算模型的泛化误差。 +3. 交叉验证重复K次,每份验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测,得到模型最终的泛化误差。 +4. 将K种情况下,模型的泛化误差取均值,得到模型最终的泛化误差。 +**注**: +1. 一般2<=K<=10。 k折交叉验证的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。 +2. 训练集中样本数量要足够多,一般至少大于总样本数的50%。 +3. 训练集和测试集必须从完整的数据集中均匀取样。均匀取样的目的是希望减少训练集、测试集与原数据集之间的偏差。当样本数量足够多时,通过随机取样,便可以实现均匀取样的效果。 + +### 2.47.6 混淆矩阵 +第一种混淆矩阵 +|真实情况T or F|预测为正例1,P|预测为负例0,N| +|:-:|:-|:-| +|本来label标记为1,预测结果真为、T假为F|TP(预测为1,实际为1)|FN(预测为0,实际为1)| +|本来label标记为0,预测结果真为、T假为F|FP(预测为1,实际为0)|TN(预测为0,实际也为0)| + +第二种混淆矩阵 +|预测情况P or N|实际label为1,预测对了为T|实际label为0,预测对了为T| +|:-:|:-|:-| +|预测为正例1,P|TP(预测为1,实际为1)|FP(预测为1,实际为0)| +|预测为负例0,N|FN(预测为0,实际为1)|TN(预测为0,实际也为0)| + +### 2.47.7 错误率及精度 +1. 错误率(Error Rate):分类错误的样本数占样本总数的比例。 +2. 精度(accuracy):分类正确的样本数占样本总数的比例。 + +### 2.47.8 查准率与查全率 +将算法预测的结果分成四种情况: +1. 正确肯定(True Positive,TP):预测为真,实际为真 +2. 正确否定(True Negative,TN):预测为假,实际为假 +3. 错误肯定(False Positive,FP):预测为真,实际为假 +4. 错误否定(False Negative,FN):预测为假,实际为真 + +则: + +查准率(Precision)=TP/(TP+FP) + +**理解**:预测出为阳性的样本中,正确的有多少。区别准确率(正确预测出的样本,包括正确预测为阳性、阴性,占总样本比例)。 +例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。 + +查全率(Recall)=TP/(TP+FN) + +**理解**:正确预测为阳性的数量占总样本中阳性数量的比例。 +例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。 + +### 2.47.9 ROC与AUC +ROC全称是“受试者工作特征”(Receiver Operating Characteristic)。 + +ROC曲线的面积就是AUC(Area Under the Curve)。 + +AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。 + +ROC曲线,通过将连续变量设定出多个不同的临界值,从而计算出一系列真正率和假正率,再以假正率为纵坐标、真正率为横坐标绘制成曲线,曲线下面积越大,诊断准确性越高。在ROC曲线上,最靠近坐标图左上方的点为假正率和真正率均较高的临界值。 + +对于分类器,或者说分类算法,评价指标主要有precision,recall,F-score。下图是一个ROC曲线的示例。 + +![](../img/ch2/2.40.10/1.png) + +ROC曲线的横坐标为false positive rate(FPR),纵坐标为true positive rate(TPR)。其中 +TODO, TODO, +下面着重介绍ROC曲线图中的四个点和一条线。 +第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。意味着这是一个完美的分类器,它将所有的样本都正确分类。 +第二个点,(1,0),即FPR=1,TPR=0,意味着这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。 +第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。 +第四个点,(1,1),即FPR=TPR=1,分类器实际上预测所有的样本都为正样本。 +经过以上分析,ROC曲线越接近左上角,该分类器的性能越好。 + +ROC曲线所覆盖的面积称为AUC(Area Under Curve),可以更直观的判断学习器的性能,AUC越大则性能越好。 +### 2.47.10 如何画ROC曲线? +http://blog.csdn.net/zdy0_2004/article/details/44948511 +下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率。 + +步骤: +1、假设已经得出一系列样本被划分为正类的概率,按照大小排序。 +2、从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。 举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。 +3、每次选取一个不同的threshold,得到一组FPR和TPR,即ROC曲线上的一点。以此共得到20组FPR和TPR的值。其中FPR和TPR简单理解如下: +4、根据3)中的每个坐标点点,画图。 + +![](../img/ch2/2.40.11/1.jpg) + +### 2.47.11 如何计算TPR,FPR? +1、分析数据 +y_true = [0, 0, 1, 1]; +scores = [0.1, 0.4, 0.35, 0.8]; +2、列表 +样本 预测属于P的概率(score) 真实类别 +y[0] 0.1 N +y[2] 0.35 P +y[1] 0.4 N +y[3] 0.8 P +3、将截断点依次取为score值,计算TPR和FPR。 +当截断点为0.1时: +说明只要score>=0.1,它的预测类别就是正例。 因为4个样本的score都大于等于0.1,所以,所有样本的预测类别都为P。 +scores = [0.1, 0.4, 0.35, 0.8]; +y_true = [0, 0, 1, 1]; +y_pred = [1, 1, 1, 1]; +正例与反例信息如下: +真实值 预测值 +​ 正例 反例 +正例 TP=2 FN=0 +反例 FP=2 TN=0 +由此可得: +TPR = TP/(TP+FN) = 1; +FPR = FP/(TN+FP) = 1; + +当截断点为0.35时: +scores = [0.1, 0.4, 0.35, 0.8] +y_true = [0, 0, 1, 1] +y_pred = [0, 1, 1, 1] +正例与反例信息如下: +真实值 预测值 +​ 正例 反例 +正例 TP=2 FN=0 +反例 FP=1 TN=1 +由此可得: +TPR = TP/(TP+FN) = 1; +FPR = FP/(TN+FP) = 0.5; + +当截断点为0.4时: +scores = [0.1, 0.4, 0.35, 0.8]; +y_true = [0, 0, 1, 1]; +y_pred = [0, 1, 0, 1]; +正例与反例信息如下: +真实值 预测值 +​ 正例 反例 +正例 TP=1 FN=1 +反例 FP=1 TN=1 +由此可得: +TPR = TP/(TP+FN) = 0.5; +FPR = FP/(TN+FP) = 0.5; + +当截断点为0.8时: +scores = [0.1, 0.4, 0.35, 0.8]; +y_true = [0, 0, 1, 1]; +y_pred = [0, 0, 0, 1]; +正例与反例信息如下: +真实值 预测值 +​ 正例 反例 +正例 TP=1 FN=1 +反例 FP=0 TN=2 +由此可得: +TPR = TP/(TP+FN) = 0.5; +FPR = FP/(TN+FP) = 0; +4、根据TPR、FPR值,以FPR为横轴,TPR为纵轴画图。 + +### 2.47.12 如何计算Auc? +a.将坐标点按照横着FPR排序 +b.计算第i个坐标点和第i+1个坐标点的间距 dx; +c.获取第i(或者i+1)个坐标点的纵坐标y; +d.计算面积微元ds = ydx; +e.对面积微元进行累加,得到AUC。 + +### 2.47.13 为什么使用Roc和Auc评价分类器? +模型有很多评估方法,为什么还要使用ROC和AUC呢? +因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本也可能随着时间变化。 + +### 2.47.14 直观理解AUC +http://blog.csdn.net/cherrylvlei/article/details/52958720 +AUC是ROC右下方的曲线面积。下图展现了三种AUC的值: + +![](../img/ch2/2.40.15/1.png) + +AUC是衡量二分类模型优劣的一种评价指标,表示正例排在负例前面的概率。其他评价指标有精确度、准确率、召回率,而AUC比这三者更为常用。 +因为一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。 +我们不妨举一个极端的例子:一个二类分类问题一共10个样本,其中9个样本为正例,1个样本为负例,在全部判正的情况下准确率将高达90%,而这并不是我们希望的结果,尤其是在这个负例样本得分还是最高的情况下,模型的性能本应极差,从准确率上看却适得其反。而AUC能很好描述模型整体性能的高低。这种情况下,模型的AUC值将等于0(当然,通过取反可以解决小于50%的情况,不过这是另一回事了)。 + +### 2.47.15 代价敏感错误率与代价曲线 + +http://blog.csdn.net/cug_lzt/article/details/78295140 + +不同的错误会产生不同代价。 +以二分法为例,设置代价矩阵如下: + +![](../img/ch2/2-1.png) + +当判断正确的时候,值为0,不正确的时候,分别为$Cost_{01}$和$Cost_{10}$ 。 + +$Cost_{10}$:表示实际为反例但预测成正例的代价。 + +$Cost_{01}$:表示实际为正例但是预测为反例的代价。 + +**代价敏感错误率**: +$\frac{样本中由模型得到的错误值与代价乘积之和}{总样本}$ + +其数学表达式为: + +![](../img/ch2/2-2.png) + +$D^{+}、D^{-}$分别代表样例集 的正例子集和反例子集。 + +代价曲线: +在均等代价时,ROC曲线不能直接反应出模型的期望总体代价,而代价曲线可以。 +代价曲线横轴为[0,1]的正例函数代价: + +$P(+)Cost=\frac{p*Cost_{01}}{p*Cost_{01}+(1-p)*Cost_{10}}$ + +其中p是样本为正例的概率。 + +代价曲线纵轴维[0,1]的归一化代价: +$Cost_{norm}=\frac{FNR*p*Cost_{01}+FNR*(1-p)*Cost_{10}}{p*Cost_{01}+(1-p)*Cost_{10}}$ + + +其中FPR为假正例率,FNR=1-TPR为假反利率。 + +注:ROC每个点,对应代价平面上一条线。 + +例如,ROC上(TPR,FPR),计算出FNR=1-TPR,在代价平面上绘制一条从(0,FPR)到(1,FNR)的线段,面积则为该条件下期望的总体代价。所有线段下界面积,所有条件下学习器的期望总体代价。 + +![](../img/ch2/2-3.png) + +### 2.40.17 模型有哪些比较检验方法 +http://wenwen.sogou.com/z/q721171854.htm +正确性分析:模型稳定性分析,稳健性分析,收敛性分析,变化趋势分析,极值分析等。 +有效性分析:误差分析,参数敏感性分析,模型对比检验等。 +有用性分析:关键数据求解,极值点,拐点,变化趋势分析,用数据验证动态模拟等。 +高效性分析:时空复杂度分析与现有进行比较等。 + +### 2.40.18 偏差与方差 +http://blog.csdn.net/zhihua_oba/article/details/78684257 + +方差公式为: + +$S_{N}^{2}=\frac{1}{N}\sum_{i=1}^{N}(x_{i}-\bar{x})^{2}$ + +泛化误差可分解为偏差、方差与噪声之和,即 +generalization error=bias+variance+noise。 + +噪声:描述了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。 +假定期望噪声为零,则泛化误差可分解为偏差、方差之和,即 +generalization error=bias+variance。 + +偏差(bias):描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据,如下图第二行所示。 + +方差(variance):描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散,模型的稳定程度越差。如果模型在训练集上拟合效果比较优秀,但是在测试集上拟合效果比较差劣,则方差较大,说明模型的稳定程度较差,出现这种现象可能是由于模型对训练集过拟合造成的。 如下图右列所示。 + +![](../img/ch2/2-4.png) + +简单的总结一下: +偏差大,会造成模型欠拟合; +方差大,会造成模型过拟合。 + +### 2.40.19为什么使用标准差? + +标准差公式为: +$S_{N}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}(x_{i}-\bar{x})^{2}}$ +样本标准差公式为: +$S_{N}=\sqrt{\frac{1}{N-1}\sum_{i=1}^{N}(x_{i}-\bar{x})^{2}}$ + +与方差相比,使用标准差来表示数据点的离散程度有3个好处: +1、表示离散程度的数字与样本数据点的数量级一致,更适合对数据样本形成感性认知。 + +2、表示离散程度的数字单位与样本数据的单位一致,更方便做后续的分析运算。 + +3、在样本数据大致符合正态分布的情况下,标准差具有方便估算的特性:66.7%的数据点落在平均值前后1个标准差的范围内、95%的数据点落在平均值前后2个标准差的范围内,而99%的数据点将会落在平均值前后3个标准差的范围内。 +### 2.40.20 点估计思想 +点估计:用实际样本的一个指标来估计总体的一个指标的一种估计方法。 + +点估计举例:比如说,我们想要了解中国人的平均身高,那么在大街上随便找了一个人,通过测量这个人的身高来估计中国人的平均身高水平;或者在淘宝上买东西的时候随便一次买到假货就说淘宝上都是假货等;这些都属于点估计。 + +点估计主要思想:在样本数据中得到一个指标,通过这个指标来估计总体指标;比如我们用样本均数来估计总体均数,样本均数就是我们要找到的指标。 + +### 2.40.21 点估计优良性原则? +获取样本均数指标相对来说比较简单,但是并不是总体的所有指标都很容易在样本中得到,比如说总体的标准差用样本的哪个指标来估计呢? + +优良性准则有两大类:一类是小样本准则,即在样本大小固定时的优良性准则;另一类是大样本准则,即在样本大小趋于无穷时的优良性准则。最重要的小样本优良性准则是无偏性及与此相关的一致最小方差无偏计。 + +样本中用来估计总体的指标要符合以下规则: + +1.首先必须是无偏统计量。 +所谓无偏性,即数学期望等于总体相应的统计量的样本估计量。 + +2.最小方差准则 +针对总体样本的无偏估计量不唯一的情况,需选用其他准则,例如最小方差准则。如果一个统计量具有最小方差,也就是说所有的样本点与此统计量的离差平方和最小,则这个统计量被称为最小平方无偏估计量。 +最大概率准则 + +4、缺一交叉准则 +在非参数回归中好像用的是缺一交叉准则 + +要明白一个原则:计算样本的任何分布、均数、标准差都是没有任何意义的,如果样本的这种计算不能反映总体的某种特性。 + +### 2.40.22点估计、区间估计、中心极限定理之间的联系? +https://www.zhihu.com/question/21871331#answer-4090464 +点估计:是用样本统计量来估计总体参数,因为样本统计量为数轴上某一点值,估计的结果也以一个点的数值表示,所以称为点估计。 + +区间估计:通过从总体中抽取的样本,根据一定的正确度与精确度的要求,构造出适当的区间,以作为总体的分布参数(或参数的函数)的真值所在范围的估计。 +中心极限定理:设从均值为、方差为;(有限)的任意一个总体中抽取样本量为n的样本,当n充分大时,样本均值的抽样分布近似服从均值为、方差为的正态分布。 + +三者之间联系: + +1、中心极限定理是推断统计的理论基础,推断统计包括参数估计和假设检验,其中参数估计包括点估计和区间估计,所以说,中心极限定理也是点估计和区间估计的理论基础。 + +2、参数估计有两种方法:点估计和区间估计,区间估计包含了点估计。 + +相同点:都是基于一个样本作出; + +不同点:点估计只提供单一的估计值,而区间估计基于点估计还提供误差界限,给出了置信区间,受置信度的影响。 + +### 2.40.23 类别不平衡产生原因? +类别不平衡(class-imbalance)是指分类任务中不同类别的训练样例数目差别很大的情况。 + +产生原因: + +通常分类学习算法都会假设不同类别的训练样例数目基本相同。如果不同类别的训练样例数目差别很大,则会影响学习结果,测试结果变差。例如二分类问题中有998个反例,正例有2个,那学习方法只需返回一个永远将新样本预测为反例的分类器,就能达到99.8%的精度;然而这样的分类器没有价值。 +### 2.40.24 常见的类别不平衡问题解决方法 +http://blog.csdn.net/u013829973/article/details/77675147 + +  防止类别不平衡对学习造成的影响,在构建分类模型之前,需要对分类不平衡性问题进行处理。主要解决方法有: + +1、扩大数据集 + +增加包含小类样本数据的数据,更多的数据能得到更多的分布信息。 + +2、对大类数据欠采样 + +减少大类数据样本个数,使与小样本个数接近。 +缺点:欠采样操作时若随机丢弃大类样本,可能会丢失重要信息。 +代表算法:EasyEnsemble。利用集成学习机制,将大类划分为若干个集合供不同的学习器使用。相当于对每个学习器都进行了欠采样,但在全局来看却不会丢失重要信息。 + +3、对小类数据过采样 + +过采样:对小类的数据样本进行采样来增加小类的数据样本个数。 + +代表算法:SMOTE和ADASYN。 + +SMOTE:通过对训练集中的小类数据进行插值来产生额外的小类样本数据。 + +新的少数类样本产生的策略:对每个少数类样本a,在a的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。 +ADASYN:根据学习难度的不同,对不同的少数类别的样本使用加权分布,对于难以学习的少数类的样本,产生更多的综合数据。 通过减少类不平衡引入的偏差和将分类决策边界自适应地转移到困难的样本两种手段,改善了数据分布。 + +4、使用新评价指标 + +如果当前评价指标不适用,则应寻找其他具有说服力的评价指标。比如准确度这个评价指标在类别不均衡的分类任务中并不适用,甚至进行误导。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。 + +5、选择新算法 + +不同的算法适用于不同的任务与数据,应该使用不同的算法进行比较。 + +6、数据代价加权 + +例如当分类任务是识别小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值,从而使得分类器将重点集中在小类样本身上。 + +7、转化问题思考角度 + +例如在分类问题时,把小类的样本作为异常点,将问题转化为异常点检测或变化趋势检测问题。 异常点检测即是对那些罕见事件进行识别。变化趋势检测区别于异常点检测在于其通过检测不寻常的变化趋势来识别。 + +8、将问题细化分析 + +对问题进行分析与挖掘,将问题划分成多个更小的问题,看这些小问题是否更容易解决。 + +## 2.41 决策树 + +### 2.41.1 决策树的基本原理 +决策树是一种分而治之(Divide and Conquer)的决策过程。一个困难的预测问题, 通过树的分支节点, 被划分成两个或多个较为简单的子集,从结构上划分为不同的子问题。将依规则分割数据集的过程不断递归下去(Recursive Partitioning)。随着树的深度不断增加,分支节点的子集越来越小,所需要提的问题数也逐渐简化。当分支节点的深度或者问题的简单程度满足一定的停止规则(Stopping Rule)时, 该分支节点会停止劈分,此为自上而下的停止阈值(Cutoff Threshold)法;有些决策树也使用自下而上的剪枝(Pruning)法。 + +### 2.41.2 决策树的三要素? +一棵决策树的生成过程主要分为以下3个部分: + +特征选择:从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。 + +决策树生成:根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。树结构来说,递归结构是最容易理解的方式。 + +剪枝:决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。 +### 2.41.3 决策树学习基本算法 + +![](../img/ch2/2-5.png) + +### 2.41.4 决策树算法优缺点 + +决策树算法的优点: + +1、理解和解释起来简单,决策树模型易想象。 + +2、相比于其他算法需要大量数据集而已,决策树算法要求的数据集不大。 + +3、决策树算法的时间复杂度较小,为用于训练决策树的数据点的对数。 + +4、相比于其他算法智能分析一种类型变量,决策树算法可处理数字和数据的类别。 + +5、能够处理多输出的问题。 + +6、对缺失值不敏感。 + +7、可以处理不相关特征数据。 + +8、效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度。 + +决策树算法的缺点: + +1、对连续性的字段比较难预测。 + +2、容易出现过拟合。 + +3、当类别太多时,错误可能就会增加的比较快。 + +4、信息缺失时处理起来比较困难,忽略了数据集中属性之间的相关性。 + +5、在处理特征关联性比较强的数据时表现得不是太好。 + +6、对于各类别样本数量不一致的数据,在决策树当中,信息增益的结果偏向于那些具有更多数值的特征。 + +### 2.40.5熵的概念以及理解 + +熵:度量随机变量的不确定性。 + +定义:假设随机变量X的可能取值有$x_{1},x_{2},...,x_{n}$,对于每一个可能的取值$x_{i}$,其概率为$P(X=x_{i})=p_{i},i=1,2...,n$。随机变量的熵为: + +$H(X)=-\sum_{i=1}^{n}p_{i}log_{2}p_{i}$ + +对于样本集合 ,假设样本有k个类别,每个类别的概率为$\frac{|C_{k}|}{|D|}$,其中$|C_{k}|}{|D|$为类别为k的样本个数,$|D|$为样本总数。样本集合D的熵为: +$H(D)=-\sum_{k=1}^{k}\frac{|C_{k}|}{|D|}log_{2}\frac{|C_{k}|}{|D|}$ + +### 2.40.6 信息增益的理解 +定义:以某特征划分数据集前后的熵的差值。 +熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。 +假设划分前样本集合D的熵为H(D)。使用某个特征A划分数据集D,计算划分后的数据子集的熵为H(D|A)。 + +则信息增益为: + +$g(D,A)=H(D)-H(D|A)$ + +注:在决策树构建的过程中我们总是希望集合往最快到达纯度更高的子集合方向发展,因此我们总是选择使得信息增益最大的特征来划分当前数据集D。 + +思想:计算所有特征划分数据集D,得到多个特征划分数据集D的信息增益,从这些信息增益中选择最大的,因而当前结点的划分特征便是使信息增益最大的划分所使用的特征。 + +另外这里提一下信息增益比相关知识: + +信息增益比=惩罚参数X信息增益。 + +信息增益比本质:在信息增益的基础之上乘上一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。 + +惩罚参数:数据集D以特征A作为随机变量的熵的倒数。 + +### 2.40.7 剪枝处理的作用及策略? +剪枝处理是决策树学习算法用来解决过拟合的一种办法。 + +在决策树算法中,为了尽可能正确分类训练样本, 节点划分过程不断重复, 有时候会造成决策树分支过多,以至于将训练样本集自身特点当作泛化特点, 而导致过拟合。 因此可以采用剪枝处理来去掉一些分支来降低过拟合的风险。 + +剪枝的基本策略有预剪枝(prepruning)和后剪枝(postprunint)。 + +预剪枝:在决策树生成过程中,在每个节点划分前先估计其划分后的泛化性能, 如果不能提升,则停止划分,将当前节点标记为叶结点。 + +后剪枝:生成决策树以后,再自下而上对非叶结点进行考察, 若将此节点标记为叶结点可以带来泛化性能提升,则修改之。 + +## 2.41 支持向量机 + +### 2.41.1 什么是支持向量机 +SVM - Support Vector Machine。支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。 + +什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。 + +见下图,在一个二维环境中,其中点R,S,G点和其它靠近中间黑线的点可以看作为支持向量,它们可以决定分类器,也就是黑线的具体参数。 + +![](../img/ch2/2-6.png) + +### 2.25.2 支持向量机解决的问题? +https://www.cnblogs.com/steven-yang/p/5658362.html +解决的问题: + +线性分类 + +在训练数据中,每个数据都有n个的属性和一个二类类别标志,我们可以认为这些数据在一个n维空间里。我们的目标是找到一个n-1维的超平面(hyperplane),这个超平面可以将数据分成两部分,每部分数据都属于同一个类别。 + +其实这样的超平面有很多,我们要找到一个最佳的。因此,增加一个约束条件:这个超平面到每边最近数据点的距离是最大的。也成为最大间隔超平面(maximum-margin hyperplane)。这个分类器也成为最大间隔分类器(maximum-margin classifier)。 + +支持向量机是一个二类分类器。 + +非线性分类 + +SVM的一个优势是支持非线性分类。它结合使用拉格朗日乘子法和KKT条件,以及核函数可以产生非线性分类器。 + +分类器1 - 线性分类器 + +是一个线性函数,可以用于线性分类。一个优势是不需要样本数据。 + +classifier 1: +f(x)=xwT+b(1) +(1)f(x)=xwT+b + +ww 和 bb 是训练数据后产生的值。 + + +分类器2 - 非线性分类器 + +支持线性分类和非线性分类。需要部分样本数据(支持向量),也就是αi≠0αi≠0的数据。 +∵∵ +w=∑ni=1αiyixiw=∑i=1nαiyixi +∴∴ + +classifier 2: + +f(x)=∑ni=1αiyiK(xi,x)+bherexi : training data iyi : label value of training data iαi : Lagrange multiplier of training data iK(x1,x2)=exp(−∥x1−x2∥22σ2) : kernel function(2) +(2)f(x)=∑i=1nαiyiK(xi,x)+bherexi : training data iyi : label value of training data iαi : Lagrange multiplier of training data iK(x1,x2)=exp(−‖x1−x2‖22σ2) : kernel function + +αα, σσ 和 bb 是训练数据后产生的值。 +可以通过调节σσ来匹配维度的大小,σσ越大,维度越低。 + +### 2.25.2 核函数作用? + +核函数目的:把原坐标系里线性不可分的数据用Kernel投影到另一个空间,尽量使得数据在新的空间里线性可分。 + +核函数方法的广泛应用,与其特点是分不开的: + +1)核函数的引入避免了“维数灾难”,大大减小了计算量。而输入空间的维数n对核函数矩阵无影响,因此,核函数方法可以有效处理高维输入。 + +2)无需知道非线性变换函数Φ的形式和参数. + +3)核函数的形式和参数的变化会隐式地改变从输入空间到特征空间的映射,进而对特征空间的性质产生影响,最终改变各种核函数方法的性能。 + +4)核函数方法可以和不同的算法相结合,形成多种不同的基于核函数技术的方法,且这两部分的设计可以单独进行,并可以为不同的应用选择不同的核函数和算法。 + +### 2.25.3 对偶问题 +### 2.25.4 理解支持向量回归 +http://blog.csdn.net/liyaohhh/article/details/51077082 + +### 2.25.5 理解SVM(核函数) +http://blog.csdn.net/Love_wanling/article/details/69390047 + +### 2.25.6 常见的核函数有哪些? +http://blog.csdn.net/Love_wanling/article/details/69390047 + +本文将遇到的核函数进行收集整理,分享给大家。 +http://blog.csdn.net/wsj998689aa/article/details/47027365 + +1.Linear Kernel +线性核是最简单的核函数,核函数的数学公式如下: + +$k(x,y)=xy$ + +如果我们将线性核函数应用在KPCA中,我们会发现,推导之后和原始PCA算法一模一样,很多童鞋借此说“kernel is shit!!!”,这是不对的,这只是线性核函数偶尔会出现等价的形式罢了。 + +2.Polynomial Kernel + +多项式核实一种非标准核函数,它非常适合于正交归一化后的数据,其具体形式如下: + +$k(x,y)=(ax^{t}y+c)^{d}$ + +这个核函数是比较好用的,就是参数比较多,但是还算稳定。 + +3.Gaussian Kernel + +这里说一种经典的鲁棒径向基核,即高斯核函数,鲁棒径向基核对于数据中的噪音有着较好的抗干扰能力,其参数决定了函数作用范围,超过了这个范围,数据的作用就“基本消失”。高斯核函数是这一族核函数的优秀代表,也是必须尝试的核函数,其数学形式如下: + +$k(x,y)=exp(-\frac{\left \| x-y \right \|^{2}}{2\sigma ^{2}})$ + +虽然被广泛使用,但是这个核函数的性能对参数十分敏感,以至于有一大把的文献专门对这种核函数展开研究,同样,高斯核函数也有了很多的变种,如指数核,拉普拉斯核等。 + +4.Exponential Kernel + +指数核函数就是高斯核函数的变种,它仅仅是将向量之间的L2距离调整为L1距离,这样改动会对参数的依赖性降低,但是适用范围相对狭窄。其数学形式如下: + +$k(x,y)=exp(-\frac{\left \| x-y \right \|}{2\sigma ^{2}})$ + +5.Laplacian Kernel + +拉普拉斯核完全等价于指数核,唯一的区别在于前者对参数的敏感性降低,也是一种径向基核函数。 + +$k(x,y)=exp(-\frac{\left \| x-y \right \|}{\sigma })$ + +6.ANOVA Kernel + +ANOVA 核也属于径向基核函数一族,其适用于多维回归问题,数学形式如下: + +$k(x,y)=exp(-\sigma(x^{k}-y^{k})^{2})^{d}$ + +7.Sigmoid Kernel + +Sigmoid 核来源于神经网络,现在已经大量应用于深度学习,是当今机器学习的宠儿,它是S型的,所以被用作于“激活函数”。关于这个函数的性质可以说好几篇文献,大家可以随便找一篇深度学习的文章看看。 + +$k(x,y)=tanh(ax^{t}y+c)$ + +8.Rational Quadratic Kernel +二次有理核完完全全是作为高斯核的替代品出现,如果你觉得高斯核函数很耗时,那么不妨尝试一下这个核函数,顺便说一下,这个核函数作用域虽广,但是对参数十分敏感,慎用!!!! + +$k(x,y)=1-\frac{\left \| x-y \right \|^{2}}{\left \| x-y \right \|^{2}+c}$ + +### 2.25.6 软间隔与正则化 +### 2.25.7 SVM主要特点及缺点? + +http://www.elecfans.com/emb/fpga/20171118582139_2.html + +3.3.2.1 SVM有如下主要几个特点: + +(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射; +(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心; +(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。(4)SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。 +(5)SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。 +(6)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在: +①增、删非支持向量样本对模型没有影响; +②支持向量样本集具有一定的鲁棒性; +③有些成功的应用中,SVM 方法对核的选取不敏感 + +3.3.2.2 SVM的两个不足: +(1) SVM算法对大规模训练样本难以实施 +由 于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存 和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的 CSVM以及O.L.Mangasarian等的SOR算法。 +(2) 用SVM解决多分类问题存在困难 +经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。 + +## 2.26 贝叶斯 +### 2.26.1 图解极大似然估计 + +极大似然估计 http://blog.csdn.net/zengxiantao1994/article/details/72787849 + +极大似然估计的原理,用一张图片来说明,如下图所示: + +![](../img/ch2/2-7.png) + +总结起来,最大似然估计的目的就是:利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值。 + +原理:极大似然估计是建立在极大似然原理的基础上的一个统计方法,是概率论在统计学中的应用。极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。 + +由于样本集中的样本都是独立同分布,可以只考虑一类样本集D,来估计参数向量θ。记已知的样本集为: + +$D=x_{1},x_{2},...,x_{n}$ + +似然函数(linkehood function):联合概率密度函数$P(D|\theta )$称为相对于$x_{1},x_{2},...,x_{n}$的θ的似然函数。 + +$l(\theta )=p(D|\theta ) =p(x_{1},x_{2},...,x_{N}|\theta )=\prod_{i=1}^{N}p(x_{i}|\theta )$ + +如果$\hat{\theta}$是参数空间中能使似然函数$l(\theta)$最大的θ值,则$\hat{\theta}$应该是“最可能”的参数值,那么$\hat{\theta}$就是θ的极大似然估计量。它是样本集的函数,记作: + +$\hat{\theta}=d(x_{1},x_{2},...,x_{N})=d(D)$ + +$\hat{\theta}(x_{1},x_{2},...,x_{N})$称为极大似然函数估计值。 + +### 2.26.2 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别? +### 2.26.4 朴素与半朴素贝叶斯分类器 +### 2.26.5 贝叶斯网三种典型结构 +### 2.26.6 什么是贝叶斯错误率 +### 2.26.7 什么是贝叶斯最优错误率 +## 2.27 EM算法解决问题及实现流程 + +1.EM算法要解决的问题 + + 我们经常会从样本观察数据中,找出样本的模型参数。 最常用的方法就是极大化模型分布的对数似然函数。 + +但是在一些情况下,我们得到的观察数据有未观察到的隐含数据,此时我们未知的有隐含数据和模型参数,因而无法直接用极大化对数似然函数得到模型分布的参数。怎么办呢?这就是EM算法可以派上用场的地方了。 + +EM算法解决这个的思路是使用启发式的迭代方法,既然我们无法直接求出模型分布参数,那么我们可以先猜想隐含数据(EM算法的E步),接着基于观察数据和猜测的隐含数据一起来极大化对数似然,求解我们的模型参数(EM算法的M步)。由于我们之前的隐藏数据是猜测的,所以此时得到的模型参数一般还不是我们想要的结果。不过没关系,我们基于当前得到的模型参数,继续猜测隐含数据(EM算法的E步),然后继续极大化对数似然,求解我们的模型参数(EM算法的M步)。以此类推,不断的迭代下去,直到模型分布参数基本无变化,算法收敛,找到合适的模型参数。 + +从上面的描述可以看出,EM算法是迭代求解最大值的算法,同时算法在每一次迭代时分为两步,E步和M步。一轮轮迭代更新隐含数据和模型分布参数,直到收敛,即得到我们需要的模型参数。 + + +一个最直观了解EM算法思路的是K-Means算法,见之前写的K-Means聚类算法原理。 + + +在K-Means聚类时,每个聚类簇的质心是隐含数据。我们会假设KK个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM算法的M步。重复这个E步和M步,直到质心不再变化为止,这样就完成了K-Means聚类。 + + +当然,K-Means算法是比较简单的,实际中的问题往往没有这么简单。上面对EM算法的描述还很粗糙,我们需要用数学的语言精准描述。 + + +EM算法流程 + +现在我们总结下EM算法的流程。 + +输入:观察数据x=(x(1),x(2),...x(m))x=(x(1),x(2),...x(m)),联合分布p(x,z|θ)p(x,z|θ), 条件分布p(z|x,θ)p(z|x,θ), 最大迭代次数JJ。 + +1) 随机初始化模型参数θθ的初值θ0θ0。 + +2) for j from 1 to J开始EM算法迭代: + +a) E步:计算联合分布的条件概率期望: +Qi(z(i))=P(z(i)|x(i),θj))Qi(z(i))=P(z(i)|x(i),θj)) +L(θ,θj)=∑i=1m∑z(i)Qi(z(i))logP(x(i),z(i)|θ)L(θ,θj)=∑i=1m∑z(i)Qi(z(i))logP(x(i),z(i)|θ) + +b) M步:极大化L(θ,θj)L(θ,θj),得到θj+1θj+1: +θj+1=argmaxθL(θ,θj)θj+1=argmaxθL(θ,θj) + +c) 如果θj+1θj+1已收敛,则算法结束。否则继续回到步骤a)进行E步迭代。 + +输出:模型参数θθ。 + +## 2.28 为什么会产生维数灾难? + +http://blog.csdn.net/chenjianbo88/article/details/52382943 + +假设地球上猫和狗的数量是无限的。由于有限的时间和计算能力,我们仅仅选取了10张照片作为训练样本。我们的目的是基于这10张照片来训练一个线性分类器,使得这个线性分类器可以对剩余的猫或狗的照片进行正确分类。我们从只用一个特征来辨别猫和狗开始: + +![](../img/ch2/2-8.png) + +从图2可以看到,如果仅仅只有一个特征的话,猫和狗几乎是均匀分布在这条线段上,很难将10张照片线性分类。那么,增加一个特征后的情况会怎么样: + +![](../img/ch2/2-9.png) + +增加一个特征后,我们发现仍然无法找到一条直线将猫和狗分开。所以,考虑需要再增加一个特征: + +![](../img/ch2/2-10.png) + +此时,我们终于找到了一个平面将猫和狗分开。需要注意的是,只有一个特征时,假设特征空间是长度为5的线段,则样本密度是10/5=2。有两个特征时,特征空间大小是5*5=25,样本密度是10/25=0.4。有三个特征时,特征空间大小是5*5*5=125,样本密度是10/125=0.08。如果继续增加特征数量,样本密度会更加稀疏,也就更容易找到一个超平面将训练样本分开。因为随着特征数量趋向于无限大,样本密度非常稀疏,训练样本被分错的可能性趋向于零。当我们将高维空间的分类结果映射到低维空间时,一个严重的问题出现了: + +![](../img/ch2/2-11.png) + +从图5可以看到将三维特征空间映射到二维特征空间后的结果。尽管在高维特征空间时训练样本线性可分,但是映射到低维空间后,结果正好相反。事实上,增加特征数量使得高维空间线性可分,相当于在低维空间内训练一个复杂的非线性分类器。不过,这个非线性分类器太过“聪明”,仅仅学到了一些特例。如果将其用来辨别那些未曾出现在训练样本中的测试样本时,通常结果不太理想。这其实就是我们在机器学习中学过的过拟合问题。 + +![](../img/ch2/2-12.png) + +尽管图6所示的只采用2个特征的线性分类器分错了一些训练样本,准确率似乎没有图4的高,但是,采用2个特征的线性分类器的泛化能力比采用3个特征的线性分类器要强。因为,采用2个特征的线性分类器学习到的不只是特例,而是一个整体趋势,对于那些未曾出现过的样本也可以比较好地辨别开来。换句话说,通过减少特征数量,可以避免出现过拟合问题,从而避免“维数灾难”。 + +![](../img/ch2/2-13.png) + +图7从另一个角度诠释了“维数灾难”。假设只有一个特征时,特征的值域是0到1,每一只猫和狗的特征值都是唯一的。如果我们希望训练样本覆盖特征值值域的20%,那么就需要猫和狗总数的20%。我们增加一个特征后,为了继续覆盖特征值值域的20%就需要猫和狗总数的45%(0.45^2=0.2)。继续增加一个特征后,需要猫和狗总数的58%(0.58^3=0.2)。随着特征数量的增加,为了覆盖特征值值域的20%,就需要更多的训练样本。如果没有足够的训练样本,就可能会出现过拟合问题。 + +![](../img/ch2/2-14.png) + +通过上述例子,我们可以看到特征数量越多,训练样本就会越稀疏,分类器的参数估计就会越不准确,更加容易出现过拟合问题。“维数灾难”的另一个影响是训练样本的稀疏性并不是均匀分布的。处于中心位置的训练样本比四周的训练样本更加稀疏。 + +假设有一个二维特征空间,如图8所示的矩形,在矩形内部有一个内切的圆形。由于越接近圆心的样本越稀疏,因此,相比于圆形内的样本,那些位于矩形四角的样本更加难以分类。那么,随着特征数量的增加,圆形的面积会不会变化呢?这里我们假设超立方体(hypercube)的边长d=1,那么计算半径为0.5的超球面(hypersphere)的体积(volume)的公式为: +$V(d)=\frac{\pi ^{\frac{d}{2}}}{\Gamma (\frac{d}{2}+1)}0.5^{d}$ + +![](../img/ch2/2-15.png) + +从图9可以看出随着特征数量的增加,超球面的体积逐渐减小直至趋向于零,然而超立方体的体积却不变。这个结果有点出乎意料,但部分说明了分类问题中的“维数灾难”:在高维特征空间中,大多数的训练样本位于超立方体的角落。 + +![](../img/ch2/2-16.png) + + 图10显示了不同维度下,样本的分布情况。在8维特征空间中,共有2^8=256个角落,而98%的样本分布在这些角落。随着维度的不断增加,公式2将趋向于0,其中dist_max和dist_min分别表示样本到中心的最大与最小距离。 + +![](../img/ch2/2-17.png) + +因此,在高维特征空间中对于样本距离的度量失去意义。由于分类器基本都依赖于如Euclidean距离,Manhattan距离等,所以在特征数量过大时,分类器的性能就会出现下降。 + +所以,我们如何避免“维数灾难”?图1显示了分类器的性能随着特征个数的变化不断增加,过了某一个值后,性能不升反降。这里的某一个值到底是多少呢?目前,还没有方法来确定分类问题中的这个阈值是多少,这依赖于训练样本的数量,决策边界的复杂性以及分类器的类型。理论上,如果训练样本的数量无限大,那么就不会存在“维数灾难”,我们可以采用任意多的特征来训练分类器。事实上,训练样本的数量是有限的,所以不应该采用过多的特征。此外,那些需要精确的非线性决策边界的分类器,比如neural network,knn,decision trees等的泛化能力往往并不是很好,更容易发生过拟合问题。因此,在设计这些分类器时应当慎重考虑特征的数量。相反,那些泛化能力较好的分类器,比如naive Bayesian,linear classifier等,可以适当增加特征的数量。 + +如果给定了N个特征,我们该如何从中选出M个最优的特征?最简单粗暴的方法是尝试所有特征的组合,从中挑出M个最优的特征。事实上,这是非常花时间的,或者说不可行的。其实,已经有许多特征选择算法(feature selection algorithms)来帮助我们确定特征的数量以及选择特征。此外,还有许多特征抽取方法(feature extraction methods),比如PCA等。交叉验证(cross-validation)也常常被用于检测与避免过拟合问题。 + +参考资料: +[1] Vincent Spruyt. The Curse of Dimensionality in classification. Computer vision for dummies. 2014. [Link] + +## 2.29怎样避免维数灾难 + +解决维度灾难问题: + +主成分分析法PCA,线性判别法LDA + +奇异值分解简化数据、拉普拉斯特征映射 + +Lassio缩减系数法、小波分析法、 + +## 2.30聚类和降维有什么区别与联系? + +聚类用于找寻数据内在的分布结构,既可以作为一个单独的过程,比如异常检测等等。也可作为分类等其他学习任务的前驱过程。聚类是标准的无监督学习。 + +1) 在一些推荐系统中需确定新用户的类型,但定义“用户类型”却可能不太容易,此时往往可先对原油的用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型,用于判别新用户的类型。 + +![](../img/ch2/2-18.jpg) + +2)而降维则是为了缓解维数灾难的一个重要方法,就是通过某种数学变换将原始高维属性空间转变为一个低维“子空间”。其基于的假设就是,虽然人们平时观测到的数据样本虽然是高维的,但是实际上真正与学习任务相关的是个低维度的分布。从而通过最主要的几个特征维度就可以实现对数据的描述,对于后续的分类很有帮助。比如对于Kaggle上的泰坦尼克号生还问题。通过给定一个人的许多特征如年龄、姓名、性别、票价等,来判断其是否能在海难中生还。这就需要首先进行特征筛选,从而能够找出主要的特征,让学习到的模型有更好的泛化性。 + +聚类和降维都可以作为分类等问题的预处理步骤。 + +![](../img/ch2/2-19.jpg) + +但是他们虽然都能实现对数据的约减。但是二者适用的对象不同,聚类针对的是数据点,而降维则是对于数据的特征。另外它们着很多种实现方法。聚类中常用的有K-means、层次聚类、基于密度的聚类等;降维中常用的则PCA、Isomap、LLE等。 + +## 2.31 GBDT和随机森林的区别 + +GBDT和随机森林的相同点: +1、都是由多棵树组成 +2、最终的结果都是由多棵树一起决定 + +GBDT和随机森林的不同点: +1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成 +2、组成随机森林的树可以并行生成;而GBDT只能是串行生成 +3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来 +4、随机森林对异常值不敏感,GBDT对异常值非常敏感 +5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成 +6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能 + +## 2.32 四种聚类方法之比较 + +http://www.cnblogs.com/William_Fire/archive/2013/02/09/2909499.html + + 聚类分析是一种重要的人类行为,早在孩提时代,一个人就通过不断改进下意识中的聚类模式来学会如何区分猫狗、动物植物。目前在许多领域都得到了广泛的研究和成功的应用,如用于模式识别、数据分析、图像处理、市场研究、客户分割、Web文档分类等[1]。 + +聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。 + +聚类技术[2]正在蓬勃发展,对此有贡献的研究领域包括数据挖掘、统计学、机器学习、空间数据库技术、生物学以及市场营销等。各种聚类方法也被不断提出和改进,而不同的方法适合于不同类型的数据,因此对各种聚类方法、聚类效果的比较成为值得研究的课题。 + +1 聚类算法的分类 + +目前,有大量的聚类算法[3]。而对于具体应用,聚类算法的选择取决于数据的类型、聚类的目的。如果聚类分析被用作描述或探查的工具,可以对同样的数据尝试多种算法,以发现数据可能揭示的结果。 +​ +主要的聚类算法可以划分为如下几类:划分方法、层次方法、基于密度的方法、基于网格的方法以及基于模型的方法[4-6]。 + +每一类中都存在着得到广泛应用的算法,例如:划分方法中的k-means[7]聚类算法、层次方法中的凝聚型层次聚类算法[8]、基于模型方法中的神经网络[9]聚类算法等。 +​ 目前,聚类问题的研究不仅仅局限于上述的硬聚类,即每一个数据只能被归为一类,模糊聚类[10]也是聚类分析中研究较为广泛的一个分支。模糊聚类通过隶 属函数来确定每个数据隶属于各个簇的程度,而不是将一个数据对象硬性地归类到某一簇中。目前已有很多关于模糊聚类的算法被提出,如著名的FCM算法等。 +​ 本文主要对k-means聚类算法、凝聚型层次聚类算法、神经网络聚类算法之SOM,以及模糊聚类的FCM算法通过通用测试数据集进行聚类效果的比较和分析。 + +2 四种常用聚类算法研究 + +2.1 k-means聚类算法 + + k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。 + k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地 选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。通常,采用平方误差准则,其定义如下: + +  $E=\sum_{i=1}^{k}\sum_{p\subset C}|p-m_{i}|^{2}$ + + 这里E是数据库中所有对象的平方误差的总和,p是空间中的点,mi是簇Ci的平均值[9]。该目标函数使生成的簇尽可能紧凑独立,使用的距离度量是欧几里得距离,当然也可以用其他距离度量。k-means聚类算法的算法流程如下: +​ 输入:包含n个对象的数据库和簇的数目k; +​ 输出:k个簇,使平方误差准则最小。 +​ 步骤: +  (1) 任意选择k个对象作为初始的簇中心; +  (2) repeat; +  (3) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇; +  (4) 更新簇的平均值,即计算每个簇中对象的平均值; +  (5) until不再发生变化。 + +2.2 层次聚类算法 +​ 根据层次分解的顺序是自底向上的还是自上向下的,层次聚类算法分为凝聚的层次聚类算法和分裂的层次聚类算法。 + 凝聚型层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。绝大多数层次聚类属于凝聚型层次聚类,它们只是在簇间相似度的定义上有所不同。四种广泛采用的簇间距离度量方法如下: + +![](../img/ch2/2-20.gif) + +这里给出采用最小距离的凝聚层次聚类算法流程: + + (1) 将每个对象看作一类,计算两两之间的最小距离; + (2) 将距离最小的两个类合并成一个新类; + (3) 重新计算新类与所有类之间的距离; + (4) 重复(2)、(3),直到所有类最后合并成一类。 + +## 2.3 SOM聚类算法 +SOM神经网络[11]是由芬兰神经网络专家Kohonen教授提出的,该算法假设在输入对象中存在一些拓扑结构或顺序,可以实现从输入空间(n维)到输出平面(2维)的降维映射,其映射具有拓扑特征保持性质,与实际的大脑处理有很强的理论联系。 + +SOM网络包含输入层和输出层。输入层对应一个高维的输入向量,输出层由一系列组织在2维网格上的有序节点构成,输入节点与输出节点通过权重向量连接。 学习过程中,找到与之距离最短的输出层单元,即获胜单元,对其更新。同时,将邻近区域的权值更新,使输出节点保持输入向量的拓扑特征。 + +算法流程: + +(1) 网络初始化,对输出层每个节点权重赋初值; +(2) 将输入样本中随机选取输入向量,找到与输入向量距离最小的权重向量; +(3) 定义获胜单元,在获胜单元的邻近区域调整权重使其向输入向量靠拢; +(4) 提供新样本、进行训练; +(5) 收缩邻域半径、减小学习率、重复,直到小于允许值,输出聚类结果。 + +## 2.4 FCM聚类算法 + +1965年美国加州大学柏克莱分校的扎德教授第一次提出了‘集合’的概念。经过十多年的发展,模糊集合理论渐渐被应用到各个实际应用方面。为克服非此即彼的分类缺点,出现了以模糊集合论为数学基础的聚类分析。用模糊数学的方法进行聚类分析,就是模糊聚类分析[12]。 + +FCM算法是一种以隶属度来确定每个数据点属于某个聚类程度的算法。该聚类算法是传统硬聚类算法的一种改进。 + +![](../img/ch2/2-21.gif) + +算法流程: + + (1) 标准化数据矩阵; + (2) 建立模糊相似矩阵,初始化隶属矩阵; + (3) 算法开始迭代,直到目标函数收敛到极小值; + (4) 根据迭代结果,由最后的隶属矩阵确定数据所属的类,显示最后的聚类结果。 + +3 四种聚类算法试验 + + +3.1 试验数据 + +实验中,选取专门用于测试分类、聚类算法的国际通用的UCI数据库中的IRIS[13]数据集,IRIS数据集包含150个样本数据,分别取自三种不同 的莺尾属植物setosa、versicolor和virginica的花朵样本,每个数据含有4个属性,即萼片长度、萼片宽度、花瓣长度,单位为cm。 在数据集上执行不同的聚类算法,可以得到不同精度的聚类结果。 + +3.2 试验结果说明 + +文中基于前面所述各算法原理及算法流程,用matlab进行编程运算,得到表1所示聚类结果。 + +![](../img/ch2/2-22.gif) + +如表1所示,对于四种聚类算法,按三方面进行比较: + +(1)聚错样本数:总的聚错的样本数,即各类中聚错的样本数的和; + +(2)运行时间:即聚类整个 过程所耗费的时间,单位为s; + +(3)平均准确度:设原数据集有k个类,用ci表示第i类,ni为ci中样本的个数,mi为聚类正确的个数,则mi/ni为 第i类中的精度,则平均精度为: + +$avg=\frac{1}{k}\sum_{i=1}^{k}\frac{m_{i}}{n_{i}}$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MarkDown/第五章_卷积神经网络(CNN).md b/MarkDown/第五章_卷积神经网络(CNN).md new file mode 100644 index 0000000..82709d5 --- /dev/null +++ b/MarkDown/第五章_卷积神经网络(CNN).md @@ -0,0 +1,807 @@ +# 第五章 卷积神经网络(CNN) + +标签(空格分隔): 深度学习 + +--- +## 5.1 卷积神经网络的组成层 +在卷积神经网络中,有3种最主要的层: +> * 卷积运算层 +> * 池化层 +> * 全连接层 + +一个完整的神经网络就是由这三种层叠加组成的。 + +**结构示例** + +拿CIFAR-10数据集举例,一个典型的该数据集上的卷积神经网络分类器应该有[INPUT - CONV - RELU - POOL - FC]的结构, + +> * INPUT[32*32*3]包含原始图片数据中的全部像素,长宽都是32,有RGB 3个颜色通道。 +> * CONV卷积层中,没个神经元会和上一层的若干小区域连接,计算权重和小区域像素的内积,举个例子可能产出的结果数据是[32*32*12]的。 +> * RELU层,就是神经元激励层,主要的计算就是max(0,x),结果数据依旧是[32*32*12]。 +> * POOLing层做的事情,可以理解成一个下采样,可能得到的结果维度就变为[16*16*12]了。 +> * 全连接层一般用于最后计算类别得分,得到的结果为[1*1*10]的,其中的10对应10个不同的类别。和名字一样,这一层的所有神经元会和上一层的所有神经元有连接。 + +这样,卷积神经网络作为一个中间的通道,就一步步把原始的图像数据转成最后的类别得分了。有一个点我们要提一下,刚才说到了有几种不同的神经网络层,其中有一些层是有待训练参数的,另外一些没有。详细一点说,卷积层和全连接层包含权重和偏移的;而RELU和POOLing层只是一个固定的函数运算,是不包含权重和偏移参数的。不过POOLing层包含了我们手动指定的超参数,这个我们之后会提到。 + +**总结一下**: +* (1)一个卷积神经网络由多种不同类型的层(卷几层/全连接层/RELU层/POOLing层等)叠加而成。 +* (2)每一层的输入结构是3维的数据,计算完输出依旧是3维的数据。 +* (3)卷积层和全连接层包含训练参数,RELU 和 POOLing 层不包含。 +* (4)卷积层,全连接层和 POOLing 层包含超参数,RELU 层没有。 + +下图为 CIFAR-10 数据集构建的一个卷积神经网络结构示意图: + +![](../img/ch5/img1.png) + +## 5.2 卷积如何检测边缘信息? + +卷积运算是卷积神经网络最基本的组成部分,神经网络的前几层首先检测边缘,然后,后面的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体。 +先介绍一个概念,过滤器: + +![image](../img/ch5/img2.png) + +这是一个3*3的过滤器,是一个矩阵,数值如上所示。 + +假设我们有一个6*6的灰度图像: + +![image](../img/ch5/img3.png) + +把这个图像与过滤器进行卷积运算,卷积运算在此处用“*”表示。 + +![image](../img/ch5/img4.png) + +我们看一下发生了什么事,把过滤器最准图像左上方3*3的范围,逐一相乘并相加,得到-5。 + +同理,将过滤器右移进行相同操作,再下移,直到过滤器对准图像右下角最后一格。依次运算得到一个4*4的矩阵。 + +OK,了解了过滤器以及卷积运算后,让我们看看为何过滤器能检测物体边缘: + +举一个最简单的例子: + +![image](../img/ch5/img5.png) + +这张图片如上所示,左半边全是白的,右半边全是灰的,过滤器还是用之前那个,把他们进行卷积: + +![image](../img/ch5/img6.png) + +可以看到,最终得到的结果中间是一段白色,两边为灰色,于是垂直边缘被找到了。为什么呢?因为在6*6图像中红框标出来的部分,也就是图像中的分界线所在部分,与过滤器进行卷积,结果是30。而在不是分界线的所有部分进行卷积,结果都为0. + +在这个图中,白色的分界线很粗,那是因为6*6的图像实在太小了,若是换成1000*1000的图像,我们会发现在最终结果中,分界线不粗且很明显。 + +这就是检测物体垂直边缘的例子,水平边缘的话只需将过滤器旋转90度。 + +## 5.3 卷积的几个基本定义? + +首先,我们需要就定义一个卷积层的几个参数达成一致。 + +### 5.3.1 卷积核大小 + +(Kernel Size): 卷积核的大小定义了卷积的视图范围。二维的常见选择大小是3,即3×3像素。 + +### 5.3.2 卷积核的步长 + +(Stride): Stride定义了内核的步长。虽然它的默认值通常为1,但我们可以将步长设置为2,然后对类似于MaxPooling的图像进行向下采样。 + +### 5.3.3 边缘填充 + +(Padding): Padding用于填充输入图像的边界。一个(半)填充的卷积将使空间输出维度与输入相等,而如果卷积核大于1,则未被填充的卷积将会使一些边界消失。 + +### 5.3.4 输入和输出通道 + + 一个卷积层接受一定数量的输入通道(I),并计算一个特定数量的输出通道(O),这一层所需的参数可以由I*O*K计算,K等于卷积核中值的数量。 + +## 5.4 卷积的网络类型分类? + +### 5.4.1 普通卷积 + +![image](../img/ch5/img7.png) + +### 5.4.2 扩张卷积 + +又名带洞的(atrous)卷积,扩张的卷积引入了另一个被称为扩张率(dilation rate)的卷积层。这定义了卷积核中值之间的间隔。一个3×3卷积核的扩张率为2,它的视图与5×5卷积核相同,而只使用9个参数。想象一下,取一个5×5卷积核,每两行或两列删除一行或一列。 + +这将以同样的计算代价提供更广阔的视角。扩张的卷积在实时分割领域特别受欢迎。如果需要广泛的视图,并且不能负担多个卷积或更大的卷积核,那么就使用它们。 +举例: + +![image](../img/ch5/img8.png) + +### 5.4.3 转置卷积 + +转置卷积也就是反卷积(deconvolution)。虽然有些人经常直接叫它反卷积,但严格意义上讲是不合适的,因为它不符合一个反卷积的概念。反卷积确实存在,但它们在深度学习领域并不常见。一个实际的反卷积会恢复卷积的过程。想象一下,将一个图像放入一个卷积层中。现在把输出传递到一个黑盒子里,然后你的原始图像会再次出来。这个黑盒子就完成了一个反卷积。这是一个卷积层的数学逆过程。 + +一个转置的卷积在某种程度上是相似的,因为它产生的相同的空间分辨率是一个假设的反卷积层。然而,在值上执行的实际数学操作是不同的。一个转置的卷积层执行一个常规的卷积,但是它会恢复它的空间变换(spatial transformation)。 + +在这一点上,你应该非常困惑,让我们来看一个具体的例子: +5×5的图像被馈送到一个卷积层。步长设置为2,无边界填充,而卷积核是3×3。结果得到了2×2的图像。 +如果我们想要逆转这个过程,我们需要反向的数学运算,以便从我们输入的每个像素中生成9个值。然后,我们将步长设置为2来遍历输出图像。这就是一个反卷积过程。 + +![image](../img/ch5/img9.png) + +一个转置的卷积并不会这样做。唯一的共同点是,它保证输出将是一个5×5的图像,同时仍然执行正常的卷积运算。为了实现这一点,我们需要在输入上执行一些奇特的填充。 + +正如你现在所能想象的,这一步不会逆转上面的过程。至少不考虑数值。 + +它仅仅是重新构造了之前的空间分辨率并进行了卷积运算。这可能不是数学上的逆过程,但是对于编码-解码器(Encoder-Decoder)架构来说,这仍然是非常有用的。这样我们就可以把图像的尺度上推(upscaling)和卷积结合起来,而不是做两个分离的过程。 + +如果我们想反转这个过程,我们需要反数学运算,以便从我们输入的每个像素中生成9个值。之后,我们以2步幅的设置来遍历输出图像。这将是一个反卷积。 + +![image](../img/ch5/img10.png) + +### 5.4.4 可分离卷积 + +在一个可分离卷积中,我们可以将内核操作拆分成多个步骤。我们用y = conv(x,k)表示卷积,其中y是输出图像,x是输入图像,k是内核。这一步很简单。接下来,我们假设k可以由下面这个等式计算得出:k = k1.dot(k2)。这将使它成为一个可分离的卷积,因为我们可以通过对k1和k2做2个一维卷积来取得相同的结果,而不是用k做二维卷积。 + +![image](../img/ch5/img11.png) + +我们以通常用于图像处理的Sobel内核为例。你可以通过乘以向量[1,0,-1]和[1,2,1] .T获得相同的内核。在执行相同的操作时,你只需要6个而不是9个参数。 + +上面的示例显示了所谓的空间可分离卷积,据我所知,这并不是在深度学习中使用的。我只是想确保在他人费劲地操作时,你不会受到如此困惑。在神经网络中,我们通常使用的是一种叫做深度可分离卷积的神经网络。 + +## 5.5 图解12种不同类型的2D卷积? + +http://www.sohu.com/a/159591827_390227 + +## 5.6 2D卷积与3D卷积有什么区别? + +### 5.6.1 2D卷积 + +2D卷积操作如图所示,为了解释的更清楚,分别展示了单通道和多通道的操作。且为了画图方便,假定只有1个filter,即输出图像只有一个chanel。 + +其中,针对单通道,输入图像的channel为1,卷积核尺寸为 (k_h, k_w, 1),卷积核在输入图像上的的空间维度(即(height,width)两维)上进行进行滑窗操作,每次滑窗和 (k_h, k_w) 窗口内的values进行卷积操作(现在都用相关操作取代),得到输出图像中的一个value。针对多通道,假定输入图像的channel为3,卷积核尺寸为 (k_h, k_w, 3), 卷积核在输入图像上的的空间维度(即(h, w)两维)上进行进行滑窗操作,每次滑窗与3个channels上的 (k_h, k_w) 窗口内的所有的values进行相关操作,得到输出图像中的一个value。 + +![image](../img/ch5/img12.png) + +### 5.6.2 3D卷积 + +3D卷积操作如图2所示,同样分为单通道和多通道,且只使用一个filter,输出一个channel。其中,针对单通道,与2D卷积不同之处在于,输入图像多了一个 length 维度,卷积核也多了一个k_l维度,因此卷积核在输入3D图像的空间维度(height和widthw维)和length维度上均进行滑窗操作,每次滑窗与 (k_h, k_w, k_l) 窗口内的values进行相关操作,得到输出3D图像中的一个value. + +针对多通道,则与2D卷积的操作一样,每次滑窗与3个channels上的 (k_h, k_w, k_l) 窗口内的所有values进行相关操作,得到输出3D图像中的一个value。 + +![image](../img/ch5/img13.png) + +## 5.7 有哪些池化方法? + +在卷积神经网络中,我们经常会碰到池化操作,而池化层往往在卷积层后面,通过池化来降低卷积层输出的特征向量,同时改善结果(不易出现过拟合)。 + +为什么可以通过降低维度呢? + +因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)来代表这个区域的特征。[1] + +### 5.7.1 一般池化(General Pooling) +池化作用于图像中不重合的区域(这与卷积操作不同),过程如下图。 + +![image](../img/ch5/img14.png) + +![image](../img/ch5/img15.png) + +我们定义池化窗口的大小为sizeX,即下图中红色正方形的边长,定义两个相邻池化窗口的水平位移/竖直位移为stride。一般池化由于每一池化窗口都是不重复的,所以sizeX=stride。 + +![image](../img/ch5/img16.png) + +最常见的池化操作为平均池化mean pooling和最大池化max pooling: +* 平均池化:计算图像区域的平均值作为该区域池化后的值。 +* 最大池化:选图像区域的最大值作为该区域池化后的值。 + +### 5.7.2 重叠池化(General Pooling) +重叠池化正如其名字所说的,相邻池化窗口之间会有重叠区域,此时sizeX>stride。论文中[2]中,作者使用了重叠池化,其他的设置都不变的情况下, top-1和top-5 的错误率分别减少了0.4% 和0.3%。 + +### 5.7.3 空金字塔池化(Spatial Pyramid Pooling) + +空间金字塔池化可以把任何尺度的图像的卷积特征转化成相同维度,这不仅可以让CNN处理任意尺度的图像,还能避免cropping和warping操作,导致一些信息的丢失,具有非常重要的意义。 + +一般的CNN都需要输入图像的大小是固定的,这是因为全连接层的输入需要固定输入维度,但在卷积操作是没有对图像尺度有限制,所有作者提出了空间金字塔池化,先让图像进行卷积操作,然后转化成维度相同的特征输入到全连接层,这个可以把CNN扩展到任意大小的图像。 + +![image](../img/ch5/img17.png) + +空间金字塔池化的思想来自于Spatial Pyramid Model,它一个pooling变成了多个scale的pooling。用不同大小池化窗口作用于卷积特征,我们可以得到1X1,2X2,4X4的池化结果,由于conv5中共有256个过滤器,所以得到1个256维的特征,4个256个特征,以及16个256维的特征,然后把这21个256维特征链接起来输入全连接层,通过这种方式把不同大小的图像转化成相同维度的特征。 + +![image](../img/ch5/img18.png) + +对于不同的图像要得到相同大小的pooling结果,就需要根据图像的大小动态的计算池化窗口的大小和步长。假设conv5输出的大小为a*a,需要得到n*n大小的池化结果,可以让窗口大小sizeX为[a/n],步长为[a/n]。下图以conv5输出的大小为13*13为例。 + +![image](../img/ch5/img19.png) + +疑问:如果conv5输出的大小为14*14,[pool1*1]的sizeX=stride=14,[pool2*2]的sizeX=stride=7,这些都没有问题,但是,[pool4*4]的sizeX=5,stride=4,最后一列和最后一行特征没有被池化操作计算在内。 + +SPP其实就是一种多个scale的pooling,可以获取图像中的多尺度信息;在CNN中加入SPP后,可以让CNN处理任意大小的输入,这让模型变得更加的flexible。 + +## 5.8 1x1卷积作用? + +1×1的卷积大概有两个方面的作用: +1. 实现跨通道的交互和信息整合。 +2. 进行卷积核通道数的降维和升维。 + +下面详细解释一下: +1. 1×1的卷积层(可能)引起人们的重视是在NIN的结构中,论文中林敏师兄的想法是利用MLP代替传统的线性卷积核,从而提高网络的表达能力。文中同时利用了跨通道pooling的角度解释,认为文中提出的MLP其实等价于在传统卷积核后面接cccp层,从而实现多个feature map的线性组合,实现跨通道的信息整合。而cccp层是等价于1×1卷积的,因此细看NIN的caffe实现,就是在每个传统卷积层后面接了两个cccp层(其实就是接了两个1×1的卷积层)。 + +2. 进行降维和升维引起人们重视的(可能)是在GoogLeNet里。对于每一个Inception模块(如下图),原始模块是左图,右图中是加入了1×1卷积进行降维的。虽然左图的卷积核都比较小,但是当输入和输出的通道数很大时,乘起来也会使得卷积核参数变的很大,而右图加入1×1卷积后可以降低输入的通道数,卷积核参数、运算复杂度也就跟着降下来了。以GoogLeNet的3a模块为例,输入的feature map是28×28×192,3a模块中1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32,如果是左图结构,那么卷积核参数为1×1×192×64+3×3×192×128+5×5×192×32,而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数就变成了1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32),参数大约减少到原来的三分之一。同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的,再加卷积层得到的feature map,会使输出的feature map扩大到416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了256。GoogLeNet利用1×1的卷积降维后,得到了更为紧凑的网络结构,虽然总共有22层,但是参数数量却只是8层的AlexNet的十二分之一(当然也有很大一部分原因是去掉了全连接层)。 + +![image](../img/ch5/img20.png) + +最近大热的MSRA的ResNet同样也利用了1×1卷积,并且是在3×3卷积层的前后都使用了,不仅进行了降维,还进行了升维,使得卷积层的输入和输出的通道数都减小,参数数量进一步减少,如下图的结构。(不然真不敢想象152层的网络要怎么跑起来TAT) + +![image](../img/ch5/img21.png) + +## 5.9 卷积层和池化层有什么区别? + +首先可以从结构上可以看出,卷积之后输出层的维度减小,深度变深。但池化层深度不变。同时池化可以把很多数据用最大值或者平均值代替。目的是降低数据量。降低训练的参数。对于输入层,当其中像素在邻域发生微小位移时,池化层的输出是不变的,从而能提升鲁棒性。而卷积则是把数据通过一个卷积核变化成特征,便于后面的分离。 + +1:卷积 + +当从一个大尺寸图像中随机选取一小块,比如说 8x8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8x8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8x8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。 + +下面给出一个具体的例子:假设你已经从一个 96x96 的图像中学习到了它的一个 8x8 的样本所具有的特征,假设这是由有 100 个隐含单元的自编码完成的。为了得到卷积特征,需要对 96x96 的图像的每个 8x8 的小块图像区域都进行卷积运算。也就是说,抽取 8x8 的小块区域,并且从起始坐标开始依次标记为(1,1),(1,2),...,一直到(89,89),然后对抽取的区域逐个运行训练过的稀疏自编码来得到特征的激活值。在这个例子里,显然可以得到 100 个集合,每个集合含有 89x89 个卷积特征。 + +![image](../img/ch5/img22.png) + +2:说下池化,其实池化很容易理解,先看图: + +转自: http://blog.csdn.net/silence1214/article/details/11809947 + +![image](../img/ch5/img23.png) + +比如上方左侧矩阵A是20*20的矩阵要进行大小为10*10的池化,那么左侧图中的红色就是10*10的大小,对应到右侧的矩阵,右侧每个元素的值,是左侧红色矩阵每个元素的值得和再处于红色矩阵的元素个数,也就是平均值形式的池化。 + +3:上面说了下卷积和池化,再说下计算中需要注意到的。在代码中使用的是彩色图,彩色图有3个通道,那么对于每一个通道来说要单独进行卷积和池化,有一个地方尤其是进行卷积的时候要注意到,隐藏层的每一个值是对应到一幅图的3个通道穿起来的,所以分3个通道进行卷积之后要加起来,正好才能对应到一个隐藏层的神经元上,也就是一个feature上去。 + +## 5.10 卷积核一定越大越好? + +AlexNet中用到了一些非常大的卷积核,比如11×11、5×5卷积核,之前人们的观念是,卷积核越大,receptive field(感受野)越大,看到的图片信息越多,因此获得的特征越好。虽说如此,但是大的卷积核会导致计算量的暴增,不利于模型深度的增加,计算性能也会降低。于是在VGG(最早使用)、Inception网络中,利用2个3×3卷积核的组合比1个5×5卷积核的效果更佳,同时参数量(3×3×2+1 VS 5×5×1+1) 被降低,因此后来3×3卷积核被广泛应用在各种模型中。多个小的卷积核叠加使用要远比一个大的卷积核单独使用效果要好的多,在连通性不变的情况下,大大降低了参数个数和计算复杂度。当然,卷积核也不是越小越好,对于特别稀疏的数据比如下图所示,当使用比较小的卷积核的时候可能无法表示其特征,如果采用较大的卷积核则会导致复杂度极大的增加。总而言之,我们应该选择多个相对小的卷积核来进行卷积。 + +## 5.11 每层卷积只能用一种尺寸的卷积核? + +传统的层叠式网络,基本上都是一个个卷积层的堆叠,每层只用一个尺寸的卷积核,例如VGG结构中使用了大量的3×3卷积层。事实上,同一层feature map可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一卷积核的要好,谷歌的GoogLeNet,或者说Inception系列的网络,就使用了多个卷积核的结构: + +![image](../img/ch5/img24.png) + +如上图所示,一个输入的feature map 分别同时经过1×1、3×3、5×5的卷积核的处理,得出的特征再组合起来,获得更佳的特征。 + +## 5.12 怎样才能减少卷积层参数量? + +发明GoogleNet的团队发现,如果仅仅引入多个尺寸的卷积核,会带来大量的额外的参数,受到Network In Network中1×1卷积核的启发,为了解决这个问题,他们往Inception结构中加入了一些1×1的卷积核,如图所示: + +![image](../img/ch5/img25.png) + +加入1×1卷积核的Inception结构 + +![image](../img/ch5/img26.png) + +根据上图,我们来做个对比计算,假设输入feature map的维度为256维,要求输出维度也是256维。有以下两种操作: +* (1)256维的输入直接经过一个3×3×256的卷积层,输出一个256维的feature map,那么参数量为:256×3×3×256 = 589,824 +* (2)256维的输入先经过一个1×1×64的卷积层,再经过一个3×3×64的卷积层,最后经过一个1×1×256的卷积层,输出256维,参数量为:256×1×1×64 + 64×3×3×64 + 64×1×1×256 = 69,632。足足把第一种操作的参数量降低到九分之一! + +1×1卷积核也被认为是影响深远的操作,往后大型的网络为了降低参数量都会应用上1×1卷积核。 + +## 5.13 卷积操作时必须同时考虑通道和区域吗? + +![image](../img/ch5/img27.png) + +标准的卷积过程可以看上图,一个2×2的卷积核在卷积时,对应图像区域中的所有通道均被同时考虑,问题在于,为什么一定要同时考虑图像区域和通道?我们为什么不能把通道和空间区域分开考虑? + +![image](../img/ch5/img28.png) + +Xception网络就是基于以上的问题发明而来。我们首先对每一个通道进行各自的卷积操作,有多少个通道就有多少个过滤器。得到新的通道feature maps之后,这时再对这批新的通道feature maps进行标准的1×1跨通道卷积操作。这种操作被称为 “DepthWise convolution” ,缩写“DW”。 + +这种操作是相当有效的,在imagenet 1000类分类任务中已经超过了InceptionV3的表现,而且也同时减少了大量的参数,我们来算一算,假设输入通道数为3,要求输出通道数为256,两种做法: + +1. 直接接一个3×3×256的卷积核,参数量为:3×3×3×256 = 6,912 +2. DW操作,分两步完成,参数量为:3×3×3 + 3×1×1×256 = 795,又把参数量降低到九分之一! + +因此,一个depthwise操作比标准的卷积操作降低不少的参数量,同时论文中指出这个模型得到了更好的分类效果。 + +## 5.14 采用宽卷积的好处有什么? + +### 5.14.1 窄卷积和宽卷积 + +对于窄卷积来说,是从第一个点开始做卷积,每次窗口滑动固定步幅。比如下图左部分为窄卷积。那么注意到越在边缘的位置被卷积的次数越少。于是有了宽卷积的方法,可以看作在卷积之前在边缘用0补充,常见有两种情况,一个是全补充,入下图右部分,这样输出大于输入的维度。另一种常用的方法是补充一部0值,使得输出和输入的维度一致。这里文中给了一个公式 。这里npadding在全补充里是filter-1,在输入输出相等时,就要主要奇偶性了,注意到卷积核常为奇数。 + +![image](../img/ch5/img29.png) + +### 5.14.2 为什么采用宽卷积? + + 通过将输入边角的值纳入到滑窗中心进行计算,以便损失更少的信息。 + +## 5.15 卷积层输出的深度与哪个部件的个数相同? + + 输出深度(通道)与卷积核(过滤器)的个数相等。 + +## 5.16 如何得到卷积层输出的深度? + +参数共享:在卷积层中使用参数共享是用来控制参数的数量。假设在第一个卷积层就有55x55x96=290,400个神经元,每个有11x11x3=364个参数和1个偏差。将这些合起来就是290400x364=105,705,600个参数。单单第一层就有这么多参数,显然这个数目是非常大的。 + +作一个合理的假设:如果一个特征在计算某个空间位置(x,y)的时候有用,那么它在计算另一个不同位置(x2,y2)的时候也有用。基于这个假设,可以显著地减少参数数量。换言之,就是将深度维度上一个单独的2维切片看做深度切片(depth slice),比如一个数据体尺寸为[55x55x96]的就有96个深度切片,每个尺寸为[55x55]。在每个深度切片上的神经元都使用同样的权重和偏差。在这样的参数共享下,例子中的第一个卷积层就只有96个不同的权重集了,一个权重集对应一个深度切片,共有96x11x11x3=34,848个不同的权重,或34,944个参数(+96个偏差)。 + +```w_conv1=weight_variable([5,5,1,32])``` + +可以看出,上面的32表示的是卷积层输出的深度,因为大家都明白width和height都可以通过公式计算得到,但是很多文献都没有告诉深度是如何得到的,下面是我的认识: + +1. 因为这个深度是没有公式可以计算出来的,因为深度是一个经验值,如上面代码的32 ,其实是一个经验值,是通过调整参数发现32是一个最合适的值,可以得到最好的准确率,但是不同的图像的深度是不一样的。 +2. 这个深度表示用了多少个卷积核,下面这个图可以说明一下: + +![image](../img/ch5/img30.png) + +上图就可以很有效的说明 :卷积层输出的深度==卷积核的个数。 + +## 5.17 激活函数通常放在卷积神经网络的那个操作之后? + + 通常放在卷积层之后。 + +## 5.18 如何理解最大池化层有几分缩小? + +池化层:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。 + +池化操作一般有两种,一种是Avy Pooling,一种是max Pooling。 + +![image](../img/ch5/img31.png) + +同样地采用一个2*2的filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。 + +>注1:(Avy pooling现在不怎么用了,方法是对每一个2*2的区域元素求和,再除以4,得到主要特征),而一般的filter取2*2,最大取3*3,stride取2,压缩为原来的1/4. +>注2:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补。 + +## 5.19 理解图像卷积与反卷积 + +### 5.19.1 图像卷积 + +首先给出一个输入输出结果 + +![image](../img/ch5/img32.png) + +那他是怎样计算的呢? + +卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下: + +![image](../img/ch5/img33.png) + +这样计算出左上角(即第一行第一列)像素的卷积后像素值。 + +给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。 + +![image](../img/ch5/img34.png) + +通过滑动卷积核,就可以得到整张图片的卷积结果 + +![image](../img/ch5/img35.png) + +### 5.19.2 图像反卷积 + +这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的,FCN作者称为backwards convolution,有人称Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我们可以知道,在CNN中有con layer与pool layer,con layer进行对图像卷积提取特征,pool layer 对图像缩小一半筛选重要特征,对于经典的图像识别CNN网络,如IMAGENET,最后输出结果是1X1X1000,1000是类别种类,1x1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1x1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。 + +这里图像的反卷积与full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。 + +![image](../img/ch5/img36.png) +![image](../img/ch5/img37.png) +![image](../img/ch5/img38.png) + +这里说另外一种反卷积做法,假设原图是3*3,首先使用上采样让图像变成7*7,可以看到图像多了很多空白的像素点。使用一个3*3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5*5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下: + +![image](../img/ch5/img39.png) + +经过上面的解释与推导,对卷积有基本的了解,但是在图像上的deconvolution究竟是怎么一回事,可能还是不能够很好的理解,因此这里再对这个过程解释一下。 目前使用得最多的deconvolution有2种,上文都已经介绍。 + +* 方法1:full卷积, 完整的卷积可以使得原来的定义域变大。 +* 方法2:记录pooling index,然后扩大空间,再用卷积填充。 + +图像的deconvolution过程如下: + +![image](../img/ch5/img40.png) + +输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7 + +即输入为2x2的图片经过4x4的卷积核进行步长为3的反卷积的过程 + +1. 输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图 +2. 将4个特征图进行步长为3的fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是在原来的位置(右上角),步长为3是指每隔3个像素进行fusion,重叠部分进行相加,即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。 + +可以看出翻卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小 得到 out = (in - 1) * s + k 上图过程就是, (2 - 1) * 3 + 4 = 7 + +## 5.20 不同卷积后图像大小计算? + +### 5.20.1 类型划分 + +2维卷积的计算分为了3类:1.full 2.same 3. valid + +1、**full** + +![image](../img/ch5/img41.png) + +蓝色为原图像,白色为对应卷积所增加的padding,通常全部为0,绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积,滑动步长为1,卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4,比原图2X2大了,我们还记1维卷积大小是n1+n2-1,这里原图是2X2,卷积核3X3,卷积后结果是4X4,与一维完全对应起来了。其实这才是完整的卷积计算,其他比它小的卷积结果都是省去了部分像素的卷积 + +2、**same** + +![image](../img/ch5/img42.png) + +3、**valid** + +![image](../img/ch5/img43.png) + +### 5.20.2 计算公式 + +这里,我们可以总结出full,same,valid三种卷积后图像大小的计算公式: + +1. full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1+N2-1 x N1+N2-1。 +2. same: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1xN1。 +3. valid:滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:(N1-N2)/S+1 x (N1-N2)/S+1。 + +## 5.21 步长、填充大小与输入输出关系总结? + +在设计深度学习网络的时候,需要计算输入尺寸和输出尺寸,那么就要设计卷积层的的各种参数。这里有一些设计时候的计算公式,方便得到各层的参数。 + +这里简化下,约定: + +![image](../img/ch5/img44.png) + +### 5.21.1 没有0填充,单位步长 + +![image](../img/ch5/img45.png) + +### 5.21.2 零填充,单位步长 + +![image](../img/ch5/img46.png) + +<1>半填充 +![image](../img/ch5/img47.png) + +<2>全填充 +![image](../img/ch5/img48.png) + +参考图如下图所示 + +![image](../img/ch5/img49.png) +![image](../img/ch5/img50.png) + +### 5.21.3 不填充,非单位步长 + +![image](../img/ch5/img51.png) + +### 5.21.4 零填充,非单位步长 + +![image](../img/ch5/img52.png) +![image](../img/ch5/img53.png) +![image](../img/ch5/img54.png) +![image](../img/ch5/img55.png) + +http://blog.csdn.net/u011692048/article/details/77572024 +https://arxiv.org/pdf/1603.07285.pdf + +## 5.22 理解反卷积和棋盘效应 + +### 5.22.1 为什么出现棋盘现象? + +图像生成网络的上采样部分通常用反卷积网络,不合理的卷积核大小和步长会使反卷积操作产生棋盘效应 (checkerboard artifacts)。 + +![image](../img/ch5/img56.png) +![image](../img/ch5/img57.png) + +重叠图案也在二维中形成。两个轴上的不均匀重叠相乘,产生不同亮度的棋盘状图案。 + +事实上,不均匀重叠往往在二维上更极端!因为两个模式相乘,所以它的不均匀性是原来的平方。例如,在一个维度中,一个步长为2,大小为3的反卷积的输出是其输入的两倍,但在二维中,输出是输入的4倍。 + +现在,生成图像时,神经网络通常使用多层反卷积,从一系列较低分辨率的描述中迭代建立更大的图像。虽然这些堆栈的反卷积可以消除棋盘效应,但它们经常混合,在更多尺度上产生棋盘效应。 + +直观地看,假设生成的图像中包含1只黑猫。黑猫身体部分的像素颜色应平滑过渡,或极端地说,该部分应全为黑色。实际生成的图像中该部分却有深深浅浅的近黑方块组成,很像棋盘的网格,即棋盘效应。 + +https://distill.pub/2016/deconv-checkerboard/ +http://blog.csdn.net/shadow_guo/article/details/52862161 + +### 5.22.2 有哪些方法可以避免棋盘效应? + +(1)第一种方法是用到的反卷积核的大小可被步长整除,从而避免重叠效应。与最近成功用于图像超分辨率的技术“子像素卷积”(sub-pixel convolution)等价。 + +![image](../img/ch5/img58.png) + +(2)另一种方法是从卷积操作中分离出对卷积后更高分辨率的特征图上采样来计算特征。例如,可以先缩放图像(最近邻插值或双线性插值),再卷积。 + +![image](../img/ch5/img59.png) + +反卷积与不同缩放卷积方法都是线性操作,并可用矩阵去解释。对于每个输出窗口,反卷积操作的输入唯一,缩放卷积会以阻碍高频棋盘效应的方式来隐式地集中权重(weight-tying)。 + +#### 缩放卷积 + +缩放卷积为线性操作:假设原图像为A,经过插值后的图像为A+B;用卷积核C对插值缩放后的图像卷积,得到最终的图像 ,其中*为卷积操作。则可将缩放卷积分解为原图像卷积和插值增量图像卷积,或卷积的原图像和卷积的插值增量图像。 + +C为卷积操作的卷积核。此时为上采样,理解为反卷积操作中的卷积核。 + +(1)最近邻缩放卷积 + +![image](../img/ch5/img60.png) + +发现,插值增量图像表示的矩阵为原图像表示的矩阵下移1行。可将原图像矩阵看成环形队列(队列最后1行的输出送入队列的第1行)。 + +(2)双线性缩放卷积 + +![image](../img/ch5/img61.png) + +发现,插值增量图像可细分为原图像表示的矩阵下移1行后乘以1/2与原图像表示的矩阵上移1行后乘以1/2。 + +## 5.23 CNN主要的计算瓶颈 + +CNN的训练主要是在卷积层和子采样层的交互上,其主要的计算瓶颈是: +* 1)前向传播过程:下采样每个卷积层的maps; +* 2)反向传播过程:上采样高层子采样层的灵敏度map,以匹配底层的卷积层输出maps的大小; +* 3)sigmoid的运用和求导。 + +举例: + +对于第一和第二个问题,我们考虑的是如何用Matlab内置的图像处理函数去实现上采样和下采样的操作。对于上采样,imresize函数可以搞定,但需要很大的开销。一个比较快速的版本是使用Kronecker乘积函数kron。通过一个全一矩阵ones来和我们需要上采样的矩阵进行Kronecker乘积,就可以实现上采样的效果。对于前向传播过程中的下采样,imresize并没有提供在缩小图像的过程中还计算nxn块内像素的和的功能,所以没法用。一个比较好和快速的方法是用一个全一的卷积核来卷积图像,然后简单的通过标准的索引方法来采样最后卷积结果。例如,如果下采样的域是2x2的,那么我们可以用2x2的元素全是1的卷积核来卷积图像。然后再卷积后的图像中,我们每个2个点采集一次数据,y=x(1:2:end,1:2:end),这样就可以得到了两倍下采样,同时执行求和的效果。 + +对于第三个问题,实际上有些人以为Matlab中对sigmoid函数进行inline的定义会更快,其实不然,Matlab与C/C++等等语言不一样,Matlab的inline反而比普通的函数定义更非时间。所以,我们可以直接在代码中使用计算sigmoid函数及其导数的真实代码。 + +## 5.24 CNN的参数经验设置 + +对于卷积神经网络的参数设置,没有很明确的方法,这只是众多学者的一些经验。 + +1、learning-rate 学习速率:学习速率越小,模型收敛花费的时间就越长,但是可以提高模型精确度。一般初始设置为0.1,然后每次除以0.2或者0.5来改进,得到最终值; + +2、batch-size 样本批次容量:影响模型的优化程度和收敛速度,需要参考你的数据集大小来设置,具体问题具体分析; + +3、weight-decay 权重衰减:用来在反向传播中更新权重和偏置,一般设置为0.005; + +4、epoch-number 训练次数:包括所有训练样本的一个正向传递和一个反向传递,训练至模型收敛即可;(注:和迭代周期iteration不一样) + +而且,也不是说训练的次数越多,测试精度就会越高,可能会因为预训练的模型太复杂,而我的数据集样本数量太少,种类太单一,而出现过拟合。 + +## 5.25 提高泛化能力的方法总结 + +http://blog.csdn.net/u010900574/article/details/51992156 + +### 5.25.1 主要方法 + +一般来说,提高泛化能力的方法主要有以下几个: +> * 正则化 +> * 增加神经网络层数 +> * 使用正确的代价函数 +> * 使用好的权重初始化技术 +> * 人为拓展训练集 +> * 弃权技术 + +### 5.25.2 主要方法 + +下面我们通过实验结果给这些参数优化理论一个直观的结果 + +(1)普通的全连接神经网络的效果 + +我们使用一个隐藏层,包含100个隐藏神经元,输入层是784,输出层是one-hot编码的形式,最后一层是Softmax层。训练过程采用对数似然代价函数,60次迭代,学习速率η=0.1,随机梯度下降的小批量数据大小为10,没有正则化。在测试集上得到的结果是97.8%,代码如下: + +```python +>>> import network3 +>>> from network3 import Network +>>> from network3 import ConvPoolLayer, FullyConnectedLayer, SoftmaxLayer +>>> training_data, validation_data, test_data = network3.load_data_shared() +>>> mini_batch_size = 10 +>>> net = Network([FullyConnectedLayer(n_in=784, n_out=100), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) +``` + +(2)使用卷积神经网络 — 仅一个卷积层 + +输入层是卷积层,5*5的局部感受野,也就是一个5*5的卷积核,一共20个特征映射。最大池化层选用2*2的大小。后面是100个隐藏神经元的全连接层。结构如图所示 + +![image](../img/ch5/img62.png) + +在这个架构中,我们把卷积层和chihua层看做是学习输入训练图像中的局部感受野,而后的全连接层则是一个更抽象层次的学习,从整个图像整合全局信息。也是60次迭代,批量数据大小是10,学习率是0.1.代码如下。 + +```python +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2)), + FullyConnectedLayer(n_in=20*12*12, n_out=100), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(training_data, 60, mini_batch_size, 0.1, + validation_data, test_data) +``` + +经过三次运行取平均后,准确率是98.78%,这是相当大的改善。错误率降低了1/3,。卷积神经网络开始显现威力。 + +(3)使用卷积神经网络 — 两个卷积层 + +我们接着插入第二个卷积-混合层,把它插入在之前的卷积-混合层和全连接层之间,同样的5*5的局部感受野,2*2的池化层。 + +```python +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2)), + ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), + filter_shape=(40, 20, 5, 5), + poolsize=(2, 2)), + FullyConnectedLayer(n_in=40*4*4, n_out=100), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(training_data, 60, mini_batch_size, 0.1, validation_data, test_data) +``` + +这一次,我们拥有了99.06%的准确率。 + +(4)使用卷积神经网络 — 两个卷积层+线性修正单元(ReLU)+正则化 + +上面我们使用的Sigmod激活函数,现在我们换成线性修正激活函数ReLU ,f(z)=max(0,z)f(z)=max(0,z),我们选择60个迭代期,学习速率η=0.03,η=0.03, ,使用L2正则化,正则化参数λ=0.1λ=0.1,代码如下: + +```python +>>> from network3 import ReLU +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), + filter_shape=(40, 20, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(training_data, 60, mini_batch_size, 0.03, + validation_data, test_data, lmbda=0.1) +``` + +这一次,我们获得了99.23%的准确率,超过了S型激活函数的99.06%. ReLU的优势是max(0,z)max(0,z)中z取最大极限时不会饱和,不像是S函数,这有助于持续学习。 + +(5)使用卷积神经网络,即两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集 + +拓展训练集数据的一个简单方法是将每个训练图像由一个像素来代替,无论是上一个像素,下一个像素,或者左右的像素。其他的方法也有改变亮度,改变分辨率,图片旋转,扭曲,位移等。我们把50,000幅图像人为拓展到250,000幅图像。使用第4节一样的网络,因为我们是在训练5倍的数据,所以减少了过拟合的风险。 + +```python +>>> expanded_training_data, _, _ = network3.load_data_shared( + "../data/mnist_expanded.pkl.gz") +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), + filter_shape=(40, 20, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, + validation_data, test_data, lmbda=0.1) +``` + +这次的到了99.37的训练正确率。 + +(6)使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层 +继续上面的网络,我们拓展全连接层的规模,300个隐藏神经元和1000个神经元的额精度分别是99.46%和99.43%. 我们插入一个额外的全连接层 + +```python +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), + filter_shape=(40, 20, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + FullyConnectedLayer(n_in=40*4*4, n_out=100, activation_fn=ReLU), + FullyConnectedLayer(n_in=100, n_out=100, activation_fn=ReLU), + SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size) +>>> net.SGD(expanded_training_data, 60, mini_batch_size, 0.03, + validation_data, test_data, lmbda=0.1) +``` + +这次取得了99.43%的精度。拓展后的网络并没有帮助太多。 + +(7)使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+拓展数据集+继续插入额外的全连接层+弃权技术 + +弃权的基本思想就是在训练网络时随机的移除单独的激活值,使得模型对单独的依据丢失更为强劲,因此不太依赖于训练数据的特质。我们尝试应用弃权技术到最终的全连接层(不是在卷基层)。这里,减少了迭代期的数量为40个,全连接层使用1000个隐藏神经元,因为弃权技术会丢弃一些神经元。Dropout是一种非常有效有提高泛化能力,降低过拟合的方法! + +```python +>>> net = Network([ + ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28), + filter_shape=(20, 1, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + ConvPoolLayer(image_shape=(mini_batch_size, 20, 12, 12), + filter_shape=(40, 20, 5, 5), + poolsize=(2, 2), + activation_fn=ReLU), + FullyConnectedLayer( + n_in=40*4*4, n_out=1000, activation_fn=ReLU, p_dropout=0.5), + FullyConnectedLayer( + n_in=1000, n_out=1000, activation_fn=ReLU, p_dropout=0.5), + SoftmaxLayer(n_in=1000, n_out=10, p_dropout=0.5)], + mini_batch_size) +>>> net.SGD(expanded_training_data, 40, mini_batch_size, 0.03, + validation_data, test_data) +``` + +使用弃权技术,的到了99.60%的准确率。 + +(8)使用卷积神经网络 — 两个卷基层+线性修正单元(ReLU)+正则化+拓展数据集+继续插入额外的全连接层+弃权技术+组合网络 + +组合网络类似于随机森林或者adaboost的集成方法,创建几个神经网络,让他们投票来决定最好的分类。我们训练了5个不同的神经网络,每个都大到了99.60%的准去率,用这5个网络来进行投票表决一个图像的分类。 + +采用这个方法,达到了99.67%的准确率。 + +## 5.26 CNN在CV与NLP领域运用的联系与区别? + +### 5.26.1 联系 + +自然语言处理是对一维信号(词序列)做操作。 +计算机视觉是对二维(图像)或三维(视频流)信号做操作。 + +### 5.26.2 区别 + +自然语言处理的输入数据通常是离散取值(例如表示一个单词或字母通常表示为词典中的one hot向量),计算机视觉则是连续取值(比如归一化到0,1之间的灰度值)。CNN有两个主要特点,区域不变性(location invariance)和组合性(Compositionality)。 + +1. 区域不变性:滤波器在每层的输入向量(图像)上滑动,检测的是局部信息,然后通过pooling取最大值或均值。pooling这步综合了局部特征,失去了每个特征的位置信息。这很适合基于图像的任务,比如要判断一幅图里有没有猫这种生物,你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里,词语在句子或是段落里出现的位置,顺序,都是很重要的信息。 +2. 局部组合性:CNN中,每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。这在CV里很好理解,像素组合成边缘,边缘生成形状,最后把各种形状组合起来得到复杂的物体表达。在语言里,当然也有类似的组合关系,但是远不如图像来的直接。而且在图像里,相邻像素必须是相关的,相邻的词语却未必相关。 + +## 5.27 CNN凸显共性的手段? + +### 5.27.1 局部连接 + +感受视野:每个神经元仅与输入神经元的一块区域连接,这块局部区域称作感受野(receptive field)。 +在图像卷积操作中,即神经元在空间维度是局部连接,但在深度上是全部连接。对于二维图像本身而言,也是局部像素关联较强。这种局部连接保证了学习后的过滤器能够对于局部的输入特征有最强的响应。局部连接的思想,也是受启发于生物学里面的视觉系统结构,视觉皮层的神经元就是局部接受信息的。 + +局部连接使网络可以提取数据的局部特征; + +下图是一个很经典的图示,左边是全连接,右边是局部连接。 + +![image](../img/ch5/img63.png) + +对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 × 10^6 = 10^12个权值参数,如此数目巨大的参数几乎难以训练;而采用局部连接,隐藏层的每个神经元仅与图像中10 × 10的局部图像相连接,那么此时的权值参数数量为10 × 10 × 10^6 = 10^8,将直接减少4个数量级。 + +### 5.27.2 权值共享 + +权重共享:计算同一个深度切片的神经元时采用的滤波器是共享的。例如图4中计算o[:,:,0]的每个每个神经元的滤波器均相同,都为W0,这样可以很大程度上减少参数。共享权重在一定程度上讲是有意义的,例如图片的底层边缘特征与特征在图中的具体位置无关。但是在一些场景中是无意的,比如输入的图片是人脸,眼睛和头发位于不同的位置,希望在不同的位置学到不同的特征 (参考斯坦福大学公开课)。请注意权重只是对于同一深度切片的神经元是共享的,在卷积层,通常采用多组卷积核提取不同特征,即对应不同深度切片的特征,不同深度切片的神经元权重是不共享。另外,偏重对同一深度切片的所有神经元都是共享的。 + +权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积 + +尽管减少了几个数量级,但参数数量依然较多。能不能再进一步减少呢?能!方法就是权值共享。具体做法是,在局部连接中隐藏层的每一个神经元连接的是一个10 × 10的局部图像,因此有10 × 10个权值参数,将这10 × 10个权值参数共享给剩下的神经元,也就是说隐藏层中10^6个神经元的权值参数相同,那么此时不管隐藏层神经元的数目是多少,需要训练的参数就是这 10 × 10个权值参数(也就是卷积核(也称滤波器)的大小),如下图。 + +![image](../img/ch5/img64.png) + +这大概就是CNN的一个神奇之处,尽管只有这么少的参数,依旧有出色的性能。但是,这样仅提取了图像的一种特征,如果要多提取出一些特征,可以增加多个卷积核,不同的卷积核能够得到图像的不同映射下的特征,称之为Feature Map。如果有100个卷积核,最终的权值参数也仅为100 × 100 = 10^4个而已。另外,偏置参数也是共享的,同一种滤波器共享一个。 + +### 5.27.3 池化操作 + +池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图: + +![image](../img/ch5/img65.png) + +### 5.28 全卷积与Local-Conv的异同点 + +如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。 + +### 5.29 举例理解Local-Conv的作用 + +这个问题主要针对:为什么很多做人脸的Paper会最后加入一个Local Connected Conv?总体上说,这一步的作用就是使用3D模型来将人脸对齐,从而使CNN发挥最大的效果。 + +![image](../img/ch5/img66.png) + +经过3D对齐以后,形成的图像都是152×152的图像,输入到上述网络结构中,该结构的参数如下: + +* Conv:32个11×11×3的卷积核max-pooling: 3×3, stride=2Conv: 16个9×9的卷积核。 +* Local-Conv: 16个9×9的卷积核,Local的意思是卷积核的参数不共享。 +* Local-Conv: 16个7×7的卷积核,参数不共享Local-Conv: 16个5×5的卷积核,参数不共享 +* Fully-connected: 4096维Softmax: 4030维。 + +前三层的目的在于提取低层次的特征,比如简单的边和纹理。其中Max-pooling层使得卷积的输出对微小的偏移情况更加鲁棒。但没有用太多的Max-pooling层,因为太多的Max-pooling层会使得网络损失图像信息。 + +后面三层都是使用参数不共享的卷积核,之所以使用参数不共享,有如下原因: + +(1)对齐的人脸图片中,不同的区域会有不同的统计特征,卷积的局部稳定性假设并不存在,所以使用相同的卷积核会导致信息的丢失 +(2)不共享的卷积核并不增加抽取特征时的计算量,而会增加训练时的计算量 +(3)使用不共享的卷积核,需要训练的参数量大大增加,因而需要很大的数据量,然而这个条件本文刚好满足。 + +全连接层将上一层的每个单元和本层的所有单元相连,用来捕捉人脸图像不同位置的特征之间的相关性。其中,第7层(4096-d)被用来表示人脸。 + +全连接层的输出可以用于Softmax的输入,Softmax层用于分类。 + +## 5.30 简述卷积神经网络进化史 + +主要讨论CNN的发展,并且引用刘昕博士的思路,对CNN的发展作一个更加详细的介绍,将按下图的CNN发展史进行描述 + +![image](../img/ch5/img67) + + 1. 列表项 +http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650324619&idx=1&sn=ca1aed9e42d8f020d0971e62148e13be&scene=1&srcid=0503De6zpYN01gagUvn0Ht8D#wechat_redirect +CNN的演化路径可以总结为以下几个方向: +> * 进化之路一:网络结构加深 +> * 进化之路二:加强卷积功能 +> * 进化之路三:从分类到检测 +> * 进化之路四:新增功能模块 + diff --git a/MarkDown/第八章 目标检测.md b/MarkDown/第八章 目标检测.md new file mode 100644 index 0000000..6e49faf --- /dev/null +++ b/MarkDown/第八章 目标检测.md @@ -0,0 +1,497 @@ +# 第八章 目标检测 + +**目标检测负责人:** + +- 稿定科技计算机视觉工程师-刘鹏 +- 哈工大博士袁笛 +- 上海大学硕士陈方杰:1609951733@qq.com + +**TODO** + +- [ ] 配图路径待修改 + +**目录** + +8.1 基于候选区域的目标检测器 + +8.1.1 滑动窗口检测器 + +8.1.2 选择性搜索 + +8.1.3 R-CNN系列 + +8.1.3.1 R-CNN + +8.1.3.2 Fast R-CNN + +8.1.3.3 Faster R-CNN + +8.1.3.4 R-CNN方法的性能 + +8.2 基于区域的全卷积神经网络(R-FCN) + +8.3 单次目标检测器 + +8.3.1 SSD系列 + +8.3.1.1 SSD + +8.3.1.2 DSSD + +8.3.1.3 FSSD + +8.3.2 YOLO系列 + +8.3.2.1 YOLOv1 + +8.3.2.2 YOLOv2 + +8.3.2.3 YOLO9000 + +8.3.2.4 YOLOv3 + +8.3.3 RetinaNet + + + +## 8.1 基于候选区域的目标检测器 + +### 8.1.1 滑动窗口检测器 + + 自从AlexNet获得ILSVRC 2012挑战赛的冠军之后,采用卷积神经网络(Convolutional Neural Network, CNN)进行分类任务就逐渐成为了主流研究方向。最常见的一种采用暴力方法进行目标检测的思路是在图片上从左向右、从上至下通过滑动窗口,利用分类思想进行目标识别。为了能够在不同的观察距离检测不同的目标类型,通常使用不同大小和宽高比的滑动窗口。 + +
+ + 图8.1.1 滑动窗口示意图(从右向左,从上至下) + + 采用滑动窗口从图像中剪切相应的图像块。由于很多分类器只能采用固定大小的图像块,因此这些图像块大多是原始图像块经过变形转换得到的。尽管如此,这样的操作并不影响分类的准确率,因为分类器可以处理变形后的图像块。 + +
+ + 图8.1.2 将图像转换成固定尺寸的图像 + + 经过变形后的图像块被输入到CNN分类器中,用来提取出4096维特征。之后,使用SVM分类器识别该图像的类别,并且采用线性回归输出该图像的边界框。 + +
+ + 图8.1.3 滑动窗口检测器的系统工作流程图 + +### 8.1.2 选择性搜索 + + 除了暴力检测方法之外,选择性搜索也是一种常见的目标检测方法。采用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。在选择性搜索(selective search,SS)中,假设现在图像上有n个预分割的区域,表示为R={R1, R2, ..., Rn},计算每个region与它相邻region(注意是相邻的区域)的相似度,这样会得到一个n*n的相似度矩阵(同一个区域之间和一个区域与不相邻区域之间的相似度可设为NaN),从矩阵中找出最大相似度值对应的两个区域,将这两个区域合二为一,这时候图像上还剩下n-1个区域;重复上面的过程(只需要计算新的区域与它相邻区域的新相似度,其他的不用重复计算),重复一次,区域的总数目就少1,知道最后所有的区域都合并称为了同一个区域(即此过程进行了n-1次,区域总数目最后变成了1).算法的流程图如下图所示: +
+ + 下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的ROI。 +
+ + 图8.1.4 选择性搜索 +### 8.1.3 R-CNN系列 + +#### 8.1.3.1 R-CNN + + 从2014年CNN就成为用于目标检测的极热门的工具,CNN可以很好地帮我们完成图像识别的任务,我们只需要添加一些额外的功能来完成目标的定位任务即可。使用一个高容量的卷积神经网络将region proposals自底而上的传播,用来定位目标是很好的选择,如果有标签的训练数据比较少,可以使用训练好的参数作为辅助,进行fine-tuning,能够得到非常好的定位效果提升。R-CNN利用候选区域方法创建了约2000个ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中。该网络结构后面会跟有几个全连接层,以实现目标分类并提炼出目标的边界框。 +
+ + 图8.1.5 使用候选区域、CNN、仿射层来定位目标 + 使用RCNN进行目标检测,主要分三个部分:(1)产生不依赖与特定类别的region proposals,这些region proposals定义了一个整个检测器可以获得的候选目标;(2)一个大的卷积神经网络,对每个region产生一个固定长度的特征向量;(3)一系列特定类别的线性SVM分类器。以下是R-CNN整个系统的流程图: +
+ + 图8.1.6 采用R-CNN进行目标检测的流程图 + 通过使用更少且更高质量的ROI,采用R-CNN能够比采用滑动窗口方法更快速、更准确地进行目标检测。 + +##### 边界框回归器 + + 采用候选区域方法进行目标检测具有非常高的计算复杂度。为了加速这个过程,通常会使用计算量较少的候选区域选择方法构建ROI,并在后面使用线性回归器(使用全连接层)进一步提炼边界框。 +
+ + 图8.1.7 使用回归方法将蓝色的原始边界框提炼为红色 + +#### 8.1.3.2 Fast R-CNN + + R-CNN需要非常多的候选区域以提升目标检测的准确度,但其实有很多区域是彼此重叠的,因此使得R-CNN的训练和推断速度非常慢。如果我们有2000个候选区域,且每个候选区域都需要独立地馈送到CNN中,那么对于不同的ROI,我们需要重复提取2000次特征。此外,CNN中的特征图以一种密集的方式表征空间特征,是否能直接使用特征图代替原图来检测目标。 +
+ + 图8.1.8 图像特征图 +
+ + 图8.1.9 直接利用特征图计算ROI + Fast R-CNN使用特征提取器(CNN)提取整个图像的特征,而不是从头开始对每个图像块提取多次。可以将创建候选区域的方法直接应用到提取到的特征图上。例如,Fast R-CNN选择VGG16中的卷积层Conv5来生成ROI,这些关注区域随后会结合对应的特征图以裁剪为特征图块,并用于目标检测任务中。我们使用ROI池化将特征图块转换为固定的大小,并馈送到全连接层进行分类和定位。因为Fast-RCNN不会重复提取特征,因此它能显著地减少处理时间。 +
+ + 图8.1.10 + 将候选区域直接应用于特征图,并使用ROI池化将其转化为固定大小的特征图块。以下是Fast R-CNN的流程图: +
+ + 图8.1.11 Fast R-CNN流程图 + Fast R-CNN最重要的一点就是包含特征提取器、分类器和边界框回归器在内的整个网络能通过多任务损失函数进行端到端的训练,这种多任务损失即结合了分类损失和定位损失的方法,大大提升了模型准确度。 + +##### ROI池化 + + 因为Fast R-CNN使用全连接层,所以应用ROI池化将不同大小的ROI转换为固定大小。为简洁起见,我们先将8×8特征图转换为预定义的2×2大小。下图左上角:特征图。右上角:将ROI(蓝色区域)与特征图重叠。左下角:将ROI拆分为目标维度。例如,对于2×2目标,我们将ROI分割为4个大小相似或相等的部分。右下角:找到每个部分的最大值,得到变换后的特征图。 +
+ + 图7.1.12 ROI池化 + 输入特征图(左上),输出特征图(右下),ROI(右上,蓝色框)。按上述步骤得到一个2×2的特征图块,可以馈送至分类器和边界框的回归器中。 + +#### 8.1.3.3 Faster R-CNN + + Fast R-CNN依赖于外部候选区域方法,如选择性搜索。但这些算法在CPU上运行且速度很慢。在测试中,Fast R-CNN需要2.3秒来进行预测,其中2秒用于生成2000个ROI。Faster R-CNN采用与Fast R-CNN相同的设计,只是它用内部深层网络代替了候选区域方法。新的候选区域网络(RPN)在生成ROI时效率更高,并且以每幅图像10毫秒的速度运行。 +
+ + 图8.1.13 Faster R-CNN的流程图 + Faster R-CNN的流程图与Fast R-CNN相同,采用外部候选区域方法代替了内部深层网络。 +
+ + 图8.1.14 + +##### 候选区域网络 + + 候选区域网络(RPN)将第一个卷积网络的输出特征图作为输入。它在特征图上滑动一个3×3的卷积核,以使用卷积网络(如下所示的ZF网络)构建与类别无关的候选区域。其他深度网络(如VGG或ResNet)可用于更全面的特征提取,但这需要以速度为代价。ZF网络最后会输出256个值,它们将馈送到两个独立的全连接层,以预测边界框和两个objectness分数,这两个objectness分数度量了边界框是否包含目标。我们其实可以使用回归器计算单个objectness分数,但为简洁起见,Faster R-CNN使用只有两个类别的分类器:即带有目标的类别和不带有目标的类别。 +
+ + 图8.1.15 + 对于特征图中的每一个位置,RPN会做k次预测。因此,RPN将输出4×k个坐标和每个位置上2×k个得分。下图展示了8×8的特征图,且有一个3×3的卷积核执行运算,它最后输出8×8×3个ROI(其中k=3)。下图(右)展示了单个位置的3个候选区域。 +
+ + 图8.1.16 + 假设最好涵盖不同的形状和大小。因此,Faster R-CNN不会创建随机边界框。相反,它会预测一些与左上角名为锚点的参考框相关的偏移量(如x, y)。我们限制这些偏移量的值,因此我们的猜想仍然类似于锚点。 +
+ + 图8.1.17 + 要对每个位置进行k个预测,我们需要以每个位置为中心的k个锚点。每个预测与特定锚点相关联,但不同位置共享相同形状的锚点。 +
+ + 图8.1.18 + 这些锚点是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的现实目标。这使得我们可以用更好的猜想来指导初始训练,并允许每个预测专门用于特定的形状。该策略使早期训练更加稳定和简便。 +
+ + 图8.1.19 + Faster R-CNN使用更多的锚点。它部署9个锚点框:3个不同宽高比的3个不同大小的锚点框。每一个位置使用9个锚点,每个位置会生成2×9个objectness分数和4×9个坐标。 + +#### 8.1.3.4 R-CNN方法的性能 + + 如下图所示,Faster R-CNN的速度要快得多。 +
+ + 图8.1.20性能对比 + + + + 表8.1.1 性能对比 + +## 8.2 基于区域的全卷积神经网络(R-FCN) + + 假设我们只有一个特征图用来检测右眼。那么我们可以使用它定位人脸吗?应该可以。因为右眼应该在人脸图像的左上角,所以我们可以利用这一点定位整个人脸。如果我们还有其他用来检测左眼、鼻子或嘴巴的特征图,那么我们可以将检测结果结合起来,更好地定位人脸。现在我们回顾一下所有问题。在Faster R-CNN中,检测器使用了多个全连接层进行预测。如果有2000个ROI,那么成本非常高。R-FCN通过减少每个ROI所需的工作量实现加速。上面基于区域的特征图与ROI是独立的,可以在每个ROI之外单独计算。剩下的工作就比较简单了,因此R-FCN的速度比Faster R-CNN快。 +
+ + 图8.2.1 人脸检测 + 现在我们来看一下5×5的特征图M,内部包含一个蓝色方块。我们将方块平均分成3×3个区域。现在,我们在M中创建了一个新的特征图,来检测方块的左上角(TL)。这个新的特征图如下图(右)所示。只有黄色的网格单元[2,2]处于激活状态。在左侧创建一个新的特征图,用于检测目标的左上角。 +
+ + 图8.2.2 检测示例 + 我们将方块分成9个部分,由此创建了9个特征图,每个用来检测对应的目标区域。这些特征图叫做位置敏感得分图(position-sensitive score map),因为每个图检测目标的子区域(计算其得分)。 +
+ + 图8.2.3生成9个得分图 + 下图中红色虚线矩形是建议的ROI。我们将其分割成3×3个区域,并询问每个区域包含目标对应部分的概率是多少。例如,左上角ROI区域包含左眼的概率。我们将结果存储成3×3 vote数组,如下图(右)所示。例如,vote_array[0][0]包含左上角区域是否包含目标对应部分的得分。 +
+ + 图8.2.4 + 将ROI应用到特征图上,输出一个3x3数组。将得分图和ROI映射到vote数组的过程叫做位置敏感ROI池化(position-sensitive ROI-pool)。该过程与前面讨论过的ROI池化非常接近。 +
+ + 图8.2.5 + 将ROI的一部分叠加到对应的得分图上,计算V[i][j]。在计算出位置敏感ROI池化的所有值后,类别得分是其所有元素得分的平均值。 +
+ + 图8.2.6 ROI池化 + 假如我们有C个类别要检测。我们将其扩展为C+1个类别,这样就为背景(非目标)增加了一个新的类别。每个类别有3×3个得分图,因此一共有(C+1)×3×3个得分图。使用每个类别的得分图可以预测出该类别的类别得分。然后我们对这些得分应用 softmax 函数,计算出每个类别的概率。以下是数据流图,在本案例中,k=3。 +
+ + 图8.2.7 + +## 8.3 单次目标检测器 + + 我们将对单次目标检测器(包括SSD、YOLO、YOLOv2、YOLOv3)进行综述。我们将分析FPN以理解多尺度特征图如何提高准确率,特别是小目标的检测,其在单次检测器中的检测效果通常很差。然后我们将分析Focal loss和RetinaNet,看看它们是如何解决训练过程中的类别不平衡问题的。 +### 8.3.1 SSD系列 + +#### 8.3.1.1 SSD + +``` +Faster R-CNN中,在分类器之后有一个专用的候选区域网络。 +``` + +
+ +``` +图8.3.1 Faster R-CNN工作流 +基于区域的检测器是很准确的,但需要付出代价。Faster R-CNN在PASCAL VOC 2007测试集上每秒处理7帧的图像(7FPS)。和R-FCN类似,研究者通过减少每个ROI的工作量来精简流程。 +作为替代,我们是否需要一个分离的候选区域步骤?我们可以直接在一个步骤内得到边界框和类别吗? +``` + +``` +让我们再看一下滑动窗口检测器。我们可以通过在特征图上滑动窗口来检测目标。对于不同的目标类型,我们使用不同的窗口类型。以前的滑动窗口方法的致命错误在于使用窗口作为最终的边界框,这就需要非常多的形状来覆盖大部分目标。更有效的方法是将窗口当作初始猜想,这样我们就得到了从当前滑动窗口同时预测类别和边界框的检测器。 +``` + +
+ +``` +图8.3.2 +基于滑动窗口进行预测这个概念和Faster R-CNN中的锚点很相似。然而,单次检测器会同时预测边界框和类别。例如,我们有一个8×8特征图,并在每个位置做出k个预测,即总共有8×8×k个预测结果。 +``` + +
+ +``` +图8.3.3 64个位置 +在每个位置,我们有k个锚点(锚点是固定的初始边界框猜想),一个锚点对应一个特定位置。我们使用相同的锚点形状仔细地选择锚点和每个位置。 +``` + +
+ +``` +图8.3.4 使用4个锚点在每个位置做出4个预测 +以下是4个锚点(绿色)和4个对应预测(蓝色),每个预测对应一个特定锚点。在Faster R-CNN中,我们使用卷积核来做5个参数的预测:4个参数对应某个锚点的预测边框,1个参数对应objectness置信度得分。因此3×3×D×5卷积核将特征图从8×8×D转换8×8×5。 +``` + +
+ +``` +图8.3.5 4个预测,每个预测对应一个锚点 +``` + +
+ +``` +图8.3.6 使用3×3卷积核计算预测 +在单次检测器中,卷积核还预测C个类别概率以执行分类(每个概率对应一个类别)。因此我们应用一个3×3×D×25卷积核将特征图从8×8×D转换为8×8×25(C=20)。 +``` + +
+ +``` +图8.3.7 每个位置做出k个预测,每个预测有25个参数 +单次检测器通常需要在准确率和实时处理速度之间进行权衡。它们在检测太近距离或太小的目标时容易出现问题。 +``` + + SSD是使用VGG19网络作为特征提取器(和Faster R-CNN中使用的CNN一样)的单次检测器。我们在该网络之后添加自定义卷积层(蓝色),并使用卷积核(绿色)执行预测。 +
+ + 图8.3.8 同时对类别和位置执行单次预测 + 然而,卷积层降低了空间维度和分辨率。因此上述模型仅可以检测较大的目标。为了解决该问题,我们从多个特征图上执行独立的目标检测。 +
+ + 图8.3.9 使用多尺度特征图用于检测 +#### 8.3.1.2 DSSD + +TODO + +#### 8.3.1.3 FSSD + +TODO + +### 8.3.2 YOLO系列 + +#### 8.3.2.1 YOLOv1 + YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。 + 在DPM之后提出的其他方法,如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。 + 作者设计了YOLO(You Only Look Once: Unified, Real-Time Object Detection),将物体检测任务当作回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。 + + 图7.4.1 + 如图所示,使用YOLO来检测物体,其流程是非常简单明了的:(1)将图像resize到448×448作为神经网络的输入;(2)运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities;(3)进行非极大值抑制,筛选Boxes。下图是各物体检测系统的检测流程对比: + + 图7.4.2 +##### (1)Unified Detection + YOLO将输入图像划分为S×S的栅格,每个栅格负责检测中心落在该栅格中的物体,如下图所示: + + 图7.4.3 + 每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。这个confidence scores反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个box的坐标预测的有多准。如果这个栅格中不存在一个object,则confidence score应该为0;否则的话,confidence score则为predicted bounding box与ground truth box之间的IOU(intersection over union)。YOLO对每个bounding box有5个predictions:x, y, w, h, and confidence。坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。confidence就是预测的bounding box和ground truth box的IOU值。 + + 图7.4.4 + + 图7.4.5 + 每一个栅格还要预测C个conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。 + + 图7.4.6 + 注意:conditional class probability信息是针对每个网格的。confidence信息是针对每个bounding box的。在测试阶段,将每个栅格的conditional class probabilities与每个bounding box的confidence相乘。这样既可得到每个bounding box的具体类别的confidence score。这乘积既包含了bounding box中预测的class的probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。 + + 图7.4.7 + 将YOLO用于PASCAL VOC数据集时:论文使用的S=7,即将一张图像分为7×7=49个栅格每一个栅格预测B=2个boxes(每个box有x, y, w, h, confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。因此,最后的prediction是7×7×30{即S×S×(B×5+C)}的Tensor。 + + 图7.4.8 + + 图7.4.9 + + 图7.4.10 + +##### (2)Network Design + YOLO检测网络包括24个卷积层和2个全连接层,如图所示: + + 图7.4.11 + + 图7.4.12 + 其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1×1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)3×3卷积层进行简单替代。 + +##### (3)Training + 首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20个卷积层,加上一个average-pooling layer,最后加一个全连接层,作为Pretrain的网络。训练大约一周的时间,使得在ImageNet 2012的验证数据集Top-5的精度达到88%,这个结果跟GoogleNet的效果相当。将Pretrain的结果的前20层卷积层应用到Detection中,并加入剩下的4个卷积层及2个全连接。同时为了获取更精细化的结果,将输入图像的分辨率由224×224提升到448×448。将所有的预测结果都归一化到0-1,使用Leaky RELU作为激活函数。为了防止过拟合,在第一个全连接层后面接了一个ratio=0.5的Dropout层。为了提高精度,对原始图像做数据提升。 + +##### (4)损失函数 + 损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足:(1)8维的localization error和20维的classification error同等重要显然是不合理的;(2)如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。 + + 图7.4.13 + 解决方案如下:更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,记为λcoord,在pascal VOC训练中取5(上图蓝色框)。对没有object的bbox的confidence loss,赋予小的loss weight,记为λnoobj,在pascal VOC训练中取0.5(上图橙色框)。有object的bbox的confidence loss(上图红色框)和类别的loss(上图紫色框)的loss weight正常取1。 + 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。在YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个predictor就负责predict object。这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。 + + + 图7.4.14神经网络输出后的检测流程 + + 图7.4.15 + +##### (5)非极大值抑制 + + + + 图7.4.16 + +##### (6)获取Object Detect结果 + + 图7.4.17 + +##### YOLOv1模型优缺点 +##### (1)YOLO检测物体非常快。 + 因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在TitanX的GPU上能达到45FPS。更快的Fast YOLO检测速度可以达到155FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。 + +##### (2)YOLO可以很好的避免背景错误,产生false positives。 + 不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。 +##### (3)YOLO可以学到物体的泛化特征。 + 当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。 + 尽管YOLO有这些优点,它也有一些缺点:(1)YOLO的物体检测精度低于其他state-of-the-art的物体检测系统;(2)YOLO容易产生物体的定位错误;(3)YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。 + 下图是各物体检测系统的检测性能对比: + + 图7.4.18 +#### 8.3.2.2 YOLOv2 + YOLOv2相比YOLOv1做了很多方面的改进,这也使得YOLOv2的mAP有显著的提升,并且YOLOv2的速度依然很快,保持着自己作为one-stage方法的优势,YOLOv2和Faster R-CNN,SSD等模型的对比如图7.4.19所示。 + + 图7.4.19 YOLOv2与其它模型在VOC 2007数据集上的效果对比 + YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势。YOLOv2的改进策略如图7.4.20所示,可以看出,大部分的改进方法都可以比较显著提升模型的mAP。 +##### YOLOv2改进策略 + + 图7.4.20 YOLOv2相比YOLOv1的改进策略 +##### (1)Batch Normalization + Batch Normalization可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput。使用Batch Normalization后,YOLOv2的mAP提升了2.4%。 + +##### (2)High Resolution Classifier + 目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256×256,导致分辨率不够高,给检测带来困难。为此,新的YOLO网络把分辨率直接提升到了448×448,这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入。 + 对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成448×448,在ImageNet数据集上训练10轮(10epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行fine tune。这样通过提升输入的分辨率,mAP获得了4%的提升。 + +##### (3)Convolutional With Anchor Boxes + 之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,回顾一下,anchor是RNP网络中的一个关键步骤,说的是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的建议框。 + + 图7.4.21 + 为了引入anchor boxes来预测bounding boxes,作者在网络中果断去掉了全连接层。剩下的具体怎么操作呢? + 首先,作者去掉了后面的一个池化层以确保输出的卷积特征图有更高的分辨率。然后,通过缩减网络,让图片输入分辨率为416×416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。作者观察到,大物体通常占据了图像的中间位置,就可以只用中心的一个cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(factor为32),使得输入卷积网络的416×416图片最终得到13×13的卷积特征图(416/32=13)。加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个建议框,那么总共会预测13×13×9=1521个boxes,而之前的网络仅仅预测7×7×2=98个boxes。具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。 + +##### (4)Dimension Clusters(维度聚类) + 作者在使用anchor的时候遇到了两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors),虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是,如果一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就更容易学到准确的预测位置。和以前的精选boxes维度不同,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为: + + 作者通过改进的K-means对训练集中的boxes进行了聚类,判别标准是平均IOU得分,聚类结果如下图: + + 图7.4.22数据集VOC和COCO上的边界框聚类分析结果 + 可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。当然,作者也做了实验来对比两种策略的优劣,如下图,使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。 + 表7.4.1 + + +##### (5)New Network:Darknet-19 + YOLOv2采用了一个新的基础模型(特征提取器),称为Darknet-19,包括19个卷积层和5个maxpooling层,如图4所示。Darknet-19与VGG16模型设计原则是一致的,主要采用3*3卷积,采用2*2的maxpooling层之后,特征图维度降低2倍,而同时将特征图的channles增加两倍。与NIN(Network in Network)类似,Darknet-19最终采用global avgpooling做预测,并且在3*3卷积之间使用1*1卷积来压缩特征图channles以降低模型计算量和参数。Darknet-19每个卷积层后面同样使用了batch norm层以加快收敛速度,降低模型过拟合。在ImageNet分类数据集上,Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。 + 表7.4.2 + + +##### (6)Direct location prediction + 前面讲到,YOLOv2借鉴RPN网络使用anchor boxes来预测边界框相对先验框的offsets。边界框的实际中心位置 ,需要根据预测的坐标偏移值 ,先验框的尺度 以及中心坐标 (特征图每个位置的中心点)来计算: + + 但是上面的公式是无约束的,预测的边界框很容易向任何方向偏移,如当 时边界框将向右偏移先验框的一个宽度大小,而当 时边界框将向左偏移先验框的一个宽度大小,因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。所以,YOLOv2弃用了这种预测方式,而是沿用YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets: ,可以按如下公式计算出边界框实际位置和大小: + + 其中为 为cell的左上角坐标,如图5所示,在计算时每个cell的尺度为1,所以当前cell的左上角坐标为(1,1)。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。而 和 是先验框的宽度与长度,前面说过它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1。这里记特征图的大小为 (在文中是(13,13)),这样我们可以将边界框相对于整张图片的位置和大小计算出来(4个值均在0和1之间): + + 如果再将上面的4个值分别乘以图片的宽度和长度(像素点值)就可以得到边界框的最终位置和大小了。这就是YOLOv2边界框的整个解码过程。约束了边界框的位置预测值使得模型更容易稳定训练,结合聚类分析得到先验框与这种预测方法,YOLOv2的mAP值提升了约5%。 + + 图7.4.23边界框位置与大小的计算示例图 + +##### (7)Fine-Grained Features + YOLOv2的输入图片大小为416*416,经过5次maxpooling之后得到13*13大小的特征图,并以此特征图采用卷积做预测。13*13大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26*26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为26*26*512的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2*2的局部区域,然后将其转化为channel维度,对于26*26*512的特征图,经passthrough层处理之后就变成了13*13*2048的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的13*13*1024特征图连接在一起形成13*13*3072的特征图,然后在此特征图基础上卷积做预测。在YOLO的C源码中,passthrough层称为reorg layer。 +另外,作者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增加了一个中间卷积层,先采用64个1*1卷积核进行卷积,然后再进行passthrough处理,这样26*26*512的特征图得到13*13*256的特征图。这算是实现上的一个小细节。使用Fine-Grained Features之后YOLOv2的性能有1%的提升。 + +##### (8)Multi-Scale Training + 由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于416*416大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:输入图片最小为320*320,此时对应的特征图大小为10*10(不是奇数了,确实有点尴尬),而输入图片最大为608*608,对应的特征图大小为19*19,在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。 + + 图7.4.24 Multi-Scale Training + 采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。在测试时,YOLOv2可以采用不同大小的图片作为输入,在VOC 2007数据集上的效果如下图所示。可以看到采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于544*544,mAP高达78.6%。注意,这只是测试时输入图片大小不同,而实际上用的是同一个模型(采用Multi-Scale Training训练)。 + + 图7.4.25 YOLOv2在VOC 2007数据集上的性能对比 + + 总结来看,虽然YOLOv2做了很多改进,但是大部分都是借鉴其它论文的一些技巧,如Faster R-CNN的anchor boxes,YOLOv2采用anchor boxes和卷积做预测,这基本上与SSD模型(单尺度特征图的SSD)非常类似了,而且SSD也是借鉴了Faster R-CNN的RPN网络。从某种意义上来说,YOLOv2和SSD这两个one-stage模型与RPN网络本质上无异,只不过RPN不做类别的预测,只是简单地区分物体与背景。在two-stage方法中,RPN起到的作用是给出region proposals,其实就是作出粗糙的检测,所以另外增加了一个stage,即采用R-CNN网络来进一步提升检测的准确度(包括给出类别预测)。而对于one-stage方法,它们想要一步到位,直接采用“RPN”网络作出精确的预测,要因此要在网络设计上做很多的tricks。YOLOv2的一大创新是采用Multi-Scale Training策略,这样同一个模型其实就可以适应多种大小的图片了。 + +##### YOLOv2的训练 + YOLOv2的训练主要包括三个阶段。 + 第一阶段:先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为224*224,共训练160个epochs。 + 第二阶段:将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。 + 第三个阶段:修改Darknet-19分类模型为检测模型,并在检测数据集上继续finetune网络。 + 网络修改包括(网路结构可视化):移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个3*3*2014卷积层,同时增加了一个passthrough层,最后使用1*1卷积层输出预测结果。 + +#### 8.3.2.3 YOLO9000 + YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。 作者选择在COCO和ImageNet数据集上进行联合训练,但是遇到的第一问题是两者的类别并不是完全互斥的,比如"Norfolk terrier"明显属于"dog",所以作者提出了一种层级分类方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示: + + 图7.4.26 基于COCO和ImageNet数据集建立的WordTree + WordTree中的根节点为"physical object",每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积。 + + 图7.4.27 ImageNet与WordTree预测的对比 + 在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是Pr(physicalobject),同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。通过联合训练策略,YOLO9000可以快速检测出超过9000个类别的物体,总体mAP值为19,7%。我觉得这是作者在这篇论文作出的最大的贡献,因为YOLOv2的改进策略亮点并不是很突出,但是YOLO9000算是开创之举。 + +#### 8.3.2.4 YOLOv3 + YOLOv3在Pascal TitanX上处理608x608图像速度达到20FPS,在COCO test-dev上mAP@0.5达到57.9%,与RetinaNet(FocalLoss论文所提出的单阶段网络)的结果相近,并且速度快4倍。YOLOv3的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。速度对比如下: + + 图7.4.28 性能对比图 + YOLOv3在实现相同准确度下要显著地比其它检测方法快。时间都是在采用M40或TitanX等相同GPU下测量的。 + 简而言之,YOLOv3的先验检测(Prior detection)系统将分类器或定位器重新用于执行检测任务。他们将模型应用于图像的多个位置和尺度。而那些评分较高的区域就可以视为检测结果。此外,相对于其它目标检测方法,我们使用了完全不同的方法。我们将一个单神经网络应用于整张图像,该网络将图像划分为不同的区域,因而预测每一块区域的边界框和概率,这些边界框会通过预测的概率加权。我们的模型相比于基于分类器的系统有一些优势。它在测试时会查看整个图像,所以它的预测利用了图像中的全局信息。与需要数千张单一目标图像的R-CNN不同,它通过单一网络评估进行预测。这令YOLOv3非常快,一般它比R-CNN快1000倍、比Fast R-CNN快100倍。 + +##### YOLOv3改进 +##### (1)多尺度预测(类FPN) + 每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3中尺度。 + 尺度1:在基础网络之后添加一些卷积层再输出box信息。 + 尺度2:从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍。 + 尺度3:与尺度2类似,使用了32x32大小的特征图。 + +##### (2)更好的基础分类网络(类ResNet)和分类器darknet-53,见下图。 + + 图7.4.29 基础网络Darknet-53 + +##### (3)分类器-类别预测: + YOLOv3不使用Softmax对每个框进行分类,主要考虑因素有两个:(1)Softmax使得每个框分配一个类别(score最大的一个),而对于Open Images这种数据集,目标可能有重叠的类别标签,因此Softmax不适用于多标签分类。(2)Softmax可被独立的多个logistic分类器替代,且准确率不会下降。分类损失采用binary cross-entropy loss。仿ResNet, 与ResNet-101或ResNet-152准确率接近,但速度更快.对比如下(准确率(top-1 误差、top-5 误差)、运算次数(/十亿)、每秒浮点数运算次数(/十亿),以及 FPS 值。): + 表7.4.3主干架构的性能对比 + + 检测结构如下: + + 图7.4.30 + + 图7.4.31 + 从中看出,YOLOv3表现得不错。RetinaNet需要大约3.8倍的时间来处理一张图像,YOLOv3相比SSD变体要好得多,并在AP_50指标上和当前最佳模型有得一拼。YOLOv3在mAP@0.5及小目标APs上具有不错的结果,但随着IOU的增大,性能下降,说明YOLOv3不能很好地与ground truth切合。 + 边框预测: + + 图7.4.32带有维度先验和定位预测的边界框。我们边界框的宽和高以作为离聚类中心的位移,并使用Sigmoid函数预测边界框相对于滤波器应用位置的中心坐标。仍采用之前的logis其中cx,cy是网格的坐标偏移量,pw,ph是预设的anchor box的边长.最终得到的边框坐标值是b*,而网络学习目标是t*,用sigmod函数、指数转换。 + +##### YOLOv3模型优缺点 +##### (1)优点 + a) 快速,pipline简单; + b) 背景误检率低; + c) 通用性强。 + YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。 + +##### (2)缺点 + 但相比RCNN系列物体检测方法,YOLO具有以下缺点: + a) 识别物体位置精准性差。 + b) 召回率低。 + 在每个网格中预测两个box这种约束方式减少了对同一目标的多次检测(R-CNN使用的region proposal方式重叠较多),相比R-CNN使用Selective Search产生2000个proposal(RCNN测试时每张超过40秒),yolo仅使用7x7x2个。 + +### 8.3.3 RetinaNet + +md版本未编辑完 \ No newline at end of file diff --git a/MarkDown/第十章_迁移学习.md b/MarkDown/第十一章_迁移学习.md similarity index 100% rename from MarkDown/第十章_迁移学习.md rename to MarkDown/第十一章_迁移学习.md diff --git a/MarkDown/第一十三章_优化算法.md b/MarkDown/第十三章_优化算法.md similarity index 100% rename from MarkDown/第一十三章_优化算法.md rename to MarkDown/第十三章_优化算法.md diff --git a/MarkDown/第十二章_网络搭建及训练.md b/MarkDown/第十二章_网络搭建及训练.md new file mode 100644 index 0000000..59fb0c5 --- /dev/null +++ b/MarkDown/第十二章_网络搭建及训练.md @@ -0,0 +1 @@ +问题待提出和整理 diff --git a/MarkDown/第十五章_GPU和框架选型.md b/MarkDown/第十五章_GPU和框架选型.md new file mode 100644 index 0000000..6a57722 --- /dev/null +++ b/MarkDown/第十五章_GPU和框架选型.md @@ -0,0 +1,159 @@ +# 第十五章 GPU和框架选型指南 + +## 15.1 GPU购买指南 + +深度学习训练通常需要大量的计算资源。GPU目前是深度学习最常使用的计算加速硬件。相对于CPU来说,GPU更便宜且计算更加密集。一方面,相同计算能力的GPU的价格一般是CPU价格的十分之一。另一方面,一台服务器通常可以搭载8块或者16块GPU。因此,GPU数量可以看作是衡量一台服务器的深度学习计算能力的一个标准。 + +### 15.1.1 如何选择GPU +### 首先给出一些总体的建议 +最好的GPU整体(小幅度):Titan Xp +综合性价比高,但略贵:GTX 1080 Ti,GTX 1070,GTX 1080 +性价比还不错且便宜:GTX 1060(6GB) + +当使用数据集> 250GB:GTX Titan X(Maxwell) ,NVIDIA Titan X Pascal或NVIDIA Titan Xp + +没有足够的钱:GTX 1060(6GB) + +几乎没有钱:GTX 1050 Ti(4GB) + +做Kaggle比赛:GTX 1060(6GB)适用于任何“正常”比赛,或GTX 1080 Ti用于“深度学习竞赛” + +计算机视觉研究员:NVIDIA Titan Xp;不要买现在新出的Titan X(Pascal或Maxwell) + +一名研究员人员:GTX 1080 Ti。在某些情况下,如自然语言处理,一个GTX 1070或GTX 1080已经足够了-检查你现在模型的内存需求 + +搭建一个GPU集群:这个有点复杂,另做探讨。 + +刚开始进行深度学习研究:从GTX 1060(6GB)开始。根据你下一步兴趣(入门,Kaggle比赛,研究,应用深度学习)等等,在进行选择。目前,GTX 1060更合适。 + +想尝试下深度学习,但没有过多要求:GTX 1050 ti(4或2GB) + +目前独立GPU主要有AMD和Nvidia两家厂商。其中Nvidia在深度学习布局较早,对深度学习框架支持更好。因此,目前大家主要会选择Nvidia的GPU。 + +Nvidia有面向个人用户(例如GTX系列)和企业用户(例如Tesla系列)的两类GPU。这两类GPU的计算能力相当。然而,面向企业用户的GPU通常使用被动散热并增加了内存校验,从而更适合数据中心,并通常要比面向个人用户的GPU贵上10倍。 + +如果你是拥有100台机器以上的大公司用户,通常可以考虑针对企业用户的Nvidia Tesla系列。如果你是拥有10到100台机器的实验室和中小公司用户,预算充足的情况下可以考虑Nvidia DGX系列,否则可以考虑购买如Supermicro之类的性价比比较高的服务器,然后再购买安装GTX系列的GPU。 + +Nvidia一般每一两年发布一次新版本的GPU,例如2017年发布的是GTX 1000系列。每个系列中会有数个不同的型号,分别对应不同的性能。 + +### 15.1.2 GPU的主要性能指标 +GPU的性能主要由以下三个参数构成: + +1. 计算能力。通常我们关心的是32位浮点计算能力。16位浮点训练也开始流行,如果只做预测的话也可以用8位整数。 +2. 内存大小。当模型越大,或者训练时的批量越大时,所需要的GPU内存就越多。 +3. 内存带宽。只有当内存带宽足够时才能充分发挥计算能力。 + +对于大部分用户来说,只要考虑计算能力就可以了。GPU内存尽量不小于4GB。但如果GPU要同时显示图形界面,那么推荐的内存大小至少为6GB。内存带宽通常相对固定,选择空间较小。 + +下图描绘了GTX 900和1000系列里各个型号的32位浮点计算能力和价格的对比。其中价格为Wikipedia的建议价格。 + +![浮点计算能力和价格的对比。](../img/gtx.png) + +我们可以从图中读出两点信息: + +1. 在同一个系列里面,价格和性能大体上成正比。但后发布的型号性价比更高,例如980 TI和1080 TI。 +2. GTX 1000系列比900系列在性价比上高出2倍左右。 + +如果大家继续比较GTX较早的系列,也可以发现类似的规律。据此,我们推荐大家在能力范围内尽可能买较新的GPU。 + +在选择GPU时,首先要考虑的第一个GPU性能问题是什么呢:是否为cuda核心?时钟速度多大?内存大小多少? +这些都不是,对于深度学习性能而言,最重要的特征是内存带宽(memory bandwidth)。 +简而言之:GPU针对内存带宽进行了优化,但同时牺牲了内存访问时间(延迟)。CPU的设计恰恰相反:如果涉及少量内存(例如几个数字相乘(3 * 6 * 9)),CPU可以快速计算,但是对于大量内存(如矩阵乘法(A * B * C)则很慢。由于内存带宽的限制,当涉及大量内存的问题时,GPU快速计算的优势往往会受到限制。当然,GPU和CPU之间还有更复杂的区别,关于为何GPU如此适用于处理深度学习问题,另做探讨。 + +所以如果你想购买一个快速的GPU,首先要关注的是GPU的带宽(bandwidth)。 + + +### 15.1.3 整机配置 + +通常,我们主要用GPU做深度学习训练。因此,不需要购买高端的CPU。至于整机配置,尽量参考网上推荐的中高档的配置就好。不过,考虑到GPU的功耗、散热和体积,我们在整机配置上也需要考虑以下三个额外因素。 + +1. 机箱体积。GPU尺寸较大,通常考虑较大且自带风扇的机箱。 +2. 电源。购买GPU时需要查一下GPU的功耗,例如50W到300W不等。购买电源要确保功率足够,且不会过载机房的供电。 +3. 主板的PCIe卡槽。推荐使用PCIe 3.0 16x来保证充足的GPU到主内存的带宽。如果搭载多块GPU,要仔细阅读主板说明,以确保多块GPU一起使用时仍然是16x带宽。注意,有些主板搭载4块GPU时会降到8x甚至4x带宽。 + + +### 15.1.4 小结 + +* 在预算范围之内,尽可能买较新的GPU。 +* 整机配置需要考虑到GPU的功耗、散热和体积。 +一般来说,我会推荐GTX 1080 Ti,GTX 1080或GTX 1070.他们都是优秀的显卡,如果你有钱,应该购买GTX 1080 Ti。GTX 1070比普通的GTX Titan X(Maxwell)便宜一些。GTX 1080的性价比比GTX 1070低一些,但是自GTX 1080 Ti推出以来,价格大幅下滑,现在GTX 1080的性价比已经能够与GTX 1070比拟。所有这三款显卡应该比GTX 980 Ti要好,因为它们具有11GB和8GB(而不是6GB)的内存。 + +8GB的内存可能看起来有点小,但是对于许多任务来说这已经足够了。例如对于Kaggle比赛,大多数图像数据,deep style和自然语言理解任务,这些你可能会遇到几个问题。 + +对于入门级的人来或是偶尔想用GPU来参加类似Kaggle比赛的人,GTX 1060是一个不错的选择。我不推荐内存只有3GB的GTX 1060 variant产品,因为6G的内存就已经很有限了。但是,对于许多应用来说,6GB就足够了。GTX 1060比普通的Titan X慢,但与GTX 980具有可比的性价比。 + +就综合性价比而言,10系列设计得非常好。GTX 1050 Ti,GTX 1060,GTX 1070,GTX 1080和GTX 1080 Ti都非常出色。GTX 1060和GTX 1050 Ti适用于初学者,GTX 1070和GTX 1080是适合于初创公司,部分研究和工业部门,而性能突出的GTX 1080 Ti,对于以上应用都合适。 + +不推荐NVIDIA Titan Xp,因为它的性价比太昂贵了。可以用GTX 1080 Ti代替。然而,NVIDIA Titan Xp在计算机视觉研究领域中仍然有一定的使用,用于处理大数据集或视频数据。在这些领域中,按照每GB的内存数量计算,NVIDIA Titan Xp只比GTX 1080 Ti多1GB,但在这种情况下也具有一定的优势。不推荐NVIDIA Titan X(Pascal),因为NVIDIA Titan Xp速度更快,但价格几乎相同。但由于市场上这些GPU的稀缺性,如果你找不到NVIDIA Titan Xp,也可以购买Titan X(Pascal)。 + +如果你已经有了GTX Titan X(Maxwell)GPU,那么升级到NVIDIA Titan X(Pascal)或NVIDIA Titan Xp就没有必要了。 + +如果你缺钱,但是你需要12GB内存来开展你的研究,那么GTX Titan X(Maxwell)也是一个很好的选择。 + +对于大多数研究人员来说,GTX 1080 Ti已经完全够用了。大多数研究和大多数应用,GTX 1080 Ti的内存完全够用。 + +在NLP中,内存限制并不像计算机视觉领域那么严格,所以GTX 1070 / GTX 1080也是不错的选择。通常是,需要解决什么样的任务以及如何进行试验,决定了需要选择哪一款GPU,无论是GTX 1070还是GTX 1080。当你选择GPU时,应该按照类似的方式推理。考虑一下你在做什么任务,如何运行你的实验,然后尝试找到适合这些要求的GPU。 + +对于预算有限的人来说,选择条件则更加有限。亚马逊网络服务上的GPU相当昂贵和缓慢,如果只有少量的资金,也是一个不错的选择。我不推荐GTX 970,因为它很慢,即使在某些限制条件下也是相当昂贵的(在eBay上150美元),并且存在与卡启动相关的内存问题。相反,建议花更多一点的钱购买更快,有更大的内存,没有内存问题的GTX 1060。如果实在买不起GTX 1060,我建议选择配备4GB内存的GTX 1050 Ti。4GB内存可能有限,但至少可以开展进行你的研究,只是需要你对模型进行一些调整,也可以得到良好的性能。 + +GTX 1050 Ti一般来说也是一个不错的选择,如果你只是想尝试一下深度学习,而没有其他更多的需求。 + +结论 + +有了这篇文章中提供的所有信息,你应该能够考虑选择哪一种合适的GPU,综合考虑所需的内存大小,带宽(GB/s)大小和GPU的价格,这一思路在未来很久也适用。最后,如果有足够的资金,建议购买GTX 1080 Ti,GTX 1070或者GTX 1080。如果刚刚开始研究深度学习,或者资金有限,可以购买GTX 1060。如果资金实在有限,可以购买GTX 1050 ti;如果想要从事计算机视觉研究,可以购买Titan Xp。 + + + +## 15.2 框架选型 + +目前常用的框架有tensorflow,keras,pytorch,mxnet等等,各个框架的优缺点在此简单介绍: + +### 15.2.1 常用框架简介 + +1,tensorflow: +tensorflow由于有google的强大背书,加上其优秀的分布式设计,丰富的教程资源和论坛,工业部署方便,基本很多人都是从tensorflow入门的 +优点:google的强大背书,分布式训练,教程资源丰富,常见问题基本都可以在互联网中找到解决办法,工业部署方便 +缺点: 接口混乱,官方文档不够简洁,清晰, + +2,keras: +keras是一种高层编程接口,其可以选择不同的后端,比如tensorflow,therao等等 +优点: 接口简洁,上手快,文档好,资源多 +缺点: 封装的太好了导致不理解其技术细节 + +3,pytorch: +pytorch是Facebook于2017年才推出的深度学习框架,相对于其它框架,算是比较晚的了,但是这个同时也是优势,在设计的时候就会避免很多之前框架的问题,所以一经推出,就收到大家极大的欢迎 +优点:接口简洁且规范,和python无缝结合,代码设计优秀且易懂,社区非常活跃,官方修复bug及时 +缺点: 目前模型在工业界部署相对其它框架稍有劣势,不过后续的pytorch1.0版本应该会有很大改善,和caffe2合并后,caffe2的优秀的模型部署能力可以弥补这个不足 + +4,caffe2: +caffe2是在caffe之后的第二代版本,同属于Facebook。。。 +优点:支持模型的全平台部署,。。。。 +缺点:使用人数相对较少,资源较少,和pytorch合并后应该会更受欢迎 + +5,mxnet +mxnet是dmlc社区推出的深度学习框架,在2017年被亚马逊指定为官方框架 +优点:支持多种语言,代码设计优秀,省显存,华人团队开发,中文社区活跃,官方复现经典论文推出gluoncv和gluonNLP模块,非常方便,拿来就可以用。 +缺点: 现在mxnet官方社区主要在推gluon接口,接口稍有混乱,坑较多,入手门槛稍高 + +6,caffe: +目前很多做深度学习比较早的大厂基本都是在用caffe,因为在2013-2015年基本就是caffe的天下,并且caffe的代码设计很优秀,基本所有代码都被翻了很多遍了,被各种分析,大厂基本都是魔改caffe,基于caffe来进行二次开发,所在目前在很多大厂还是在使用caffe +优点:资源丰富,代码容易理解,部署方便 +缺点:入门门槛高,文档较少 + +### 15.2.1 框架选型总结 +1,新手入门,首推pytorch,上手快,资源丰富,官方文档写的非常好(https://pytorch.org/tutorials/) +2,目前工业部署,tensorflow是首选,资源丰富,并且在分布式训练这一块基本一家独大 +3,mxnet的gluon接口有比较丰富的中文资源(教程:zh.gluon.ai,论坛:discuss.gluon.ai),gluoncv模块(https://gluon-cv.mxnet.io),gluonNLP模块(https://gluon-nlp.mxnet.io) + + +## 15.3 模型部署 +我们一般都是通过python或者其他语言来编码训练模型,然后基于后端来进行部署 +一般的框架都有自身的部署框架,比如tensorflow,pytorch,caffe2,mxnet等等 +有一些框架是专门做推理部署使用的,比如 +(1)tensorRT + + (2)TVM + + (3)ONNX + + diff --git a/MarkDown/第十六章_NLP.md b/MarkDown/第十六章_NLP.md new file mode 100644 index 0000000..1e26a70 --- /dev/null +++ b/MarkDown/第十六章_NLP.md @@ -0,0 +1,24 @@ +# 第六章 自然语言处理 (NLP) + + Markdown Revision 1; + Date: 2018/10/29 + Editor: 盛泳潘-电子科技大学 + Contact: shengyp2011@163.com + + +## 概述篇 + +不同于传问题。**定向循环结构如下图所示**: + +![](../img/ch6/figure_6.1_1.jpg) +### 6.2 RNNs典型特点? + + +### 6.3 Recurrent Neural Network 与Recusive Neural Network的区别? + + +### 6.2 Self-Attention相对传统RNN、CNN具有什么优势? + +## 技术篇 + + diff --git a/MarkDown/第十四章_超参数调整.md b/MarkDown/第十四章_超参数调整.md index 76cc1d8..82b52bb 100644 --- a/MarkDown/第十四章_超参数调整.md +++ b/MarkDown/第十四章_超参数调整.md @@ -4,20 +4,30 @@ > Date: 2018/10/25 > Editor: 乔成磊-同济大学 > Contact: qchl0318@163.com +> Updater: [sjsdfg](https://github.com/sjsdfg) ## 14.1 调试处理 -关于训练深度最难的事情之一是你要处理的参数的数量,从学习速率到Momentum(动量梯度下降法)的参数。如果使用Momentum或Adam优化算法的参数,也许你还得选择层数,也许你还得选择不同层中隐藏单元的数量,也许你还想使用学习率衰减。所以,你使用的不是单一的学习率。接着,当然你可能还需要选择mini-batch的大小。 -结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是,学习速率是需要调试的最重要的超参数。 -除了,还有一些参数需要调试,例如Momentum参数,0.9就是个很好的默认值。我还会调试mini-batch的大小,以确保最优算法运行有效。我还会经常调试隐藏单元,我用橙色圈住的这些,这三个是我觉得其次比较重要的,相对于而言。重要性排第三位的是其他因素,层数有时会产生很大的影响,学习率衰减也是如此。当应用Adam算法时,事实上,我从不调试,和,我总是选定其分别为0.9,0.999和,如果你想的话也可以调试它们。 -但希望你粗略了解到哪些超参数较为重要,无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。 +  关于训练深度最难的事情之一是你要处理的参数的数量,从学习速率到 Momentum(动量梯度下降法)的参数。如果使用 Momentum 或 Adam 优化算法的参数,也许你还得选择层数,也许你还得选择不同层中隐藏单元的数量,也许你还想使用学习率衰减。所以,你使用的不是单一的学习率。接着,当然你可能还需要选择 mini-batch 的大小。 + +  结果证实一些超参数比其它的更为重要,我认为,最为广泛的学习应用是,学习速率是需要调试的最重要的超参数。 + +  除了,还有一些参数需要调试,例如 Momentum 参数,0.9 就是个很好的默认值。我还会调试 mini-batch 的大小,以确保最优算法运行有效。我还会经常调试隐藏单元,我用橙色圈住的这些,这三个是我觉得其次比较重要的,相对于而言。重要性排第三位的是其他因素,层数有时会产生很大的影响,学习率衰减也是如此。当应用 Adam 算法时,事实上,我从不调试,和,我总是选定其分别为 0.9,0.999 和,如果你想的话也可以调试它们。 + +  但希望你粗略了解到哪些超参数较为重要,无疑是最重要的,接下来是我用橙色圈住的那些,然后是我用紫色圈住的那些,但这不是严格且快速的标准,我认为,其它深度学习的研究者可能会很不同意我的观点或有着不同的直觉。 + ## 14.2 有哪些超参数 -每个步骤中的超参数整理 +  学习率(learning rate)、batch_size、optimizer、 激活函数、正则化 + ## 14.3 如何选择调试值? ## 14.4 为超参数选择合适的范围 ## 14.5 如何搜索超参数? -最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。 -一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的CPU和GPU的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。比如,第0天,你将随机参数初始化,然后开始试验,然后你逐渐观察自己的学习曲线,也许是损失函数J,或者数据设置误差或其它的东西,在第1天内逐渐减少,那这一天末的时候,你可能会说,看,它学习得真不错。我试着增加一点学习速率,看看它会怎样,也许结果证明它做得更好,那是你第二天的表现。两天后,你会说,它依旧做得不错,也许我现在可以填充下Momentum或减少变量。然后进入第三天,每天,你都会观察它,不断调整你的参数。也许有一天,你会发现你的学习率太大了,所以你可能又回归之前的模型,像这样,但你可以说是在每天花时间照看此模型,即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法,观察它的表现,耐心地调试学习率,但那通常是因为你没有足够的计算能力,不能在同一时间试验大量模型时才采取的办法。 -另一种方法则是同时试验多种模型,你设置了一些超参数,尽管让它自己运行,或者是一天甚至多天,然后你会获得像这样的学习曲线,这可以是损失函数J或实验误差或损失或数据误差的损失,但都是你曲线轨迹的度量。同时你可以开始一个有着不同超参数设定的不同模型,所以,你的第二个模型会生成一个不同的学习曲线,也许是像这样的一条(紫色曲线),我会说这条看起来更好些。与此同时,你可以试验第三种模型,其可能产生一条像这样的学习曲线(红色曲线),还有另一条(绿色曲线),也许这条有所偏离,像这样,等等。或者你可以同时平行试验许多不同的模型,橙色的线就是不同的模型。用这种方式你可以试验许多不同的参数设定,然后只是最后快速选择工作效果最好的那个。在这个例子中,也许这条看起来是最好的(下方绿色曲线)。 -所以这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式,尝试许多不同的超参数,看效果怎么样。但在一些应用领域,比如在线广告设置和计算机视觉应用领域,那里的数据太多了,你需要试验大量的模型,所以同时试验大量的模型是很困难的,它的确是依赖于应用的过程。但我看到那些应用熊猫方式多一些的组织,那里,你会像对婴儿一样照看一个模型,调试参数,试着让它工作运转。尽管,当然,甚至是在熊猫方式中,试验一个模型,观察它工作与否,也许第二或第三个星期后,也许我应该建立一个不同的模型(绿色曲线),像熊猫那样照料它,我猜,这样一生中可以培育几个孩子,即使它们一次只有一个孩子或孩子的数量很少。 + +  最后,关于如何搜索超参数的问题,我见过大概两种重要的思想流派或人们通常采用的两种重要但不同的方式。 + +  一种是你照看一个模型,通常是有庞大的数据组,但没有许多计算资源或足够的 CPU 和 GPU 的前提下,基本而言,你只可以一次负担起试验一个模型或一小批模型,在这种情况下,即使当它在试验时,你也可以逐渐改良。比如,第 0 天,你将随机参数初始化,然后开始试验,然后你逐渐观察自己的学习曲线,也许是损失函数 J,或者数据设置误差或其它的东西,在第 1 天内逐渐减少,那这一天末的时候,你可能会说,看,它学习得真不错。我试着增加一点学习速率,看看它会怎样,也许结果证明它做得更好,那是你第二天的表现。两天后,你会说,它依旧做得不错,也许我现在可以填充下 Momentum 或减少变量。然后进入第三天,每天,你都会观察它,不断调整你的参数。也许有一天,你会发现你的学习率太大了,所以你可能又回归之前的模型,像这样,但你可以说是在每天花时间照看此模型,即使是它在许多天或许多星期的试验过程中。所以这是一个人们照料一个模型的方法,观察它的表现,耐心地调试学习率,但那通常是因为你没有足够的计算能力,不能在同一时间试验大量模型时才采取的办法。 + +  另一种方法则是同时试验多种模型,你设置了一些超参数,尽管让它自己运行,或者是一天甚至多天,然后你会获得像这样的学习曲线,这可以是损失函数 J 或实验误差或损失或数据误差的损失,但都是你曲线轨迹的度量。同时你可以开始一个有着不同超参数设定的不同模型,所以,你的第二个模型会生成一个不同的学习曲线,也许是像这样的一条(紫色曲线),我会说这条看起来更好些。与此同时,你可以试验第三种模型,其可能产生一条像这样的学习曲线(红色曲线),还有另一条(绿色曲线),也许这条有所偏离,像这样,等等。或者你可以同时平行试验许多不同的模型,橙色的线就是不同的模型。用这种方式你可以试验许多不同的参数设定,然后只是最后快速选择工作效果最好的那个。在这个例子中,也许这条看起来是最好的(下方绿色曲线)。 + +  所以这两种方式的选择,是由你拥有的计算资源决定的,如果你拥有足够的计算机去平行试验许多模型,那绝对采用鱼子酱方式,尝试许多不同的超参数,看效果怎么样。但在一些应用领域,比如在线广告设置和计算机视觉应用领域,那里的数据太多了,你需要试验大量的模型,所以同时试验大量的模型是很困难的,它的确是依赖于应用的过程。但我看到那些应用熊猫方式多一些的组织,那里,你会像对婴儿一样照看一个模型,调试参数,试着让它工作运转。尽管,当然,甚至是在熊猫方式中,试验一个模型,观察它工作与否,也许第二或第三个星期后,也许我应该建立一个不同的模型(绿色曲线),像熊猫那样照料它,我猜,这样一生中可以培育几个孩子,即使它们一次只有一个孩子或孩子的数量很少。 diff --git a/MarkDown/第十章_强化学习.md b/MarkDown/第十章_强化学习.md new file mode 100644 index 0000000..ef67fb8 --- /dev/null +++ b/MarkDown/第十章_强化学习.md @@ -0,0 +1,114 @@ +# 第九章 强化学习 +## 9.1强化学习的主要特点? +其他许多机器学习算法中学习器都是学得怎样做,而RL是在尝试的过程中学习到在特定的情境下选择哪种行动可以得到最大的回报。在很多场景中,当前的行动不仅会影响当前的rewards,还会影响之后的状态和一系列的rewards。RL最重要的3个特定在于: +(1) 基本是以一种闭环的形式; +(2) 不会直接指示选择哪种行动(actions); +(3) 一系列的actions和奖励信号(reward signals)都会影响之后较长的时间。 + +### 1. 定义 +强化学习是机器学习的一个重要分支,是多学科多领域交叉的一个产物,它的本质是解决 decision making 问题,即自动进行决策,并且可以做连续决策。 +它主要包含四个元素,agent,环境状态,行动,奖励, 强化学习的目标就是获得最多的累计奖励。 +我们列举几个形象的例子: +小孩想要走路,但在这之前,他需要先站起来,站起来之后还要保持平衡,接下来还要先迈出一条腿,是左腿还是右腿,迈出一步后还要迈出下一步。 +小孩就是 agent,他试图通过采取行动(即行走)来操纵环境(行走的表面),并且从一个状态转变到另一个状态(即他走的每一步),当他完成任务的子任务(即走了几步)时,孩子得到奖励(给巧克力吃),并且当他不能走路时,就不会给巧克力。 + +![](../img/ch9/9-1.png) + +上图中agent代表自身,如果是自动驾驶,agent就是车;如果你玩游戏它就是你当前控制的游戏角色,如马里奥,马里奥往前走时环境就一直在发生变化,有小怪物或者障碍物出现,它需要通过跳跃来进行躲避,就是要做action(如向前走和跳起的动作);无人驾驶的action就是车左转、右转或刹车等等,它无时无刻都在与环境产生交互,action会反馈给环境,进而改变环境,如果自动驾驶的车行驶目标是100米,它向前开了10米,那环境就发生了变化,所以每次产生action都会导致环境改变,环境的改变会反馈给自身(agent),就是这样的一个循环;反馈又两种方式:1、做的好(reward)即正反馈,2、做得不好(punishment惩罚)即负反馈。Agent可能做得好,也可能做的不好,环境始终都会给它反馈,agent会尽量去做对自身有利的决策,通过反反复复这样的一个循环,agent会越来越做的好,就像孩子在成长过程中会逐渐明辨是非,这就是强化学习。 +## 9.2强化学习应用实例 +(1)Manufacturing + +例如一家日本公司 Fanuc,工厂机器人在拿起一个物体时,会捕捉这个过程的视频,记住它每次操作的行动,操作成功还是失败了,积累经验,下一次可以更快更准地采取行动。 + ![](../img/ch9/9-2.png) + +(2)Inventory Management + +在库存管理中,因为库存量大,库存需求波动较大,库存补货速度缓慢等阻碍使得管理是个比较难的问题,可以通过建立强化学习算法来减少库存周转时间,提高空间利用率。 + +(3)Dynamic pricing + +强化学习中的 Q-learning 可以用来处理动态定价问题。 + +(4)Customer Delivery + +制造商在向各个客户运输时,想要在满足客户的所有需求的同时降低车队总成本。通过 multi-agents 系统和 Q-learning,可以降低时间,减少车辆数量。 + +(5)ECommerce Personalization + +在电商中,也可以用强化学习算法来学习和分析顾客行为,定制产品和服务以满足客户的个性化需求。 +(6)Ad Serving + +例如算法 LinUCB (属于强化学习算法 bandit 的一种算法),会尝试投放更广范围的广告,尽管过去还没有被浏览很多,能够更好地估计真实的点击率。 +再如双 11 推荐场景中,阿里巴巴使用了深度强化学习与自适应在线学习,通过持续机器学习和模型优化建立决策引擎,对海量用户行为以及百亿级商品特征进行实时分析,帮助每一个用户迅速发现宝贝,提高人和商品的配对效率。还有,利用强化学习将手机用户点击率提升了 10-20%。 + +(7)Financial Investment Decisions + +例如这家公司 Pit.ai,应用强化学习来评价交易策略,可以帮助用户建立交易策略,并帮助他们实现其投资目标。 + +(8)Medical Industry + +动态治疗方案(DTR)是医学研究的一个主题,是为了给患者找到有效的治疗方法。 例如癌症这种需要长期施药的治疗,强化学习算法可以将患者的各种临床指标作为输入 来制定治疗策略。 +## 9.3强化学习和监督式学习、非监督式学习的区别 +在机器学习中,我们比较熟知的是监督式学习,非监督学习,此外还有一个大类就是强化学习: +当前的机器学习算法可以分为3种:有监督的学习(Supervised Learning)、无监督的学习(Unsupervised Learning)和强化学习(Reinforcement Learning),结构图如下所示: + ![](../img/ch9/9-3.png) + +### 强化学习和监督式学习的区别: +监督式学习就好比你在学习的时候,有一个导师在旁边指点,他知道怎么是对的怎么是错的,但在很多实际问题中,例如 chess,go,这种有成千上万种组合方式的情况,不可能有一个导师知道所有可能的结果。 + +而这时,强化学习会在没有任何标签的情况下,通过先尝试做出一些行为得到一个结果,通过这个结果是对还是错的反馈,调整之前的行为,就这样不断的调整,算法能够学习到在什么样的情况下选择什么样的行为可以得到最好的结果。 + +就好比你有一只还没有训练好的小狗,每当它把屋子弄乱后,就减少美味食物的数量(惩罚),每次表现不错时,就加倍美味食物的数量(奖励),那么小狗最终会学到一个知识,就是把客厅弄乱是不好的行为。 + +两种学习方式都会学习出输入到输出的一个映射,监督式学习出的是之间的关系,可以告诉算法什么样的输入对应着什么样的输出,强化学习出的是给机器的反馈 reward function,即用来判断这个行为是好是坏。 +另外强化学习的结果反馈有延时,有时候可能需要走了很多步以后才知道以前的某一步的选择是好还是坏,而监督学习做了比较坏的选择会立刻反馈给算法。 + +而且强化学习面对的输入总是在变化,每当算法做出一个行为,它影响下一次决策的输入,而监督学习的输入是独立同分布的。 + +通过强化学习,一个 agent 可以在探索和开发(exploration and exploitation)之间做权衡,并且选择一个最大的回报。 + +exploration 会尝试很多不同的事情,看它们是否比以前尝试过的更好。 + +exploitation 会尝试过去经验中最有效的行为。 + +一般的监督学习算法不考虑这种平衡,就只是是 exploitative。 + +### 强化学习和非监督式学习的区别: + +非监督式不是学习输入到输出的映射,而是模式。例如在向用户推荐新闻文章的任务中,非监督式会找到用户先前已经阅读过类似的文章并向他们推荐其一,而强化学习将通过向用户先推荐少量的新闻,并不断获得来自用户的反馈,最后构建用户可能会喜欢的文章的“知识图”。 + +对非监督学习来说,它通过对没有概念标记的训练例进行学习,以发现训练例中隐藏的结构性知识。这里的训练例的概念标记是不知道的,因此训练样本的歧义性最高。对强化学习来说,它通过对没有概念标记、但与一个延迟奖赏或效用(可视为延迟的概念标记)相关联的训练例进行学习,以获得某种从状态到行动的映射。这里本来没有概念标记的概 +念,但延迟奖赏可被视为一种延迟概念标记,因此其训练样本的歧义性介于监督学习和非监督学习之间。 + +需要注意的是,监督学习和非监督学习从一开始就是相对的,而强化学习在提出时并没有从训练样本歧义性的角度考虑其与监督学习和非监督学习的区别,因此,一些早期的研究中把强化学习视为一种特殊的非监督学习。事实上,对强化学习的定位到目前仍然是有争议的,有的学者甚至认为它是与“从例子中学习”同一级别的概念。 + +从训练样本歧义性角度进行的分类体系,在近几年可望有一些扩展,例如多示例学习(multi-instancelearning)等从训练样本歧义性方面来看很特殊的新的学习框架有可能会进入该体系。但到目前为止,没有任何新的框架得到了公认的地位。另外,半监督学习(semi-supervisedlearning)也有一定希望,它的障碍是半监督学习中的歧义性并不是与生俱来的,而是人为的,即用户期望用未标记的样本来辅助对已标记样本的学习。这与监督学习、非监督学习、强化学习等天生的歧义性完全不同。半监督学习中人为的歧义性在解决工程问题上是需要的、有用的(对大量样本进行标记的代价可能是极为昂贵的),但可能不太会导致方法学或对学习问题视点的大的改变。 + +**强化学习和前二者的本质区别**:没有前两者具有的明确数据概念,它不知道结果,只有目标。数据概念就是大量的数据,有监督学习、无监督学习需要大量数据去训练优化你建立的模型,就像猫狗识别,用n多张猫狗图片去训练模型,经过训练优化后,你用一张崭新的猫狗图片让模型作出判断,这个模型就知道是猫还是狗。 +## 9.4 强化学习主要有哪些算法? +强化学习不需要监督信号,可以在模型未知的环境中平衡探索和利用, 其主要算法有蒙特卡罗强化学习, 时间差分(temporal difference: TD)学习, 策略梯度等。典型的深度强化学习算法特点及性能比较如下图所示: +![](../img/ch9/9-4.png) + +除了上述深度强化学习算法,还有深度迁移强化学习、分层深度强化学习、深度记忆强化学习以及多智能体强化学习等算法。 +## 9.5深度迁移强化学习算法 +传统深度强化学习算法每次只能解决一种游戏任务, 无法在一次训练中完成多种任务. 迁移学习和强化学习的结合也是深度强化学习的一种主要思路。 + +Parisotto等提出了一种基于行为模拟的深度迁移强化学习算法. 该算法通过监督信号的指导, 使得单一的策略网络学习各自的策略, 并将知识迁移到新任务中. Rusa等提出策略蒸馏(policy distillation)深度迁移强化学习算法. 策略蒸馏算法中分为学习网络和指导网络, 通过这两个网络Q值的偏差来确定目标函数,引导学习网络逼近指导网络的值函数空间. 此后,Rusa等又提出了一种基于渐进神经网络(progressive neural networks, PNN)的深度迁移强化学习算法.PNN是一种把神经网络和神经网络连起来的算法. 它在一系列序列任务中, 通过渐进的方式来存储知识和提取特征, 完成了对知识的迁移. PNN最终实现多个独立任务的训练, 通过迁移加速学习过程, 避免灾难性遗忘. Fernando 等提出了路径网络(PathNet)[45].PathNet可以说是PNN的进阶版. PathNet把网络中每一层都看作一个模块, 把构建一个网络看成搭积木,也就是复用积木. 它跟PNN非常类似, 只是这里不再有列, 而是不同的路径. PathNet将智能体嵌入到神经网络中, 其中智能体的任务是为新任务发现网络中可以复用的部分. 智能体是网络之中的路径, 其决定了反向传播过程中被使用和更新的参数范围. 在一系列的Atari强化学习任务上, PathNet都实现了正迁移, 这表明PathNet在训练神经网络上具有通用性应用能力.PathNet也可以显著提高A3C算法超参数选择的鲁棒性. Schaul等提出了一种通用值函数逼近器(universalvalue function approximators, UVFAs)来泛化状态和目标空间.UVFAs可以将学习到的知识迁移到环境动态特性相同但目标不同的新任务中. +## 9.6分层深度强化学习算法 +分层强化学习可以将最终目标分解为多个子任务来学习层次化的策略, 并通过组合多个子任务的策略形成有效的全局策略. Kulkarni等提出了分层DQN(hierarchical deep Q-network, h--DQN) 算法. h--DQN基于时空抽象和内在激励分层, 通过在不同的时空尺度上设置子目标对值函数进行层次化处理. 顶层的值函数用于确定宏观决策, 底层的值函数用于确定具体行动.Krishnamurthy等在h--DQN的基础上提出了基于内部选择的分层深度强化学习算法. 该模型结合时空抽象和深度神经网络, 自动地完成子目标的学习, 避免了特定的内在激励和人工设定中间目标,加速了智能体的学习进程, 同时也增强了模型的泛化能力. Kulkarni等基于后续状态表示法提出了深度后续强化学习(deep successor reinforcement learning,DSRL).DSRL通过阶段性地分解子目标和学习子目标策略, 增强了对未知状态空间的探索, 使得智能体更加适应那些存在延迟反馈的任务.Vezhnevets等受封建(feudal)强化学习算法的启发, 提出一种分层深度强化学习的架构FeUdal网络(FuNs)[49]. FuNs框架使用一个管理员模块和一个工人模块. 管理员模块在较低的时间分辨率下工作, 设置抽象目标并传递给工人模块去执行. FuNs框架创造了一个稳定的自然层次结构, 并且允许两个模块以互补的方式学习. 实验证明, FuNs有助于处理长期信用分配和记忆任务,在Atari视频游戏和迷宫游戏中都取得了不错的效果。 +## 9.7深度记忆强化学习算法 +传统的深度强化学习模型不具备记忆、认知、推理等高层次的能力, 尤其是在面对状态部分可观察和延迟奖赏的情形时. Junhyuk等通过在传统的深度强化学习模型中加入外部的记忆网络部件和反馈控制机制, 提出反馈递归记忆Q网络(feedback recurrent memory Q-network, FRMQN)). FRMQN模型具备了一定的记忆与推理功能, 通过反馈控制机制,FRMQN整合过去存储的有价值的记忆和当前时刻的上下文状态, 评估动作值函数并做出决策. FRMQN初步模拟了人类的主动认知与推理能力, 并完成了一些高层次的认知任务. 在一些未经过训练的任务中,FRMQN模型表现出了很强的泛化能力.Blundell等设计出一种模型无关的情节控制算法(model-free episode control, MFEC). MFEC可以快速存储和回放状态转移序列, 并将回放的序列整合到结构化知识系统中, 使得智能体在面对一些复杂的决策任务时, 能快速达到人类玩家的水平.MFEC通过反向经验回放, 使智能体拥有初步的情节记忆. 实验表明, 基于MFEC算法的深度强化学习不仅可以在Atari游戏中学习到有效策略, 还可以处理一些三维场景的复杂任务. Pritzel等在MFEC的基础上进一步提出了神经情节控制(neural episodic control, NEC),有效提高了深度强化学习智能体的记忆能力和学习效率[53]. NEC能快速吸收新经验并依据新经验来采取行动. 价值函数包括价值函数渐变状态表示和价值函数快速更新估计两部分. 大量场景下的研究表明,NEC的学习速度明显快于目前最先进的通用深度强化学习智能体. +## 9.8 多智能体深度强化学习算法 +在一些复杂场景中, 涉及到多智能体的感知决策问题, 这时需要将单一模型扩展为多个智能体之间相互合作、通信及竞争的多智能体深度强化学习系统.Foerster等提出了一种称为分布式深度递归Q网络(deep distributed recurrent Q-networks, DDRQN) 的模型, 解决了状态部分可观测状态下的多智能体通信与合作的挑战性难题[54]. 实验表明, 经过训练的DDRQN模型最终在多智能体之间达成了一致的通信协1536 控制理论与应用第34 卷议, 成功解决了经典的红蓝帽子问题.让智能体学会合作与竞争一直以来都是人工智能领域内的一项重要研究课题, 也是实现通用人工智能的必要条件. Lowe等提出了一种用于合作–竞争混合环境的多智能体actor-critic 算法(multi-agent deepdeterministic policy gradient, MADDPG)[55]. MADDPG对DDPG强化学习算法进行了延伸, 可实现多智能体的集中式学习和分布式执行, 让智能体学习彼此合作和竞争. 在多项测试任务中, MADDPG的表现都优于DDPG. +## 9.9强化学习开源框架 +谷歌TensorFlow Agents ---TensorFlow的加强版,它提供许多工具,通过强化学习可以实现各类智能应用程序的构建与训练。这个框架能够将OpoenAI Gym接口扩展至多个并行环境,并允许各代理立足TensorFlow之内实现以执行批量计算。其面向OpoenAI Gy环境的批量化接口可与TensorFlow实现全面集成,从而高效执行各类算法。该框架还结合有BatchPPO,一套经过优化的近端策略优化算法实现方案。其核心组件包括一个环境打包器,用于在外部过程中构建OpenAI Gym环境; 一套批量集成,用于实现TensorFlow图步并以强化学习运算的方式重置函数; 外加用于将TensorFlow图形批处理流程与强化学习算法纳入训练特内单一却步的组件。 + +Roboschool:Roboschool 提供开源软件以通过强化学习构建并训练机器人模拟。其有助于在同一环境当中对多个代理进行强化学习训练。通过多方训练机制,您可以训练同一代理分别作为两方玩家(因此能够自我对抗)、使用相同算法训练两套代理,或者设置两种算法进行彼此对抗。Roboschool由OpenAI开发完成,这一非营利性组织的背后赞助者包括Elon Musk、Sam Altman、Reid Hoffman以及Peter Thiel。其与OpenAI Gym相集成,后者是一套用于开发及评估强化学习算法的开源工具集。OpenAI Gym与TensorFlow、Theano以及其它多种深度学习库相兼容。OpenAI Gym当中包含用于数值计算、游戏以及物理引擎的相关代码。Roboschool基于Bullet物理引擎,这是一套开源许可物理库,并被其它多种仿真软件——例如Gazebo与Virtual Robot Experimentation Platform(简称V-REP)所广泛使用。其中包含多种强化学习算法,具体以怨报德 异步深度强化学习方法、Actor-Critic with Experience Replay、Actor- Critic using Kronecker-Factored Trust Region、深度确定性策略梯度、近端策略优化以及信任域策略优化等等。 + +Coach:英特尔公司的开源强化学习框架,可以对游戏、机器人以及其它基于代理的智能应用进行智能代理的建模、训练与评估。Coach 提供一套模块化沙箱、可复用组件以及用于组合新强化学习算法并在多种应用领域内训练新智能应用的Python API。该框架利用OpenAI Gym作为主工具,负责与不同强化学习环境进行交换。其还支持其它外部扩展,具体包括Roboschool、gym-extensions、PyBullet以及ViZDoom。Coach的环境打包器允许用户向其中添加自定义强化学习环境,从而解决其它学习问题。该框架能够在桌面计算机上高效训练强化学习代理,并利用多核CPU处理相关任务。其能够为一部分强化学习算法提供单线程与多线程实现能力,包括异步优势Actor-Critic、深度确定性策略梯度、近端策略优化、直接未来预测以及规范化优势函数。所有算法皆利用面向英特尔系统作出优化的TensorFLow完成,其中部分算法亦适用于英特尔的Neon深度学习框架。Coach 当中包含多种强化学习代理实现方案,具体包括从单线程实现到多线程实现的转换。其能够开发出支持单与多工作程序(同步或异步)强化学习实现方法的新代理。此外,其还支持连续与离散操作空间,以及视觉观察空间或仅包含原始测量指标的观察空间。 +## 9.10深度强化学习算法小结 +基于值函数概念的DQN及其相应的扩展算法在离散状态、离散动作的控制任务中已经表现了卓越的性能, 但是受限于值函数离散型输出的影响, 在连续型控制任务上显得捉襟见肘. 基于策略梯度概念的,以DDPG, TRPO等为代表的策略型深度强化学习算法则更适用于处理基于连续状态空间的连续动作的控制输出任务, 并且算法在稳定性和可靠性上具有一定的理论保证, 理论完备性较强. 采用actor-critic架构的A3C算法及其扩展算法, 相比于传统DQN算法, 这类算法的数据利用效率更高, 学习速率更快, 通用性、可扩展应用性更强, 达到的表现性能更优, 但算法的稳定性无法得到保证. 而其他的如深度迁移强化学习、分层深度强化学习、深度记忆强化学习和多智能体深度强化学习等算法都是现在的研究热点, 通过这些算法能应对更为复杂的场景问题、系统环境及控制任务, 是目前深度强化学习算法研究的前沿领域. + +展望未来,人工智能开发者们需要尽可能掌握上述框架以及其中所使用的各类强化学习算法。此外,还需要强化自身对于多代理强化学习架构的理解,因为其中多种框架都大量利用前沿博弈论研究成果。最后,还需要熟悉深度强化学习知识。 + + diff --git a/MarkDown/第十五章_正则化.md b/MarkDown/第(待定合并某)章_正则化.md similarity index 100% rename from MarkDown/第十五章_正则化.md rename to MarkDown/第(待定合并某)章_正则化.md diff --git a/PDF/深度学习500问-Tan-16第十六章 NLP.pdf b/PDF/深度学习500问-Tan-16第十六章 NLP.pdf new file mode 100644 index 0000000..062e56a Binary files /dev/null and b/PDF/深度学习500问-Tan-16第十六章 NLP.pdf differ diff --git a/README.md b/README.md index a9e7dba..c603368 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,57 @@ -## Welcome to GitHub Pages - -You can use the [editor on GitHub](https://github.com/scutan90/DeepLearning-500-questions/edit/master/README.md) to maintain and preview the content for your website in Markdown files. - +############################################################## +请尊重作者的知识产权,版权所有,翻版必究。 2018.6.27 Tan +scutjy2015@163.com (唯一官方邮箱);现出现不法分子冒充发起人,请广大伙伴儿知悉! ############################################################## -请尊重作者的知识产权,版权所有,翻版必究。 2018.6.27 Tan - -############################################################## - - -# 接下来,将提供MD版本,大家一起编辑完善,敬请期待! -# 希望踊跃提建议,补充修改内容! -# 希望踊跃提建议,在已提交MD版本补充修改内容! -## 为了让内容更充实完善,集思广益,请在修改MD文件的同时(或直接留言)备注自己的姓名-单位(大佬-斯坦福大学),一经采纳,会在原文中显示贡献者的信息,如有收益,会进一步分红,谢谢! -例: +## 接下来,将提供MD版本,大家一起编辑完善,敬请期待! +## 希望踊跃提建议,补充修改内容! +## 希望踊跃提建议,在已提交MD版本补充修改内容! + 为了让内容更充实完善,集思广益,请在修改MD文件的同时(或直接留言)备注自己的姓名-单位(大佬-斯坦福大学),一经采纳,会在原文中显示贡献者的信息,如有收益,会进一步分红,谢谢! +例: ### 3.3.2 如何寻找超参数的最优值?(贡献者:大佬-斯坦福大学) 在使用机器学习算法时,总有一些难搞的超参数。例如权重衰减大小,高斯核宽度等等。算法不会设置这些参数,而是需要你去设置它们的值。设置的值对结果产生较大影响。常见设置超参数的做法有: - 1. 猜测和检查:根据经验或直觉,选择参数,一直迭代。 - 2. 网格搜索:让计算机尝试在一定范围内均匀分布的一组值。 - 3. 随机搜索:让计算机随机挑选一组值。 - 4. 贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。 - 5. 在良好初始猜测的前提下进行局部优化:这就是 MITIE 的方法,它使用 BOBYQA 算法,并有一个精心选择的起始点。由于 BOBYQA 只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在 MITIE 的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。 - 6. 最新提出的 LIPO 的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。 + 1. 猜测和检查:根据经验或直觉,选择参数,一直迭代。 + 2. 网格搜索:让计算机尝试在一定范围内均匀分布的一组值。 + 3. 随机搜索:让计算机随机挑选一组值。 + 4. 贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多的参数的困难。 + 5. 在良好初始猜测的前提下进行局部优化:这就是 MITIE 的方法,它使用 BOBYQA 算法,并有一个精心选择的起始点。由于 BOBYQA 只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在 MITIE 的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。 + 6. 最新提出的 LIPO 的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。 + +### 已提交MD版本章节:请查看MarkDown(排名不分先后) +待定:表示该章节还未匹配到合适的负责人(统筹该章节的内容修改、审核、原创性陈述) +可加:表示该章节,如果有其他合适的,可以开放权限加到负责人身份 + +第一章 数学基础 负责人:哈工大博士-袁笛 +第二章 机器学习基础 负责人:稿定科技计算机视觉工程师-刘鹏;(待定) +第三章 深度学习基础 负责人:同济大学研究生-乔成磊;稿定科技计算机视觉工程师-刘鹏;(可加) +第四章 经典网络 负责人:(待定) +第五章 卷积神经网络CNN 负责人:杜克大学硕士、data scientist李骁丹;重庆大学研究生-刘畅; +------------------------------铪星创新科技联合创始人-杨文英;(可加) +第六章 循环神经网络RNN 负责人:杜克大学硕士、data scientist李骁丹;(可加) +第七章 生成对抗网络GAN 负责人:牛津大学博士泽华;中科院硕士、爱奇艺算法工程师-郭晓锋 +第八章 目标检测 负责人:稿定科技计算机视觉工程师-刘鹏;哈工大博士袁笛;上海大学研究生-陈方杰 +第九章 图像分割 负责人:华南理工研究生-黄钦建;电子科大研究生-孙洪卫、张越;中国农业科学院-杨国峰 +第十章 强化学习 负责人:复旦大学研究生明杰,(可加) +第十一章 迁移学习 负责人:(待定) +第十二章 网络搭建及训练 负责人:(待定) +第十三章 优化算法 负责人:(待定) +第十四章 超参数调整 负责人:(待定) +第十五章 GPU和框架选型 负责人:平安科技算法工程师-崔永明、(可加) +第十六章 NLP 负责人:电子科技大学博士-盛泳潘;深圳乌灵图明科技有限公司CTO-何建宏; +------------------------------DaoCloud研发工程师-张善干;     -### 已提交MD版本章节: -#### 第一章 数学基础 -#### 第三章 深度学习基础 -#### 第四章 经典网络 -#### 第八章 图像分割 -#### 第十章 迁移学习 -#### 第十三章 优化算法 -#### 第十四章 超参数 -#### 第十五章 正则化 -### 感谢以上贡献者1 -寻求有愿意继续完善的朋友、编辑、写手;如有意合作,完善出书(成为共同作者) +寻求有愿意继续完善的朋友、编辑、写手;如有意合作,完善出书(成为共同作者) +所有提交内容的贡献者,将会在文中体现贡献者个人信息(大佬-西湖大学) ############################################################## -请联系scutjy2015@163.com ; 加微信Tan: tan_weixin88 +请联系scutjy2015@163.com (唯一官方邮箱); 加微信Tan: tan_weixin88 + +### 进群先在MD版本增加、改善、提交内容后,更容易进群。 进群请加微信 委托人1:HQJ199508212176  委托人2:Xuwumin1203  委托人3:tianyuzy @@ -51,878 +61,454 @@ You can use the [editor on GitHub](https://github.com/scutan90/DeepLearning-500- ############################################################## +# 目录 2 ## 第一章 数学基础 1 - -## 第二章 机器学习基础 14 - +1.1标量、向量、张量之间的联系 1 +1.2张量与矩阵的区别? 1 +1.3矩阵和向量相乘结果 1 +1.4向量和矩阵的范数归纳 1 +1.5如何判断一个矩阵为正定? 2 +1.6导数偏导计算 3 +1.7导数和偏导数有什么区别? 3 +1.8特征值分解与特征向量 3 +1.9奇异值与特征值有什么关系? 4 +1.10机器学习为什么要使用概率? 4 +1.11变量与随机变量有什么区别? 4 +1.12常见概率分布? 5 +1.13举例理解条件概率 9 +1.14联合概率与边缘概率联系区别? 10 +1.15条件概率的链式法则 10 +1.16独立性和条件独立性 11 +1.17期望、方差、协方差、相关系数总结 11 +## 第二章 机器学习基础 14 2.1 各种常见算法图示 14 - -2.2 监督学习、非监督学习、半监督学习、弱监督学习? 15 - -2.3 监督学习有哪些步骤 16 - -2.4 多实例学习? 17 - -2.5 分类网络和回归的区别? 17 - -2.6 什么是神经网络? 17 - -2.7 常用分类算法的优缺点? 18 - -2.8 正确率能很好的评估分类算法吗? 20 - -2.9 分类算法的评估方法? 20 - -2.10 什么样的分类器是最好的? 22 - -2.11大数据与深度学习的关系 22 - -2.12 理解局部最优与全局最优 23 - -2.13 理解逻辑回归 24 - -2.14 逻辑回归与朴素贝叶斯有什么区别? 24 - -2.15 为什么需要代价函数? 25 - -2.16 代价函数作用原理  25 - -2.17 为什么代价函数要非负? 26 - -2.18 常见代价函数? 26 - -2.19为什么用交叉熵代替二次代价函数 28 - -2.20 什么是损失函数? 28 - -2.21 常见的损失函数 28 - -2.22 逻辑回归为什么使用对数损失函数? 30 - -0.00 对数损失函数是如何度量损失的? 31 - -2.23 机器学习中为什么需要梯度下降? 32 - -2.24 梯度下降法缺点? 32 - -2.25 梯度下降法直观理解? 32 - -2.23 梯度下降法算法描述? 33 - -2.24 如何对梯度下降法进行调优? 35 - -2.25 随机梯度和批量梯度区别? 35 - -2.26 各种梯度下降法性能比较 37 - -2.27计算图的导数计算图解? 37 - -2.28 线性判别分析(LDA)思想总结 39 - -2.29 图解LDA核心思想 39 - -2.30 二类LDA算法原理? 40 - -2.30 LDA算法流程总结? 41 - -2.31 LDA和PCA区别? 41 - -2.32 LDA优缺点? 41 - -2.33 主成分分析(PCA)思想总结 42 - -2.34 图解PCA核心思想 42 - -2.35 PCA算法推理 43 - -2.36 PCA算法流程总结 44 - -2.37 PCA算法主要优缺点 45 - -2.38 降维的必要性及目的 45 - -2.39 KPCA与PCA的区别? 46 - -2.40 模型评估 47 - -2.40.1模型评估常用方法? 47 - -2.40.2 经验误差与泛化误差 47 - -2.40.3 图解欠拟合、过拟合 48 - -2.40.4 如何解决过拟合与欠拟合? 49 - -2.40.5 交叉验证的主要作用? 50 - -2.40.6 k折交叉验证? 50 - -2.40.7 混淆矩阵 50 - -2.40.8 错误率及精度 51 - -2.40.9 查准率与查全率 51 - -2.40.10 ROC与AUC 52 - -2.40.11如何画ROC曲线? 53 - -2.40.12如何计算TPR,FPR? 54 - -2.40.13如何计算Auc? 56 - -2.40.14为什么使用Roc和Auc评价分类器? 56 - -2.40.15 直观理解AUC 56 - -2.40.16 代价敏感错误率与代价曲线 57 - -2.40.17 模型有哪些比较检验方法 59 - -2.40.18 偏差与方差 59 - -2.40.19为什么使用标准差? 60 - -2.40.20 点估计思想 61 - -2.40.21 点估计优良性原则? 61 - -2.40.22点估计、区间估计、中心极限定理之间的联系? 62 - -2.40.23 类别不平衡产生原因? 62 - -2.40.24 常见的类别不平衡问题解决方法 62 - -2.41 决策树 64 - -2.41.1 决策树的基本原理 64 - -2.41.2 决策树的三要素? 64 - -2.41.3 决策树学习基本算法 65 - -2.41.4 决策树算法优缺点 65 - -2.40.5 熵的概念以及理解 66 - -2.40.6 信息增益的理解 66 - -2.40.7 剪枝处理的作用及策略? 67 - -2.41 支持向量机 67 - -2.41.1 什么是支持向量机 67 - -2.25.2 支持向量机解决的问题? 68 - -2.25.2 核函数作用? 69 - -2.25.3 对偶问题 69 - -2.25.4 理解支持向量回归 69 - -2.25.5 理解SVM(核函数) 69 - -2.25.6 常见的核函数有哪些? 69 - -2.25.6 软间隔与正则化 73 - -2.25.7 SVM主要特点及缺点? 73 - -2.26 贝叶斯 74 - -2.26.1 图解极大似然估计 74 - -2.26.2 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别? 76 - -2.26.4 朴素与半朴素贝叶斯分类器 76 - -2.26.5 贝叶斯网三种典型结构 76 - -2.26.6 什么是贝叶斯错误率 76 - -2.26.7 什么是贝叶斯最优错误率 76 - -2.27 EM算法解决问题及实现流程 76 - -2.28 为什么会产生维数灾难? 78 - -2.29怎样避免维数灾难 82 - -2.30聚类和降维有什么区别与联系? 82 - -2.31 GBDT和随机森林的区别 83 - -2.32 四种聚类方法之比较 84 - - -## 第三章 深度学习基础 88 -3.1基本概念 88 - -3.1.1神经网络组成? 88 - -3.1.2神经网络有哪些常用模型结构? 90 - -3.1.3如何选择深度学习开发平台? 92 - -3.1.4为什么使用深层表示 92 - -3.1.5为什么深层神经网络难以训练? 93 - -3.1.6深度学习和机器学习有什么不同 94 - -3.2 网络操作与计算 95 - -3.2.1前向传播与反向传播? 95 - -3.2.2如何计算神经网络的输出? 97 - -3.2.3如何计算卷积神经网络输出值? 98 - -3.2.4如何计算Pooling层输出值输出值? 101 - -3.2.5实例理解反向传播 102 - -3.3 超参数 105 - -3.3.1什么是超参数? 105 - -3.3.2如何寻找超参数的最优值? 105 - -3.3.3超参数搜索一般过程? 106 - -3.4 激活函数 106 - -3.4.1为什么需要非线性激活函数? 106 - -3.4.2常见的激活函数及图像 107 - -3.4.3 常见激活函数的导数计算? 109 - -3.4.4激活函数有哪些性质? 110 - -3.4.5 如何选择激活函数? 110 - -3.4.6使用ReLu激活函数的优点? 111 - -3.4.7什么时候可以用线性激活函数? 111 - -3.4.8怎样理解Relu(<0时)是非线性激活函数? 111 - -3.4.9 Softmax函数如何应用于多分类? 112 - -3.5 Batch_Size 113 - -3.5.1为什么需要Batch_Size? 113 - -3.5.2 Batch_Size值的选择 114 - -3.5.3在合理范围内,增大 Batch_Size 有何好处? 114 - -3.5.4盲目增大 Batch_Size 有何坏处? 114 - -3.5.5调节 Batch_Size 对训练效果影响到底如何? 114 - -3.6 归一化 115 - -3.6.1归一化含义? 115 - -3.6.2为什么要归一化 115 - -3.6.3为什么归一化能提高求解最优解速度? 115 - -3.6.4 3D图解未归一化 116 - -3.6.5归一化有哪些类型? 117 - -3.6.6局部响应归一化作用 117 - -3.6.7理解局部响应归一化公式 117 - -3.6.8什么是批归一化(Batch Normalization) 118 - -3.6.9批归一化(BN)算法的优点 119 - -3.6.10批归一化(BN)算法流程 119 - -3.6.11批归一化和群组归一化 120 - -3.6.12 Weight Normalization和Batch Normalization 120 - -3.7 预训练与微调(fine tuning) 121 - -3.7.1为什么无监督预训练可以帮助深度学习? 121 - -3.7.2什么是模型微调fine tuning 121 - -3.7.3微调时候网络参数是否更新? 122 - -3.7.4 fine-tuning模型的三种状态 122 - -3.8权重偏差初始化 122 - -3.8.1 全都初始化为0 122 - -3.8.2 全都初始化为同样的值 123 - -3.8.3 初始化为小的随机数 124 - -3.8.4用1/sqrt(n)校准方差 125 - -3.8.5稀疏初始化(Sparse Initialazation) 125 - -3.8.6初始化偏差 125 - -3.9 Softmax 126 - -3.9.1 Softmax定义及作用 126 - -3.9.2 Softmax推导 126 - -3.10 理解One Hot Encodeing原理及作用? 126 - -3.11 常用的优化器有哪些 127 - -3.12 Dropout 系列问题 128 - -3.12.1 dropout率的选择 128 - -3.27 Padding 系列问题 128 - - -## 第四章 经典网络 129 - -4.1LetNet5 129 - -4.1.1模型结构 129 - -4.1.2模型结构 129 - -4.1.3 模型特性 131 - -4.2 AlexNet 131 - -4.2.1 模型结构 131 - -4.2.2模型解读 131 - -4.2.3模型特性 135 - -4.3 可视化ZFNet-解卷积 135 - -4.3.1 基本的思想及其过程 135 - -4.3.2 卷积与解卷积 136 - -4.3.3卷积可视化 137 - -4.3.4 ZFNe和AlexNet比较 139 - -4.4 VGG 140 - -4.1.1 模型结构 140 - -4.1.2 模型特点 140 - -4.5 Network in Network 141 - -4.5.1 模型结构 141 - -4.5.2 模型创新点 141 - -4.6 GoogleNet 143 - -4.6.1 模型结构 143 - -4.6.2 Inception 结构 145 - -4.6.3 模型层次关系 146 - -4.7 Inception 系列 148 - -4.7.1 Inception v1 148 - -4.7.2 Inception v2 150 - -4.7.3 Inception v3 153 - -4.7.4 Inception V4 155 - -4.7.5 Inception-ResNet-v2 157 - -4.8 ResNet及其变体 158 - -4.8.1重新审视ResNet 159 - -4.8.2残差块 160 - -4.8.3 ResNet架构 162 - -4.8.4残差块的变体 162 - -4.8.5 ResNeXt 162 - -4.8.6 Densely Connected CNN 164 - -4.8.7 ResNet作为小型网络的组合 165 - -4.8.8 ResNet中路径的特点 166 - -4.9为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的? 167 - - -## 第五章 卷积神经网络(CNN) 170 - -5.1 卷积神经网络的组成层 170 - -5.2 卷积如何检测边缘信息? 171 - -5.2 卷积的几个基本定义? 174 - -5.2.1卷积核大小 174 - -5.2.2卷积核的步长 174 - -5.2.3边缘填充 174 - -5.2.4输入和输出通道 174 - -5.3 卷积网络类型分类? 174 - -5.3.1普通卷积 174 - -5.3.2扩张卷积 175 - +2.2监督学习、非监督学习、半监督学习、弱监督学习? 15 +2.3 监督学习有哪些步骤 16 +2.4 多实例学习? 17 +2.5 分类网络和回归的区别? 17 +2.6 什么是神经网络? 17 +2.7 常用分类算法的优缺点? 18 +2.8 正确率能很好的评估分类算法吗? 20 +2.9 分类算法的评估方法? 20 +2.10 什么样的分类器是最好的? 22 +2.11大数据与深度学习的关系 22 +2.12 理解局部最优与全局最优 23 +2.13 理解逻辑回归 24 +2.14 逻辑回归与朴素贝叶斯有什么区别? 24 +2.15 为什么需要代价函数? 25 +2.16 代价函数作用原理  25 +2.17 为什么代价函数要非负? 26 +2.18 常见代价函数? 26 +2.19为什么用交叉熵代替二次代价函数 28 +2.20 什么是损失函数? 28 +2.21 常见的损失函数 28 +2.22 逻辑回归为什么使用对数损失函数? 30 +0.00 对数损失函数是如何度量损失的? 31 +2.23 机器学习中为什么需要梯度下降? 32 +2.24 梯度下降法缺点? 32 +2.25 梯度下降法直观理解? 32 +2.23 梯度下降法算法描述? 33 +2.24 如何对梯度下降法进行调优? 35 +2.25 随机梯度和批量梯度区别? 35 +2.26 各种梯度下降法性能比较 37 +2.27计算图的导数计算图解? 37 +2.28 线性判别分析(LDA)思想总结 39 +2.29 图解LDA核心思想 39 +2.30 二类LDA算法原理? 40 +2.30 LDA算法流程总结? 41 +2.31 LDA和PCA区别? 41 +2.32 LDA优缺点? 41 +2.33 主成分分析(PCA)思想总结 42 +2.34 图解PCA核心思想 42 +2.35 PCA算法推理 43 +2.36 PCA算法流程总结 44 +2.37 PCA算法主要优缺点 45 +2.38 降维的必要性及目的 45 +2.39 KPCA与PCA的区别? 46 +2.40模型评估 47 +2.40.1模型评估常用方法? 47 +2.40.2 经验误差与泛化误差 47 +2.40.3 图解欠拟合、过拟合 48 +2.40.4 如何解决过拟合与欠拟合? 49 +2.40.5 交叉验证的主要作用? 50 +2.40.6 k折交叉验证? 50 +2.40.7 混淆矩阵 50 +2.40.8 错误率及精度 51 +2.40.9 查准率与查全率 51 +2.40.10 ROC与AUC 52 +2.40.11如何画ROC曲线? 53 +2.40.12如何计算TPR,FPR? 54 +2.40.13如何计算Auc? 56 +2.40.14为什么使用Roc和Auc评价分类器? 56 +2.40.15 直观理解AUC 56 +2.40.16 代价敏感错误率与代价曲线 57 +2.40.17 模型有哪些比较检验方法 59 +2.40.18 偏差与方差 59 +2.40.19为什么使用标准差? 60 +2.40.20 点估计思想 61 +2.40.21 点估计优良性原则? 61 +2.40.22点估计、区间估计、中心极限定理之间的联系? 62 +2.40.23 类别不平衡产生原因? 62 +2.40.24 常见的类别不平衡问题解决方法 62 +2.41 决策树 64 +2.41.1 决策树的基本原理 64 +2.41.2 决策树的三要素? 64 +2.41.3 决策树学习基本算法 65 +2.41.4 决策树算法优缺点 65 +2.40.5熵的概念以及理解 66 +2.40.6 信息增益的理解 66 +2.40.7 剪枝处理的作用及策略? 67 +2.41 支持向量机 67 +2.41.1 什么是支持向量机 67 +2.25.2 支持向量机解决的问题? 68 +2.25.2 核函数作用? 69 +2.25.3 对偶问题 69 +2.25.4 理解支持向量回归 69 +2.25.5 理解SVM(核函数) 69 +2.25.6 常见的核函数有哪些? 69 +2.25.6 软间隔与正则化 73 +2.25.7 SVM主要特点及缺点? 73 +2.26 贝叶斯 74 +2.26.1 图解极大似然估计 74 +2.26.2 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别? 76 +2.26.4 朴素与半朴素贝叶斯分类器 76 +2.26.5 贝叶斯网三种典型结构 76 +2.26.6 什么是贝叶斯错误率 76 +2.26.7 什么是贝叶斯最优错误率 76 +2.27 EM算法解决问题及实现流程 76 +2.28 为什么会产生维数灾难? 78 +2.29怎样避免维数灾难 82 +2.30聚类和降维有什么区别与联系? 82 +2.31 GBDT和随机森林的区别 83 +2.32 四种聚类方法之比较 84 +## 第三章 深度学习基础 88 +3.1基本概念 88 +3.1.1神经网络组成? 88 +3.1.2神经网络有哪些常用模型结构? 90 +3.1.3如何选择深度学习开发平台? 92 +3.1.4为什么使用深层表示 92 +3.1.5为什么深层神经网络难以训练? 93 +3.1.6深度学习和机器学习有什么不同 94 +3.2 网络操作与计算 95 +3.2.1前向传播与反向传播? 95 +3.2.2如何计算神经网络的输出? 97 +3.2.3如何计算卷积神经网络输出值? 98 +3.2.4如何计算Pooling层输出值输出值? 101 +3.2.5实例理解反向传播 102 +3.3超参数 105 +3.3.1什么是超参数? 105 +3.3.2如何寻找超参数的最优值? 105 +3.3.3超参数搜索一般过程? 106 +3.4激活函数 106 +3.4.1为什么需要非线性激活函数? 106 +3.4.2常见的激活函数及图像 107 +3.4.3 常见激活函数的导数计算? 109 +3.4.4激活函数有哪些性质? 110 +3.4.5 如何选择激活函数? 110 +3.4.6使用ReLu激活函数的优点? 111 +3.4.7什么时候可以用线性激活函数? 111 +3.4.8怎样理解Relu(<0时)是非线性激活函数? 111 +3.4.9 Softmax函数如何应用于多分类? 112 +3.5 Batch_Size 113 +3.5.1为什么需要Batch_Size? 113 +3.5.2 Batch_Size值的选择 114 +3.5.3在合理范围内,增大 Batch_Size 有何好处? 114 +3.5.4盲目增大 Batch_Size 有何坏处? 114 +3.5.5调节 Batch_Size 对训练效果影响到底如何? 114 +3.6 归一化 115 +3.6.1归一化含义? 115 +3.6.2为什么要归一化 115 +3.6.3为什么归一化能提高求解最优解速度? 115 +3.6.4 3D图解未归一化 116 +3.6.5归一化有哪些类型? 117 +3.6.6局部响应归一化作用 117 +3.6.7理解局部响应归一化公式 117 +3.6.8什么是批归一化(Batch Normalization) 118 +3.6.9批归一化(BN)算法的优点 119 +3.6.10批归一化(BN)算法流程 119 +3.6.11批归一化和群组归一化 120 +3.6.12 Weight Normalization和Batch Normalization 120 +3.7 预训练与微调(fine tuning) 121 +3.7.1为什么无监督预训练可以帮助深度学习? 121 +3.7.2什么是模型微调fine tuning 121 +3.7.3微调时候网络参数是否更新? 122 +3.7.4 fine-tuning模型的三种状态 122 +3.8权重偏差初始化 122 +3.8.1 全都初始化为0 122 +3.8.2 全都初始化为同样的值 123 +3.8.3 初始化为小的随机数 124 +3.8.4用1/sqrt(n)校准方差 125 +3.8.5稀疏初始化(Sparse Initialazation) 125 +3.8.6初始化偏差 125 +3.9 Softmax 126 +3.9.1 Softmax定义及作用 126 +3.9.2 Softmax推导 126 +3.10 理解One Hot Encodeing原理及作用? 126 +3.11 常用的优化器有哪些 127 +3.12 Dropout 系列问题 128 +3.12.1 dropout率的选择 128 +3.27 Padding 系列问题 128 +## 第四章 经典网络 129 +4.1LetNet5 129 +4.1.1模型结构 129 +4.1.2模型结构 129 +4.1.3 模型特性 131 +4.2 AlexNet 131 +4.2.1 模型结构 131 +4.2.2模型解读 131 +4.2.3模型特性 135 +4.3 可视化ZFNet-解卷积 135 +4.3.1 基本的思想及其过程 135 +4.3.2 卷积与解卷积 136 +4.3.3卷积可视化 137 +4.3.4 ZFNe和AlexNet比较 139 +4.4 VGG 140 +4.1.1 模型结构 140 +4.1.2 模型特点 140 +4.5 Network in Network 141 +4.5.1 模型结构 141 +4.5.2 模型创新点 141 +4.6 GoogleNet 143 +4.6.1 模型结构 143 +4.6.2 Inception 结构 145 +4.6.3 模型层次关系 146 +4.7 Inception 系列 148 +4.7.1 Inception v1 148 +4.7.2 Inception v2 150 +4.7.3 Inception v3 153 +4.7.4 Inception V4 155 +4.7.5 Inception-ResNet-v2 157 +4.8 ResNet及其变体 158 +4.8.1重新审视ResNet 159 +4.8.2残差块 160 +4.8.3 ResNet架构 162 +4.8.4残差块的变体 162 +4.8.5 ResNeXt 162 +4.8.6 Densely Connected CNN 164 +4.8.7 ResNet作为小型网络的组合 165 +4.8.8 ResNet中路径的特点 166 +4.9为什么现在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上调整的? 167 +## 第五章 卷积神经网络(CNN) 170 +5.1 卷积神经网络的组成层 170 +5.2 卷积如何检测边缘信息? 171 +5.2 卷积的几个基本定义? 174 +5.2.1卷积核大小 174 +5.2.2卷积核的步长 174 +5.2.3边缘填充 174 +5.2.4输入和输出通道 174 +5.3 卷积网络类型分类? 174 +5.3.1普通卷积 174 +5.3.2扩张卷积 175 5.3.3转置卷积 176 - -5.3.4可分离卷积 177 - -5.3 图解12种不同类型的2D卷积? 178 - -5.4 2D卷积与3D卷积有什么区别? 181 nao esta certo - +5.3.4可分离卷积 177 +5.3 图解12种不同类型的2D卷积? 178 +5.4 2D卷积与3D卷积有什么区别? 181 5.4.1 2D 卷积 181 - 5.4.2 3D卷积 182 - 5.5 有哪些池化方法? 183 - 5.5.1一般池化(General Pooling) 183 - 5.5.2重叠池化(OverlappingPooling) 184 - 5.5.3空金字塔池化(Spatial Pyramid Pooling) 184 - -5.6 1x1卷积作用? 186 - -5.7卷积层和池化层有什么区别?  187 - -5.8卷积核一定越大越好? 189 - -5.9每层卷积只能用一种尺寸的卷积核? 189 - -5.10怎样才能减少卷积层参数量? 190 - -5.11卷积操作时必须同时考虑通道和区域吗? 191 - -5.12采用宽卷积的好处有什么?  192 - -5.12.1窄卷积和宽卷积 192 - -5.12.2 为什么采用宽卷积? 192 - -5.13卷积层输出的深度与哪个部件的个数相同?  192 - -5.14 如何得到卷积层输出的深度? 193 - -5.15激活函数通常放在卷积神经网络的那个操作之后?  194 - -5.16 如何理解最大池化层有几分缩小? 194 - -5.17理解图像卷积与反卷积 194 - -5.17.1图像卷积 194 - -5.17.2图像反卷积 196 - -5.18不同卷积后图像大小计算? 198 - -5.18.1 类型划分 198 - -5.18.2 计算公式 199 - -5.19 步长、填充大小与输入输出关系总结? 199 - -5.19.1没有0填充,单位步长 200 - -5.19.2零填充,单位步长 200 - -5.19.3不填充,非单位步长 202 - -5.19.4零填充,非单位步长 202 - -5.20 理解反卷积和棋盘效应 204 - -5.20.1为什么出现棋盘现象? 204 - -5.20.2 有哪些方法可以避免棋盘效应? 205 - -5.21 CNN主要的计算瓶颈? 207 - -5.22 CNN的参数经验设置 207 - -5.23 提高泛化能力的方法总结 208 - -5.23.1 主要方法 208 - -5.23.2 实验证明 208 - -5.24 CNN在CV与NLP领域运用的联系与区别? 213 - -5.24.1联系 213 - -5.24.2区别 213 - -5.25 CNN凸显共性的手段? 213 - -5.25.1 局部连接 213 - -5.25.2 权值共享 214 - -5.25.3 池化操作 215 - -5.26 全卷积与Local-Conv的异同点 215 - -5.27 举例理解Local-Conv的作用 215 - -5.28 简述卷积神经网络进化史 216 - - -## 第六章 循环神经网络(RNN) 218 - -6.1 RNNs和FNNs有什么区别? 218 - -6.2 RNNs典型特点? 218 - -6.3 RNNs能干什么? 219 - -6.4 RNNs在NLP中典型应用? 220 - -6.5 RNNs训练和传统ANN训练异同点? 220 - -6.6常见的RNNs扩展和改进模型 221 - -6.6.1 Simple RNNs(SRNs) 221 - -6.6.2 Bidirectional RNNs 221 - -6.6.3 Deep(Bidirectional) RNNs 222 - -6.6.4 Echo State Networks(ESNs) 222 - -6.6.5 Gated Recurrent Unit Recurrent Neural Networks 224 - -6.6.6 LSTM Netwoorks 224 - -6.6.7 Clockwork RNNs(CW-RNNs) 225 - - -## 第七章 目标检测 228 - -7.1基于候选区域的目标检测器 228 - -7.1.1滑动窗口检测器 228 - -7.1.2选择性搜索 229 - -7.1.3 R-CNN 230 - -7.1.4边界框回归器 230 - -7.1.5 Fast R-CNN 231 - -7.1.6 ROI 池化 233 - -7.1.7 Faster R-CNN 233 - -7.1.8候选区域网络 234 - -7.1.9 R-CNN 方法的性能 236 - -7.2 基于区域的全卷积神经网络(R-FCN) 237 - -7.3 单次目标检测器 240 - -7.3.1单次检测器 241 - -7.3.2滑动窗口进行预测 241 - -7.3.3 SSD 243 - -7.4 YOLO系列 244 - -7.4.1 YOLOv1介绍 244 - -7.4.2 YOLOv1模型优缺点? 252 - -7.4.3 YOLOv2 253 - -7.4.4 YOLOv2改进策略 254 - -7.4.5 YOLOv2的训练 261 - -7.4.6 YOLO9000 261 - -7.4.7 YOLOv3 263 - -7.4.8 YOLOv3改进 264 - - -## 第八章 图像分割 269 - -8.1 传统的基于CNN的分割方法缺点? 269 - -8.1 FCN 269 - -8.1.1 FCN改变了什么? 269 - -8.1.2 FCN网络结构? 270 - -8.1.3全卷积网络举例? 271 - -8.1.4为什么CNN对像素级别的分类很难? 271 - -8.1.5全连接层和卷积层如何相互转化? 272 - -8.1.6 FCN的输入图片为什么可以是任意大小? 272 - -8.1.7把全连接层的权重W重塑成卷积层的滤波器有什么好处? 273 - -8.1.8反卷积层理解 275 - -8.1.9跳级(skip)结构 276 - -8.1.10模型训练 277 - -8.1.11 FCN缺点 280 - -8.2 U-Net 280 - -8.3 SegNet 282 - -8.4空洞卷积(Dilated Convolutions) 283 - -8.4 RefineNet 285 - -8.5 PSPNet 286 - -8.6 DeepLab系列 288 - -8.6.1 DeepLabv1 288 - -8.6.2 DeepLabv2 289 - -8.6.3 DeepLabv3 289 - -8.6.4 DeepLabv3+ 290 - -8.7 Mask-R-CNN 293 - -8.7.1 Mask-RCNN 的网络结构示意图 293 - -8.7.2 RCNN行人检测框架 293 - -8.7.3 Mask-RCNN 技术要点 294 - -8.8 CNN在基于弱监督学习的图像分割中的应用 295 - -8.8.1 Scribble标记 295 - -8.8.2 图像级别标记 297 - -8.8.3 DeepLab+bounding box+image-level labels 298 - -8.8.4统一的框架 299 - - -## 第九章 强化学习 301 - -9.1强化学习的主要特点? 301 - -9.2强化学习应用实例 302 - -9.3强化学习和监督式学习、非监督式学习的区别 303 - -9.4 强化学习主要有哪些算法? 305 - -9.5深度迁移强化学习算法 305 - -9.6分层深度强化学习算法 306 - -9.7深度记忆强化学习算法 306 - -9.8 多智能体深度强化学习算法 307 - -9.9深度强化学习算法小结 307 - - -## 第十章 迁移学习 309 - -10.1 什么是迁移学习? 309 - -10.2 什么是多任务学习? 309 - -10.3 多任务学习有什么意义? 309 - -10.4 什么是端到端的深度学习? 311 - -10.5 端到端的深度学习举例? 311 - -10.6 端到端的深度学习有什么挑战? 311 - -10.7 端到端的深度学习优缺点? 312 - - -## 第十三章 优化算法 314 - -13.1 CPU和GPU 的区别? 314 - -13.2如何解决训练样本少的问题 315 - -13.3 什么样的样本集不适合用深度学习? 315 - -13.4 有没有可能找到比已知算法更好的算法? 316 - -13.5 何为共线性, 跟过拟合有啥关联? 316 - -13.6 广义线性模型是怎被应用在深度学习中? 316 - -13.7 造成梯度消失的原因? 317 - -13.8 权值初始化方法有哪些 317 - -13.9 启发式优化算法中,如何避免陷入局部最优解? 318 - -13.10 凸优化中如何改进GD方法以防止陷入局部最优解 319 - -13.11 常见的损失函数? 319 - -13.14 如何进行特征选择(feature selection)? 321 - -13.14.1 如何考虑特征选择 321 - -13.14.2 特征选择方法分类 321 - -13.14.3 特征选择目的 322 - -13.15 梯度消失/梯度爆炸原因,以及解决方法 322 - -13.15.1 为什么要使用梯度更新规则? 322 - -13.15.2 梯度消失、爆炸原因? 323 - -13.15.3 梯度消失、爆炸的解决方案 324 - -13.16 深度学习为什么不用二阶优化 325 - -13.17 怎样优化你的深度学习系统? 326 - -13.18为什么要设置单一数字评估指标? 326 - -13.19满足和优化指标(Satisficing and optimizing metrics) 327 - -13.20 怎样划分训练/开发/测试集 328 - -13.21如何划分开发/测试集大小 329 - -13.22什么时候该改变开发/测试集和指标? 329 - -13.23 设置评估指标的意义? 330 - -13.24 什么是可避免偏差? 331 - -13.25 什么是TOP5错误率? 331 - -13.26 什么是人类水平错误率? 332 - -13.27 可避免偏差、几大错误率之间的关系? 332 - -13.28 怎样选取可避免偏差及贝叶斯错误率? 332 - -13.29 怎样减少方差? 333 - -13.30贝叶斯错误率的最佳估计 333 - -13.31举机器学习超过单个人类表现几个例子? 334 - -13.32如何改善你的模型? 334 - -13.33 理解误差分析 335 - -13.34 为什么值得花时间查看错误标记数据? 336 - -13.35 快速搭建初始系统的意义? 336 - -13.36 为什么要在不同的划分上训练及测试? 337 - -13.37 如何解决数据不匹配问题? 338 - -13.38 梯度检验注意事项? 340 - -13.39什么是随机梯度下降? 341 - -13.40什么是批量梯度下降? 341 - -13.41什么是小批量梯度下降? 341 - -13.42怎么配置mini-batch梯度下降 342 - -13.43 局部最优的问题 343 - -13.44提升算法性能思路 346 - - -## 第十四章 超参数调整 358 - -14.1 调试处理 358 - -14.2 有哪些超参数 359 - -14.3 如何选择调试值? 359 - -14.4 为超参数选择合适的范围 359 - -14.5 如何搜索超参数? 359 - - -## 第十五章 正则化 361 - -15.1 什么是正则化? 361 - -15.2 正则化原理? 361 - -15.3 为什么要正则化? 361 - -15.4 为什么正则化有利于预防过拟合? 361 - -15.5 为什么正则化可以减少方差? 362 - -15.6 L2正则化的理解? 362 - -15.7 理解dropout 正则化 362 - -15.8 有哪些dropout 正则化方法? 362 - -15.8 如何实施dropout 正则化 363 - -15.9 Python 实现dropout 正则化 363 - -15.10 L2正则化和dropout 有什么不同? 363 - -15.11 dropout有什么缺点? 363 - -15.12 其他正则化方法? 364 - - -## 参考文献 366 - +5.6 1x1卷积作用? 186 +5.7卷积层和池化层有什么区别?  187 +5.8卷积核一定越大越好? 189 +5.9每层卷积只能用一种尺寸的卷积核? 189 +5.10怎样才能减少卷积层参数量? 190 +5.11卷积操作时必须同时考虑通道和区域吗? 191 +5.12采用宽卷积的好处有什么?  192 +5.12.1窄卷积和宽卷积 192 +5.12.2 为什么采用宽卷积? 192 +5.13卷积层输出的深度与哪个部件的个数相同?  192 +5.14 如何得到卷积层输出的深度? 193 +5.15激活函数通常放在卷积神经网络的那个操作之后?  194 +5.16 如何理解最大池化层有几分缩小? 194 +5.17理解图像卷积与反卷积 194 +5.17.1图像卷积 194 +5.17.2图像反卷积 196 +5.18不同卷积后图像大小计算? 198 +5.18.1 类型划分 198 +5.18.2 计算公式 199 +5.19 步长、填充大小与输入输出关系总结? 199 +5.19.1没有0填充,单位步长 200 +5.19.2零填充,单位步长 200 +5.19.3不填充,非单位步长 202 +5.19.4零填充,非单位步长 202 +5.20 理解反卷积和棋盘效应 204 +5.20.1为什么出现棋盘现象? 204 +5.20.2 有哪些方法可以避免棋盘效应? 205 +5.21 CNN主要的计算瓶颈? 207 +5.22 CNN的参数经验设置 207 +5.23 提高泛化能力的方法总结 208 +5.23.1 主要方法 208 +5.23.2 实验证明 208 +5.24 CNN在CV与NLP领域运用的联系与区别? 213 +5.24.1联系 213 +5.24.2区别 213 +5.25 CNN凸显共性的手段? 213 +5.25.1 局部连接 213 +5.25.2 权值共享 214 +5.25.3 池化操作 215 +5.26 全卷积与Local-Conv的异同点 215 +5.27 举例理解Local-Conv的作用 215 +5.28 简述卷积神经网络进化史 216 +## 第六章 循环神经网络(RNN) 218 +6.1 RNNs和FNNs有什么区别? 218 +6.2 RNNs典型特点? 218 +6.3 RNNs能干什么? 219 +6.4 RNNs在NLP中典型应用? 220 +6.5 RNNs训练和传统ANN训练异同点? 220 +6.6常见的RNNs扩展和改进模型 221 +6.6.1 Simple RNNs(SRNs) 221 +6.6.2 Bidirectional RNNs 221 +6.6.3 Deep(Bidirectional) RNNs 222 +6.6.4 Echo State Networks(ESNs) 222 +6.6.5 Gated Recurrent Unit Recurrent Neural Networks 224 +6.6.6 LSTM Netwoorks 224 +6.6.7 Clockwork RNNs(CW-RNNs) 225 +## 第七章 目标检测 228 +7.1基于候选区域的目标检测器 228 +7.1.1滑动窗口检测器 228 +7.1.2选择性搜索 229 +7.1.3 R-CNN 230 +7.1.4边界框回归器 230 +7.1.5 Fast R-CNN 231 +7.1.6 ROI 池化 233 +7.1.7 Faster R-CNN 233 +7.1.8候选区域网络 234 +7.1.9 R-CNN 方法的性能 236 +7.2 基于区域的全卷积神经网络(R-FCN) 237 +7.3 单次目标检测器 240 +7.3.1单次检测器 241 +7.3.2滑动窗口进行预测 241 +7.3.3 SSD 243 +7.4 YOLO系列 244 +7.4.1 YOLOv1介绍 244 +7.4.2 YOLOv1模型优缺点? 252 +7.4.3 YOLOv2 253 +7.4.4 YOLOv2改进策略 254 +7.4.5 YOLOv2的训练 261 +7.4.6 YOLO9000 261 +7.4.7 YOLOv3 263 +7.4.8 YOLOv3改进 264 +## 第八章 图像分割 269 +8.1 传统的基于CNN的分割方法缺点? 269 +8.1 FCN 269 +8.1.1 FCN改变了什么? 269 +8.1.2 FCN网络结构? 270 +8.1.3全卷积网络举例? 271 +8.1.4为什么CNN对像素级别的分类很难? 271 +8.1.5全连接层和卷积层如何相互转化? 272 +8.1.6 FCN的输入图片为什么可以是任意大小? 272 +8.1.7把全连接层的权重W重塑成卷积层的滤波器有什么好处? 273 +8.1.8反卷积层理解 275 +8.1.9跳级(skip)结构 276 +8.1.10模型训练 277 +8.1.11 FCN缺点 280 +8.2 U-Net 280 +8.3 SegNet 282 +8.4空洞卷积(Dilated Convolutions) 283 +8.4 RefineNet 285 +8.5 PSPNet 286 +8.6 DeepLab系列 288 +8.6.1 DeepLabv1 288 +8.6.2 DeepLabv2 289 +8.6.3 DeepLabv3 289 +8.6.4 DeepLabv3+ 290 +8.7 Mask-R-CNN 293 +8.7.1 Mask-RCNN 的网络结构示意图 293 +8.7.2 RCNN行人检测框架 293 +8.7.3 Mask-RCNN 技术要点 294 +8.8 CNN在基于弱监督学习的图像分割中的应用 295 +8.8.1 Scribble标记 295 +8.8.2 图像级别标记 297 +8.8.3 DeepLab+bounding box+image-level labels 298 +8.8.4统一的框架 299 +## 第九章 强化学习 301 +9.1强化学习的主要特点? 301 +9.2强化学习应用实例 302 +9.3强化学习和监督式学习、非监督式学习的区别 303 +9.4 强化学习主要有哪些算法? 305 +9.5深度迁移强化学习算法 305 +9.6分层深度强化学习算法 306 +9.7深度记忆强化学习算法 306 +9.8 多智能体深度强化学习算法 307 +9.9深度强化学习算法小结 307 +## 第十章 迁移学习 309 +10.1 什么是迁移学习? 309 +10.2 什么是多任务学习? 309 +10.3 多任务学习有什么意义? 309 +10.4 什么是端到端的深度学习? 311 +10.5 端到端的深度学习举例? 311 +10.6 端到端的深度学习有什么挑战? 311 +10.7 端到端的深度学习优缺点? 312 +## 第十三章 优化算法 314 +13.1 CPU和GPU 的区别? 314 +13.2如何解决训练样本少的问题 315 +13.3 什么样的样本集不适合用深度学习? 315 +13.4 有没有可能找到比已知算法更好的算法? 316 +13.5 何为共线性, 跟过拟合有啥关联? 316 +13.6 广义线性模型是怎被应用在深度学习中? 316 +13.7 造成梯度消失的原因? 317 +13.8 权值初始化方法有哪些 317 +13.9 启发式优化算法中,如何避免陷入局部最优解? 318 +13.10 凸优化中如何改进GD方法以防止陷入局部最优解 319 +13.11 常见的损失函数? 319 +13.14 如何进行特征选择(feature selection)? 321 +13.14.1 如何考虑特征选择 321 +13.14.2 特征选择方法分类 321 +13.14.3 特征选择目的 322 +13.15 梯度消失/梯度爆炸原因,以及解决方法 322 +13.15.1 为什么要使用梯度更新规则? 322 +13.15.2 梯度消失、爆炸原因? 323 +13.15.3 梯度消失、爆炸的解决方案 324 +13.16 深度学习为什么不用二阶优化 325 +13.17 怎样优化你的深度学习系统? 326 +13.18为什么要设置单一数字评估指标? 326 +13.19满足和优化指标(Satisficing and optimizing metrics) 327 +13.20 怎样划分训练/开发/测试集 328 +13.21如何划分开发/测试集大小 329 +13.22什么时候该改变开发/测试集和指标? 329 +13.23 设置评估指标的意义? 330 +13.24 什么是可避免偏差? 331 +13.25 什么是TOP5错误率? 331 +13.26 什么是人类水平错误率? 332 +13.27 可避免偏差、几大错误率之间的关系? 332 +13.28 怎样选取可避免偏差及贝叶斯错误率? 332 +13.29 怎样减少方差? 333 +13.30贝叶斯错误率的最佳估计 333 +13.31举机器学习超过单个人类表现几个例子? 334 +13.32如何改善你的模型? 334 +13.33 理解误差分析 335 +13.34 为什么值得花时间查看错误标记数据? 336 +13.35 快速搭建初始系统的意义? 336 +13.36 为什么要在不同的划分上训练及测试? 337 +13.37 如何解决数据不匹配问题? 338 +13.38 梯度检验注意事项? 340 +13.39什么是随机梯度下降? 341 +13.40什么是批量梯度下降? 341 +13.41什么是小批量梯度下降? 341 +13.42怎么配置mini-batch梯度下降 342 +13.43 局部最优的问题 343 +13.44提升算法性能思路 346 +## 第十四章 超参数调整 358 +14.1 调试处理 358 +14.2 有哪些超参数 359 +14.3 如何选择调试值? 359 +14.4 为超参数选择合适的范围 359 +14.5 如何搜索超参数? 359 +## 第十五章 正则化 361 +15.1 什么是正则化? 361 +15.2 正则化原理? 361 +15.3 为什么要正则化? 361 +15.4 为什么正则化有利于预防过拟合? 361 +15.5 为什么正则化可以减少方差? 362 +15.6 L2正则化的理解? 362 +15.7 理解dropout 正则化 362 +15.8 有哪些dropout 正则化方法? 362 +15.8 如何实施dropout 正则化 363 +15.9 Python 实现dropout 正则化 363 +15.10 L2正则化和dropout 有什么不同? 363 +15.11 dropout有什么缺点? 363 +15.12 其他正则化方法? 364 +## 参考文献 366 +hey you are looked like a cool developer. diff --git a/Translation Required b/Translation Required new file mode 100644 index 0000000..ef4265b --- /dev/null +++ b/Translation Required @@ -0,0 +1 @@ +Please include a language translator, preferably to English diff --git a/detection/img b/detection/img new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/detection/img @@ -0,0 +1 @@ + diff --git a/img/ch2/2-1.png b/img/ch2/2-1.png new file mode 100644 index 0000000..38d1b58 Binary files /dev/null and b/img/ch2/2-1.png differ diff --git a/img/ch2/2-10.png b/img/ch2/2-10.png new file mode 100644 index 0000000..ab9b095 Binary files /dev/null and b/img/ch2/2-10.png differ diff --git a/img/ch2/2-11.png b/img/ch2/2-11.png new file mode 100644 index 0000000..5ab57c8 Binary files /dev/null and b/img/ch2/2-11.png differ diff --git a/img/ch2/2-12.png b/img/ch2/2-12.png new file mode 100644 index 0000000..38f9b1a Binary files /dev/null and b/img/ch2/2-12.png differ diff --git a/img/ch2/2-13.png b/img/ch2/2-13.png new file mode 100644 index 0000000..d0317d3 Binary files /dev/null and b/img/ch2/2-13.png differ diff --git a/img/ch2/2-14.png b/img/ch2/2-14.png new file mode 100644 index 0000000..53cb70e Binary files /dev/null and b/img/ch2/2-14.png differ diff --git a/img/ch2/2-15.png b/img/ch2/2-15.png new file mode 100644 index 0000000..fbbd76a Binary files /dev/null and b/img/ch2/2-15.png differ diff --git a/img/ch2/2-16.png b/img/ch2/2-16.png new file mode 100644 index 0000000..614c387 Binary files /dev/null and b/img/ch2/2-16.png differ diff --git a/img/ch2/2-17.png b/img/ch2/2-17.png new file mode 100644 index 0000000..e00c9b6 Binary files /dev/null and b/img/ch2/2-17.png differ diff --git a/img/ch2/2-18.jpg b/img/ch2/2-18.jpg new file mode 100644 index 0000000..3438ca2 Binary files /dev/null and b/img/ch2/2-18.jpg differ diff --git a/img/ch2/2-19.jpg b/img/ch2/2-19.jpg new file mode 100644 index 0000000..b5e4f7c Binary files /dev/null and b/img/ch2/2-19.jpg differ diff --git a/img/ch2/2-2.png b/img/ch2/2-2.png new file mode 100644 index 0000000..8bbc66c Binary files /dev/null and b/img/ch2/2-2.png differ diff --git a/img/ch2/2-20.gif b/img/ch2/2-20.gif new file mode 100644 index 0000000..3b8fbfd Binary files /dev/null and b/img/ch2/2-20.gif differ diff --git a/img/ch2/2-21.gif b/img/ch2/2-21.gif new file mode 100644 index 0000000..2bca00e Binary files /dev/null and b/img/ch2/2-21.gif differ diff --git a/img/ch2/2-22.gif b/img/ch2/2-22.gif new file mode 100644 index 0000000..bc986b1 Binary files /dev/null and b/img/ch2/2-22.gif differ diff --git a/img/ch2/2-3.png b/img/ch2/2-3.png new file mode 100644 index 0000000..2916190 Binary files /dev/null and b/img/ch2/2-3.png differ diff --git a/img/ch2/2-4.png b/img/ch2/2-4.png new file mode 100644 index 0000000..7228289 Binary files /dev/null and b/img/ch2/2-4.png differ diff --git a/img/ch2/2-5.png b/img/ch2/2-5.png new file mode 100644 index 0000000..40111f8 Binary files /dev/null and b/img/ch2/2-5.png differ diff --git a/img/ch2/2-6.png b/img/ch2/2-6.png new file mode 100644 index 0000000..f555a6b Binary files /dev/null and b/img/ch2/2-6.png differ diff --git a/img/ch2/2-7.png b/img/ch2/2-7.png new file mode 100644 index 0000000..a472df8 Binary files /dev/null and b/img/ch2/2-7.png differ diff --git a/img/ch2/2-8.png b/img/ch2/2-8.png new file mode 100644 index 0000000..be239e6 Binary files /dev/null and b/img/ch2/2-8.png differ diff --git a/img/ch2/2-9.png b/img/ch2/2-9.png new file mode 100644 index 0000000..31e457f Binary files /dev/null and b/img/ch2/2-9.png differ diff --git a/img/ch2/2.1/1.jpg b/img/ch2/2.1/1.jpg new file mode 100644 index 0000000..a4634e8 Binary files /dev/null and b/img/ch2/2.1/1.jpg differ diff --git a/img/ch2/2.1/10.jpg b/img/ch2/2.1/10.jpg new file mode 100644 index 0000000..ccd1eed Binary files /dev/null and b/img/ch2/2.1/10.jpg differ diff --git a/img/ch2/2.1/11.jpg b/img/ch2/2.1/11.jpg new file mode 100644 index 0000000..2a85456 Binary files /dev/null and b/img/ch2/2.1/11.jpg differ diff --git a/img/ch2/2.1/12.jpg b/img/ch2/2.1/12.jpg new file mode 100644 index 0000000..d62b27b Binary files /dev/null and b/img/ch2/2.1/12.jpg differ diff --git a/img/ch2/2.1/2.jpg b/img/ch2/2.1/2.jpg new file mode 100644 index 0000000..5adbf8a Binary files /dev/null and b/img/ch2/2.1/2.jpg differ diff --git a/img/ch2/2.1/3.png b/img/ch2/2.1/3.png new file mode 100644 index 0000000..8a81620 Binary files /dev/null and b/img/ch2/2.1/3.png differ diff --git a/img/ch2/2.1/4.png b/img/ch2/2.1/4.png new file mode 100644 index 0000000..ddc43d4 Binary files /dev/null and b/img/ch2/2.1/4.png differ diff --git a/img/ch2/2.1/5.jpg b/img/ch2/2.1/5.jpg new file mode 100644 index 0000000..89f9b27 Binary files /dev/null and b/img/ch2/2.1/5.jpg differ diff --git a/img/ch2/2.1/6.jpg b/img/ch2/2.1/6.jpg new file mode 100644 index 0000000..f91f625 Binary files /dev/null and b/img/ch2/2.1/6.jpg differ diff --git a/img/ch2/2.1/7.png b/img/ch2/2.1/7.png new file mode 100644 index 0000000..ba2ee2f Binary files /dev/null and b/img/ch2/2.1/7.png differ diff --git a/img/ch2/2.1/8.jpg b/img/ch2/2.1/8.jpg new file mode 100644 index 0000000..6ccddac Binary files /dev/null and b/img/ch2/2.1/8.jpg differ diff --git a/img/ch2/2.1/9.png b/img/ch2/2.1/9.png new file mode 100644 index 0000000..19201b5 Binary files /dev/null and b/img/ch2/2.1/9.png differ diff --git a/img/ch2/2.16/1.jpg b/img/ch2/2.16/1.jpg new file mode 100644 index 0000000..a4634e8 Binary files /dev/null and b/img/ch2/2.16/1.jpg differ diff --git a/img/ch2/2.16/2.png b/img/ch2/2.16/2.png new file mode 100644 index 0000000..dbebe0b Binary files /dev/null and b/img/ch2/2.16/2.png differ diff --git a/img/ch2/2.18/1.png b/img/ch2/2.18/1.png new file mode 100644 index 0000000..a80491f Binary files /dev/null and b/img/ch2/2.18/1.png differ diff --git a/img/ch2/2.25/1.png b/img/ch2/2.25/1.png new file mode 100644 index 0000000..b736f4d Binary files /dev/null and b/img/ch2/2.25/1.png differ diff --git a/img/ch2/2.27/1.png b/img/ch2/2.27/1.png new file mode 100644 index 0000000..b0ff1ce Binary files /dev/null and b/img/ch2/2.27/1.png differ diff --git a/img/ch2/2.27/2.png b/img/ch2/2.27/2.png new file mode 100644 index 0000000..fd3465e Binary files /dev/null and b/img/ch2/2.27/2.png differ diff --git a/img/ch2/2.29/1.png b/img/ch2/2.29/1.png new file mode 100644 index 0000000..a3c751d Binary files /dev/null and b/img/ch2/2.29/1.png differ diff --git a/img/ch2/2.34/1.png b/img/ch2/2.34/1.png new file mode 100644 index 0000000..fff539b Binary files /dev/null and b/img/ch2/2.34/1.png differ diff --git a/img/ch2/2.40.10/1.png b/img/ch2/2.40.10/1.png new file mode 100644 index 0000000..04e82ec Binary files /dev/null and b/img/ch2/2.40.10/1.png differ diff --git a/img/ch2/2.40.11/1.jpg b/img/ch2/2.40.11/1.jpg new file mode 100644 index 0000000..c928da5 Binary files /dev/null and b/img/ch2/2.40.11/1.jpg differ diff --git a/img/ch2/2.40.15/1.png b/img/ch2/2.40.15/1.png new file mode 100644 index 0000000..2bf0c1d Binary files /dev/null and b/img/ch2/2.40.15/1.png differ diff --git a/img/ch2/2.40.3/1.png b/img/ch2/2.40.3/1.png new file mode 100644 index 0000000..0a1fa4a Binary files /dev/null and b/img/ch2/2.40.3/1.png differ diff --git a/img/ch2/2.40.3/2.png b/img/ch2/2.40.3/2.png new file mode 100644 index 0000000..e5c69de Binary files /dev/null and b/img/ch2/2.40.3/2.png differ diff --git a/img/ch2/2.40.3/3.png b/img/ch2/2.40.3/3.png new file mode 100644 index 0000000..ef3d80a Binary files /dev/null and b/img/ch2/2.40.3/3.png differ diff --git a/img/ch2/2.6/1.png b/img/ch2/2.6/1.png new file mode 100644 index 0000000..387bbeb Binary files /dev/null and b/img/ch2/2.6/1.png differ diff --git a/img/ch2/2.9/1.png b/img/ch2/2.9/1.png new file mode 100644 index 0000000..7a93ae5 Binary files /dev/null and b/img/ch2/2.9/1.png differ diff --git a/img/ch2/2.9/2.jpg b/img/ch2/2.9/2.jpg new file mode 100644 index 0000000..f3b23ce Binary files /dev/null and b/img/ch2/2.9/2.jpg differ diff --git a/img/ch5/img1.png b/img/ch5/img1.png new file mode 100644 index 0000000..d4e31d0 Binary files /dev/null and b/img/ch5/img1.png differ diff --git a/img/ch5/img10.png b/img/ch5/img10.png new file mode 100644 index 0000000..7090529 Binary files /dev/null and b/img/ch5/img10.png differ diff --git a/img/ch5/img11.png b/img/ch5/img11.png new file mode 100644 index 0000000..58b86a5 Binary files /dev/null and b/img/ch5/img11.png differ diff --git a/img/ch5/img12.png b/img/ch5/img12.png new file mode 100644 index 0000000..aa50dd1 Binary files /dev/null and b/img/ch5/img12.png differ diff --git a/img/ch5/img13.png b/img/ch5/img13.png new file mode 100644 index 0000000..cf45e93 Binary files /dev/null and b/img/ch5/img13.png differ diff --git a/img/ch5/img14.png b/img/ch5/img14.png new file mode 100644 index 0000000..8cec1fa Binary files /dev/null and b/img/ch5/img14.png differ diff --git a/img/ch5/img15.png b/img/ch5/img15.png new file mode 100644 index 0000000..02b63a3 Binary files /dev/null and b/img/ch5/img15.png differ diff --git a/img/ch5/img16.png b/img/ch5/img16.png new file mode 100644 index 0000000..495a52a Binary files /dev/null and b/img/ch5/img16.png differ diff --git a/img/ch5/img17.png b/img/ch5/img17.png new file mode 100644 index 0000000..f1bcdcf Binary files /dev/null and b/img/ch5/img17.png differ diff --git a/img/ch5/img18.png b/img/ch5/img18.png new file mode 100644 index 0000000..e83f8c8 Binary files /dev/null and b/img/ch5/img18.png differ diff --git a/img/ch5/img19.png b/img/ch5/img19.png new file mode 100644 index 0000000..5466b1d Binary files /dev/null and b/img/ch5/img19.png differ diff --git a/img/ch5/img2.png b/img/ch5/img2.png new file mode 100644 index 0000000..6377b60 Binary files /dev/null and b/img/ch5/img2.png differ diff --git a/img/ch5/img20.png b/img/ch5/img20.png new file mode 100644 index 0000000..a5a1b9a Binary files /dev/null and b/img/ch5/img20.png differ diff --git a/img/ch5/img21.png b/img/ch5/img21.png new file mode 100644 index 0000000..b5607b1 Binary files /dev/null and b/img/ch5/img21.png differ diff --git a/img/ch5/img22.png b/img/ch5/img22.png new file mode 100644 index 0000000..b6dab5d Binary files /dev/null and b/img/ch5/img22.png differ diff --git a/img/ch5/img23.png b/img/ch5/img23.png new file mode 100644 index 0000000..c5c97d3 Binary files /dev/null and b/img/ch5/img23.png differ diff --git a/img/ch5/img24.png b/img/ch5/img24.png new file mode 100644 index 0000000..0511c0f Binary files /dev/null and b/img/ch5/img24.png differ diff --git a/img/ch5/img25.png b/img/ch5/img25.png new file mode 100644 index 0000000..96a2b8e Binary files /dev/null and b/img/ch5/img25.png differ diff --git a/img/ch5/img26.png b/img/ch5/img26.png new file mode 100644 index 0000000..6f10d28 Binary files /dev/null and b/img/ch5/img26.png differ diff --git a/img/ch5/img27.png b/img/ch5/img27.png new file mode 100644 index 0000000..9e1e5ce Binary files /dev/null and b/img/ch5/img27.png differ diff --git a/img/ch5/img28.png b/img/ch5/img28.png new file mode 100644 index 0000000..29036d3 Binary files /dev/null and b/img/ch5/img28.png differ diff --git a/img/ch5/img29.png b/img/ch5/img29.png new file mode 100644 index 0000000..ce835bb Binary files /dev/null and b/img/ch5/img29.png differ diff --git a/img/ch5/img3.png b/img/ch5/img3.png new file mode 100644 index 0000000..f7feb54 Binary files /dev/null and b/img/ch5/img3.png differ diff --git a/img/ch5/img30.png b/img/ch5/img30.png new file mode 100644 index 0000000..69313c9 Binary files /dev/null and b/img/ch5/img30.png differ diff --git a/img/ch5/img31.png b/img/ch5/img31.png new file mode 100644 index 0000000..4888547 Binary files /dev/null and b/img/ch5/img31.png differ diff --git a/img/ch5/img32.png b/img/ch5/img32.png new file mode 100644 index 0000000..90ac20f Binary files /dev/null and b/img/ch5/img32.png differ diff --git a/img/ch5/img33.png b/img/ch5/img33.png new file mode 100644 index 0000000..c7a934d Binary files /dev/null and b/img/ch5/img33.png differ diff --git a/img/ch5/img34.png b/img/ch5/img34.png new file mode 100644 index 0000000..8952e4c Binary files /dev/null and b/img/ch5/img34.png differ diff --git a/img/ch5/img35.png b/img/ch5/img35.png new file mode 100644 index 0000000..cc7112f Binary files /dev/null and b/img/ch5/img35.png differ diff --git a/img/ch5/img36.png b/img/ch5/img36.png new file mode 100644 index 0000000..0ad79de Binary files /dev/null and b/img/ch5/img36.png differ diff --git a/img/ch5/img37.png b/img/ch5/img37.png new file mode 100644 index 0000000..ea1a3a1 Binary files /dev/null and b/img/ch5/img37.png differ diff --git a/img/ch5/img38.png b/img/ch5/img38.png new file mode 100644 index 0000000..1be3b9b Binary files /dev/null and b/img/ch5/img38.png differ diff --git a/img/ch5/img39.png b/img/ch5/img39.png new file mode 100644 index 0000000..91b0525 Binary files /dev/null and b/img/ch5/img39.png differ diff --git a/img/ch5/img4.png b/img/ch5/img4.png new file mode 100644 index 0000000..39cbf01 Binary files /dev/null and b/img/ch5/img4.png differ diff --git a/img/ch5/img40.png b/img/ch5/img40.png new file mode 100644 index 0000000..7a1b18b Binary files /dev/null and b/img/ch5/img40.png differ diff --git a/img/ch5/img41.png b/img/ch5/img41.png new file mode 100644 index 0000000..2cef8c2 Binary files /dev/null and b/img/ch5/img41.png differ diff --git a/img/ch5/img42.png b/img/ch5/img42.png new file mode 100644 index 0000000..90ac20f Binary files /dev/null and b/img/ch5/img42.png differ diff --git a/img/ch5/img43.png b/img/ch5/img43.png new file mode 100644 index 0000000..cc7112f Binary files /dev/null and b/img/ch5/img43.png differ diff --git a/img/ch5/img44.png b/img/ch5/img44.png new file mode 100644 index 0000000..67a400f Binary files /dev/null and b/img/ch5/img44.png differ diff --git a/img/ch5/img45.png b/img/ch5/img45.png new file mode 100644 index 0000000..fdbc0ae Binary files /dev/null and b/img/ch5/img45.png differ diff --git a/img/ch5/img46.png b/img/ch5/img46.png new file mode 100644 index 0000000..59d5e1c Binary files /dev/null and b/img/ch5/img46.png differ diff --git a/img/ch5/img47.png b/img/ch5/img47.png new file mode 100644 index 0000000..61dab94 Binary files /dev/null and b/img/ch5/img47.png differ diff --git a/img/ch5/img48.png b/img/ch5/img48.png new file mode 100644 index 0000000..04864d7 Binary files /dev/null and b/img/ch5/img48.png differ diff --git a/img/ch5/img49.png b/img/ch5/img49.png new file mode 100644 index 0000000..3ec0792 Binary files /dev/null and b/img/ch5/img49.png differ diff --git a/img/ch5/img5.png b/img/ch5/img5.png new file mode 100644 index 0000000..9b3df9b Binary files /dev/null and b/img/ch5/img5.png differ diff --git a/img/ch5/img50.png b/img/ch5/img50.png new file mode 100644 index 0000000..e536bc5 Binary files /dev/null and b/img/ch5/img50.png differ diff --git a/img/ch5/img51.png b/img/ch5/img51.png new file mode 100644 index 0000000..2225942 Binary files /dev/null and b/img/ch5/img51.png differ diff --git a/img/ch5/img52.png b/img/ch5/img52.png new file mode 100644 index 0000000..bcf4985 Binary files /dev/null and b/img/ch5/img52.png differ diff --git a/img/ch5/img53.png b/img/ch5/img53.png new file mode 100644 index 0000000..21e84c4 Binary files /dev/null and b/img/ch5/img53.png differ diff --git a/img/ch5/img54.png b/img/ch5/img54.png new file mode 100644 index 0000000..78e8cbd Binary files /dev/null and b/img/ch5/img54.png differ diff --git a/img/ch5/img55.png b/img/ch5/img55.png new file mode 100644 index 0000000..e263d2c Binary files /dev/null and b/img/ch5/img55.png differ diff --git a/img/ch5/img56.png b/img/ch5/img56.png new file mode 100644 index 0000000..2cd7ead Binary files /dev/null and b/img/ch5/img56.png differ diff --git a/img/ch5/img57.png b/img/ch5/img57.png new file mode 100644 index 0000000..d2db12f Binary files /dev/null and b/img/ch5/img57.png differ diff --git a/img/ch5/img58.png b/img/ch5/img58.png new file mode 100644 index 0000000..c611a13 Binary files /dev/null and b/img/ch5/img58.png differ diff --git a/img/ch5/img59.png b/img/ch5/img59.png new file mode 100644 index 0000000..b5af7da Binary files /dev/null and b/img/ch5/img59.png differ diff --git a/img/ch5/img6.png b/img/ch5/img6.png new file mode 100644 index 0000000..e14d9fe Binary files /dev/null and b/img/ch5/img6.png differ diff --git a/img/ch5/img60.png b/img/ch5/img60.png new file mode 100644 index 0000000..78364f6 Binary files /dev/null and b/img/ch5/img60.png differ diff --git a/img/ch5/img61.png b/img/ch5/img61.png new file mode 100644 index 0000000..014afde Binary files /dev/null and b/img/ch5/img61.png differ diff --git a/img/ch5/img62.png b/img/ch5/img62.png new file mode 100644 index 0000000..4bbb2f1 Binary files /dev/null and b/img/ch5/img62.png differ diff --git a/img/ch5/img63.png b/img/ch5/img63.png new file mode 100644 index 0000000..4b03288 Binary files /dev/null and b/img/ch5/img63.png differ diff --git a/img/ch5/img64.png b/img/ch5/img64.png new file mode 100644 index 0000000..ae51d2c Binary files /dev/null and b/img/ch5/img64.png differ diff --git a/img/ch5/img65.png b/img/ch5/img65.png new file mode 100644 index 0000000..ac720b6 Binary files /dev/null and b/img/ch5/img65.png differ diff --git a/img/ch5/img66.png b/img/ch5/img66.png new file mode 100644 index 0000000..e5dac8d Binary files /dev/null and b/img/ch5/img66.png differ diff --git a/img/ch5/img67.png b/img/ch5/img67.png new file mode 100644 index 0000000..9691012 Binary files /dev/null and b/img/ch5/img67.png differ diff --git a/img/ch5/img7.png b/img/ch5/img7.png new file mode 100644 index 0000000..601f8aa Binary files /dev/null and b/img/ch5/img7.png differ diff --git a/img/ch5/img8.png b/img/ch5/img8.png new file mode 100644 index 0000000..ab4c9de Binary files /dev/null and b/img/ch5/img8.png differ diff --git a/img/ch5/img9.png b/img/ch5/img9.png new file mode 100644 index 0000000..8e9f54a Binary files /dev/null and b/img/ch5/img9.png differ diff --git a/img/ch8/8-10-1.png b/img/ch8/8-10-1.png new file mode 100644 index 0000000..b9eff12 Binary files /dev/null and b/img/ch8/8-10-1.png differ diff --git a/img/ch8/8-10-2.png b/img/ch8/8-10-2.png new file mode 100644 index 0000000..03d036f Binary files /dev/null and b/img/ch8/8-10-2.png differ diff --git a/img/ch8/8-10-3.png b/img/ch8/8-10-3.png new file mode 100644 index 0000000..ac5a751 Binary files /dev/null and b/img/ch8/8-10-3.png differ diff --git a/img/ch9/9-1.png b/img/ch9/9-1.png new file mode 100644 index 0000000..e42310f Binary files /dev/null and b/img/ch9/9-1.png differ diff --git a/img/ch9/9-2.png b/img/ch9/9-2.png new file mode 100644 index 0000000..5352e1f Binary files /dev/null and b/img/ch9/9-2.png differ diff --git a/img/ch9/9-3.png b/img/ch9/9-3.png new file mode 100644 index 0000000..2342903 Binary files /dev/null and b/img/ch9/9-3.png differ diff --git a/img/ch9/9-4.png b/img/ch9/9-4.png new file mode 100644 index 0000000..ae5ffa0 Binary files /dev/null and b/img/ch9/9-4.png differ diff --git a/img/newch8 b/img/newch8 index e0596e4..dad6e12 100644 --- a/img/newch8 +++ b/img/newch8 @@ -1 +1,4 @@ + / newch8 +======= +