在神经网络中,代价函数的选择至关重要,代价函数比如有平方损失函数、似然函数等。
大多数现代神经网络使用最大似然函数来训练,意味着代价函数为负的对数似然,对于一种解释最大似然函数的观点是将它看作最小化训练集上的经验分布与模型分布之间的差异,两者之间的差异可以通过KL散度度量。
KL散度定义为
因为第一项只跟数据生成过程有关,而与模型无关,因此最小化KL散度仅仅只跟后一项有关。最小化KL散度其实就是最小化分布间的交叉熵。任何一 个由负对数似然组成的损失都是定义在训练集上的经验分布和定义在模型上的概率 分布之间的交叉熵。例如,均方误差是经验分布和高斯模型之间的交叉熵(不懂~~~~~~~~)。
(交叉熵与似然函数的关系 的推导可以看下图)
-
第1行照抄,不赘述;
- 第2行就是直接加上 lo 用来方便后边的运算,连乘变成连加;
- 第3行就是除以 m 得到和训练数据 X 的经验分布 p^data 相关的期望;
- 第4行就是把期望展开,后边减去的那一项是为了后边变形为KL散度做准备,这一项不会影响到 θMLθML 的取值;
- 后边的就是简单的变形而已。
(什么又是经验分布呢)
经验分布就是用样本的分布来推断总体的分布。 该分布函数是在n个数据点中的每一个上都跳跃1 / n的阶梯函数,每个数据点的概率都是1/n,如果有多个值是一样的,那么概率累加。
上面弄了一堆东西,只是为了弄清楚一些概念。
下面来谈谈为什么要用最大似然来当代价函数。
首先用最大似然函数减轻了为每个模型设计代价函数的负担。明确了一个模型的则自动的确定了一个代价函数。贯穿一个神经网络设计的一个反复出现的主题是代价函数的梯度必须足够的大和具有足够的预测性,来为学习算法提供一个好的指引。饱和(非常平)的函数破坏了这一个目标,因为 他们在饱和的时候梯度非常小,那么学习的步长就很小。这在很多情况下都会发生,因为用于隐藏单元或输出单元的输出的激活函数会饱和。负的对数似然函数帮助我们在很多模型中避免这个问题。
并且很多输出单元都会用一个带指数的激活函数,这在它的变量取绝对值非常大的负数时会造成饱和,而对数似然代价函数中的对数函数消除了某些输出单元中的指数函数。
(在实现BP的时候,有一个问题,什么时候点乘什么时候是*乘,这个是因为自己对反向传播的推导理解的不够透彻,
https://blog.csdn.net/qq_29762941/article/details/80343185这篇文章让我受益匪浅)
softMax + 似然函数的梯度求导可以看这篇文章.https://blog.csdn.net/u014313009/article/details/51045303