文章目录
1 Classification as Regression?
我们已经知道,Regression就是输入一个向量,然后输出一个数值,我们希望输出的数值跟某一个label,也就是我们要学习的目标,越接近越好。
![image-20210320165723587](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320165723587.png)
现在问题来到了如何做Classification,那一个很自然的想法就是:可不可以用Regression来处理Classification的问题呢?
![image-20210320170048002](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320170048002.png)
有这样一个非常naive的想法,那就是假设我们用Regression的方法后输出的值比较接近1,就说明是Class1,比较接近2,就说明是Class2,以此类推。这样就可以用Regression的方法完成Classification的任务。
但是这会是一个好方法吗,如果你仔细想想的话,答案可能是否定的。
![image-20210320170353342](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320170353342.png)
因为如果你假设说Class one就是编号1,Class two就是编号2,Class3就是编号3,意味着你觉得Class1跟Class2比较像,然后Class1跟Class3它是比较不像。假如真的是有这种关系的话,比如Class1 2 3是一年级,二年级,三年级,那可能一年级真的跟二年级关系比较接近,而跟三年级比较远;但如果你的三个Class本身并没有什么特定的关系,那使用这种方法就可能带来一些意外的结果。
所有对于这种互相之间没有关系的Class进行区分,我们可以使用one-hot编码的方法。
2 Class as one-hot vector
One-Hot 编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
![image-20210320170948476](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320170948476.png)
如果有三个Class,我们把Class1编码为 [ 1 0 0 ] \begin{bmatrix}{1} \\\ {0}\\\ {0}\end{bmatrix} ⎣⎡1 0 0⎦⎤,如果是Class2编码为 [ 0 1 0 ] \begin{bmatrix} {0}\\\ {1}\\\ {0}\end{bmatrix} ⎣⎡0 1 0⎦⎤,如果是Class3编码为 [ 0 0 1 ] \begin{bmatrix} {0}\\\ {0}\\\ {1}\end{bmatrix} ⎣⎡0 0 1⎦⎤,每一个Class,都用一个 One-hot vector 来表示。
使用One-hot vector的表示方式,就可以看到这些Class两两之间的的距离都是一样的,这就保证了这些Class之间并没有相关性,
如果我们今天的目标y hat是一个向量 比如说,ŷ是有三个element的向量,那我们的network,也应该要Output的维度也是三个数字才行
![image-20210320185241328](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320185241328.png)
到目前为止我们所讲的network,其实都只Output一个数值,因为我们过去做的都是Regression的问题,所以只Output一个数字,但其实从一个数值改到三个数值,本质上是没有什么不同的,你可以Output一个数值,那么把本来Output一个数值的方法重复三次,你就可以Output三个数值。
![image-20210320185906259](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320185906259.png)
所以你就可以Input一个feature的Vector,然后产生 y 1 y_1 y1, y 2 y_2 y2, y 3 y_3 y3,然后希望 [ y 1 y 2 y 3 ] \begin{bmatrix}{y_1} \\\ {y_2}\\\ {y_3}\end{bmatrix} ⎣⎡y1 y2 y3⎦⎤跟我们的目标类的向量表示越接近越好(就比如 [ 1 0 0 ] \begin{bmatrix}{1} \\\ {0}\\\ {0}\end{bmatrix} ⎣⎡1 0 0⎦⎤)。
3 Classification with softmax
在Regression的过程中,我们输入一个 x x x,输出一个 y y y,希望这个 y y y 要跟 label ŷ 越接近越好:
![image-20210320190545539](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320190545539.png)
那在Classification的过程中,输入一个 x x x,输出一个 y y y,这个 y y y 现在不是一个数值,而是一个向量,再和目标向量比较之前,我们往往还会把y再通过一个叫做Soft-max的function得到y’,然后我们才去计算y’ 和目标向量之间的距离。
![image-20210320190621261](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320190621261.png)
那为什么要加上Soft-max呢,一个比较简单的解释是这样的,由于这个目标向量是这个 ŷ 是One-hot vector,所有它里面的值都是0或1,但是我们的 y y y 却可能是任何的值,直接算距离显然不太对。
那既然我们的目标只有0跟1,我们把 y y y 也Normalize到0到1之间,这样才好跟 label 计算相似度。
3.1 Softmax
这个是Soft-max的block,输入 y 1 y_1 y1 y 2 y_2 y2 y 3 y_3 y3,它会产生 y 1 ′ y_1' y1′ y 2 ′ y_2' y2′ y 3 ′ y_3' y3′:
![image-20210320193732150](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320193732150.png)
它里面运作的模式是这个样子的:
y
i
′
=
e
x
p
(
y
i
)
∑
j
e
x
p
(
y
i
)
y_i'=\frac{exp(y_i)}{\sum_j exp(y_i)}
yi′=∑jexp(yi)exp(yi)
举一个简单的例子来看可能更加直观:
![image-20210320194237298](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320194237298.png)
原本输入的 y 1 = 3 y_1 = 3 y1=3 y 2 = 1 y_2 = 1 y2=1 y 3 = − 3 y_3 = -3 y3=−3,最后输出了 y 1 ′ = 0.88 y_1' = 0.88 y1′=0.88 y 2 ′ = 0.12 y_2' = 0.12 y2′=0.12 y 3 ′ ≈ 0 y_3' ≈ 0 y3′≈0。
可以看到这个Softmax可以把输出全部变为变成0到1之间,并且他们的和为1,除此之后,它还有一个附带的效果:它会让大的值跟小的值的差距更大,就比如原本输入的-3,最后得到的输出趋近于0。
4 Loss of Classification
![image-20210320195929935](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320195929935.png)
最终我们需要计算 y’ 跟 ŷ 之间的距离来评判分类器做出的判断是否准确,而对于这个所谓的距离,其实有许多定义,举例来说,我们可以让这个距离是Mean Square Error(MSE)
e
=
∑
i
(
y
i
^
−
y
i
′
)
2
e=\sum_i(\hat{y_i}-y_i')^2
e=i∑(yi^−yi′)2
但在分类问题中一个更常用的定义叫做Cross-entropy:
e
=
−
∑
i
y
i
^
ln
y
i
′
e=-\sum_i\hat{y_i}\ln{y_i'}
e=−i∑yi^lnyi′
这个Cross-entropy的式子看起来感觉有点匪夷所思,为什么有这么奇怪的式子出现呢?
![image-20210320201703299](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320201703299.png)
事实上,Make Minimize Cross-entropy 其实就是 maximize likelihood,这是从概率论和数理统计上可以证明的。接下来还是通过举例子的方式,从optimization的角度,来说明相对于Mean Square Error,Cross-entropy为什么更常用在分类问题上。
![image-20210320205142242](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320205142242.png)
假设现在我们要做一个3个Class的分类
我们现在假设 y 1 y_1 y1的变化是从-10到10, y 2 y_2 y2的变化也是从-10到10, y 3 y_3 y3我们就固定设成-1000,因为 y 3 y_3 y3是一个常量,我们只看 y 1 y_1 y1跟 y 2 y_2 y2有变化的时候,对我们的Loss有怎样的影响。
左下方的图是使用 Mean square error 情况下画出的Error surface,右下方的图是使用 Cross-entropy 的时候画出来的Error surface:
![image-20210320205913652](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320205913652.png)
我们用红色表示Loss大,蓝色表示Loss小,可以看到这两个图都是左上角Loss大,右下角Loss小,因为右下角代表我们的 y 1 y_1 y1接近1,而 y 2 y_2 y2接近0,这与我们的目标label是最接近的。假设我们的训练都是从左上角开始的。
![image-20210320210341112](https://gitee.com/unclestrong/deep-learning21_note/raw/master/imgbed/image-20210320210341112.png)
- 如果我们选择 Cross-Entropy,可以看到左上角的地方是有斜率的,所以我们可以通过 Gradient Descent 的方法慢慢往右下的地方走,最终走到Loss很小的地方。
- 但如果我们选择的是Mean square error的话,很可能刚开始就卡住了,Mean square error 在这种 Loss 很大的地方是非常平坦的,它的gradient非常小,我们可能就没有办法用 Gradient Descentt 顺利的走到右下角。
所以说在 classification 的问题中,更常见的是选择 Cross-Entropy 作为我们的 Loss Function。