diff --git "a/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" "b/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" index 4e3ec832..7ec29858 100644 --- "a/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" +++ "b/ch03_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200/\347\254\254\344\270\211\347\253\240_\346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.md" @@ -145,7 +145,7 @@ $$ ![](./img/ch3/3.2.1.1.png) -假设上一层结点 $ i,j,k,... ​$ 等一些结点与本层的结点 $ w ​$ 有连接,那么结点 $ w ​$ 的值怎么算呢?就是通过上一层的 $ i,j,k,... ​$ 等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如 $ReLu​$,$sigmoid​$ 等函数,最后得到的结果就是本层结点 $ w ​$ 的输出。 +假设上一层结点 $ i,j,k,... $ 等一些结点与本层的结点 $ w $ 有连接,那么结点 $ w $ 的值怎么算呢?就是通过上一层的 $ i,j,k,... $ 等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如 $ReLu$,$sigmoid$ 等函数,最后得到的结果就是本层结点 $ w $ 的输出。 最终不断的通过这种方法一层层的运算,得到输出层结果。 @@ -155,13 +155,13 @@ $$ 由于我们前向传播最终得到的结果,以分类为例,最终总是有误差的,那么怎么减少误差呢,当前应用广泛的一个算法就是梯度下降算法,但是求梯度就要求偏导数,下面以图中字母为例讲解一下: -设最终误差为 $ E $且输出层的激活函数为线性激活函数,对于输出那么 $ E $ 对于输出节点 $ y_l $ 的偏导数是 $ y_l - t_l $,其中 $ t_l $ 是真实值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函数,$ z_l $ 是上面提到的加权和,那么这一层的 $ E $ 对于 $ z_l $ 的偏导数为 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一层也是这么计算,只不过 $ \frac{\partial E}{\partial y_k} $ 计算方法变了,一直反向传播到输入层,最后有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j ​$。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果。 +设最终误差为 $ E $且输出层的激活函数为线性激活函数,对于输出那么 $ E $ 对于输出节点 $ y_l $ 的偏导数是 $ y_l - t_l $,其中 $ t_l $ 是真实值,$ \frac{\partial y_l}{\partial z_l} $ 是指上面提到的激活函数,$ z_l $ 是上面提到的加权和,那么这一层的 $ E $ 对于 $ z_l $ 的偏导数为 $ \frac{\partial E}{\partial z_l} = \frac{\partial E}{\partial y_l} \frac{\partial y_l}{\partial z_l} $。同理,下一层也是这么计算,只不过 $ \frac{\partial E}{\partial y_k} $ 计算方法变了,一直反向传播到输入层,最后有 $ \frac{\partial E}{\partial x_i} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial z_j} $,且 $ \frac{\partial z_j}{\partial x_i} = w_i j $。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果。 ### 3.2.2 如何计算神经网络的输出? ![](./img/ch3/3.2.2.1.png) -如上图,输入层有三个节点,我们将其依次编号为 1、2、3;隐藏层的 4 个节点,编号依次为 4、5、6、7;最后输出层的两个节点编号为 8、9。比如,隐藏层的节点 4,它和输入层的三个节点 1、2、3 之间都有连接,其连接上的权重分别为是 $ w_{41}, w_{42}, w_{43} ​$。 +如上图,输入层有三个节点,我们将其依次编号为 1、2、3;隐藏层的 4 个节点,编号依次为 4、5、6、7;最后输出层的两个节点编号为 8、9。比如,隐藏层的节点 4,它和输入层的三个节点 1、2、3 之间都有连接,其连接上的权重分别为是 $ w_{41}, w_{42}, w_{43} $。 为了计算节点 4 的输出值,我们必须先得到其所有上游节点(也就是节点 1、2、3)的输出值。节点 1、2、3 是输入层的节点,所以,他们的输出值就是输入向量本身。按照上图画出的对应关系,可以看到节点 1、2、3 的输出值分别是 $ x_1, x_2, x_3 $。 @@ -173,13 +173,13 @@ $$ 同样,我们可以继续计算出节点 5、6、7 的输出值 $ a_5, a_6, a_7 $。 -计算输出层的节点 8 的输出值 $ y_1 ​$: +计算输出层的节点 8 的输出值 $ y_1 $: $$ y_1 = \sigma(w^T \cdot a) = \sigma(w_{84}a_4 + w_{85}a_5 + w_{86}a_6 + w_{87}a_7 + w_{8b}) $$ -其中 $ w_{8b} ​$ 是节点 8 的偏置项。 +其中 $ w_{8b} $ 是节点 8 的偏置项。 同理,我们还可以计算出 $ y_2 $。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 $ x_1, x_2, x_3, x_4 $ 时,神经网络的输出向量 $ y_1, y_2 $ 。这里我们也看到,输出向量的维度和输出层神经元个数相同。 @@ -197,7 +197,7 @@ $$ a_{i,j} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{i+m, j+n} + w_b ) $$ -当步长为 $1$ 时,计算 feature map 元素 $ a_{0,0} ​$ 如下: +当步长为 $1$ 时,计算 feature map 元素 $ a_{0,0} $ 如下: $$ a_{0,0} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{0+m, 0+n} + w_b ) @@ -242,7 +242,7 @@ $$ ​ 说明 Feature Map 宽度是2。同样,我们也可以计算出 Feature Map 高度也是 2。 -如果卷积前的图像深度为 $ D ​$,那么相应的 filter 的深度也必须为 $ D ​$。深度大于 1 的卷积计算公式: +如果卷积前的图像深度为 $ D $,那么相应的 filter 的深度也必须为 $ D $。深度大于 1 的卷积计算公式: $$ a_{i,j} = f(\sum_{d=0}^{D-1} \sum_{m=0}^{F-1} \sum_{n=0}^{F-1} w_{d,m,n} x_{d,i+m,j+n} + w_b) @@ -296,7 +296,7 @@ $$ 1. 输入层 --> 输出层 -计算神经元 $ h1 ​$ 的输入加权和: +计算神经元 $ h1 $ 的输入加权和: $$ net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1\\ @@ -319,7 +319,7 @@ $$ 2. 隐含层-->输出层:    -计算输出层神经元 $ o1 ​$ 和 $ o2 ​$ 的值: +计算输出层神经元 $ o1 $ 和 $ o2 $ 的值: $$ net_{o1} = w_5 * out_{h1} + w_6 * out_{h2} + b_2 * 1 @@ -333,7 +333,7 @@ $$ out_{o1} = \frac{1}{1 + e^{-net_{o1}}} = \frac{1}{1 + e^{1.105905967}} = 0.75136079 $$ -这样前向传播的过程就结束了,我们得到输出值为 $ [0.75136079 , 0.772928465] $,与实际值 $ [0.01 , 0.99] ​$ 相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。 +这样前向传播的过程就结束了,我们得到输出值为 $ [0.75136079 , 0.772928465] $,与实际值 $ [0.01 , 0.99] $ 相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。 **反向传播 ** @@ -356,7 +356,7 @@ $E_{total} = E_{o1} + E_{o2} = 0.274811083 + 0.023560026 = 0.298371109$. ​ 2.隐含层 --> 输出层的权值更新: -以权重参数 $ w5 ​$ 为例,如果我们想知道 $ w5 ​$ 对整体误差产生了多少影响,可以用整体误差对 $ w5 ​$ 求偏导求出:(链式法则) +以权重参数 $ w5 $ 为例,如果我们想知道 $ w5 $ 对整体误差产生了多少影响,可以用整体误差对 $ w5 $ 求偏导求出:(链式法则) $$ \frac{\partial E_{total}}{\partial w5} = \frac{\partial E_{total}}{\partial out_{o1}} * \frac{\partial out_{o1}}{\partial net_{o1}} * \frac{\partial net_{o1}}{\partial w5} @@ -576,7 +576,7 @@ $$ ![](./img/ch3/3.4.9.1.png) -继续看下面的图,三个输入通过 softmax 后得到一个数组 $ [0.05 , 0.10 , 0.85] ​$,这就是 soft 的功能。 +继续看下面的图,三个输入通过 softmax 后得到一个数组 $ [0.05 , 0.10 , 0.85] $,这就是 soft 的功能。 ![](./img/ch3/3.4.9.2.png) @@ -584,14 +584,14 @@ $$ ![****](./img/ch3/3.4.9.3.png) -​ softmax 直白来说就是将原来输出是 $ 3,1,-3 ​$ 通过 softmax 函数一作用,就映射成为 $ (0,1) ​$ 的值,而这些值的累和为 $ 1 ​$(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标! +​ softmax 直白来说就是将原来输出是 $ 3,1,-3 $ 通过 softmax 函数一作用,就映射成为 $ (0,1) $ 的值,而这些值的累和为 $ 1 $(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标! ### 3.4.11 交叉熵代价函数定义及其求导推导 (**贡献者:黄钦建-华南理工大学**) -​ 神经元的输出就是 a = σ(z),其中$z=\sum w_{j}i_{j}+b​$是输⼊的带权和。 +​ 神经元的输出就是 a = σ(z),其中$z=\sum w_{j}i_{j}+b$是输⼊的带权和。 $C=-\frac{1}{n}\sum[ylna+(1-y)ln(1-a)]$ @@ -619,7 +619,7 @@ $\frac{\partial C}{\partial w_{j}}=\frac{1}{n}\sum x_{j}({\varsigma}(z)-y)$ ​ 根据类似的⽅法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到: -$\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)​$ +$\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)$ ​ 再⼀次, 这避免了⼆次代价函数中类似${\varsigma}'(z)$项导致的学习缓慢。 @@ -630,12 +630,39 @@ $\frac{\partial C}{\partial b}=\frac{1}{n}\sum ({\varsigma}(z)-y)​$ 首先看如下两个函数的求导: -$tanh^{,}(x)=1-tanh(x)^{2}\in (0,1)​$ +$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.4.13 + +### 3.4.12 内聚外斥 - Center Loss + +**(贡献者:李世轩-加州大学伯克利分校)** + +在计算机视觉任务中, 由于其简易性, 良好的表现, 与对分类任务的概率性理解, Cross Entropy Loss (交叉熵代价) + Softmax 组合被广泛应用于以分类任务为代表的任务中. 在此应用下, 我们可将其学习过程进一步理解为: 更相似(同类/同物体)的图像在特征域中拥有“更近的距离”, 相反则”距离更远“. 换而言之, 我们可以进一步理解为其学习了一种低类内距离(Intra-class Distance)与高类间距离(Inter-class Distance)的特征判别模型. 在此Center Loss则可以高效的计算出这种具判别性的特征. 不同于传统的Softmax Loss, Center Loss通过学习“特征中心”从而最小化其类内距离. 其表达形式如下: + +$L_{C} = \frac{1}{2}\sum^{m}_{i=1}||x_{i}-c_{y_{i}}||^{2}_{2}$ + +其中$x_{i}$表示FCN(全连接层)之前的特征, $c_{y_{i}}$表示第$y_{i} $个类别的特征中心, $m$表示mini-batch的大小. 我们很清楚的看到$L_{C}$的终极目标为最小化每个特征与其特征中心的方差, 即最小化类内距离. 其迭代公式为: + +$\frac{\partial L_{C}}{\partial x_{i}}=x_{i}-c_{y_{i}}$ + +$\Delta{c_{j}} = \frac{\sum^{m}_{i=1}\delta(y_{i}=j)\cdot(c_{j}-x_{i})}{1+\sum^{m}_{i=1}\delta(y_{i}=j)}$ + +其中$ \delta(condition)=\left\{ +\begin{array}{rcl} +1 & & {condition\ is\ True}\\ +0 & & {otherwise}\\ \end{array} \right.$ + +结合Softmax, 我们可以搭配二者使用, 适当平衡这两种监督信号. 在Softmax拉开类间距离的同时, 利用Center Loss最小化类内距离. 例如: + +$\begin{eqnarray}L & = & L_{S} + \lambda L_{C} \\ &=& -\sum^{m}_{i=1}log\frac{e^{W_{y}^{T}x_{i}+b_{y_{i}}}}{\sum^{m}_{i=1}e^{W^{T}_{j}x_{i}+b_{j}}} + \frac{\lambda}{2}\sum^{m}_{i=1}||x_{i}-c_{y_{i}}||^{2}_{2}\\ \end{eqnarray}$ + +即便如此, Center Loss仍有它的不足之处: 其特征中心为存储在网络模型之外的额外参数, 不能与模型参数一同优化. 这些额外参数将与记录每一步特征变化的自动回归均值估计(autoregressive mean estimator)进行更迭. 当需要学习的类别数量较大时, mini-batch可能无力提供足够的样本进行均值估计. 若此Center Loss将需要平衡两种监督损失来以确定更迭, 其过程需要一个对平衡超参数的搜索过程, 使得其择值消耗昂贵. + ## 3.5 Batch_Size ### 3.5.1 为什么需要 Batch_Size? @@ -683,7 +710,7 @@ Batch的选择,首先决定的是下降的方向。 ### 3.6.1 归一化含义? -1. 归纳统一样本的统计分布性。归一化在 $ 0-1​$ 之间是统计的概率分布,归一化在$ -1--+1​$ 之间是统计的坐标分布。 +1. 归纳统一样本的统计分布性。归一化在 $ 0-1$ 之间是统计的概率分布,归一化在$ -1--+1$ 之间是统计的坐标分布。 2. 无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测,且 sigmoid 函数的取值是 0 到 1 之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。 @@ -758,7 +785,7 @@ b_{x,y}^i = a_{x,y}^i / (k + \alpha \sum_{j=max(0, i-n/2)}^{min(N-1, i+n/2)}(a_{ $$ 其中, -1) $ a ​$:表示卷积层(包括卷积操作和池化操作)后的输出结果,是一个四维数组[batch,height,width,channel]。 +1) $ a $:表示卷积层(包括卷积操作和池化操作)后的输出结果,是一个四维数组[batch,height,width,channel]。 - batch:批次数(每一批为一张图片)。 - height:图片高度。 @@ -771,7 +798,7 @@ $$ 4) $ a $,$ n/2 $, $ k $ 分别表示函数中的 input,depth_radius,bias。参数 $ k, n, \alpha, \beta $ 都是超参数,一般设置 $ k=2, n=5, \alpha=1*e-4, \beta=0.75 $ -5) $ \sum ​$:$ \sum ​$ 叠加的方向是沿着通道方向的,即每个点值的平方和是沿着 $ a ​$ 中的第 3 维 channel 方向的,也就是一个点同方向的前面 $ n/2 ​$ 个通道(最小为第 $ 0 ​$ 个通道)和后 $ n/2 ​$ 个通道(最大为第 $ d-1 ​$ 个通道)的点的平方和(共 $ n+1 ​$ 个点)。而函数的英文注解中也说明了把 input 当成是 $ d ​$ 个 3 维的矩阵,说白了就是把 input 的通道数当作 3 维矩阵的个数,叠加的方向也是在通道方向。 +5) $ \sum $:$ \sum $ 叠加的方向是沿着通道方向的,即每个点值的平方和是沿着 $ a $ 中的第 3 维 channel 方向的,也就是一个点同方向的前面 $ n/2 $ 个通道(最小为第 $ 0 $ 个通道)和后 $ n/2 $ 个通道(最大为第 $ d-1 $ 个通道)的点的平方和(共 $ n+1 $ 个点)。而函数的英文注解中也说明了把 input 当成是 $ d $ 个 3 维的矩阵,说白了就是把 input 的通道数当作 3 维矩阵的个数,叠加的方向也是在通道方向。 简单的示意图如下: @@ -806,7 +833,7 @@ $$ \mu_{\beta} = \frac{1}{m} \sum_{i=1}^m(x_i) $$ -其中,$ m ​$ 是此次训练样本 batch 的大小。 +其中,$ m $ 是此次训练样本 batch 的大小。 2. 计算上一层输出数据的标准差 @@ -959,7 +986,7 @@ $$ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b;x,y) = \delta_i^{(l+1)} $$ -$ \delta ​$ 的计算公式 +$ \delta $ 的计算公式 $$ \delta_i^{(l)} = (\sum_{j=1}^{s_{t+1}} W_{ji}^{(l)} \delta_j^{(l+1)} ) f^{\prime}(z_i^{(l)}) diff --git a/qun5.png b/qun5.png index f5811573..95c1b8d8 100644 Binary files a/qun5.png and b/qun5.png differ