1.损失函数
说明:这里的阈值函数为二分输出,即y输出为1或者为0,在某些早期书籍中你可能会看到损失函数的公式为1/2(y'-y)^2,定义上来看确实没问题,但是我发现用他来进行梯度下降,反向传播的时候得到的函数将是一个非凸函数,有多个极值点,这是在计算中是很致命的,尤其是x的维度很大时,你的程序的时间复杂度会十分大;
另外推导过程用到概率论和线性代数,统计学中的相关知识,但不用担心,我会给不是很了解的朋友写出过程,当然,如果的你的数学功底很扎实,请略过那一部分,现在,开始吧:
首先,定义y' = p(y = 1| x)
公式说明:这里的x是训练数据中的某个特征值,他可以是单个数,也可以是向量,矩阵取决于你所要解决问题所建立的模型,y = 1即阈值函数输出为1,y'即对于x输入,y为1的概率0 <= y' <=1;
为便于讨论在这里我把x设为一个列向量,其他情况基本类似:
根据上文,我可以得到一个分段函数:
当 y = 1时:p(y|x) = y'
当y = 0:p(y|x) = 1 - y'
在这里,我把两种情况联合可写成p(y|x) = pow(y',y)pow(1 - y',1 - y) 其中pow(x,y)为x的y次方
我的最终目的是让p(y|x)的值为最大,这样可以使得估计值和实际值得误差最小,这也就是损失函数的书面意义,接下来的过程就用到数学里的万能大哥log了(许多推导过程都可以用他,因为他是严格单调的,而且可以把多次化成一次形式),如下:
令G(x,y) = logp(x|y) = ylogy' + (1 - y)log(1 - y') 前面提到log严格单调,所以G越大P(x|y)越大,说到这里有同学会问了,损失函数不是越小越好么?别急,推导还没完
在讨论更加复杂的神经网络时,我们倾向于损失函数小越好,因为这在问题的解决中会提供极大的便利,所以,怎么办呢,加个负号就好啦!所以最终
损失函数:Lost(y,y') = -G(x,y)
= -[ylogy' + (1-y)log(1-y')]
2.成本函数
先给出成本函数:J(θ) = 1/mΣLost(y,y') 其中Σ上为m,下为0,m为训练的数据量大小文章,最后附件我会给出θ的推导过程,但现在这不影响证明
许多初学者错误的认为成本函数J(θ)的由来就是简单的对于损失函数求和取平均,确实他给的公式第一眼看过去就是取平均值(包括我自己刚学的时候也搞错了)但是仔细分析成本函数的定义,他的意义在于对应给定的训练数据{(x1,y1),(x2,y2) .......(xm,ym)}(再次强调,这里的x并不一定是一个实数,也可以是一个矩阵,向量等,取决于你建立的模型),我们要使得发生x1->y1,x2->y2.......xm->ym的概率达到一个最大值,如果简单的取平均完全不符合定义,聪明的的你肯定想到了,用极大似然函数!根据极大似然函数的定义:我得到
L(θ) = P(x1|y1)P(x2|y2).....P(xm|ym) = ΠP(xi|yi)
万能的log再次出现了:
U = log(L(θ)) = ΣP(xi|yi),
同损失函数的原理,加上一个负号让我们在求得时候求得最小值、
U = -U
在后续更加复杂的神经网络的讨论中,U会显得十分臃肿所以这里加上一个1/m进行调节,这样,我们使得他和损失函数在一个数量级,讨论的时候也就更加方便,即:
J(θ) = 1/mΣLost(y,y')
附:关于θ的讨论
学习阈值函数时,我们知道当w'X >= b时可以定义输出为1,
公式做适当变换,w'X - b >= 0其中w'为w的转置,在这里x为列向量,w也是,我们对于X向量进行扩充,加入x0 = 1元素,同时,w也扩充,加入w0 = -b,这样,设新的w为θ,得到.
θ'X = w'X - b,两者虽然只是形势不同,但在进行后续更加复杂的讨论时,只需要两个向量进行运算,而不用考虑实数b,我相信会很好的简化问题