Courese2-第三周:超参数调试、Batch正则化和程序框架
3.1调试处理:
超参数重要性优先级:
1、学习率α
2、Momentum的参数β、隐藏单元的数量、mini-batch的大小
3、神经网络的层数、学习率衰减
4、Momentum或Adam优化算法的参数, β 1 、 β 2 \beta_1、\beta_2 β1、β2和 ε \varepsilon ε
在深度学习中,采用随机选择点,用这些随机取的点试验超参数的效果。随机取值而不是比网格取值表明,你探究了更多重要超参数的潜在值,无论结果是什么。随机取值,可以提升搜索效率,但随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺,用于探究这些超参数。
另一个惯例,是采用由粗糙到精确的策略,比如在二维(第一维为超参数1,第二维为超参数2)中,你进行了取值,你会发现效果最好的某个点,也许它周围其他的点效果也很好,接下来就是放大这块小区域,然后再其中更密集地取值或随机取值,聚集更多的资源。
3.2为超参数选择合适的范围
Appropriate scale for hyperparameters
采用对数标尺搜索超参数的方式,而不使用线性轴。(因为画一条0.0001到1的数轴,沿其随机均匀取值,那90%的数值将会落在0.1到1之间,结果就是在0.1到1之间,应用了90%的资源,而在0.0001到0.1之间,只有10%的搜索资源,这看上去不太对。)用对数标尺搜索。依次取0.0001, 0.001, 0.01, 0.1, 1,在对数轴上均匀随机取点,这样在0.0001到0.001之间就会有更多搜索资源可用,还有在0.001到0.01之间等等。
eg:r = -4 * np.random.rand(), 然后a随机取值, a = 1 0 r a = 10^r a=10r,得到r∈[-4, 0], 所以a∈[ 1 0 − 4 , 1 0 0 10^-4, 10^0 10−4,100]。
在此例中,
1
0
a
(
0.0001
)
10^a(0.0001)
10a(0.0001),可通过0.0001算出a的值,即-4。在右边的值是
1
0
b
10^b
10b,算出b的值,即0.要做的就是在[a, b]区间均匀地给r取值,然后可以设置a的值,基于随机取样的超参数
a
=
1
0
r
a = 10^r
a=10r
总结:
在对数坐标下取值,取最小值的对数得到a的值,取最大值的对数就得到b的值。所以在对数轴上的 1 0 a 到 1 0 b 10^a到10^b 10a到10b区间取值,在a, b间随意均匀的选取r值,将超参数设置为 1 0 r 10^r 10r,这就是在对数轴上取值的过程。
Hyperparameters for exponentially weighted averages
β取值,用于计算指数的加权平均。 假设β是0.9到0.999之间的某个值。记住,当计算指数的加权平均值时,取0.9就像在10个值中计算平均值,有点儿类似于i计算10天的温度平均值,而取0.999就是在1000个值中取平均。
如果想在0.9到0.999区间搜索,那就不能用线性轴取值。 不要随机均匀地在此区间取值,所以考虑这个问题最好的方法就是,探究1-β,此值在0.1到0.001区间内,所以会给1-β取值,这是 1 0 − 1 , 1 0 − 3 10^{-1}, 10^{-3} 10−1,10−3。 所以要做的就是在[-3, -1]里随机均匀的给r取值。你设定了 1 − β = 1 0 r 1-\beta = 10^{r} 1−β=10r,所以 β = 1 − 1 0 r \beta = 1 - 10^r β=1−10r,就变成了在特定的选择范围内超参数随机取值。用这种方式,你在0.9到0.99区间探究的资源,和在0.99到0.999区间探究的一样多。
**Q:**为什么用线性轴不好?
**A:**由公式 1 1 − β \frac{1}{1-\beta} 1−β1,当β接近于1时,所得结果的灵敏度会变化,即使β有微小的变化。 所以整个取值过程,需要更加密集地取值,在β接近1的区间内,或者当1-β接近于0时,这样就会更加有效地分布取样点,更有效率的探究可能的结果。
3.4归一化网络的激活函数(Normalizing activations in a network)
输入归一化
这里采用了另个博主的部分材料。(转载至https://www.jianshu.com/p/cd3e9a491426)
为加快训练神经网络的速度,可以对输入数据进行归一化操作,在测试时,也要对测试集进行相同的归一化操作。
归一化步骤:
- 零均值
- 归一化方差
假设初始训练集分布如下:
第一步是通过零均值化,具体如下:
μ
=
1
m
∑
i
=
1
m
x
(
i
)
\mu = \frac{1}{m}\sum^m_{i=1}x^{(i)}
μ=m1i=1∑mx(i)
这个一个向量,X是所有训练集组成的矩阵,令
X
−
=
μ
X-=\mu
X−=μ,实际意义是移动训练集,完成零均值化。经过零均值化,训练及分布如下图:
第二步是归一化方差,具体方法如下:
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
)
2
\sigma^2 = \frac{1}{m}\sum^m_{i=1}(x^{(i)})^2
σ2=m1i=1∑m(x(i))2
它是一个向量,X是所有训练集组成的矩阵,通过零均值后再令
X
/
=
σ
2
X/=\sigma^2
X/=σ2,经过归一化方差,训练集的分布如下图:
为什么要这么做能够加快训练速度?
从损失函数J说起,代价函数如下:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
J(w,b) = \frac{1}{m}\sum^m_{i=1}L(\widehat{y}^{(i)},y^{(i)})
J(w,b)=m1i=1∑mL(y
(i),y(i))
如果没有进行归一化操作,代价函数细长狭窄,如图:
在这样的代价函数上运行梯度下降,必须使用一个非常小的学习率。因此梯度下降法可能需要多次迭代过程,直到找到最小值。
而如果使用了归一化特征,代价函数呈现球形轮廓,如图:
这种情况下,不论从哪个位置开始,梯度下降法都能够直接地找到最小值,也可使用较大步长。
Batch归一化
如果我们只对输入的数据进行归一化,却没有在中间层进行归一化处理,随着深度网络的多层运算后,数据分布的变化将越来越大,因此对任何一个隐藏层而已,我们想归一化a值,比如 a [ 2 ] a^{[2]} a[2]的值(但可以是任何隐藏层的),以更快的速度训练 w [ 3 ] , b [ 3 ] w^{[3]},b^{[3]} w[3],b[3],因为 a [ 2 ] a^{[2]} a[2]是下一层的输入值,所以会影响 w [ 3 ] , b [ 3 ] w^{[3]},b^{[3]} w[3],b[3]的训练,这就是Batch归一化的作用。严格来说,我们真正归一化的不是 a [ 2 ] a^{[2]} a[2]而是 z [ 2 ] z^{[2]} z[2]。实践中,默认选择:归一化 z [ 2 ] z^{[2]} z[2]
Batch归一化的作用是:(具体见3.5节)
- 适用的归一化过程,不只是输入层,同样适用于神经网络中的深度隐藏层。
- Batch归一化,使得参数搜索问题更容易,神经网络对超参数的选择更加稳定。
主要计算方公式如下:
(1) 求上一层输出数据的均值:
μ
=
1
m
∑
i
=
1
m
z
(
i
)
\mu = \frac{1}{m}\sum^{m}_{i=1}z^{(i)}
μ=m1i=1∑mz(i)
(2) 求上一层输出数据的方差:
σ
2
=
1
m
∑
i
=
1
m
(
z
(
i
)
−
μ
)
2
\sigma^2 = \frac{1}{m}\sum^{m}_{i=1}(z^{(i)}-\mu)^2
σ2=m1i=1∑m(z(i)−μ)2
(3) 归一化处理,减去均值再除以标准差:
z
n
o
r
m
(
i
)
=
z
i
−
μ
σ
2
+
ε
z^{(i)}_{norm}=\frac{z^{i}-\mu}{\sqrt{\sigma^2+\varepsilon}}
znorm(i)=σ2+εzi−μ
为了使数值稳定,通常将 ε \varepsilon ε作为分母,以防 σ = 0 \sigma=0 σ=0的情况。
所以z的每一个分量都含有平均值0和方差1,但我们不想让隐藏单元总是含有平均值0和方差1,也许隐藏单元有了不同的分布会有意义,所以我们对上面归一化处理得到的数据进行重构,得到如下式子:
z
~
(
i
)
=
γ
z
n
o
r
m
(
i
)
+
β
\widetilde{z}^{(i)}=\gamma z^{(i)}_{norm} + \beta
z
(i)=γznorm(i)+β
这里 γ 和 β \gamma和\beta γ和β都是你的模型的学习参数,可以使用梯度下降或其他类似梯度下降的方法更新 γ 和 β \gamma和\beta γ和β。
你可以随意设置 z ~ ( i ) \widetilde{z}^{(i)} z (i)的值。若 γ = σ 2 + ε , β = μ \gamma=\sqrt{\sigma^2+\varepsilon},\beta=\mu γ=σ2+ε,β=μ,那么 γ 和 β \gamma和\beta γ和β的作用在于,它会精确转化这个方程,即 z ~ ( i ) = z ( i ) \widetilde{z}^{(i)}=z^{(i)} z (i)=z(i)
通过对 γ 和 β \gamma和\beta γ和β合理设定,规范化过程(即上述四个等式),从根本来说,只是计算恒等函数,通过赋予 γ \gamma γ和 β \beta β其他值,可以使你构造含有其他平均值和方差的隐藏单元值。
应用了Batch归一化过程,**训练输入和这些隐藏单元值的区别:**隐藏单元值不是必须平均值为0,方差1。均值和方差由 γ 和 β \gamma和\beta γ和β控制。
3.5将Batch Norm拟合进神经网络
具体计算方法如图:
每一层都一次执行下面的计算过程:
μ = 1 m ∑ i = 1 m z ( i ) \mu = \frac{1}{m}\sum^{m}_{i=1}z^{(i)} μ=m1i=1∑mz(i)
σ 2 = 1 m ∑ i = 1 m ( z ( i ) − μ ) 2 \sigma^2 = \frac{1}{m}\sum^{m}_{i=1}(z^{(i)}-\mu)^2 σ2=m1i=1∑m(z(i)−μ)2
z n o r m ( i ) = z i − μ σ 2 + ε z^{(i)}_{norm}=\frac{z^{i}-\mu}{\sqrt{\sigma^2+\varepsilon}} znorm(i)=σ2+εzi−μ
z ~ ( i ) = γ z n o r m ( i ) + β \widetilde{z}^{(i)}=\gamma z^{(i)}_{norm} + \beta z (i)=γznorm(i)+β
即对每一个隐藏层的输入进行归一化计算,将归一化的结果作为激活函数的输入,最终得到计算结果。
Batch归一化作用:
-
通过归一化所有的输入特征值x,以获取类似范围的值,可以加速学习。
-
如果数据分布发生改变,我们可能需要重新训练学习算法来拟合新的数据分布,Batch归一化做的是减少了这些隐藏值分布变化的数量,Batch归一化确保了无论其如何改变,其均值和方差将保持不变。
-
减少了输入值改变的问题,使得所有的输入值更稳定,神经网络的所有隐藏层的输入更稳定,它减弱了前层参数的作用与后层参数的作用之间的联系,使得网络每层都可以自己学习,稍稍独立于其他层,有助于加速整个网络的学习。
-
Batch归一化有轻微的正则化效果。
3.7测试时的Batch Norm
在测试时需要对每个样本逐一处理。方法是根据你的训练集估算 μ 和 σ 2 \mu和\sigma^2 μ和σ2。
为了将神经网络运用于测试,就需要单独估算 μ 和 σ 2 \mu和\sigma^2 μ和σ2,在典型的Batch归一化运用中,需要用一个指数加权平均来估算,这个平均数涵盖了所有mini-batch。
我们选择在第
l
l
l层,假设我们有mini-batch:
X
[
1
]
,
X
[
2
]
,
X
[
3
]
,
⋯
X^{[1]}, X^{[2]}, X^{[3]},\cdots
X[1],X[2],X[3],⋯
那么在为
l
l
l层训练时,训练第一个mini-batch,第二个mini-batch,第三个mini-batch,…,第m个mini-batch,在第
l
l
l层得到m个不同的mini-batch数据所计算的不同的z均值(每个mini-batch对应一个均值)如下:
μ
{
1
}
[
l
]
,
μ
{
2
}
[
l
]
,
μ
{
3
}
[
l
]
,
⋯
\mu^{\{1\}[l]},\mu^{\{2\}[l]},\mu^{\{3\}[l]},\cdots
μ{1}[l],μ{2}[l],μ{3}[l],⋯
计算第 l l l层的m个均值的指数加权平均,这个指数加权平均就成了这一隐藏层的z均值的估值。
同理,用指数加权平均来追踪第 l l l层的第一个mini-batch中所见的 σ 2 \sigma^2 σ2的值,以及第二个mini-batch中所见的 σ 2 \sigma^2 σ2的值等等,然后计算出第 l l l层 σ 2 \sigma^2 σ2的指数加权平均。
因此在用不同的mini-batch训练神经网络的同时,能够得到你所查看的每一层 μ \mu μ和 σ 2 \sigma^2 σ2的平均数的实时数值。
最后在测试时:
通过上述计算,将神经网络模型的所有层上的指数加权平均数
μ
,
σ
2
\mu, \sigma^2
μ,σ2计算出来,将测试集z带入下面的公式进行测试:
z
n
o
r
m
(
i
)
=
z
i
−
μ
σ
2
+
ε
z^{(i)}_{norm}=\frac{z^{i}-\mu}{\sqrt{\sigma^2+\varepsilon}}
znorm(i)=σ2+εzi−μ
z ~ ( i ) = γ z n o r m ( i ) + β \widetilde{z}^{(i)}=\gamma z^{(i)}_{norm} + \beta z (i)=γznorm(i)+β
注: ε 、 β 、 γ \varepsilon、\beta、\gamma ε、β、γ为神经网络模型已经训练好的参数。
总结:
在测试时,首先根据训练集获得不同mini-batch的
μ
\mu
μ和
σ
2
\sigma^2
σ2,然后计算指数加权平均数 ,然后在测试中使用
μ
\mu
μ和
σ
2
\sigma^2
σ2的指数加权平均数来进行你所需要的隐藏单元z值的调整。
3.8 Softmax回归
在分类中,如果我们有多种可能的类型,那么有一种logistic回归的一般形式,叫做Softmax回归。
引例:
这里,将猫标为1类,狗标为2类,小鸡标为3类,其他则标为0类。
现在,我们为这个例子建立一个神经网络,其输出层有4个。
【问题】:当我们输入一张图像
X
X
X,我们想要输出层单元的数字告诉我们这张图像
X
X
X对应于这4种类型中每个的概率有多大?
也就是说,
- 对于第一个节点,输出应该是在输入x的情况下,输出“其他”类的概率,即 P ( o t h e r ∣ x ) P(other|x) P(other∣x)是多少?
- 同理,对于第二个节点,输出为 P ( c a t ∣ x ) P(cat|x) P(cat∣x)
- 对于第三个节点,输出为 P ( d o g ∣ x ) P(dog|x) P(dog∣x)
- 对于第四个节点,输出为 P ( b c ∣ x ) P(bc|x) P(bc∣x)。(bc:baby chick小鸡)
【解决方案】要让网络做到上述所说的标准模型就要用到Softmax层以及需要输出层来生成输出。
【具体步骤】:
-
在网络的最后一层,你将会计算各层的线性部分, z [ L ] z^{[L]} z[L]表示最后一层的z变量,其计算方式如下:
z [ L ] = W L a [ L − 1 ] + b [ L ] ( 对 于 上 述 引 例 , z [ L ] 为 4 x 1 维 的 向 量 ) z^{[L]}=W^{L}a^{[L-1]}+b^{[L]}\qquad(对于上述引例,z^{[L]}为4x1维的向量) z[L]=WLa[L−1]+b[L](对于上述引例,z[L]为4x1维的向量) -
算出了z后,你需要应用Softmax激活函数,具体方式如下:
2.1 计算一个临时变量 t t t,
t = e z [ L ] 这 适 用 于 每 个 元 素 ( 即 向 量 z 中 每 个 元 素 都 进 行 指 数 运 算 , t 也 为 4 x 1 维 的 向 量 ) 。 \quad t = e^{z^{[L]}}\quad这适用于每个元素(即向量z中每个元素都进行指数运算,t也为4x1维的向量)。 t=ez[L]这适用于每个元素(即向量z中每个元素都进行指数运算,t也为4x1维的向量)。2.2 输出是 a [ L ] a^{[L]} a[L],基本上就是对向量 t t t 进行归一化,使和为1,即 a [ L ] = t ∑ j = 1 4 t j = e z [ L ] ∑ j = 1 4 t j ( 得 到 一 个 4 x 1 维 向 量 ) a^{[L]}=\frac{t}{\sum^4_{j=1}t_j}=\frac{e^{z^{[L]}}}{\sum^4_{j=1}t_j}\qquad(得到一个4x1维向量) a[L]=∑j=14tjt=∑j=14tjez[L](得到一个4x1维向量)
神经网络的输出 a [ L ] a^{[L]} a[L],也就是 y ^ \hat{y} y^,是一个4x1维向量,分别对应它属于类0、类1、类2、类3的概率,所以通过这种算法向量 z [ L ] z^{[L]} z[L]计算出总和为1的四个概率。
【具体示例】:
如上图右侧所示,通过输出层输出
z
[
L
]
z^{[L]}
z[L],再通过临时变量t计算
e
z
[
L
]
e^{z^{[L]}}
ez[L],最后通过
a
[
L
]
=
t
∑
j
=
1
4
t
j
a^{[L]}=\frac{t}{\sum^4_{j=1}t_j}
a[L]=∑j=14tjt计算出
a
[
L
]
a^{[L]}
a[L],得到一个4x1维向量,这个4x1向量的元素就是我们算出来的这四个数字(
[
0.842
0.042
0.002
0.114
]
\left[\begin{matrix}0.842 \\0.042\\0.002 \\0.114\end{matrix}\right]
⎣⎢⎢⎡0.8420.0420.0020.114⎦⎥⎥⎤),所以这种算法通过向量
z
[
L
]
z^{[L]}
z[L]计算出总和为1的四个概率。
Softmax激活函数的特殊之处:需要输入一个向量,最后输出一个向量。
3.9 训练一个Softmax 分类器
举个例子,假设训练集中某个样本的目标输出,真实标签是 [ 0 1 0 0 ] \left[\begin{matrix}0\\1\\0\\0\end{matrix}\right] ⎣⎢⎢⎡0100⎦⎥⎥⎤,用***3.8节*** 中例子,这表示一张猫的图片,因为它属于类1。
现在假设神经网络输出的是 y ^ \hat y y^, y ^ \hat y y^是一个总和为1的概率的向量, y ^ = [ 0.3 0.2 0.1 0.4 ] \hat{y} = \left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right] y^=⎣⎢⎢⎡0.30.20.10.4⎦⎥⎥⎤。对于这个样本,神经网络的表现不佳,因为实际这是一只猫,但却只分配到20%是猫的概率,所以在本例中表现不佳。
1、定义训练神经网络会用到的损失函数
在Softmax分类中,我们一般用到的损失函数是: L ( y ^ , y ) = − ∑ j = 1 4 y j log y ^ j ( 单 个 样 本 损 失 函 数 ) L(\hat y, y)=-\sum^4_{j=1}y_j\log{\hat y_j}\qquad(单个样本损失函数) L(y^,y)=−j=1∑4yjlogy^j(单个样本损失函数)
注意,在上述例子里样本的真实标签中,
y
1
=
y
3
=
y
4
=
0
y_1=y_3=y_4=0
y1=y3=y4=0,只有
y
2
y_2
y2=1。因此,当按照这个损失函数计算,将下标j全部加起来,除了j=2时,
y
j
=
1
y_j=1
yj=1以外,其他项都为0,又因为
y
2
=
1
y_2=1
y2=1,所以它就等于
−
log
y
^
2
-\log{\hat y_2}
−logy^2。即有:
L
(
y
^
,
y
)
=
−
∑
j
=
1
4
y
j
log
y
^
j
=
−
y
2
log
y
^
2
=
−
log
y
^
2
L(\hat y, y)=-\sum^4_{j=1}y_j\log{\hat y_j}=-y_2\log{\hat y_2}=-\log{\hat y_2}
L(y^,y)=−j=1∑4yjlogy^j=−y2logy^2=−logy^2
因为梯度下降是用来减小训练集损失的,所以试图使它变小的唯一方式就是使 − log y ^ 2 -\log{\hat y_2} −logy^2变小,要做到这一点,就需要使 y ^ 2 \hat y_2 y^2尽可能大。因为这些是概率,所以不可能比1大。
在这个例子中x是猫的图片,这就需要这项输出的概率尽可能地大。( y ^ = [ 0.3 0.2 0.1 0.4 ] \hat{y} = \left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right] y^=⎣⎢⎢⎡0.30.20.10.4⎦⎥⎥⎤中的第二个元素)。
损失函数所做的就是:
\qquad
找到你的训练集中的真实类别,然后试图使该类别相应的概率尽可能地高。
对于整个训练集的损失
J
J
J:
J
(
w
[
1
]
,
b
[
1
]
,
⋯
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
J(w^{[1]},b^{[1]},\cdots) = \frac{1}{m}\sum^m_{i=1}L(\hat y^{(i)},y^{(i)})
J(w[1],b[1],⋯)=m1i=1∑mL(y^(i),y(i))
因此要做的是用梯度下降法,使这里的损失最小化。
2、Softmax输出层实现梯度下降法
其实初始化反向传播所需要的关键步骤或者说关键方程是这个表达式 d z [ l ] = y ^ − y d_z^{[l]}=\hat y - y dz[l]=y^−y,一般情况下 y ^ \hat y y^就是 C x 1 Cx1 Cx1,这符合我们对dz的一般定义,这就对 z [ l ] z^{[l]} z[l]损失函数的偏导数( d z [ l ] = ∂ J ∂ z [ l ] d_z^{[l]}=\frac{\partial J}{\partial z^{[l]}} dz[l]=∂z[l]∂J)。
在反向传播中,这个表达式值得牢记 d z [ l ] = y ^ − y d_z^{[l]}=\hat y - y dz[l]=y^−y
推导过程:
这里有 S = Z [ L ] S=Z^{[L]} S=Z[L]均为向量, S i S_i Si为预测为第i个类的分数值。
Eg:
S
=
Z
[
L
]
=
[
5
2
−
1
3
]
,
e
S
=
t
=
[
e
5
e
2
e
−
1
e
3
]
,
a
[
L
]
=
t
∑
j
t
j
=
e
s
∑
j
t
j
S=Z^{[L]}=\left[\begin{matrix}5\\2\\-1\\3\end{matrix}\right],e^S = t = \left[\begin{matrix}e^5\\e^2\\e^{-1}\\e^3\end{matrix}\right],a^{[L]}=\frac{t}{\sum_j t_j}=\frac{e^s}{\sum_j t_j}
S=Z[L]=⎣⎢⎢⎡52−13⎦⎥⎥⎤,eS=t=⎣⎢⎢⎡e5e2e−1e3⎦⎥⎥⎤,a[L]=∑jtjt=∑jtjes
已知:
L
i
=
−
log
(
y
^
i
)
=
−
log
(
e
S
i
∑
j
e
S
j
)
=
−
[
log
e
S
i
−
l
o
g
e
S
j
]
=
log
(
∑
j
e
S
j
)
−
S
i
L_i = -\log{(\hat y_i)}=-\log{(\frac{e^{S_i}}{\sum_j e^{S_j}})}=-[\log{e^{S_i}}-log{e^{S_j}}]=\log{(\sum_je^{S_j})}-S_i
Li=−log(y^i)=−log(∑jeSjeSi)=−[logeSi−logeSj]=log(j∑eSj)−Si
目标求
d
z
[
l
]
=
∂
L
i
∂
z
j
=
∂
L
i
∂
S
j
dz^{[l]} = \frac{\partial L_i}{\partial z_j}= \frac{\partial L_i}{\partial S_j}
dz[l]=∂zj∂Li=∂Sj∂Li,分俩种情况:
当
j
=
=
i
时
∂
L
i
∂
S
j
=
∂
[
log
(
∑
j
e
S
j
)
−
S
i
]
∂
S
i
=
e
S
i
∑
j
e
S
j
−
1
=
y
^
i
−
1
当j == i时\qquad\frac{\partial L_i}{\partial S_j}=\frac{\partial[\log{(\sum_je^{S_j})}-S_i]}{\partial S_i}=\frac{e^{S_i}}{\sum_j e^{S_j}}-1=\hat y_i - 1
当j==i时∂Sj∂Li=∂Si∂[log(∑jeSj)−Si]=∑jeSjeSi−1=y^i−1
当
j
!
=
i
时
∂
L
i
∂
S
j
=
∂
[
log
(
∑
j
e
S
j
)
−
S
j
]
∂
S
j
=
e
S
j
∑
j
e
S
j
−
1
=
y
^
j
−
0
当j != i时\qquad\frac{\partial L_i}{\partial S_j}=\frac{\partial[\log{(\sum_je^{S_j})}-S_j]}{\partial S_j}=\frac{e^{S_j}}{\sum_j e^{S_j}}-1=\hat y_j - 0
当j!=i时∂Sj∂Li=∂Sj∂[log(∑jeSj)−Sj]=∑jeSjeSj−1=y^j−0
综上:
对于正确分类的一项,对 S i S_i Si求导,即(对Z_j),所得结果为其本身减1 即 ( y ^ − 1 ) 即(\hat y-1) 即(y^−1)
对于非正确分类的项,对 S j S_j Sj求导,即(对Z_j),所得结果为其本身减0 即 ( y ^ − 0 ) 即(\hat y-0) 即(y^−0)
结果即为 y ^ \hat y y^向量减去它的真实标签,所以有 d z [ l ] = y ^ − y dz^{[l]} = \hat y - y dz[l]=y^−y