sigmoid_cross_entropy_with_logits函数笔记

@ TOC

tf.nn.sigmoid_cross_entropy_with_logits()介绍

线性模型假设

  • 样本 (x,z)(x,z), 其中X是样本的点,zz是样本的标签,假设我们的线性模型如下

y=ωx+b y = \omega *x + b

这个函数用到的基础函数

sigmoid 函数

其实logistic函数也就是经常说的sigmoid函数,它的几何形状也就是一条sigmoid曲线(S型曲线)。

f(x)=11+ex f(x) = \frac{1}{1+e^{-x} }

sigmoid_cross_entropy_with_logits函数笔记

logistic和sigmoid函数的区别是,logistics是二分类问题而sigmoid是解决多分类问题的函数。

交叉熵

假设x是正确的概率分布,而y是我们预测出来的概率分布,这个公式算出来的结果,表示y与正确答案x之间的错误程度(即:y错得有多离谱),结果值越小,表示y越准确,与x越接近。

h(x,y)=i=1nxiln(yi) h(x,y) = -\sum^{n}_{i=1} x_{i} * ln(y_{i})

下面举个交叉熵的例子:

比如:

x的概率分布为:{1/4 ,1/4,1/4,1/4},现在我们通过机器学习,预测出来二组值:

y1的概率分布为 {1/4 , 1/2 , 1/8 , 1/8}

y2的概率分布为 {1/4 , 1/4 , 1/8 , 3/8}

从直觉上看,y2分布中,前2项都100%预测对了,而y1只有第1项100%对,所以y2感觉更准确,看看公式算下来,是不是符合直觉:

H(x,y1)=i=1nxiln(y1i)=94H(x,y1)=i=1nxiln(y2i)=94=10ln(3)4<1014=H(x,y1) H(x,y_{1}) = -\sum^{n}_{i=1} x_{i} * ln(y_{1i}) = \frac{9}{4}\\ H(x,y_{1}) = -\sum^{n}_{i=1} x_{i} * ln(y_{2i}) = \frac{9}{4} = \frac{10-ln(3)}{4}\\ < \frac{10-1}{4}=H(x,y_{1})

对比结果,H(x,y1)H(x,y_{1})算出来的值为94\frac{9}{4},而H(x,y2)H(x,y_{2})的值略小于94\frac{9}{4},根据刚才的解释,交叉熵越小,表示这二个分布越接近,所以机器学习中,经常拿交叉熵来做为损失函数(loss function)。


损失函数loss

假设zz为模型的样本标签,而yy是训练后的模型对应的值,我们求模型的表现,用样本标签和模型结果进行运算,求损失函数LossLoss

Loss(y,z)=12(yz)2=12((ωx+b)z)2 Loss(y,z) =\frac{1}{2} (y-z)^2 \\ = \frac{1}{2} ((\omega *x + b)-z)^2

如果直接用sigmoid 函数后,我们的LossLoss函数将有可能是一个非凸函数(出现多个局部最优点,可能对后面的权值和偏差参数调整不利),可能效果图就是下面这样的(纵轴是loss,横轴是训练的回合数):

sigmoid_cross_entropy_with_logits函数笔记
会导致我们的随机梯度下降(SGD, Stochastic Gradient Descent )陷入局部最小的陷阱中。如上图,SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。

如果此时进行梯度的参数更新的话,就会这样

  • 梯度更新迭代的调参

ωi=ωi1ηωJ(y,z)=ωi1ηω12(yz)2=ωi1ηω12((ωx+b)z)2 \omega_{i} = \omega_{i-1} - \eta * \bigtriangledown _{\omega} J(y,z) \\ = \omega_{i-1} - \eta * \bigtriangledown _{\omega} \frac{1}{2} (y-z)^2 \\ = \omega_{i-1} - \eta * \bigtriangledown _{\omega} \frac{1}{2} ((\omega *x + b)-z)^2 \\

每个回合都会更新ω\omega, bb的值,从而更新y=ωx+by = \omega *x + b 的函数模型。

  • 为了获得一个凸性的损失函数(就创造了这样一个性质良好的函数(PS:还可导哦))引进交叉熵函数。

For brevity, let x = logits, z = labels. The logistic loss is

zlog(sigmoid(x))+(1z)log(1sigmoid(x))=zlog(1/(1+exp(x)))+(1z)log(exp(x)/(1+exp(x)))=zlog(1+exp(x))+(1z)(log(exp(x))+log(1+exp(x)))=zlog(1+exp(x))+(1z)(x+log(1+exp(x))=(1z)x+log(1+exp(x))=xxz+log(1+exp(x)) z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x)) \\ = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x))) \\ = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x))) \\ = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\\ = (1 - z) * x + log(1 + exp(-x)) \\ = x - x * z + log(1 + exp(-x))

注意和交叉熵的区别


参考文章:

交叉熵:https://www.cnblogs.com/yjmyzz/p/7822990.html
为何sigmoid**函数要配合sigmoid_cross_entropy_with_logits损失函数使用?:https://blog.****.net/u014590176/article/details/90381413