Logistic分类函数
这部分教程将介绍两部分:
- Logistic函数
- 交叉熵损失函数
如果我们利用神经网络进行分类,对于二分类问题,t=1
或者t=0
,我们能在logistic
回归中使用logistic
函数。对于多分类问题,我们使用softmax
函数来处理多项式logistic
回归。本教程我们先解释有关logistic
函数的知识,后续教程会介绍softmax
函数的知识。
我们先导入教程需要使用的软件包。
from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt
Logistic函数
假设我们的目标是根据输入的z
去预测分类t
。概率方程P(t=1|z)
表示输出y
根据logisitc
函数y=σ(z)
得到的值。σ
被定义为:
![](https://i-blog.csdnimg.cn/blog_migrate/1ff230ca85bd9830141ead083cf2769e.webp?x-image-process=image/format,png)
根据函数分类的概率t=1
或者t=0
,我们能得到以下公式:
![](https://i-blog.csdnimg.cn/blog_migrate/b2a46b636005b6e56f2481136a5694cd.webp?x-image-process=image/format,png)
注意一下,其实z
就是P(t=1|z)与P(t=0|z)的比值求对数。
![](https://i-blog.csdnimg.cn/blog_migrate/56e9fcb40ff1bd5a2087109fcaed26c2.webp?x-image-process=image/format,png)
logistic
函数在下面的代码中logistic(z)
实现,并且可视化了logistic
函数。
# Define the logistic function
def logistic(z):
return 1 / (1 + np.exp(-z))
# Plot the logistic function
z = np.linspace(-6,6,100)
plt.plot(z, logistic(z), 'b-')
plt.xlabel('$z$', fontsize=15)
plt.ylabel('$\sigma(z)$', fontsize=15)
plt.title('logistic function')
plt.grid()
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/23aa33838ada694718c9e4d950f3b7ea.webp?x-image-process=image/format,png)
Logistic函数求导
因为神经网络一般使用梯度下降来优化,所以我们需要先求出y
对于z
的倒数,即∂y/∂z
可以表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/f374e94a459d78e83e050bd3e1d02e1d.webp?x-image-process=image/format,png)
因为1−σ(z))=1−1/(1+e^−z)=e−z/(1+e^−z)
,所以我们又可以把上式简化为:
![](https://i-blog.csdnimg.cn/blog_migrate/5e3de733b091bd2fc964787c20822d7c.webp?x-image-process=image/format,png)
logistic_derivative(z)
函数实现了Logistic
函数的求导。
# Define the logistic function
def logistic_derivative(z):
return logistic(z) * (1 - logistic(z))
# Plot the derivative of the logistic function
z = np.linspace(-6,6,100)
plt.plot(z, logistic_derivative(z), 'r-')
plt.xlabel('$z$', fontsize=15)
plt.ylabel('$\\frac{\\partial \\sigma(z)}{\\partial z}$', fontsize=15)
plt.title('derivative of the logistic function')
plt.grid()
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/0379e04c5b91ee10e3c67a8f1b566e47.webp?x-image-process=image/format,png)
对于logistic函数的交叉熵损失函数
模型的输出结果y=σ(z)
可以被表示为一个概率y
,如果t=1
,或者概率1-y
,如果t=0
。我们把这个记为P(t=1|z)=σ(z)=y
。
在神经网络中,对于给定的一组参数θ
,我们可以使用最大似然估计来优化参数。参数θ
将输入的样本转化成输入到Logistic
函数中的参数z
,即z = θ * x
。最大似然估计可以写成:
![](https://i-blog.csdnimg.cn/blog_migrate/ba420e873631c1fa2a767abcd236b8da.webp?x-image-process=image/format,png)
因为对于给定的参数θ
,去产生t
和z
,根据联合概率我们又能将似然函数L(θ|t,z)
改写成P(t,z|θ)
。由于P(A,B) = P(A|B) ∗ P(B)
,我们又可以简化联合概率:
![](https://i-blog.csdnimg.cn/blog_migrate/c7ccf8b9a2743335051717981cd5d03a.webp?x-image-process=image/format,png)
因为我们不关心有关z
的概率,所以我们可以把原来的似然函数改写成:
![](https://i-blog.csdnimg.cn/blog_migrate/e46f1cad046230fe141b15a0dcd04c85.webp?x-image-process=image/format,png)
因为t
服从伯努力分布,而且如果给定参数θ
,那么P(t|z)=y
就是一个确定的值,因此我们又可以改写概率方程:
![](https://i-blog.csdnimg.cn/blog_migrate/f74e00481d600eeb11f65c156f90280d.webp?x-image-process=image/format,png)
由于对数函数是单调递增函数,我们可以依此优化对数似然函数
![](https://i-blog.csdnimg.cn/blog_migrate/481b9800d7e7460a6885ef994fab6586.webp?x-image-process=image/format,png)
该函数的最大值和常规的似然函数的最大值一样,所以我们计算对数似然函数如下,
![](https://i-blog.csdnimg.cn/blog_migrate/557a8e879a5f4d30d114b29f25529d94.webp?x-image-process=image/format,png)
我们最小化这个负对数似然函数,等价于最大化似然函数。一个典型的误差函数可以设计为如下交叉熵误差函数:
![](https://i-blog.csdnimg.cn/blog_migrate/83c866016339e2f6864fa4963c34b930.webp?x-image-process=image/format,png)
这个函数可能看起来比较复杂,但是如果我们把它拆分开来看,就会比较简单。
![](https://i-blog.csdnimg.cn/blog_migrate/adc50214bc458c1d271574b7fcd73316.webp?x-image-process=image/format,png)
从上式中我们可以发现,如果样本被正确分类,那么损失函数L(t,y)
和负对数概率函数在表达式上面是一样的,即
![](https://i-blog.csdnimg.cn/blog_migrate/1f922f7268db955a217aa9332fbd3ff1.webp?x-image-process=image/format,png)
因为t
只能取值0
或者1
,所以我们能将L(t, y)
写为:
![](https://i-blog.csdnimg.cn/blog_migrate/4cc87c86a82627cae382d09ca0251001.webp?x-image-process=image/format,png)
如果你要分析每一个训练数据,那么就是下式:
![](https://i-blog.csdnimg.cn/blog_migrate/ed084c7d37704169ab2759c54c801301.webp?x-image-process=image/format,png)
另一个我们使用交叉熵函数的原因是,在简单Logistic
回归中,交叉熵函数是一个凸损失函数,全局最小值很容易找到。
对于logistic函数的交叉熵损失函数的求导
对于损失函数∂ξ/∂y
求导,计算如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f1c69a4c9b30521d3d7f140c3cfc8d0f.webp?x-image-process=image/format,png)
现在,我们对输入参数z
进行求导将变得很容易。
![](https://i-blog.csdnimg.cn/blog_migrate/9288fde1840da17373f3d9267d9e352a.webp?x-image-process=image/format,png)
至此,完整求导完成。