Sigmoid function 的数学原理

本文深入探讨Sigmoid函数的来源和数学含义,从Logistic Regression和神经网络的角度阐述其作用。通过公式推导,解释了Sigmoid如何从概率论的角度得出,并分析了为何在某些情况下,直接使用Discriminative model优于Generative model。

Sigmoid function详解

本文阅读对象为有一定machine learing基础,并且在模型的数学含义层面有意愿探索的同学。

什么是Sigmoid function

一提起Sigmoid function可能大家的第一反应就是Logistic Regression。我们把一个sample扔进sigmoid中,就可以输出一个probability,也就是是这个sample属于第一类或第二类的概率。

还有像神经网络也有用到sigmoid,不过在那里叫activation function。

Sigmoid function长下面这个样子:

σ(z)=11+ez

其实这个function我们只知道怎么用它,但是不知道它是怎么来的,以及底层的含义是什么。我在ATA中搜了一下并没有人解释这个问题,知乎有人解答不过都是照着教材抄一抄捞几个赞,那么我详细的解释一下,争取不要让算法工程师沦为调参工程师…

首先假设我们有两个class:class1和class2,并且给出一个sample x,我们的目标是求x属于C1的概率是多少。

这个概率我们可以通过Naive Bayes很轻松的得出,也就是:
公式1:

P(C1|x)=P(x|C1)P(C1)P(x)

其中
公式2:

P(x)=P(x|C1)P(C1)+P(x|C2)P(C2)

这个公式是高中难度的,不过也解释一下:x出现的概率等于,class1出现的概率乘以class1中出现x的概率 加上 class2出现的概率乘以class2中出现x的概率。

那么就可以把公式2带入公式1的分母中:
公式3:

P(C1|x)=P(x|C1)P(C1)P(x|C1)P(C1)+P(x|C2)P(C2)

下面我们将等式两边同时除以分子就变成了:
公式4:

P(C1|x)=11+P(x|C2)P(C2)P(x|C1)P(C1)

z=lnP(x|C1)P(C1)P(x|C2)P(C2)

那么把z带入公式4就变成了:

σ(z)=11+ez

也就是Sigmoid function

更多思考

上面已经知道sigmoid函数是从什么东西推导过来的了,那么有个问题就是,既然上面式子中只有P(x|C1)P(x|C2)我们不知道,那我们干脆用Bayes不就能直接计算出P(x|C1)了嘛?
(x是某个sample,其中有多个feature,也就是说x是一个vector)

P(x|C1)=P(x1|C1)P(x2|C1)......P(xk|C1)......

但是Bayes有一个限制条件就是所有的feature都必须是independent的,假如我们训练的sample中各个feature都是independent的话,那么Bayes会给我们一个很好的结果。但实际情况下这是不太可能的,各个feature之间不可能是independent的,那么bias就会非常大,搞出的model就很烂。

这个z应该长什么样子?

我们将z变换一下可以变换成下面的样子:

z=lnP(x|C1)P(x|C2)+lnP(C1)P(C2)

上式中lnP(C1)P(C2)中的P(C1)P(C2)是很好求的,设class1在训练集中出现的数目是N1,class2在训练集中出现的数目是N2,那么:
lnP(C1)P(C2)=lnN1N1+N2N2N1+N2=lnN1N2

其中P(x|C1)P(x|C2) 都遵从Guassian probability distribution:

P(x|C1)=12πD/21Σ11/2e1/2(xμ1)TΣ11(xμ1)

P(x|C2)=12πD/21Σ21/2e1/2(xμ2)TΣ12(xμ2)

那么我们再回到这个公式中:

z=lnP(x|C1)P(x|C2)+lnP(C1)P(C2)

第二项我们已经求出来了,下面我们把第一项Guassian probability distribution带入:
lnP(x|C1)P(x|C2)=ln12πD/21Σ11/2e1/2(xμ1)TΣ11(xμ1)12πD/21Σ21/2e1/2(xμ2)TΣ12(xμ2)

乍一看,我滴妈简直太复杂太恶心了 :)
但是别慌,很多东西都能消掉的,我们来消一下。
首先,上面分子分母中P(x|C1)P(x|C2)可以消掉,就变成了:

lnP(x|C1)P(x|C2)=ln1Σ11/2e1/2(xμ1)TΣ11(xμ1)1Σ21/2e1/2(xμ2)TΣ12(xμ2)

接着拆:

lnP(x|C1)P(x|C2)=lnΣ21/2Σ11/2e[(xμ1)T(Σ1)1(xμ1)(xμ2)T(Σ2)1(xμ2)]

再拆:

lnP(x|C1)P(x|C2)=lnΣ21/2Σ11/212[(xμ1)T(Σ1)1(xμ1)(xμ2)T(Σ2)1(xμ2)]

上式中第二项12[(xμ1)T(Σ1)1(xμ1)(xμ2)T(Σ2)1(xμ2)],中括号里面有两项,我再把这两项里面的括号全都打开,打开的目的是为了后面的化简,首先先看第一项:

(xμ1)T(Σ1)1(xμ1)(xμ2)T(Σ2)1(xμ2)=xTΣ11xxTΣ11μ1μT1Σ11x+μT1Σ1μ1

=xTΣ11x2μT1Σ11x+μT1Σ11μ1

第二项化简方法一样,把下角标换成2就行了:

(xμ2)T(Σ2)1(xμ2)=xTΣ12x2μT2Σ12x+μT2Σ12μ2

拆的差不多了,下面我们回到z=lnP(x|C1)P(x|C2)+lnP(C1)P(C2)中,把刚才的化简结果带进去:

z=lnΣ21/2Σ11/212[xTΣ11x2μT1Σ11x+μT1Σ11μ1xTΣ12x+2μT2Σ12xμT2Σ12μ2]+lnN1N2

仔细观察不难发现,上式中中括号里面第一项和第四项是可以消掉的。
并且我们可以认为Σ1=Σ2=Σ,刚才我一直没解释μΣ是什么,下面我简单说一下,μ就是mean(均值),Σ就是covairance(协方差),其中μ是个vectorΣ是个matrix,具体什么形式不在本文里详细解释,一解释就没完没了了,可以深推一下Guassian看看paper(个人感觉意义不大,其实理解到这里完全够用了)。

好了,为什么可以认为Σ1=Σ2=Σ呢?因为如果每个class都有自己的covariance的话,那么variance会很大,参数的量一下就上去了,参数一多,就容易overfitting。这么说的话,z里面的第一项lnΣ21/2Σ11/2就是0了。

好开心,又有好多东西被约掉了 :)

最后,z被化简成了下面这种最终形态:

z=(μ1μ2)Σ1x12μT1Σ1μ1+12μT2Σ1μ2+lnN1N2

可以观察到,第一项有系数x,后面几项里其实都是参数。
我们就可以理解为x的系数其实就是sigmoid中的参数wT(这是个matrix),后面那些项可以看成是参数b

那么在Generative model中我们的目标是寻找最佳的N1,N2,μ1,μ2,Σ使P(C1|x)maximise。

但是我们已经将一连串复杂的参数和方程化简成了z=σ(wTx+b)那为什么还要舍近求远的求5个参数去将目标最优化呢?只有“两个参数”的方法我们叫做Discraminative model。

实际上,在大多数情况下,这两种方法各有利弊,但是实际上Discraminative model泛化能力比Generative model还是强不少的。什么时候Generative model更好呢?
1.training data比较少的时候,需要靠几率模型脑补没有发生或的事情。
2.training data中有noise。

讲解完毕,本文每个公式都是用latex搞出来的,已校对,欢迎找茬修正。

### MATLAB 中 Sigmoid 函数的用法 #### 使用内置函数 `sigm` 或者自定义实现 在 MATLAB 中,可以通过多种方式来使用或实现 Sigmoid 函数。一种常见的方式是利用已有的工具箱提供的功能;另一种则是手动编写该激活函数。 对于直接调用的情况,在 Deep Learning Toolbox™ (Neural Network Toolbox™) 中存在名为 `sigmoid` 的操作用于处理 `dlarray` 类型的数据[^4]。然而需要注意的是,并不是所有的版本都默认带有这个名称的确切命令,因此有时可能需要查阅具体安装环境下的文档确认支持情况。 当涉及到神经网络构建时,推荐采用如下语句创建一层具有 Sigmoid 激活特性的全连接层: ```matlab layer = fullyConnectedLayer(outputSize, 'Activation', 'sigmoid'); ``` 除此之外,也可以通过简单的数学表达式来自行定义 Sigmoid 函数并应用于任意数值向量或矩阵上: ```matlab function y = sigmoid(x) % SIGMOID Compute the sigmoid function. % % Y = SIGMOID(X), where X is a scalar or matrix, % returns an array of the same size as X with entries between 0 and 1. y = 1 ./ (1 + exp(-x)); end ``` 上述代码片段展示了如何基于指数运算符 `-exp()` 和基本算术运算构造一个通用版的 Sigmoid 计算器[^3]。一旦有了这样的辅助函数之后,就可以很方便地将其集成到更复杂的算法流程里去。 为了验证所编写的 Sigmoid 实现是否正确无误,还可以借助于预先准备好的数据集来进行对比测试。例如,可以参照给定链接中的资源获取经过精心设计的例子[^1],这些例子往往包含了详细的说明文档以及配套脚本帮助理解整个过程的工作原理。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值