Classification as Regression?

在分类问题中,可以根据输出来定义分类,但是这个分类属于人为定义的,因此不一定完全准确。

class as one-hot vector

one-hot 就是对于给定的class标1,其余为0的方式。

假设我们目前要分类的是只有3个class,那么可以得知输出的向量是包含三个数字的,确定了output是什么形式,就需要修改神经网络,因为原本输出的是一个scalar,只有一个数值。

我们可以对activation的值加上不同的w和b就可以得到三个值

除此之外,分类问题还需要再计算一次softmax,来计算y跟$yhat$​​​的距离。

soft-max的方式就是归一化,把输出的值改为0或者1。

soft-max

公式就是如图所示,假设$y_{1}$,$y_{2}$,$y_{3}$的值为3,1,-3,那么都除以e,e的值是2.7
$$
e^3 = 20 \quad e^1 = 2.7 \quad e^-3 = 0.05 \
\sum(e^3+e^1+e^-3)=22.75 \
y_{1}^{‘} = 20/22.7 = 0.88 \quad y_{2}^{‘}=0.12 \quad y_{3}^{‘}=0
$$

Loss of Classification

因为是算概率,因此不再使用mse的方式计算loss,而是使用cross-entropy的方式计算。使交叉熵最小的方式实际上等同于最大似然的。

那么为什么一定要用cross entropy而不是用mse呢?假设$y_{1}$, $y_{2}$处于-10到10之间,$y_{3}$处于-1000,那么$y_{3}$很容易得到偏0的值

如果不是cross entropy的方式,其中两个值偏小的话,一个值偏大也会得到很小的loss,但是train的话会因为过于平坦导致训练很容易卡住。

Chaning Landscape

将山铲平是另一种避免在saddle point卡住的方法。假设目前有两个参数共同决定loss,那么如下图所示,$w_{1}$的梯度比较陡峭,斜率变化很小。$w_{2}$的梯度比较平缓,斜率变化很大。因此综合下来的learning rate结果并不一定很好。

$w_{1}$ 假设目前有一个非常简单的model,输入只有$x_{1}x_{2}$, 参数只有$w_{1}w_{2}$, 并且输出没有activation function,是个极其简单的linear model。

对于这个function,假设$x_{1}$很小,那么因为$w_{1}$需要与$x_{1}$相乘,因此会导致y很小,y很小导致learning rate的公式的loss很小

如果很大,则会是这种情况

因此我们应该对不同的input设定一个不同的值来应对gradient的情况。让不论在什么方向手上都会使learning rate是均匀的。

image-20210807094713444

Feature Normalization

Training Normalization

特征标准化的过程就是我们将每一个input找他们在这一个dimension的mean和standard deviation ,做归一化,standardization。用新的值替换为原来的值。

归一化后在所有dimmension的平均值为0,在所有variances的值为1。

不仅对于输入要做feature normalization,对于输出的z和a也要做。对于z或者a做feature normalization没有太大区别,只需要对一个输出做即可。

对于z做feature normalization的方式其实也是一样,需要算mean,算sd,然后再除以总共的class数。

那么最后套入公式,替换原本的z输出即可。

对于$z_{1}$做feature normlization,会导致$\tilde{z_{1}}$改变,继而导致$a_{1}$改变,继而导致$z_{2}$改变,因此整个network都发生了改变

因为这是一个巨大的network的资料同时喂入计算,因此我们喂入资料是按照batch来计算的,因此应该是对这个batch做normalization,因此这个方式被成为batch normalization。

因为标准化后的$\tilde{z}$的平均值为0,我们还是不希望让输出完全归一,应该增加一些bias,所以引入了新的变量$\gamma\beta$,让输出会有一些不同。

Testing Normalization

在training的时候是根据batch来计算每一个batch然后标准化,但是在test的时候我们并未设定batch,那么应该如何做呢

这个方式就是通过计算moving average,即在训练的时候中通过batch计算的一个从参数代入到测试的$\tilde{z_{1}}$。

Batch normalization result

此图为引入batch normalization在cnn上的效果,可见引入batch normalization后训练收敛时间相较于没有batch normalization比短了很多、

Internal Covariate Shift

原作者提出了一个理念,$B^{’}$的参数是被a影响,而不是根据$a^{’}$计算,而$a$是上一层神经网络的参数,因此更新参数的时候并没有非常准确。因此batch normalization的方式因为可以让整个network都会变化,因此会有利于寻找参数。

但是18年这篇paper就提出了这个观点并不可靠,他发现$a^{’},a$的方向并没有很大变化,因此驳斥了internal cavariate shift是的理念。

但是这篇论文仍然支持了batch normalization是有效的,是可以让error surface变得平缓,但是他也发现了很多其他方式可以让error surface更平缓。除此之外还有很多其他normalization的方式,比如以下。

image-20210807104451554